From 0eb859467ee24a67aef10029063d7845c5b1e124 Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 10 Aug 2022 15:09:44 +0200 Subject: [PATCH 001/591] adding a switch between networks --- explorer/src/api/constants.ts | 2 +- explorer/src/api/index.ts | 7 +++++++ explorer/src/components/Nav.tsx | 21 +++++++++++++++++++-- explorer/src/context/main.tsx | 11 +++++++++-- explorer/src/typeDefs/explorer-api.ts | 2 ++ 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/explorer/src/api/constants.ts b/explorer/src/api/constants.ts index 109586c0fd..442fd68ad1 100644 --- a/explorer/src/api/constants.ts +++ b/explorer/src/api/constants.ts @@ -1,7 +1,7 @@ // master APIs export const API_BASE_URL = process.env.EXPLORER_API_URL; export const VALIDATOR_API_BASE_URL = process.env.VALIDATOR_API_URL; -export const VALIDATOR_URL = process.env.VALIDATOR_URL; +export const { VALIDATOR_URL } = process.env; export const BIG_DIPPER = process.env.BIG_DIPPER_URL; // specific API routes diff --git a/explorer/src/api/index.ts b/explorer/src/api/index.ts index 5a9b40ef9a..02b4190a01 100644 --- a/explorer/src/api/index.ts +++ b/explorer/src/api/index.ts @@ -1,4 +1,5 @@ import { + API_BASE_URL, BLOCK_API, COUNTRY_DATA_API, GATEWAYS_API, @@ -25,6 +26,7 @@ import { SummaryOverviewResponse, UptimeStoryResponse, ValidatorsResponse, + Environment, } from '../typeDefs/explorer-api'; function getFromCache(key: string) { @@ -135,3 +137,8 @@ export class Api { static fetchUptimeStoryById = async (id: string): Promise => (await fetch(`${UPTIME_STORY_API}/${id}/history`)).json(); } + +export const getEnvironment = (): Environment => { + const matchEnv = (env: Environment) => API_BASE_URL?.toLocaleLowerCase().includes(env) && env; + return matchEnv('sandbox') || matchEnv('qa') || 'mainnet'; +}; diff --git a/explorer/src/components/Nav.tsx b/explorer/src/components/Nav.tsx index ab6c2d36c8..9b0d7f4f51 100644 --- a/explorer/src/components/Nav.tsx +++ b/explorer/src/components/Nav.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import { Link } from 'react-router-dom'; import { ExpandLess, ExpandMore, Menu } from '@mui/icons-material'; import { CSSObject, styled, Theme, useTheme } from '@mui/material/styles'; +import Button from '@mui/material/Button'; import MuiLink from '@mui/material/Link'; import Box from '@mui/material/Box'; import ListItem from '@mui/material/ListItem'; @@ -229,11 +230,18 @@ ExpandableButton.defaultProps = { }; export const Nav: React.FC = ({ children }) => { - const { updateNavState, navState } = useMainContext(); + const { updateNavState, navState, environment } = useMainContext(); const [drawerIsOpen, setDrawerToOpen] = React.useState(false); const [fixedOpen, setFixedOpen] = React.useState(false); const theme = useTheme(); + const explorerName = + `${environment && environment.charAt(0).toUpperCase() + environment.slice(1)} Explorer` || 'Mainnet Explorer'; + + const switchNetworkText = environment === 'mainnet' ? 'Switch to Testnet' : 'Switch to Mainnet'; + const switchNetworkLink = + environment === 'mainnet' ? 'https://sandbox-explorer.nymtech.net' : 'https://explorer.nymtech.net'; + const setToActive = (id: number) => { updateNavState(id); }; @@ -297,8 +305,17 @@ export const Nav: React.FC = ({ children }) => { }} > - Network Explorer + {explorerName} + ; + environment?: Environment; } interface StateApi { @@ -47,6 +49,9 @@ export const MainContext = React.createContext({ export const useMainContext = (): React.ContextType => React.useContext(MainContext); export const MainContextProvider: React.FC = ({ children }) => { + // network explorer environment + const [environment, setEnvironment] = React.useState('mainnet'); + // light/dark mode const [mode, setMode] = React.useState('dark'); @@ -163,10 +168,12 @@ export const MainContextProvider: React.FC = ({ children }) => { React.useEffect(() => { Promise.all([fetchOverviewSummary(), fetchGateways(), fetchValidators(), fetchBlock(), fetchCountryData()]); + setEnvironment(getEnvironment()); }, []); const state = React.useMemo( () => ({ + environment, block, countryData, fetchMixnodes, @@ -181,7 +188,7 @@ export const MainContextProvider: React.FC = ({ children }) => { updateNavState, validators, }), - [block, countryData, gateways, globalError, mixnodes, mode, navState, summaryOverview, validators], + [environment, block, countryData, gateways, globalError, mixnodes, mode, navState, summaryOverview, validators], ); return {children}; diff --git a/explorer/src/typeDefs/explorer-api.ts b/explorer/src/typeDefs/explorer-api.ts index 3463f55d98..3cf3c42b41 100644 --- a/explorer/src/typeDefs/explorer-api.ts +++ b/explorer/src/typeDefs/explorer-api.ts @@ -222,3 +222,5 @@ export type MixNodeEconomicDynamicsStatsResponse = { estimated_delegators_reward: number; current_interval_uptime: number; }; + +export type Environment = 'mainnet' | 'sandbox' | 'qa'; From fd90175e87786f31efe24b6f402d0d1209aa22f1 Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 10 Aug 2022 15:43:42 +0200 Subject: [PATCH 002/591] adding button on mov nav and make it smaller --- explorer/src/components/MobileNav.tsx | 22 ++++++++++++++++++++-- explorer/src/components/Nav.tsx | 4 ++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/explorer/src/components/MobileNav.tsx b/explorer/src/components/MobileNav.tsx index cab6e50e5b..313a9ae8ba 100644 --- a/explorer/src/components/MobileNav.tsx +++ b/explorer/src/components/MobileNav.tsx @@ -30,9 +30,16 @@ type MobileNavProps = { export const MobileNav: React.FC<{ children: React.ReactNode }> = ({ children }: MobileNavProps) => { const theme = useTheme(); - const { navState, updateNavState } = useMainContext(); + const { navState, updateNavState, environment } = useMainContext(); const [drawerOpen, setDrawerOpen] = React.useState(false); + const explorerName = + `${environment && environment.charAt(0).toUpperCase() + environment.slice(1)} Explorer` || 'Mainnet Explorer'; + + const switchNetworkText = environment === 'mainnet' ? 'Switch to Testnet' : 'Switch to Mainnet'; + const switchNetworkLink = + environment === 'mainnet' ? 'https://sandbox-explorer.nymtech.net' : 'https://explorer.nymtech.net'; + const toggleDrawer = () => { setDrawerOpen(!drawerOpen); }; @@ -81,11 +88,22 @@ export const MobileNav: React.FC<{ children: React.ReactNode }> = ({ children }: fontSize: '18px', fontWeight: 600, ml: 2, + display: 'flex', + flexDirection: 'column', }} > - Network Explorer + {explorerName} + diff --git a/explorer/src/components/Nav.tsx b/explorer/src/components/Nav.tsx index 9b0d7f4f51..4b13edda46 100644 --- a/explorer/src/components/Nav.tsx +++ b/explorer/src/components/Nav.tsx @@ -308,11 +308,11 @@ export const Nav: React.FC = ({ children }) => { {explorerName} From 76773c58d7fe8fed97fafd23763e3b2ff7aa3cbd Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 10 Aug 2022 16:34:30 +0200 Subject: [PATCH 003/591] some styles --- explorer/src/components/MobileNav.tsx | 13 +++++-------- explorer/src/components/Nav.tsx | 2 +- explorer/src/components/Switch.tsx | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/explorer/src/components/MobileNav.tsx b/explorer/src/components/MobileNav.tsx index 313a9ae8ba..16846c4b42 100644 --- a/explorer/src/components/MobileNav.tsx +++ b/explorer/src/components/MobileNav.tsx @@ -78,7 +78,7 @@ export const MobileNav: React.FC<{ children: React.ReactNode }> = ({ children }: }} > - + = ({ children }: color: theme.palette.nym.networkExplorer.nav.text, fontSize: '18px', fontWeight: 600, - ml: 2, - display: 'flex', - flexDirection: 'column', }} > - + {explorerName} - + - diff --git a/explorer/src/components/Nav.tsx b/explorer/src/components/Nav.tsx index 4b13edda46..5203e1df62 100644 --- a/explorer/src/components/Nav.tsx +++ b/explorer/src/components/Nav.tsx @@ -312,7 +312,7 @@ export const Nav: React.FC = ({ children }) => { variant="outlined" color="inherit" href={switchNetworkLink} - sx={{ textTransform: 'none', width: 150, ml: 4 }} + sx={{ borderRadius: 2, textTransform: 'none', width: 150, ml: 4, fontSize: 14, fontWeight: 600 }} > {switchNetworkText} diff --git a/explorer/src/components/Switch.tsx b/explorer/src/components/Switch.tsx index 835100a1db..25e76ccdfa 100644 --- a/explorer/src/components/Switch.tsx +++ b/explorer/src/components/Switch.tsx @@ -54,7 +54,7 @@ export const DarkLightSwitch = styled(Switch)(({ theme }) => ({ export const DarkLightSwitchMobile: React.FC = () => { const { toggleMode } = useMainContext(); return ( - ); From a74a99d81d1024e7ad9c0193dae753c58b92c847 Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 10 Aug 2022 16:38:56 +0200 Subject: [PATCH 004/591] cleaning --- explorer/src/components/UptimeChart.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/explorer/src/components/UptimeChart.tsx b/explorer/src/components/UptimeChart.tsx index 44490c1196..8d6c934775 100644 --- a/explorer/src/components/UptimeChart.tsx +++ b/explorer/src/components/UptimeChart.tsx @@ -23,7 +23,7 @@ export const UptimeChart: React.FC = ({ title, xLabel, yLabel, uptim const color = theme.palette.text.primary; React.useEffect(() => { if (uptimeStory.data?.history) { - const allFormattedChartData: FormattedChartData = [['Date', 'Routing Score']]; + const allFormattedChartData: FormattedChartData = [['Date', 'Uptime']]; uptimeStory.data.history.forEach((eachDate) => { const formattedDateUptimeRecord: FormattedDateRecord = [ format(new Date(eachDate.date), 'MMM dd'), @@ -34,7 +34,7 @@ export const UptimeChart: React.FC = ({ title, xLabel, yLabel, uptim setFormattedChartData(allFormattedChartData); } else { const emptyData: any = [ - ['Date', 'Routing Score'], + ['Date', 'Uptime'], ['Jul 27', 10], ]; setFormattedChartData(emptyData); @@ -55,7 +55,7 @@ export const UptimeChart: React.FC = ({ title, xLabel, yLabel, uptim uptimeStory.data ? formattedChartData : [ - ['Date', 'Routing Score'], + ['Date', 'Uptime'], [format(new Date(Date.now()), 'MMM dd'), 0], ] } From 1bdb58571df309afd823c45a9e6509e94f927850 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 30 Nov 2022 16:01:35 +0100 Subject: [PATCH 005/591] feat: refactor cosmwasm nym-cli command a bit to support multiple tiers. Add a generator for mixnet contract instantiate messages --- .../validator/cosmwasm/generators/mixnode.rs | 94 +++++++++++++++++++ .../src/validator/cosmwasm/generators/mod.rs | 19 ++++ common/commands/src/validator/cosmwasm/mod.rs | 3 + .../src/validator/cosmwasm/generators/mod.rs | 10 ++ .../{cosmwasm.rs => cosmwasm/mod.rs} | 12 ++- 5 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 common/commands/src/validator/cosmwasm/generators/mixnode.rs create mode 100644 common/commands/src/validator/cosmwasm/generators/mod.rs create mode 100644 tools/nym-cli/src/validator/cosmwasm/generators/mod.rs rename tools/nym-cli/src/validator/{cosmwasm.rs => cosmwasm/mod.rs} (84%) diff --git a/common/commands/src/validator/cosmwasm/generators/mixnode.rs b/common/commands/src/validator/cosmwasm/generators/mixnode.rs new file mode 100644 index 0000000000..ce31d4bde3 --- /dev/null +++ b/common/commands/src/validator/cosmwasm/generators/mixnode.rs @@ -0,0 +1,94 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 +// +use clap::Parser; +use log::{debug, info}; + +use cosmwasm_std::Decimal; +use mixnet_contract_common::{InitialRewardingParams, InstantiateMsg, Percent}; +use std::time::Duration; + +#[derive(Debug, Parser)] +pub struct Args { + #[clap(long)] + pub rewarding_validator_address: String, + + #[clap(long)] + pub vesting_contract_address: String, + + #[clap(long, default_value = "unym")] + pub rewarding_denom: String, + + #[clap(long, default_value_t = 720)] + pub epochs_in_interval: u32, + + #[clap(long, default_value_t = 60*60)] + pub epoch_duration: u64, + + #[clap(long, default_value_t = 244_817_525_850_285)] + pub initial_reward_pool: u128, + + #[clap(long, default_value_t = 100_000_000_000_000)] + pub initial_staking_supply: u128, + + #[clap(long, default_value_t = 50)] + pub staking_supply_scale_factor: u64, + + #[clap(long, default_value_t = 30)] + pub sybil_resistance: u64, + + #[clap(long, default_value_t = 10)] + pub active_set_work_factor: u32, + + #[clap(long, default_value_t = 2)] + pub interval_pool_emission: u64, + + #[clap(long, default_value_t = 240)] + pub rewarded_set_size: u32, + + #[clap(long, default_value_t = 240)] + pub active_set_size: u32, +} + +pub async fn generate(args: Args) { + info!("Starting to generate mixnode instantiate msg"); + + debug!("Received arguments: {:?}", args); + + let initial_rewarding_params = InitialRewardingParams { + initial_reward_pool: Decimal::from_atomics(args.initial_reward_pool, 0) + .expect("initial_rewarding_pool can't be converted to Decimal"), + initial_staking_supply: Decimal::from_atomics(args.initial_staking_supply, 0) + .expect("initial_staking_supply can't be converted to Decimal"), + staking_supply_scale_factor: Percent::from_percentage_value( + args.staking_supply_scale_factor, + ) + .unwrap(), + sybil_resistance: Percent::from_percentage_value(args.sybil_resistance) + .expect("sybil_resistance can't be converted to Percent"), + active_set_work_factor: Decimal::from_atomics(args.active_set_work_factor, 0) + .expect("active_set_work_factor can't be converted to Decimal"), + interval_pool_emission: Percent::from_percentage_value(args.interval_pool_emission) + .expect("interval_pool_emission can't be converted to Percent"), + rewarded_set_size: args.rewarded_set_size, + active_set_size: args.active_set_size, + }; + + debug!("initial_rewarding_params: {:?}", initial_rewarding_params); + + let instantiate_msg = InstantiateMsg { + rewarding_validator_address: args.rewarding_validator_address, + vesting_contract_address: args.vesting_contract_address, + rewarding_denom: args.rewarding_denom, + epochs_in_interval: args.epochs_in_interval, + epoch_duration: Duration::from_secs(args.epoch_duration), + initial_rewarding_params, + }; + + debug!("instantiate_msg: {:?}", instantiate_msg); + + let res = + serde_json::to_string(&instantiate_msg).expect("failed to convert instantiate msg to json"); + + println!("{:?}", res) +} diff --git a/common/commands/src/validator/cosmwasm/generators/mod.rs b/common/commands/src/validator/cosmwasm/generators/mod.rs new file mode 100644 index 0000000000..07bf4481c1 --- /dev/null +++ b/common/commands/src/validator/cosmwasm/generators/mod.rs @@ -0,0 +1,19 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use clap::{Args, Subcommand}; + +pub mod mixnode; + +#[derive(Debug, Args)] +#[clap(args_conflicts_with_subcommands = true, subcommand_required = true)] +pub struct GenerateMessage { + #[clap(subcommand)] + pub command: GenerateMessageCommands, +} + +#[derive(Debug, Subcommand)] +pub enum GenerateMessageCommands { + /// Query mixnodes + Mixnode(mixnode::Args), +} diff --git a/common/commands/src/validator/cosmwasm/mod.rs b/common/commands/src/validator/cosmwasm/mod.rs index 9ee1fa182f..43dcf08951 100644 --- a/common/commands/src/validator/cosmwasm/mod.rs +++ b/common/commands/src/validator/cosmwasm/mod.rs @@ -4,6 +4,7 @@ use clap::{Args, Subcommand}; pub mod execute_contract; +pub mod generators; pub mod init_contract; pub mod migrate_contract; pub mod upload_contract; @@ -21,6 +22,8 @@ pub enum CosmwasmCommands { Upload(crate::validator::cosmwasm::upload_contract::Args), /// Init a WASM smart contract Init(crate::validator::cosmwasm::init_contract::Args), + /// Generate an instantiate message + GenerateInitMessage(generators::GenerateMessage), /// Migrate a WASM smart contract Migrate(crate::validator::cosmwasm::migrate_contract::Args), /// Execute a WASM smart contract method diff --git a/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs b/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs new file mode 100644 index 0000000000..40db980a64 --- /dev/null +++ b/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs @@ -0,0 +1,10 @@ +pub(crate) async fn execute( + cosmwasm: nym_cli_commands::validator::cosmwasm::generators::GenerateMessage, +) -> anyhow::Result<()> { + match cosmwasm.command { + nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::Mixnode( + args, + ) => nym_cli_commands::validator::cosmwasm::generators::mixnode::generate(args).await, + } + Ok(()) +} diff --git a/tools/nym-cli/src/validator/cosmwasm.rs b/tools/nym-cli/src/validator/cosmwasm/mod.rs similarity index 84% rename from tools/nym-cli/src/validator/cosmwasm.rs rename to tools/nym-cli/src/validator/cosmwasm/mod.rs index 4a77b3896f..9e9e6ffcaa 100644 --- a/tools/nym-cli/src/validator/cosmwasm.rs +++ b/tools/nym-cli/src/validator/cosmwasm/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2022 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - use network_defaults::NymNetworkDetails; -use nym_cli_commands::context::{create_signing_client, ClientArgs}; +use nym_cli_commands::context::create_signing_client; +use nym_cli_commands::context::ClientArgs; + +pub(crate) mod generators; pub(crate) async fn execute( global_args: ClientArgs, @@ -25,6 +25,10 @@ pub(crate) async fn execute( ) .await } + + Some(nym_cli_commands::validator::cosmwasm::CosmwasmCommands::GenerateInitMessage( + generator, + )) => generators::execute(generator).await?, Some(nym_cli_commands::validator::cosmwasm::CosmwasmCommands::Migrate(args)) => { nym_cli_commands::validator::cosmwasm::migrate_contract::migrate( args, From b43dab4f83e69875b0d57ba0a2e7b7ab8a8f3062 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 30 Nov 2022 17:24:25 +0100 Subject: [PATCH 006/591] chore: added a couple of debug messages to parseOptionalAccount --- common/client-libs/validator-client/src/nymd/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/client-libs/validator-client/src/nymd/mod.rs b/common/client-libs/validator-client/src/nymd/mod.rs index dabe4b0819..49d237ddd2 100644 --- a/common/client-libs/validator-client/src/nymd/mod.rs +++ b/common/client-libs/validator-client/src/nymd/mod.rs @@ -16,6 +16,7 @@ use cosmrs::rpc::Error as TendermintRpcError; use cosmrs::rpc::HttpClientUrl; use cosmrs::tx::Msg; use execute::execute; +use log::debug; use network_defaults::{ChainDetails, NymNetworkDetails}; use serde::{Deserialize, Serialize}; use std::convert::TryInto; @@ -76,9 +77,12 @@ impl Config { expected_prefix: &str, ) -> Result, NymdError> { if let Some(address) = raw { + debug!("Raw address:{:?}", raw); + debug!("Expected prefix:{:?}", expected_prefix); let parsed: AccountId = address .parse() .map_err(|_| NymdError::MalformedAccountAddress(address.clone()))?; + debug!("Parsed prefix:{:?}", parsed); if parsed.prefix() != expected_prefix { Err(NymdError::UnexpectedBech32Prefix { got: parsed.prefix().into(), From 5d3550a569175c331a7befca986da7f5fd9ef33d Mon Sep 17 00:00:00 2001 From: farbanas Date: Thu, 1 Dec 2022 10:16:36 +0100 Subject: [PATCH 007/591] fix: remove the debug output for instantiate message as it incorrectly escapes strings --- .../commands/src/validator/cosmwasm/generators/mixnode.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/commands/src/validator/cosmwasm/generators/mixnode.rs b/common/commands/src/validator/cosmwasm/generators/mixnode.rs index ce31d4bde3..4a75a20644 100644 --- a/common/commands/src/validator/cosmwasm/generators/mixnode.rs +++ b/common/commands/src/validator/cosmwasm/generators/mixnode.rs @@ -87,8 +87,8 @@ pub async fn generate(args: Args) { debug!("instantiate_msg: {:?}", instantiate_msg); - let res = - serde_json::to_string(&instantiate_msg).expect("failed to convert instantiate msg to json"); + let res = serde_json::to_string(&instantiate_msg) + .expect("failed to convert instantiate msg to json"); - println!("{:?}", res) + println!("{}", res) } From 894a46688a834bb2b9cf54a7163142b9308d5204 Mon Sep 17 00:00:00 2001 From: farbanas Date: Thu, 1 Dec 2022 10:21:00 +0100 Subject: [PATCH 008/591] chore: formatting --- common/commands/src/validator/cosmwasm/generators/mixnode.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/commands/src/validator/cosmwasm/generators/mixnode.rs b/common/commands/src/validator/cosmwasm/generators/mixnode.rs index 4a75a20644..3ebf2e99aa 100644 --- a/common/commands/src/validator/cosmwasm/generators/mixnode.rs +++ b/common/commands/src/validator/cosmwasm/generators/mixnode.rs @@ -87,8 +87,8 @@ pub async fn generate(args: Args) { debug!("instantiate_msg: {:?}", instantiate_msg); - let res = serde_json::to_string(&instantiate_msg) - .expect("failed to convert instantiate msg to json"); + let res = + serde_json::to_string(&instantiate_msg).expect("failed to convert instantiate msg to json"); println!("{}", res) } From b5b7b7255b6de81ca2c24cf89be297d864c0433b Mon Sep 17 00:00:00 2001 From: farbanas Date: Thu, 1 Dec 2022 11:41:03 +0100 Subject: [PATCH 009/591] feat: add vesting contract instatiate message generation --- .../generators/{mixnode.rs => mixnet.rs} | 10 +++--- .../src/validator/cosmwasm/generators/mod.rs | 7 ++-- .../validator/cosmwasm/generators/vesting.rs | 34 +++++++++++++++++++ .../src/validator/cosmwasm/generators/mod.rs | 8 +++-- 4 files changed, 49 insertions(+), 10 deletions(-) rename common/commands/src/validator/cosmwasm/generators/{mixnode.rs => mixnet.rs} (94%) create mode 100644 common/commands/src/validator/cosmwasm/generators/vesting.rs diff --git a/common/commands/src/validator/cosmwasm/generators/mixnode.rs b/common/commands/src/validator/cosmwasm/generators/mixnet.rs similarity index 94% rename from common/commands/src/validator/cosmwasm/generators/mixnode.rs rename to common/commands/src/validator/cosmwasm/generators/mixnet.rs index 3ebf2e99aa..4ecfc39035 100644 --- a/common/commands/src/validator/cosmwasm/generators/mixnode.rs +++ b/common/commands/src/validator/cosmwasm/generators/mixnet.rs @@ -1,6 +1,6 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -// + use clap::Parser; use log::{debug, info}; @@ -10,13 +10,13 @@ use std::time::Duration; #[derive(Debug, Parser)] pub struct Args { - #[clap(long)] + #[clap(long, empty_values = false)] pub rewarding_validator_address: String, - #[clap(long)] + #[clap(long, empty_values = false)] pub vesting_contract_address: String, - #[clap(long, default_value = "unym")] + #[clap(long, default_value = "unyxt")] pub rewarding_denom: String, #[clap(long, default_value_t = 720)] @@ -51,7 +51,7 @@ pub struct Args { } pub async fn generate(args: Args) { - info!("Starting to generate mixnode instantiate msg"); + info!("Starting to generate mixnet contract instantiate msg"); debug!("Received arguments: {:?}", args); diff --git a/common/commands/src/validator/cosmwasm/generators/mod.rs b/common/commands/src/validator/cosmwasm/generators/mod.rs index 07bf4481c1..330ba5508b 100644 --- a/common/commands/src/validator/cosmwasm/generators/mod.rs +++ b/common/commands/src/validator/cosmwasm/generators/mod.rs @@ -3,7 +3,8 @@ use clap::{Args, Subcommand}; -pub mod mixnode; +pub mod mixnet; +pub mod vesting; #[derive(Debug, Args)] #[clap(args_conflicts_with_subcommands = true, subcommand_required = true)] @@ -14,6 +15,6 @@ pub struct GenerateMessage { #[derive(Debug, Subcommand)] pub enum GenerateMessageCommands { - /// Query mixnodes - Mixnode(mixnode::Args), + Mixnet(mixnet::Args), + Vesting(vesting::Args), } diff --git a/common/commands/src/validator/cosmwasm/generators/vesting.rs b/common/commands/src/validator/cosmwasm/generators/vesting.rs new file mode 100644 index 0000000000..7c9299f0bc --- /dev/null +++ b/common/commands/src/validator/cosmwasm/generators/vesting.rs @@ -0,0 +1,34 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use clap::Parser; +use log::{debug, info}; + +use vesting_contract_common::InitMsg; + +#[derive(Debug, Parser)] +pub struct Args { + #[clap(long, empty_values = false)] + pub mixnet_contract_address: String, + + #[clap(long, default_value = "unymt", empty_values = false)] + pub mix_denom: String, +} + +pub async fn generate(args: Args) { + info!("Starting to generate vesting contract instantiate msg"); + + debug!("Received arguments: {:?}", args); + + let instantiate_msg = InitMsg { + mixnet_contract_address: args.mixnet_contract_address, + mix_denom: args.mix_denom, + }; + + debug!("instantiate_msg: {:?}", instantiate_msg); + + let res = + serde_json::to_string(&instantiate_msg).expect("failed to convert instantiate msg to json"); + + println!("{}", res) +} diff --git a/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs b/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs index 40db980a64..80f9786715 100644 --- a/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs +++ b/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs @@ -2,9 +2,13 @@ pub(crate) async fn execute( cosmwasm: nym_cli_commands::validator::cosmwasm::generators::GenerateMessage, ) -> anyhow::Result<()> { match cosmwasm.command { - nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::Mixnode( + nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::Mixnet( args, - ) => nym_cli_commands::validator::cosmwasm::generators::mixnode::generate(args).await, + ) => nym_cli_commands::validator::cosmwasm::generators::mixnet::generate(args).await, + + nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::Vesting( + args, + ) => nym_cli_commands::validator::cosmwasm::generators::vesting::generate(args).await, } Ok(()) } From f2e460a96b1c89ac7de75af7212f19a304978278 Mon Sep 17 00:00:00 2001 From: farbanas Date: Thu, 1 Dec 2022 12:17:46 +0100 Subject: [PATCH 010/591] chore: import cleanup --- tools/nym-cli/src/validator/cosmwasm/mod.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/nym-cli/src/validator/cosmwasm/mod.rs b/tools/nym-cli/src/validator/cosmwasm/mod.rs index 9e9e6ffcaa..33d84d2519 100644 --- a/tools/nym-cli/src/validator/cosmwasm/mod.rs +++ b/tools/nym-cli/src/validator/cosmwasm/mod.rs @@ -1,6 +1,5 @@ use network_defaults::NymNetworkDetails; -use nym_cli_commands::context::create_signing_client; -use nym_cli_commands::context::ClientArgs; +use nym_cli_commands::context::{create_signing_client, ClientArgs}; pub(crate) mod generators; From 53444cf55a4e2de82623f3b08ac28e4909a45880 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 5 Dec 2022 13:22:21 +0100 Subject: [PATCH 011/591] fix: rewarding denom was unyxt by default, it should be unymt --- common/commands/src/validator/cosmwasm/generators/mixnet.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/commands/src/validator/cosmwasm/generators/mixnet.rs b/common/commands/src/validator/cosmwasm/generators/mixnet.rs index 4ecfc39035..c93689a9a8 100644 --- a/common/commands/src/validator/cosmwasm/generators/mixnet.rs +++ b/common/commands/src/validator/cosmwasm/generators/mixnet.rs @@ -16,7 +16,7 @@ pub struct Args { #[clap(long, empty_values = false)] pub vesting_contract_address: String, - #[clap(long, default_value = "unyxt")] + #[clap(long, default_value = "unymt")] pub rewarding_denom: String, #[clap(long, default_value_t = 720)] From 97b01db23e6c19c3cac03072d9a0af062eb93012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 13 Dec 2022 17:42:11 +0000 Subject: [PATCH 012/591] Chore/more error macros (#2686) * cleaned up MixProcessingError * Added Error impl to (hopefully) all error enums in the codebase * Replaced all occurences of error("{0}") with error(transparent) * Changelog entry --- CHANGELOG.md | 7 + Cargo.lock | 24 +-- clients/client-core/src/client/mix_traffic.rs | 4 +- .../real_traffic_stream.rs | 2 +- clients/client-core/src/init/mod.rs | 4 +- clients/native/src/commands/run.rs | 2 +- clients/native/src/commands/upgrade.rs | 6 +- clients/native/src/websocket/handler.rs | 8 +- clients/native/src/websocket/listener.rs | 6 +- .../native/websocket-requests/src/requests.rs | 4 +- .../websocket-requests/src/responses.rs | 4 +- clients/socks5/src/commands/run.rs | 2 +- clients/socks5/src/commands/upgrade.rs | 6 +- clients/socks5/src/socks/client.rs | 2 +- clients/socks5/src/socks/mixnet_responses.rs | 6 +- clients/socks5/src/socks/server.rs | 2 +- clients/socks5/src/socks/types.rs | 2 +- .../client-libs/gateway-client/src/client.rs | 4 +- .../gateway-client/src/packet_router.rs | 6 +- .../gateway-client/src/socket_state.rs | 2 +- .../client-libs/mixnet-client/src/client.rs | 2 +- .../mixnet-client/src/forwarder.rs | 2 +- common/commands/src/context/errors.rs | 4 +- common/commands/src/context/mod.rs | 8 +- .../src/validator/signature/errors.rs | 2 +- common/credential-storage/src/lib.rs | 6 +- common/crypto/Cargo.toml | 1 + .../crypto/src/asymmetric/encryption/mod.rs | 59 ++++---- common/crypto/src/asymmetric/identity/mod.rs | 58 ++++---- common/mixnode-common/Cargo.toml | 1 + .../src/packet_processor/error.rs | 69 ++------- .../src/packet_processor/processor.rs | 2 +- common/mixnode-common/src/verloc/error.rs | 6 +- common/mixnode-common/src/verloc/listener.rs | 6 +- common/nymsphinx/acknowledgements/Cargo.toml | 1 + .../acknowledgements/src/surb_ack.rs | 34 +++-- common/nymsphinx/framing/Cargo.toml | 1 + common/nymsphinx/framing/src/codec.rs | 63 +++----- common/nymsphinx/params/Cargo.toml | 2 + common/nymsphinx/params/src/packet_modes.rs | 14 +- common/nymsphinx/params/src/packet_sizes.rs | 27 ++-- common/socks5/ordered-buffer/Cargo.toml | 1 + common/socks5/ordered-buffer/src/message.rs | 26 +++- .../src/connection_controller.rs | 8 +- .../proxy-helpers/src/proxy_runner/inbound.rs | 2 +- .../src/proxy_runner/outbound.rs | 2 +- common/socks5/requests/src/msg.rs | 4 +- common/task/src/shutdown.rs | 2 +- common/topology/src/gateway.rs | 80 ++++------ common/topology/src/lib.rs | 4 +- common/topology/src/mix.rs | 79 +++------- contracts/coconut-bandwidth/src/error.rs | 4 +- contracts/coconut-dkg/src/error.rs | 4 +- .../multisig/cw3-flex-multisig/src/error.rs | 4 +- contracts/multisig/cw4-group/src/error.rs | 6 +- explorer-api/src/tasks.rs | 12 +- .../src/registration/handshake/shared_key.rs | 50 ++----- gateway/gateway-requests/src/types.rs | 2 +- gateway/src/commands/mod.rs | 4 +- gateway/src/commands/sign.rs | 2 +- gateway/src/commands/upgrade.rs | 6 +- .../connection_handler/authenticated.rs | 11 +- .../websocket/connection_handler/fresh.rs | 6 +- .../client_handling/websocket/listener.rs | 4 +- .../receiver/connection_handler.rs | 6 +- .../node/mixnet_handling/receiver/listener.rs | 4 +- .../receiver/packet_processing.rs | 16 +- gateway/src/node/mod.rs | 4 +- gateway/src/node/storage/mod.rs | 4 +- mixnode/src/commands/describe.rs | 2 +- mixnode/src/commands/mod.rs | 4 +- mixnode/src/commands/upgrade.rs | 6 +- .../node/listener/connection_handler/mod.rs | 2 +- mixnode/src/node/listener/mod.rs | 4 +- nym-connect/Cargo.lock | 11 +- nym-connect/src-tauri/src/state.rs | 2 +- nym-connect/src-tauri/src/tasks.rs | 4 +- nym-wallet/Cargo.lock | 2 +- .../nym-wallet-recovery-cli/src/main.rs | 14 +- nym-wallet/src-tauri/src/config/mod.rs | 4 +- nym-wallet/src-tauri/src/error.rs | 2 +- .../src-tauri/src/operations/help/log.rs | 12 +- .../network-requester/src/allowed_hosts.rs | 2 +- .../network-requester/src/core.rs | 2 +- .../network-statistics/src/api/error.rs | 4 +- validator-api/src/coconut/deposit.rs | 40 ++--- validator-api/src/coconut/error.rs | 8 +- validator-api/src/contract_cache/mod.rs | 4 +- validator-api/src/epoch_operations/mod.rs | 12 +- validator-api/src/main.rs | 4 +- .../src/network_monitor/monitor/processor.rs | 65 ++++----- .../src/network_monitor/test_packet.rs | 36 +++-- validator-api/src/node_status_api/models.rs | 85 +++++------ validator-api/src/storage/mod.rs | 138 +++++++----------- 94 files changed, 583 insertions(+), 714 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ddb76af927..0b66b2305c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +### Changed + +- all-binaries: improved error logging ([#2686]) + +[#2686]: https://github.com/nymtech/nym/pull/2686 + + ## [v1.1.3] (2022-12-13) ### Changed diff --git a/Cargo.lock b/Cargo.lock index 822fa26726..7ce237d55d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -586,7 +586,7 @@ dependencies = [ [[package]] name = "client-core" -version = "1.1.2" +version = "1.1.3" dependencies = [ "async-trait", "client-connections", @@ -1116,6 +1116,7 @@ dependencies = [ "serde", "serde_bytes", "subtle-encoding", + "thiserror", "x25519-dalek", ] @@ -2934,6 +2935,7 @@ dependencies = [ "rand 0.8.5", "serde", "task", + "thiserror", "tokio", "tokio-util 0.7.3", "url", @@ -3106,7 +3108,7 @@ dependencies = [ [[package]] name = "nym-cli" -version = "1.1.2" +version = "1.1.3" dependencies = [ "anyhow", "base64", @@ -3160,7 +3162,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "1.1.2" +version = "1.1.3" dependencies = [ "clap 3.2.8", "client-connections", @@ -3199,7 +3201,7 @@ dependencies = [ [[package]] name = "nym-gateway" -version = "1.1.2" +version = "1.1.3" dependencies = [ "anyhow", "async-trait", @@ -3246,7 +3248,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.2" +version = "1.1.3" dependencies = [ "anyhow", "bs58", @@ -3288,7 +3290,7 @@ dependencies = [ [[package]] name = "nym-network-requester" -version = "1.1.2" +version = "1.1.3" dependencies = [ "async-trait", "clap 3.2.8", @@ -3320,7 +3322,7 @@ dependencies = [ [[package]] name = "nym-network-statistics" -version = "1.1.2" +version = "1.1.3" dependencies = [ "dirs", "log", @@ -3336,7 +3338,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.2" +version = "1.1.3" dependencies = [ "clap 3.2.8", "client-connections", @@ -3403,7 +3405,7 @@ dependencies = [ [[package]] name = "nym-validator-api" -version = "1.1.2" +version = "1.1.3" dependencies = [ "anyhow", "async-trait", @@ -3541,6 +3543,7 @@ dependencies = [ "nymsphinx-types", "pemstore", "rand 0.7.3", + "thiserror", "topology", ] @@ -3615,6 +3618,7 @@ dependencies = [ "bytes", "nymsphinx-params", "nymsphinx-types", + "thiserror", "tokio-util 0.7.3", ] @@ -3624,6 +3628,7 @@ version = "0.1.0" dependencies = [ "crypto", "nymsphinx-types", + "thiserror", ] [[package]] @@ -3707,6 +3712,7 @@ name = "ordered-buffer" version = "0.1.0" dependencies = [ "log", + "thiserror", ] [[package]] diff --git a/clients/client-core/src/client/mix_traffic.rs b/clients/client-core/src/client/mix_traffic.rs index f61a83af95..ccba8f86ca 100644 --- a/clients/client-core/src/client/mix_traffic.rs +++ b/clients/client-core/src/client/mix_traffic.rs @@ -51,8 +51,8 @@ impl MixTrafficController { }; match result { - Err(e) => { - error!("Failed to send sphinx packet(s) to the gateway! - {:?}", e); + Err(err) => { + error!("Failed to send sphinx packet(s) to the gateway! - {err}"); self.consecutive_gateway_failure_count += 1; if self.consecutive_gateway_failure_count == MAX_FAILURE_COUNT { // todo: in the future this should initiate a 'graceful' shutdown or try diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs index 9b75669960..ef1c03046d 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs @@ -264,7 +264,7 @@ where }; if let Err(err) = self.mix_tx.send(vec![next_message]).await { - log::error!("Failed to send: {}", err); + log::error!("Failed to send: {err}"); } // notify ack controller about sending our message only after we actually managed to push it diff --git a/clients/client-core/src/init/mod.rs b/clients/client-core/src/init/mod.rs index cdf210a27e..f01bc74dcd 100644 --- a/clients/client-core/src/init/mod.rs +++ b/clients/client-core/src/init/mod.rs @@ -209,8 +209,8 @@ pub fn output_to_json(init_results: &T, output_file: &str) { match std::fs::File::create(output_file) { Ok(file) => match serde_json::to_writer_pretty(file, init_results) { Ok(_) => println!("Saved: {}", output_file), - Err(err) => eprintln!("Could not save {}: {}", output_file, err), + Err(err) => eprintln!("Could not save {}: {err}", output_file), }, - Err(err) => eprintln!("Could not save {}: {}", output_file, err), + Err(err) => eprintln!("Could not save {}: {err}", output_file), } } diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index 4267fcbac5..d5c7eccbdb 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -95,7 +95,7 @@ pub(crate) async fn execute(args: &Run) -> Result<(), ClientError> { let mut config = match Config::load_from_file(Some(id)) { Ok(cfg) => cfg, Err(err) => { - error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {})", id, err); + error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", id); return Err(ClientError::FailedToLoadConfig(id.to_string())); } }; diff --git a/clients/native/src/commands/upgrade.rs b/clients/native/src/commands/upgrade.rs index c84073200c..6aaa732624 100644 --- a/clients/native/src/commands/upgrade.rs +++ b/clients/native/src/commands/upgrade.rs @@ -59,7 +59,7 @@ pub(crate) struct Upgrade { fn parse_config_version(config: &Config) -> Version { let version = Version::parse(config.get_base().get_version()).unwrap_or_else(|err| { - eprintln!("failed to parse client version! - {:?}", err); + eprintln!("failed to parse client version! - {err}"); process::exit(1) }); @@ -110,7 +110,7 @@ fn minor_0_12_upgrade( .set_custom_version(to_version.to_string().as_ref()); config.save_to_file(None).unwrap_or_else(|err| { - eprintln!("failed to overwrite config file! - {:?}", err); + eprintln!("failed to overwrite config file! - {err}"); print_failed_upgrade(config_version, &to_version); process::exit(1); }); @@ -146,7 +146,7 @@ pub(crate) fn execute(args: &Upgrade) { let id = &args.id; let existing_config = Config::load_from_file(Some(id)).unwrap_or_else(|err| { - eprintln!("failed to load existing config file! - {:?}", err); + eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/clients/native/src/websocket/handler.rs b/clients/native/src/websocket/handler.rs index 7d8d16e97f..476eb0a567 100644 --- a/clients/native/src/websocket/handler.rs +++ b/clients/native/src/websocket/handler.rs @@ -373,7 +373,7 @@ impl Handler { let socket_msg = match socket_msg.unwrap() { Ok(socket_msg) => socket_msg, Err(err) => { - warn!("failed to obtain message from websocket stream! stopping connection handler: {}", err); + warn!("failed to obtain message from websocket stream! stopping connection handler: {err}"); break; } }; @@ -397,8 +397,8 @@ impl Handler { error!("mix messages sender was unexpectedly closed! this shouldn't have ever happened! (unless we're shutting down - TODO: implement proper graceful shutdown handler)"); return }; - if let Err(e) = self.push_websocket_received_plaintexts(mix_messages).await { - warn!("failed to send sphinx packets back to the client - {:?}, assuming the connection is dead", e); + if let Err(err) = self.push_websocket_received_plaintexts(mix_messages).await { + warn!("failed to send sphinx packets back to the client - {err}, assuming the connection is dead"); break; } } @@ -411,7 +411,7 @@ impl Handler { let ws_stream = match accept_async(socket).await { Ok(ws_stream) => ws_stream, Err(err) => { - warn!("error while performing the websocket handshake - {:?}", err); + warn!("error while performing the websocket handshake - {err}"); return; } }; diff --git a/clients/native/src/websocket/listener.rs b/clients/native/src/websocket/listener.rs index c7825fb345..cf9c7cfa65 100644 --- a/clients/native/src/websocket/listener.rs +++ b/clients/native/src/websocket/listener.rs @@ -36,7 +36,7 @@ impl Listener { let tcp_listener = match tokio::net::TcpListener::bind(self.address).await { Ok(listener) => listener, Err(err) => { - error!("Failed to bind to {} - {}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address, err); + error!("Failed to bind to {} - {err}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address); process::exit(1); } }; @@ -63,7 +63,7 @@ impl Listener { Ok(_) => trace!( "closed the connection between attempting websocket handshake" ), - Err(e) => warn!("failed to cleanly close the connection - {:?}", e), + Err(err) => warn!("failed to cleanly close the connection - {err}"), }; } else { // even though we're spawning a new task with the handler here, we will only ever spawn a single one. @@ -78,7 +78,7 @@ impl Listener { self.state = State::Connected; } } - Err(e) => warn!("failed to get client: {:?}", e), + Err(err) => warn!("failed to get client: {err}"), } } } diff --git a/clients/native/websocket-requests/src/requests.rs b/clients/native/websocket-requests/src/requests.rs index f50364a3cf..637db0daba 100644 --- a/clients/native/websocket-requests/src/requests.rs +++ b/clients/native/websocket-requests/src/requests.rs @@ -132,7 +132,7 @@ impl ClientRequest { Err(err) => { return Err(error::Error::new( ErrorKind::MalformedRequest, - format!("malformed recipient: {:?}", err), + format!("malformed recipient: {err}"), )) } }; @@ -210,7 +210,7 @@ impl ClientRequest { Err(err) => { return Err(error::Error::new( ErrorKind::MalformedRequest, - format!("malformed recipient: {:?}", err), + format!("malformed recipient: {err}"), )) } }; diff --git a/clients/native/websocket-requests/src/responses.rs b/clients/native/websocket-requests/src/responses.rs index cbefe54242..8b4e60963a 100644 --- a/clients/native/websocket-requests/src/responses.rs +++ b/clients/native/websocket-requests/src/responses.rs @@ -173,7 +173,7 @@ impl ServerResponse { Err(err) => { return Err(error::Error::new( ErrorKind::MalformedResponse, - format!("malformed Recipient: {:?}", err), + format!("malformed Recipient: {err}"), )) } }; @@ -249,7 +249,7 @@ impl ServerResponse { Err(err) => { return Err(error::Error::new( ErrorKind::MalformedResponse, - format!("malformed error message: {:?}", err), + format!("malformed error message: {err}"), )) } }; diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 612ecc02c2..10d2d60ea6 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -110,7 +110,7 @@ pub(crate) async fn execute(args: &Run) -> Result<(), Box cfg, Err(err) => { - error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {})", id, err); + error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", id); return Err(Box::new(Socks5ClientError::FailedToLoadConfig( id.to_string(), ))); diff --git a/clients/socks5/src/commands/upgrade.rs b/clients/socks5/src/commands/upgrade.rs index ff41f3ce6e..db77167f34 100644 --- a/clients/socks5/src/commands/upgrade.rs +++ b/clients/socks5/src/commands/upgrade.rs @@ -58,7 +58,7 @@ pub(crate) struct Upgrade { fn parse_config_version(config: &Config) -> Version { let version = Version::parse(config.get_base().get_version()).unwrap_or_else(|err| { - eprintln!("failed to parse client version! - {:?}", err); + eprintln!("failed to parse client version! - {err}"); process::exit(1) }); @@ -109,7 +109,7 @@ fn minor_0_12_upgrade( .set_custom_version(to_version.to_string().as_ref()); config.save_to_file(None).unwrap_or_else(|err| { - eprintln!("failed to overwrite config file! - {:?}", err); + eprintln!("failed to overwrite config file! - {err}"); print_failed_upgrade(config_version, &to_version); process::exit(1); }); @@ -145,7 +145,7 @@ pub(crate) fn execute(args: &Upgrade) { let id = &args.id; let existing_config = Config::load_from_file(Some(id)).unwrap_or_else(|err| { - eprintln!("failed to load existing config file! - {:?}", err); + eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/clients/socks5/src/socks/client.rs b/clients/socks5/src/socks/client.rs index 3b35a4caf9..e5a8fc9d56 100644 --- a/clients/socks5/src/socks/client.rs +++ b/clients/socks5/src/socks/client.rs @@ -220,7 +220,7 @@ impl SocksClient { } pub async fn send_error(&mut self, err: SocksProxyError) -> Result<(), SocksProxyError> { - let error_text = format!("{}", err); + let error_text = format!("{err}"); let Some(ref version) = self.socks_version else { log::error!("Trying to send error without knowing the version"); return Ok(()); diff --git a/clients/socks5/src/socks/mixnet_responses.rs b/clients/socks5/src/socks/mixnet_responses.rs index 7613a32019..d4fb8fd544 100644 --- a/clients/socks5/src/socks/mixnet_responses.rs +++ b/clients/socks5/src/socks/mixnet_responses.rs @@ -25,9 +25,9 @@ impl Drop for MixnetResponseListener { .unbounded_send(ReceivedBufferMessage::ReceiverDisconnect) { if self.shutdown.is_shutdown_poll() { - log::debug!("The buffer request failed: {}", err); + log::debug!("The buffer request failed: {err}"); } else { - log::error!("The buffer request failed: {}", err); + log::error!("The buffer request failed: {err}"); } } } @@ -60,7 +60,7 @@ impl MixnetResponseListener { let response = match Message::try_from_bytes(&raw_message) { Err(err) => { - warn!("failed to parse received response - {:?}", err); + warn!("failed to parse received response - {err}"); return; } Ok(Message::Request(_)) => { diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index 0bba59ee0b..a7e0a3c0e3 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -103,7 +103,7 @@ impl SphinxSocksServer { tokio::spawn(async move { if let Err(err) = client.run().await { - error!("Error! {}", err); + error!("Error! {err}"); if client.send_error(err).await.is_err() { warn!("Failed to send error code"); }; diff --git a/clients/socks5/src/socks/types.rs b/clients/socks5/src/socks/types.rs index 669a6b1093..e561d0025d 100644 --- a/clients/socks5/src/socks/types.rs +++ b/clients/socks5/src/socks/types.rs @@ -40,7 +40,7 @@ pub enum SocksProxyError { impl std::fmt::Display for SocksProxyError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - SocksProxyError::GenericError(err) => write!(f, "GenericError - {}", err), + SocksProxyError::GenericError(err) => write!(f, "GenericError - {err}"), SocksProxyError::UnsupportedProxyVersion(version) => { write!(f, "Unsupported proxy version {}", version) } diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index e1c2654b80..bb6fe0bbd1 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -305,11 +305,11 @@ impl GatewayClient { if let Some(shared_keys) = &self.shared_key { if let Some(plaintext) = try_decrypt_binary_message(bin_msg, shared_keys) { if let Err(err) = self.packet_router.route_received(vec![plaintext]) { - log::warn!("Route received failed: {:?}", err); + log::warn!("Route received failed: {err}"); } } } else if let Err(err) = self.packet_router.route_received(vec![bin_msg]) { - log::warn!("Route received failed: {:?}", err); + log::warn!("Route received failed: {err}"); } } Message::Text(txt_msg) => { diff --git a/common/client-libs/gateway-client/src/packet_router.rs b/common/client-libs/gateway-client/src/packet_router.rs index fd63077ee6..c64fbf92f8 100644 --- a/common/client-libs/gateway-client/src/packet_router.rs +++ b/common/client-libs/gateway-client/src/packet_router.rs @@ -89,14 +89,14 @@ impl PacketRouter { } // This should never happen during ordinary operation the way it's currently used. // Abort to be on the safe side - panic!("Failed to send mixnet message: {:?}", err); + panic!("Failed to send mixnet message: {err}"); } } if !received_acks.is_empty() { trace!("routing acks"); - if let Err(e) = self.ack_sender.unbounded_send(received_acks) { - error!("failed to send ack: {:?}", e); + if let Err(err) = self.ack_sender.unbounded_send(received_acks) { + error!("failed to send ack: {err}"); }; } Ok(()) diff --git a/common/client-libs/gateway-client/src/socket_state.rs b/common/client-libs/gateway-client/src/socket_state.rs index aa96b9a4fa..8c66b20906 100644 --- a/common/client-libs/gateway-client/src/socket_state.rs +++ b/common/client-libs/gateway-client/src/socket_state.rs @@ -115,7 +115,7 @@ impl PartiallyDelegated { }; if let Err(err) = Self::route_socket_messages(ws_msgs, &mut packet_router, shared_key.as_ref()) { - log::warn!("Route socket messages failed: {:?}", err); + log::warn!("Route socket messages failed: {err}"); } } }; diff --git a/common/client-libs/mixnet-client/src/client.rs b/common/client-libs/mixnet-client/src/client.rs index 600268b69b..f3a04f1099 100644 --- a/common/client-libs/mixnet-client/src/client.rs +++ b/common/client-libs/mixnet-client/src/client.rs @@ -122,7 +122,7 @@ impl Client { // We could have as well used conn.send_all(receiver.map(Ok)), but considering we don't care // about neither receiver nor the connection, it doesn't matter which one gets consumed if let Err(err) = receiver.map(Ok).forward(conn).await { - warn!("Failed to forward packets to {} - {:?}", address, err); + warn!("Failed to forward packets to {} - {err}", address); } debug!( diff --git a/common/client-libs/mixnet-client/src/forwarder.rs b/common/client-libs/mixnet-client/src/forwarder.rs index d92f6ad790..1aa68be8da 100644 --- a/common/client-libs/mixnet-client/src/forwarder.rs +++ b/common/client-libs/mixnet-client/src/forwarder.rs @@ -59,7 +59,7 @@ impl PacketForwarder { self.mixnet_client .send_without_response(next_hop, sphinx_packet, packet_mode) { - debug!("failed to forward the packet - {}", err) + debug!("failed to forward the packet - {err}") } } } diff --git a/common/commands/src/context/errors.rs b/common/commands/src/context/errors.rs index 44a99f49ed..7be8f6d8ef 100644 --- a/common/commands/src/context/errors.rs +++ b/common/commands/src/context/errors.rs @@ -16,9 +16,9 @@ pub enum ContextError { #[error("failed to create client - {0}")] NymdError(String), - #[error("{0}")] + #[error(transparent)] NymdErrorPassthrough(#[from] validator_client::nymd::error::NymdError), - #[error("{0}")] + #[error(transparent)] ValidatorClientError(#[from] validator_client::ValidatorClientError), } diff --git a/common/commands/src/context/mod.rs b/common/commands/src/context/mod.rs index 4f55aa1847..98709d6d98 100644 --- a/common/commands/src/context/mod.rs +++ b/common/commands/src/context/mod.rs @@ -59,7 +59,7 @@ pub fn create_signing_client( network_details: &NymNetworkDetails, ) -> Result { let client_config = nymd::Config::try_from_nym_network_details(network_details) - .tap_err(|e| log::error!("Failed to get client config - {:?}", e))?; + .tap_err(|err| log::error!("Failed to get client config - {err}"))?; // get mnemonic let mnemonic = match std::env::var("MNEMONIC") { @@ -88,7 +88,7 @@ pub fn create_query_client( network_details: &NymNetworkDetails, ) -> Result { let client_config = nymd::Config::try_from_nym_network_details(network_details) - .tap_err(|e| log::error!("Failed to get client config - {:?}", e))?; + .tap_err(|err| log::error!("Failed to get client config - {err}"))?; let nymd_url = network_details .endpoints @@ -108,7 +108,7 @@ pub fn create_signing_client_with_validator_api( network_details: &NymNetworkDetails, ) -> Result { let client_config = validator_client::Config::try_from_nym_network_details(network_details) - .tap_err(|e| log::error!("Failed to get client config - {:?}", e))?; + .tap_err(|err| log::error!("Failed to get client config - {err}"))?; // get mnemonic let mnemonic = match std::env::var("MNEMONIC") { @@ -130,7 +130,7 @@ pub fn create_query_client_with_validator_api( network_details: &NymNetworkDetails, ) -> Result { let client_config = validator_client::Config::try_from_nym_network_details(network_details) - .tap_err(|e| log::error!("Failed to get client config - {:?}", e))?; + .tap_err(|err| log::error!("Failed to get client config - {err}"))?; match validator_client::client::Client::new_query(client_config) { Ok(client) => Ok(client), diff --git a/common/commands/src/validator/signature/errors.rs b/common/commands/src/validator/signature/errors.rs index 2369e06d66..d67c3d387b 100644 --- a/common/commands/src/validator/signature/errors.rs +++ b/common/commands/src/validator/signature/errors.rs @@ -11,6 +11,6 @@ pub enum Errors { #[error("signature error - {0}")] SignatureError(#[from] k256::ecdsa::signature::Error), - #[error("{0}")] + #[error(transparent)] CosmrsError(#[from] cosmrs::ErrorReport), } diff --git a/common/credential-storage/src/lib.rs b/common/credential-storage/src/lib.rs index 3b683026ce..d0a0992894 100644 --- a/common/credential-storage/src/lib.rs +++ b/common/credential-storage/src/lib.rs @@ -45,13 +45,13 @@ impl PersistentStorage { let connection_pool = match sqlx::SqlitePool::connect_with(opts).await { Ok(db) => db, Err(err) => { - error!("Failed to connect to SQLx database: {}", err); + error!("Failed to connect to SQLx database: {err}"); return Err(err.into()); } }; if let Err(err) = sqlx::migrate!("./migrations").run(&connection_pool).await { - error!("Failed to perform migration on the SQLx database: {}", err); + error!("Failed to perform migration on the SQLx database: {err}"); return Err(err.into()); } @@ -104,7 +104,7 @@ impl Storage for PersistentStorage { pub async fn initialise_storage(path: PathBuf) -> PersistentStorage { match PersistentStorage::init(path).await { - Err(err) => panic!("failed to initialise credential storage - {}", err), + Err(err) => panic!("failed to initialise credential storage - {err}"), Ok(storage) => storage, } } diff --git a/common/crypto/Cargo.toml b/common/crypto/Cargo.toml index a8e749f2e0..94d3d2820b 100644 --- a/common/crypto/Cargo.toml +++ b/common/crypto/Cargo.toml @@ -22,6 +22,7 @@ rand = { version = "0.7.3", features = ["wasm-bindgen"], optional = true } serde_bytes = { version = "0.11.6", optional = true } serde_crate = { version = "1.0", optional = true, default_features = false, package = "serde" } subtle-encoding = { version = "0.5", features = ["bech32-preview"]} +thiserror = "1.0.37" # internal nymsphinx-types = { path = "../nymsphinx/types" } diff --git a/common/crypto/src/asymmetric/encryption/mod.rs b/common/crypto/src/asymmetric/encryption/mod.rs index 5c7b5398ad..28ff92c07e 100644 --- a/common/crypto/src/asymmetric/encryption/mod.rs +++ b/common/crypto/src/asymmetric/encryption/mod.rs @@ -2,11 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 use pemstore::traits::{PemStorableKey, PemStorableKeyPair}; +use std::fmt::{self, Display, Formatter}; +use thiserror::Error; + #[cfg(feature = "rand")] use rand::{CryptoRng, RngCore}; #[cfg(feature = "serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use std::fmt::{self, Display, Formatter}; /// Size of a X25519 private key pub const PRIVATE_KEY_SIZE: usize = 32; @@ -17,31 +19,26 @@ pub const PUBLIC_KEY_SIZE: usize = 32; /// Size of a X25519 shared secret pub const SHARED_SECRET_SIZE: usize = 32; -#[derive(Clone, Copy, Eq, PartialEq, Debug)] +#[derive(Clone, Eq, PartialEq, Debug, Error)] pub enum KeyRecoveryError { - InvalidPublicKeyBytes, - InvalidPrivateKeyBytes, - MalformedString(bs58::decode::Error), -} + #[error("received public key of invalid size. Got: {received}, expected: {expected}")] + InvalidSizePublicKey { received: usize, expected: usize }, -impl From for KeyRecoveryError { - fn from(err: bs58::decode::Error) -> Self { - KeyRecoveryError::MalformedString(err) - } -} + #[error("received private key of invalid size. Got: {received}, expected: {expected}")] + InvalidSizePrivateKey { received: usize, expected: usize }, -// required for std::error::Error -impl Display for KeyRecoveryError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - KeyRecoveryError::InvalidPrivateKeyBytes => write!(f, "Invalid private key bytes"), - KeyRecoveryError::InvalidPublicKeyBytes => write!(f, "Invalid public key bytes"), - KeyRecoveryError::MalformedString(err) => write!(f, "malformed string - {}", err), - } - } -} + #[error("the base58 representation of the public key was malformed - {source}")] + MalformedPublicKeyString { + #[source] + source: bs58::decode::Error, + }, -impl std::error::Error for KeyRecoveryError {} + #[error("the base58 representation of the private key was malformed - {source}")] + MalformedPrivateKeyString { + #[source] + source: bs58::decode::Error, + }, +} pub struct KeyPair { pub(crate) private_key: PrivateKey, @@ -112,7 +109,10 @@ impl PublicKey { pub fn from_bytes(b: &[u8]) -> Result { if b.len() != PUBLIC_KEY_SIZE { - return Err(KeyRecoveryError::InvalidPublicKeyBytes); + return Err(KeyRecoveryError::InvalidSizePublicKey { + received: b.len(), + expected: PUBLIC_KEY_SIZE, + }); } let mut bytes = [0; PUBLIC_KEY_SIZE]; bytes.copy_from_slice(&b[..PUBLIC_KEY_SIZE]); @@ -124,7 +124,9 @@ impl PublicKey { } pub fn from_base58_string>(val: I) -> Result { - let bytes = bs58::decode(val).into_vec()?; + let bytes = bs58::decode(val) + .into_vec() + .map_err(|source| KeyRecoveryError::MalformedPublicKeyString { source })?; Self::from_bytes(&bytes) } } @@ -188,7 +190,10 @@ impl PrivateKey { pub fn from_bytes(b: &[u8]) -> Result { if b.len() != PRIVATE_KEY_SIZE { - return Err(KeyRecoveryError::InvalidPrivateKeyBytes); + return Err(KeyRecoveryError::InvalidSizePrivateKey { + received: b.len(), + expected: PRIVATE_KEY_SIZE, + }); } let mut bytes = [0; 32]; bytes.copy_from_slice(&b[..PRIVATE_KEY_SIZE]); @@ -200,7 +205,9 @@ impl PrivateKey { } pub fn from_base58_string>(val: I) -> Result { - let bytes = bs58::decode(val).into_vec()?; + let bytes = bs58::decode(val) + .into_vec() + .map_err(|source| KeyRecoveryError::MalformedPrivateKeyString { source })?; Self::from_bytes(&bytes) } diff --git a/common/crypto/src/asymmetric/identity/mod.rs b/common/crypto/src/asymmetric/identity/mod.rs index 8ba1de8ec6..836f6c70e0 100644 --- a/common/crypto/src/asymmetric/identity/mod.rs +++ b/common/crypto/src/asymmetric/identity/mod.rs @@ -6,10 +6,11 @@ pub use ed25519_dalek::SignatureError; pub use ed25519_dalek::{Verifier, PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, SIGNATURE_LENGTH}; use nymsphinx_types::{DestinationAddressBytes, DESTINATION_ADDRESS_LENGTH}; use pemstore::traits::{PemStorableKey, PemStorableKeyPair}; +use std::fmt::{self, Display, Formatter}; +use thiserror::Error; + #[cfg(feature = "rand")] use rand::{CryptoRng, RngCore}; -use std::fmt::{self, Display, Formatter}; - #[cfg(feature = "serde")] use serde::de::Error as SerdeError; #[cfg(feature = "serde")] @@ -17,35 +18,30 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[cfg(feature = "serde")] use serde_bytes::{ByteBuf as SerdeByteBuf, Bytes as SerdeBytes}; -#[derive(Debug)] +#[derive(Debug, Error)] pub enum Ed25519RecoveryError { - MalformedBytes(SignatureError), - MalformedString(bs58::decode::Error), -} + #[error(transparent)] + MalformedBytes(#[from] SignatureError), -impl From for Ed25519RecoveryError { - fn from(err: SignatureError) -> Self { - Ed25519RecoveryError::MalformedBytes(err) - } -} + #[error("the base58 representation of the public key was malformed - {source}")] + MalformedPublicKeyString { + #[source] + source: bs58::decode::Error, + }, -impl From for Ed25519RecoveryError { - fn from(err: bs58::decode::Error) -> Self { - Ed25519RecoveryError::MalformedString(err) - } -} + #[error("the base58 representation of the private key was malformed - {source}")] + MalformedPrivateKeyString { + #[source] + source: bs58::decode::Error, + }, -impl fmt::Display for Ed25519RecoveryError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - Ed25519RecoveryError::MalformedBytes(err) => write!(f, "malformed bytes - {}", err), - Ed25519RecoveryError::MalformedString(err) => write!(f, "malformed string - {}", err), - } - } + #[error("the base58 representation of the signature was malformed - {source}")] + MalformedSignatureString { + #[source] + source: bs58::decode::Error, + }, } -impl std::error::Error for Ed25519RecoveryError {} - /// Keypair for usage in ed25519 EdDSA. #[derive(Debug)] pub struct KeyPair { @@ -134,7 +130,9 @@ impl PublicKey { } pub fn from_base58_string>(val: I) -> Result { - let bytes = bs58::decode(val).into_vec()?; + let bytes = bs58::decode(val) + .into_vec() + .map_err(|source| Ed25519RecoveryError::MalformedPublicKeyString { source })?; Self::from_bytes(&bytes) } @@ -211,7 +209,9 @@ impl PrivateKey { } pub fn from_base58_string>(val: I) -> Result { - let bytes = bs58::decode(val).into_vec()?; + let bytes = bs58::decode(val) + .into_vec() + .map_err(|source| Ed25519RecoveryError::MalformedPrivateKeyString { source })?; Self::from_bytes(&bytes) } @@ -277,7 +277,9 @@ impl Signature { } pub fn from_base58_string>(val: I) -> Result { - let bytes = bs58::decode(val).into_vec()?; + let bytes = bs58::decode(val) + .into_vec() + .map_err(|source| Ed25519RecoveryError::MalformedSignatureString { source })?; Self::from_bytes(&bytes) } diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml index 53676023af..e4d68165b9 100644 --- a/common/mixnode-common/Cargo.toml +++ b/common/mixnode-common/Cargo.toml @@ -16,6 +16,7 @@ serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.21.2", features = ["time", "macros", "rt", "net", "io-util"] } tokio-util = { version = "0.7.3", features = ["codec"] } url = "2.2" +thiserror = "1.0.37" crypto = { path = "../crypto" } nymsphinx-acknowledgements = { path = "../nymsphinx/acknowledgements" } diff --git a/common/mixnode-common/src/packet_processor/error.rs b/common/mixnode-common/src/packet_processor/error.rs index 38be92079d..084ce708a8 100644 --- a/common/mixnode-common/src/packet_processor/error.rs +++ b/common/mixnode-common/src/packet_processor/error.rs @@ -4,63 +4,22 @@ use nymsphinx_acknowledgements::surb_ack::SurbAckRecoveryError; use nymsphinx_addressing::nodes::NymNodeRoutingAddressError; use nymsphinx_types::Error as SphinxError; -use std::fmt::{self, Display, Formatter}; +use thiserror::Error; -#[derive(Debug)] +#[derive(Error, Debug)] pub enum MixProcessingError { - SphinxProcessingError(SphinxError), - InvalidHopAddress(NymNodeRoutingAddressError), - NoSurbAckInFinalHop, - MalformedSurbAck(SurbAckRecoveryError), + #[error("failed to process received packet: {0}")] + SphinxProcessingError(#[from] SphinxError), + #[error("the forward hop address was malformed: {0}")] + InvalidForwardHopAddress(#[from] NymNodeRoutingAddressError), + + #[error("the final hop did not contain a SURB-Ack")] + NoSurbAckInFinalHop, + + #[error("failed to recover the expected SURB-Ack packet: {0}")] + MalformedSurbAck(#[from] SurbAckRecoveryError), + + #[error("the received packet was set to use the very old and very much deprecated 'VPN' mode")] ReceivedOldTypeVpnPacket, } - -impl From for MixProcessingError { - // for the time being just have a single error instance for all possible results of SphinxError - fn from(err: SphinxError) -> Self { - use MixProcessingError::*; - - SphinxProcessingError(err) - } -} - -impl From for MixProcessingError { - fn from(err: NymNodeRoutingAddressError) -> Self { - use MixProcessingError::*; - - InvalidHopAddress(err) - } -} - -impl From for MixProcessingError { - fn from(err: SurbAckRecoveryError) -> Self { - use MixProcessingError::*; - - MalformedSurbAck(err) - } -} - -impl Display for MixProcessingError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - MixProcessingError::SphinxProcessingError(sphinx_err) => { - write!(f, "Sphinx Processing Error - {}", sphinx_err) - } - MixProcessingError::InvalidHopAddress(address_err) => { - write!(f, "Invalid Hop Address - {:?}", address_err) - } - MixProcessingError::NoSurbAckInFinalHop => { - write!(f, "No SURBAck present in the final hop data") - } - MixProcessingError::MalformedSurbAck(surb_ack_err) => { - write!(f, "Malformed SURBAck - {:?}", surb_ack_err) - } - MixProcessingError::ReceivedOldTypeVpnPacket => { - write!(f, "Received an old-type unsafe 'VPN' mode packet") - } - } - } -} - -impl std::error::Error for MixProcessingError {} diff --git a/common/mixnode-common/src/packet_processor/processor.rs b/common/mixnode-common/src/packet_processor/processor.rs index aaadfe0171..84e543d8bd 100644 --- a/common/mixnode-common/src/packet_processor/processor.rs +++ b/common/mixnode-common/src/packet_processor/processor.rs @@ -51,7 +51,7 @@ impl SphinxPacketProcessor { packet: SphinxPacket, ) -> Result { packet.process(&self.sphinx_key).map_err(|err| { - debug!("Failed to unwrap Sphinx packet: {:?}", err); + debug!("Failed to unwrap Sphinx packet: {err}"); MixProcessingError::SphinxProcessingError(err) }) } diff --git a/common/mixnode-common/src/verloc/error.rs b/common/mixnode-common/src/verloc/error.rs index 44a408c77a..0268059d7c 100644 --- a/common/mixnode-common/src/verloc/error.rs +++ b/common/mixnode-common/src/verloc/error.rs @@ -53,13 +53,13 @@ impl Display for RttError { write!(f, "The received reply packet had invalid signature") } RttError::UnreachableNode(id, err) => { - write!(f, "Could not establish connection to {} - {}", id, err) + write!(f, "Could not establish connection to {} - {err}", id) } RttError::UnexpectedConnectionFailureWrite(id, err) => { - write!(f, "Failed to write echo packet to {} - {}", id, err) + write!(f, "Failed to write echo packet to {} - {err}", id) } RttError::UnexpectedConnectionFailureRead(id, err) => { - write!(f, "Failed to read reply packet from {} - {}", id, err) + write!(f, "Failed to read reply packet from {} - {err}", id) } RttError::ConnectionReadTimeout(id) => { write!(f, "Timed out while trying to read reply packet from {}", id) diff --git a/common/mixnode-common/src/verloc/listener.rs b/common/mixnode-common/src/verloc/listener.rs index 8f49779130..537ec3aad5 100644 --- a/common/mixnode-common/src/verloc/listener.rs +++ b/common/mixnode-common/src/verloc/listener.rs @@ -66,7 +66,7 @@ impl PacketListener { tokio::spawn(connection_handler.handle_connection(socket, remote_addr, handler_shutdown_listener)); } - Err(err) => warn!("Failed to accept incoming connection - {:?}", err), + Err(err) => warn!("Failed to accept incoming connection - {err}"), } }, _ = shutdown_listener.recv() => { @@ -141,9 +141,9 @@ enum EchoPacketCodecError { impl Display for EchoPacketCodecError { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match self { - EchoPacketCodecError::IoError(err) => write!(f, "encountered io error - {}", err), + EchoPacketCodecError::IoError(err) => write!(f, "encountered io error - {err}"), EchoPacketCodecError::PacketRecoveryError(err) => { - write!(f, "failed to correctly decode an echo packet - {}", err) + write!(f, "failed to correctly decode an echo packet - {err}") } } } diff --git a/common/nymsphinx/acknowledgements/Cargo.toml b/common/nymsphinx/acknowledgements/Cargo.toml index f105e0c544..c05976ade7 100644 --- a/common/nymsphinx/acknowledgements/Cargo.toml +++ b/common/nymsphinx/acknowledgements/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] rand = { version = "0.7.3", features = ["wasm-bindgen"] } +thiserror = "1.0.37" crypto = { path = "../../crypto", features = ["symmetric", "rand"] } nymsphinx-addressing = { path = "../addressing" } diff --git a/common/nymsphinx/acknowledgements/src/surb_ack.rs b/common/nymsphinx/acknowledgements/src/surb_ack.rs index 67e863d1f6..912ed4bc32 100644 --- a/common/nymsphinx/acknowledgements/src/surb_ack.rs +++ b/common/nymsphinx/acknowledgements/src/surb_ack.rs @@ -4,10 +4,13 @@ use crate::identifier::prepare_identifier; use crate::AckKey; use nymsphinx_addressing::clients::Recipient; -use nymsphinx_addressing::nodes::{NymNodeRoutingAddress, MAX_NODE_ADDRESS_UNPADDED_LEN}; +use nymsphinx_addressing::nodes::{ + NymNodeRoutingAddress, NymNodeRoutingAddressError, MAX_NODE_ADDRESS_UNPADDED_LEN, +}; use nymsphinx_params::packet_sizes::PacketSize; use nymsphinx_params::DEFAULT_NUM_MIX_HOPS; use nymsphinx_types::builder::SphinxPacketBuilder; +use nymsphinx_types::Error as SphinxError; use nymsphinx_types::{ delays::{self, Delay}, SphinxPacket, @@ -15,6 +18,7 @@ use nymsphinx_types::{ use rand::{CryptoRng, RngCore}; use std::convert::TryFrom; use std::time; +use thiserror::Error; use topology::{NymTopology, NymTopologyError}; pub struct SurbAck { @@ -23,11 +27,16 @@ pub struct SurbAck { expected_total_delay: Delay, } -#[derive(Debug)] +#[derive(Debug, Error)] pub enum SurbAckRecoveryError { - InvalidPacketSize, - InvalidAddress, - InvalidSphinxPacket, + #[error("received an invalid number of bytes to deserialize the SURB-Ack. Got {received}, expected {expected}")] + InvalidPacketSize { received: usize, expected: usize }, + + #[error("could not extract first hop address information - {0}")] + InvalidAddress(#[from] NymNodeRoutingAddressError), + + #[error("the contained sphinx packet was not correctly formed - {0}")] + InvalidSphinxPacket(#[from] SphinxError), } impl SurbAck { @@ -92,20 +101,17 @@ impl SurbAck { b: &[u8], ) -> Result<(NymNodeRoutingAddress, SphinxPacket), SurbAckRecoveryError> { if b.len() != Self::len() { - Err(SurbAckRecoveryError::InvalidPacketSize) + Err(SurbAckRecoveryError::InvalidPacketSize { + received: b.len(), + expected: Self::len(), + }) } else { - let address = match NymNodeRoutingAddress::try_from_bytes(b) { - Ok(address) => address, - Err(_) => return Err(SurbAckRecoveryError::InvalidAddress), - }; + let address = NymNodeRoutingAddress::try_from_bytes(b)?; // TODO: this will be variable once/if we decide to introduce optimization described // in common/nymsphinx/chunking/src/lib.rs:available_plaintext_size() let address_offset = MAX_NODE_ADDRESS_UNPADDED_LEN; - let packet = match SphinxPacket::from_bytes(&b[address_offset..]) { - Ok(packet) => packet, - Err(_) => return Err(SurbAckRecoveryError::InvalidSphinxPacket), - }; + let packet = SphinxPacket::from_bytes(&b[address_offset..])?; Ok((address, packet)) } diff --git a/common/nymsphinx/framing/Cargo.toml b/common/nymsphinx/framing/Cargo.toml index 6921a8cf69..fc46ece44a 100644 --- a/common/nymsphinx/framing/Cargo.toml +++ b/common/nymsphinx/framing/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" [dependencies] bytes = "1.0" tokio-util = { version = "0.7.3", features = ["codec"] } +thiserror = "1.0.37" nymsphinx-types = { path = "../types" } nymsphinx-params = { path = "../params" } diff --git a/common/nymsphinx/framing/src/codec.rs b/common/nymsphinx/framing/src/codec.rs index 5794a88544..f3986d2ece 100644 --- a/common/nymsphinx/framing/src/codec.rs +++ b/common/nymsphinx/framing/src/codec.rs @@ -1,57 +1,48 @@ -// Copyright 2021 - Nym Technologies SA +// Copyright 2021-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 use crate::packet::{FramedSphinxPacket, Header}; use bytes::{Buf, BufMut, BytesMut}; use nymsphinx_params::packet_modes::InvalidPacketMode; use nymsphinx_params::packet_sizes::{InvalidPacketSize, PacketSize}; +use nymsphinx_types::Error as SphinxError; use nymsphinx_types::SphinxPacket; use std::io; +use thiserror::Error; use tokio_util::codec::{Decoder, Encoder}; -#[derive(Debug)] +#[derive(Error, Debug)] pub enum SphinxCodecError { - InvalidPacketSize, - InvalidPacketMode, - MalformedSphinxPacket, - IoError(io::Error), -} + #[error("the packet size information was malformed - {0}")] + InvalidPacketSize(#[from] InvalidPacketSize), -impl From for SphinxCodecError { - fn from(err: io::Error) -> Self { - SphinxCodecError::IoError(err) - } + #[error("the packet mode information was malformed - {0}")] + InvalidPacketMode(#[from] InvalidPacketMode), + + #[error("the actual sphinx packet was malformed - {0}")] + MalformedSphinxPacket(#[from] SphinxError), + + #[error("encountered an IO error - {0}")] + IoError(#[from] io::Error), } impl From for io::Error { fn from(err: SphinxCodecError) -> Self { match err { - SphinxCodecError::InvalidPacketSize => { - io::Error::new(io::ErrorKind::InvalidInput, "invalid packet size") + SphinxCodecError::InvalidPacketSize(source) => { + io::Error::new(io::ErrorKind::InvalidInput, source) } - SphinxCodecError::InvalidPacketMode => { - io::Error::new(io::ErrorKind::InvalidInput, "invalid packet mode") + SphinxCodecError::InvalidPacketMode(source) => { + io::Error::new(io::ErrorKind::InvalidInput, source) } - SphinxCodecError::MalformedSphinxPacket => { - io::Error::new(io::ErrorKind::InvalidData, "malformed packet") + SphinxCodecError::MalformedSphinxPacket(source) => { + io::Error::new(io::ErrorKind::InvalidData, source) } SphinxCodecError::IoError(err) => err, } } } -impl From for SphinxCodecError { - fn from(_: InvalidPacketSize) -> Self { - SphinxCodecError::InvalidPacketSize - } -} - -impl From for SphinxCodecError { - fn from(_: InvalidPacketMode) -> Self { - SphinxCodecError::InvalidPacketMode - } -} - // TODO: in the future it could be extended to have state containing symmetric encryption key // so that all data could be encrypted easily (alternatively we could just slap TLS) pub struct SphinxCodec; @@ -97,17 +88,11 @@ impl Decoder for SphinxCodec { // advance buffer past the header - at this point we have enough bytes src.advance(header.size()); let sphinx_packet_bytes = src.split_to(sphinx_packet_size); - let sphinx_packet = match SphinxPacket::from_bytes(&sphinx_packet_bytes) { - Ok(sphinx_packet) => sphinx_packet, - // here it could be debatable whether stream is corrupt or not, - // but let's go with the safer approach and assume it is. - Err(_) => return Err(SphinxCodecError::MalformedSphinxPacket), - }; - let nymsphinx_packet = FramedSphinxPacket { - header, - packet: sphinx_packet, - }; + // here it could be debatable whether stream is corrupt or not, + // but let's go with the safer approach and assume it is. + let packet = SphinxPacket::from_bytes(&sphinx_packet_bytes)?; + let nymsphinx_packet = FramedSphinxPacket { header, packet }; // As per docs: // Before returning from the function, implementations should ensure that the buffer diff --git a/common/nymsphinx/params/Cargo.toml b/common/nymsphinx/params/Cargo.toml index a06f897f22..ebca914742 100644 --- a/common/nymsphinx/params/Cargo.toml +++ b/common/nymsphinx/params/Cargo.toml @@ -7,5 +7,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +thiserror = "1.0.37" + crypto = { path = "../../crypto", features = ["hashing", "symmetric"] } nymsphinx-types = { path = "../types" } diff --git a/common/nymsphinx/params/src/packet_modes.rs b/common/nymsphinx/params/src/packet_modes.rs index 819b32b3af..3fb7ac6358 100644 --- a/common/nymsphinx/params/src/packet_modes.rs +++ b/common/nymsphinx/params/src/packet_modes.rs @@ -1,10 +1,14 @@ -// Copyright 2021 - Nym Technologies SA +// Copyright 2021-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 use std::convert::TryFrom; +use thiserror::Error; -#[derive(Debug)] -pub struct InvalidPacketMode; +#[derive(Error, Debug)] +#[error("{received} is not a valid packet mode tag")] +pub struct InvalidPacketMode { + received: u8, +} #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -31,11 +35,11 @@ impl PacketMode { impl TryFrom for PacketMode { type Error = InvalidPacketMode; - fn try_from(value: u8) -> std::result::Result { + fn try_from(value: u8) -> Result { match value { _ if value == (PacketMode::Mix as u8) => Ok(Self::Mix), _ if value == (PacketMode::Vpn as u8) => Ok(Self::Vpn), - _ => Err(InvalidPacketMode), + v => Err(InvalidPacketMode { received: v }), } } } diff --git a/common/nymsphinx/params/src/packet_sizes.rs b/common/nymsphinx/params/src/packet_sizes.rs index aa573ffe11..ef9976bd92 100644 --- a/common/nymsphinx/params/src/packet_sizes.rs +++ b/common/nymsphinx/params/src/packet_sizes.rs @@ -6,6 +6,7 @@ use nymsphinx_types::header::HEADER_SIZE; use nymsphinx_types::PAYLOAD_OVERHEAD_SIZE; use std::convert::TryFrom; use std::str::FromStr; +use thiserror::Error; // it's up to the smart people to figure those values out : ) const REGULAR_PACKET_SIZE: usize = HEADER_SIZE + PAYLOAD_OVERHEAD_SIZE + 2 * 1024; @@ -20,11 +21,17 @@ const EXTENDED_PACKET_SIZE_8: usize = HEADER_SIZE + PAYLOAD_OVERHEAD_SIZE + 8 * const EXTENDED_PACKET_SIZE_16: usize = HEADER_SIZE + PAYLOAD_OVERHEAD_SIZE + 16 * 1024; const EXTENDED_PACKET_SIZE_32: usize = HEADER_SIZE + PAYLOAD_OVERHEAD_SIZE + 32 * 1024; -#[derive(Debug)] -pub struct InvalidPacketSize; +#[derive(Debug, Error)] +pub enum InvalidPacketSize { + #[error("{received} is not a valid packet size tag")] + UnknownPacketTag { received: u8 }, -#[derive(Debug)] -pub struct InvalidExtendedPacketSize; + #[error("{received} is not a valid extended packet size variant")] + UnknownExtendedPacketVariant { received: String }, + + #[error("{received} does not correspond with any known packet size")] + UnknownPacketSize { received: usize }, +} #[repr(u8)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -55,7 +62,9 @@ impl FromStr for PacketSize { "extended8" => Ok(Self::ExtendedPacket8), "extended16" => Ok(Self::ExtendedPacket16), "extended32" => Ok(Self::ExtendedPacket32), - _ => Err(InvalidPacketSize), + s => Err(InvalidPacketSize::UnknownExtendedPacketVariant { + received: s.to_string(), + }), } } } @@ -63,14 +72,14 @@ impl FromStr for PacketSize { impl TryFrom for PacketSize { type Error = InvalidPacketSize; - fn try_from(value: u8) -> std::result::Result { + fn try_from(value: u8) -> Result { match value { _ if value == (PacketSize::RegularPacket as u8) => Ok(Self::RegularPacket), _ if value == (PacketSize::AckPacket as u8) => Ok(Self::AckPacket), _ if value == (PacketSize::ExtendedPacket8 as u8) => Ok(Self::ExtendedPacket8), _ if value == (PacketSize::ExtendedPacket16 as u8) => Ok(Self::ExtendedPacket16), _ if value == (PacketSize::ExtendedPacket32 as u8) => Ok(Self::ExtendedPacket32), - _ => Err(InvalidPacketSize), + v => Err(InvalidPacketSize::UnknownPacketTag { received: v }), } } } @@ -94,7 +103,7 @@ impl PacketSize { self.size() - HEADER_SIZE } - pub fn get_type(size: usize) -> std::result::Result { + pub fn get_type(size: usize) -> Result { if PacketSize::RegularPacket.size() == size { Ok(PacketSize::RegularPacket) } else if PacketSize::AckPacket.size() == size { @@ -106,7 +115,7 @@ impl PacketSize { } else if PacketSize::ExtendedPacket32.size() == size { Ok(PacketSize::ExtendedPacket32) } else { - Err(InvalidPacketSize) + Err(InvalidPacketSize::UnknownPacketSize { received: size }) } } diff --git a/common/socks5/ordered-buffer/Cargo.toml b/common/socks5/ordered-buffer/Cargo.toml index f5ea5545d8..58dd09b263 100644 --- a/common/socks5/ordered-buffer/Cargo.toml +++ b/common/socks5/ordered-buffer/Cargo.toml @@ -8,3 +8,4 @@ edition = "2021" [dependencies] log = "0.4" +thiserror = "1.0.37" \ No newline at end of file diff --git a/common/socks5/ordered-buffer/src/message.rs b/common/socks5/ordered-buffer/src/message.rs index f5f28f53b1..15627d7fe0 100644 --- a/common/socks5/ordered-buffer/src/message.rs +++ b/common/socks5/ordered-buffer/src/message.rs @@ -1,9 +1,16 @@ -use std::cmp::Ordering; +// Copyright 2020-2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 -#[derive(Debug, PartialEq, Eq)] +use std::cmp::Ordering; +use thiserror::Error; + +#[derive(Error, Debug, PartialEq, Eq)] pub enum MessageError { + #[error("the received message was empty")] NoData, - IndexTooShort, + + #[error("could not extract message index. Received {received} bytes, but expected {expected}")] + IndexTooShort { received: usize, expected: usize }, } #[derive(Clone, Debug, Eq, PartialEq)] @@ -32,7 +39,10 @@ impl OrderedMessage { } if data.len() < 8 { - return Err(MessageError::IndexTooShort); + return Err(MessageError::IndexTooShort { + received: data.len(), + expected: 8, + }); } let index = u64::from_be_bytes([ data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], @@ -81,7 +91,13 @@ mod ordered_message_from_bytes { #[test] fn fails_when_data_is_too_short() { let result = OrderedMessage::try_from_bytes(vec![1, 2, 3]); - assert_eq!(Err(MessageError::IndexTooShort), result); + assert_eq!( + Err(MessageError::IndexTooShort { + received: 3, + expected: 8 + }), + result + ); } #[test] diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index 97c4487af6..d7e2645190 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -53,7 +53,7 @@ impl ActiveConnection { let ordered_message = match OrderedMessage::try_from_bytes(payload) { Ok(msg) => msg, Err(err) => { - error!("Malformed ordered message - {:?}", err); + error!("Malformed ordered message - {err}"); return; } }; @@ -158,9 +158,9 @@ impl Controller { .unbounded_send(ConnectionCommand::Close(conn_id)) { if self.shutdown.is_shutdown_poll() { - log::debug!("Failed to send: {}", err); + log::debug!("Failed to send: {err}"); } else { - log::error!("Failed to send: {}", err); + log::error!("Failed to send: {err}"); } } } @@ -197,7 +197,7 @@ impl Controller { socket_closed: active_connection.is_closed, }) { - error!("WTF IS THIS: {:?}", err); + error!("WTF IS THIS: {err}"); } // TODO: ABOVE UNWRAP CAUSED A CRASH IN A NORMAL USE!!!! diff --git a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs index 37403c33ad..b6688657de 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs @@ -54,7 +54,7 @@ where Some(data) => match data { Ok(data) => (data, false), Err(err) => { - error!(target: &*format!("({}) socks5 inbound", connection_id), "failed to read request from the socket - {}", err); + error!(target: &*format!("({}) socks5 inbound", connection_id), "failed to read request from the socket - {err}"); (Default::default(), true) } }, diff --git a/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs b/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs index 78db73afb6..f6c713e948 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs @@ -33,7 +33,7 @@ async fn deal_with_message( if let Err(err) = writer.write_all(&connection_message.payload).await { // the other half is probably going to blow up too (if not, this task also needs to notify the other one!!) - error!(target: &*format!("({}) socks5 outbound", connection_id), "failed to write response back to the socket - {}", err); + error!(target: &*format!("({}) socks5 outbound", connection_id), "failed to write response back to the socket - {err}"); return true; } if connection_message.socket_closed { diff --git a/common/socks5/requests/src/msg.rs b/common/socks5/requests/src/msg.rs index 2b688d8214..906c643524 100644 --- a/common/socks5/requests/src/msg.rs +++ b/common/socks5/requests/src/msg.rs @@ -9,13 +9,13 @@ use crate::response::{Response, ResponseError}; #[derive(Debug, Error)] pub enum MessageError { - #[error("{0}")] + #[error(transparent)] Request(RequestError), #[error("{0:?}")] Response(ResponseError), - #[error("{0}")] + #[error(transparent)] NetworkRequesterResponseError(NrError), #[error("no data")] diff --git a/common/task/src/shutdown.rs b/common/task/src/shutdown.rs index 09e8abcb50..4fe7a22bdd 100644 --- a/common/task/src/shutdown.rs +++ b/common/task/src/shutdown.rs @@ -299,7 +299,7 @@ impl ShutdownListener { if self.mode.is_dummy() { return; } - log::trace!("Notifying we stopped: {:?}", err); + log::trace!("Notifying we stopped: {err}"); if self.return_error.send(err).is_err() { log::error!("Failed to send back error message"); } diff --git a/common/topology/src/gateway.rs b/common/topology/src/gateway.rs index 57b34146e6..9df2156b32 100644 --- a/common/topology/src/gateway.rs +++ b/common/topology/src/gateway.rs @@ -7,63 +7,25 @@ use mixnet_contract_common::GatewayBond; use nymsphinx_addressing::nodes::{NodeIdentity, NymNodeRoutingAddress}; use nymsphinx_types::Node as SphinxNode; use std::convert::{TryFrom, TryInto}; -use std::fmt::{self, Display, Formatter}; +use std::fmt; use std::io; use std::net::SocketAddr; +use thiserror::Error; -#[derive(Debug)] +#[derive(Error, Debug)] pub enum GatewayConversionError { - InvalidIdentityKey(identity::Ed25519RecoveryError), - InvalidSphinxKey(encryption::KeyRecoveryError), - InvalidAddress(String, io::Error), - InvalidStake, - Other(Box), -} + #[error("gateway identity key was malformed - {0}")] + InvalidIdentityKey(#[from] identity::Ed25519RecoveryError), -impl From for GatewayConversionError { - fn from(err: encryption::KeyRecoveryError) -> Self { - GatewayConversionError::InvalidSphinxKey(err) - } -} + #[error("gateway sphinx key was malformed - {0}")] + InvalidSphinxKey(#[from] encryption::KeyRecoveryError), -impl From for GatewayConversionError { - fn from(err: identity::Ed25519RecoveryError) -> Self { - GatewayConversionError::InvalidIdentityKey(err) - } -} - -impl Display for GatewayConversionError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - GatewayConversionError::InvalidIdentityKey(err) => write!( - f, - "failed to convert gateway due to invalid identity key - {}", - err - ), - GatewayConversionError::InvalidSphinxKey(err) => write!( - f, - "failed to convert gateway due to invalid sphinx key - {}", - err - ), - GatewayConversionError::InvalidAddress(address, err) => { - write!( - f, - "failed to convert gateway due to invalid address {} - {}", - address, err - ) - } - GatewayConversionError::InvalidStake => { - write!(f, "failed to convert gateway due to invalid stake") - } - GatewayConversionError::Other(err) => { - write!( - f, - "failed to convert gateway due to another error - {}", - err - ) - } - } - } + #[error("'{value}' is not a valid gateway address - {source}")] + InvalidAddress { + value: String, + #[source] + source: io::Error, + }, } #[derive(Debug, Clone)] @@ -123,14 +85,22 @@ impl<'a> TryFrom<&'a GatewayBond> for Node { type Error = GatewayConversionError; fn try_from(bond: &'a GatewayBond) -> Result { - let host: NetworkAddress = bond.gateway.host.parse().map_err(|err| { - GatewayConversionError::InvalidAddress(bond.gateway.host.clone(), err) - })?; + let host: NetworkAddress = + bond.gateway + .host + .parse() + .map_err(|err| GatewayConversionError::InvalidAddress { + value: bond.gateway.host.clone(), + source: err, + })?; // try to completely resolve the host in the mix situation to avoid doing it every // single time we want to construct a path let mix_host = host.to_socket_addrs(bond.gateway.mix_port).map_err(|err| { - GatewayConversionError::InvalidAddress(bond.gateway.host.clone(), err) + GatewayConversionError::InvalidAddress { + value: bond.gateway.host.clone(), + source: err, + } })?[0]; Ok(Node { diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index ff3ba55c83..527176339d 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -276,7 +276,7 @@ pub fn nym_topology_from_detailed( match bond.try_into() { Ok(mix) => layer_entry.push(mix), Err(err) => { - warn!("Mix {} / {} is malformed - {}", mix_id, mix_identity, err); + warn!("Mix {} / {} is malformed - {err}", mix_id, mix_identity); continue; } } @@ -288,7 +288,7 @@ pub fn nym_topology_from_detailed( match bond.try_into() { Ok(gate) => gateways.push(gate), Err(err) => { - warn!("Gateway {} is malformed - {}", gate_id, err); + warn!("Gateway {} is malformed - {err}", gate_id); continue; } } diff --git a/common/topology/src/mix.rs b/common/topology/src/mix.rs index 81e0308b2f..08d7f5c0b7 100644 --- a/common/topology/src/mix.rs +++ b/common/topology/src/mix.rs @@ -7,63 +7,24 @@ use mixnet_contract_common::{Layer, MixId, MixNodeBond}; use nymsphinx_addressing::nodes::NymNodeRoutingAddress; use nymsphinx_types::Node as SphinxNode; use std::convert::{TryFrom, TryInto}; -use std::fmt::{self, Display, Formatter}; use std::io; use std::net::SocketAddr; +use thiserror::Error; -#[derive(Debug)] +#[derive(Error, Debug)] pub enum MixnodeConversionError { - InvalidIdentityKey(identity::Ed25519RecoveryError), - InvalidSphinxKey(encryption::KeyRecoveryError), - InvalidAddress(String, io::Error), - InvalidStake, - Other(Box), -} + #[error("mixnode identity key was malformed - {0}")] + InvalidIdentityKey(#[from] identity::Ed25519RecoveryError), -impl From for MixnodeConversionError { - fn from(err: encryption::KeyRecoveryError) -> Self { - MixnodeConversionError::InvalidSphinxKey(err) - } -} + #[error("mixnode sphinx key was malformed - {0}")] + InvalidSphinxKey(#[from] encryption::KeyRecoveryError), -impl From for MixnodeConversionError { - fn from(err: identity::Ed25519RecoveryError) -> Self { - MixnodeConversionError::InvalidIdentityKey(err) - } -} - -impl Display for MixnodeConversionError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - MixnodeConversionError::InvalidIdentityKey(err) => write!( - f, - "failed to convert mixnode due to invalid identity key - {}", - err - ), - MixnodeConversionError::InvalidSphinxKey(err) => write!( - f, - "failed to convert mixnode due to invalid sphinx key - {}", - err - ), - MixnodeConversionError::InvalidAddress(address, err) => { - write!( - f, - "failed to convert mixnode due to invalid address {} - {}", - address, err - ) - } - MixnodeConversionError::InvalidStake => { - write!(f, "failed to convert mixnode due to invalid stake") - } - MixnodeConversionError::Other(err) => { - write!( - f, - "failed to convert mixnode due to another error - {}", - err - ) - } - } - } + #[error("'{value}' is not a valid mixnode address - {source}")] + InvalidAddress { + value: String, + #[source] + source: io::Error, + }, } #[derive(Debug, Clone)] @@ -100,16 +61,22 @@ impl<'a> TryFrom<&'a MixNodeBond> for Node { type Error = MixnodeConversionError; fn try_from(bond: &'a MixNodeBond) -> Result { - let host: NetworkAddress = bond.mix_node.host.parse().map_err(|err| { - MixnodeConversionError::InvalidAddress(bond.mix_node.host.clone(), err) - })?; + let host: NetworkAddress = + bond.mix_node + .host + .parse() + .map_err(|err| MixnodeConversionError::InvalidAddress { + value: bond.mix_node.host.clone(), + source: err, + })?; // try to completely resolve the host in the mix situation to avoid doing it every // single time we want to construct a path let mix_host = host .to_socket_addrs(bond.mix_node.mix_port) - .map_err(|err| { - MixnodeConversionError::InvalidAddress(bond.mix_node.host.clone(), err) + .map_err(|err| MixnodeConversionError::InvalidAddress { + value: bond.mix_node.host.clone(), + source: err, })?[0]; Ok(Node { diff --git a/contracts/coconut-bandwidth/src/error.rs b/contracts/coconut-bandwidth/src/error.rs index 7bc8b11d4a..9f4aed6224 100644 --- a/contracts/coconut-bandwidth/src/error.rs +++ b/contracts/coconut-bandwidth/src/error.rs @@ -11,7 +11,7 @@ use thiserror::Error; /// Look at https://docs.rs/thiserror/1.0.21/thiserror/ for details. #[derive(Error, Debug, PartialEq)] pub enum ContractError { - #[error("{0}")] + #[error(transparent)] Std(#[from] StdError), #[error("Received multiple coin types")] @@ -29,6 +29,6 @@ pub enum ContractError { #[error("Credential already spent or in process of spending")] DuplicateBlindedSerialNumber, - #[error("{0}")] + #[error(transparent)] Admin(#[from] AdminError), } diff --git a/contracts/coconut-dkg/src/error.rs b/contracts/coconut-dkg/src/error.rs index 089a8b9f27..cd359579d0 100644 --- a/contracts/coconut-dkg/src/error.rs +++ b/contracts/coconut-dkg/src/error.rs @@ -8,10 +8,10 @@ use thiserror::Error; /// Custom errors for contract failure conditions. #[derive(Error, Debug, PartialEq)] pub enum ContractError { - #[error("{0}")] + #[error(transparent)] Std(#[from] StdError), - #[error("{0}")] + #[error(transparent)] Admin(#[from] AdminError), #[error("Group contract invalid address '{addr}'")] diff --git a/contracts/multisig/cw3-flex-multisig/src/error.rs b/contracts/multisig/cw3-flex-multisig/src/error.rs index f7addae37b..75a546ca0e 100644 --- a/contracts/multisig/cw3-flex-multisig/src/error.rs +++ b/contracts/multisig/cw3-flex-multisig/src/error.rs @@ -5,10 +5,10 @@ use thiserror::Error; #[derive(Error, Debug, PartialEq)] pub enum ContractError { - #[error("{0}")] + #[error(transparent)] Std(#[from] StdError), - #[error("{0}")] + #[error(transparent)] Threshold(#[from] ThresholdError), #[error("Group contract invalid address '{addr}'")] diff --git a/contracts/multisig/cw4-group/src/error.rs b/contracts/multisig/cw4-group/src/error.rs index 82a84fe833..8c88fb2255 100644 --- a/contracts/multisig/cw4-group/src/error.rs +++ b/contracts/multisig/cw4-group/src/error.rs @@ -5,13 +5,13 @@ use cw_controllers::{AdminError, HookError}; #[derive(Error, Debug, PartialEq)] pub enum ContractError { - #[error("{0}")] + #[error(transparent)] Std(#[from] StdError), - #[error("{0}")] + #[error(transparent)] Hook(#[from] HookError), - #[error("{0}")] + #[error(transparent)] Admin(#[from] AdminError), #[error("Unauthorized")] diff --git a/explorer-api/src/tasks.rs b/explorer-api/src/tasks.rs index 08d43fb805..bab29b798e 100644 --- a/explorer-api/src/tasks.rs +++ b/explorer-api/src/tasks.rs @@ -31,8 +31,8 @@ impl ExplorerApiTasks { { let bonds = match f(&self.state.inner.validator_client.0).await { Ok(result) => result, - Err(e) => { - error!("Unable to retrieve mixnode bonds: {:?}", e); + Err(err) => { + error!("Unable to retrieve mixnode bonds: {err}"); vec![] } }; @@ -115,8 +115,8 @@ impl ExplorerApiTasks { async fn update_validators_cache(&self) { match self.retrieve_all_validators().await { Ok(response) => self.state.inner.validators.update_cache(response).await, - Err(e) => { - error!("Failed to get validators: {:?}", e) + Err(err) => { + error!("Failed to get validators: {err}") } } } @@ -124,8 +124,8 @@ impl ExplorerApiTasks { async fn update_gateways_cache(&self) { match self.retrieve_all_gateways().await { Ok(response) => self.state.inner.gateways.update_cache(response).await, - Err(e) => { - error!("Failed to get gateways: {:?}", e) + Err(err) => { + error!("Failed to get gateways: {err}") } } } diff --git a/gateway/gateway-requests/src/registration/handshake/shared_key.rs b/gateway/gateway-requests/src/registration/handshake/shared_key.rs index 3fc014db51..b030bfb67e 100644 --- a/gateway/gateway-requests/src/registration/handshake/shared_key.rs +++ b/gateway/gateway-requests/src/registration/handshake/shared_key.rs @@ -1,4 +1,4 @@ -// Copyright 2020 - Nym Technologies SA +// Copyright 2020-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 use crate::{GatewayMacSize, GatewayRequestsError}; @@ -10,7 +10,7 @@ use crypto::hmac::{compute_keyed_hmac, recompute_keyed_hmac_and_verify_tag}; use crypto::symmetric::stream_cipher::{self, CipherKey, KeySizeUser, IV}; use nymsphinx::params::{GatewayEncryptionAlgorithm, GatewayIntegrityHmacAlgorithm}; use pemstore::traits::PemStorableKey; -use std::fmt::{self, Display, Formatter}; +use thiserror::Error; // shared key is as long as the encryption key and the MAC key combined. pub type SharedKeySize = Sum; @@ -28,37 +28,23 @@ pub struct SharedKeys { mac_key: MacKey, } -#[derive(Debug)] +#[derive(Debug, Error)] pub enum SharedKeyConversionError { - DecodeError(bs58::decode::Error), - BytesOfInvalidLengthError, - StringOfInvalidLengthError, + #[error("the string representation of the shared keys was malformed - {0}")] + DecodeError(#[from] bs58::decode::Error), + #[error( + "the received shared keys had invalid size. Got: {received}, but expected: {expected}" + )] + InvalidSharedKeysSize { received: usize, expected: usize }, } -impl Display for SharedKeyConversionError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - SharedKeyConversionError::DecodeError(err) => write!( - f, - "encountered error while decoding the byte sequence: {}", - err - ), - SharedKeyConversionError::BytesOfInvalidLengthError => { - write!(f, "provided bytes have invalid length") - } - SharedKeyConversionError::StringOfInvalidLengthError => { - write!(f, "provided string has invalid length") - } - } - } -} - -impl std::error::Error for SharedKeyConversionError {} - impl SharedKeys { pub fn try_from_bytes(bytes: &[u8]) -> Result { if bytes.len() != SharedKeySize::to_usize() { - return Err(SharedKeyConversionError::BytesOfInvalidLengthError); + return Err(SharedKeyConversionError::InvalidSharedKeysSize { + received: bytes.len(), + expected: SharedKeySize::to_usize(), + }); } let encryption_key = @@ -157,15 +143,7 @@ impl SharedKeys { pub fn try_from_base58_string>( val: S, ) -> Result { - let decoded = match bs58::decode(val.into()).into_vec() { - Ok(decoded) => decoded, - Err(err) => return Err(SharedKeyConversionError::DecodeError(err)), - }; - - if decoded.len() != SharedKeySize::to_usize() { - return Err(SharedKeyConversionError::StringOfInvalidLengthError); - } - + let decoded = bs58::decode(val.into()).into_vec()?; SharedKeys::try_from_bytes(&decoded) } diff --git a/gateway/gateway-requests/src/types.rs b/gateway/gateway-requests/src/types.rs index f73f85bca5..3d93800c73 100644 --- a/gateway/gateway-requests/src/types.rs +++ b/gateway/gateway-requests/src/types.rs @@ -99,7 +99,7 @@ impl fmt::Display for GatewayRequestsError { MalformedSphinxPacket => write!(f, "received sphinx packet was malformed"), MalformedEncryption => write!(f, "the received encrypted data was malformed"), InvalidPacketMode => write!(f, "provided packet mode is invalid"), - InvalidMixPacket(err) => write!(f, "provided mix packet was malformed - {}", err) + InvalidMixPacket(err) => write!(f, "provided mix packet was malformed - {err}") } } } diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index 02dec84802..ef2ec235e8 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -165,7 +165,7 @@ pub(crate) fn validate_bech32_address_or_exit(address: &str) { if let Err(bech32_address_validation::Bech32Error::DecodeFailed(err)) = bech32_address_validation::try_bech32_decode(address) { - let error_message = format!("Error: wallet address decoding failed: {}", err).red(); + let error_message = format!("Error: wallet address decoding failed: {err}").red(); println!("{}", error_message); println!("Exiting..."); process::exit(1); @@ -174,7 +174,7 @@ pub(crate) fn validate_bech32_address_or_exit(address: &str) { if let Err(bech32_address_validation::Bech32Error::WrongPrefix(err)) = bech32_address_validation::validate_bech32_prefix(&prefix, address) { - let error_message = format!("Error: wallet address type is wrong, {}", err).red(); + let error_message = format!("Error: wallet address type is wrong, {err}").red(); println!("{}", error_message); println!("Exiting..."); process::exit(1); diff --git a/gateway/src/commands/sign.rs b/gateway/src/commands/sign.rs index 17d6eebfd4..61e9495f09 100644 --- a/gateway/src/commands/sign.rs +++ b/gateway/src/commands/sign.rs @@ -104,7 +104,7 @@ pub fn execute(args: &Sign) { let signed_target = match SignedTarget::try_from(args.clone()) { Ok(s) => s, Err(err) => { - error!("{}", err); + error!("{err}"); return; } }; diff --git a/gateway/src/commands/upgrade.rs b/gateway/src/commands/upgrade.rs index 7d8e5481a6..de3549b4f1 100644 --- a/gateway/src/commands/upgrade.rs +++ b/gateway/src/commands/upgrade.rs @@ -57,7 +57,7 @@ fn unsupported_upgrade(current_version: &Version, config_version: &Version) -> ! fn parse_config_version(config: &Config) -> Version { let version = Version::parse(config.get_version()).unwrap_or_else(|err| { - eprintln!("failed to parse client version! - {:?}", err); + eprintln!("failed to parse client version! - {err}"); process::exit(1) }); @@ -106,7 +106,7 @@ fn minor_0_12_upgrade( let upgraded_config = config.with_custom_version(to_version.to_string().as_ref()); upgraded_config.save_to_file(None).unwrap_or_else(|err| { - eprintln!("failed to overwrite config file! - {:?}", err); + eprintln!("failed to overwrite config file! - {err}"); print_failed_upgrade(config_version, &to_version); process::exit(1); }); @@ -140,7 +140,7 @@ pub async fn execute(args: &Upgrade) { let package_version = parse_package_version(); let existing_config = Config::load_from_file(Some(&args.id)).unwrap_or_else(|err| { - eprintln!("failed to load existing config file! - {:?}", err); + eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index cb2d85b5a9..e7c2658daa 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -182,7 +182,7 @@ where /// * `mix_packet`: packet received from the client that should get forwarded into the network. fn forward_packet(&self, mix_packet: MixPacket) { if let Err(err) = self.inner.outbound_mix_sender.unbounded_send(mix_packet) { - error!("We failed to forward requested mix packet - {}. Presumably our mix forwarder has crashed. We cannot continue.", err); + error!("We failed to forward requested mix packet - {err}. Presumably our mix forwarder has crashed. We cannot continue."); process::exit(1); } } @@ -426,7 +426,7 @@ where None => break, Some(Ok(socket_msg)) => socket_msg, Some(Err(err)) => { - error!("failed to obtain message from websocket stream! stopping connection handler: {}", err); + error!("failed to obtain message from websocket stream! stopping connection handler: {err}"); break; } }; @@ -438,8 +438,7 @@ where if let Some(response) = self.handle_request(socket_msg).await { if let Err(err) = self.inner.send_websocket_message(response).await { warn!( - "Failed to send message over websocket: {}. Assuming the connection is dead.", - err + "Failed to send message over websocket: {err}. Assuming the connection is dead.", ); break; } @@ -447,8 +446,8 @@ where }, mix_messages = self.mix_receiver.next() => { let mix_messages = mix_messages.expect("sender was unexpectedly closed! this shouldn't have ever happened!"); - if let Err(e) = self.inner.push_packets_to_client(self.client.shared_keys, mix_messages).await { - warn!("failed to send the unwrapped sphinx packets back to the client - {:?}, assuming the connection is dead", e); + if let Err(err) = self.inner.push_packets_to_client(self.client.shared_keys, mix_messages).await { + warn!("failed to send the unwrapped sphinx packets back to the client - {err}, assuming the connection is dead"); break; } } diff --git a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs index 9e13fd2e69..9dd99eb23b 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs @@ -586,7 +586,7 @@ where let msg = match msg { Ok(msg) => msg, Err(err) => { - error!("failed to obtain message from websocket stream! stopping connection handler: {}", err); + error!("failed to obtain message from websocket stream! stopping connection handler: {err}"); break; } }; @@ -605,7 +605,7 @@ where if let Err(err) = self.send_websocket_message(err.into_error_message()).await { - debug!("Failed to send authentication error response - {}", err); + debug!("Failed to send authentication error response - {err}"); return None; } } @@ -614,7 +614,7 @@ where .send_websocket_message(auth_result.server_response.into()) .await { - debug!("Failed to send authentication response - {}", err); + debug!("Failed to send authentication response - {err}"); return None; } diff --git a/gateway/src/node/client_handling/websocket/listener.rs b/gateway/src/node/client_handling/websocket/listener.rs index ee76f0213a..580ec61750 100644 --- a/gateway/src/node/client_handling/websocket/listener.rs +++ b/gateway/src/node/client_handling/websocket/listener.rs @@ -55,7 +55,7 @@ impl Listener { let tcp_listener = match tokio::net::TcpListener::bind(self.address).await { Ok(listener) => listener, Err(err) => { - error!("Failed to bind the websocket to {} - {}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address, err); + error!("Failed to bind the websocket to {} - {err}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address); process::exit(1); } }; @@ -79,7 +79,7 @@ impl Listener { ); tokio::spawn(async move { handle.start_handling().await }); } - Err(e) => warn!("failed to get client: {:?}", e), + Err(err) => warn!("failed to get client: {err}"), } } } diff --git a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs index 8dd85d9ded..5db66bd7cc 100644 --- a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs +++ b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs @@ -142,7 +142,7 @@ impl ConnectionHandler { .store_processed_packet_payload(client_address, unsent_plaintext) .await { - Err(err) => error!("Failed to store client data - {}", err), + Err(err) => error!("Failed to store client data - {err}"), Ok(_) => trace!("Stored packet for {}", client_address), }, Ok(_) => trace!("Pushed received packet to {}", client_address), @@ -163,8 +163,8 @@ impl ConnectionHandler { let processed_final_hop = match self.packet_processor.process_received(framed_sphinx_packet) { - Err(e) => { - debug!("We failed to process received sphinx packet - {:?}", e); + Err(err) => { + debug!("We failed to process received sphinx packet - {err}"); return; } Ok(processed_final_hop) => processed_final_hop, diff --git a/gateway/src/node/mixnet_handling/receiver/listener.rs b/gateway/src/node/mixnet_handling/receiver/listener.rs index 1cb1f2850e..d301dc692b 100644 --- a/gateway/src/node/mixnet_handling/receiver/listener.rs +++ b/gateway/src/node/mixnet_handling/receiver/listener.rs @@ -26,7 +26,7 @@ impl Listener { let tcp_listener = match tokio::net::TcpListener::bind(self.address).await { Ok(listener) => listener, Err(err) => { - error!("Failed to bind to {} - {}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address, err); + error!("Failed to bind to {} - {err}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address); process::exit(1); } }; @@ -37,7 +37,7 @@ impl Listener { let handler = connection_handler.clone(); tokio::spawn(handler.handle_connection(socket, remote_addr)); } - Err(e) => warn!("failed to get client: {:?}", e), + Err(err) => warn!("failed to get client: {err}"), } } } diff --git a/gateway/src/node/mixnet_handling/receiver/packet_processing.rs b/gateway/src/node/mixnet_handling/receiver/packet_processing.rs index af9970cb47..a344f475f1 100644 --- a/gateway/src/node/mixnet_handling/receiver/packet_processing.rs +++ b/gateway/src/node/mixnet_handling/receiver/packet_processing.rs @@ -6,21 +6,17 @@ use mixnode_common::packet_processor::error::MixProcessingError; pub use mixnode_common::packet_processor::processor::MixProcessingResult; use mixnode_common::packet_processor::processor::{ProcessedFinalHop, SphinxPacketProcessor}; use nymsphinx::framing::packet::FramedSphinxPacket; +use thiserror::Error; -#[derive(Debug)] +#[derive(Error, Debug)] pub enum GatewayProcessingError { - PacketProcessingError(MixProcessingError), + #[error("failed to process received mix packet - {0}")] + PacketProcessingError(#[from] MixProcessingError), + + #[error("received a forward hop mix packet")] ForwardHopReceivedError, } -impl From for GatewayProcessingError { - fn from(e: MixProcessingError) -> Self { - use GatewayProcessingError::*; - - PacketProcessingError(e) - } -} - // PacketProcessor contains all data required to correctly unwrap and store sphinx packets #[derive(Clone)] pub struct PacketProcessor { diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index 1d23068db7..c04091ffdc 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -46,7 +46,7 @@ async fn initialise_storage(config: &Config) -> PersistentStorage { let path = config.get_persistent_store_path(); let retrieval_limit = config.get_message_retrieval_limit(); match PersistentStorage::init(path, retrieval_limit).await { - Err(err) => panic!("failed to initialise gateway storage - {}", err), + Err(err) => panic!("failed to initialise gateway storage - {err}"), Ok(storage) => storage, } } @@ -269,7 +269,7 @@ where let existing_gateways = match validator_client.get_cached_gateways().await { Ok(gateways) => gateways, Err(err) => { - error!("failed to grab initial network gateways - {}\n Please try to startup again in few minutes", err); + error!("failed to grab initial network gateways - {err}\n Please try to startup again in few minutes"); process::exit(1); } }; diff --git a/gateway/src/node/storage/mod.rs b/gateway/src/node/storage/mod.rs index aeed709455..cbb7c27f90 100644 --- a/gateway/src/node/storage/mod.rs +++ b/gateway/src/node/storage/mod.rs @@ -173,13 +173,13 @@ impl PersistentStorage { let connection_pool = match sqlx::SqlitePool::connect_with(opts).await { Ok(db) => db, Err(err) => { - error!("Failed to connect to SQLx database: {}", err); + error!("Failed to connect to SQLx database: {err}"); return Err(err.into()); } }; if let Err(err) = sqlx::migrate!("./migrations").run(&connection_pool).await { - error!("Failed to perform migration on the SQLx database: {}", err); + error!("Failed to perform migration on the SQLx database: {err}"); return Err(err.into()); } diff --git a/mixnode/src/commands/describe.rs b/mixnode/src/commands/describe.rs index 2bab09b8c9..07b2d420c8 100644 --- a/mixnode/src/commands/describe.rs +++ b/mixnode/src/commands/describe.rs @@ -18,7 +18,7 @@ pub(crate) fn execute(args: &Describe) { match Config::load_from_file(Some(&args.id)) { Ok(cfg) => cfg, Err(err) => { - error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {})", &args.id, err); + error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", &args.id); return; } }; diff --git a/mixnode/src/commands/mod.rs b/mixnode/src/commands/mod.rs index f716953c11..6ec353e76b 100644 --- a/mixnode/src/commands/mod.rs +++ b/mixnode/src/commands/mod.rs @@ -125,7 +125,7 @@ pub(crate) fn validate_bech32_address_or_exit(address: &str) { if let Err(bech32_address_validation::Bech32Error::DecodeFailed(err)) = bech32_address_validation::try_bech32_decode(address) { - let error_message = format!("Error: wallet address decoding failed: {}", err).red(); + let error_message = format!("Error: wallet address decoding failed: {err}").red(); println!("{}", error_message); println!("Exiting..."); process::exit(1); @@ -134,7 +134,7 @@ pub(crate) fn validate_bech32_address_or_exit(address: &str) { if let Err(bech32_address_validation::Bech32Error::WrongPrefix(err)) = bech32_address_validation::validate_bech32_prefix(&prefix, address) { - let error_message = format!("Error: wallet address type is wrong, {}", err).red(); + let error_message = format!("Error: wallet address type is wrong, {err}").red(); println!("{}", error_message); println!("Exiting..."); process::exit(1); diff --git a/mixnode/src/commands/upgrade.rs b/mixnode/src/commands/upgrade.rs index d104d47988..d11996830a 100644 --- a/mixnode/src/commands/upgrade.rs +++ b/mixnode/src/commands/upgrade.rs @@ -57,7 +57,7 @@ fn unsupported_upgrade(config_version: &Version, package_version: &Version) -> ! fn parse_config_version(config: &Config) -> Version { let version = Version::parse(config.get_version()).unwrap_or_else(|err| { - eprintln!("failed to parse client version! - {:?}", err); + eprintln!("failed to parse client version! - {err}"); process::exit(1) }); @@ -106,7 +106,7 @@ fn minor_0_12_upgrade( let upgraded_config = config.with_custom_version(to_version.to_string().as_ref()); upgraded_config.save_to_file(None).unwrap_or_else(|err| { - eprintln!("failed to overwrite config file! - {:?}", err); + eprintln!("failed to overwrite config file! - {err}"); print_failed_upgrade(config_version, &to_version); process::exit(1); }); @@ -140,7 +140,7 @@ pub(crate) fn execute(args: &Upgrade) { let package_version = parse_package_version(); let existing_config = Config::load_from_file(Some(&args.id)).unwrap_or_else(|err| { - eprintln!("failed to load existing config file! - {:?}", err); + eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/mixnode/src/node/listener/connection_handler/mod.rs b/mixnode/src/node/listener/connection_handler/mod.rs index c9baaecacf..08e8395917 100644 --- a/mixnode/src/node/listener/connection_handler/mod.rs +++ b/mixnode/src/node/listener/connection_handler/mod.rs @@ -58,7 +58,7 @@ impl ConnectionHandler { // all processing such, key caching, etc. was done. // however, if it was a forward hop, we still need to delay it match self.packet_processor.process_received(framed_sphinx_packet) { - Err(e) => debug!("We failed to process received sphinx packet - {:?}", e), + Err(err) => debug!("We failed to process received sphinx packet - {err}"), Ok(res) => match res { MixProcessingResult::ForwardHop(forward_packet, delay) => { self.delay_and_forward_packet(forward_packet, delay) diff --git a/mixnode/src/node/listener/mod.rs b/mixnode/src/node/listener/mod.rs index a1542fba79..6b8ddbee1a 100644 --- a/mixnode/src/node/listener/mod.rs +++ b/mixnode/src/node/listener/mod.rs @@ -27,7 +27,7 @@ impl Listener { let listener = match TcpListener::bind(self.address).await { Ok(listener) => listener, Err(err) => { - error!("Failed to bind to {} - {}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address, err); + error!("Failed to bind to {} - {err}. Are you sure nothing else is running on the specified port and your user has sufficient permission to bind to the requested address?", self.address); process::exit(1); } }; @@ -40,7 +40,7 @@ impl Listener { let handler = connection_handler.clone(); tokio::spawn(handler.handle_connection(socket, remote_addr, self.shutdown.clone())); } - Err(err) => warn!("Failed to accept incoming connection - {:?}", err), + Err(err) => warn!("Failed to accept incoming connection - {err}"), } }, _ = self.shutdown.recv() => { diff --git a/nym-connect/Cargo.lock b/nym-connect/Cargo.lock index 711edb17af..5a07436347 100644 --- a/nym-connect/Cargo.lock +++ b/nym-connect/Cargo.lock @@ -639,7 +639,7 @@ dependencies = [ [[package]] name = "client-core" -version = "1.1.2" +version = "1.1.3" dependencies = [ "async-trait", "client-connections", @@ -1063,6 +1063,7 @@ dependencies = [ "pemstore", "rand 0.7.3", "subtle-encoding", + "thiserror", "x25519-dalek", ] @@ -3340,7 +3341,7 @@ dependencies = [ [[package]] name = "nym-connect" -version = "1.1.2" +version = "1.1.3" dependencies = [ "bip39", "client-core", @@ -3374,7 +3375,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.2" +version = "1.1.3" dependencies = [ "clap", "client-connections", @@ -3462,6 +3463,7 @@ dependencies = [ "nymsphinx-types", "pemstore", "rand 0.7.3", + "thiserror", "topology", ] @@ -3535,6 +3537,7 @@ dependencies = [ "bytes", "nymsphinx-params", "nymsphinx-types", + "thiserror", "tokio-util", ] @@ -3544,6 +3547,7 @@ version = "0.1.0" dependencies = [ "crypto", "nymsphinx-types", + "thiserror", ] [[package]] @@ -3670,6 +3674,7 @@ name = "ordered-buffer" version = "0.1.0" dependencies = [ "log", + "thiserror", ] [[package]] diff --git a/nym-connect/src-tauri/src/state.rs b/nym-connect/src-tauri/src/state.rs index 3a98aa3747..97ddc43568 100644 --- a/nym-connect/src-tauri/src/state.rs +++ b/nym-connect/src-tauri/src/state.rs @@ -101,7 +101,7 @@ impl State { // Setup configuration by writing to file if let Err(err) = self.init_config().await { - log::error!("Failed to initialize: {}", err); + log::error!("Failed to initialize: {err}"); // Wait a little to give the user some rudimentary feedback that the click actually // registered. diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index ef54fddcaa..ea3c1b1fd9 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -134,13 +134,13 @@ pub fn start_disconnect_listener( .unwrap(); } Ok(Socks5ExitStatusMessage::Failed(err)) => { - log::info!("SOCKS5 task reported error: {}", err); + log::info!("SOCKS5 task reported error: {err}"); window .emit( "socks5-event", Payload { title: "SOCKS5 error".into(), - message: format!("SOCKS5 failed: {}", err), + message: format!("SOCKS5 failed: {err}"), }, ) .unwrap(); diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 3b99531457..200fc3a81c 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -2937,7 +2937,7 @@ dependencies = [ [[package]] name = "nym_wallet" -version = "1.1.2" +version = "1.1.3" dependencies = [ "aes-gcm", "argon2 0.3.4", diff --git a/nym-wallet/nym-wallet-recovery-cli/src/main.rs b/nym-wallet/nym-wallet-recovery-cli/src/main.rs index 7cb2c3e0d7..9798308fac 100644 --- a/nym-wallet/nym-wallet-recovery-cli/src/main.rs +++ b/nym-wallet/nym-wallet-recovery-cli/src/main.rs @@ -82,7 +82,7 @@ fn decrypt_file(file: File, passwords: &[String], parse: &ParseMode) -> Result<( match decrypt_login(login, passwords, parse) { Ok(is_success) if is_success => successes += 1, Ok(_) => println!("None of the provided passwords succeeded"), - Err(err) => println!("Failed: {}", err), + Err(err) => println!("Failed: {err}"), } } @@ -133,9 +133,9 @@ fn decrypt_login(login: &Value, passwords: &[String], parse: &ParseMode) -> Resu } return Ok(true); } - Err(err) => println!(" failed to parse\n{}", err), + Err(err) => println!(" failed to parse\n{err}"), }, - Err(err) => println!(" failed\n{}", err), + Err(err) => println!(" failed\n{err}"), } } @@ -160,10 +160,10 @@ fn get_login_entry(login: &Value) -> Result<(&str, &str, &str)> { fn base64_decode(ciphertext: &str, iv: &str, salt: &str) -> Result<(Vec, Vec, Vec)> { let ciphertext = base64::decode(ciphertext) - .map_err(|err| anyhow!("Unable to base64 decode ciphertext: {}", err))?; - let iv = base64::decode(iv).map_err(|err| anyhow!("Unable to base64 decode iv: {}", err))?; + .map_err(|err| anyhow!("Unable to base64 decode ciphertext: {err}"))?; + let iv = base64::decode(iv).map_err(|err| anyhow!("Unable to base64 decode iv: {err}"))?; let salt = - base64::decode(salt).map_err(|err| anyhow!("Unable to base64 decode salt: {}", err))?; + base64::decode(salt).map_err(|err| anyhow!("Unable to base64 decode salt: {err}"))?; Ok((ciphertext, iv, salt)) } @@ -186,7 +186,7 @@ fn decrypt_password( let mut key = Key::default(); argon2 .hash_password_into(password.as_bytes(), salt, &mut key) - .map_err(|err| anyhow!("Unable to hash password: {}", err))?; + .map_err(|err| anyhow!("Unable to hash password: {err}"))?; // Create the Cipher let cipher = Aes256Gcm::new(&key); diff --git a/nym-wallet/src-tauri/src/config/mod.rs b/nym-wallet/src-tauri/src/config/mod.rs index 9da3a1b73e..ee0bba8963 100644 --- a/nym-wallet/src-tauri/src/config/mod.rs +++ b/nym-wallet/src-tauri/src/config/mod.rs @@ -167,7 +167,7 @@ impl Config { Some(global) } Err(err) => { - log::trace!("Not loading {:#?}: {}", file, err); + log::trace!("Not loading {:#?}: {err}", file); None } } @@ -182,7 +182,7 @@ impl Config { log::trace!("Loaded from file {:#?}", file); networks.insert(network.as_key(), config); } - Err(err) => log::trace!("Not loading {:#?}: {}", file, err), + Err(err) => log::trace!("Not loading {:#?}: {err}", file), }; } diff --git a/nym-wallet/src-tauri/src/error.rs b/nym-wallet/src-tauri/src/error.rs index 46d8840947..bceff50f54 100644 --- a/nym-wallet/src-tauri/src/error.rs +++ b/nym-wallet/src-tauri/src/error.rs @@ -110,7 +110,7 @@ pub enum BackendError { WalletUnexpectedMnemonicAccount, #[error("Failed to derive address from mnemonic")] FailedToDeriveAddress, - #[error("{0}")] + #[error(transparent)] ValueParseError(#[from] ParseIntError), #[error("The provided coin has an unknown denomination - {0}")] UnknownCoinDenom(String), diff --git a/nym-wallet/src-tauri/src/operations/help/log.rs b/nym-wallet/src-tauri/src/operations/help/log.rs index c8ff873f6a..c4c2357304 100644 --- a/nym-wallet/src-tauri/src/operations/help/log.rs +++ b/nym-wallet/src-tauri/src/operations/help/log.rs @@ -5,8 +5,8 @@ use tauri::Manager; pub fn help_log_toggle_window(app_handle: tauri::AppHandle) -> Result<(), BackendError> { if let Some(current_log_window) = app_handle.windows().get("log") { log::info!("Closing log window..."); - if let Err(e) = current_log_window.close() { - log::error!("Unable to close log window: {:?}", e); + if let Err(err) = current_log_window.close() { + log::error!("Unable to close log window: {err}"); } return Ok(()); } @@ -17,13 +17,13 @@ pub fn help_log_toggle_window(app_handle: tauri::AppHandle) -> Result<(), Backen .build() { Ok(window) => { - if let Err(e) = window.set_focus() { - log::error!("Unable to focus log window: {:?}", e); + if let Err(err) = window.set_focus() { + log::error!("Unable to focus log window: {err}"); } Ok(()) } - Err(e) => { - log::error!("Unable to create log window: {:?}", e); + Err(err) => { + log::error!("Unable to create log window: {err}"); Err(BackendError::NewWindowError) } } diff --git a/service-providers/network-requester/src/allowed_hosts.rs b/service-providers/network-requester/src/allowed_hosts.rs index 3746d9a706..0350ab1f7c 100644 --- a/service-providers/network-requester/src/allowed_hosts.rs +++ b/service-providers/network-requester/src/allowed_hosts.rs @@ -39,7 +39,7 @@ impl OutboundRequestFilter { ) -> OutboundRequestFilter { let domain_list = match Self::fetch_domain_list() { Ok(list) => list, - Err(e) => panic!("Couldn't fetch domain list for request filtering, do you have an internet connection?: {:?}", e), + Err(err) => panic!("Couldn't fetch domain list for request filtering, do you have an internet connection?: {err}"), }; OutboundRequestFilter { allowed_hosts, diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index 34fb42e7c0..202ac3d1c1 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -234,7 +234,7 @@ impl ServiceProvider { continue; } ServerResponse::Error(err) => { - panic!("received error from native client! - {}", err) + panic!("received error from native client! - {err}") } _ => unimplemented!("probably should never be reached?"), }; diff --git a/service-providers/network-statistics/src/api/error.rs b/service-providers/network-statistics/src/api/error.rs index d2b190840e..bebafc2fde 100644 --- a/service-providers/network-statistics/src/api/error.rs +++ b/service-providers/network-statistics/src/api/error.rs @@ -12,10 +12,10 @@ pub type Result = std::result::Result; #[derive(Debug, thiserror::Error)] pub enum NetworkStatisticsAPIError { - #[error("{0}")] + #[error(transparent)] RocketError(#[from] Box), - #[error("{0}")] + #[error(transparent)] StorageError(#[from] NetworkStatisticsStorageError), } diff --git a/validator-api/src/coconut/deposit.rs b/validator-api/src/coconut/deposit.rs index 8dba92a705..2112b3d76a 100644 --- a/validator-api/src/coconut/deposit.rs +++ b/validator-api/src/coconut/deposit.rs @@ -164,17 +164,13 @@ mod test { let err = extract_encryption_key(&req, tx_entry.clone()) .await .unwrap_err(); - assert_eq!( - err.to_string(), + + assert!(matches!( + err, CoconutError::Ed25519ParseError( - // this is really just a useless, dummy error value needed to generate the error type - // and get its string representation - crypto::asymmetric::identity::Ed25519RecoveryError::MalformedBytes( - crypto::asymmetric::identity::SignatureError::new(), - ), + crypto::asymmetric::identity::Ed25519RecoveryError::MalformedSignatureString { .. } ) - .to_string() - ); + )); let correct_request = BlindSignRequestBody::new( &blind_sign_req, @@ -279,17 +275,13 @@ mod test { let err = extract_encryption_key(&correct_request, tx_entry.clone()) .await .unwrap_err(); - assert_eq!( - err.to_string(), + + assert!(matches!( + err, CoconutError::Ed25519ParseError( - // this is really just a useless, dummy error value needed to generate the error type - // and get its string representation - crypto::asymmetric::identity::Ed25519RecoveryError::MalformedBytes( - crypto::asymmetric::identity::SignatureError::new(), - ), + crypto::asymmetric::identity::Ed25519RecoveryError::MalformedPublicKeyString { .. } ) - .to_string(), - ); + )); tx_entry.tx_result.events.get_mut(0).unwrap().attributes = vec![ Tag { @@ -338,15 +330,13 @@ mod test { let err = extract_encryption_key(&correct_request, tx_entry.clone()) .await .unwrap_err(); - assert_eq!( - err.to_string(), + + assert!(matches!( + err, CoconutError::X25519ParseError( - // this is really just a useless, dummy error value needed to generate the error type - // and get its string representation - crypto::asymmetric::encryption::KeyRecoveryError::InvalidPublicKeyBytes, + crypto::asymmetric::encryption::KeyRecoveryError::MalformedPublicKeyString { .. } ) - .to_string(), - ); + )); let expected_encryption_key = "HxnTpWTkgigSTAysVKLE8pEiUULHdTT1BxFfzfJvQRi6"; tx_entry.tx_result.events.get_mut(0).unwrap().attributes = vec![ diff --git a/validator-api/src/coconut/error.rs b/validator-api/src/coconut/error.rs index 234d1cb96c..00c7d9c7a0 100644 --- a/validator-api/src/coconut/error.rs +++ b/validator-api/src/coconut/error.rs @@ -20,16 +20,16 @@ pub type Result = std::result::Result; #[derive(Debug, Error)] pub enum CoconutError { - #[error("{0}")] + #[error(transparent)] IOError(#[from] std::io::Error), - #[error("{0}")] + #[error(transparent)] SerdeJsonError(#[from] serde_json::Error), - #[error("Could not parse Ed25519 data")] + #[error("Could not parse Ed25519 data - {0}")] Ed25519ParseError(#[from] Ed25519RecoveryError), - #[error("Could not parse X25519 data")] + #[error("Could not parse X25519 data - {0}")] X25519ParseError(#[from] KeyRecoveryError), #[error("Could not parse tx hash in request body")] diff --git a/validator-api/src/contract_cache/mod.rs b/validator-api/src/contract_cache/mod.rs index f635933ae6..b4619214b8 100644 --- a/validator-api/src/contract_cache/mod.rs +++ b/validator-api/src/contract_cache/mod.rs @@ -192,7 +192,7 @@ impl ValidatorCacheRefresher { .await; if let Err(err) = self.update_notifier.send(CacheNotification::Updated) { - warn!("Failed to notify validator cache refresh: {}", err); + warn!("Failed to notify validator cache refresh: {err}"); } Ok(()) @@ -213,7 +213,7 @@ impl ValidatorCacheRefresher { } ret = self.refresh_cache() => { if let Err(err) = ret { - error!("Failed to refresh validator cache - {}", err); + error!("Failed to refresh validator cache - {err}"); } else { // relaxed memory ordering is fine here. worst case scenario network monitor // will just have to wait for an additional backoff to see the change. diff --git a/validator-api/src/epoch_operations/mod.rs b/validator-api/src/epoch_operations/mod.rs index 8615393779..ec7bfbfaf4 100644 --- a/validator-api/src/epoch_operations/mod.rs +++ b/validator-api/src/epoch_operations/mod.rs @@ -208,7 +208,7 @@ impl RewardedSetUpdater { let rewarded_set: Vec = match self.nymd_client.get_rewarded_set_mixnodes().await { Ok(nodes) => nodes.into_iter().map(|(id, _)| id).collect::>(), Err(err) => { - warn!("failed to obtain the current rewarded set - {}. falling back to the cached version", err); + warn!("failed to obtain the current rewarded set - {err}. falling back to the cached version"); self.validator_cache .rewarded_set() .await @@ -285,7 +285,7 @@ impl RewardedSetUpdater { // Reward all the nodes in the still current, soon to be previous rewarded set log::info!("Rewarding the current rewarded set..."); if let Err(err) = self.reward_current_rewarded_set(interval).await { - log::error!("FAILED to reward rewarded set - {}", err); + log::error!("FAILED to reward rewarded set - {err}"); // since we haven't advanced the epoch yet, we will attempt to reward those nodes again // next time we enter this function (i.e. within 2min or so) // @@ -303,7 +303,7 @@ impl RewardedSetUpdater { log::info!("Reconciling all pending epoch events..."); if let Err(err) = self.nymd_client.reconcile_epoch_events().await { - log::error!("FAILED to reconcile epoch events... - {}", err); + log::error!("FAILED to reconcile epoch events... - {err}"); return Err(err.into()); } else { log::info!("Reconciled all pending epoch events... SUCCESS"); @@ -314,7 +314,7 @@ impl RewardedSetUpdater { .update_rewarded_set_and_advance_epoch(&all_mixnodes) .await { - log::error!("FAILED to advance the current epoch... - {}", err); + log::error!("FAILED to advance the current epoch... - {err}"); return Err(err); } else { log::info!("Advanced the epoch and updated the rewarded set... SUCCESS"); @@ -434,11 +434,11 @@ impl RewardedSetUpdater { Some(interval) => interval, }; if let Err(err) = self.update_blacklist(&interval_details).await { - error!("failed to update the node blacklist - {}", err); + error!("failed to update the node blacklist - {err}"); continue; } if let Err(err) = self.perform_epoch_operations(interval_details).await { - error!("failed to perform epoch operations - {}", err); + error!("failed to perform epoch operations - {err}"); sleep(Duration::from_secs(30)).await; } } diff --git a/validator-api/src/main.rs b/validator-api/src/main.rs index 3055d57f88..e3411b1b7f 100644 --- a/validator-api/src/main.rs +++ b/validator-api/src/main.rs @@ -278,7 +278,7 @@ fn override_config(mut config: Config, matches: &ArgMatches) -> Config { if let Some(raw_validator) = matches.value_of(NYMD_VALIDATOR_ARG) { let parsed = match raw_validator.parse() { Err(err) => { - error!("Passed validator argument is invalid - {}", err); + error!("Passed validator argument is invalid - {err}"); process::exit(1) } Ok(url) => url, @@ -336,7 +336,7 @@ fn override_config(mut config: Config, matches: &ArgMatches) -> Config { if matches.is_present(WRITE_CONFIG_ARG) { info!("Saving the configuration to a file"); if let Err(err) = config.save_to_file(None) { - error!("Failed to write config to a file - {}", err); + error!("Failed to write config to a file - {err}"); process::exit(1) } } diff --git a/validator-api/src/network_monitor/monitor/processor.rs b/validator-api/src/network_monitor/monitor/processor.rs index 7b0649a49d..4a86c52612 100644 --- a/validator-api/src/network_monitor/monitor/processor.rs +++ b/validator-api/src/network_monitor/monitor/processor.rs @@ -2,45 +2,39 @@ // SPDX-License-Identifier: Apache-2.0 use crate::network_monitor::gateways_reader::GatewayMessages; -use crate::network_monitor::test_packet::TestPacket; +use crate::network_monitor::test_packet::{TestPacket, TestPacketError}; use crate::network_monitor::ROUTE_TESTING_TEST_NONCE; use crypto::asymmetric::encryption; use futures::channel::mpsc; use futures::lock::{Mutex, MutexGuard}; use futures::{SinkExt, StreamExt}; use log::warn; -use nymsphinx::receiver::MessageReceiver; -use std::fmt::{self, Display, Formatter}; +use nymsphinx::receiver::{MessageReceiver, MessageRecoveryError}; use std::mem; use std::sync::Arc; +use thiserror::Error; pub(crate) type ReceivedProcessorSender = mpsc::UnboundedSender; pub(crate) type ReceivedProcessorReceiver = mpsc::UnboundedReceiver; -#[derive(Debug)] +#[derive(Error, Debug)] enum ProcessingError { - MalformedPacketReceived, - NonTestPacketReceived, - NonMatchingNonce(u64), - ReceivedOutsideTestRun, -} + #[error( + "could not recover underlying data from the received packet since it was malformed - {0}" + )] + MalformedPacketReceived(#[from] MessageRecoveryError), -impl Display for ProcessingError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - ProcessingError::MalformedPacketReceived => write!(f, "received malformed packet"), - ProcessingError::NonTestPacketReceived => write!(f, "received a non-test packet"), - ProcessingError::NonMatchingNonce(nonce) => write!( - f, - "received packet with nonce {} which is different than the expected", - nonce - ), - ProcessingError::ReceivedOutsideTestRun => write!( - f, - "received packet while the test is currently not in progress" - ), - } - } + #[error("received a mix packet that was NOT a proper network monitor test packet")] + NonTestPacketReceived, + + #[error("the received test packet was malformed - {0}")] + MalformedTestPacket(#[from] TestPacketError), + + #[error("received packet with an unexpected nonce. Got: {received}, expected: {expected}")] + NonMatchingNonce { received: u64, expected: u64 }, + + #[error("received a mix packet while no test run is currently in progress")] + ReceivedOutsideTestRun, } // we can't use Notify due to possible edge case where both notification are consumed at once @@ -80,23 +74,20 @@ impl ReceivedProcessorInner { .recover_plaintext_from_regular_packet( self.client_encryption_keypair.private_key(), &mut message, - ) - .map_err(|_| ProcessingError::MalformedPacketReceived)?; - let fragment = self - .message_receiver - .recover_fragment(plaintext) - .map_err(|_| ProcessingError::MalformedPacketReceived)?; + )?; + let fragment = self.message_receiver.recover_fragment(plaintext)?; let (recovered, _) = self .message_receiver - .insert_new_fragment(fragment) - .map_err(|_| ProcessingError::MalformedPacketReceived)? + .insert_new_fragment(fragment)? .ok_or(ProcessingError::NonTestPacketReceived)?; // if it's a test packet it MUST BE reconstructed with single fragment - let test_packet = TestPacket::try_from_bytes(&recovered.into_inner_data()) - .map_err(|_| ProcessingError::MalformedPacketReceived)?; + let test_packet = TestPacket::try_from_bytes(&recovered.into_inner_data())?; // we know nonce is NOT none if test_packet.test_nonce() != self.test_nonce.unwrap() { - return Err(ProcessingError::NonMatchingNonce(test_packet.test_nonce())); + return Err(ProcessingError::NonMatchingNonce { + received: test_packet.test_nonce(), + expected: self.test_nonce.unwrap(), + }); } self.received_packets.push(test_packet); @@ -162,7 +153,7 @@ impl ReceivedProcessor { Some(messages) => { for message in messages { if let Err(err) = inner.on_message(message) { - warn!(target: "Monitor", "failed to process received gateway message - {}", err) + warn!(target: "Monitor", "failed to process received gateway message - {err}") } } } diff --git a/validator-api/src/network_monitor/test_packet.rs b/validator-api/src/network_monitor/test_packet.rs index 8f5e0bde5e..4806c3efe4 100644 --- a/validator-api/src/network_monitor/test_packet.rs +++ b/validator-api/src/network_monitor/test_packet.rs @@ -3,12 +3,14 @@ use crate::network_monitor::monitor::preparer::TestedNode; use crypto::asymmetric::identity; +use crypto::asymmetric::identity::Ed25519RecoveryError; use mixnet_contract_common::MixId; use std::convert::TryInto; use std::fmt::{self, Display, Formatter}; use std::hash::{Hash, Hasher}; use std::mem; use std::str::Utf8Error; +use thiserror::Error; use topology::{gateway, mix}; const MIXNODE_TYPE: u8 = 0; @@ -67,24 +69,25 @@ impl NodeType { } } -#[derive(Debug)] +#[derive(Debug, Error)] pub(crate) enum TestPacketError { - IncompletePacket, + #[error( + "the received packet was incomplete. Got {received} bytes but expected at least {min_expected}" + )] + IncompletePacket { + received: usize, + min_expected: usize, + }, + + // TODO: ideally this should contain more information but that'd require more refactoring than I'm willing to commit to now + #[error("the received packet did not contain a valid node type")] InvalidNodeType, - InvalidNodeKey, - InvalidOwner(Utf8Error), -} -impl From for TestPacketError { - fn from(_: identity::Ed25519RecoveryError) -> Self { - TestPacketError::InvalidNodeKey - } -} + #[error("the received node identity key was malformed - {0}")] + InvalidNodeKey(#[from] Ed25519RecoveryError), -impl From for TestPacketError { - fn from(err: Utf8Error) -> Self { - TestPacketError::InvalidOwner(err) - } + #[error("the received packet contained malformed owner data - {0}")] + InvalidOwner(#[from] Utf8Error), } #[derive(Eq, Clone, Debug)] @@ -184,7 +187,10 @@ impl TestPacket { let n = mem::size_of::(); if b.len() < 2 * n + 1 + identity::PUBLIC_KEY_LENGTH { - return Err(TestPacketError::IncompletePacket); + return Err(TestPacketError::IncompletePacket { + received: b.len(), + min_expected: 2 * n + 1 + identity::PUBLIC_KEY_LENGTH, + }); } // those unwraps can't fail as we've already checked for the size diff --git a/validator-api/src/node_status_api/models.rs b/validator-api/src/node_status_api/models.rs index ae9661bf23..329f9f7122 100644 --- a/validator-api/src/node_status_api/models.rs +++ b/validator-api/src/node_status_api/models.rs @@ -17,18 +17,19 @@ use schemars::gen::SchemaGenerator; use schemars::schema::{InstanceType, Schema}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use sqlx::Error; use std::convert::TryFrom; -use std::fmt::{self, Display, Formatter}; +use thiserror::Error; use time::OffsetDateTime; use validator_api_requests::models::{ GatewayStatusReportResponse, GatewayUptimeHistoryResponse, HistoricalUptimeResponse, MixnodeStatusReportResponse, MixnodeUptimeHistoryResponse, RequestError, }; -// todo: put into some error enum -#[derive(Debug)] -pub struct InvalidUptime; +#[derive(Error, Debug)] +#[error("Received uptime value was within 0-100 range (got {received})")] +pub struct InvalidUptime { + received: isize, +} // value in range 0-100 #[derive(Clone, Copy, Serialize, Deserialize, Debug, Default, JsonSchema)] @@ -56,7 +57,9 @@ impl Uptime { let uptime = ((numerator as f32 / denominator as f32) * 100.0).round() as u8; if uptime > 100 { - Err(InvalidUptime) + Err(InvalidUptime { + received: uptime as isize, + }) } else { Ok(Uptime(uptime)) } @@ -70,7 +73,9 @@ impl Uptime { let uptime = (running_sum / count as f32).round() as u8; if uptime > 100 { - Err(InvalidUptime) + Err(InvalidUptime { + received: uptime as isize, + }) } else { Ok(Uptime(uptime)) } @@ -92,7 +97,9 @@ impl TryFrom for Uptime { fn try_from(value: u8) -> Result { if value > 100 { - Err(InvalidUptime) + Err(InvalidUptime { + received: value as isize, + }) } else { Ok(Uptime(value)) } @@ -104,7 +111,9 @@ impl TryFrom for Uptime { fn try_from(value: i64) -> Result { if !(0..=100).contains(&value) { - Err(InvalidUptime) + Err(InvalidUptime { + received: value as isize, + }) } else { Ok(Uptime(value as u8)) } @@ -365,47 +374,27 @@ impl OpenApiResponderInner for ErrorResponse { #[derive(Debug, thiserror::Error)] pub enum ValidatorApiStorageError { - MixnodeReportNotFound(MixId), - GatewayReportNotFound(String), - MixnodeUptimeHistoryNotFound(MixId), - GatewayUptimeHistoryNotFound(String), + #[error("could not find status report associated with mixnode {mix_id}")] + MixnodeReportNotFound { mix_id: MixId }, + + #[error("Could not find status report associated with gateway {identity}")] + GatewayReportNotFound { identity: IdentityKey }, + + #[error("could not find uptime history associated with mixnode {mix_id}")] + MixnodeUptimeHistoryNotFound { mix_id: MixId }, + + #[error("could not find uptime history associated with gateway {identity}")] + GatewayUptimeHistoryNotFound { identity: IdentityKey }, // I don't think we want to expose errors to the user about what really happened - InternalDatabaseError(String), -} + #[error("experienced internal database error")] + InternalDatabaseError(#[from] sqlx::Error), -impl From for ValidatorApiStorageError { - fn from(err: Error) -> Self { - ValidatorApiStorageError::InternalDatabaseError(err.to_string()) - } -} + // the same is true here (also note that the message is subtly different so we would be able to distinguish them) + #[error("experienced internal storage error")] + DatabaseInconsistency { reason: String }, -impl Display for ValidatorApiStorageError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - ValidatorApiStorageError::MixnodeReportNotFound(mix_id) => write!( - f, - "Could not find status report associated with mixnode {}", - mix_id - ), - ValidatorApiStorageError::GatewayReportNotFound(identity) => write!( - f, - "Could not find status report associated with gateway {}", - identity - ), - ValidatorApiStorageError::MixnodeUptimeHistoryNotFound(mix_id) => write!( - f, - "Could not find uptime history associated with mixnode {}", - mix_id - ), - ValidatorApiStorageError::GatewayUptimeHistoryNotFound(identity) => write!( - f, - "Could not find uptime history associated with gateway {}", - identity - ), - ValidatorApiStorageError::InternalDatabaseError(err) => { - write!(f, "The internal database has experienced an issue: {err}") - } - } - } + // this one would never be returned to users since it's only possible on startup + #[error("failed to perform startup SQL migration - {0}")] + StartupMigrationFailure(#[from] sqlx::migrate::MigrateError), } diff --git a/validator-api/src/storage/mod.rs b/validator-api/src/storage/mod.rs index 21a5b2ca23..04186b7b57 100644 --- a/validator-api/src/storage/mod.rs +++ b/validator-api/src/storage/mod.rs @@ -41,19 +41,15 @@ impl ValidatorApiStorage { let connection_pool = match sqlx::SqlitePool::connect_with(opts).await { Ok(db) => db, - Err(e) => { - error!("Failed to connect to SQLx database: {}", e); - return Err(ValidatorApiStorageError::InternalDatabaseError( - e.to_string(), - )); + Err(err) => { + error!("Failed to connect to SQLx database: {err}"); + return Err(err.into()); } }; - if let Err(e) = sqlx::migrate!("./migrations").run(&connection_pool).await { - error!("Failed to initialize SQLx database: {}", e); - return Err(ValidatorApiStorageError::InternalDatabaseError( - e.to_string(), - )); + if let Err(err) = sqlx::migrate!("./migrations").run(&connection_pool).await { + error!("Failed to initialize SQLx database: {err}"); + return Err(err.into()); } info!("Database migration finished!"); @@ -175,7 +171,7 @@ impl ValidatorApiStorage { // if we have no statuses, the node doesn't exist (or monitor is down), but either way, we can't make a report if statuses.is_empty() { - return Err(ValidatorApiStorageError::MixnodeReportNotFound(mix_id)); + return Err(ValidatorApiStorageError::MixnodeReportNotFound { mix_id }); } // determine the number of runs the mixnode should have been online for @@ -219,9 +215,9 @@ impl ValidatorApiStorage { // if we have no statuses, the node doesn't exist (or monitor is down), but either way, we can't make a report if statuses.is_empty() { - return Err(ValidatorApiStorageError::GatewayReportNotFound( - identity.to_owned(), - )); + return Err(ValidatorApiStorageError::GatewayReportNotFound { + identity: identity.to_owned(), + }); } // determine the number of runs the gateway should have been online for @@ -253,9 +249,7 @@ impl ValidatorApiStorage { let history = self.manager.get_mixnode_historical_uptimes(mix_id).await?; if history.is_empty() { - return Err(ValidatorApiStorageError::MixnodeUptimeHistoryNotFound( - mix_id, - )); + return Err(ValidatorApiStorageError::MixnodeUptimeHistoryNotFound { mix_id }); } let mixnode_owner = @@ -286,9 +280,9 @@ impl ValidatorApiStorage { .await?; if history.is_empty() { - return Err(ValidatorApiStorageError::GatewayUptimeHistoryNotFound( - identity.to_owned(), - )); + return Err(ValidatorApiStorageError::GatewayUptimeHistoryNotFound { + identity: identity.to_owned(), + }); } let gateway_owner = @@ -447,30 +441,36 @@ impl ValidatorApiStorage { let layer1_mix_db_id = self .manager .get_mixnode_database_id(test_route.layer_one_mix().mix_id) - .await - .map_err(|_| ValidatorApiStorageError::InternalDatabaseError("".to_string()))? - .ok_or_else(|| ValidatorApiStorageError::InternalDatabaseError("".to_string()))?; + .await? + .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + reason: format!("could not get db id for layer1 mixnode from network monitor run {monitor_run_db_id}"), + })?; let layer2_mix_db_id = self .manager .get_mixnode_database_id(test_route.layer_two_mix().mix_id) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))? - .ok_or_else(|| ValidatorApiStorageError::InternalDatabaseError("".to_string()))?; + .await? + .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + reason: format!("could not get db id for layer2 mixnode from network monitor run {monitor_run_db_id}"), + })?; let layer3_mix_db_id = self .manager .get_mixnode_database_id(test_route.layer_three_mix().mix_id) - .await - .map_err(|_| ValidatorApiStorageError::InternalDatabaseError("".to_string()))? - .ok_or_else(|| ValidatorApiStorageError::InternalDatabaseError("".to_string()))?; + .await? + .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + reason: format!("could not get db id for layer3 mixnode from network monitor run {monitor_run_db_id}"), + })?; let gateway_db_id = self .manager .get_gateway_id(&test_route.gateway().identity_key.to_base58_string()) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))? - .ok_or_else(|| ValidatorApiStorageError::InternalDatabaseError("".to_string()))?; + .await? + .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + reason: format!( + "could not get db id for gateway from network monitor run {monitor_run_db_id}" + ), + })?; self.manager .submit_testing_route_used(TestingRoute { @@ -480,8 +480,7 @@ impl ValidatorApiStorage { layer3_mix_db_id, monitor_run_db_id, }) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + .await?; Ok(()) } @@ -498,11 +497,7 @@ impl ValidatorApiStorage { mix_id: MixId, since: Option, ) -> Result { - let db_id = self - .manager - .get_mixnode_database_id(mix_id) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + let db_id = self.manager.get_mixnode_database_id(mix_id).await?; if let Some(node_id) = db_id { let since = since @@ -511,7 +506,7 @@ impl ValidatorApiStorage { self.manager .get_mixnode_testing_route_presence_count_since(node_id, since) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } else { Ok(0) } @@ -530,11 +525,7 @@ impl ValidatorApiStorage { identity: &str, since: Option, ) -> Result { - let node_id = self - .manager - .get_gateway_id(identity) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + let node_id = self.manager.get_gateway_id(identity).await?; if let Some(node_id) = node_id { let since = since @@ -543,7 +534,7 @@ impl ValidatorApiStorage { self.manager .get_gateway_testing_route_presence_count_since(node_id, since) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } else { Ok(0) } @@ -567,21 +558,15 @@ impl ValidatorApiStorage { let now = OffsetDateTime::now_utc().unix_timestamp(); - let monitor_run_id = self - .manager - .insert_monitor_run(now) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + let monitor_run_id = self.manager.insert_monitor_run(now).await?; self.manager .submit_mixnode_statuses(now, mixnode_results) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + .await?; self.manager .submit_gateway_statuses(now, gateway_results) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + .await?; for test_route in test_routes { self.insert_test_route(monitor_run_id, test_route).await?; @@ -605,9 +590,9 @@ impl ValidatorApiStorage { if run_count < 0 { // I don't think it's ever possible for SQL to return a negative value from COUNT? - return Err(ValidatorApiStorageError::InternalDatabaseError( - "Negative run count".to_string(), - )); + return Err(ValidatorApiStorageError::DatabaseInconsistency { + reason: "Negative run count".to_string(), + }); } Ok(run_count as usize) } @@ -629,12 +614,7 @@ impl ValidatorApiStorage { for report in mixnode_reports { // if this ever fails, we have a super weird error because we just constructed report for that node // and we never delete node data! - let node_id = match self - .manager - .get_mixnode_database_id(report.mix_id) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))? - { + let node_id = match self.manager.get_mixnode_database_id(report.mix_id).await? { Some(node_id) => node_id, None => { error!( @@ -647,19 +627,13 @@ impl ValidatorApiStorage { self.manager .insert_mixnode_historical_uptime(node_id, today_iso_8601, report.last_day.u8()) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + .await?; } for report in gateway_reports { // if this ever fails, we have a super weird error because we just constructed report for that node // and we never delete node data! - let node_id = match self - .manager - .get_gateway_id(&report.identity) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))? - { + let node_id = match self.manager.get_gateway_id(&report.identity).await? { Some(node_id) => node_id, None => { error!( @@ -672,8 +646,7 @@ impl ValidatorApiStorage { self.manager .insert_gateway_historical_uptime(node_id, today_iso_8601, report.last_day.u8()) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + .await?; } Ok(()) @@ -686,7 +659,7 @@ impl ValidatorApiStorage { self.manager .check_for_historical_uptime_existence(date_iso_8601) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } /// Removes all ipv4 and ipv6 statuses for all mixnodes and gateways that are older than the @@ -699,14 +672,11 @@ impl ValidatorApiStorage { &self, until: i64, ) -> Result<(), ValidatorApiStorageError> { - self.manager - .purge_old_mixnode_statuses(until) - .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string()))?; + self.manager.purge_old_mixnode_statuses(until).await?; self.manager .purge_old_gateway_statuses(until) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } pub(crate) async fn insert_rewarding_report( @@ -716,7 +686,7 @@ impl ValidatorApiStorage { self.manager .insert_rewarding_report(report) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } pub(crate) async fn get_rewarding_report( @@ -726,7 +696,7 @@ impl ValidatorApiStorage { self.manager .get_rewarding_report(absolute_epoch_id) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } #[cfg(feature = "coconut")] @@ -737,7 +707,7 @@ impl ValidatorApiStorage { self.manager .get_blinded_signature_response(tx_hash) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } #[cfg(feature = "coconut")] @@ -749,6 +719,6 @@ impl ValidatorApiStorage { self.manager .insert_blinded_signature_response(tx_hash, blinded_signature_response) .await - .map_err(|e| ValidatorApiStorageError::InternalDatabaseError(e.to_string())) + .map_err(|err| err.into()) } } From 3ebb24b2c822a586e6e7f2493e494379c7a3248e Mon Sep 17 00:00:00 2001 From: Fouad Date: Wed, 14 Dec 2022 12:12:34 +0000 Subject: [PATCH 013/591] get version number from tauri and display (#2684) * get version number from tauri and display * update internal version numbers --- nym-connect/Cargo.lock | 2 +- nym-connect/src-tauri/Cargo.toml | 2 +- nym-connect/src-tauri/tauri.conf.json | 2 +- nym-connect/src/components/AppVersion.tsx | 13 +++++++++++++ nym-connect/src/components/AppWindowFrame.tsx | 6 +++++- nym-connect/src/context/main.tsx | 11 +++++++++++ nym-connect/src/context/mocks/main.tsx | 1 + 7 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 nym-connect/src/components/AppVersion.tsx diff --git a/nym-connect/Cargo.lock b/nym-connect/Cargo.lock index 5a07436347..3ba62ad4f0 100644 --- a/nym-connect/Cargo.lock +++ b/nym-connect/Cargo.lock @@ -3341,7 +3341,7 @@ dependencies = [ [[package]] name = "nym-connect" -version = "1.1.3" +version = "1.1.4" dependencies = [ "bip39", "client-core", diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/src-tauri/Cargo.toml index 46c2278178..66cab35d7a 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.3" +version = "1.1.4" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/src-tauri/tauri.conf.json b/nym-connect/src-tauri/tauri.conf.json index 8c0597d17e..3d435986ed 100644 --- a/nym-connect/src-tauri/tauri.conf.json +++ b/nym-connect/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.3" + "version": "1.1.4" }, "build": { "distDir": "../dist", diff --git a/nym-connect/src/components/AppVersion.tsx b/nym-connect/src/components/AppVersion.tsx new file mode 100644 index 0000000000..06c63079d6 --- /dev/null +++ b/nym-connect/src/components/AppVersion.tsx @@ -0,0 +1,13 @@ +import { Typography } from '@mui/material'; +import React from 'react'; +import { useClientContext } from 'src/context/main'; + +export const AppVersion = () => { + const { appVersion } = useClientContext(); + + return ( + + Version {appVersion} + + ); +}; diff --git a/nym-connect/src/components/AppWindowFrame.tsx b/nym-connect/src/components/AppWindowFrame.tsx index 5fc3d60ff6..9420a57f07 100644 --- a/nym-connect/src/components/AppWindowFrame.tsx +++ b/nym-connect/src/components/AppWindowFrame.tsx @@ -1,18 +1,22 @@ import React from 'react'; import { Box } from '@mui/material'; import { CustomTitleBar } from './CustomTitleBar'; +import { AppVersion } from './AppVersion'; export const AppWindowFrame: React.FC = ({ children }) => ( {children} + ); diff --git a/nym-connect/src/context/main.tsx b/nym-connect/src/context/main.tsx index 5d2b049bf9..d33af4e0b6 100644 --- a/nym-connect/src/context/main.tsx +++ b/nym-connect/src/context/main.tsx @@ -9,6 +9,7 @@ import { ConnectionStatsItem } from '../components/ConnectionStats'; import { ServiceProvider, Services } from '../types/directory'; import { Error } from 'src/types/error'; import { TauriEvent } from 'src/types/event'; +import { getVersion } from '@tauri-apps/api/app'; const TAURI_EVENT_STATUS_CHANGED = 'app:connection-status-changed'; @@ -16,6 +17,7 @@ type ModeType = 'light' | 'dark'; export type TClientContext = { mode: ModeType; + appVersion?: string; connectionStatus: ConnectionStatusKind; connectionStats?: ConnectionStatsItem[]; connectedSince?: DateTime; @@ -47,11 +49,13 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode const [serviceProvider, setRawServiceProvider] = React.useState(); const [showHelp, setShowHelp] = useState(false); const [error, setError] = useState(); + const [appVersion, setAppVersion] = useState(); useEffect(() => { invoke('get_services').then((result) => { setServices(result as Services); }); + getAppVersion(); }, []); useEffect(() => { @@ -122,6 +126,11 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode } }; + const getAppVersion = async () => { + const version = await getVersion(); + setAppVersion(version); + }; + const handleShowHelp = () => setShowHelp((show) => !show); const clearError = () => setError(undefined); @@ -149,6 +158,7 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode const contextValue = useMemo( () => ({ mode, + appVersion, setMode, error, clearError, @@ -168,6 +178,7 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode }), [ mode, + appVersion, error, connectedSince, showHelp, diff --git a/nym-connect/src/context/mocks/main.tsx b/nym-connect/src/context/mocks/main.tsx index e2974413eb..496d9c4c2d 100644 --- a/nym-connect/src/context/mocks/main.tsx +++ b/nym-connect/src/context/mocks/main.tsx @@ -4,6 +4,7 @@ import { ClientContext, TClientContext } from '../main'; const mockValues: TClientContext = { mode: 'dark', + appVersion: '1.1.1', connectionStatus: ConnectionStatusKind.disconnected, services: [], showHelp: false, From bb557985c062a771699b6b2487930e9563e6373d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Wed, 14 Dec 2022 14:47:59 +0200 Subject: [PATCH 014/591] DKG resharing unit test (#2668) --- common/crypto/dkg/src/dealing.rs | 5 - common/crypto/dkg/tests/integration.rs | 122 +++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 5 deletions(-) diff --git a/common/crypto/dkg/src/dealing.rs b/common/crypto/dkg/src/dealing.rs index b3633ec82d..d92a9ba6b4 100644 --- a/common/crypto/dkg/src/dealing.rs +++ b/common/crypto/dkg/src/dealing.rs @@ -326,11 +326,6 @@ pub fn try_recover_verification_keys( return Err(DkgError::MismatchedDealings); } - // currently we expect every dealer to also be a receiver. This restriction might be relaxed in the future - if dealings.len() != receivers.len() { - return Err(DkgError::MismatchedDealings); - } - let indices = receivers.keys().collect::>(); // Compute A0, ..., A_{t-1} diff --git a/common/crypto/dkg/tests/integration.rs b/common/crypto/dkg/tests/integration.rs index 2d25c31d40..4ac55df1c7 100644 --- a/common/crypto/dkg/tests/integration.rs +++ b/common/crypto/dkg/tests/integration.rs @@ -254,3 +254,125 @@ fn full_threshold_secret_resharing() { assert_ne!(derived_secrets, reshared_secrets); assert_ne!(recovered_partials, reshared_partials); } + +#[test] +#[ignore] // expensive test +fn full_threshold_secret_resharing_left_party() { + let dummy_seed = [42u8; 32]; + let mut rng = rand_chacha::ChaCha20Rng::from_seed(dummy_seed); + let params = setup(); + + // the simplest possible case + let threshold = 2; + + // the indices are going to get assigned externally, so for test sake, use non-consecutive ones + let mut node_indices = vec![15u64, 248, 33521]; + + let mut receivers = BTreeMap::new(); + let mut full_keys = Vec::new(); + for index in &node_indices { + let (dk, pk) = keygen(¶ms, &mut rng); + receivers.insert(*index, *pk.public_key()); + full_keys.push((dk, pk)) + } + + let first_dealings = node_indices + .iter() + .map(|&dealer_index| { + Dealing::create(&mut rng, ¶ms, dealer_index, threshold, &receivers, None).0 + }) + .collect::>(); + + // recover verification keys + let RecoveredVerificationKeys { + recovered_master: public_original_master, + recovered_partials, + } = try_recover_verification_keys(&first_dealings, threshold, &receivers).unwrap(); + + let mut derived_secrets = Vec::new(); + for (i, (ref mut dk, _)) in full_keys.iter_mut().enumerate() { + let shares = first_dealings + .iter() + .map(|dealing| decrypt_share(dk, i, &dealing.ciphertexts, None).unwrap()) + .collect(); + + let recovered_secret = + combine_shares(shares, &receivers.keys().copied().collect::>()).unwrap(); + + derived_secrets.push(recovered_secret) + } + + let original_master = perform_lagrangian_interpolation_at_origin(&[ + (Scalar::from(node_indices[0]), derived_secrets[0]), + (Scalar::from(node_indices[1]), derived_secrets[1]), + ]) + .unwrap(); + + // one party leaves the process + let left_party_index = node_indices.pop().unwrap(); + receivers.remove(&left_party_index); + full_keys.pop(); + // and another one joins, but we're still over the threshold value of initial parties + let join_party_index = 100000; + let (dk, pk) = keygen(¶ms, &mut rng); + receivers.insert(join_party_index, *pk.public_key()); + full_keys.push((dk, pk)); + + // only initial parties attempt to create resharing dealings! + let resharing_dealings = node_indices + .iter() + .zip(derived_secrets.iter().take(2)) + .map(|(&dealer_index, prior_secret)| { + Dealing::create( + &mut rng, + ¶ms, + dealer_index, + threshold, + &receivers, + Some(*prior_secret), + ) + .0 + }) + .collect::>(); + + for (reshared_dealing, prior_vk) in resharing_dealings + .iter() + .zip(recovered_partials.iter().take(2)) + { + reshared_dealing + .verify(¶ms, threshold, &receivers, Some(*prior_vk)) + .unwrap(); + } + + // recover verification keys + let RecoveredVerificationKeys { + recovered_master: public_reshared_master, + recovered_partials: reshared_partials, + } = try_recover_verification_keys(&resharing_dealings, threshold, &receivers).unwrap(); + + let mut reshared_secrets = Vec::new(); + for (i, (ref mut dk, _)) in full_keys.iter_mut().enumerate() { + let shares = resharing_dealings + .iter() + .map(|dealing| decrypt_share(dk, i, &dealing.ciphertexts, None).unwrap()) + .collect(); + + let recovered_secret = combine_shares(shares, &node_indices).unwrap(); + + reshared_secrets.push(recovered_secret) + } + + let reshared_master = perform_lagrangian_interpolation_at_origin(&[ + (Scalar::from(node_indices[0]), reshared_secrets[0]), + (Scalar::from(join_party_index), reshared_secrets[2]), + ]) + .unwrap(); + + // the master secret and public values didn't change + assert_eq!(original_master, reshared_master); + assert_eq!(public_original_master, public_reshared_master); + + // but partials did + assert_ne!(derived_secrets, reshared_secrets); + assert_ne!(recovered_partials, reshared_partials); +} From 4ece8b7e8f29049b4aecf028a831b85d54f81a1d Mon Sep 17 00:00:00 2001 From: Fouad Date: Wed, 14 Dec 2022 13:04:54 +0000 Subject: [PATCH 015/591] Feature/nym connect experimental software text (#2692) * use experimental text --- nym-connect/src-tauri/tauri.conf.json | 2 +- nym-connect/src/components/AppVersion.tsx | 6 +++++- nym-connect/src/components/AppWindowFrame.tsx | 3 +-- nym-connect/src/components/ConnectionButton.tsx | 6 +++--- nym-connect/src/layouts/DefaultLayout.tsx | 11 ++++++++--- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/nym-connect/src-tauri/tauri.conf.json b/nym-connect/src-tauri/tauri.conf.json index 3d435986ed..65b9393ac9 100644 --- a/nym-connect/src-tauri/tauri.conf.json +++ b/nym-connect/src-tauri/tauri.conf.json @@ -65,7 +65,7 @@ { "title": "NymConnect", "width": 240, - "height": 540, + "height": 575, "resizable": false, "decorations": false, "transparent": true diff --git a/nym-connect/src/components/AppVersion.tsx b/nym-connect/src/components/AppVersion.tsx index 06c63079d6..f351ebc410 100644 --- a/nym-connect/src/components/AppVersion.tsx +++ b/nym-connect/src/components/AppVersion.tsx @@ -6,7 +6,11 @@ export const AppVersion = () => { const { appVersion } = useClientContext(); return ( - + Version {appVersion} ); diff --git a/nym-connect/src/components/AppWindowFrame.tsx b/nym-connect/src/components/AppWindowFrame.tsx index 9420a57f07..abd54ec49e 100644 --- a/nym-connect/src/components/AppWindowFrame.tsx +++ b/nym-connect/src/components/AppWindowFrame.tsx @@ -9,10 +9,9 @@ export const AppWindowFrame: React.FC = ({ children }) => ( display: 'grid', borderRadius: '12px', // screen height is 540px - These should add up to that - gridTemplateRows: '40px 470px 30px', + gridTemplateRows: '40px 1fr 30px', bgcolor: 'nym.background.dark', height: '100vh', - gridtemplateAreas: '"." "." "."', }} > diff --git a/nym-connect/src/components/ConnectionButton.tsx b/nym-connect/src/components/ConnectionButton.tsx index 42903a80ea..6d8a592681 100644 --- a/nym-connect/src/components/ConnectionButton.tsx +++ b/nym-connect/src/components/ConnectionButton.tsx @@ -76,9 +76,9 @@ export const ConnectionButton: React.FC<{ return ( diff --git a/nym-connect/src/layouts/DefaultLayout.tsx b/nym-connect/src/layouts/DefaultLayout.tsx index ed42aad5fe..046f69d9ec 100644 --- a/nym-connect/src/layouts/DefaultLayout.tsx +++ b/nym-connect/src/layouts/DefaultLayout.tsx @@ -31,9 +31,14 @@ export const DefaultLayout: React.FC<{ {error && } - - Connect to the Nym
mixnet for privacy. -
+ + + Connect to the Nym mixnet + + + This is experimental software. Do not rely on it for strong anonymity (yet). + + Date: Wed, 14 Dec 2022 15:05:01 +0000 Subject: [PATCH 016/591] Renaming validator-api to nym-api (#1863) * Renaming validator-api to nym-api * nym-api: simplified crate name * Added nym-api rename to changelog * Changed some output messages * Renamed validator-api-requests to nym-api requests * Removing more references to validator-api-requests * Additional lockfile name changes after full build * Removing mistakenly added merge files * ibid * ibid * Getting rid of ref to validator_api deep inside validator-client * Fixing file storage paths * Renaming struct function names referring to validator_api * Simplifying struct init * Fixed up all other instances of nym_api. * Renaming validatorApi to nymApi in TypeScript client for consistency v * Found a few more Rust instances * Changed examples in TypeScript SDK * Found one more instance of the use of validator instead of nym apis * Aliasing config key name for deserialization to preserve compatibility with old configs --- Cargo.lock | 40 +++--- Cargo.toml | 6 +- .../client-core/src/client/base_client/mod.rs | 14 +- .../src/client/topology_control.rs | 32 ++--- clients/client-core/src/config/mod.rs | 13 +- clients/client-core/src/error.rs | 4 +- clients/client-core/src/init/helpers.rs | 8 +- clients/client-core/src/init/mod.rs | 9 +- clients/native/src/client/config/template.rs | 4 +- clients/native/src/client/mod.rs | 2 +- clients/native/src/commands/mod.rs | 4 +- clients/socks5/src/client/config/template.rs | 4 +- clients/socks5/src/client/mod.rs | 2 +- clients/socks5/src/commands/mod.rs | 4 +- clients/socks5/src/commands/run.rs | 6 +- clients/validator/src/index.ts | 8 +- ...ator-api-querier.ts => nym-api-querier.ts} | 36 ++--- clients/validator/src/query-client.ts | 22 +-- clients/validator/src/signing-client.ts | 20 +-- clients/validator/tests/query/balance.test.ts | 2 +- clients/webassembly/src/client/config.rs | 4 +- clients/webassembly/src/client/mod.rs | 2 +- .../client-libs/validator-client/Cargo.toml | 2 +- .../validator-client/src/client.rs | 76 +++++------ .../client-libs/validator-client/src/error.rs | 6 +- .../client-libs/validator-client/src/lib.rs | 4 +- .../src/{validator_api => nym_api}/error.rs | 6 +- .../src/{validator_api => nym_api}/mod.rs | 126 +++++++++--------- .../src/{validator_api => nym_api}/routes.rs | 4 +- common/commands/src/context/mod.rs | 20 +-- .../delegators/query_for_delegations.rs | 13 +- .../mixnet/query/query_all_gateways.rs | 6 +- .../mixnet/query/query_all_mixnodes.rs | 6 +- common/credentials/Cargo.toml | 2 +- common/credentials/src/coconut/params.rs | 4 +- common/credentials/src/coconut/utils.rs | 14 +- common/mixnode-common/src/verloc/mod.rs | 29 ++-- common/network-defaults/src/lib.rs | 8 +- common/types/src/error.rs | 14 +- contracts/mixnet/src/rewards/transactions.rs | 2 +- explorer-api/src/client.rs | 2 +- explorer-api/src/main.rs | 4 +- explorer-api/src/mix_node/econ_stats.rs | 13 +- explorer/.env.prod | 2 +- explorer/.env.qa | 2 +- explorer/src/api/constants.ts | 10 +- gateway/Cargo.toml | 4 +- gateway/src/commands/init.rs | 8 +- gateway/src/commands/mod.rs | 8 +- gateway/src/commands/run.rs | 6 +- gateway/src/config/mod.rs | 14 +- gateway/src/config/template.rs | 4 +- .../connection_handler/authenticated.rs | 4 +- .../websocket/connection_handler/coconut.rs | 12 +- gateway/src/node/mod.rs | 6 +- mixnode/src/commands/mod.rs | 4 +- mixnode/src/config/mod.rs | 14 +- mixnode/src/config/template.rs | 4 +- mixnode/src/node/mod.rs | 8 +- {validator-api => nym-api}/Cargo.toml | 4 +- {validator-api => nym-api}/README.md | 0 {validator-api => nym-api}/Rocket.toml | 0 {validator-api => nym-api}/build.rs | 2 +- .../20210722120000_create_initial_tables.sql | 0 .../20210819120000_monitor_runs.sql | 0 .../20210824120000_rewarding_data.sql | 0 .../20211018120000_core_nodes_testing.sql | 0 .../20211101110000_no_gateway_rewarding.sql | 0 ...20220121120000_epoch_interval_renaming.sql | 0 ...23120000_drop_foreign_keys_constraints.sql | 0 .../20220325120000_signed_deposits.sql | 0 .../20220410222400_add_timestamp_indexes.sql | 0 .../20220804120000_mixnet_contract_v2.sql | 0 .../nym-api-requests}/Cargo.toml | 2 +- .../nym-api-requests}/src/coconut.rs | 0 .../nym-api-requests}/src/lib.rs | 0 .../nym-api-requests}/src/models.rs | 0 .../src/coconut/client.rs | 0 .../src/coconut/comm.rs | 0 .../src/coconut/deposit.rs | 2 +- .../src/coconut/dkg/client.rs | 0 .../src/coconut/dkg/complaints.rs | 0 .../src/coconut/dkg/controller.rs | 0 .../src/coconut/dkg/dealing.rs | 0 .../src/coconut/dkg/mod.rs | 0 .../src/coconut/dkg/public_key.rs | 0 .../src/coconut/dkg/state.rs | 0 .../src/coconut/dkg/verification_key.rs | 0 .../src/coconut/error.rs | 4 +- .../src/coconut/keypair.rs | 0 {validator-api => nym-api}/src/coconut/mod.rs | 29 ++-- .../src/coconut/tests.rs | 34 ++--- {validator-api => nym-api}/src/config/mod.rs | 10 +- .../src/config/template.rs | 4 +- .../src/contract_cache/mod.rs | 2 +- .../src/contract_cache/routes.rs | 2 +- .../src/epoch_operations/error.rs | 8 +- .../src/epoch_operations/helpers.rs | 0 .../src/epoch_operations/mod.rs | 6 +- {validator-api => nym-api}/src/main.rs | 40 +++--- .../src/network_monitor/chunker.rs | 0 .../src/network_monitor/gateways_reader.rs | 0 .../src/network_monitor/mod.rs | 6 +- .../monitor/gateway_clients_cache.rs | 0 .../monitor/gateways_pinger.rs | 0 .../src/network_monitor/monitor/mod.rs | 6 +- .../src/network_monitor/monitor/preparer.rs | 0 .../src/network_monitor/monitor/processor.rs | 0 .../src/network_monitor/monitor/receiver.rs | 0 .../src/network_monitor/monitor/sender.rs | 0 .../monitor/summary_producer.rs | 0 .../src/network_monitor/test_packet.rs | 0 .../src/network_monitor/test_route/mod.rs | 0 .../src/node_status_api/cache.rs | 10 +- .../cache/inclusion_probabilities.rs | 2 +- .../src/node_status_api/helpers.rs | 18 +-- .../src/node_status_api/local_guard.rs | 0 .../src/node_status_api/mod.rs | 0 .../src/node_status_api/models.rs | 10 +- .../src/node_status_api/reward_estimate.rs | 0 .../src/node_status_api/routes.rs | 26 ++-- .../src/node_status_api/uptime_updater.rs | 13 +- .../src/node_status_api/utils.rs | 0 {validator-api => nym-api}/src/nymd_client.rs | 6 +- .../src/storage/manager.rs | 0 {validator-api => nym-api}/src/storage/mod.rs | 89 ++++++------- .../src/storage/models.rs | 0 {validator-api => nym-api}/src/swagger.rs | 0 {validator-api => nym-api}/tests/README.md | 0 .../status/status-mixnode.test.ts | 0 .../tests/jest.config.js | 0 {validator-api => nym-api}/tests/package.json | 0 .../tests/src/config/config.yaml | 0 .../tests/src/config/configHandler.ts | 0 .../tests/src/endpoints/Status.ts | 0 .../src/endpoints/abstracts/APIClient.ts | 0 .../tests/src/interfaces/StatusInterfaces.ts | 0 .../tests/src/restClient/RestClient.ts | 0 .../tests/tsconfig.eslint.json | 0 .../tests/tsconfig.json | 0 {validator-api => nym-api}/tests/yarn.lock | 0 nym-connect/Cargo.lock | 32 ++--- nym-connect/src-tauri/src/config/mod.rs | 2 +- nym-wallet/Cargo.lock | 30 ++--- nym-wallet/src-tauri/src/config/mod.rs | 4 +- nym-wallet/src-tauri/src/error.rs | 12 +- nym-wallet/src-tauri/src/main.rs | 20 +-- nym-wallet/src-tauri/src/network_config.rs | 6 +- .../src/operations/mixnet/account.rs | 4 +- .../src-tauri/src/operations/mixnet/bond.rs | 2 +- .../src/operations/mixnet/delegate.rs | 2 +- nym-wallet/src-tauri/src/operations/mod.rs | 2 +- .../{validator_api => nym_api}/mod.rs | 0 .../{validator_api => nym_api}/status.rs | 0 nym-wallet/src-tauri/src/state.rs | 14 +- .../examples/plain-html/src/index.ts | 6 +- .../src/App.tsx | 6 +- sdk/typescript/packages/sdk/README.md | 4 +- .../packages/sdk/src/mixnet/wasm/types.ts | 4 +- .../packages/sdk/src/mixnet/wasm/worker.ts | 10 +- tools/nym-cli/src/main.rs | 4 +- .../src/validator/mixnet/delegators/mod.rs | 4 +- .../nym-cli/src/validator/mixnet/query/mod.rs | 6 +- tools/ts-rs-cli/Cargo.toml | 2 +- tools/ts-rs-cli/src/main.rs | 12 +- 165 files changed, 600 insertions(+), 640 deletions(-) rename clients/validator/src/{validator-api-querier.ts => nym-api-querier.ts} (58%) rename common/client-libs/validator-client/src/{validator_api => nym_api}/error.rs (60%) rename common/client-libs/validator-client/src/{validator_api => nym_api}/mod.rs (82%) rename common/client-libs/validator-client/src/{validator_api => nym_api}/routes.rs (92%) rename {validator-api => nym-api}/Cargo.toml (97%) rename {validator-api => nym-api}/README.md (100%) rename {validator-api => nym-api}/Rocket.toml (100%) rename {validator-api => nym-api}/build.rs (92%) rename {validator-api => nym-api}/migrations/20210722120000_create_initial_tables.sql (100%) rename {validator-api => nym-api}/migrations/20210819120000_monitor_runs.sql (100%) rename {validator-api => nym-api}/migrations/20210824120000_rewarding_data.sql (100%) rename {validator-api => nym-api}/migrations/20211018120000_core_nodes_testing.sql (100%) rename {validator-api => nym-api}/migrations/20211101110000_no_gateway_rewarding.sql (100%) rename {validator-api => nym-api}/migrations/20220121120000_epoch_interval_renaming.sql (100%) rename {validator-api => nym-api}/migrations/20220323120000_drop_foreign_keys_constraints.sql (100%) rename {validator-api => nym-api}/migrations/20220325120000_signed_deposits.sql (100%) rename {validator-api => nym-api}/migrations/20220410222400_add_timestamp_indexes.sql (100%) rename {validator-api => nym-api}/migrations/20220804120000_mixnet_contract_v2.sql (100%) rename {validator-api/validator-api-requests => nym-api/nym-api-requests}/Cargo.toml (95%) rename {validator-api/validator-api-requests => nym-api/nym-api-requests}/src/coconut.rs (100%) rename {validator-api/validator-api-requests => nym-api/nym-api-requests}/src/lib.rs (100%) rename {validator-api/validator-api-requests => nym-api/nym-api-requests}/src/models.rs (100%) rename {validator-api => nym-api}/src/coconut/client.rs (100%) rename {validator-api => nym-api}/src/coconut/comm.rs (100%) rename {validator-api => nym-api}/src/coconut/deposit.rs (99%) rename {validator-api => nym-api}/src/coconut/dkg/client.rs (100%) rename {validator-api => nym-api}/src/coconut/dkg/complaints.rs (100%) rename {validator-api => nym-api}/src/coconut/dkg/controller.rs (100%) rename {validator-api => nym-api}/src/coconut/dkg/dealing.rs (100%) rename {validator-api => nym-api}/src/coconut/dkg/mod.rs (100%) rename {validator-api => nym-api}/src/coconut/dkg/public_key.rs (100%) rename {validator-api => nym-api}/src/coconut/dkg/state.rs (100%) rename {validator-api => nym-api}/src/coconut/dkg/verification_key.rs (100%) rename {validator-api => nym-api}/src/coconut/error.rs (96%) rename {validator-api => nym-api}/src/coconut/keypair.rs (100%) rename {validator-api => nym-api}/src/coconut/mod.rs (91%) rename {validator-api => nym-api}/src/coconut/tests.rs (97%) rename {validator-api => nym-api}/src/config/mod.rs (98%) rename {validator-api => nym-api}/src/config/template.rs (97%) rename {validator-api => nym-api}/src/contract_cache/mod.rs (99%) rename {validator-api => nym-api}/src/contract_cache/routes.rs (98%) rename {validator-api => nym-api}/src/epoch_operations/error.rs (85%) rename {validator-api => nym-api}/src/epoch_operations/helpers.rs (100%) rename {validator-api => nym-api}/src/epoch_operations/mod.rs (99%) rename {validator-api => nym-api}/src/main.rs (93%) rename {validator-api => nym-api}/src/network_monitor/chunker.rs (100%) rename {validator-api => nym-api}/src/network_monitor/gateways_reader.rs (100%) rename {validator-api => nym-api}/src/network_monitor/mod.rs (98%) rename {validator-api => nym-api}/src/network_monitor/monitor/gateway_clients_cache.rs (100%) rename {validator-api => nym-api}/src/network_monitor/monitor/gateways_pinger.rs (100%) rename {validator-api => nym-api}/src/network_monitor/monitor/mod.rs (98%) rename {validator-api => nym-api}/src/network_monitor/monitor/preparer.rs (100%) rename {validator-api => nym-api}/src/network_monitor/monitor/processor.rs (100%) rename {validator-api => nym-api}/src/network_monitor/monitor/receiver.rs (100%) rename {validator-api => nym-api}/src/network_monitor/monitor/sender.rs (100%) rename {validator-api => nym-api}/src/network_monitor/monitor/summary_producer.rs (100%) rename {validator-api => nym-api}/src/network_monitor/test_packet.rs (100%) rename {validator-api => nym-api}/src/network_monitor/test_route/mod.rs (100%) rename {validator-api => nym-api}/src/node_status_api/cache.rs (98%) rename {validator-api => nym-api}/src/node_status_api/cache/inclusion_probabilities.rs (98%) rename {validator-api => nym-api}/src/node_status_api/helpers.rs (97%) rename {validator-api => nym-api}/src/node_status_api/local_guard.rs (100%) rename {validator-api => nym-api}/src/node_status_api/mod.rs (100%) rename {validator-api => nym-api}/src/node_status_api/models.rs (99%) rename {validator-api => nym-api}/src/node_status_api/reward_estimate.rs (100%) rename {validator-api => nym-api}/src/node_status_api/routes.rs (94%) rename {validator-api => nym-api}/src/node_status_api/uptime_updater.rs (92%) rename {validator-api => nym-api}/src/node_status_api/utils.rs (100%) rename {validator-api => nym-api}/src/nymd_client.rs (98%) rename {validator-api => nym-api}/src/storage/manager.rs (100%) rename {validator-api => nym-api}/src/storage/mod.rs (89%) rename {validator-api => nym-api}/src/storage/models.rs (100%) rename {validator-api => nym-api}/src/swagger.rs (100%) rename {validator-api => nym-api}/tests/README.md (100%) rename {validator-api => nym-api}/tests/functional_test/validator-api/status/status-mixnode.test.ts (100%) rename {validator-api => nym-api}/tests/jest.config.js (100%) rename {validator-api => nym-api}/tests/package.json (100%) rename {validator-api => nym-api}/tests/src/config/config.yaml (100%) rename {validator-api => nym-api}/tests/src/config/configHandler.ts (100%) rename {validator-api => nym-api}/tests/src/endpoints/Status.ts (100%) rename {validator-api => nym-api}/tests/src/endpoints/abstracts/APIClient.ts (100%) rename {validator-api => nym-api}/tests/src/interfaces/StatusInterfaces.ts (100%) rename {validator-api => nym-api}/tests/src/restClient/RestClient.ts (100%) rename {validator-api => nym-api}/tests/tsconfig.eslint.json (100%) rename {validator-api => nym-api}/tests/tsconfig.json (100%) rename {validator-api => nym-api}/tests/yarn.lock (100%) rename nym-wallet/src-tauri/src/operations/{validator_api => nym_api}/mod.rs (100%) rename nym-wallet/src-tauri/src/operations/{validator_api => nym_api}/status.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 7ce237d55d..a8c9f07c74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -967,9 +967,9 @@ dependencies = [ "coconut-interface", "cosmrs", "crypto", + "nym-api-requests", "rand 0.7.3", "thiserror", - "validator-api-requests", "validator-client", ] @@ -3091,6 +3091,21 @@ dependencies = [ "libc", ] +[[package]] +name = "nym-api-requests" +version = "0.1.0" +dependencies = [ + "bs58", + "coconut-interface", + "cosmrs", + "cosmwasm-std", + "getset", + "mixnet-contract-common", + "schemars", + "serde", + "ts-rs", +] + [[package]] name = "nym-bity-integration" version = "0.1.0" @@ -3225,6 +3240,7 @@ dependencies = [ "mixnet-client", "mixnode-common", "network-defaults", + "nym-api-requests", "nymsphinx", "once_cell", "pemstore", @@ -3240,7 +3256,6 @@ dependencies = [ "tokio-tungstenite 0.14.0", "tokio-util 0.7.3", "url", - "validator-api-requests", "validator-client", "vergen 5.1.17", "version-checker", @@ -3436,6 +3451,7 @@ dependencies = [ "logging", "mixnet-contract-common", "multisig-contract-common", + "nym-api-requests", "nymcoconut", "nymsphinx", "okapi", @@ -3461,7 +3477,6 @@ dependencies = [ "topology", "ts-rs", "url", - "validator-api-requests", "validator-client", "vergen 7.2.1", "version-checker", @@ -6195,10 +6210,10 @@ version = "0.1.0" dependencies = [ "anyhow", "mixnet-contract-common", + "nym-api-requests", "nym-types", "nym-wallet-types", "ts-rs", - "validator-api-requests", "validator-client", "vesting-contract-common", "walkdir", @@ -6404,21 +6419,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -[[package]] -name = "validator-api-requests" -version = "0.1.0" -dependencies = [ - "bs58", - "coconut-interface", - "cosmrs", - "cosmwasm-std", - "getset", - "mixnet-contract-common", - "schemars", - "serde", - "ts-rs", -] - [[package]] name = "validator-client" version = "0.1.0" @@ -6443,6 +6443,7 @@ dependencies = [ "mixnet-contract-common", "multisig-contract-common", "network-defaults", + "nym-api-requests", "prost 0.10.3", "reqwest", "serde", @@ -6452,7 +6453,6 @@ dependencies = [ "tokio", "ts-rs", "url", - "validator-api-requests", "vesting-contract", "vesting-contract-common", ] diff --git a/Cargo.toml b/Cargo.toml index e03bd46aeb..faaa945330 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,8 +74,8 @@ members = [ "mixnode", "service-providers/network-requester", "service-providers/network-statistics", - "validator-api", - "validator-api/validator-api-requests", + "nym-api", + "nym-api/nym-api-requests", "tools/nym-cli", "tools/ts-rs-cli" ] @@ -87,7 +87,7 @@ default-members = [ "service-providers/network-requester", "service-providers/network-statistics", "mixnode", - "validator-api", + "nym-api", "explorer-api", ] diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index 932fb77b31..6db0280019 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -85,7 +85,7 @@ pub struct BaseClientBuilder<'a, B> { gateway_config: &'a GatewayEndpointConfig, debug_config: &'a DebugConfig, disabled_credentials: bool, - validator_api_endpoints: Vec, + nym_api_endpoints: Vec, reply_storage_backend: B, bandwidth_controller: Option, @@ -106,7 +106,7 @@ where gateway_config: base_config.get_gateway_endpoint_config(), debug_config: base_config.get_debug_config(), disabled_credentials: base_config.get_disabled_credentials_mode(), - validator_api_endpoints: base_config.get_validator_api_endpoints(), + nym_api_endpoints: base_config.get_nym_api_endpoints(), bandwidth_controller, reply_storage_backend, key_manager, @@ -120,13 +120,13 @@ where bandwidth_controller: Option, reply_storage_backend: B, disabled_credentials: bool, - validator_api_endpoints: Vec, + nym_api_endpoints: Vec, ) -> BaseClientBuilder<'a, B> { BaseClientBuilder { gateway_config, debug_config, disabled_credentials, - validator_api_endpoints, + nym_api_endpoints, bandwidth_controller, reply_storage_backend, key_manager, @@ -281,13 +281,13 @@ where // future responsible for periodically polling directory server and updating // the current global view of topology async fn start_topology_refresher( - validator_api_urls: Vec, + nym_api_urls: Vec, refresh_rate: Duration, topology_accessor: TopologyAccessor, shutdown: ShutdownListener, ) -> Result<(), ClientCoreError> { let topology_refresher_config = TopologyRefresherConfig::new( - validator_api_urls, + nym_api_urls, refresh_rate, env!("CARGO_PKG_VERSION").to_string(), ); @@ -386,7 +386,7 @@ where .await?; Self::start_topology_refresher( - self.validator_api_endpoints.clone(), + self.nym_api_endpoints.clone(), self.debug_config.topology_refresh_rate, shared_topology_accessor.clone(), shutdown.subscribe(), diff --git a/clients/client-core/src/client/topology_control.rs b/clients/client-core/src/client/topology_control.rs index ad9e4a4ce6..897d6a0e3b 100644 --- a/clients/client-core/src/client/topology_control.rs +++ b/clients/client-core/src/client/topology_control.rs @@ -136,19 +136,15 @@ impl Default for TopologyAccessor { } pub struct TopologyRefresherConfig { - validator_api_urls: Vec, + nym_api_urls: Vec, refresh_rate: Duration, client_version: String, } impl TopologyRefresherConfig { - pub fn new( - validator_api_urls: Vec, - refresh_rate: Duration, - client_version: String, - ) -> Self { + pub fn new(nym_api_urls: Vec, refresh_rate: Duration, client_version: String) -> Self { TopologyRefresherConfig { - validator_api_urls, + nym_api_urls, refresh_rate, client_version, } @@ -159,7 +155,7 @@ pub struct TopologyRefresher { validator_client: validator_client::client::ApiClient, client_version: String, - validator_api_urls: Vec, + nym_api_urls: Vec, topology_accessor: TopologyAccessor, refresh_rate: Duration, @@ -169,14 +165,12 @@ pub struct TopologyRefresher { impl TopologyRefresher { pub fn new(mut cfg: TopologyRefresherConfig, topology_accessor: TopologyAccessor) -> Self { - cfg.validator_api_urls.shuffle(&mut thread_rng()); + cfg.nym_api_urls.shuffle(&mut thread_rng()); TopologyRefresher { - validator_client: validator_client::client::ApiClient::new( - cfg.validator_api_urls[0].clone(), - ), + validator_client: validator_client::client::ApiClient::new(cfg.nym_api_urls[0].clone()), client_version: cfg.client_version, - validator_api_urls: cfg.validator_api_urls, + nym_api_urls: cfg.nym_api_urls, topology_accessor, refresh_rate: cfg.refresh_rate, currently_used_api: 0, @@ -184,15 +178,15 @@ impl TopologyRefresher { } } - fn use_next_validator_api(&mut self) { - if self.validator_api_urls.len() == 1 { - warn!("There's only a single validator API available - it won't be possible to use a different one"); + fn use_next_nym_api(&mut self) { + if self.nym_api_urls.len() == 1 { + warn!("There's only a single nym API available - it won't be possible to use a different one"); return; } - self.currently_used_api = (self.currently_used_api + 1) % self.validator_api_urls.len(); + self.currently_used_api = (self.currently_used_api + 1) % self.nym_api_urls.len(); self.validator_client - .change_validator_api(self.validator_api_urls[self.currently_used_api].clone()) + .change_nym_api(self.nym_api_urls[self.currently_used_api].clone()) } /// Verifies whether nodes a reasonably distributed among all mix layers. @@ -288,7 +282,7 @@ impl TopologyRefresher { let new_topology = self.get_current_compatible_topology().await; if new_topology.is_none() { - self.use_next_validator_api(); + self.use_next_nym_api(); } if new_topology.is_none() && self.was_latest_valid { diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index 0ce94ba646..a6c53db51e 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -160,8 +160,8 @@ impl Config { self.client.validator_urls = validator_urls; } - pub fn set_custom_validator_apis(&mut self, validator_api_urls: Vec) { - self.client.validator_api_urls = validator_api_urls; + pub fn set_custom_nym_apis(&mut self, nym_api_urls: Vec) { + self.client.nym_api_urls = nym_api_urls; } pub fn set_high_default_traffic_volume(&mut self) { @@ -221,8 +221,8 @@ impl Config { self.client.validator_urls.clone() } - pub fn get_validator_api_endpoints(&self) -> Vec { - self.client.validator_api_urls.clone() + pub fn get_nym_api_endpoints(&self) -> Vec { + self.client.nym_api_urls.clone() } pub fn get_gateway_id(&self) -> String { @@ -409,7 +409,8 @@ pub struct Client { validator_urls: Vec, /// Addresses to APIs running on validator from which the client gets the view of the network. - validator_api_urls: Vec, + #[serde(alias = "validator_api_urls")] + nym_api_urls: Vec, /// Path to file containing private identity key. private_identity_key_file: PathBuf, @@ -456,7 +457,7 @@ impl Default for Client { id: "".to_string(), disabled_credentials_mode: true, validator_urls: vec![], - validator_api_urls: vec![], + nym_api_urls: vec![], private_identity_key_file: Default::default(), public_identity_key_file: Default::default(), private_encryption_key_file: Default::default(), diff --git a/clients/client-core/src/error.rs b/clients/client-core/src/error.rs index 3b179567d1..44973c5f30 100644 --- a/clients/client-core/src/error.rs +++ b/clients/client-core/src/error.rs @@ -30,8 +30,8 @@ pub enum ClientCoreError { #[error("Failed to setup gateway")] FailedToSetupGateway, - #[error("List of validator apis is empty")] - ListOfValidatorApisIsEmpty, + #[error("List of nym apis is empty")] + ListOfNymApisIsEmpty, #[error("Could not load existing gateway configuration: {0}")] CouldNotLoadExistingGatewayConfiguration(std::io::Error), diff --git a/clients/client-core/src/init/helpers.rs b/clients/client-core/src/init/helpers.rs index 7947d614a1..31d76e86da 100644 --- a/clients/client-core/src/init/helpers.rs +++ b/clients/client-core/src/init/helpers.rs @@ -24,12 +24,12 @@ pub(super) async fn query_gateway_details( where B: ReplyStorageBackend, { - let validator_api = validator_servers + let nym_api = validator_servers .choose(&mut thread_rng()) - .ok_or(ClientCoreError::ListOfValidatorApisIsEmpty)?; - let validator_client = validator_client::client::ApiClient::new(validator_api.clone()); + .ok_or(ClientCoreError::ListOfNymApisIsEmpty)?; + let validator_client = validator_client::client::ApiClient::new(nym_api.clone()); - log::trace!("Fetching list of gateways from: {}", validator_api); + log::trace!("Fetching list of gateways from: {}", nym_api); let gateways = validator_client.get_cached_gateways().await?; let valid_gateways = gateways .into_iter() diff --git a/clients/client-core/src/init/mod.rs b/clients/client-core/src/init/mod.rs index f01bc74dcd..fa6c62c097 100644 --- a/clients/client-core/src/init/mod.rs +++ b/clients/client-core/src/init/mod.rs @@ -96,7 +96,7 @@ where { println!("Configuring gateway"); let gateway = - query_gateway_details(config.get_validator_api_endpoints(), user_chosen_gateway_id).await?; + query_gateway_details(config.get_nym_api_endpoints(), user_chosen_gateway_id).await?; log::debug!("Querying gateway gives: {}", gateway); // Registering with gateway by setting up and writing shared keys to disk @@ -120,11 +120,8 @@ where T: NymConfig, { println!("Using gateway provided by user, keeping existing keys"); - let gateway = query_gateway_details( - config.get_validator_api_endpoints(), - Some(user_chosen_gateway_id), - ) - .await?; + let gateway = + query_gateway_details(config.get_nym_api_endpoints(), Some(user_chosen_gateway_id)).await?; log::debug!("Querying gateway gives: {}", gateway); Ok(gateway.into()) } diff --git a/clients/native/src/client/config/template.rs b/clients/native/src/client/config/template.rs index 31ca091282..54d4032799 100644 --- a/clients/native/src/client/config/template.rs +++ b/clients/native/src/client/config/template.rs @@ -31,8 +31,8 @@ validator_urls = [ ] # Addresses to APIs running on validator from which the client gets the view of the network. -validator_api_urls = [ - {{#each client.validator_api_urls }} +nym_api_urls = [ + {{#each client.nym_api_urls }} '{{this}}', {{/each}} ] diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index cabe049c45..0d61b502ab 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -56,7 +56,7 @@ impl SocketClient { .expect("No nymd validator endpoint provided"); let api_url = config .get_base() - .get_validator_api_endpoints() + .get_nym_api_endpoints() .pop() .expect("No validator api endpoint provided"); // overwrite env configuration with config URLs diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index 9dc6a2ac33..4ad9d414dc 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -114,13 +114,13 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi if let Some(raw_validators) = args.api_validators { config .get_base_mut() - .set_custom_validator_apis(config::parse_validators(&raw_validators)); + .set_custom_nym_apis(config::parse_validators(&raw_validators)); } else if std::env::var(network_defaults::var_names::CONFIGURED).is_ok() { let raw_validators = std::env::var(network_defaults::var_names::API_VALIDATOR) .expect("api validator not set"); config .get_base_mut() - .set_custom_validator_apis(config::parse_validators(&raw_validators)); + .set_custom_nym_apis(config::parse_validators(&raw_validators)); } if args.disable_socket { diff --git a/clients/socks5/src/client/config/template.rs b/clients/socks5/src/client/config/template.rs index 527da38274..90029fb5fd 100644 --- a/clients/socks5/src/client/config/template.rs +++ b/clients/socks5/src/client/config/template.rs @@ -31,8 +31,8 @@ validator_urls = [ ] # Addresses to APIs running on validator from which the client gets the view of the network. -validator_api_urls = [ - {{#each client.validator_api_urls }} +nym_api_urls = [ + {{#each client.nym_api_urls }} '{{this}}', {{/each}} ] diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index 2b4bff7852..45c9ffad7f 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -67,7 +67,7 @@ impl NymClient { .expect("No nymd validator endpoint provided"); let api_url = config .get_base() - .get_validator_api_endpoints() + .get_nym_api_endpoints() .pop() .expect("No validator api endpoint provided"); // overwrite env configuration with config URLs diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index 5f5bfda1de..4d4345f1ce 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -116,11 +116,11 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi if let Some(raw_validators) = args.api_validators { config .get_base_mut() - .set_custom_validator_apis(parse_validators(&raw_validators)); + .set_custom_nym_apis(parse_validators(&raw_validators)); } else if let Ok(raw_validators) = std::env::var(network_defaults::var_names::API_VALIDATOR) { config .get_base_mut() - .set_custom_validator_apis(parse_validators(&raw_validators)); + .set_custom_nym_apis(parse_validators(&raw_validators)); } if args.use_anonymous_sender_tag { diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 10d2d60ea6..ddcd068a76 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -43,9 +43,9 @@ pub(crate) struct Run { #[clap(long)] nymd_validators: Option, - /// Comma separated list of rest endpoints of the API validators + /// Comma separated list of rest endpoints of the Nym APIs #[clap(long)] - api_validators: Option, + nym_apis: Option, /// Port for the socket to listen on #[clap(short, long)] @@ -71,7 +71,7 @@ impl From for OverrideConfig { fn from(run_config: Run) -> Self { OverrideConfig { nymd_validators: run_config.nymd_validators, - api_validators: run_config.api_validators, + api_validators: run_config.nym_apis, port: run_config.port, use_anonymous_sender_tag: run_config.use_anonymous_sender_tag, fastmode: run_config.fastmode, diff --git a/clients/validator/src/index.ts b/clients/validator/src/index.ts index 642fc2b077..cfbc862a9e 100644 --- a/clients/validator/src/index.ts +++ b/clients/validator/src/index.ts @@ -86,7 +86,7 @@ export default class ValidatorClient implements INymClient { static async connect( mnemonic: string, nymdUrl: string, - validatorApiUrl: string, + nymApiUrl: string, prefix: string, mixnetContract: string, vestingContract: string, @@ -94,19 +94,19 @@ export default class ValidatorClient implements INymClient { ): Promise { const wallet = await ValidatorClient.buildWallet(mnemonic, prefix); - const signingClient = await SigningClient.connectWithNymSigner(wallet, nymdUrl, validatorApiUrl, prefix, denom); + const signingClient = await SigningClient.connectWithNymSigner(wallet, nymdUrl, nymApiUrl, prefix, denom); return new ValidatorClient(signingClient, prefix, mixnetContract, vestingContract, denom); } static async connectForQuery( nymdUrl: string, - validatorApiUrl: string, + nymApiUrl: string, prefix: string, mixnetContract: string, vestingContract: string, denom: string, ): Promise { - const queryClient = await QueryClient.connectWithNym(nymdUrl, validatorApiUrl); + const queryClient = await QueryClient.connectWithNym(nymdUrl, nymApiUrl); return new ValidatorClient(queryClient, prefix, mixnetContract, vestingContract, denom); } diff --git a/clients/validator/src/validator-api-querier.ts b/clients/validator/src/nym-api-querier.ts similarity index 58% rename from clients/validator/src/validator-api-querier.ts rename to clients/validator/src/nym-api-querier.ts index 7c61f91bd7..3fa0471804 100644 --- a/clients/validator/src/validator-api-querier.ts +++ b/clients/validator/src/nym-api-querier.ts @@ -6,13 +6,13 @@ import axios from 'axios'; import { GatewayBond, MixNodeBond } from './types'; -export const VALIDATOR_API_VERSION = '/v1'; -export const VALIDATOR_API_GATEWAYS_PATH = `${VALIDATOR_API_VERSION}/gateways`; -export const VALIDATOR_API_MIXNODES_PATH = `${VALIDATOR_API_VERSION}/mixnodes`; -export const VALIDATOR_API_ACTIVE_MIXNODES_PATH = `${VALIDATOR_API_VERSION}/mixnodes/active`; -export const VALIDATOR_API_REWARDED_MIXNODES_PATH = `${VALIDATOR_API_VERSION}/mixnodes/rewarded`; +export const NYM_API_VERSION = '/v1'; +export const NYM_API_GATEWAYS_PATH = `${NYM_API_VERSION}/gateways`; +export const NYM_API_MIXNODES_PATH = `${NYM_API_VERSION}/mixnodes`; +export const NYM_API_ACTIVE_MIXNODES_PATH = `${NYM_API_VERSION}/mixnodes/active`; +export const NYM_API_REWARDED_MIXNODES_PATH = `${NYM_API_VERSION}/mixnodes/rewarded`; -export interface IValidatorApiQuery { +export interface INymApiQuery { getCachedMixnodes(): Promise; getCachedGateways(): Promise; @@ -22,16 +22,16 @@ export interface IValidatorApiQuery { getRewardedMixnodes(): Promise; } -export default class ValidatorApiQuerier implements IValidatorApiQuery { - validatorApiUrl: string; +export default class NymApiQuerier implements INymApiQuery { + nymApiUrl: string; - constructor(validatorApiUrl: string) { - this.validatorApiUrl = validatorApiUrl; + constructor(nymApiUrl: string) { + this.nymApiUrl = nymApiUrl; } async getCachedMixnodes(): Promise { - const url = new URL(this.validatorApiUrl); - url.pathname += VALIDATOR_API_MIXNODES_PATH; + const url = new URL(this.nymApiUrl); + url.pathname += NYM_API_MIXNODES_PATH; const response = await axios.get(url.toString()); if (response.status === 200) { @@ -41,8 +41,8 @@ export default class ValidatorApiQuerier implements IValidatorApiQuery { } async getCachedGateways(): Promise { - const url = new URL(this.validatorApiUrl); - url.pathname += VALIDATOR_API_GATEWAYS_PATH; + const url = new URL(this.nymApiUrl); + url.pathname += NYM_API_GATEWAYS_PATH; const response = await axios.get(url.toString()); if (response.status === 200) { @@ -52,8 +52,8 @@ export default class ValidatorApiQuerier implements IValidatorApiQuery { } async getActiveMixnodes(): Promise { - const url = new URL(this.validatorApiUrl); - url.pathname += VALIDATOR_API_ACTIVE_MIXNODES_PATH; + const url = new URL(this.nymApiUrl); + url.pathname += NYM_API_ACTIVE_MIXNODES_PATH; const response = await axios.get(url.toString()); if (response.status === 200) { @@ -63,8 +63,8 @@ export default class ValidatorApiQuerier implements IValidatorApiQuery { } async getRewardedMixnodes(): Promise { - const url = new URL(this.validatorApiUrl); - url.pathname += VALIDATOR_API_REWARDED_MIXNODES_PATH; + const url = new URL(this.nymApiUrl); + url.pathname += NYM_API_REWARDED_MIXNODES_PATH; const response = await axios.get(url.toString()); if (response.status === 200) { diff --git a/clients/validator/src/query-client.ts b/clients/validator/src/query-client.ts index 9e3937a89e..de477f7fd9 100644 --- a/clients/validator/src/query-client.ts +++ b/clients/validator/src/query-client.ts @@ -29,7 +29,7 @@ import { PagedMixnodeResponse, RewardingStatus, } from './types'; -import ValidatorApiQuerier, { IValidatorApiQuery } from './validator-api-querier'; +import NymApiQuerier, { INymApiQuery as INymApiQuery } from './nym-api-querier'; export interface ICosmWasmQuery { // methods exposed by `CosmWasmClient` @@ -93,22 +93,22 @@ export interface INymdQuery { ): Promise; } -export interface IQueryClient extends ICosmWasmQuery, INymdQuery, IValidatorApiQuery {} +export interface IQueryClient extends ICosmWasmQuery, INymdQuery, INymApiQuery { } export default class QueryClient extends CosmWasmClient implements IQueryClient { private nymdQuerier: NymdQuerier; - private validatorApiQuerier: ValidatorApiQuerier; + private nymApiQuerier: NymApiQuerier; - private constructor(tmClient: Tendermint34Client, validatorApiUrl: string) { + private constructor(tmClient: Tendermint34Client, nymApiUrl: string) { super(tmClient); this.nymdQuerier = new NymdQuerier(this); - this.validatorApiQuerier = new ValidatorApiQuerier(validatorApiUrl); + this.nymApiQuerier = new NymApiQuerier(nymApiUrl); } - public static async connectWithNym(nymdUrl: string, validatorApiUrl: string): Promise { + public static async connectWithNym(nymdUrl: string, nymApiUrl: string): Promise { const tmClient = await Tendermint34Client.connect(nymdUrl); - return new QueryClient(tmClient, validatorApiUrl); + return new QueryClient(tmClient, nymApiUrl); } getContractVersion(mixnetContractAddress: string): Promise { @@ -194,18 +194,18 @@ export default class QueryClient extends CosmWasmClient implements IQueryClient } getCachedGateways(): Promise { - return this.validatorApiQuerier.getCachedGateways(); + return this.nymApiQuerier.getCachedGateways(); } getCachedMixnodes(): Promise { - return this.validatorApiQuerier.getCachedMixnodes(); + return this.nymApiQuerier.getCachedMixnodes(); } getActiveMixnodes(): Promise { - return this.validatorApiQuerier.getActiveMixnodes(); + return this.nymApiQuerier.getActiveMixnodes(); } getRewardedMixnodes(): Promise { - return this.validatorApiQuerier.getRewardedMixnodes(); + return this.nymApiQuerier.getRewardedMixnodes(); } } diff --git a/clients/validator/src/signing-client.ts b/clients/validator/src/signing-client.ts index ef8913243d..382077f0a9 100644 --- a/clients/validator/src/signing-client.ts +++ b/clients/validator/src/signing-client.ts @@ -33,7 +33,7 @@ import { PagedMixnodeResponse, RewardingStatus, } from './types'; -import ValidatorApiQuerier from './validator-api-querier'; +import NymApiQuerier from './nym-api-querier'; // methods exposed by `SigningCosmWasmClient` export interface ICosmWasmSigning { @@ -199,13 +199,13 @@ export interface ISigningClient extends IQueryClient, ICosmWasmSigning, INymSign export default class SigningClient extends SigningCosmWasmClient implements ISigningClient { private nymdQuerier: NymdQuerier; - private validatorApiQuerier: ValidatorApiQuerier; + private nymApiQuerier: NymApiQuerier; clientAddress: string; private constructor( clientAddress: string, - validatorApiUrl: string, + nymApiUrl: string, tmClient: Tendermint34Client, wallet: DirectSecp256k1HdWallet, signerOptions: SigningCosmWasmClientOptions, @@ -213,13 +213,13 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig super(tmClient, wallet, signerOptions); this.clientAddress = clientAddress; this.nymdQuerier = new NymdQuerier(this); - this.validatorApiQuerier = new ValidatorApiQuerier(validatorApiUrl); + this.nymApiQuerier = new NymApiQuerier(nymApiUrl); } public static async connectWithNymSigner( wallet: DirectSecp256k1HdWallet, nymdUrl: string, - validatorApiUrl: string, + nymApiUrl: string, prefix: string, denom: string, ): Promise { @@ -229,7 +229,7 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig gasPrice: nymGasPrice(denom), }; const tmClient = await Tendermint34Client.connect(nymdUrl); - return new SigningClient(address, validatorApiUrl, tmClient, wallet, signerOptions); + return new SigningClient(address, nymApiUrl, tmClient, wallet, signerOptions); } // query related: @@ -317,19 +317,19 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig } getCachedGateways(): Promise { - return this.validatorApiQuerier.getCachedGateways(); + return this.nymApiQuerier.getCachedGateways(); } getCachedMixnodes(): Promise { - return this.validatorApiQuerier.getCachedMixnodes(); + return this.nymApiQuerier.getCachedMixnodes(); } getActiveMixnodes(): Promise { - return this.validatorApiQuerier.getActiveMixnodes(); + return this.nymApiQuerier.getActiveMixnodes(); } getRewardedMixnodes(): Promise { - return this.validatorApiQuerier.getRewardedMixnodes(); + return this.nymApiQuerier.getRewardedMixnodes(); } // signing related: diff --git a/clients/validator/tests/query/balance.test.ts b/clients/validator/tests/query/balance.test.ts index 254e54a745..97be47c2ce 100644 --- a/clients/validator/tests/query/balance.test.ts +++ b/clients/validator/tests/query/balance.test.ts @@ -1,4 +1,4 @@ -import ValidatorClient from '../../dist'; +import ValidatorClient from '../../validator/index'; import expect from 'expect'; describe('Query: balances', () => { diff --git a/clients/webassembly/src/client/config.rs b/clients/webassembly/src/client/config.rs index 4740a02b2a..4efefeba21 100644 --- a/clients/webassembly/src/client/config.rs +++ b/clients/webassembly/src/client/config.rs @@ -17,7 +17,7 @@ pub struct Config { /// ID specifies the human readable ID of this particular client. pub(crate) id: String, - pub(crate) validator_api_url: Url, + pub(crate) nym_api_url: Url, pub(crate) disabled_credentials_mode: bool, @@ -38,7 +38,7 @@ impl Config { ) -> Self { Config { id, - validator_api_url: validator_server + nym_api_url: validator_server .parse() .expect("provided url was malformed"), disabled_credentials_mode: true, diff --git a/clients/webassembly/src/client/mod.rs b/clients/webassembly/src/client/mod.rs index 9c3aefe8c6..9c9f20b2c6 100644 --- a/clients/webassembly/src/client/mod.rs +++ b/clients/webassembly/src/client/mod.rs @@ -99,7 +99,7 @@ impl NymClientBuilder { self.bandwidth_controller, self.reply_surb_storage_backend, self.disabled_credentials, - vec![self.config.validator_api_url.clone()], + vec![self.config.nym_api_url.clone()], ); let self_address = base_builder.as_mix_recipient().to_string(); diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index ec842828e7..18096c3db0 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -29,7 +29,7 @@ futures = "0.3" coconut-interface = { path = "../../coconut-interface" } network-defaults = { path = "../../network-defaults" } -validator-api-requests = { path = "../../../validator-api/validator-api-requests", features = ["coconut"] } +nym-api-requests = { path = "../../../nym-api/nym-api-requests", features = ["coconut"] } # required for nymd-client # at some point it might be possible to make it wasm-compatible diff --git a/common/client-libs/validator-client/src/client.rs b/common/client-libs/validator-client/src/client.rs index b5746ea06c..396efb4c3c 100644 --- a/common/client-libs/validator-client/src/client.rs +++ b/common/client-libs/validator-client/src/client.rs @@ -1,16 +1,16 @@ // Copyright 2021-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::{validator_api, ValidatorClientError}; +use crate::{nym_api, ValidatorClientError}; use coconut_dkg_common::types::NodeIndex; use coconut_interface::VerificationKey; use mixnet_contract_common::mixnode::MixNodeDetails; use mixnet_contract_common::MixId; use mixnet_contract_common::{GatewayBond, IdentityKeyRef}; -use validator_api_requests::coconut::{ +use nym_api_requests::coconut::{ BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, }; -use validator_api_requests::models::{ +use nym_api_requests::models::{ GatewayCoreStatusResponse, MixnodeCoreStatusResponse, MixnodeStatusResponse, RewardEstimationResponse, StakeSaturationResponse, }; @@ -37,10 +37,10 @@ use mixnet_contract_common::{ #[cfg(feature = "nymd-client")] use network_defaults::NymNetworkDetails; #[cfg(feature = "nymd-client")] +use nym_api_requests::models::MixNodeBondAnnotated; +#[cfg(feature = "nymd-client")] use std::str::FromStr; use url::Url; -#[cfg(feature = "nymd-client")] -use validator_api_requests::models::MixNodeBondAnnotated; #[cfg(feature = "nymd-client")] #[must_use] @@ -142,7 +142,7 @@ pub struct Client { proposals_page_limit: Option, // ideally they would have been read-only, but unfortunately rust doesn't have such features - pub validator_api: validator_api::Client, + pub nym_api: nym_api::Client, pub nymd: NymdClient, } @@ -152,7 +152,7 @@ impl Client { config: Config, mnemonic: bip39::Mnemonic, ) -> Result, ValidatorClientError> { - let validator_api_client = validator_api::Client::new(config.api_url.clone()); + let nym_api_client = nym_api::Client::new(config.api_url.clone()); let nymd_client = NymdClient::connect_with_mnemonic( config.nymd_config.clone(), config.nymd_url.as_str(), @@ -169,7 +169,7 @@ impl Client { dealers_page_limit: config.dealers_page_limit, verification_key_page_limit: config.verification_key_page_limit, proposals_page_limit: config.proposals_page_limit, - validator_api: validator_api_client, + nym_api: nym_api_client, nymd: nymd_client, }) } @@ -192,7 +192,7 @@ impl Client { #[cfg(feature = "nymd-client")] impl Client { pub fn new_query(config: Config) -> Result, ValidatorClientError> { - let validator_api_client = validator_api::Client::new(config.api_url.clone()); + let nym_api_client = nym_api::Client::new(config.api_url.clone()); let nymd_client = NymdClient::connect(config.nymd_config.clone(), config.nymd_url.as_str())?; @@ -205,7 +205,7 @@ impl Client { dealers_page_limit: config.dealers_page_limit, verification_key_page_limit: config.verification_key_page_limit, proposals_page_limit: config.proposals_page_limit, - validator_api: validator_api_client, + nym_api: nym_api_client, nymd: nymd_client, }) } @@ -731,53 +731,53 @@ impl Client { // validator-api wrappers #[cfg(feature = "nymd-client")] impl Client { - pub fn change_validator_api(&mut self, new_endpoint: Url) { - self.validator_api.change_url(new_endpoint) + pub fn change_nym_api(&mut self, new_endpoint: Url) { + self.nym_api.change_url(new_endpoint) } pub async fn get_cached_mixnodes(&self) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_mixnodes().await?) + Ok(self.nym_api.get_mixnodes().await?) } pub async fn get_cached_mixnodes_detailed( &self, ) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_mixnodes_detailed().await?) + Ok(self.nym_api.get_mixnodes_detailed().await?) } pub async fn get_cached_rewarded_mixnodes( &self, ) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_rewarded_mixnodes().await?) + Ok(self.nym_api.get_rewarded_mixnodes().await?) } pub async fn get_cached_rewarded_mixnodes_detailed( &self, ) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_rewarded_mixnodes_detailed().await?) + Ok(self.nym_api.get_rewarded_mixnodes_detailed().await?) } pub async fn get_cached_active_mixnodes( &self, ) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_active_mixnodes().await?) + Ok(self.nym_api.get_active_mixnodes().await?) } pub async fn get_cached_active_mixnodes_detailed( &self, ) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_active_mixnodes_detailed().await?) + Ok(self.nym_api.get_active_mixnodes_detailed().await?) } pub async fn get_cached_gateways(&self) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_gateways().await?) + Ok(self.nym_api.get_gateways().await?) } pub async fn blind_sign( &self, request_body: &BlindSignRequestBody, ) -> Result { - Ok(self.validator_api.blind_sign(request_body).await?) + Ok(self.nym_api.blind_sign(request_body).await?) } } @@ -827,42 +827,40 @@ impl CoconutApiClient { #[derive(Clone)] pub struct ApiClient { - pub validator_api: validator_api::Client, + pub nym_api_client: nym_api::Client, // TODO: perhaps if we really need it at some (currently I don't see any reasons for it) // we could re-implement the communication with the REST API on port 1317 } impl ApiClient { pub fn new(api_url: Url) -> Self { - let validator_api_client = validator_api::Client::new(api_url); + let nym_api_client = nym_api::Client::new(api_url); - ApiClient { - validator_api: validator_api_client, - } + ApiClient { nym_api_client } } - pub fn change_validator_api(&mut self, new_endpoint: Url) { - self.validator_api.change_url(new_endpoint); + pub fn change_nym_api(&mut self, new_endpoint: Url) { + self.nym_api_client.change_url(new_endpoint); } pub async fn get_cached_active_mixnodes( &self, ) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_active_mixnodes().await?) + Ok(self.nym_api_client.get_active_mixnodes().await?) } pub async fn get_cached_rewarded_mixnodes( &self, ) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_rewarded_mixnodes().await?) + Ok(self.nym_api_client.get_rewarded_mixnodes().await?) } pub async fn get_cached_mixnodes(&self) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_mixnodes().await?) + Ok(self.nym_api_client.get_mixnodes().await?) } pub async fn get_cached_gateways(&self) -> Result, ValidatorClientError> { - Ok(self.validator_api.get_gateways().await?) + Ok(self.nym_api_client.get_gateways().await?) } pub async fn get_gateway_core_status_count( @@ -871,7 +869,7 @@ impl ApiClient { since: Option, ) -> Result { Ok(self - .validator_api + .nym_api_client .get_gateway_core_status_count(identity, since) .await?) } @@ -882,7 +880,7 @@ impl ApiClient { since: Option, ) -> Result { Ok(self - .validator_api + .nym_api_client .get_mixnode_core_status_count(mix_id, since) .await?) } @@ -891,7 +889,7 @@ impl ApiClient { &self, mix_id: MixId, ) -> Result { - Ok(self.validator_api.get_mixnode_status(mix_id).await?) + Ok(self.nym_api_client.get_mixnode_status(mix_id).await?) } pub async fn get_mixnode_reward_estimation( @@ -899,7 +897,7 @@ impl ApiClient { mix_id: MixId, ) -> Result { Ok(self - .validator_api + .nym_api_client .get_mixnode_reward_estimation(mix_id) .await?) } @@ -909,7 +907,7 @@ impl ApiClient { mix_id: MixId, ) -> Result { Ok(self - .validator_api + .nym_api_client .get_mixnode_stake_saturation(mix_id) .await?) } @@ -918,7 +916,7 @@ impl ApiClient { &self, request_body: &BlindSignRequestBody, ) -> Result { - Ok(self.validator_api.blind_sign(request_body).await?) + Ok(self.nym_api_client.blind_sign(request_body).await?) } pub async fn partial_bandwidth_credential( @@ -926,7 +924,7 @@ impl ApiClient { request_body: &str, ) -> Result { Ok(self - .validator_api + .nym_api_client .partial_bandwidth_credential(request_body) .await?) } @@ -936,7 +934,7 @@ impl ApiClient { request_body: &VerifyCredentialBody, ) -> Result { Ok(self - .validator_api + .nym_api_client .verify_bandwidth_credential(request_body) .await?) } diff --git a/common/client-libs/validator-client/src/error.rs b/common/client-libs/validator-client/src/error.rs index e832b12618..70ac98b30d 100644 --- a/common/client-libs/validator-client/src/error.rs +++ b/common/client-libs/validator-client/src/error.rs @@ -1,15 +1,15 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::validator_api; +use crate::nym_api; use thiserror::Error; #[derive(Error, Debug)] pub enum ValidatorClientError { #[error("There was an issue with the validator api request - {source}")] - ValidatorAPIError { + NymAPIError { #[from] - source: validator_api::error::ValidatorAPIError, + source: nym_api::error::NymAPIError, }, #[error("One of the provided URLs was malformed - {0}")] diff --git a/common/client-libs/validator-client/src/lib.rs b/common/client-libs/validator-client/src/lib.rs index 2a5e010338..5cf81f09d7 100644 --- a/common/client-libs/validator-client/src/lib.rs +++ b/common/client-libs/validator-client/src/lib.rs @@ -5,14 +5,14 @@ pub mod client; #[cfg(feature = "nymd-client")] pub mod connection_tester; mod error; +pub mod nym_api; #[cfg(feature = "nymd-client")] pub mod nymd; -pub mod validator_api; #[cfg(feature = "nymd-client")] pub use crate::client::{ApiClient, CoconutApiClient}; pub use crate::error::ValidatorClientError; -pub use validator_api_requests::*; +pub use nym_api_requests::*; #[cfg(feature = "nymd-client")] pub use client::{Client, Config}; diff --git a/common/client-libs/validator-client/src/validator_api/error.rs b/common/client-libs/validator-client/src/nym_api/error.rs similarity index 60% rename from common/client-libs/validator-client/src/validator_api/error.rs rename to common/client-libs/validator-client/src/nym_api/error.rs index 9d7cd1d50d..1c3f7b11a4 100644 --- a/common/client-libs/validator-client/src/validator_api/error.rs +++ b/common/client-libs/validator-client/src/nym_api/error.rs @@ -1,8 +1,8 @@ +use nym_api_requests::models::RequestError; use thiserror::Error; -use validator_api_requests::models::RequestError; #[derive(Error, Debug)] -pub enum ValidatorAPIError { +pub enum NymAPIError { #[error("There was an issue with the REST request - {source}")] ReqwestClientError { #[from] @@ -12,6 +12,6 @@ pub enum ValidatorAPIError { #[error("Request failed with error message - {0}")] GenericRequestFailure(String), - #[error("The validator API has failed to resolve our request. It returned status code {status} and additional error message: {}", error.message())] + #[error("The nym API has failed to resolve our request. It returned status code {status} and additional error message: {}", error.message())] ApiRequestFailure { status: u16, error: RequestError }, } diff --git a/common/client-libs/validator-client/src/validator_api/mod.rs b/common/client-libs/validator-client/src/nym_api/mod.rs similarity index 82% rename from common/client-libs/validator-client/src/validator_api/mod.rs rename to common/client-libs/validator-client/src/nym_api/mod.rs index 3cb7ae2ce9..00fd839d4e 100644 --- a/common/client-libs/validator-client/src/validator_api/mod.rs +++ b/common/client-libs/validator-client/src/nym_api/mod.rs @@ -1,22 +1,22 @@ // Copyright 2021-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::validator_api::error::ValidatorAPIError; -use crate::validator_api::routes::{CORE_STATUS_COUNT, SINCE_ARG}; +use crate::nym_api::error::NymAPIError; +use crate::nym_api::routes::{CORE_STATUS_COUNT, SINCE_ARG}; use mixnet_contract_common::mixnode::MixNodeDetails; use mixnet_contract_common::{GatewayBond, IdentityKeyRef, MixId}; -use reqwest::Response; -use serde::{Deserialize, Serialize}; -use url::Url; -use validator_api_requests::coconut::{ +use nym_api_requests::coconut::{ BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, }; -use validator_api_requests::models::{ +use nym_api_requests::models::{ GatewayCoreStatusResponse, GatewayStatusReportResponse, GatewayUptimeHistoryResponse, InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, RequestError, RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, }; +use reqwest::Response; +use serde::{Deserialize, Serialize}; +use url::Url; pub mod error; pub mod routes; @@ -53,7 +53,7 @@ impl Client { &self, path: PathSegments<'_>, params: Params<'_, K, V>, - ) -> Result + ) -> Result where K: AsRef, V: AsRef, @@ -62,11 +62,11 @@ impl Client { Ok(self.reqwest_client.get(url).send().await?) } - async fn query_validator_api( + async fn query_nym_api( &self, path: PathSegments<'_>, params: Params<'_, K, V>, - ) -> Result + ) -> Result where for<'a> T: Deserialize<'a>, K: AsRef, @@ -76,16 +76,16 @@ impl Client { if res.status().is_success() { Ok(res.json().await?) } else { - Err(ValidatorAPIError::GenericRequestFailure(res.text().await?)) + Err(NymAPIError::GenericRequestFailure(res.text().await?)) } } // This works for endpoints returning Result, ErrorResponse> - async fn query_validator_api_fallible( + async fn query_nym_api_fallible( &self, path: PathSegments<'_>, params: Params<'_, K, V>, - ) -> Result + ) -> Result where for<'a> T: Deserialize<'a>, K: AsRef, @@ -97,19 +97,19 @@ impl Client { Ok(res.json().await?) } else { let request_error: RequestError = res.json().await?; - Err(ValidatorAPIError::ApiRequestFailure { + Err(NymAPIError::ApiRequestFailure { status: status.as_u16(), error: request_error, }) } } - async fn post_validator_api( + async fn post_nym_api( &self, path: PathSegments<'_>, params: Params<'_, K, V>, json_body: &B, - ) -> Result + ) -> Result where B: Serialize + ?Sized, for<'a> T: Deserialize<'a>, @@ -121,21 +121,17 @@ impl Client { if response.status().is_success() { Ok(response.json().await?) } else { - Err(ValidatorAPIError::GenericRequestFailure( - response.text().await?, - )) + Err(NymAPIError::GenericRequestFailure(response.text().await?)) } } - pub async fn get_mixnodes(&self) -> Result, ValidatorAPIError> { - self.query_validator_api(&[routes::API_VERSION, routes::MIXNODES], NO_PARAMS) + pub async fn get_mixnodes(&self) -> Result, NymAPIError> { + self.query_nym_api(&[routes::API_VERSION, routes::MIXNODES], NO_PARAMS) .await } - pub async fn get_mixnodes_detailed( - &self, - ) -> Result, ValidatorAPIError> { - self.query_validator_api( + pub async fn get_mixnodes_detailed(&self) -> Result, NymAPIError> { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS, @@ -147,13 +143,13 @@ impl Client { .await } - pub async fn get_gateways(&self) -> Result, ValidatorAPIError> { - self.query_validator_api(&[routes::API_VERSION, routes::GATEWAYS], NO_PARAMS) + pub async fn get_gateways(&self) -> Result, NymAPIError> { + self.query_nym_api(&[routes::API_VERSION, routes::GATEWAYS], NO_PARAMS) .await } - pub async fn get_active_mixnodes(&self) -> Result, ValidatorAPIError> { - self.query_validator_api( + pub async fn get_active_mixnodes(&self) -> Result, NymAPIError> { + self.query_nym_api( &[routes::API_VERSION, routes::MIXNODES, routes::ACTIVE], NO_PARAMS, ) @@ -162,8 +158,8 @@ impl Client { pub async fn get_active_mixnodes_detailed( &self, - ) -> Result, ValidatorAPIError> { - self.query_validator_api( + ) -> Result, NymAPIError> { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS, @@ -176,8 +172,8 @@ impl Client { .await } - pub async fn get_rewarded_mixnodes(&self) -> Result, ValidatorAPIError> { - self.query_validator_api( + pub async fn get_rewarded_mixnodes(&self) -> Result, NymAPIError> { + self.query_nym_api( &[routes::API_VERSION, routes::MIXNODES, routes::REWARDED], NO_PARAMS, ) @@ -187,8 +183,8 @@ impl Client { pub async fn get_mixnode_report( &self, mix_id: MixId, - ) -> Result { - self.query_validator_api( + ) -> Result { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS, @@ -204,8 +200,8 @@ impl Client { pub async fn get_gateway_report( &self, identity: IdentityKeyRef<'_>, - ) -> Result { - self.query_validator_api( + ) -> Result { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS, @@ -221,8 +217,8 @@ impl Client { pub async fn get_mixnode_history( &self, mix_id: MixId, - ) -> Result { - self.query_validator_api( + ) -> Result { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS, @@ -238,8 +234,8 @@ impl Client { pub async fn get_gateway_history( &self, identity: IdentityKeyRef<'_>, - ) -> Result { - self.query_validator_api( + ) -> Result { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS, @@ -254,8 +250,8 @@ impl Client { pub async fn get_rewarded_mixnodes_detailed( &self, - ) -> Result, ValidatorAPIError> { - self.query_validator_api( + ) -> Result, NymAPIError> { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS, @@ -272,9 +268,9 @@ impl Client { &self, identity: IdentityKeyRef<'_>, since: Option, - ) -> Result { + ) -> Result { if let Some(since) = since { - self.query_validator_api( + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -286,7 +282,7 @@ impl Client { ) .await } else { - self.query_validator_api( + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -303,9 +299,9 @@ impl Client { &self, mix_id: MixId, since: Option, - ) -> Result { + ) -> Result { if let Some(since) = since { - self.query_validator_api( + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -317,7 +313,7 @@ impl Client { ) .await } else { - self.query_validator_api( + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -334,8 +330,8 @@ impl Client { pub async fn get_mixnode_status( &self, mix_id: MixId, - ) -> Result { - self.query_validator_api( + ) -> Result { + self.query_nym_api( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -351,8 +347,8 @@ impl Client { pub async fn get_mixnode_reward_estimation( &self, mix_id: MixId, - ) -> Result { - self.query_validator_api_fallible( + ) -> Result { + self.query_nym_api_fallible( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -368,8 +364,8 @@ impl Client { pub async fn get_mixnode_stake_saturation( &self, mix_id: MixId, - ) -> Result { - self.query_validator_api_fallible( + ) -> Result { + self.query_nym_api_fallible( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -385,8 +381,8 @@ impl Client { pub async fn get_mixnode_inclusion_probability( &self, mix_id: MixId, - ) -> Result { - self.query_validator_api_fallible( + ) -> Result { + self.query_nym_api_fallible( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -402,8 +398,8 @@ impl Client { pub async fn get_mixnode_avg_uptime( &self, mix_id: MixId, - ) -> Result { - self.query_validator_api_fallible( + ) -> Result { + self.query_nym_api_fallible( &[ routes::API_VERSION, routes::STATUS_ROUTES, @@ -419,8 +415,8 @@ impl Client { pub async fn blind_sign( &self, request_body: &BlindSignRequestBody, - ) -> Result { - self.post_validator_api( + ) -> Result { + self.post_nym_api( &[ routes::API_VERSION, routes::COCONUT_ROUTES, @@ -436,8 +432,8 @@ impl Client { pub async fn partial_bandwidth_credential( &self, request_body: &str, - ) -> Result { - self.post_validator_api( + ) -> Result { + self.post_nym_api( &[ routes::API_VERSION, routes::COCONUT_ROUTES, @@ -453,8 +449,8 @@ impl Client { pub async fn verify_bandwidth_credential( &self, request_body: &VerifyCredentialBody, - ) -> Result { - self.post_validator_api( + ) -> Result { + self.post_nym_api( &[ routes::API_VERSION, routes::COCONUT_ROUTES, diff --git a/common/client-libs/validator-client/src/validator_api/routes.rs b/common/client-libs/validator-client/src/nym_api/routes.rs similarity index 92% rename from common/client-libs/validator-client/src/validator_api/routes.rs rename to common/client-libs/validator-client/src/nym_api/routes.rs index 66a822b4fd..5b3d1c266d 100644 --- a/common/client-libs/validator-client/src/validator_api/routes.rs +++ b/common/client-libs/validator-client/src/nym_api/routes.rs @@ -1,9 +1,9 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::VALIDATOR_API_VERSION; +use network_defaults::NYM_API_VERSION; -pub const API_VERSION: &str = VALIDATOR_API_VERSION; +pub const API_VERSION: &str = NYM_API_VERSION; pub const MIXNODES: &str = "mixnodes"; pub const GATEWAYS: &str = "gateways"; diff --git a/common/commands/src/context/mod.rs b/common/commands/src/context/mod.rs index 98709d6d98..3a21634afb 100644 --- a/common/commands/src/context/mod.rs +++ b/common/commands/src/context/mod.rs @@ -7,8 +7,8 @@ use network_defaults::{ NymNetworkDetails, }; use tap::prelude::*; +pub use validator_client::nym_api::Client as NymApiClient; use validator_client::nymd::{self, AccountId, NymdClient, QueryNymdClient, SigningNymdClient}; -pub use validator_client::validator_api::Client as ValidatorApiClient; use crate::context::errors::ContextError; @@ -16,14 +16,14 @@ pub mod errors; pub type SigningClient = validator_client::nymd::NymdClient; pub type QueryClient = validator_client::nymd::NymdClient; -pub type SigningClientWithValidatorAPI = validator_client::Client; -pub type QueryClientWithValidatorAPI = validator_client::Client; +pub type SigningClientWithNymd = validator_client::Client; +pub type QueryClientWithNymd = validator_client::Client; #[derive(Debug)] pub struct ClientArgs { pub config_env_file: Option, pub nymd_url: Option, - pub validator_api_url: Option, + pub nym_api_url: Option, pub mnemonic: Option, pub mixnet_contract_address: Option, pub vesting_contract_address: Option, @@ -38,8 +38,8 @@ pub fn get_network_details(args: &ClientArgs) -> Result Result { +) -> Result { let client_config = validator_client::Config::try_from_nym_network_details(network_details) .tap_err(|err| log::error!("Failed to get client config - {err}"))?; @@ -126,9 +126,9 @@ pub fn create_signing_client_with_validator_api( } } -pub fn create_query_client_with_validator_api( +pub fn create_query_client_with_nym_api( network_details: &NymNetworkDetails, -) -> Result { +) -> Result { let client_config = validator_client::Config::try_from_nym_network_details(network_details) .tap_err(|err| log::error!("Failed to get client config - {err}"))?; diff --git a/common/commands/src/validator/mixnet/delegators/query_for_delegations.rs b/common/commands/src/validator/mixnet/delegators/query_for_delegations.rs index d816e65a0c..6867f51e81 100644 --- a/common/commands/src/validator/mixnet/delegators/query_for_delegations.rs +++ b/common/commands/src/validator/mixnet/delegators/query_for_delegations.rs @@ -4,7 +4,7 @@ use clap::Parser; use log::info; -use crate::context::SigningClientWithValidatorAPI; +use crate::context::SigningClientWithNymd; use crate::utils::{pretty_cosmwasm_coin, show_error_passthrough}; use comfy_table::Table; @@ -14,7 +14,7 @@ use mixnet_contract_common::{Delegation, PendingEpochEvent, PendingEpochEventKin #[derive(Debug, Parser)] pub struct Args {} -pub async fn execute(_args: Args, client: SigningClientWithValidatorAPI) { +pub async fn execute(_args: Args, client: SigningClientWithNymd) { info!( "Getting delegations for account {}...", client.nymd.address() @@ -48,14 +48,14 @@ pub async fn execute(_args: Args, client: SigningClientWithValidatorAPI) { } } -async fn to_iso_timestamp(block_height: u32, client: &SigningClientWithValidatorAPI) -> String { +async fn to_iso_timestamp(block_height: u32, client: &SigningClientWithNymd) -> String { match client.nymd.get_block_timestamp(Some(block_height)).await { Ok(res) => res.to_rfc3339(), Err(_e) => "-".to_string(), } } -async fn print_delegations(delegations: Vec, client: &SigningClientWithValidatorAPI) { +async fn print_delegations(delegations: Vec, client: &SigningClientWithNymd) { let mut table = Table::new(); table.set_header(vec!["Timestamp", "Mix Id", "Delegation", "Proxy"]); @@ -75,10 +75,7 @@ async fn print_delegations(delegations: Vec, client: &SigningClientW println!("{table}"); } -async fn print_delegation_events( - events: Vec, - client: &SigningClientWithValidatorAPI, -) { +async fn print_delegation_events(events: Vec, client: &SigningClientWithNymd) { let mut table = Table::new(); table.set_header(vec![ diff --git a/common/commands/src/validator/mixnet/query/query_all_gateways.rs b/common/commands/src/validator/mixnet/query/query_all_gateways.rs index 679ac08bcd..7904af2c4d 100644 --- a/common/commands/src/validator/mixnet/query/query_all_gateways.rs +++ b/common/commands/src/validator/mixnet/query/query_all_gateways.rs @@ -4,7 +4,7 @@ use clap::Parser; use comfy_table::Table; -use crate::context::QueryClientWithValidatorAPI; +use crate::context::QueryClientWithNymd; use crate::utils::{pretty_cosmwasm_coin, show_error}; #[derive(Debug, Parser)] @@ -14,8 +14,8 @@ pub struct Args { pub identity_key: Option, } -pub async fn query(args: Args, client: &QueryClientWithValidatorAPI) { - match client.validator_api.get_gateways().await { +pub async fn query(args: Args, client: &QueryClientWithNymd) { + match client.nym_api.get_gateways().await { Ok(res) => match args.identity_key { Some(identity_key) => { let node = res.iter().find(|node| { diff --git a/common/commands/src/validator/mixnet/query/query_all_mixnodes.rs b/common/commands/src/validator/mixnet/query/query_all_mixnodes.rs index 4ec6b25b7b..cdcd70672f 100644 --- a/common/commands/src/validator/mixnet/query/query_all_mixnodes.rs +++ b/common/commands/src/validator/mixnet/query/query_all_mixnodes.rs @@ -4,7 +4,7 @@ use clap::Parser; use comfy_table::Table; -use crate::context::QueryClientWithValidatorAPI; +use crate::context::QueryClientWithNymd; use crate::utils::{pretty_decimal_with_denom, show_error}; #[derive(Debug, Parser)] @@ -14,8 +14,8 @@ pub struct Args { pub identity_key: Option, } -pub async fn query(args: Args, client: &QueryClientWithValidatorAPI) { - match client.validator_api.get_mixnodes().await { +pub async fn query(args: Args, client: &QueryClientWithNymd) { + match client.nym_api.get_mixnodes().await { Ok(res) => match args.identity_key { Some(identity_key) => { let node = res.iter().find(|node| { diff --git a/common/credentials/Cargo.toml b/common/credentials/Cargo.toml index 58d43af03f..2f754253cc 100644 --- a/common/credentials/Cargo.toml +++ b/common/credentials/Cargo.toml @@ -13,7 +13,7 @@ thiserror = "1.0" # I guess temporarily until we get serde support in coconut up and running coconut-interface = { path = "../coconut-interface" } crypto = { path = "../crypto", features = ["rand", "asymmetric", "symmetric", "hashing"] } -validator-api-requests = { path = "../../validator-api/validator-api-requests" } +nym-api-requests = { path = "../../nym-api/nym-api-requests" } validator-client = { path = "../client-libs/validator-client" } [dev-dependencies] diff --git a/common/credentials/src/coconut/params.rs b/common/credentials/src/coconut/params.rs index 42b9205ebb..7e2260bc10 100644 --- a/common/credentials/src/coconut/params.rs +++ b/common/credentials/src/coconut/params.rs @@ -9,7 +9,7 @@ type Aes128Ctr = ctr::Ctr64LE; /// Hashing algorithm used during hkdf for ephemeral shared key generation per blinded signature /// response encryption. -pub type ValidatorApiCredentialHkdfAlgorithm = blake3::Hasher; +pub type NymApiCredentialHkdfAlgorithm = blake3::Hasher; /// Encryption algorithm used for end-to-end encryption of blinded signature response -pub type ValidatorApiCredentialEncryptionAlgorithm = Aes128Ctr; +pub type NymApiCredentialEncryptionAlgorithm = Aes128Ctr; diff --git a/common/credentials/src/coconut/utils.rs b/common/credentials/src/coconut/utils.rs index f701938d59..0305bb845b 100644 --- a/common/credentials/src/coconut/utils.rs +++ b/common/credentials/src/coconut/utils.rs @@ -8,13 +8,11 @@ use coconut_interface::{ use crypto::asymmetric::encryption::PublicKey; use crypto::shared_key::recompute_shared_key; use crypto::symmetric::stream_cipher; -use validator_api_requests::coconut::BlindSignRequestBody; +use nym_api_requests::coconut::BlindSignRequestBody; use validator_client::client::CoconutApiClient; use crate::coconut::bandwidth::{BandwidthVoucher, PRIVATE_ATTRIBUTES, PUBLIC_ATTRIBUTES}; -use crate::coconut::params::{ - ValidatorApiCredentialEncryptionAlgorithm, ValidatorApiCredentialHkdfAlgorithm, -}; +use crate::coconut::params::{NymApiCredentialEncryptionAlgorithm, NymApiCredentialHkdfAlgorithm}; use crate::error::Error; pub async fn obtain_aggregate_verification_key( @@ -66,11 +64,11 @@ async fn obtain_partial_credential( let remote_key = PublicKey::from_bytes(&response.remote_key)?; let encryption_key = recompute_shared_key::< - ValidatorApiCredentialEncryptionAlgorithm, - ValidatorApiCredentialHkdfAlgorithm, + NymApiCredentialEncryptionAlgorithm, + NymApiCredentialHkdfAlgorithm, >(&remote_key, attributes.encryption_key()); - let zero_iv = stream_cipher::zero_iv::(); - let blinded_signature_bytes = stream_cipher::decrypt::( + let zero_iv = stream_cipher::zero_iv::(); + let blinded_signature_bytes = stream_cipher::decrypt::( &encryption_key, &zero_iv, &encrypted_signature, diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index 48e9a7b483..fc7e19332a 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -69,8 +69,8 @@ pub struct Config { /// due to being unable to get the list of nodes. retry_timeout: Duration, - /// URLs to the validator apis for obtaining network topology. - validator_api_urls: Vec, + /// URLs to the nym apis for obtaining network topology. + nym_api_urls: Vec, } impl Config { @@ -132,15 +132,15 @@ impl ConfigBuilder { self } - pub fn validator_api_urls(mut self, validator_api_urls: Vec) -> Self { - self.0.validator_api_urls = validator_api_urls; + pub fn nym_api_urls(mut self, nym_api_urls: Vec) -> Self { + self.0.nym_api_urls = nym_api_urls; self } pub fn build(self) -> Config { // panics here are fine as those are only ever constructed at the initial setup assert!( - !self.0.validator_api_urls.is_empty(), + !self.0.nym_api_urls.is_empty(), "at least one validator endpoint must be provided", ); self.0 @@ -159,7 +159,7 @@ impl Default for ConfigBuilder { tested_nodes_batch_size: DEFAULT_BATCH_SIZE, testing_interval: DEFAULT_TESTING_INTERVAL, retry_timeout: DEFAULT_RETRY_TIMEOUT, - validator_api_urls: vec![], + nym_api_urls: vec![], }) } } @@ -186,7 +186,7 @@ impl VerlocMeasurer { identity: Arc, shutdown_listener: ShutdownListener, ) -> Self { - config.validator_api_urls.shuffle(&mut thread_rng()); + config.nym_api_urls.shuffle(&mut thread_rng()); VerlocMeasurer { packet_sender: Arc::new(PacketSender::new( @@ -204,24 +204,21 @@ impl VerlocMeasurer { )), shutdown_listener, currently_used_api: 0, - validator_client: validator_client::ApiClient::new( - config.validator_api_urls[0].clone(), - ), + validator_client: validator_client::ApiClient::new(config.nym_api_urls[0].clone()), config, results: AtomicVerlocResult::new(), } } - fn use_next_validator_api(&mut self) { - if self.config.validator_api_urls.len() == 1 { + fn use_next_nym_api(&mut self) { + if self.config.nym_api_urls.len() == 1 { warn!("There's only a single validator API available - it won't be possible to use a different one"); return; } - self.currently_used_api = - (self.currently_used_api + 1) % self.config.validator_api_urls.len(); + self.currently_used_api = (self.currently_used_api + 1) % self.config.nym_api_urls.len(); self.validator_client - .change_validator_api(self.config.validator_api_urls[self.currently_used_api].clone()) + .change_nym_api(self.config.nym_api_urls[self.currently_used_api].clone()) } pub fn get_verloc_results_pointer(&self) -> AtomicVerlocResult { @@ -308,7 +305,7 @@ impl VerlocMeasurer { "failed to obtain list of mixnodes from the validator - {}. Going to attempt to use another validator API in the next run", err ); - self.use_next_validator_api(); + self.use_next_nym_api(); sleep(self.config.retry_timeout).await; continue; } diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index d7b01622b1..3a2daeed42 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -355,14 +355,14 @@ pub const DEFAULT_WEBSOCKET_LISTENING_PORT: u16 = 1977; // 'SOCKS5' CLIENT pub const DEFAULT_SOCKS5_LISTENING_PORT: u16 = 1080; -// VALIDATOR-API -pub const DEFAULT_VALIDATOR_API_PORT: u16 = 8080; +// NYM-API +pub const DEFAULT_NYM_API_PORT: u16 = 8080; -pub const VALIDATOR_API_VERSION: &str = "v1"; +pub const NYM_API_VERSION: &str = "v1"; // REWARDING -/// We'll be assuming a few more things, profit margin and cost function. Since we don't have relialable package measurement, we'll be using uptime. We'll also set the value of 1 Nym to 1 $, to be able to translate interval costs to Nyms. We'll also assume a cost of 40$ per interval(month), converting that to Nym at our 1$ rate translates to 40_000_000 uNyms +/// We'll be assuming a few more things, profit margin and cost function. Since we don't have reliable package measurement, we'll be using uptime. We'll also set the value of 1 Nym to 1 $, to be able to translate interval costs to Nyms. We'll also assume a cost of 40$ per interval(month), converting that to Nym at our 1$ rate translates to 40_000_000 uNyms // pub const DEFAULT_OPERATOR_INTERVAL_COST: u64 = 40_000_000; // 40$/(30 days) at 1 Nym == 1$ // pub const DEFAULT_OPERATOR_INTERVAL_COST: u64 = 55_556; // 40$/1hr at 1 Nym == 1$ // pub const DEFAULT_OPERATOR_INTERVAL_COST: u64 = 9259; // 40$/1hr/6 at 1 Nym == 1$ diff --git a/common/types/src/error.rs b/common/types/src/error.rs index b0874ba7aa..864a6f6eb2 100644 --- a/common/types/src/error.rs +++ b/common/types/src/error.rs @@ -1,7 +1,7 @@ use serde::{Serialize, Serializer}; use std::io; use thiserror::Error; -use validator_client::validator_api::error::ValidatorAPIError; +use validator_client::nym_api::error::NymAPIError; use validator_client::{nymd::error::NymdError, ValidatorClientError}; // TODO: ask @MS why this even exists @@ -23,9 +23,9 @@ pub enum TypesError { source: eyre::Report, }, #[error("{source}")] - ValidatorApiError { + NymApiError { #[from] - source: ValidatorAPIError, + source: NymAPIError, }, #[error("{source}")] IOError { @@ -52,8 +52,8 @@ pub enum TypesError { #[from] source: cosmwasm_std::DecimalRangeExceeded, }, - #[error("No validator API URL configured")] - NoValidatorApiUrlConfigured, + #[error("No nym API URL configured")] + NoNymApiUrlConfigured, #[error("{0} is not a valid amount string")] InvalidAmount(String), #[error("{0} is not a valid denomination string")] @@ -88,10 +88,10 @@ impl Serialize for TypesError { impl From for TypesError { fn from(e: ValidatorClientError) -> Self { match e { - ValidatorClientError::ValidatorAPIError { source } => source.into(), + ValidatorClientError::NymAPIError { source } => source.into(), ValidatorClientError::MalformedUrlProvided(e) => e.into(), ValidatorClientError::NymdError(e) => e.into(), - ValidatorClientError::NoAPIUrlAvailable => TypesError::NoValidatorApiUrlConfigured, + ValidatorClientError::NoAPIUrlAvailable => TypesError::NoNymApiUrlConfigured, } } } diff --git a/contracts/mixnet/src/rewards/transactions.rs b/contracts/mixnet/src/rewards/transactions.rs index e25e4c1bd8..d1552bb50b 100644 --- a/contracts/mixnet/src/rewards/transactions.rs +++ b/contracts/mixnet/src/rewards/transactions.rs @@ -408,7 +408,7 @@ pub mod tests { let env = test.env(); // note: we don't have to test for cases where `is_unbonding` is set to true on a mixnode - // since before performing the validator-api should clear out the event queue + // since before performing the nym-api should clear out the event queue // manually adjust delegation info as to indicate the rewarding information shouldnt get removed let mut rewarding_details = storage::MIXNODE_REWARDING diff --git a/explorer-api/src/client.rs b/explorer-api/src/client.rs index 129a394d31..717a0800e5 100644 --- a/explorer-api/src/client.rs +++ b/explorer-api/src/client.rs @@ -21,7 +21,7 @@ impl ThreadsafeValidatorClient { } pub(crate) fn api_endpoint(&self) -> &Url { - self.0.validator_api.current_url() + self.0.nym_api.current_url() } } diff --git a/explorer-api/src/main.rs b/explorer-api/src/main.rs index 47dddf9f54..5154c87e78 100644 --- a/explorer-api/src/main.rs +++ b/explorer-api/src/main.rs @@ -54,8 +54,8 @@ impl ExplorerApi { async fn run(&mut self) { info!("Explorer API starting up..."); - let validator_api_url = self.state.inner.validator_client.api_endpoint(); - info!("Using validator API - {}", validator_api_url); + let nym_api_url = self.state.inner.validator_client.api_endpoint(); + info!("Using validator API - {}", nym_api_url); let shutdown = ShutdownNotifier::default(); diff --git a/explorer-api/src/mix_node/econ_stats.rs b/explorer-api/src/mix_node/econ_stats.rs index cde29d3a86..30d89a29b2 100644 --- a/explorer-api/src/mix_node/econ_stats.rs +++ b/explorer-api/src/mix_node/econ_stats.rs @@ -13,31 +13,26 @@ pub(crate) async fn retrieve_mixnode_econ_stats( ) -> Option { let stake_saturation = client .0 - .validator_api + .nym_api .get_mixnode_stake_saturation(mix_id) .await .ok()?; let inclusion_probability = client .0 - .validator_api + .nym_api .get_mixnode_inclusion_probability(mix_id) .await .ok()?; let reward_estimation = client .0 - .validator_api + .nym_api .get_mixnode_reward_estimation(mix_id) .await .ok()?; - let uptime_response = client - .0 - .validator_api - .get_mixnode_avg_uptime(mix_id) - .await - .ok()?; + let uptime_response = client.0.nym_api.get_mixnode_avg_uptime(mix_id).await.ok()?; Some(EconomicDynamicsStats { stake_saturation: best_effort_small_dec_to_f64(stake_saturation.saturation) as f32, diff --git a/explorer/.env.prod b/explorer/.env.prod index b1b1fe0d4c..70bd50c7ca 100644 --- a/explorer/.env.prod +++ b/explorer/.env.prod @@ -1,5 +1,5 @@ EXPLORER_API_URL=https://explorer.nymtech.net/api/v1 -VALIDATOR_API_URL=https://validator.nymtech.net +NYM_API_URL=https://validator.nymtech.net VALIDATOR_URL=https://rpc.nymtech.net BIG_DIPPER_URL=https://blocks.nymtech.net CURRENCY_DENOM=unym diff --git a/explorer/.env.qa b/explorer/.env.qa index 60b30e1bd1..dd7052ce4d 100644 --- a/explorer/.env.qa +++ b/explorer/.env.qa @@ -1,5 +1,5 @@ EXPLORER_API_URL=https://qa-explorer.nymtech.net/api/v1 -VALIDATOR_API_URL=https://qa-validator-api.nymtech.net +NYM_API_URL=https://qa-validator-api.nymtech.net VALIDATOR_URL=https://qa-validator.nymtech.net BIG_DIPPER_URL=https://qa-blocks.nymtech.net CURRENCY_DENOM=unym diff --git a/explorer/src/api/constants.ts b/explorer/src/api/constants.ts index fb7216b64f..dc6124c53d 100644 --- a/explorer/src/api/constants.ts +++ b/explorer/src/api/constants.ts @@ -1,6 +1,6 @@ // master APIs export const API_BASE_URL = process.env.EXPLORER_API_URL; -export const VALIDATOR_API_BASE_URL = process.env.VALIDATOR_API_URL; +export const NYM_API_BASE_URL = process.env.NYM_API_URL; export const VALIDATOR_BASE_URL = process.env.VALIDATOR_URL; export const BIG_DIPPER = process.env.BIG_DIPPER_URL; @@ -9,12 +9,12 @@ export const OVERVIEW_API = `${API_BASE_URL}/overview`; export const MIXNODE_PING = `${API_BASE_URL}/ping`; export const MIXNODES_API = `${API_BASE_URL}/mix-nodes`; export const MIXNODE_API = `${API_BASE_URL}/mix-node`; -export const GATEWAYS_API = `${VALIDATOR_API_BASE_URL}/api/v1/gateways`; +export const GATEWAYS_API = `${NYM_API_BASE_URL}/api/v1/gateways`; export const VALIDATORS_API = `${VALIDATOR_BASE_URL}/validators`; -export const BLOCK_API = `${VALIDATOR_API_BASE_URL}/block`; +export const BLOCK_API = `${NYM_API_BASE_URL}/block`; export const COUNTRY_DATA_API = `${API_BASE_URL}/countries`; -export const UPTIME_STORY_API = `${VALIDATOR_API_BASE_URL}/api/v1/status/mixnode`; // add ID then '/history' to this. -export const UPTIME_STORY_API_GATEWAY = `${VALIDATOR_API_BASE_URL}/api/v1/status/gateway`; // add ID then '/history' or '/report' to this. +export const UPTIME_STORY_API = `${NYM_API_BASE_URL}/api/v1/status/mixnode`; // add ID then '/history' to this. +export const UPTIME_STORY_API_GATEWAY = `${NYM_API_BASE_URL}/api/v1/status/gateway`; // add ID then '/history' or '/report' to this. // errors export const MIXNODE_API_ERROR = "We're having trouble finding that record, please try again or Contact Us."; diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index ab26fccea7..a531722d06 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -64,7 +64,7 @@ network-defaults = { path = "../common/network-defaults" } nymsphinx = { path = "../common/nymsphinx" } pemstore = { path = "../common/pemstore" } statistics-common = { path = "../common/statistics" } -validator-api-requests = { path = "../validator-api/validator-api-requests" } +nym-api-requests = { path = "../nym-api/nym-api-requests" } validator-client = { path = "../common/client-libs/validator-client", features = [ "nymd-client", ] } @@ -75,7 +75,7 @@ coconut = [ "coconut-interface", "gateway-requests/coconut", "credentials/coconut", - "validator-api-requests/coconut", + "nym-api-requests/coconut", ] [build-dependencies] diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index dca393213a..abd668b33f 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -39,9 +39,9 @@ pub struct Init { #[clap(long)] datastore: Option, - /// Comma separated list of endpoints of the validators APIs + /// Comma separated list of endpoints of nym APIs #[clap(long)] - validator_apis: Option, + nym_apis: Option, /// Comma separated list of endpoints of the validator #[clap(long)] @@ -75,7 +75,7 @@ impl From for OverrideConfig { clients_port: init_config.clients_port, datastore: init_config.datastore, announce_host: init_config.announce_host, - validator_apis: init_config.validator_apis, + nym_apis: init_config.nym_apis, validators: init_config.validators, mnemonic: init_config.mnemonic, @@ -165,7 +165,7 @@ mod tests { clients_port: Some(43), announce_host: Some("foo-announce-host".to_string()), datastore: Some("foo-datastore".to_string()), - validator_apis: None, + nym_apis: None, validators: None, mnemonic: None, statistics_service_url: None, diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index ef2ec235e8..b3fbb6f537 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -55,7 +55,7 @@ pub(crate) struct OverrideConfig { announce_host: Option, enabled_statistics: Option, statistics_service_url: Option, - validator_apis: Option, + nym_apis: Option, validators: Option, mnemonic: Option, @@ -119,11 +119,11 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi } } - if let Some(raw_validators) = args.validator_apis { - config = config.with_custom_validator_apis(parse_validators(&raw_validators)); + if let Some(raw_validators) = args.nym_apis { + config = config.with_custom_nym_apis(parse_validators(&raw_validators)); } else if std::env::var(CONFIGURED).is_ok() { if let Some(raw_validators) = read_var_if_not_default(API_VALIDATOR) { - config = config.with_custom_validator_apis(::config::parse_validators(&raw_validators)) + config = config.with_custom_nym_apis(::config::parse_validators(&raw_validators)) } } diff --git a/gateway/src/commands/run.rs b/gateway/src/commands/run.rs index 37320877fe..e91f260d1b 100644 --- a/gateway/src/commands/run.rs +++ b/gateway/src/commands/run.rs @@ -39,9 +39,9 @@ pub struct Run { #[clap(long)] datastore: Option, - /// Comma separated list of endpoints of the validators APIs + /// Comma separated list of endpoints of the nym APIs #[clap(long)] - validator_apis: Option, + nym_apis: Option, /// Comma separated list of endpoints of the validator #[clap(long)] @@ -75,7 +75,7 @@ impl From for OverrideConfig { clients_port: run_config.clients_port, datastore: run_config.datastore, announce_host: run_config.announce_host, - validator_apis: run_config.validator_apis, + nym_apis: run_config.nym_apis, validators: run_config.validators, mnemonic: run_config.mnemonic, diff --git a/gateway/src/config/mod.rs b/gateway/src/config/mod.rs index ac4f734dad..9eb15c1c5a 100644 --- a/gateway/src/config/mod.rs +++ b/gateway/src/config/mod.rs @@ -144,8 +144,8 @@ impl Config { self } - pub fn with_custom_validator_apis(mut self, validator_api_urls: Vec) -> Self { - self.gateway.validator_api_urls = validator_api_urls; + pub fn with_custom_nym_apis(mut self, nym_api_urls: Vec) -> Self { + self.gateway.nym_api_urls = nym_api_urls; self } @@ -240,8 +240,8 @@ impl Config { self.gateway.statistics_service_url.clone() } - pub fn get_validator_api_endpoints(&self) -> Vec { - self.gateway.validator_api_urls.clone() + pub fn get_nym_api_endpoints(&self) -> Vec { + self.gateway.nym_api_urls.clone() } #[cfg(feature = "coconut")] @@ -359,8 +359,8 @@ pub struct Gateway { /// Domain address of the statistics service statistics_service_url: Url, - /// Addresses to APIs running on validator from which the node gets the view of the network. - validator_api_urls: Vec, + /// Addresses to APIs from which the node gets the view of the network. + nym_api_urls: Vec, /// Addresses to validators which the node uses to check for double spending of ERC20 tokens. validator_nymd_urls: Vec, @@ -418,7 +418,7 @@ impl Default for Gateway { public_sphinx_key_file: Default::default(), enabled_statistics: false, statistics_service_url: Url::from_str(STATISTICS_SERVICE_DOMAIN_ADDRESS).expect("Invalid default statistics service URL"), - validator_api_urls: vec![Url::from_str(API_VALIDATOR).expect("Invalid default API URL")], + nym_api_urls: vec![Url::from_str(API_VALIDATOR).expect("Invalid default API URL")], validator_nymd_urls: vec![Url::from_str(NYMD_VALIDATOR).expect("Invalid default nymd URL")], cosmos_mnemonic: bip39::Mnemonic::from_str("exact antique hybrid width raise anchor puzzle degree fee quit long crack net vague hip despair write put useless civil mechanic broom music day").unwrap(), nym_root_directory: Config::default_root_directory(), diff --git a/gateway/src/config/template.rs b/gateway/src/config/template.rs index faba004a50..0d1759e820 100644 --- a/gateway/src/config/template.rs +++ b/gateway/src/config/template.rs @@ -60,8 +60,8 @@ enabled_statistics = {{ gateway.enabled_statistics }} statistics_service_url = '{{ gateway.statistics_service_url }}' # Addresses to APIs running on validator from which the node gets the view of the network. -validator_api_urls = [ - {{#each gateway.validator_api_urls }} +nym_api_urls = [ + {{#each gateway.nym_api_urls }} '{{this}}', {{/each}} ] diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index e7c2658daa..40ca0d7715 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -56,8 +56,8 @@ pub(crate) enum RequestHandlingError { APIError(#[from] validator_client::ValidatorClientError), #[cfg(feature = "coconut")] - #[error("Not enough validator API endpoints provided. Needed {needed}, received {received}")] - NotEnoughValidatorAPIs { received: usize, needed: usize }, + #[error("Not enough nym API endpoints provided. Needed {needed}, received {received}")] + NotEnoughNymAPIs { received: usize, needed: usize }, #[cfg(feature = "coconut")] #[error("There was a problem with the proposal id: {reason}")] diff --git a/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs b/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs index e83c23e5e9..ba53fe4dbd 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs @@ -21,7 +21,7 @@ const ONE_HOUR_SEC: u64 = 3600; const MAX_FEEGRANT_UNYM: u128 = 10000; pub(crate) struct CoconutVerifier { - api_clients: Vec, + nym_api_clients: Vec, nymd_client: Client, mix_denom_base: String, aggregated_verification_key: VerificationKey, @@ -35,13 +35,13 @@ impl CoconutVerifier { aggregated_verification_key: VerificationKey, ) -> Result { if api_clients.is_empty() { - return Err(RequestHandlingError::NotEnoughValidatorAPIs { + return Err(RequestHandlingError::NotEnoughNymAPIs { received: 0, needed: 1, }); } Ok(CoconutVerifier { - api_clients, + nym_api_clients: api_clients, nymd_client, mix_denom_base, aggregated_verification_key, @@ -87,12 +87,12 @@ impl CoconutVerifier { }); } - let req = validator_api_requests::coconut::VerifyCredentialBody::new( + let req = nym_api_requests::coconut::VerifyCredentialBody::new( credential.clone(), proposal_id, self.nymd_client.nymd.address().clone(), ); - for client in self.api_clients.iter() { + for client in self.nym_api_clients.iter() { self.nymd_client .nymd .grant_allowance( @@ -115,7 +115,7 @@ impl CoconutVerifier { ) .await?; if !ret?.verification_result { - debug!("Validator {} didn't accept the credential. It will probably vote No on the spending proposal", client.api_client.validator_api.current_url()); + debug!("Validator {} didn't accept the credential. It will probably vote No on the spending proposal", client.api_client.nym_api_client.current_url()); } } diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index c04091ffdc..7500302787 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -231,12 +231,12 @@ where } fn random_api_client(&self) -> validator_client::ApiClient { - let endpoints = self.config.get_validator_api_endpoints(); - let validator_api = endpoints + let endpoints = self.config.get_nym_api_endpoints(); + let nym_api = endpoints .choose(&mut thread_rng()) .expect("The list of validator apis is empty"); - validator_client::ApiClient::new(validator_api.clone()) + validator_client::ApiClient::new(nym_api.clone()) } #[cfg(feature = "coconut")] diff --git a/mixnode/src/commands/mod.rs b/mixnode/src/commands/mod.rs index 6ec353e76b..2edad136f9 100644 --- a/mixnode/src/commands/mod.rs +++ b/mixnode/src/commands/mod.rs @@ -96,10 +96,10 @@ fn override_config(mut config: Config, args: OverrideConfig) -> Config { } if let Some(ref raw_validators) = args.validators { - config = config.with_custom_validator_apis(parse_validators(raw_validators)); + config = config.with_custom_nym_apis(parse_validators(raw_validators)); } else if std::env::var(CONFIGURED).is_ok() { if let Some(raw_validators) = read_var_if_not_default(API_VALIDATOR) { - config = config.with_custom_validator_apis(::config::parse_validators(&raw_validators)) + config = config.with_custom_nym_apis(::config::parse_validators(&raw_validators)) } } diff --git a/mixnode/src/config/mod.rs b/mixnode/src/config/mod.rs index 3f5208cee8..bc9278bc85 100644 --- a/mixnode/src/config/mod.rs +++ b/mixnode/src/config/mod.rs @@ -155,8 +155,8 @@ impl Config { self } - pub fn with_custom_validator_apis(mut self, validator_api_urls: Vec) -> Self { - self.mixnode.validator_api_urls = validator_api_urls; + pub fn with_custom_nym_apis(mut self, nym_api_urls: Vec) -> Self { + self.mixnode.nym_api_urls = nym_api_urls; self } @@ -233,8 +233,8 @@ impl Config { self.mixnode.public_sphinx_key_file.clone() } - pub fn get_validator_api_endpoints(&self) -> Vec { - self.mixnode.validator_api_urls.clone() + pub fn get_nym_api_endpoints(&self) -> Vec { + self.mixnode.nym_api_urls.clone() } pub fn get_node_stats_logging_delay(&self) -> Duration { @@ -369,8 +369,8 @@ struct MixNode { /// Path to file containing public sphinx key. public_sphinx_key_file: PathBuf, - /// Addresses to APIs running on validator from which the node gets the view of the network. - validator_api_urls: Vec, + /// Addresses to nym APIs from which the node gets the view of the network. + nym_api_urls: Vec, /// nym_home_directory specifies absolute path to the home nym MixNodes directory. /// It is expected to use default value and hence .toml file should not redefine this field. @@ -412,7 +412,7 @@ impl Default for MixNode { public_identity_key_file: Default::default(), private_sphinx_key_file: Default::default(), public_sphinx_key_file: Default::default(), - validator_api_urls: vec![Url::from_str(API_VALIDATOR).expect("Invalid default API URL")], + nym_api_urls: vec![Url::from_str(API_VALIDATOR).expect("Invalid default API URL")], nym_root_directory: Config::default_root_directory(), wallet_address: "nymXXXXXXXX".to_string(), } diff --git a/mixnode/src/config/template.rs b/mixnode/src/config/template.rs index 2af12a195b..f222275083 100644 --- a/mixnode/src/config/template.rs +++ b/mixnode/src/config/template.rs @@ -54,8 +54,8 @@ verloc_port = {{ mixnode.verloc_port }} http_api_port = {{ mixnode.http_api_port }} # Addresses to APIs running on validator from which the node gets the view of the network. -validator_api_urls = [ - {{#each mixnode.validator_api_urls }} +nym_api_urls = [ + {{#each mixnode.nym_api_urls }} '{{this}}', {{/each}} ] diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index 0bca9b31b0..e986c4fa67 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -245,7 +245,7 @@ impl MixNode { .tested_nodes_batch_size(self.config.get_measurement_tested_nodes_batch_size()) .testing_interval(self.config.get_measurement_testing_interval()) .retry_timeout(self.config.get_measurement_retry_timeout()) - .validator_api_urls(self.config.get_validator_api_endpoints()) + .nym_api_urls(self.config.get_nym_api_endpoints()) .build(); let mut verloc_measurer = @@ -256,12 +256,12 @@ impl MixNode { } fn random_api_client(&self) -> validator_client::ApiClient { - let endpoints = self.config.get_validator_api_endpoints(); - let validator_api = endpoints + let endpoints = self.config.get_nym_api_endpoints(); + let nym_api = endpoints .choose(&mut thread_rng()) .expect("The list of validator apis is empty"); - validator_client::ApiClient::new(validator_api.clone()) + validator_client::ApiClient::new(nym_api.clone()) } // TODO: ask DH whether this function still makes sense in ^0.10 diff --git a/validator-api/Cargo.toml b/nym-api/Cargo.toml similarity index 97% rename from validator-api/Cargo.toml rename to nym-api/Cargo.toml index ee2c169f65..643e9ecd23 100644 --- a/validator-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -84,7 +84,7 @@ nymsphinx = { path = "../common/nymsphinx" } pemstore = { path = "../common/pemstore", optional = true } task = { path = "../common/task" } topology = { path = "../common/topology" } -validator-api-requests = { path = "validator-api-requests" } +nym-api-requests = { path = "nym-api-requests" } validator-client = { path = "../common/client-libs/validator-client", features = [ "nymd-client", ] } @@ -97,7 +97,7 @@ coconut = [ "cw3", "gateway-client/coconut", "credentials/coconut", - "validator-api-requests/coconut", + "nym-api-requests/coconut", "nymcoconut", "coconut-dkg-common", "dkg", diff --git a/validator-api/README.md b/nym-api/README.md similarity index 100% rename from validator-api/README.md rename to nym-api/README.md diff --git a/validator-api/Rocket.toml b/nym-api/Rocket.toml similarity index 100% rename from validator-api/Rocket.toml rename to nym-api/Rocket.toml diff --git a/validator-api/build.rs b/nym-api/build.rs similarity index 92% rename from validator-api/build.rs rename to nym-api/build.rs index 1e967f0aab..6c92dffc59 100644 --- a/validator-api/build.rs +++ b/nym-api/build.rs @@ -5,7 +5,7 @@ use vergen::{vergen, Config}; #[tokio::main] async fn main() { let out_dir = env::var("OUT_DIR").unwrap(); - let database_path = format!("{}/validator-api-example.sqlite", out_dir); + let database_path = format!("{}/nym-api-example.sqlite", out_dir); let mut conn = SqliteConnection::connect(&format!("sqlite://{}?mode=rwc", database_path)) .await diff --git a/validator-api/migrations/20210722120000_create_initial_tables.sql b/nym-api/migrations/20210722120000_create_initial_tables.sql similarity index 100% rename from validator-api/migrations/20210722120000_create_initial_tables.sql rename to nym-api/migrations/20210722120000_create_initial_tables.sql diff --git a/validator-api/migrations/20210819120000_monitor_runs.sql b/nym-api/migrations/20210819120000_monitor_runs.sql similarity index 100% rename from validator-api/migrations/20210819120000_monitor_runs.sql rename to nym-api/migrations/20210819120000_monitor_runs.sql diff --git a/validator-api/migrations/20210824120000_rewarding_data.sql b/nym-api/migrations/20210824120000_rewarding_data.sql similarity index 100% rename from validator-api/migrations/20210824120000_rewarding_data.sql rename to nym-api/migrations/20210824120000_rewarding_data.sql diff --git a/validator-api/migrations/20211018120000_core_nodes_testing.sql b/nym-api/migrations/20211018120000_core_nodes_testing.sql similarity index 100% rename from validator-api/migrations/20211018120000_core_nodes_testing.sql rename to nym-api/migrations/20211018120000_core_nodes_testing.sql diff --git a/validator-api/migrations/20211101110000_no_gateway_rewarding.sql b/nym-api/migrations/20211101110000_no_gateway_rewarding.sql similarity index 100% rename from validator-api/migrations/20211101110000_no_gateway_rewarding.sql rename to nym-api/migrations/20211101110000_no_gateway_rewarding.sql diff --git a/validator-api/migrations/20220121120000_epoch_interval_renaming.sql b/nym-api/migrations/20220121120000_epoch_interval_renaming.sql similarity index 100% rename from validator-api/migrations/20220121120000_epoch_interval_renaming.sql rename to nym-api/migrations/20220121120000_epoch_interval_renaming.sql diff --git a/validator-api/migrations/20220323120000_drop_foreign_keys_constraints.sql b/nym-api/migrations/20220323120000_drop_foreign_keys_constraints.sql similarity index 100% rename from validator-api/migrations/20220323120000_drop_foreign_keys_constraints.sql rename to nym-api/migrations/20220323120000_drop_foreign_keys_constraints.sql diff --git a/validator-api/migrations/20220325120000_signed_deposits.sql b/nym-api/migrations/20220325120000_signed_deposits.sql similarity index 100% rename from validator-api/migrations/20220325120000_signed_deposits.sql rename to nym-api/migrations/20220325120000_signed_deposits.sql diff --git a/validator-api/migrations/20220410222400_add_timestamp_indexes.sql b/nym-api/migrations/20220410222400_add_timestamp_indexes.sql similarity index 100% rename from validator-api/migrations/20220410222400_add_timestamp_indexes.sql rename to nym-api/migrations/20220410222400_add_timestamp_indexes.sql diff --git a/validator-api/migrations/20220804120000_mixnet_contract_v2.sql b/nym-api/migrations/20220804120000_mixnet_contract_v2.sql similarity index 100% rename from validator-api/migrations/20220804120000_mixnet_contract_v2.sql rename to nym-api/migrations/20220804120000_mixnet_contract_v2.sql diff --git a/validator-api/validator-api-requests/Cargo.toml b/nym-api/nym-api-requests/Cargo.toml similarity index 95% rename from validator-api/validator-api-requests/Cargo.toml rename to nym-api/nym-api-requests/Cargo.toml index ecd29e78a4..6787dcacfa 100644 --- a/validator-api/validator-api-requests/Cargo.toml +++ b/nym-api/nym-api-requests/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "validator-api-requests" +name = "nym-api-requests" version = "0.1.0" edition = "2021" diff --git a/validator-api/validator-api-requests/src/coconut.rs b/nym-api/nym-api-requests/src/coconut.rs similarity index 100% rename from validator-api/validator-api-requests/src/coconut.rs rename to nym-api/nym-api-requests/src/coconut.rs diff --git a/validator-api/validator-api-requests/src/lib.rs b/nym-api/nym-api-requests/src/lib.rs similarity index 100% rename from validator-api/validator-api-requests/src/lib.rs rename to nym-api/nym-api-requests/src/lib.rs diff --git a/validator-api/validator-api-requests/src/models.rs b/nym-api/nym-api-requests/src/models.rs similarity index 100% rename from validator-api/validator-api-requests/src/models.rs rename to nym-api/nym-api-requests/src/models.rs diff --git a/validator-api/src/coconut/client.rs b/nym-api/src/coconut/client.rs similarity index 100% rename from validator-api/src/coconut/client.rs rename to nym-api/src/coconut/client.rs diff --git a/validator-api/src/coconut/comm.rs b/nym-api/src/coconut/comm.rs similarity index 100% rename from validator-api/src/coconut/comm.rs rename to nym-api/src/coconut/comm.rs diff --git a/validator-api/src/coconut/deposit.rs b/nym-api/src/coconut/deposit.rs similarity index 99% rename from validator-api/src/coconut/deposit.rs rename to nym-api/src/coconut/deposit.rs index 2112b3d76a..dcee8cebc0 100644 --- a/validator-api/src/coconut/deposit.rs +++ b/nym-api/src/coconut/deposit.rs @@ -8,7 +8,7 @@ use coconut_bandwidth_contract_common::events::{ use credentials::coconut::bandwidth::BandwidthVoucher; use crypto::asymmetric::encryption; use crypto::asymmetric::identity::{self, Signature}; -use validator_api_requests::coconut::BlindSignRequestBody; +use nym_api_requests::coconut::BlindSignRequestBody; use validator_client::nymd::TxResponse; use super::error::{CoconutError, Result}; diff --git a/validator-api/src/coconut/dkg/client.rs b/nym-api/src/coconut/dkg/client.rs similarity index 100% rename from validator-api/src/coconut/dkg/client.rs rename to nym-api/src/coconut/dkg/client.rs diff --git a/validator-api/src/coconut/dkg/complaints.rs b/nym-api/src/coconut/dkg/complaints.rs similarity index 100% rename from validator-api/src/coconut/dkg/complaints.rs rename to nym-api/src/coconut/dkg/complaints.rs diff --git a/validator-api/src/coconut/dkg/controller.rs b/nym-api/src/coconut/dkg/controller.rs similarity index 100% rename from validator-api/src/coconut/dkg/controller.rs rename to nym-api/src/coconut/dkg/controller.rs diff --git a/validator-api/src/coconut/dkg/dealing.rs b/nym-api/src/coconut/dkg/dealing.rs similarity index 100% rename from validator-api/src/coconut/dkg/dealing.rs rename to nym-api/src/coconut/dkg/dealing.rs diff --git a/validator-api/src/coconut/dkg/mod.rs b/nym-api/src/coconut/dkg/mod.rs similarity index 100% rename from validator-api/src/coconut/dkg/mod.rs rename to nym-api/src/coconut/dkg/mod.rs diff --git a/validator-api/src/coconut/dkg/public_key.rs b/nym-api/src/coconut/dkg/public_key.rs similarity index 100% rename from validator-api/src/coconut/dkg/public_key.rs rename to nym-api/src/coconut/dkg/public_key.rs diff --git a/validator-api/src/coconut/dkg/state.rs b/nym-api/src/coconut/dkg/state.rs similarity index 100% rename from validator-api/src/coconut/dkg/state.rs rename to nym-api/src/coconut/dkg/state.rs diff --git a/validator-api/src/coconut/dkg/verification_key.rs b/nym-api/src/coconut/dkg/verification_key.rs similarity index 100% rename from validator-api/src/coconut/dkg/verification_key.rs rename to nym-api/src/coconut/dkg/verification_key.rs diff --git a/validator-api/src/coconut/error.rs b/nym-api/src/coconut/error.rs similarity index 96% rename from validator-api/src/coconut/error.rs rename to nym-api/src/coconut/error.rs index 00c7d9c7a0..4c3a712eb2 100644 --- a/validator-api/src/coconut/error.rs +++ b/nym-api/src/coconut/error.rs @@ -14,7 +14,7 @@ use crypto::asymmetric::{ use dkg::error::DkgError; use validator_client::nymd::error::NymdError; -use crate::node_status_api::models::ValidatorApiStorageError; +use crate::node_status_api::models::NymApiStorageError; pub type Result = std::result::Result; @@ -77,7 +77,7 @@ pub enum CoconutError { CoconutInterfaceError(#[from] coconut_interface::error::CoconutInterfaceError), #[error("Storage error - {0}")] - StorageError(#[from] ValidatorApiStorageError), + StorageError(#[from] NymApiStorageError), #[error("Credentials error - {0}")] CredentialsError(#[from] credentials::error::Error), diff --git a/validator-api/src/coconut/keypair.rs b/nym-api/src/coconut/keypair.rs similarity index 100% rename from validator-api/src/coconut/keypair.rs rename to nym-api/src/coconut/keypair.rs diff --git a/validator-api/src/coconut/mod.rs b/nym-api/src/coconut/mod.rs similarity index 91% rename from validator-api/src/coconut/mod.rs rename to nym-api/src/coconut/mod.rs index 25bcb4afa0..ba3afa12b6 100644 --- a/validator-api/src/coconut/mod.rs +++ b/nym-api/src/coconut/mod.rs @@ -13,7 +13,7 @@ pub(crate) mod tests; use crate::coconut::client::Client as LocalClient; use crate::coconut::deposit::extract_encryption_key; use crate::coconut::error::{CoconutError, Result}; -use crate::ValidatorApiStorage; +use crate::NymApiStorage; use coconut_bandwidth_contract_common::spend_credential::{ funds_from_cosmos_msgs, SpendCredentialStatus, @@ -22,19 +22,19 @@ use coconut_interface::KeyPair as CoconutKeyPair; use coconut_interface::{ Attribute, BlindSignRequest, BlindedSignature, Parameters, VerificationKey, }; -use config::defaults::VALIDATOR_API_VERSION; +use config::defaults::NYM_API_VERSION; use credentials::coconut::params::{ - ValidatorApiCredentialEncryptionAlgorithm, ValidatorApiCredentialHkdfAlgorithm, + NymApiCredentialEncryptionAlgorithm, NymApiCredentialHkdfAlgorithm, }; use crypto::asymmetric::encryption; use crypto::shared_key::new_ephemeral_shared_key; use crypto::symmetric::stream_cipher; use keypair::KeyPair; -use validator_api_requests::coconut::{ +use nym_api_requests::coconut::{ BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, }; +use validator_client::nym_api::routes::{BANDWIDTH, COCONUT_ROUTES}; use validator_client::nymd::{Coin, Fee}; -use validator_client::validator_api::routes::{BANDWIDTH, COCONUT_ROUTES}; use getset::{CopyGetters, Getters}; use rand_07::rngs::OsRng; @@ -51,7 +51,7 @@ pub struct State { mix_denom: String, key_pair: KeyPair, comm_channel: Arc, - storage: ValidatorApiStorage, + storage: NymApiStorage, rng: Arc>, } @@ -61,7 +61,7 @@ impl State { mix_denom: String, key_pair: KeyPair, comm_channel: D, - storage: ValidatorApiStorage, + storage: NymApiStorage, ) -> Self where C: LocalClient + Send + Sync + 'static, @@ -100,16 +100,16 @@ impl State { let (keypair, shared_key) = { let mut rng = *self.rng.lock().await; new_ephemeral_shared_key::< - ValidatorApiCredentialEncryptionAlgorithm, - ValidatorApiCredentialHkdfAlgorithm, + NymApiCredentialEncryptionAlgorithm, + NymApiCredentialHkdfAlgorithm, _, >(&mut rng, remote_key) }; let chunk_data = signature.to_bytes(); - let zero_iv = stream_cipher::zero_iv::(); - let encrypted_data = stream_cipher::encrypt::( + let zero_iv = stream_cipher::zero_iv::(); + let encrypted_data = stream_cipher::encrypt::( &shared_key, &zero_iv, &chunk_data, @@ -169,7 +169,7 @@ impl InternalSignRequest { mix_denom: String, key_pair: KeyPair, comm_channel: D, - storage: ValidatorApiStorage, + storage: NymApiStorage, ) -> AdHoc where C: LocalClient + Send + Sync + 'static, @@ -179,10 +179,7 @@ impl InternalSignRequest { AdHoc::on_ignite("Internal Sign Request Stage", |rocket| async { rocket.manage(state).mount( // this format! is so ugly... - format!( - "/{}/{}/{}", - VALIDATOR_API_VERSION, COCONUT_ROUTES, BANDWIDTH - ), + format!("/{}/{}/{}", NYM_API_VERSION, COCONUT_ROUTES, BANDWIDTH), routes![ post_blind_sign, post_partial_bandwidth_credential, diff --git a/validator-api/src/coconut/tests.rs b/nym-api/src/coconut/tests.rs similarity index 97% rename from validator-api/src/coconut/tests.rs rename to nym-api/src/coconut/tests.rs index 2a687eef24..3d9d6c46a7 100644 --- a/validator-api/src/coconut/tests.rs +++ b/nym-api/src/coconut/tests.rs @@ -15,26 +15,26 @@ use config::defaults::VOUCHER_INFO; use cosmwasm_std::{to_binary, Addr, CosmosMsg, Decimal, WasmMsg}; use credentials::coconut::bandwidth::BandwidthVoucher; use credentials::coconut::params::{ - ValidatorApiCredentialEncryptionAlgorithm, ValidatorApiCredentialHkdfAlgorithm, + NymApiCredentialEncryptionAlgorithm, NymApiCredentialHkdfAlgorithm, }; use crypto::shared_key::recompute_shared_key; use crypto::symmetric::stream_cipher; +use nym_api_requests::coconut::{ + BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, +}; use nymcoconut::tests::helpers::theta_from_keys_and_attributes; use nymcoconut::{ prepare_blind_sign, ttp_keygen, Base58, BlindSignRequest, BlindedSignature, Parameters, }; -use validator_api_requests::coconut::{ - BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, -}; -use validator_client::nymd::Coin; -use validator_client::nymd::{tx::Hash, AccountId, DeliverTx, Event, Fee, Tag, TxResponse}; -use validator_client::validator_api::routes::{ +use validator_client::nym_api::routes::{ API_VERSION, BANDWIDTH, COCONUT_BLIND_SIGN, COCONUT_PARTIAL_BANDWIDTH_CREDENTIAL, COCONUT_ROUTES, COCONUT_VERIFY_BANDWIDTH_CREDENTIAL, }; +use validator_client::nymd::Coin; +use validator_client::nymd::{tx::Hash, AccountId, DeliverTx, Event, Fee, Tag, TxResponse}; use crate::coconut::State; -use crate::ValidatorApiStorage; +use crate::NymApiStorage; use async_trait::async_trait; use coconut_dkg_common::dealer::{ ContractDealing, DealerDetails, DealerDetailsResponse, DealerType, @@ -456,7 +456,7 @@ async fn signed_before() { let key_pair = ttp_keygen(¶ms, 1, 1).unwrap().remove(0); let mut db_dir = std::env::temp_dir(); db_dir.push(&key_pair.verification_key().to_bs58()[..8]); - let storage = ValidatorApiStorage::init(db_dir).await.unwrap(); + let storage = NymApiStorage::init(db_dir).await.unwrap(); let tx_db = Arc::new(RwLock::new(HashMap::new())); tx_db .write() @@ -532,7 +532,7 @@ async fn state_functions() { let key_pair = ttp_keygen(¶ms, 1, 1).unwrap().remove(0); let mut db_dir = std::env::temp_dir(); db_dir.push(&key_pair.verification_key().to_bs58()[..8]); - let storage = ValidatorApiStorage::init(db_dir).await.unwrap(); + let storage = NymApiStorage::init(db_dir).await.unwrap(); let comm_channel = DummyCommunicationChannel::new(key_pair.verification_key()); let staged_key_pair = crate::coconut::KeyPair::new(); staged_key_pair.set(key_pair).await; @@ -601,11 +601,11 @@ async fn state_functions() { crypto::asymmetric::encryption::PublicKey::from_bytes(&response.remote_key).unwrap(); let encryption_key = recompute_shared_key::< - ValidatorApiCredentialEncryptionAlgorithm, - ValidatorApiCredentialHkdfAlgorithm, + NymApiCredentialEncryptionAlgorithm, + NymApiCredentialHkdfAlgorithm, >(&remote_key, encryption_keypair.private_key()); - let zero_iv = stream_cipher::zero_iv::(); - let blinded_signature_bytes = stream_cipher::decrypt::( + let zero_iv = stream_cipher::zero_iv::(); + let blinded_signature_bytes = stream_cipher::decrypt::( &encryption_key, &zero_iv, &response.encrypted_signature, @@ -665,7 +665,7 @@ async fn blind_sign_correct() { let key_pair = ttp_keygen(¶ms, 1, 1).unwrap().remove(0); let mut db_dir = std::env::temp_dir(); db_dir.push(&key_pair.verification_key().to_bs58()[..8]); - let storage = ValidatorApiStorage::init(db_dir).await.unwrap(); + let storage = NymApiStorage::init(db_dir).await.unwrap(); let tx_db = Arc::new(RwLock::new(HashMap::new())); let mut tx_entry = tx_entry_fixture(&tx_hash.to_string()); @@ -776,7 +776,7 @@ async fn signature_test() { let key_pair = ttp_keygen(¶ms, 1, 1).unwrap().remove(0); let mut db_dir = std::env::temp_dir(); db_dir.push(&key_pair.verification_key().to_bs58()[..8]); - let storage = ValidatorApiStorage::init(db_dir).await.unwrap(); + let storage = NymApiStorage::init(db_dir).await.unwrap(); let nymd_client = DummyClient::new(AccountId::from_str(TEST_REWARDING_VALIDATOR_ADDRESS).unwrap()); let comm_channel = DummyCommunicationChannel::new(key_pair.verification_key()); @@ -865,7 +865,7 @@ async fn verification_of_bandwidth_credential() { theta_from_keys_and_attributes(¶ms, &key_pairs, &indices, &public_attributes).unwrap(); let key_pair = key_pairs.remove(0); db_dir.push(&key_pair.verification_key().to_bs58()[..8]); - let storage1 = ValidatorApiStorage::init(db_dir).await.unwrap(); + let storage1 = NymApiStorage::init(db_dir).await.unwrap(); let comm_channel = DummyCommunicationChannel::new(key_pair.verification_key()); let staged_key_pair = crate::coconut::KeyPair::new(); staged_key_pair.set(key_pair).await; diff --git a/validator-api/src/config/mod.rs b/nym-api/src/config/mod.rs similarity index 98% rename from validator-api/src/config/mod.rs rename to nym-api/src/config/mod.rs index d38acfb546..2e30bf34dd 100644 --- a/validator-api/src/config/mod.rs +++ b/nym-api/src/config/mod.rs @@ -3,7 +3,7 @@ use crate::config::template::config_template; use config::defaults::mainnet::MIXNET_CONTRACT_ADDRESS; -use config::defaults::DEFAULT_VALIDATOR_API_PORT; +use config::defaults::DEFAULT_NYM_API_PORT; use config::NymConfig; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -67,11 +67,11 @@ impl NymConfig for Config { dirs::home_dir() .expect("Failed to evaluate $HOME value") .join(".nym") - .join("validator-api") + .join("nym-api") } fn try_default_root_directory() -> Option { - dirs::home_dir().map(|path| path.join(".nym").join("validator-api")) + dirs::home_dir().map(|path| path.join(".nym").join("nym-api")) } fn root_directory(&self) -> PathBuf { @@ -90,7 +90,7 @@ impl NymConfig for Config { #[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] #[serde(default)] pub struct Base { - /// ID specifies the human readable ID of this particular validator-api. + /// ID specifies the human readable ID of this particular nym-api. id: String, local_validator: Url, @@ -114,7 +114,7 @@ impl Default for Base { .expect("default local validator is malformed!"); let mut default_announce_address = default_validator.clone(); default_announce_address - .set_port(Some(DEFAULT_VALIDATOR_API_PORT)) + .set_port(Some(DEFAULT_NYM_API_PORT)) .expect("default local validator is malformed!"); Base { id: String::default(), diff --git a/validator-api/src/config/template.rs b/nym-api/src/config/template.rs similarity index 97% rename from validator-api/src/config/template.rs rename to nym-api/src/config/template.rs index c2a3670e28..79773f56b7 100644 --- a/validator-api/src/config/template.rs +++ b/nym-api/src/config/template.rs @@ -6,11 +6,11 @@ pub(crate) fn config_template() -> &'static str { # This is a TOML config file. # For more information, see https://github.com/toml-lang/toml -##### main base validator-api config options ##### +##### main base nym-api config options ##### [base] -# ID specifies the human readable ID of this particular validator-api. +# ID specifies the human readable ID of this particular nym-api. id = '{{ base.id }}' # Validator server to which the API will be getting information about the network. diff --git a/validator-api/src/contract_cache/mod.rs b/nym-api/src/contract_cache/mod.rs similarity index 99% rename from validator-api/src/contract_cache/mod.rs rename to nym-api/src/contract_cache/mod.rs index b4619214b8..61a7150a02 100644 --- a/validator-api/src/contract_cache/mod.rs +++ b/nym-api/src/contract_cache/mod.rs @@ -9,6 +9,7 @@ use mixnet_contract_common::{ mixnode::MixNodeDetails, reward_params::RewardingParams, GatewayBond, IdentityKey, Interval, MixId, MixNodeBond, RewardedSetNodeStatus, }; +use nym_api_requests::models::MixnodeStatus; use okapi::openapi3::OpenApi; use rocket::fairing::AdHoc; use rocket::Route; @@ -23,7 +24,6 @@ use std::time::Duration; use task::ShutdownListener; use tokio::sync::{watch, RwLock}; use tokio::time; -use validator_api_requests::models::MixnodeStatus; use validator_client::nymd::CosmWasmClient; pub(crate) mod routes; diff --git a/validator-api/src/contract_cache/routes.rs b/nym-api/src/contract_cache/routes.rs similarity index 98% rename from validator-api/src/contract_cache/routes.rs rename to nym-api/src/contract_cache/routes.rs index 6aba1ba4f9..2d6b71e606 100644 --- a/validator-api/src/contract_cache/routes.rs +++ b/nym-api/src/contract_cache/routes.rs @@ -11,7 +11,7 @@ use crate::{ use mixnet_contract_common::{ mixnode::MixNodeDetails, reward_params::RewardingParams, GatewayBond, Interval, MixId, }; -use validator_api_requests::models::MixNodeBondAnnotated; +use nym_api_requests::models::MixNodeBondAnnotated; use rocket::{serde::json::Json, State}; use rocket_okapi::openapi; diff --git a/validator-api/src/epoch_operations/error.rs b/nym-api/src/epoch_operations/error.rs similarity index 85% rename from validator-api/src/epoch_operations/error.rs rename to nym-api/src/epoch_operations/error.rs index bb94df5f49..4455dfcfcc 100644 --- a/validator-api/src/epoch_operations/error.rs +++ b/nym-api/src/epoch_operations/error.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::node_status_api::models::ValidatorApiStorageError; +use crate::node_status_api::models::NymApiStorageError; use thiserror::Error; use validator_client::nymd::error::NymdError; use validator_client::ValidatorClientError; @@ -15,7 +15,7 @@ pub enum RewardingError { // The inner error should be modified at some point... #[error("We run into storage issues - {0}")] - StorageError(ValidatorApiStorageError), + StorageError(NymApiStorageError), #[error("Failed to query the smart contract - {0}")] ValidatorClientError(ValidatorClientError), @@ -38,8 +38,8 @@ impl From for RewardingError { } } -impl From for RewardingError { - fn from(err: ValidatorApiStorageError) -> Self { +impl From for RewardingError { + fn from(err: NymApiStorageError) -> Self { RewardingError::StorageError(err) } } diff --git a/validator-api/src/epoch_operations/helpers.rs b/nym-api/src/epoch_operations/helpers.rs similarity index 100% rename from validator-api/src/epoch_operations/helpers.rs rename to nym-api/src/epoch_operations/helpers.rs diff --git a/validator-api/src/epoch_operations/mod.rs b/nym-api/src/epoch_operations/mod.rs similarity index 99% rename from validator-api/src/epoch_operations/mod.rs rename to nym-api/src/epoch_operations/mod.rs index ec7bfbfaf4..cf0233e453 100644 --- a/validator-api/src/epoch_operations/mod.rs +++ b/nym-api/src/epoch_operations/mod.rs @@ -15,7 +15,7 @@ use crate::contract_cache::ValidatorCache; use crate::nymd_client::Client; use crate::storage::models::RewardingReport; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; use mixnet_contract_common::families::FamilyHead; use mixnet_contract_common::{ reward_params::Performance, CurrentIntervalResponse, ExecuteMsg, Interval, MixId, @@ -56,7 +56,7 @@ impl From for ExecuteMsg { pub struct RewardedSetUpdater { nymd_client: Client, validator_cache: ValidatorCache, - storage: ValidatorApiStorage, + storage: NymApiStorage, } // Weight of a layer being chose is reciprocal to current count in layer @@ -79,7 +79,7 @@ impl RewardedSetUpdater { pub(crate) async fn new( nymd_client: Client, validator_cache: ValidatorCache, - storage: ValidatorApiStorage, + storage: NymApiStorage, ) -> Result { Ok(RewardedSetUpdater { nymd_client, diff --git a/validator-api/src/main.rs b/nym-api/src/main.rs similarity index 93% rename from validator-api/src/main.rs rename to nym-api/src/main.rs index e3411b1b7f..a47068f5fc 100644 --- a/validator-api/src/main.rs +++ b/nym-api/src/main.rs @@ -9,7 +9,7 @@ use crate::contract_cache::ValidatorCacheRefresher; use crate::network_monitor::NetworkMonitorBuilder; use crate::node_status_api::uptime_updater::HistoricalUptimeUpdater; use crate::nymd_client::Client; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; use ::config::defaults::mainnet::read_var_if_not_default; use ::config::defaults::setup_env; use ::config::defaults::var_names::{CONFIGURED, MIXNET_CONTRACT_ADDRESS, MIX_DENOM}; @@ -113,20 +113,20 @@ fn long_version() -> String { fn parse_args() -> ArgMatches { let build_details = long_version(); - let base_app = App::new("Nym Validator API") + let base_app = App::new("Nym API") .version(crate_version!()) .long_version(&*build_details) .author("Nymtech") .arg( Arg::with_name(CONFIG_ENV_FILE) - .help("Path pointing to an env file that configures the validator API") + .help("Path pointing to an env file that configures the Nym API") .long(CONFIG_ENV_FILE) .short('c') .takes_value(true) ) .arg( Arg::with_name(ID) - .help("Id of the validator-api we want to run") + .help("Id of the nym-api we want to run") .long(ID) .takes_value(true) ) @@ -145,13 +145,13 @@ fn parse_args() -> ArgMatches { ) .arg( Arg::with_name(NYMD_VALIDATOR_ARG) - .help("Endpoint to nymd part of the validator from which the monitor will grab nodes to test") + .help("Endpoint to nymd instance from which the monitor will grab nodes to test") .long(NYMD_VALIDATOR_ARG) .takes_value(true) ) .arg(Arg::with_name(MIXNET_CONTRACT_ARG) .long(MIXNET_CONTRACT_ARG) - .help("Address of the validator contract managing the network") + .help("Address of the mixnet contract managing the network") .takes_value(true), ) .arg(Arg::with_name(MNEMONIC_ARG) @@ -174,19 +174,19 @@ fn parse_args() -> ArgMatches { .arg( Arg::with_name(MIN_MIXNODE_RELIABILITY_ARG) .long(MIN_MIXNODE_RELIABILITY_ARG) - .help("Mixnodes with relialability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set.") + .help("Mixnodes with reliability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set.") .takes_value(true) ) .arg( Arg::with_name(MIN_GATEWAY_RELIABILITY_ARG) .long(MIN_GATEWAY_RELIABILITY_ARG) - .help("Gateways with relialability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set.") + .help("Gateways with reliability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set.") .takes_value(true) ) .arg( Arg::with_name(ENABLED_CREDENTIALS_MODE_ARG_NAME) .long(ENABLED_CREDENTIALS_MODE_ARG_NAME) - .help("Set this validator api to work in a enabled credentials that would attempt to use gateway with the bandwidth credential requirement") + .help("Set this nym api to work in a enabled credentials that would attempt to use gateway with the bandwidth credential requirement") ); #[cfg(feature = "coconut")] @@ -215,7 +215,7 @@ async fn wait_for_interrupt(mut shutdown: ShutdownNotifier) { log::info!("Waiting for tasks to finish... (Press ctrl-c to force)"); shutdown.wait_for_shutdown().await; - log::info!("Stopping nym validator API"); + log::info!("Stopping nym API"); } #[cfg(unix)] @@ -380,7 +380,7 @@ fn setup_network_monitor<'a>( } // get instances of managed states - let node_status_storage = rocket.state::().unwrap().clone(); + let node_status_storage = rocket.state::().unwrap().clone(); let validator_cache = rocket.state::().unwrap().clone(); Some(NetworkMonitorBuilder::new( @@ -433,7 +433,7 @@ async fn setup_rocket( // This is not a very nice approach. A lazy value would be more suitable, but that's still // a nightly feature: https://github.com/rust-lang/rust/issues/74465 let storage = if cfg!(feature = "coconut") || config.get_network_monitor_enabled() { - Some(ValidatorApiStorage::init(config.get_node_status_api_database_path()).await?) + Some(NymApiStorage::init(config.get_node_status_api_database_path()).await?) } else { None }; @@ -453,7 +453,7 @@ async fn setup_rocket( // see if we should start up network monitor let rocket = if config.get_network_monitor_enabled() { - rocket.attach(storage::ValidatorApiStorage::stage(storage.unwrap())) + rocket.attach(storage::NymApiStorage::stage(storage.unwrap())) } else { rocket }; @@ -490,7 +490,7 @@ fn get_servers() -> Vec { }] } -async fn run_validator_api(matches: ArgMatches) -> Result<()> { +async fn run_nym_api(matches: ArgMatches) -> Result<()> { let system_version = env!("CARGO_PKG_VERSION"); // try to load config from the file, if it doesn't exist, use default values @@ -565,7 +565,7 @@ async fn run_validator_api(matches: ArgMatches) -> Result<()> { // we're not starting signing client let validator_cache_listener = if config.get_network_monitor_enabled() { // Main storage - let storage = rocket.state::().unwrap().clone(); + let storage = rocket.state::().unwrap().clone(); // setup our daily uptime updater. Note that if network monitor is disabled, then we have // no data for the updates and hence we don't need to start it up @@ -610,8 +610,8 @@ async fn run_validator_api(matches: ArgMatches) -> Result<()> { // Spawn the node status cache refresher. // It is primarily refreshed in-sync with the validator cache, however provide a fallback // caching interval that is twice the validator cache - let storage = rocket.state::().cloned(); - let mut validator_api_cache_refresher = node_status_api::NodeStatusCacheRefresher::new( + let storage = rocket.state::().cloned(); + let mut nym_api_cache_refresher = node_status_api::NodeStatusCacheRefresher::new( node_status_cache, config.get_caching_interval().saturating_mul(2), validator_cache, @@ -619,12 +619,12 @@ async fn run_validator_api(matches: ArgMatches) -> Result<()> { storage, ); let shutdown_listener = shutdown.subscribe(); - tokio::spawn(async move { validator_api_cache_refresher.run(shutdown_listener).await }); + tokio::spawn(async move { nym_api_cache_refresher.run(shutdown_listener).await }); // launch the rocket! // Rocket handles shutdown on it's own, but its shutdown handling should be incorporated // with that of the rest of the tasks. - // Currently it's runtime is forcefully terminated once the validator-api exits. + // Currently it's runtime is forcefully terminated once the nym-api exits. let shutdown_handle = rocket.shutdown(); tokio::spawn(rocket.launch()); @@ -663,5 +663,5 @@ async fn main() -> Result<()> { .value_of(CONFIG_ENV_FILE) .map(|s| PathBuf::from_str(s).expect("invalid env config file")); setup_env(config_env_file); - run_validator_api(args).await + run_nym_api(args).await } diff --git a/validator-api/src/network_monitor/chunker.rs b/nym-api/src/network_monitor/chunker.rs similarity index 100% rename from validator-api/src/network_monitor/chunker.rs rename to nym-api/src/network_monitor/chunker.rs diff --git a/validator-api/src/network_monitor/gateways_reader.rs b/nym-api/src/network_monitor/gateways_reader.rs similarity index 100% rename from validator-api/src/network_monitor/gateways_reader.rs rename to nym-api/src/network_monitor/gateways_reader.rs diff --git a/validator-api/src/network_monitor/mod.rs b/nym-api/src/network_monitor/mod.rs similarity index 98% rename from validator-api/src/network_monitor/mod.rs rename to nym-api/src/network_monitor/mod.rs index 8b85d5fd5a..0048e2be02 100644 --- a/validator-api/src/network_monitor/mod.rs +++ b/nym-api/src/network_monitor/mod.rs @@ -22,7 +22,7 @@ use crate::network_monitor::monitor::sender::PacketSender; use crate::network_monitor::monitor::summary_producer::SummaryProducer; use crate::network_monitor::monitor::Monitor; use crate::nymd_client::Client; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; pub(crate) mod chunker; pub(crate) mod gateways_reader; @@ -36,7 +36,7 @@ pub(crate) struct NetworkMonitorBuilder<'a> { config: &'a Config, _nymd_client: Client, system_version: String, - node_status_storage: ValidatorApiStorage, + node_status_storage: NymApiStorage, validator_cache: ValidatorCache, } @@ -45,7 +45,7 @@ impl<'a> NetworkMonitorBuilder<'a> { config: &'a Config, _nymd_client: Client, system_version: &str, - node_status_storage: ValidatorApiStorage, + node_status_storage: NymApiStorage, validator_cache: ValidatorCache, ) -> Self { NetworkMonitorBuilder { diff --git a/validator-api/src/network_monitor/monitor/gateway_clients_cache.rs b/nym-api/src/network_monitor/monitor/gateway_clients_cache.rs similarity index 100% rename from validator-api/src/network_monitor/monitor/gateway_clients_cache.rs rename to nym-api/src/network_monitor/monitor/gateway_clients_cache.rs diff --git a/validator-api/src/network_monitor/monitor/gateways_pinger.rs b/nym-api/src/network_monitor/monitor/gateways_pinger.rs similarity index 100% rename from validator-api/src/network_monitor/monitor/gateways_pinger.rs rename to nym-api/src/network_monitor/monitor/gateways_pinger.rs diff --git a/validator-api/src/network_monitor/monitor/mod.rs b/nym-api/src/network_monitor/monitor/mod.rs similarity index 98% rename from validator-api/src/network_monitor/monitor/mod.rs rename to nym-api/src/network_monitor/monitor/mod.rs index e2d1a07128..c333c5e883 100644 --- a/validator-api/src/network_monitor/monitor/mod.rs +++ b/nym-api/src/network_monitor/monitor/mod.rs @@ -8,7 +8,7 @@ use crate::network_monitor::monitor::sender::PacketSender; use crate::network_monitor::monitor::summary_producer::{SummaryProducer, TestSummary}; use crate::network_monitor::test_packet::TestPacket; use crate::network_monitor::test_route::TestRoute; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; use log::{debug, error, info}; use std::collections::{HashMap, HashSet}; use std::process; @@ -29,7 +29,7 @@ pub(super) struct Monitor { packet_sender: PacketSender, received_processor: ReceivedProcessor, summary_producer: SummaryProducer, - node_status_storage: ValidatorApiStorage, + node_status_storage: NymApiStorage, run_interval: Duration, gateway_ping_interval: Duration, packet_delivery_timeout: Duration, @@ -52,7 +52,7 @@ impl Monitor { packet_sender: PacketSender, received_processor: ReceivedProcessor, summary_producer: SummaryProducer, - node_status_storage: ValidatorApiStorage, + node_status_storage: NymApiStorage, ) -> Self { Monitor { test_nonce: 1, diff --git a/validator-api/src/network_monitor/monitor/preparer.rs b/nym-api/src/network_monitor/monitor/preparer.rs similarity index 100% rename from validator-api/src/network_monitor/monitor/preparer.rs rename to nym-api/src/network_monitor/monitor/preparer.rs diff --git a/validator-api/src/network_monitor/monitor/processor.rs b/nym-api/src/network_monitor/monitor/processor.rs similarity index 100% rename from validator-api/src/network_monitor/monitor/processor.rs rename to nym-api/src/network_monitor/monitor/processor.rs diff --git a/validator-api/src/network_monitor/monitor/receiver.rs b/nym-api/src/network_monitor/monitor/receiver.rs similarity index 100% rename from validator-api/src/network_monitor/monitor/receiver.rs rename to nym-api/src/network_monitor/monitor/receiver.rs diff --git a/validator-api/src/network_monitor/monitor/sender.rs b/nym-api/src/network_monitor/monitor/sender.rs similarity index 100% rename from validator-api/src/network_monitor/monitor/sender.rs rename to nym-api/src/network_monitor/monitor/sender.rs diff --git a/validator-api/src/network_monitor/monitor/summary_producer.rs b/nym-api/src/network_monitor/monitor/summary_producer.rs similarity index 100% rename from validator-api/src/network_monitor/monitor/summary_producer.rs rename to nym-api/src/network_monitor/monitor/summary_producer.rs diff --git a/validator-api/src/network_monitor/test_packet.rs b/nym-api/src/network_monitor/test_packet.rs similarity index 100% rename from validator-api/src/network_monitor/test_packet.rs rename to nym-api/src/network_monitor/test_packet.rs diff --git a/validator-api/src/network_monitor/test_route/mod.rs b/nym-api/src/network_monitor/test_route/mod.rs similarity index 100% rename from validator-api/src/network_monitor/test_route/mod.rs rename to nym-api/src/network_monitor/test_route/mod.rs diff --git a/validator-api/src/node_status_api/cache.rs b/nym-api/src/node_status_api/cache.rs similarity index 98% rename from validator-api/src/node_status_api/cache.rs rename to nym-api/src/node_status_api/cache.rs index 289a75a3f5..f485716e8e 100644 --- a/validator-api/src/node_status_api/cache.rs +++ b/nym-api/src/node_status_api/cache.rs @@ -2,12 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 use crate::contract_cache::{Cache, CacheNotification, ValidatorCache}; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; use mixnet_contract_common::families::FamilyHead; use mixnet_contract_common::reward_params::Performance; use mixnet_contract_common::{ IdentityKey, Interval, MixId, MixNodeDetails, RewardedSetNodeStatus, RewardingParams, }; +use nym_api_requests::models::{MixNodeBondAnnotated, MixnodeStatus}; use rocket::fairing::AdHoc; use std::collections::HashMap; use std::{sync::Arc, time::Duration}; @@ -17,7 +18,6 @@ use tokio::{ sync::{watch, RwLock}, time, }; -use validator_api_requests::models::{MixNodeBondAnnotated, MixnodeStatus}; use self::inclusion_probabilities::InclusionProbabilities; @@ -154,7 +154,7 @@ pub struct NodeStatusCacheRefresher { // Sources for when refreshing data contract_cache: ValidatorCache, contract_cache_listener: watch::Receiver, - storage: Option, + storage: Option, } impl NodeStatusCacheRefresher { @@ -163,7 +163,7 @@ impl NodeStatusCacheRefresher { fallback_caching_interval: Duration, contract_cache: ValidatorCache, contract_cache_listener: watch::Receiver, - storage: Option, + storage: Option, ) -> Self { Self { cache, @@ -320,7 +320,7 @@ impl NodeStatusCacheRefresher { .rewarding_details .uncapped_bond_saturation(&interval_reward_params); - // If the performance can't be obtained, because the validator-api was not started with + // If the performance can't be obtained, because the nym-api was not started with // the monitoring (and hence, storage), then reward estimates will be all zero let performance = self .get_performance_from_storage(mixnode.mix_id(), current_interval) diff --git a/validator-api/src/node_status_api/cache/inclusion_probabilities.rs b/nym-api/src/node_status_api/cache/inclusion_probabilities.rs similarity index 98% rename from validator-api/src/node_status_api/cache/inclusion_probabilities.rs rename to nym-api/src/node_status_api/cache/inclusion_probabilities.rs index 21c1bdcab5..80643dae27 100644 --- a/validator-api/src/node_status_api/cache/inclusion_probabilities.rs +++ b/nym-api/src/node_status_api/cache/inclusion_probabilities.rs @@ -1,9 +1,9 @@ use contracts_common::truncate_decimal; use mixnet_contract_common::{MixId, MixNodeDetails, RewardingParams}; +use nym_api_requests::models::InclusionProbability; use serde::Serialize; use std::time::Duration; use tap::TapFallible; -use validator_api_requests::models::InclusionProbability; const MAX_SIMULATION_SAMPLES: u64 = 5000; const MAX_SIMULATION_TIME_SEC: u64 = 15; diff --git a/validator-api/src/node_status_api/helpers.rs b/nym-api/src/node_status_api/helpers.rs similarity index 97% rename from validator-api/src/node_status_api/helpers.rs rename to nym-api/src/node_status_api/helpers.rs index 4b084533bc..a2d102ebdd 100644 --- a/validator-api/src/node_status_api/helpers.rs +++ b/nym-api/src/node_status_api/helpers.rs @@ -3,24 +3,24 @@ use crate::contract_cache::Cache; use crate::node_status_api::models::ErrorResponse; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; use crate::{NodeStatusCache, ValidatorCache}; use cosmwasm_std::Decimal; use mixnet_contract_common::reward_params::Performance; use mixnet_contract_common::{Interval, MixId, RewardedSetNodeStatus}; -use rocket::http::Status; -use rocket::State; -use validator_api_requests::models::{ +use nym_api_requests::models::{ AllInclusionProbabilitiesResponse, ComputeRewardEstParam, InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, }; +use rocket::http::Status; +use rocket::State; use super::reward_estimate::compute_reward_estimate; pub(crate) async fn _mixnode_report( - storage: &ValidatorApiStorage, + storage: &NymApiStorage, mix_id: MixId, ) -> Result { storage @@ -31,7 +31,7 @@ pub(crate) async fn _mixnode_report( } pub(crate) async fn _mixnode_uptime_history( - storage: &ValidatorApiStorage, + storage: &NymApiStorage, mix_id: MixId, ) -> Result { storage @@ -42,7 +42,7 @@ pub(crate) async fn _mixnode_uptime_history( } pub(crate) async fn _mixnode_core_status_count( - storage: &State, + storage: &State, mix_id: MixId, since: Option, ) -> Result { @@ -106,7 +106,7 @@ pub(crate) async fn _get_mixnode_reward_estimation( async fn average_mixnode_performance( mix_id: MixId, current_interval: Interval, - storage: &ValidatorApiStorage, + storage: &NymApiStorage, ) -> Result { storage .get_average_mixnode_uptime_in_the_last_24hrs( @@ -255,7 +255,7 @@ pub(crate) async fn _get_mixnode_inclusion_probability( pub(crate) async fn _get_mixnode_avg_uptime( cache: &ValidatorCache, - storage: &ValidatorApiStorage, + storage: &NymApiStorage, mix_id: MixId, ) -> Result { let current_interval = cache diff --git a/validator-api/src/node_status_api/local_guard.rs b/nym-api/src/node_status_api/local_guard.rs similarity index 100% rename from validator-api/src/node_status_api/local_guard.rs rename to nym-api/src/node_status_api/local_guard.rs diff --git a/validator-api/src/node_status_api/mod.rs b/nym-api/src/node_status_api/mod.rs similarity index 100% rename from validator-api/src/node_status_api/mod.rs rename to nym-api/src/node_status_api/mod.rs diff --git a/validator-api/src/node_status_api/models.rs b/nym-api/src/node_status_api/models.rs similarity index 99% rename from validator-api/src/node_status_api/models.rs rename to nym-api/src/node_status_api/models.rs index 329f9f7122..43a11627b3 100644 --- a/validator-api/src/node_status_api/models.rs +++ b/nym-api/src/node_status_api/models.rs @@ -5,6 +5,10 @@ use crate::node_status_api::utils::NodeUptimes; use crate::storage::models::NodeStatus; use mixnet_contract_common::reward_params::Performance; use mixnet_contract_common::{IdentityKey, MixId}; +use nym_api_requests::models::{ + GatewayStatusReportResponse, GatewayUptimeHistoryResponse, HistoricalUptimeResponse, + MixnodeStatusReportResponse, MixnodeUptimeHistoryResponse, RequestError, +}; use okapi::openapi3::{Responses, SchemaObject}; use rocket::http::Status; use rocket::response::{self, Responder, Response}; @@ -20,10 +24,6 @@ use serde::{Deserialize, Serialize}; use std::convert::TryFrom; use thiserror::Error; use time::OffsetDateTime; -use validator_api_requests::models::{ - GatewayStatusReportResponse, GatewayUptimeHistoryResponse, HistoricalUptimeResponse, - MixnodeStatusReportResponse, MixnodeUptimeHistoryResponse, RequestError, -}; #[derive(Error, Debug)] #[error("Received uptime value was within 0-100 range (got {received})")] @@ -373,7 +373,7 @@ impl OpenApiResponderInner for ErrorResponse { } #[derive(Debug, thiserror::Error)] -pub enum ValidatorApiStorageError { +pub enum NymApiStorageError { #[error("could not find status report associated with mixnode {mix_id}")] MixnodeReportNotFound { mix_id: MixId }, diff --git a/validator-api/src/node_status_api/reward_estimate.rs b/nym-api/src/node_status_api/reward_estimate.rs similarity index 100% rename from validator-api/src/node_status_api/reward_estimate.rs rename to nym-api/src/node_status_api/reward_estimate.rs diff --git a/validator-api/src/node_status_api/routes.rs b/nym-api/src/node_status_api/routes.rs similarity index 94% rename from validator-api/src/node_status_api/routes.rs rename to nym-api/src/node_status_api/routes.rs index 037ca7b117..70bb3db91e 100644 --- a/validator-api/src/node_status_api/routes.rs +++ b/nym-api/src/node_status_api/routes.rs @@ -10,25 +10,25 @@ use crate::node_status_api::helpers::{ _mixnode_report, _mixnode_uptime_history, }; use crate::node_status_api::models::ErrorResponse; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; use crate::ValidatorCache; use mixnet_contract_common::MixId; -use rocket::http::Status; -use rocket::serde::json::Json; -use rocket::State; -use rocket_okapi::openapi; -use validator_api_requests::models::{ +use nym_api_requests::models::{ AllInclusionProbabilitiesResponse, ComputeRewardEstParam, GatewayCoreStatusResponse, GatewayStatusReportResponse, GatewayUptimeHistoryResponse, InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, }; +use rocket::http::Status; +use rocket::serde::json::Json; +use rocket::State; +use rocket_okapi::openapi; #[openapi(tag = "status")] #[get("/gateway//report")] pub(crate) async fn gateway_report( - storage: &State, + storage: &State, identity: &str, ) -> Result, ErrorResponse> { storage @@ -42,7 +42,7 @@ pub(crate) async fn gateway_report( #[openapi(tag = "status")] #[get("/gateway//history")] pub(crate) async fn gateway_uptime_history( - storage: &State, + storage: &State, identity: &str, ) -> Result, ErrorResponse> { storage @@ -56,7 +56,7 @@ pub(crate) async fn gateway_uptime_history( #[openapi(tag = "status")] #[get("/gateway//core-status-count?")] pub(crate) async fn gateway_core_status_count( - storage: &State, + storage: &State, identity: &str, since: Option, ) -> Json { @@ -74,7 +74,7 @@ pub(crate) async fn gateway_core_status_count( #[openapi(tag = "status")] #[get("/mixnode//report")] pub(crate) async fn mixnode_report( - storage: &State, + storage: &State, mix_id: MixId, ) -> Result, ErrorResponse> { Ok(Json(_mixnode_report(storage, mix_id).await?)) @@ -83,7 +83,7 @@ pub(crate) async fn mixnode_report( #[openapi(tag = "status")] #[get("/mixnode//history")] pub(crate) async fn mixnode_uptime_history( - storage: &State, + storage: &State, mix_id: MixId, ) -> Result, ErrorResponse> { Ok(Json(_mixnode_uptime_history(storage, mix_id).await?)) @@ -92,7 +92,7 @@ pub(crate) async fn mixnode_uptime_history( #[openapi(tag = "status")] #[get("/mixnode//core-status-count?")] pub(crate) async fn mixnode_core_status_count( - storage: &State, + storage: &State, mix_id: MixId, since: Option, ) -> Result, ErrorResponse> { @@ -171,7 +171,7 @@ pub(crate) async fn get_mixnode_inclusion_probability( #[get("/mixnode//avg_uptime")] pub(crate) async fn get_mixnode_avg_uptime( cache: &State, - storage: &State, + storage: &State, mix_id: MixId, ) -> Result, ErrorResponse> { Ok(Json(_get_mixnode_avg_uptime(cache, storage, mix_id).await?)) diff --git a/validator-api/src/node_status_api/uptime_updater.rs b/nym-api/src/node_status_api/uptime_updater.rs similarity index 92% rename from validator-api/src/node_status_api/uptime_updater.rs rename to nym-api/src/node_status_api/uptime_updater.rs index dcb4f6424c..cc22d75741 100644 --- a/validator-api/src/node_status_api/uptime_updater.rs +++ b/nym-api/src/node_status_api/uptime_updater.rs @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 use crate::node_status_api::models::{ - GatewayStatusReport, MixnodeStatusReport, ValidatorApiStorageError, + GatewayStatusReport, MixnodeStatusReport, NymApiStorageError, }; use crate::node_status_api::ONE_DAY; -use crate::storage::ValidatorApiStorage; +use crate::storage::NymApiStorage; use log::error; use std::time::Duration; use task::ShutdownListener; @@ -13,11 +13,11 @@ use time::{OffsetDateTime, PrimitiveDateTime, Time}; use tokio::time::{interval, sleep}; pub(crate) struct HistoricalUptimeUpdater { - storage: ValidatorApiStorage, + storage: NymApiStorage, } impl HistoricalUptimeUpdater { - pub(crate) fn new(storage: ValidatorApiStorage) -> Self { + pub(crate) fn new(storage: NymApiStorage) -> Self { HistoricalUptimeUpdater { storage } } @@ -30,8 +30,7 @@ impl HistoricalUptimeUpdater { async fn get_active_nodes( &self, now: OffsetDateTime, - ) -> Result<(Vec, Vec), ValidatorApiStorageError> - { + ) -> Result<(Vec, Vec), NymApiStorageError> { let day_ago = (now - ONE_DAY).unix_timestamp(); let active_mixnodes = self .storage @@ -46,7 +45,7 @@ impl HistoricalUptimeUpdater { Ok((active_mixnodes, active_gateways)) } - async fn update_uptimes(&self) -> Result<(), ValidatorApiStorageError> { + async fn update_uptimes(&self) -> Result<(), NymApiStorageError> { let now = OffsetDateTime::now_utc(); let today_iso_8601 = now.date().to_string(); diff --git a/validator-api/src/node_status_api/utils.rs b/nym-api/src/node_status_api/utils.rs similarity index 100% rename from validator-api/src/node_status_api/utils.rs rename to nym-api/src/node_status_api/utils.rs diff --git a/validator-api/src/nymd_client.rs b/nym-api/src/nymd_client.rs similarity index 98% rename from validator-api/src/nymd_client.rs rename to nym-api/src/nymd_client.rs index 1f126d6fdc..d14a793fd4 100644 --- a/validator-api/src/nymd_client.rs +++ b/nym-api/src/nymd_client.rs @@ -3,7 +3,7 @@ use crate::config::Config; use crate::epoch_operations::MixnodeToReward; -use config::defaults::{NymNetworkDetails, DEFAULT_VALIDATOR_API_PORT}; +use config::defaults::{NymNetworkDetails, DEFAULT_NYM_API_PORT}; use mixnet_contract_common::families::{Family, FamilyHead}; use mixnet_contract_common::mixnode::MixNodeDetails; use mixnet_contract_common::reward_params::RewardingParams; @@ -59,7 +59,7 @@ impl Client { pub(crate) fn new_query(config: &Config) -> Self { // the api address is irrelevant here as **WE ARE THE API** // and we won't be talking on the socket here. - let api_url = format!("http://localhost:{}", DEFAULT_VALIDATOR_API_PORT) + let api_url = format!("http://localhost:{}", DEFAULT_NYM_API_PORT) .parse() .unwrap(); let nymd_url = config.get_nymd_validator_url(); @@ -82,7 +82,7 @@ impl Client { pub(crate) fn new_signing(config: &Config) -> Self { // the api address is irrelevant here as **WE ARE THE API** // and we won't be talking on the socket here. - let api_url = format!("http://localhost:{}", DEFAULT_VALIDATOR_API_PORT) + let api_url = format!("http://localhost:{}", DEFAULT_NYM_API_PORT) .parse() .unwrap(); let nymd_url = config.get_nymd_validator_url(); diff --git a/validator-api/src/storage/manager.rs b/nym-api/src/storage/manager.rs similarity index 100% rename from validator-api/src/storage/manager.rs rename to nym-api/src/storage/manager.rs diff --git a/validator-api/src/storage/mod.rs b/nym-api/src/storage/mod.rs similarity index 89% rename from validator-api/src/storage/mod.rs rename to nym-api/src/storage/mod.rs index 04186b7b57..1d513defdf 100644 --- a/validator-api/src/storage/mod.rs +++ b/nym-api/src/storage/mod.rs @@ -4,8 +4,8 @@ use crate::network_monitor::monitor::summary_producer::{GatewayResult, MixnodeResult}; use crate::network_monitor::test_route::TestRoute; use crate::node_status_api::models::{ - GatewayStatusReport, GatewayUptimeHistory, MixnodeStatusReport, MixnodeUptimeHistory, Uptime, - ValidatorApiStorageError, + GatewayStatusReport, GatewayUptimeHistory, MixnodeStatusReport, MixnodeUptimeHistory, + NymApiStorageError, Uptime, }; use crate::node_status_api::{ONE_DAY, ONE_HOUR}; use crate::storage::manager::StorageManager; @@ -23,13 +23,13 @@ pub(crate) mod models; // note that clone here is fine as upon cloning the same underlying pool will be used #[derive(Clone)] -pub(crate) struct ValidatorApiStorage { +pub(crate) struct NymApiStorage { pub manager: StorageManager, } -impl ValidatorApiStorage { - pub async fn init(database_path: PathBuf) -> Result { - // TODO: we can inject here more stuff based on our validator-api global config +impl NymApiStorage { + pub async fn init(database_path: PathBuf) -> Result { + // TODO: we can inject here more stuff based on our nym-api global config // struct. Maybe different pool size or timeout intervals? let mut opts = sqlx::sqlite::SqliteConnectOptions::new() .filename(&database_path) @@ -54,14 +54,14 @@ impl ValidatorApiStorage { info!("Database migration finished!"); - let storage = ValidatorApiStorage { + let storage = NymApiStorage { manager: StorageManager { connection_pool }, }; Ok(storage) } - pub(crate) fn stage(storage: ValidatorApiStorage) -> AdHoc { + pub(crate) fn stage(storage: NymApiStorage) -> AdHoc { AdHoc::try_on_ignite("SQLx Database", |rocket| async { Ok(rocket.manage(storage)) }) @@ -71,7 +71,7 @@ impl ValidatorApiStorage { pub(crate) async fn mix_identity_to_mix_ids( &self, identity: &str, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { Ok(self .manager .get_mixnode_mix_ids_by_identity(identity) @@ -82,7 +82,7 @@ impl ValidatorApiStorage { pub(crate) async fn mix_identity_to_latest_mix_id( &self, identity: &str, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { Ok(self .mix_identity_to_mix_ids(identity) .await? @@ -93,7 +93,7 @@ impl ValidatorApiStorage { pub(crate) async fn get_all_avg_gateway_reliability_in_last_24hr( &self, end_ts_secs: i64, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { let result = self .manager .get_all_avg_gateway_reliability_in_last_24hr(end_ts_secs) @@ -105,7 +105,7 @@ impl ValidatorApiStorage { pub(crate) async fn get_all_avg_mix_reliability_in_last_24hr( &self, end_ts_secs: i64, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { let result = self .manager .get_all_avg_mix_reliability_in_last_24hr(end_ts_secs) @@ -125,7 +125,7 @@ impl ValidatorApiStorage { &self, mix_id: MixId, since: i64, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { let statuses = self .manager .get_mixnode_statuses_since(mix_id, since) @@ -145,7 +145,7 @@ impl ValidatorApiStorage { &self, identity: &str, since: i64, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { let statuses = self .manager .get_gateway_statuses_since(identity, since) @@ -162,7 +162,7 @@ impl ValidatorApiStorage { pub(crate) async fn construct_mixnode_report( &self, mix_id: MixId, - ) -> Result { + ) -> Result { let now = OffsetDateTime::now_utc(); let day_ago = (now - ONE_DAY).unix_timestamp(); let hour_ago = (now - ONE_HOUR).unix_timestamp(); @@ -171,7 +171,7 @@ impl ValidatorApiStorage { // if we have no statuses, the node doesn't exist (or monitor is down), but either way, we can't make a report if statuses.is_empty() { - return Err(ValidatorApiStorageError::MixnodeReportNotFound { mix_id }); + return Err(NymApiStorageError::MixnodeReportNotFound { mix_id }); } // determine the number of runs the mixnode should have been online for @@ -206,7 +206,7 @@ impl ValidatorApiStorage { pub(crate) async fn construct_gateway_report( &self, identity: &str, - ) -> Result { + ) -> Result { let now = OffsetDateTime::now_utc(); let day_ago = (now - ONE_DAY).unix_timestamp(); let hour_ago = (now - ONE_HOUR).unix_timestamp(); @@ -215,7 +215,7 @@ impl ValidatorApiStorage { // if we have no statuses, the node doesn't exist (or monitor is down), but either way, we can't make a report if statuses.is_empty() { - return Err(ValidatorApiStorageError::GatewayReportNotFound { + return Err(NymApiStorageError::GatewayReportNotFound { identity: identity.to_owned(), }); } @@ -245,11 +245,11 @@ impl ValidatorApiStorage { pub(crate) async fn get_mixnode_uptime_history( &self, mix_id: MixId, - ) -> Result { + ) -> Result { let history = self.manager.get_mixnode_historical_uptimes(mix_id).await?; if history.is_empty() { - return Err(ValidatorApiStorageError::MixnodeUptimeHistoryNotFound { mix_id }); + return Err(NymApiStorageError::MixnodeUptimeHistoryNotFound { mix_id }); } let mixnode_owner = @@ -273,14 +273,14 @@ impl ValidatorApiStorage { pub(crate) async fn get_gateway_uptime_history( &self, identity: &str, - ) -> Result { + ) -> Result { let history = self .manager .get_gateway_historical_uptimes(identity) .await?; if history.is_empty() { - return Err(ValidatorApiStorageError::GatewayUptimeHistoryNotFound { + return Err(NymApiStorageError::GatewayUptimeHistoryNotFound { identity: identity.to_owned(), }); } @@ -301,7 +301,7 @@ impl ValidatorApiStorage { &self, mix_id: MixId, end_ts_secs: i64, - ) -> Result { + ) -> Result { let start = end_ts_secs - 86400; self.get_average_mixnode_uptime_in_time_interval(mix_id, start, end_ts_secs) .await @@ -320,7 +320,7 @@ impl ValidatorApiStorage { mix_id: MixId, start: i64, end: i64, - ) -> Result { + ) -> Result { let mixnode_database_id = match self.manager.get_mixnode_database_id(mix_id).await? { Some(id) => id, None => return Ok(Uptime::zero()), @@ -350,7 +350,7 @@ impl ValidatorApiStorage { &self, start: i64, end: i64, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { if (end - start) as u64 != ONE_DAY.as_secs() { warn!("Our current interval length breaks the 24h length assumption") } @@ -394,7 +394,7 @@ impl ValidatorApiStorage { &self, start: i64, end: i64, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { if (end - start) as u64 != ONE_DAY.as_secs() { warn!("Our current interval length breaks the 24h length assumption") } @@ -435,14 +435,14 @@ impl ValidatorApiStorage { &self, monitor_run_db_id: i64, test_route: TestRoute, - ) -> Result<(), ValidatorApiStorageError> { + ) -> Result<(), NymApiStorageError> { // we MUST have those entries in the database, otherwise the route wouldn't have been chosen // in the first place let layer1_mix_db_id = self .manager .get_mixnode_database_id(test_route.layer_one_mix().mix_id) .await? - .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + .ok_or_else(|| NymApiStorageError::DatabaseInconsistency { reason: format!("could not get db id for layer1 mixnode from network monitor run {monitor_run_db_id}"), })?; @@ -450,7 +450,7 @@ impl ValidatorApiStorage { .manager .get_mixnode_database_id(test_route.layer_two_mix().mix_id) .await? - .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + .ok_or_else(|| NymApiStorageError::DatabaseInconsistency { reason: format!("could not get db id for layer2 mixnode from network monitor run {monitor_run_db_id}"), })?; @@ -458,7 +458,7 @@ impl ValidatorApiStorage { .manager .get_mixnode_database_id(test_route.layer_three_mix().mix_id) .await? - .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + .ok_or_else(|| NymApiStorageError::DatabaseInconsistency { reason: format!("could not get db id for layer3 mixnode from network monitor run {monitor_run_db_id}"), })?; @@ -466,7 +466,7 @@ impl ValidatorApiStorage { .manager .get_gateway_id(&test_route.gateway().identity_key.to_base58_string()) .await? - .ok_or_else(|| ValidatorApiStorageError::DatabaseInconsistency { + .ok_or_else(|| NymApiStorageError::DatabaseInconsistency { reason: format!( "could not get db id for gateway from network monitor run {monitor_run_db_id}" ), @@ -496,7 +496,7 @@ impl ValidatorApiStorage { &self, mix_id: MixId, since: Option, - ) -> Result { + ) -> Result { let db_id = self.manager.get_mixnode_database_id(mix_id).await?; if let Some(node_id) = db_id { @@ -524,7 +524,7 @@ impl ValidatorApiStorage { &self, identity: &str, since: Option, - ) -> Result { + ) -> Result { let node_id = self.manager.get_gateway_id(identity).await?; if let Some(node_id) = node_id { @@ -553,7 +553,7 @@ impl ValidatorApiStorage { mixnode_results: Vec, gateway_results: Vec, test_routes: Vec, - ) -> Result<(), ValidatorApiStorageError> { + ) -> Result<(), NymApiStorageError> { info!("Submitting new node results to the database. There are {} mixnode results and {} gateway results", mixnode_results.len(), gateway_results.len()); let now = OffsetDateTime::now_utc().unix_timestamp(); @@ -585,12 +585,12 @@ impl ValidatorApiStorage { &self, since: i64, until: i64, - ) -> Result { + ) -> Result { let run_count = self.manager.get_monitor_runs_count(since, until).await?; if run_count < 0 { // I don't think it's ever possible for SQL to return a negative value from COUNT? - return Err(ValidatorApiStorageError::DatabaseInconsistency { + return Err(NymApiStorageError::DatabaseInconsistency { reason: "Negative run count".to_string(), }); } @@ -610,7 +610,7 @@ impl ValidatorApiStorage { today_iso_8601: &str, mixnode_reports: &[MixnodeStatusReport], gateway_reports: &[GatewayStatusReport], - ) -> Result<(), ValidatorApiStorageError> { + ) -> Result<(), NymApiStorageError> { for report in mixnode_reports { // if this ever fails, we have a super weird error because we just constructed report for that node // and we never delete node data! @@ -655,7 +655,7 @@ impl ValidatorApiStorage { pub(crate) async fn check_if_historical_uptimes_exist_for_date( &self, date_iso_8601: &str, - ) -> Result { + ) -> Result { self.manager .check_for_historical_uptime_existence(date_iso_8601) .await @@ -668,10 +668,7 @@ impl ValidatorApiStorage { /// # Arguments /// /// * `until`: timestamp specifying the purge cutoff. - pub(crate) async fn purge_old_statuses( - &self, - until: i64, - ) -> Result<(), ValidatorApiStorageError> { + pub(crate) async fn purge_old_statuses(&self, until: i64) -> Result<(), NymApiStorageError> { self.manager.purge_old_mixnode_statuses(until).await?; self.manager .purge_old_gateway_statuses(until) @@ -682,7 +679,7 @@ impl ValidatorApiStorage { pub(crate) async fn insert_rewarding_report( &self, report: RewardingReport, - ) -> Result<(), ValidatorApiStorageError> { + ) -> Result<(), NymApiStorageError> { self.manager .insert_rewarding_report(report) .await @@ -692,7 +689,7 @@ impl ValidatorApiStorage { pub(crate) async fn get_rewarding_report( &self, absolute_epoch_id: EpochId, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { self.manager .get_rewarding_report(absolute_epoch_id) .await @@ -703,7 +700,7 @@ impl ValidatorApiStorage { pub(crate) async fn get_blinded_signature_response( &self, tx_hash: &str, - ) -> Result, ValidatorApiStorageError> { + ) -> Result, NymApiStorageError> { self.manager .get_blinded_signature_response(tx_hash) .await @@ -715,7 +712,7 @@ impl ValidatorApiStorage { &self, tx_hash: &str, blinded_signature_response: &str, - ) -> Result<(), ValidatorApiStorageError> { + ) -> Result<(), NymApiStorageError> { self.manager .insert_blinded_signature_response(tx_hash, blinded_signature_response) .await diff --git a/validator-api/src/storage/models.rs b/nym-api/src/storage/models.rs similarity index 100% rename from validator-api/src/storage/models.rs rename to nym-api/src/storage/models.rs diff --git a/validator-api/src/swagger.rs b/nym-api/src/swagger.rs similarity index 100% rename from validator-api/src/swagger.rs rename to nym-api/src/swagger.rs diff --git a/validator-api/tests/README.md b/nym-api/tests/README.md similarity index 100% rename from validator-api/tests/README.md rename to nym-api/tests/README.md diff --git a/validator-api/tests/functional_test/validator-api/status/status-mixnode.test.ts b/nym-api/tests/functional_test/validator-api/status/status-mixnode.test.ts similarity index 100% rename from validator-api/tests/functional_test/validator-api/status/status-mixnode.test.ts rename to nym-api/tests/functional_test/validator-api/status/status-mixnode.test.ts diff --git a/validator-api/tests/jest.config.js b/nym-api/tests/jest.config.js similarity index 100% rename from validator-api/tests/jest.config.js rename to nym-api/tests/jest.config.js diff --git a/validator-api/tests/package.json b/nym-api/tests/package.json similarity index 100% rename from validator-api/tests/package.json rename to nym-api/tests/package.json diff --git a/validator-api/tests/src/config/config.yaml b/nym-api/tests/src/config/config.yaml similarity index 100% rename from validator-api/tests/src/config/config.yaml rename to nym-api/tests/src/config/config.yaml diff --git a/validator-api/tests/src/config/configHandler.ts b/nym-api/tests/src/config/configHandler.ts similarity index 100% rename from validator-api/tests/src/config/configHandler.ts rename to nym-api/tests/src/config/configHandler.ts diff --git a/validator-api/tests/src/endpoints/Status.ts b/nym-api/tests/src/endpoints/Status.ts similarity index 100% rename from validator-api/tests/src/endpoints/Status.ts rename to nym-api/tests/src/endpoints/Status.ts diff --git a/validator-api/tests/src/endpoints/abstracts/APIClient.ts b/nym-api/tests/src/endpoints/abstracts/APIClient.ts similarity index 100% rename from validator-api/tests/src/endpoints/abstracts/APIClient.ts rename to nym-api/tests/src/endpoints/abstracts/APIClient.ts diff --git a/validator-api/tests/src/interfaces/StatusInterfaces.ts b/nym-api/tests/src/interfaces/StatusInterfaces.ts similarity index 100% rename from validator-api/tests/src/interfaces/StatusInterfaces.ts rename to nym-api/tests/src/interfaces/StatusInterfaces.ts diff --git a/validator-api/tests/src/restClient/RestClient.ts b/nym-api/tests/src/restClient/RestClient.ts similarity index 100% rename from validator-api/tests/src/restClient/RestClient.ts rename to nym-api/tests/src/restClient/RestClient.ts diff --git a/validator-api/tests/tsconfig.eslint.json b/nym-api/tests/tsconfig.eslint.json similarity index 100% rename from validator-api/tests/tsconfig.eslint.json rename to nym-api/tests/tsconfig.eslint.json diff --git a/validator-api/tests/tsconfig.json b/nym-api/tests/tsconfig.json similarity index 100% rename from validator-api/tests/tsconfig.json rename to nym-api/tests/tsconfig.json diff --git a/validator-api/tests/yarn.lock b/nym-api/tests/yarn.lock similarity index 100% rename from validator-api/tests/yarn.lock rename to nym-api/tests/yarn.lock diff --git a/nym-connect/Cargo.lock b/nym-connect/Cargo.lock index 3ba62ad4f0..7522031a5e 100644 --- a/nym-connect/Cargo.lock +++ b/nym-connect/Cargo.lock @@ -1004,8 +1004,8 @@ dependencies = [ "bls12_381 0.5.0", "coconut-interface", "crypto", + "nym-api-requests", "thiserror", - "validator-api-requests", "validator-client", ] @@ -3339,6 +3339,20 @@ dependencies = [ "syn", ] +[[package]] +name = "nym-api-requests" +version = "0.1.0" +dependencies = [ + "bs58", + "coconut-interface", + "cosmrs", + "cosmwasm-std", + "getset", + "mixnet-contract-common", + "schemars", + "serde", +] + [[package]] name = "nym-connect" version = "1.1.4" @@ -6339,20 +6353,6 @@ dependencies = [ "getrandom 0.2.7", ] -[[package]] -name = "validator-api-requests" -version = "0.1.0" -dependencies = [ - "bs58", - "coconut-interface", - "cosmrs", - "cosmwasm-std", - "getset", - "mixnet-contract-common", - "schemars", - "serde", -] - [[package]] name = "validator-client" version = "0.1.0" @@ -6377,6 +6377,7 @@ dependencies = [ "mixnet-contract-common", "multisig-contract-common", "network-defaults", + "nym-api-requests", "prost", "reqwest", "serde", @@ -6385,7 +6386,6 @@ dependencies = [ "thiserror", "tokio", "url", - "validator-api-requests", "vesting-contract", "vesting-contract-common", ] diff --git a/nym-connect/src-tauri/src/config/mod.rs b/nym-connect/src-tauri/src/config/mod.rs index c27bf6b6b7..dcbbe12135 100644 --- a/nym-connect/src-tauri/src/config/mod.rs +++ b/nym-connect/src-tauri/src/config/mod.rs @@ -123,7 +123,7 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str if let Ok(raw_validators) = std::env::var(config_common::defaults::var_names::API_VALIDATOR) { config .get_base_mut() - .set_custom_validator_apis(config_common::parse_validators(&raw_validators)); + .set_custom_nym_apis(config_common::parse_validators(&raw_validators)); } // Setup gateway by either registering a new one, or reusing exiting keys diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 200fc3a81c..e27b6da0db 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -2874,6 +2874,20 @@ dependencies = [ "libc", ] +[[package]] +name = "nym-api-requests" +version = "0.1.0" +dependencies = [ + "bs58", + "coconut-interface", + "cosmrs", + "cosmwasm-std", + "getset", + "mixnet-contract-common", + "schemars", + "serde", +] + [[package]] name = "nym-types" version = "1.0.0" @@ -5397,20 +5411,6 @@ dependencies = [ "getrandom 0.2.5", ] -[[package]] -name = "validator-api-requests" -version = "0.1.0" -dependencies = [ - "bs58", - "coconut-interface", - "cosmrs", - "cosmwasm-std", - "getset", - "mixnet-contract-common", - "schemars", - "serde", -] - [[package]] name = "validator-client" version = "0.1.0" @@ -5435,6 +5435,7 @@ dependencies = [ "mixnet-contract-common", "multisig-contract-common", "network-defaults", + "nym-api-requests", "prost", "reqwest", "serde", @@ -5443,7 +5444,6 @@ dependencies = [ "thiserror", "tokio", "url", - "validator-api-requests", "vesting-contract", "vesting-contract-common", ] diff --git a/nym-wallet/src-tauri/src/config/mod.rs b/nym-wallet/src-tauri/src/config/mod.rs index ee0bba8963..49d7acfdd4 100644 --- a/nym-wallet/src-tauri/src/config/mod.rs +++ b/nym-wallet/src-tauri/src/config/mod.rs @@ -255,7 +255,7 @@ impl Config { } } - pub fn select_validator_api_url(&mut self, api_url: Url, network: WalletNetwork) { + pub fn select_nym_api_url(&mut self, api_url: Url, network: WalletNetwork) { if let Some(net) = self.networks.get_mut(&network.as_key()) { net.selected_api_url = Some(api_url); } else { @@ -275,7 +275,7 @@ impl Config { .and_then(|config| config.selected_nymd_url.clone()) } - pub fn get_selected_validator_api_url(&self, network: &WalletNetwork) -> Option { + pub fn get_selected_nym_api_url(&self, network: &WalletNetwork) -> Option { self.networks .get(&network.as_key()) .and_then(|config| config.selected_api_url.clone()) diff --git a/nym-wallet/src-tauri/src/error.rs b/nym-wallet/src-tauri/src/error.rs index bceff50f54..e5a8feeef5 100644 --- a/nym-wallet/src-tauri/src/error.rs +++ b/nym-wallet/src-tauri/src/error.rs @@ -4,7 +4,7 @@ use serde::{Serialize, Serializer}; use std::io; use std::num::ParseIntError; use thiserror::Error; -use validator_client::validator_api::error::ValidatorAPIError; +use validator_client::nym_api::error::NymAPIError; use validator_client::{nymd::error::NymdError, ValidatorClientError}; #[derive(Error, Debug)] @@ -40,9 +40,9 @@ pub enum BackendError { source: eyre::Report, }, #[error("{source}")] - ValidatorApiError { + NymApiError { #[from] - source: ValidatorAPIError, + source: NymAPIError, }, #[error("{source}")] KeyDerivationError { @@ -134,12 +134,10 @@ impl Serialize for BackendError { impl From for BackendError { fn from(e: ValidatorClientError) -> Self { match e { - ValidatorClientError::ValidatorAPIError { source } => source.into(), + ValidatorClientError::NymAPIError { source } => source.into(), ValidatorClientError::MalformedUrlProvided(e) => e.into(), ValidatorClientError::NymdError(e) => e.into(), - ValidatorClientError::NoAPIUrlAvailable => { - TypesError::NoValidatorApiUrlConfigured.into() - } + ValidatorClientError::NoAPIUrlAvailable => TypesError::NoNymApiUrlConfigured.into(), } } } diff --git a/nym-wallet/src-tauri/src/main.rs b/nym-wallet/src-tauri/src/main.rs index d34a04f920..63e2a43e4f 100644 --- a/nym-wallet/src-tauri/src/main.rs +++ b/nym-wallet/src-tauri/src/main.rs @@ -10,9 +10,9 @@ use mixnet_contract_common::{Gateway, MixNode}; use crate::menu::AddDefaultSubmenus; use crate::operations::help; use crate::operations::mixnet; +use crate::operations::nym_api; use crate::operations::signatures; use crate::operations::simulate; -use crate::operations::validator_api; use crate::operations::vesting; use crate::state::WalletState; @@ -85,10 +85,10 @@ fn main() { mixnet::rewards::claim_locked_and_unlocked_delegator_reward, mixnet::send::send, network_config::add_validator, - network_config::get_validator_api_urls, + network_config::get_nym_api_urls, network_config::get_validator_nymd_urls, network_config::remove_validator, - network_config::select_validator_api_url, + network_config::select_nym_api_url, network_config::select_validator_nymd_url, network_config::update_validator_urls, state::load_config_from_files, @@ -99,13 +99,13 @@ fn main() { utils::get_old_and_incorrect_hardcoded_fee, utils::try_convert_pubkey_to_mix_id, utils::default_mixnode_cost_params, - validator_api::status::gateway_core_node_status, - validator_api::status::mixnode_core_node_status, - validator_api::status::mixnode_inclusion_probability, - validator_api::status::mixnode_reward_estimation, - validator_api::status::mixnode_stake_saturation, - validator_api::status::mixnode_status, - validator_api::status::gateway_report, + nym_api::status::gateway_core_node_status, + nym_api::status::mixnode_core_node_status, + nym_api::status::mixnode_inclusion_probability, + nym_api::status::mixnode_reward_estimation, + nym_api::status::mixnode_stake_saturation, + nym_api::status::mixnode_status, + nym_api::status::gateway_report, vesting::rewards::vesting_claim_delegator_reward, vesting::rewards::vesting_claim_operator_reward, vesting::bond::vesting_bond_gateway, diff --git a/nym-wallet/src-tauri/src/network_config.rs b/nym-wallet/src-tauri/src/network_config.rs index 43e872b717..ce976b971d 100644 --- a/nym-wallet/src-tauri/src/network_config.rs +++ b/nym-wallet/src-tauri/src/network_config.rs @@ -17,7 +17,7 @@ pub async fn get_validator_nymd_urls( } #[tauri::command] -pub async fn get_validator_api_urls( +pub async fn get_nym_api_urls( network: WalletNetwork, state: tauri::State<'_, WalletState>, ) -> Result { @@ -41,13 +41,13 @@ pub async fn select_validator_nymd_url( } #[tauri::command] -pub async fn select_validator_api_url( +pub async fn select_nym_api_url( url: &str, network: WalletNetwork, state: tauri::State<'_, WalletState>, ) -> Result<(), BackendError> { log::debug!("Selecting new validator api_url for {network}: {url}"); - state.write().await.select_validator_api_url(url, network)?; + state.write().await.select_nym_api_url(url, network)?; Ok(()) } diff --git a/nym-wallet/src-tauri/src/operations/mixnet/account.rs b/nym-wallet/src-tauri/src/operations/mixnet/account.rs index 5811c007d1..9a3afafe6d 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/account.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/account.rs @@ -128,7 +128,7 @@ async fn _connect_with_mnemonic( .map(|(network, urls)| (*network, urls.iter().next().unwrap().clone())) .collect(); - // Run connection tests on all nymd and validator-api endpoints + // Run connection tests on all nymd and nym-api endpoints let (nymd_urls, api_urls) = run_connection_test(untested_nymd_urls, untested_api_urls, &config).await; @@ -222,7 +222,7 @@ fn create_clients( }) }; - let api_url = if let Some(url) = config.get_selected_validator_api_url(&network) { + let api_url = if let Some(url) = config.get_selected_nym_api_url(&network) { log::debug!("Using selected api_url for {network}: {url}"); url.clone() } else { diff --git a/nym-wallet/src-tauri/src/operations/mixnet/bond.rs b/nym-wallet/src-tauri/src/operations/mixnet/bond.rs index 567dc84290..5807fb7270 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/bond.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/bond.rs @@ -211,7 +211,7 @@ pub async fn get_mixnode_avg_uptime( let id = details.mix_id(); log::trace!(" >>> Get average uptime percentage: mix_id = {}", id); let avg_uptime_percent = client - .validator_api + .nym_api .get_mixnode_avg_uptime(id) .await .ok() diff --git a/nym-wallet/src-tauri/src/operations/mixnet/delegate.rs b/nym-wallet/src-tauri/src/operations/mixnet/delegate.rs index dfbf46389b..8b8f615244 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/delegate.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/delegate.rs @@ -238,7 +238,7 @@ pub async fn get_all_mix_delegations( d.mix_id ); let avg_uptime_percent = client - .validator_api + .nym_api .get_mixnode_avg_uptime(d.mix_id) .await .ok() diff --git a/nym-wallet/src-tauri/src/operations/mod.rs b/nym-wallet/src-tauri/src/operations/mod.rs index 457971d8c8..c6c175ee12 100644 --- a/nym-wallet/src-tauri/src/operations/mod.rs +++ b/nym-wallet/src-tauri/src/operations/mod.rs @@ -1,6 +1,6 @@ pub mod help; pub mod mixnet; +pub mod nym_api; pub mod signatures; pub mod simulate; -pub mod validator_api; pub mod vesting; diff --git a/nym-wallet/src-tauri/src/operations/validator_api/mod.rs b/nym-wallet/src-tauri/src/operations/nym_api/mod.rs similarity index 100% rename from nym-wallet/src-tauri/src/operations/validator_api/mod.rs rename to nym-wallet/src-tauri/src/operations/nym_api/mod.rs diff --git a/nym-wallet/src-tauri/src/operations/validator_api/status.rs b/nym-wallet/src-tauri/src/operations/nym_api/status.rs similarity index 100% rename from nym-wallet/src-tauri/src/operations/validator_api/status.rs rename to nym-wallet/src-tauri/src/operations/nym_api/status.rs diff --git a/nym-wallet/src-tauri/src/state.rs b/nym-wallet/src-tauri/src/state.rs index e36dfe1b5c..319e645c57 100644 --- a/nym-wallet/src-tauri/src/state.rs +++ b/nym-wallet/src-tauri/src/state.rs @@ -300,7 +300,7 @@ impl WalletStateInner { }) } - /// Get the list of validator-api urls in the network config format, suitable for passing on to + /// Get the list of nym-api urls in the network config format, suitable for passing on to /// the UI pub fn get_api_urls( &self, @@ -425,14 +425,10 @@ impl WalletStateInner { Ok(()) } - pub fn select_validator_api_url( - &mut self, - url: &str, - network: Network, - ) -> Result<(), BackendError> { - self.config.select_validator_api_url(url.parse()?, network); + pub fn select_nym_api_url(&mut self, url: &str, network: Network) -> Result<(), BackendError> { + self.config.select_nym_api_url(url.parse()?, network); if let Ok(client) = self.client_mut(network) { - client.change_validator_api(url.parse()?); + client.change_nym_api(url.parse()?); } Ok(()) } @@ -489,7 +485,7 @@ macro_rules! nymd_client { #[macro_export] macro_rules! api_client { ($state:ident) => { - $state.read().await.current_client()?.validator_api + $state.read().await.current_client()?.nym_api }; } diff --git a/sdk/typescript/examples/plain-html/src/index.ts b/sdk/typescript/examples/plain-html/src/index.ts index 16f53c380c..d279586b72 100644 --- a/sdk/typescript/examples/plain-html/src/index.ts +++ b/sdk/typescript/examples/plain-html/src/index.ts @@ -15,11 +15,11 @@ async function main() { } // // mixnet v1 - // const validatorApiUrl = 'https://validator.nymtech.net/api'; + // const nymApiUrl = 'https://validator.nymtech.net/api'; // const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM'; // mixnet v2 - const validatorApiUrl = 'https://qwerty-validator-api.qa.nymte.ch/api'; // "http://localhost:8081"; + const nymApiUrl = 'https://qwerty-validator-api.qa.nymte.ch/api'; // "http://localhost:8081"; const preferredGatewayIdentityKey = undefined; // '36vfvEyBzo5cWEFbnP7fqgY39kFw9PQhvwzbispeNaxL'; // subscribe to connect event, so that we can show the client's address @@ -46,7 +46,7 @@ async function main() { // start up the client await nym.client.start({ clientId: 'My awesome client', - validatorApiUrl, + nymApiUrl, preferredGatewayIdentityKey, }); } diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx b/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx index 6f6f4c2039..73c028d062 100644 --- a/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx +++ b/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx @@ -95,16 +95,16 @@ export const Content: React.FC = () => { React.useEffect(() => { if (isReady) { // // mixnet v1 - // const validatorApiUrl = 'https://validator.nymtech.net/api'; + // const nymApiUrl = 'https://validator.nymtech.net/api'; // const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM'; // mixnet v2 - const validatorApiUrl = 'https://qwerty-validator-api.qa.nymte.ch/api'; // "http://localhost:8081"; + const nymApiUrl = 'https://qwerty-validator-api.qa.nymte.ch/api'; // "http://localhost:8081"; const preferredGatewayIdentityKey = undefined; // '36vfvEyBzo5cWEFbnP7fqgY39kFw9PQhvwzbispeNaxL'; connect({ clientId: 'Example Client', - validatorApiUrl, + nymApiUrl, preferredGatewayIdentityKey, }); } diff --git a/sdk/typescript/packages/sdk/README.md b/sdk/typescript/packages/sdk/README.md index e5f2fd51c5..af847d969a 100644 --- a/sdk/typescript/packages/sdk/README.md +++ b/sdk/typescript/packages/sdk/README.md @@ -18,7 +18,7 @@ import { createNymMixnetClient } from '@nymproject/sdk'; const main = async () => { const nym = await createNymMixnetClient(); - const validatorApiUrl = 'https://validator.nymtech.net/api'; + const nymApiUrl = 'https://validator.nymtech.net/api'; // show message payload content when received nym.events.subscribeToTextMessageReceivedEvent((e) => { @@ -28,7 +28,7 @@ const main = async () => { // start the client and connect to a gateway await nym.client.start({ clientId: 'My awesome client', - validatorApiUrl, + nymApiUrl, }); // send a message to yourself diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts index 36aacd5adb..498e1b40de 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts @@ -21,13 +21,13 @@ export interface NymClientConfig { /** * The URL of a validator API to query for the network topology. */ - validatorApiUrl: string; + nymApiUrl: string; /** * Optional. The identity key of the preferred gateway to connect to. */ preferredGatewayIdentityKey?: string; - + /** * Optional. The listener websocket of the preferred gateway to connect to. */ diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts index cb1c8a32e4..87d44bbb4b 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts @@ -130,19 +130,19 @@ wasm_bindgen(wasmUrl) const startHandler = async (config: NymClientConfig) => { // fetch the gateway details (randomly chosen if no preferred gateway is set) const gatewayEndpoint = await wasm_bindgen.get_gateway( - config.validatorApiUrl, + config.nymApiUrl, config.preferredGatewayIdentityKey, ); - + // set a different gatewayListener in order to avoid workaround ws over https error if (config.gatewayListener) - gatewayEndpoint.gateway_listener = config.gatewayListener; - + gatewayEndpoint.gateway_listener = config.gatewayListener; + // create the client, passing handlers for events wrapper.init( new wasm_bindgen.Config( config.clientId, - config.validatorApiUrl, + config.nymApiUrl, gatewayEndpoint, config.debug || wasm_bindgen.default_debug(), ), diff --git a/tools/nym-cli/src/main.rs b/tools/nym-cli/src/main.rs index ce81cd6a56..306d383c34 100644 --- a/tools/nym-cli/src/main.rs +++ b/tools/nym-cli/src/main.rs @@ -36,7 +36,7 @@ pub(crate) struct Cli { #[clap( help = "Overrides the validator API URL provided either as an environment variable API_VALIDATOR or in a config file" )] - pub(crate) validator_api_url: Option, + pub(crate) nym_api_url: Option, #[clap(long, global = true)] #[clap( @@ -77,7 +77,7 @@ pub(crate) enum Commands { async fn execute(cli: Cli) -> anyhow::Result<()> { let args = ClientArgs { nymd_url: cli.nymd_url, - validator_api_url: cli.validator_api_url, + nym_api_url: cli.nym_api_url, mnemonic: cli.mnemonic, mixnet_contract_address: cli.mixnet_contract_address, vesting_contract_address: cli.vesting_contract_address, diff --git a/tools/nym-cli/src/validator/mixnet/delegators/mod.rs b/tools/nym-cli/src/validator/mixnet/delegators/mod.rs index ed1ac2f211..3e40d2d26a 100644 --- a/tools/nym-cli/src/validator/mixnet/delegators/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/delegators/mod.rs @@ -3,7 +3,7 @@ use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{ - create_signing_client, create_signing_client_with_validator_api, ClientArgs, + create_signing_client, create_signing_client_with_nym_api, ClientArgs, }; pub(crate) mod rewards; @@ -24,7 +24,7 @@ pub(crate) async fn execute( nym_cli_commands::validator::mixnet::delegators::undelegate_from_mixnode::undelegate_from_mixnode(args, create_signing_client(global_args, network_details)?).await } nym_cli_commands::validator::mixnet::delegators::MixnetDelegatorsCommands::List(args) => { - nym_cli_commands::validator::mixnet::delegators::query_for_delegations::execute(args, create_signing_client_with_validator_api(global_args, network_details)?).await + nym_cli_commands::validator::mixnet::delegators::query_for_delegations::execute(args, create_signing_client_with_nym_api(global_args, network_details)?).await } _ => unreachable!(), } diff --git a/tools/nym-cli/src/validator/mixnet/query/mod.rs b/tools/nym-cli/src/validator/mixnet/query/mod.rs index 21afb8c833..ea41ebd7d6 100644 --- a/tools/nym-cli/src/validator/mixnet/query/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/query/mod.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use network_defaults::NymNetworkDetails; -use nym_cli_commands::context::create_query_client_with_validator_api; +use nym_cli_commands::context::create_query_client_with_nym_api; pub(crate) async fn execute( query: nym_cli_commands::validator::mixnet::query::MixnetQuery, @@ -12,14 +12,14 @@ pub(crate) async fn execute( nym_cli_commands::validator::mixnet::query::MixnetQueryCommands::Mixnodes(args) => { nym_cli_commands::validator::mixnet::query::query_all_mixnodes::query( args, - &create_query_client_with_validator_api(network_details)?, + &create_query_client_with_nym_api(network_details)?, ) .await } nym_cli_commands::validator::mixnet::query::MixnetQueryCommands::Gateways(args) => { nym_cli_commands::validator::mixnet::query::query_all_gateways::query( args, - &create_query_client_with_validator_api(network_details)?, + &create_query_client_with_nym_api(network_details)?, ) .await } diff --git a/tools/ts-rs-cli/Cargo.toml b/tools/ts-rs-cli/Cargo.toml index e6c3fa879e..c327083a04 100644 --- a/tools/ts-rs-cli/Cargo.toml +++ b/tools/ts-rs-cli/Cargo.toml @@ -13,7 +13,7 @@ walkdir = "2" validator-client = { path = "../../common/client-libs/validator-client", features = [ "nymd-client", "generate-ts" ] } -validator-api-requests = { path = "../../validator-api/validator-api-requests", features = ["generate-ts"] } +nym-api-requests = { path = "../../nym-api/nym-api-requests", features = ["generate-ts"] } mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract", features = [ "generate-ts" ] } vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract", features = [ "generate-ts" ] } nym-types = { path = "../../common/types", features = [ "generate-ts" ] } diff --git a/tools/ts-rs-cli/src/main.rs b/tools/ts-rs-cli/src/main.rs index 42217d4d8b..762dd4b03f 100644 --- a/tools/ts-rs-cli/src/main.rs +++ b/tools/ts-rs-cli/src/main.rs @@ -3,6 +3,11 @@ use mixnet_contract_common::{ Interval as ContractInterval, IntervalRewardParams, IntervalRewardingParamsUpdate, MixNode, MixNodeConfigUpdate, RewardedSetNodeStatus, RewardingParams, UnbondedMixnode, }; +use nym_api_requests::models::{ + GatewayCoreStatusResponse, InclusionProbabilityResponse, MixnodeCoreStatusResponse, + MixnodeStatus, MixnodeStatusResponse, RewardEstimationResponse, SelectionChance, + StakeSaturationResponse, +}; use nym_types::account::{Account, AccountEntry, AccountWithMnemonic, Balance}; use nym_types::currency::{CurrencyDenom, DecCoin}; use nym_types::delegation::{ @@ -27,11 +32,6 @@ use nym_wallet_types::network::Network; use nym_wallet_types::network_config::{Validator, ValidatorUrl, ValidatorUrls}; use std::path::Path; use ts_rs::TS; -use validator_api_requests::models::{ - GatewayCoreStatusResponse, InclusionProbabilityResponse, MixnodeCoreStatusResponse, - MixnodeStatus, MixnodeStatusResponse, RewardEstimationResponse, SelectionChance, - StakeSaturationResponse, -}; use vesting_contract_common::Period; use walkdir::WalkDir; @@ -112,7 +112,7 @@ fn main() { do_export!(VestingPeriod); do_export!(WrappedDelegationEvent); - // validator-api-requests + // nym-api-requests do_export!(MixnodeCoreStatusResponse); do_export!(GatewayCoreStatusResponse); do_export!(InclusionProbabilityResponse); From eb07ec85805f83989647b369ffada6fc2b5fb91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 14 Dec 2022 17:13:00 +0100 Subject: [PATCH 017/591] client: sort out shutdown procedure and harmonize with socks5-client (#2695) * common/task: rename ShutdownNotifier to TaskManager * nym-client: return boxed error * nym-client: enable graceful shutdown * nym-client: task wait on shutdown to instead exit on closed channel * Fix build * Fix unused * changelog: update --- CHANGELOG.md | 1 + .../client-core/src/client/base_client/mod.rs | 48 +++++++------- .../src/client/cover_traffic_stream.rs | 2 +- clients/client-core/src/client/mix_traffic.rs | 7 +- .../acknowledgement_listener.rs | 4 +- .../action_controller.rs | 4 +- .../input_message_listener.rs | 4 +- .../acknowledgement_control/mod.rs | 2 +- .../retransmission_request_listener.rs | 4 +- .../sent_notification_listener.rs | 4 +- .../src/client/real_messages_control/mod.rs | 2 +- .../real_traffic_stream.rs | 6 +- .../sending_delay_controller.rs | 2 + .../client-core/src/client/received_buffer.rs | 28 ++++---- .../src/client/replies/reply_controller.rs | 4 +- .../src/client/replies/reply_storage/mod.rs | 2 +- .../src/client/topology_control.rs | 2 +- clients/native/src/client/mod.rs | 41 +++++++----- clients/native/src/commands/mod.rs | 5 +- clients/native/src/commands/run.rs | 8 ++- clients/native/src/main.rs | 5 +- clients/native/src/websocket/handler.rs | 66 ++++++++++++------- clients/native/src/websocket/listener.rs | 25 +++++-- clients/socks5/src/client/mod.rs | 16 +++-- clients/socks5/src/socks/client.rs | 6 +- clients/socks5/src/socks/mixnet_responses.rs | 6 +- clients/socks5/src/socks/server.rs | 6 +- clients/webassembly/src/client/mod.rs | 6 +- .../client-libs/gateway-client/src/client.rs | 8 +-- .../gateway-client/src/packet_router.rs | 6 +- .../gateway-client/src/socket_state.rs | 4 +- common/mixnode-common/src/verloc/listener.rs | 8 +-- common/mixnode-common/src/verloc/mod.rs | 6 +- common/mixnode-common/src/verloc/sender.rs | 6 +- .../src/connection_controller.rs | 6 +- .../proxy-helpers/src/proxy_runner/inbound.rs | 4 +- .../proxy-helpers/src/proxy_runner/mod.rs | 6 +- .../src/proxy_runner/outbound.rs | 4 +- common/task/src/lib.rs | 5 +- common/task/src/{shutdown.rs => manager.rs} | 64 ++++++++++-------- common/task/src/signal.rs | 6 +- common/task/src/spawn.rs | 4 +- .../src/country_statistics/distribution.rs | 6 +- .../src/country_statistics/geolocate.rs | 6 +- explorer-api/src/main.rs | 6 +- explorer-api/src/tasks.rs | 6 +- .../node/listener/connection_handler/mod.rs | 4 +- mixnode/src/node/listener/mod.rs | 6 +- mixnode/src/node/mod.rs | 14 ++-- mixnode/src/node/node_statistics.rs | 20 +++--- mixnode/src/node/packet_delayforwarder.rs | 10 +-- nym-api/src/coconut/dkg/controller.rs | 4 +- nym-api/src/contract_cache/mod.rs | 4 +- nym-api/src/epoch_operations/mod.rs | 9 +-- nym-api/src/main.rs | 6 +- nym-api/src/network_monitor/mod.rs | 4 +- .../monitor/gateways_pinger.rs | 4 +- nym-api/src/network_monitor/monitor/mod.rs | 4 +- .../src/network_monitor/monitor/receiver.rs | 4 +- nym-api/src/network_monitor/monitor/sender.rs | 10 +-- nym-api/src/node_status_api/cache.rs | 4 +- nym-api/src/node_status_api/uptime_updater.rs | 4 +- .../network-requester/src/connection.rs | 4 +- .../network-requester/src/core.rs | 10 +-- 64 files changed, 325 insertions(+), 277 deletions(-) rename common/task/src/{shutdown.rs => manager.rs} (89%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b66b2305c..a40671598e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ### Changed - all-binaries: improved error logging ([#2686]) +- native client: bring shutdown logic up to the same level as socks5-client [#2686]: https://github.com/nymtech/nym/pull/2686 diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index 6db0280019..807170cc84 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -36,19 +36,19 @@ use nymsphinx::addressing::nodes::NodeIdentity; use std::sync::Arc; use std::time::Duration; use tap::TapFallible; -use task::{ShutdownListener, ShutdownNotifier}; +use task::{TaskClient, TaskManager}; use url::Url; #[cfg(all(not(target_arch = "wasm32"), feature = "fs-surb-storage"))] pub mod non_wasm_helpers; pub struct ClientInput { - pub shared_lane_queue_lengths: LaneQueueLengths, pub connection_command_sender: ConnectionCommandSender, pub input_sender: InputMessageSender, } pub struct ClientOutput { + pub shared_lane_queue_lengths: LaneQueueLengths, pub received_buffer_request_sender: ReceivedBufferRequestSender, } @@ -127,8 +127,8 @@ where debug_config, disabled_credentials, nym_api_endpoints, - bandwidth_controller, reply_storage_backend, + bandwidth_controller, key_manager, } } @@ -151,7 +151,7 @@ where self_address: Recipient, topology_accessor: TopologyAccessor, mix_tx: BatchMixMessageSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { info!("Starting loop cover traffic stream..."); @@ -185,7 +185,7 @@ where reply_controller_receiver: ReplyControllerReceiver, lane_queue_lengths: LaneQueueLengths, client_connection_rx: ConnectionCommandReceiver, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { info!("Starting real traffic stream..."); @@ -212,7 +212,7 @@ where mixnet_receiver: MixnetMessageReceiver, reply_key_storage: SentReplyKeys, reply_controller_sender: ReplyControllerSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { info!("Starting received messages buffer controller..."); ReceivedMessagesBufferController::new( @@ -229,7 +229,7 @@ where &mut self, mixnet_message_sender: MixnetMessageSender, ack_sender: AcknowledgementSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Result> { let gateway_id = self.gateway_config.gateway_id.clone(); if gateway_id.is_empty() { @@ -284,7 +284,7 @@ where nym_api_urls: Vec, refresh_rate: Duration, topology_accessor: TopologyAccessor, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Result<(), ClientCoreError> { let topology_refresher_config = TopologyRefresherConfig::new( nym_api_urls, @@ -317,7 +317,7 @@ where // requests? fn start_mix_traffic_controller( gateway_client: GatewayClient, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> BatchMixMessageSender { info!("Starting mix traffic controller..."); let (mix_traffic_controller, mix_tx) = MixTrafficController::new(gateway_client); @@ -327,7 +327,7 @@ where async fn setup_persistent_reply_storage( backend: B, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Result> { let persistent_storage = PersistentReplyStorage::new(backend); let mem_store = persistent_storage @@ -367,7 +367,7 @@ where let shared_topology_accessor = TopologyAccessor::new(); // Shutdown notifier for signalling tasks to stop - let shutdown = ShutdownNotifier::default(); + let task_manager = TaskManager::default(); // channels responsible for dealing with reply-related fun let (reply_controller_sender, reply_controller_receiver) = @@ -378,18 +378,20 @@ where // the components are started in very specific order. Unless you know what you are doing, // do not change that. let gateway_client = self - .start_gateway_client(mixnet_messages_sender, ack_sender, shutdown.subscribe()) + .start_gateway_client(mixnet_messages_sender, ack_sender, task_manager.subscribe()) .await?; - let reply_storage = - Self::setup_persistent_reply_storage(self.reply_storage_backend, shutdown.subscribe()) - .await?; + let reply_storage = Self::setup_persistent_reply_storage( + self.reply_storage_backend, + task_manager.subscribe(), + ) + .await?; Self::start_topology_refresher( self.nym_api_endpoints.clone(), self.debug_config.topology_refresh_rate, shared_topology_accessor.clone(), - shutdown.subscribe(), + task_manager.subscribe(), ) .await?; @@ -399,7 +401,7 @@ where mixnet_messages_receiver, reply_storage.key_storage(), reply_controller_sender.clone(), - shutdown.subscribe(), + task_manager.subscribe(), ); // The sphinx_message_sender is the transmitter for any component generating sphinx packets @@ -407,7 +409,7 @@ where // traffic stream. // The MixTrafficController then sends the actual traffic let sphinx_message_sender = - Self::start_mix_traffic_controller(gateway_client, shutdown.subscribe()); + Self::start_mix_traffic_controller(gateway_client, task_manager.subscribe()); // Channels that the websocket listener can use to signal downstream to the real traffic // controller that connections are closed. @@ -439,7 +441,7 @@ where reply_controller_receiver, shared_lane_queue_lengths.clone(), client_connection_rx, - shutdown.subscribe(), + task_manager.subscribe(), ); if !self.debug_config.disable_loop_cover_traffic_stream { @@ -449,7 +451,7 @@ where self_address, shared_topology_accessor, sphinx_message_sender, - shutdown.subscribe(), + task_manager.subscribe(), ); } @@ -459,17 +461,17 @@ where Ok(BaseClient { client_input: ClientInputStatus::AwaitingProducer { client_input: ClientInput { - shared_lane_queue_lengths, connection_command_sender: client_connection_tx, input_sender, }, }, client_output: ClientOutputStatus::AwaitingConsumer { client_output: ClientOutput { + shared_lane_queue_lengths, received_buffer_request_sender, }, }, - shutdown_notifier: shutdown, + task_manager, }) } } @@ -478,5 +480,5 @@ pub struct BaseClient { pub client_input: ClientInputStatus, pub client_output: ClientOutputStatus, - pub shutdown_notifier: ShutdownNotifier, + pub task_manager: TaskManager, } diff --git a/clients/client-core/src/client/cover_traffic_stream.rs b/clients/client-core/src/client/cover_traffic_stream.rs index e3fd0ca197..a8ecad86b2 100644 --- a/clients/client-core/src/client/cover_traffic_stream.rs +++ b/clients/client-core/src/client/cover_traffic_stream.rs @@ -213,7 +213,7 @@ impl LoopCoverTrafficStream { tokio::task::yield_now().await; } - pub fn start_with_shutdown(mut self, mut shutdown: task::ShutdownListener) { + pub fn start_with_shutdown(mut self, mut shutdown: task::TaskClient) { // we should set initial delay only when we actually start the stream let sampled = sample_poisson_duration(&mut self.rng, self.average_cover_message_sending_delay); diff --git a/clients/client-core/src/client/mix_traffic.rs b/clients/client-core/src/client/mix_traffic.rs index ccba8f86ca..94944cb481 100644 --- a/clients/client-core/src/client/mix_traffic.rs +++ b/clients/client-core/src/client/mix_traffic.rs @@ -67,11 +67,11 @@ impl MixTrafficController { } } - pub fn start_with_shutdown(mut self, mut shutdown: task::ShutdownListener) { + pub fn start_with_shutdown(mut self, mut shutdown: task::TaskClient) { spawn_future(async move { debug!("Started MixTrafficController with graceful shutdown support"); - while !shutdown.is_shutdown() { + loop { tokio::select! { mix_packets = self.mix_rx.recv() => match mix_packets { Some(mix_packets) => { @@ -82,8 +82,9 @@ impl MixTrafficController { break; } }, - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("MixTrafficController: Received shutdown"); + break; } } } diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs index 95c431fd59..8febbfa85d 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs @@ -65,7 +65,7 @@ impl AcknowledgementListener { } } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started AcknowledgementListener with graceful shutdown support"); while !shutdown.is_shutdown() { @@ -77,7 +77,7 @@ impl AcknowledgementListener { break; } }, - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("AcknowledgementListener: Received shutdown"); } } diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs index cb2e0cc7ca..c65592b2f6 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs @@ -249,7 +249,7 @@ impl ActionController { } } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started ActionController with graceful shutdown support"); while !shutdown.is_shutdown() { @@ -270,7 +270,7 @@ impl ActionController { break; } }, - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("ActionController: Received shutdown"); } } diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs index cff6b6d719..f492de1aae 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs @@ -109,7 +109,7 @@ where }; } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started InputMessageListener with graceful shutdown support"); while !shutdown.is_shutdown() { @@ -123,7 +123,7 @@ where break; } }, - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("InputMessageListener: Received shutdown"); } } diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs index 5587958f33..befc24b86a 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs @@ -249,7 +249,7 @@ where } } - pub(super) fn start_with_shutdown(self, shutdown: task::ShutdownListener) { + pub(super) fn start_with_shutdown(self, shutdown: task::TaskClient) { let mut acknowledgement_listener = self.acknowledgement_listener; let mut input_message_listener = self.input_message_listener; let mut retransmission_request_listener = self.retransmission_request_listener; diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs index b5c6e6a2a8..50a930b94e 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs @@ -137,7 +137,7 @@ where .await } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started RetransmissionRequestListener with graceful shutdown support"); while !shutdown.is_shutdown() { @@ -149,7 +149,7 @@ where break; } }, - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("RetransmissionRequestListener: Received shutdown"); } } diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs index c273182d59..a931ce4962 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs @@ -37,7 +37,7 @@ impl SentNotificationListener { .unwrap(); } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started SentNotificationListener with graceful shutdown support"); while !shutdown.is_shutdown() { @@ -51,7 +51,7 @@ impl SentNotificationListener { break; } }, - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("SentNotificationListener: Received shutdown"); } } diff --git a/clients/client-core/src/client/real_messages_control/mod.rs b/clients/client-core/src/client/real_messages_control/mod.rs index 8789cbdf6a..df04365c9b 100644 --- a/clients/client-core/src/client/real_messages_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/mod.rs @@ -263,7 +263,7 @@ impl RealMessagesController { } } - pub fn start_with_shutdown(self, shutdown: task::ShutdownListener) { + pub fn start_with_shutdown(self, shutdown: task::TaskClient) { let mut out_queue_control = self.out_queue_control; let ack_control = self.ack_control; let mut reply_control = self.reply_control; diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs index ef1c03046d..a7d62910e5 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs @@ -469,7 +469,7 @@ where } #[cfg(not(target_arch = "wasm32"))] - fn log_status(&self, shutdown: &mut task::ShutdownListener) { + fn log_status(&self, shutdown: &mut task::TaskClient) { use crate::error::ClientCoreStatusMessage; let packets = self.transmission_buffer.total_size(); @@ -514,7 +514,7 @@ where } } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started OutQueueControl with graceful shutdown support"); #[cfg(not(target_arch = "wasm32"))] @@ -525,7 +525,7 @@ where while !shutdown.is_shutdown() { tokio::select! { biased; - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("OutQueueControl: Received shutdown"); } _ = status_timer.tick() => { diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream/sending_delay_controller.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream/sending_delay_controller.rs index 4ae2632b85..b7fdff2299 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream/sending_delay_controller.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream/sending_delay_controller.rs @@ -77,10 +77,12 @@ impl SendingDelayController { self.current_multiplier } + #[cfg(not(target_arch = "wasm32"))] pub(crate) fn min_multiplier(&self) -> u32 { self.lower_bound } + #[cfg(not(target_arch = "wasm32"))] pub(crate) fn max_multiplier(&self) -> u32 { self.upper_bound } diff --git a/clients/client-core/src/client/received_buffer.rs b/clients/client-core/src/client/received_buffer.rs index 2e7876ae62..afafec44ca 100644 --- a/clients/client-core/src/client/received_buffer.rs +++ b/clients/client-core/src/client/received_buffer.rs @@ -399,21 +399,20 @@ impl RequestReceiver { } } - async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started RequestReceiver with graceful shutdown support"); while !shutdown.is_shutdown() { tokio::select! { biased; - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("RequestReceiver: Received shutdown"); } request = self.query_receiver.next() => { - match request { - Some(message) => self.handle_message(message).await, - None => { - log::trace!("RequestReceiver: Stopping since channel closed"); - break; - }, + if let Some(message) = request { + self.handle_message(message).await + } else { + log::trace!("RequestReceiver: Stopping since channel closed"); + break; } }, } @@ -439,20 +438,19 @@ impl FragmentedMessageReceiver { } } - async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started FragmentedMessageReceiver with graceful shutdown support"); while !shutdown.is_shutdown() { tokio::select! { - new_messages = self.mixnet_packet_receiver.next() => match new_messages { - Some(new_messages) => { + new_messages = self.mixnet_packet_receiver.next() => { + if let Some(new_messages) = new_messages { self.received_buffer.handle_new_received(new_messages).await; - } - None => { + } else { log::trace!("FragmentedMessageReceiver: Stopping since channel closed"); break; } }, - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("FragmentedMessageReceiver: Received shutdown"); } } @@ -490,7 +488,7 @@ impl ReceivedMessagesBufferController { } } - pub fn start_with_shutdown(self, shutdown: task::ShutdownListener) { + pub fn start_with_shutdown(self, shutdown: task::TaskClient) { let mut fragmented_message_receiver = self.fragmented_message_receiver; let mut request_receiver = self.request_receiver; diff --git a/clients/client-core/src/client/replies/reply_controller.rs b/clients/client-core/src/client/replies/reply_controller.rs index 99687527f0..8716203734 100644 --- a/clients/client-core/src/client/replies/reply_controller.rs +++ b/clients/client-core/src/client/replies/reply_controller.rs @@ -891,7 +891,7 @@ where return gloo_timers::future::IntervalStream::new(polling_rate.as_millis() as u32); } - pub(crate) async fn run_with_shutdown(&mut self, mut shutdown: task::ShutdownListener) { + pub(crate) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { debug!("Started ReplyController with graceful shutdown support"); let polling_rate = Duration::from_secs(5); @@ -904,7 +904,7 @@ where while !shutdown.is_shutdown() { tokio::select! { biased; - _ = shutdown.recv() => { + _ = shutdown.recv_with_delay() => { log::trace!("ReplyController: Received shutdown"); }, req = self.request_receiver.next() => match req { diff --git a/clients/client-core/src/client/replies/reply_storage/mod.rs b/clients/client-core/src/client/replies/reply_storage/mod.rs index 83c0e0e34f..c74ad2bb6b 100644 --- a/clients/client-core/src/client/replies/reply_storage/mod.rs +++ b/clients/client-core/src/client/replies/reply_storage/mod.rs @@ -37,7 +37,7 @@ where pub async fn flush_on_shutdown( mut self, mem_state: CombinedReplyStorage, - mut shutdown: task::ShutdownListener, + mut shutdown: task::TaskClient, ) { use log::{debug, error, info, warn}; diff --git a/clients/client-core/src/client/topology_control.rs b/clients/client-core/src/client/topology_control.rs index 897d6a0e3b..c51fd350cd 100644 --- a/clients/client-core/src/client/topology_control.rs +++ b/clients/client-core/src/client/topology_control.rs @@ -304,7 +304,7 @@ impl TopologyRefresher { self.topology_accessor.ensure_is_routable().await } - pub fn start_with_shutdown(mut self, mut shutdown: task::ShutdownListener) { + pub fn start_with_shutdown(mut self, mut shutdown: task::TaskClient) { spawn_future(async move { debug!("Started TopologyRefresher with graceful shutdown support"); diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index 0d61b502ab..1a90c48b6f 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -1,6 +1,8 @@ // Copyright 2021-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::error::Error; + use crate::client::config::Config; use crate::error::ClientError; use crate::websocket; @@ -18,7 +20,7 @@ use log::*; use nymsphinx::addressing::clients::Recipient; use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; use nymsphinx::receiver::ReconstructedMessage; -use task::{wait_for_signal, ShutdownNotifier}; +use task::TaskManager; pub(crate) mod config; @@ -85,16 +87,19 @@ impl SocketClient { client_input: ClientInput, client_output: ClientOutput, self_address: Recipient, + shutdown: task::TaskClient, ) { info!("Starting websocket listener..."); let ClientInput { - shared_lane_queue_lengths, connection_command_sender, input_sender, } = client_input; - let received_buffer_request_sender = client_output.received_buffer_request_sender; + let ClientOutput { + shared_lane_queue_lengths, + received_buffer_request_sender, + } = client_output; let websocket_handler = websocket::Handler::new( input_sender, @@ -104,32 +109,26 @@ impl SocketClient { shared_lane_queue_lengths, ); - websocket::Listener::new(config.get_listening_port()).start(websocket_handler); + websocket::Listener::new(config.get_listening_port()).start(websocket_handler, shutdown); } /// blocking version of `start_socket` method. Will run forever (or until SIGINT is sent) - pub async fn run_socket_forever(self) -> Result<(), ClientError> { + pub async fn run_socket_forever(self) -> Result<(), Box> { let mut shutdown = self.start_socket().await?; - wait_for_signal().await; - println!( - "Received signal - the client will terminate now (threads are not yet nicely stopped, if you see stack traces that's alright)." - ); + let res = task::wait_for_signal_and_error(&mut shutdown).await; log::info!("Sending shutdown"); shutdown.signal_shutdown().ok(); - // Some of these components have shutdown signalling implemented as part of socks5 work, - // but since it's not fully implemented (yet) for all the components of the native client, - // we don't try to wait and instead just stop immediately. log::info!("Waiting for tasks to finish... (Press ctrl-c to force)"); shutdown.wait_for_shutdown().await; log::info!("Stopping nym-client"); - Ok(()) + res } - pub async fn start_socket(self) -> Result { + pub async fn start_socket(self) -> Result { if !self.config.get_socket_type().is_websocket() { return Err(ClientError::InvalidSocketMode); } @@ -150,12 +149,18 @@ impl SocketClient { let client_input = started_client.client_input.register_producer(); let client_output = started_client.client_output.register_consumer(); - Self::start_websocket_listener(&self.config, client_input, client_output, self_address); + Self::start_websocket_listener( + &self.config, + client_input, + client_output, + self_address, + started_client.task_manager.subscribe(), + ); info!("Client startup finished!"); info!("The address of this client is: {}", self_address); - Ok(started_client.shutdown_notifier) + Ok(started_client.task_manager) } pub async fn start_direct(self) -> Result { @@ -192,7 +197,7 @@ impl SocketClient { Ok(DirectClient { client_input, reconstructed_receiver, - _shutdown_notifier: started_client.shutdown_notifier, + _shutdown_notifier: started_client.task_manager, }) } } @@ -202,7 +207,7 @@ pub struct DirectClient { reconstructed_receiver: ReconstructedMessagesReceiver, // we need to keep reference to this guy otherwise things will start dropping - _shutdown_notifier: ShutdownNotifier, + _shutdown_notifier: TaskManager, } impl DirectClient { diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index 4ad9d414dc..cf40470556 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -1,8 +1,9 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::error::Error; + use crate::client::config::{Config, SocketType}; -use crate::error::ClientError; use clap::CommandFactory; use clap::{Parser, Subcommand}; use completions::{fig_generate, ArgShell}; @@ -86,7 +87,7 @@ pub(crate) struct OverrideConfig { enabled_credentials_mode: bool, } -pub(crate) async fn execute(args: &Cli) -> Result<(), ClientError> { +pub(crate) async fn execute(args: &Cli) -> Result<(), Box> { let bin_name = "nym-native-client"; match &args.command { diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index d5c7eccbdb..3fffa60e18 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -1,6 +1,8 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::error::Error; + use crate::{ client::{config::Config, SocketClient}, commands::{override_config, OverrideConfig}, @@ -89,14 +91,14 @@ fn version_check(cfg: &Config) -> bool { } } -pub(crate) async fn execute(args: &Run) -> Result<(), ClientError> { +pub(crate) async fn execute(args: &Run) -> Result<(), Box> { let id = &args.id; let mut config = match Config::load_from_file(Some(id)) { Ok(cfg) => cfg, Err(err) => { error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", id); - return Err(ClientError::FailedToLoadConfig(id.to_string())); + return Err(Box::new(ClientError::FailedToLoadConfig(id.to_string()))); } }; @@ -105,7 +107,7 @@ pub(crate) async fn execute(args: &Run) -> Result<(), ClientError> { if !version_check(&config) { error!("failed the local version check"); - return Err(ClientError::FailedLocalVersionCheck); + return Err(Box::new(ClientError::FailedLocalVersionCheck)); } SocketClient::new(config).run_socket_forever().await diff --git a/clients/native/src/main.rs b/clients/native/src/main.rs index 00529494e7..972eef1925 100644 --- a/clients/native/src/main.rs +++ b/clients/native/src/main.rs @@ -1,8 +1,9 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::error::Error; + use clap::{crate_version, Parser}; -use error::ClientError; use logging::setup_logging; use network_defaults::setup_env; @@ -12,7 +13,7 @@ pub mod error; pub mod websocket; #[tokio::main] -async fn main() -> Result<(), ClientError> { +async fn main() -> Result<(), Box> { setup_logging(); println!("{}", banner()); diff --git a/clients/native/src/websocket/handler.rs b/clients/native/src/websocket/handler.rs index 476eb0a567..f35058485e 100644 --- a/clients/native/src/websocket/handler.rs +++ b/clients/native/src/websocket/handler.rs @@ -43,29 +43,16 @@ pub(crate) struct Handler { socket: Option>, received_response_type: ReceivedResponseType, lane_queue_lengths: LaneQueueLengths, -} - -// clone is used to use handler on a new connection, which initially is `None` -impl Clone for Handler { - fn clone(&self) -> Self { - Handler { - msg_input: self.msg_input.clone(), - client_connection_tx: self.client_connection_tx.clone(), - buffer_requester: self.buffer_requester.clone(), - self_full_address: self.self_full_address, - socket: None, - received_response_type: Default::default(), - lane_queue_lengths: self.lane_queue_lengths.clone(), - } - } + is_active: bool, } impl Drop for Handler { fn drop(&mut self) { - if self - .buffer_requester - .unbounded_send(ReceivedBufferMessage::ReceiverDisconnect) - .is_err() + if self.is_active + && self + .buffer_requester + .unbounded_send(ReceivedBufferMessage::ReceiverDisconnect) + .is_err() { error!("we failed to disconnect the receiver from the buffer! presumably the shutdown procedure has been initiated!") } @@ -88,6 +75,22 @@ impl Handler { socket: None, received_response_type: Default::default(), lane_queue_lengths, + is_active: false, + } + } + + // Used to use handler on a new connection, which initially is `None` + // TODO: make sure we only ever have one active handler + pub fn create_active_handler(&self) -> Self { + Handler { + msg_input: self.msg_input.clone(), + client_connection_tx: self.client_connection_tx.clone(), + buffer_requester: self.buffer_requester.clone(), + self_full_address: self.self_full_address, + socket: None, + received_response_type: Default::default(), + lane_queue_lengths: self.lane_queue_lengths.clone(), + is_active: true, } } @@ -362,8 +365,12 @@ impl Handler { } } - async fn listen_for_requests(&mut self, mut msg_receiver: ReconstructedMessagesReceiver) { - loop { + async fn listen_for_requests( + &mut self, + mut msg_receiver: ReconstructedMessagesReceiver, + mut task_client: task::TaskClient, + ) { + while !task_client.is_shutdown() { tokio::select! { // we can either get a client request from the websocket socket_msg = self.next_websocket_request() => { @@ -402,12 +409,24 @@ impl Handler { break; } } + _ = task_client.recv() => { + log::trace!("Websocket handler: Received shutdown"); + } } } + log::debug!("Websocket handler: Exiting"); } // consume self to make sure `drop` is called after this is done - pub(crate) async fn handle_connection(mut self, socket: TcpStream) { + pub(crate) async fn handle_connection( + mut self, + socket: TcpStream, + mut task_client: task::TaskClient, + ) { + // We don't want a crash in the connection handler to trigger a shutdown of the whole + // process. + task_client.mark_as_success(); + let ws_stream = match accept_async(socket).await { Ok(ws_stream) => ws_stream, Err(err) => { @@ -426,7 +445,8 @@ impl Handler { )) .expect("the buffer request failed!"); - self.listen_for_requests(reconstructed_receiver).await; + self.listen_for_requests(reconstructed_receiver, task_client) + .await; } } diff --git a/clients/native/src/websocket/listener.rs b/clients/native/src/websocket/listener.rs index cf9c7cfa65..aef9150b43 100644 --- a/clients/native/src/websocket/listener.rs +++ b/clients/native/src/websocket/listener.rs @@ -32,7 +32,7 @@ impl Listener { } } - pub(crate) async fn run(&mut self, handler: Handler) { + pub(crate) async fn run(&mut self, handler: Handler, mut task_client: task::TaskClient) { let tcp_listener = match tokio::net::TcpListener::bind(self.address).await { Ok(listener) => listener, Err(err) => { @@ -45,10 +45,23 @@ impl Listener { loop { tokio::select! { + // When the handler finishes we check if shutdown is signalled _ = notify.notified() => { + if task_client.is_shutdown() { + log::trace!("Websocket listener: detected shutdown after connection closed"); + break; + } // our connection terminated - we are open to a new one now! self.state = State::AwaitingConnection; } + // ... but when there is no connected client at the time of shutdown being + // signalled, we handle it here. + _ = task_client.recv() => { + if !self.state.is_connected() { + log::trace!("Not connected: shutting down"); + break; + } + } new_conn = tcp_listener.accept() => { match new_conn { Ok((mut socket, remote_addr)) => { @@ -70,9 +83,10 @@ impl Listener { // it's done so that any new connections to this listener could be rejected rather than left // hanging because the executor doesn't come back here let notify_clone = Arc::clone(¬ify); - let fresh_handler = handler.clone(); + let fresh_handler = handler.create_active_handler(); + let task_client_handler = task_client.clone(); tokio::spawn(async move { - fresh_handler.handle_connection(socket).await; + fresh_handler.handle_connection(socket, task_client_handler).await; notify_clone.notify_one(); }); self.state = State::Connected; @@ -83,11 +97,12 @@ impl Listener { } } } + log::debug!("Websocket listener: Exiting"); } - pub(crate) fn start(mut self, handler: Handler) -> JoinHandle<()> { + pub(crate) fn start(mut self, handler: Handler, shutdown: task::TaskClient) -> JoinHandle<()> { info!("Running websocket on {:?}", self.address.to_string()); - tokio::spawn(async move { self.run(handler).await }) + tokio::spawn(async move { self.run(handler, shutdown).await }) } } diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index 45c9ffad7f..2f62354a01 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -19,7 +19,7 @@ use gateway_client::bandwidth::BandwidthController; use log::*; use nymsphinx::addressing::clients::Recipient; use std::error::Error; -use task::{wait_for_signal_and_error, ShutdownListener, ShutdownNotifier}; +use task::{wait_for_signal_and_error, TaskClient, TaskManager}; pub mod config; @@ -96,19 +96,21 @@ impl NymClient { client_input: ClientInput, client_output: ClientOutput, self_address: Recipient, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { info!("Starting socks5 listener..."); let auth_methods = vec![AuthenticationMethods::NoAuth as u8]; let allowed_users: Vec = Vec::new(); let ClientInput { - shared_lane_queue_lengths, connection_command_sender, input_sender, } = client_input; - let received_buffer_request_sender = client_output.received_buffer_request_sender; + let ClientOutput { + shared_lane_queue_lengths, + received_buffer_request_sender, + } = client_output; let authenticator = Authenticator::new(auth_methods, allowed_users); let mut sphinx_socks = SphinxSocksServer::new( @@ -200,7 +202,7 @@ impl NymClient { res } - pub async fn start(self) -> Result { + pub async fn start(self) -> Result { let base_builder = BaseClientBuilder::new_from_base_config( self.config.get_base(), self.key_manager, @@ -222,12 +224,12 @@ impl NymClient { client_input, client_output, self_address, - started_client.shutdown_notifier.subscribe(), + started_client.task_manager.subscribe(), ); info!("Client startup finished!"); info!("The address of this client is: {}", self_address); - Ok(started_client.shutdown_notifier) + Ok(started_client.task_manager) } } diff --git a/clients/socks5/src/socks/client.rs b/clients/socks5/src/socks/client.rs index e5a8fc9d56..ff7caa1b6b 100644 --- a/clients/socks5/src/socks/client.rs +++ b/clients/socks5/src/socks/client.rs @@ -20,7 +20,7 @@ use socks5_requests::{ConnectionId, Message, RemoteAddress, Request}; use std::io; use std::net::SocketAddr; use std::pin::Pin; -use task::ShutdownListener; +use task::TaskClient; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, ReadBuf}; use tokio::{self, net::TcpStream}; @@ -164,7 +164,7 @@ pub(crate) struct SocksClient { self_address: Recipient, started_proxy: bool, lane_queue_lengths: LaneQueueLengths, - shutdown_listener: ShutdownListener, + shutdown_listener: TaskClient, } impl Drop for SocksClient { @@ -190,7 +190,7 @@ impl SocksClient { controller_sender: ControllerSender, self_address: &Recipient, lane_queue_lengths: LaneQueueLengths, - mut shutdown_listener: ShutdownListener, + mut shutdown_listener: TaskClient, ) -> Self { // If this task fails and exits, we don't want to send shutdown signal shutdown_listener.mark_as_success(); diff --git a/clients/socks5/src/socks/mixnet_responses.rs b/clients/socks5/src/socks/mixnet_responses.rs index d4fb8fd544..97835340df 100644 --- a/clients/socks5/src/socks/mixnet_responses.rs +++ b/clients/socks5/src/socks/mixnet_responses.rs @@ -9,13 +9,13 @@ use client_core::client::received_buffer::{ReceivedBufferMessage, ReceivedBuffer use nymsphinx::receiver::ReconstructedMessage; use proxy_helpers::connection_controller::{ControllerCommand, ControllerSender}; use socks5_requests::Message; -use task::ShutdownListener; +use task::TaskClient; pub(crate) struct MixnetResponseListener { buffer_requester: ReceivedBufferRequestSender, mix_response_receiver: ReconstructedMessagesReceiver, controller_sender: ControllerSender, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl Drop for MixnetResponseListener { @@ -37,7 +37,7 @@ impl MixnetResponseListener { pub(crate) fn new( buffer_requester: ReceivedBufferRequestSender, controller_sender: ControllerSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { let (mix_response_sender, mix_response_receiver) = mpsc::unbounded(); buffer_requester diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index a7e0a3c0e3..0b193dc9d4 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -13,7 +13,7 @@ use nymsphinx::addressing::clients::Recipient; use proxy_helpers::connection_controller::{BroadcastActiveConnections, Controller}; use std::net::SocketAddr; use tap::TapFallible; -use task::ShutdownListener; +use task::TaskClient; use tokio::net::TcpListener; /// A Socks5 server that listens for connections. @@ -24,7 +24,7 @@ pub struct SphinxSocksServer { self_address: Recipient, client_config: client::Config, lane_queue_lengths: LaneQueueLengths, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl SphinxSocksServer { @@ -36,7 +36,7 @@ impl SphinxSocksServer { self_address: Recipient, lane_queue_lengths: LaneQueueLengths, client_config: client::Config, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { // hardcode ip as we (presumably) ONLY want to listen locally. If we change it, we can // just modify the config diff --git a/clients/webassembly/src/client/mod.rs b/clients/webassembly/src/client/mod.rs index 9c9f20b2c6..bd9ceab576 100644 --- a/clients/webassembly/src/client/mod.rs +++ b/clients/webassembly/src/client/mod.rs @@ -14,7 +14,7 @@ use nymsphinx::addressing::clients::Recipient; use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; use rand::rngs::OsRng; use std::sync::Arc; -use task::ShutdownNotifier; +use task::TaskManager; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise; use wasm_utils::{console_error, console_log}; @@ -30,7 +30,7 @@ pub struct NymClient { // even though we don't use graceful shutdowns, other components rely on existence of this struct // and if it's dropped, everything will start going offline - _shutdown: ShutdownNotifier, + _task_manager: TaskManager, } #[wasm_bindgen] @@ -121,7 +121,7 @@ impl NymClientBuilder { Ok(JsValue::from(NymClient { self_address, client_input: Arc::new(client_input), - _shutdown: started_client.shutdown_notifier, + _task_manager: started_client.task_manager, })) }) } diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index bb6fe0bbd1..23cae7e4a6 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -22,7 +22,7 @@ use rand::rngs::OsRng; use std::convert::TryFrom; use std::sync::Arc; use std::time::Duration; -use task::ShutdownListener; +use task::TaskClient; use tungstenite::protocol::Message; #[cfg(feature = "coconut")] @@ -67,7 +67,7 @@ pub struct GatewayClient { reconnection_backoff: Duration, /// Listen to shutdown messages. - shutdown: ShutdownListener, + shutdown: TaskClient, } impl GatewayClient { @@ -83,7 +83,7 @@ impl GatewayClient { ack_sender: AcknowledgementSender, response_timeout_duration: Duration, bandwidth_controller: Option>, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { GatewayClient { authenticated: false, @@ -135,7 +135,7 @@ impl GatewayClient { // perfectly fine here, because it's not meant to be used let (ack_tx, _) = mpsc::unbounded(); let (mix_tx, _) = mpsc::unbounded(); - let shutdown = ShutdownListener::dummy(); + let shutdown = TaskClient::dummy(); let packet_router = PacketRouter::new(ack_tx, mix_tx, shutdown.clone()); GatewayClient { diff --git a/common/client-libs/gateway-client/src/packet_router.rs b/common/client-libs/gateway-client/src/packet_router.rs index c64fbf92f8..daeac0e548 100644 --- a/common/client-libs/gateway-client/src/packet_router.rs +++ b/common/client-libs/gateway-client/src/packet_router.rs @@ -9,7 +9,7 @@ use futures::channel::mpsc; use log::*; use nymsphinx::addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; use nymsphinx::params::packet_sizes::PacketSize; -use task::ShutdownListener; +use task::TaskClient; pub type MixnetMessageSender = mpsc::UnboundedSender>>; pub type MixnetMessageReceiver = mpsc::UnboundedReceiver>>; @@ -21,14 +21,14 @@ pub type AcknowledgementReceiver = mpsc::UnboundedReceiver>>; pub struct PacketRouter { ack_sender: AcknowledgementSender, mixnet_message_sender: MixnetMessageSender, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl PacketRouter { pub fn new( ack_sender: AcknowledgementSender, mixnet_message_sender: MixnetMessageSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { PacketRouter { ack_sender, diff --git a/common/client-libs/gateway-client/src/socket_state.rs b/common/client-libs/gateway-client/src/socket_state.rs index 8c66b20906..2bedf1e8ed 100644 --- a/common/client-libs/gateway-client/src/socket_state.rs +++ b/common/client-libs/gateway-client/src/socket_state.rs @@ -10,7 +10,7 @@ use futures::{SinkExt, StreamExt}; use gateway_requests::registration::handshake::SharedKeys; use log::*; use std::sync::Arc; -use task::ShutdownListener; +use task::TaskClient; use tungstenite::Message; #[cfg(not(target_arch = "wasm32"))] @@ -84,7 +84,7 @@ impl PartiallyDelegated { conn: WsConn, packet_router: PacketRouter, shared_key: Arc, - mut shutdown: ShutdownListener, + mut shutdown: TaskClient, ) -> Self { // when called for, it NEEDS TO yield back the stream so that we could merge it and // read control request responses. diff --git a/common/mixnode-common/src/verloc/listener.rs b/common/mixnode-common/src/verloc/listener.rs index 537ec3aad5..812358e330 100644 --- a/common/mixnode-common/src/verloc/listener.rs +++ b/common/mixnode-common/src/verloc/listener.rs @@ -11,7 +11,7 @@ use std::fmt::{Display, Formatter}; use std::net::SocketAddr; use std::sync::Arc; use std::{fmt, io, process}; -use task::ShutdownListener; +use task::TaskClient; use tokio::io::AsyncWriteExt; use tokio::net::{TcpListener, TcpStream}; use tokio_util::codec::{Decoder, Encoder, Framed}; @@ -19,14 +19,14 @@ use tokio_util::codec::{Decoder, Encoder, Framed}; pub(crate) struct PacketListener { address: SocketAddr, connection_handler: Arc, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl PacketListener { pub(crate) fn new( address: SocketAddr, identity: Arc, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { PacketListener { address, @@ -91,7 +91,7 @@ impl ConnectionHandler { self: Arc, conn: TcpStream, remote: SocketAddr, - mut shutdown_listener: ShutdownListener, + mut shutdown_listener: TaskClient, ) { debug!("Starting connection handler for {:?}", remote); diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index fc7e19332a..21053dd7cc 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -12,7 +12,7 @@ use rand::thread_rng; use std::net::{SocketAddr, ToSocketAddrs}; use std::sync::Arc; use std::time::Duration; -use task::ShutdownListener; +use task::TaskClient; use tokio::task::JoinHandle; use tokio::time::sleep; use url::Url; @@ -168,7 +168,7 @@ pub struct VerlocMeasurer { config: Config, packet_sender: Arc, packet_listener: Arc, - shutdown_listener: ShutdownListener, + shutdown_listener: TaskClient, currently_used_api: usize, @@ -184,7 +184,7 @@ impl VerlocMeasurer { pub fn new( mut config: Config, identity: Arc, - shutdown_listener: ShutdownListener, + shutdown_listener: TaskClient, ) -> Self { config.nym_api_urls.shuffle(&mut thread_rng()); diff --git a/common/mixnode-common/src/verloc/sender.rs b/common/mixnode-common/src/verloc/sender.rs index bed34f4474..91f7ee9974 100644 --- a/common/mixnode-common/src/verloc/sender.rs +++ b/common/mixnode-common/src/verloc/sender.rs @@ -11,7 +11,7 @@ use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; use std::{fmt, io}; -use task::ShutdownListener; +use task::TaskClient; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpStream; use tokio::time::sleep; @@ -45,7 +45,7 @@ pub(crate) struct PacketSender { packet_timeout: Duration, connection_timeout: Duration, delay_between_packets: Duration, - shutdown_listener: ShutdownListener, + shutdown_listener: TaskClient, } impl PacketSender { @@ -55,7 +55,7 @@ impl PacketSender { packet_timeout: Duration, connection_timeout: Duration, delay_between_packets: Duration, - shutdown_listener: ShutdownListener, + shutdown_listener: TaskClient, ) -> Self { PacketSender { identity, diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index d7e2645190..66c8b94a7a 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -11,7 +11,7 @@ use std::{ collections::{HashMap, HashSet}, time::Duration, }; -use task::ShutdownListener; +use task::TaskClient; use tokio::time; /// A generic message produced after reading from a socket/connection. It includes data that was @@ -98,14 +98,14 @@ pub struct Controller { // un-order messages. Note we don't ever expect to have more than 1-2 messages per connection here pending_messages: HashMap, bool)>>, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl Controller { pub fn new( client_connection_tx: ConnectionCommandSender, broadcast_connections: BroadcastActiveConnections, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> (Self, ControllerSender) { let (sender, receiver) = mpsc::unbounded(); ( diff --git a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs index b6688657de..2065f7770b 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs @@ -15,7 +15,7 @@ use socks5_requests::ConnectionId; use std::fmt::Debug; use std::time::Duration; use std::{io, sync::Arc}; -use task::ShutdownListener; +use task::TaskClient; use tokio::select; use tokio::{net::tcp::OwnedReadHalf, sync::Notify, time::sleep}; @@ -170,7 +170,7 @@ pub(super) async fn run_inbound( adapter_fn: F, shutdown_notify: Arc, lane_queue_lengths: Option, - mut shutdown_listener: ShutdownListener, + mut shutdown_listener: TaskClient, ) -> OwnedReadHalf where F: Fn(ConnectionId, Vec, bool) -> S + Send + 'static, diff --git a/common/socks5/proxy-helpers/src/proxy_runner/mod.rs b/common/socks5/proxy-helpers/src/proxy_runner/mod.rs index defcbf4f5f..a87ada287e 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/mod.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/mod.rs @@ -6,7 +6,7 @@ use client_connections::LaneQueueLengths; use socks5_requests::ConnectionId; use std::fmt::Debug; use std::{sync::Arc, time::Duration}; -use task::ShutdownListener; +use task::TaskClient; use tokio::{net::TcpStream, sync::Notify}; mod inbound; @@ -50,7 +50,7 @@ pub struct ProxyRunner { lane_queue_lengths: Option, // Listens to shutdown commands from higher up - shutdown_listener: ShutdownListener, + shutdown_listener: TaskClient, } impl ProxyRunner @@ -66,7 +66,7 @@ where mix_sender: MixProxySender, connection_id: ConnectionId, lane_queue_lengths: Option, - shutdown_listener: ShutdownListener, + shutdown_listener: TaskClient, ) -> Self { ProxyRunner { mix_receiver: Some(mix_receiver), diff --git a/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs b/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs index f6c713e948..ed7f8d74c6 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs @@ -8,7 +8,7 @@ use futures::StreamExt; use log::*; use socks5_requests::ConnectionId; use std::{sync::Arc, time::Duration}; -use task::ShutdownListener; +use task::TaskClient; use tokio::io::AsyncWriteExt; use tokio::select; use tokio::{net::tcp::OwnedWriteHalf, sync::Notify, time::sleep, time::Instant}; @@ -51,7 +51,7 @@ pub(super) async fn run_outbound( mut mix_receiver: ConnectionReceiver, connection_id: ConnectionId, shutdown_notify: Arc, - mut shutdown_listener: ShutdownListener, + mut shutdown_listener: TaskClient, ) -> (OwnedWriteHalf, ConnectionReceiver) { let shutdown_future = shutdown_notify.notified().then(|_| sleep(SHUTDOWN_TIMEOUT)); tokio::pin!(shutdown_future); diff --git a/common/task/src/lib.rs b/common/task/src/lib.rs index 5d3d0ea2f5..7ac5ab8431 100644 --- a/common/task/src/lib.rs +++ b/common/task/src/lib.rs @@ -1,13 +1,12 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -pub mod shutdown; +pub mod manager; #[cfg(not(target_arch = "wasm32"))] pub mod signal; pub mod spawn; -// WIP(JON): those both need to be public? -pub use shutdown::{ShutdownListener, ShutdownNotifier, StatusReceiver, StatusSender}; +pub use manager::{StatusReceiver, StatusSender, TaskClient, TaskManager}; #[cfg(not(target_arch = "wasm32"))] pub use signal::{wait_for_signal, wait_for_signal_and_error}; diff --git a/common/task/src/shutdown.rs b/common/task/src/manager.rs similarity index 89% rename from common/task/src/shutdown.rs rename to common/task/src/manager.rs index 4fe7a22bdd..3729d317a9 100644 --- a/common/task/src/shutdown.rs +++ b/common/task/src/manager.rs @@ -14,7 +14,6 @@ use tokio::{ const DEFAULT_SHUTDOWN_TIMER_SECS: u64 = 5; -// WIP(JON): can these be from futures channel too? pub(crate) type SentError = Box; type ErrorSender = mpsc::UnboundedSender; type ErrorReceiver = mpsc::UnboundedReceiver; @@ -29,9 +28,10 @@ enum TaskError { UnexpectedHalt, } -/// Used to notify other tasks to gracefully shutdown +/// Listens to status and error messages from tasks, as well as notifying them to gracefully +/// shutdown. Keeps track of if task stop unexpectedly, such as in a panic. #[derive(Debug)] -pub struct ShutdownNotifier { +pub struct TaskManager { // These channels have the dual purpose of signalling it's time to shutdown, but also to keep // track of which tasks we are still waiting for. notify_tx: watch::Sender<()>, @@ -55,7 +55,7 @@ pub struct ShutdownNotifier { task_status_rx: Option, } -impl Default for ShutdownNotifier { +impl Default for TaskManager { fn default() -> Self { let (notify_tx, notify_rx) = watch::channel(()); let (task_halt_tx, task_halt_rx) = mpsc::unbounded_channel(); @@ -77,11 +77,7 @@ impl Default for ShutdownNotifier { } } -impl ShutdownNotifier { - pub fn take_task_status_rx(&mut self) -> Option { - self.task_status_rx.take() - } - +impl TaskManager { pub fn new(shutdown_timer_secs: u64) -> Self { Self { shutdown_timer_secs, @@ -89,8 +85,8 @@ impl ShutdownNotifier { } } - pub fn subscribe(&self) -> ShutdownListener { - ShutdownListener::new( + pub fn subscribe(&self) -> TaskClient { + TaskClient::new( self.notify_rx .as_ref() .expect("Unable to subscribe to shutdown notifier that is already shutdown") @@ -173,9 +169,10 @@ impl ShutdownNotifier { } } -/// Listen for shutdown notifications +/// Listen for shutdown notifications, and can send error and status messages back to the +/// `TaskManager` #[derive(Clone, Debug)] -pub struct ShutdownListener { +pub struct TaskClient { // If a shutdown notification has been registered shutdown: bool, @@ -193,10 +190,10 @@ pub struct ShutdownListener { status_msg: StatusSender, // The current operating mode - mode: ShutdownListenerMode, + mode: ClientOperatingMode, } -impl ShutdownListener { +impl TaskClient { #[cfg(not(target_arch = "wasm32"))] const SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(5); @@ -205,31 +202,31 @@ impl ShutdownListener { return_error: ErrorSender, drop_error: ErrorSender, status_msg: StatusSender, - ) -> ShutdownListener { - ShutdownListener { + ) -> TaskClient { + TaskClient { shutdown: false, notify, return_error, drop_error, status_msg, - mode: ShutdownListenerMode::Listening, + mode: ClientOperatingMode::Listening, } } // Create a dummy that will never report that we should shutdown. - pub fn dummy() -> ShutdownListener { + pub fn dummy() -> TaskClient { let (_notify_tx, notify_rx) = watch::channel(()); let (task_halt_tx, _task_halt_rx) = mpsc::unbounded_channel(); let (task_drop_tx, _task_drop_rx) = mpsc::unbounded_channel(); //let (task_status_tx, _task_status_rx) = futures::channel::mpsc::unbounded(); let (task_status_tx, _task_status_rx) = futures::channel::mpsc::channel(128); - ShutdownListener { + TaskClient { shutdown: false, notify: notify_rx, return_error: task_halt_tx, drop_error: task_drop_tx, status_msg: task_status_tx, - mode: ShutdownListenerMode::Dummy, + mode: ClientOperatingMode::Dummy, } } @@ -256,6 +253,15 @@ impl ShutdownListener { self.shutdown = true; } + pub async fn recv_with_delay(&mut self) { + self.recv() + .then(|msg| async move { + sleep(Duration::from_secs(1)).await; + msg + }) + .await + } + pub async fn recv_timeout(&mut self) { if self.mode.is_dummy() { return pending().await; @@ -315,7 +321,7 @@ impl ShutdownListener { } } -impl Drop for ShutdownListener { +impl Drop for TaskClient { fn drop(&mut self) { if !self.mode.should_signal_on_drop() { return; @@ -331,7 +337,7 @@ impl Drop for ShutdownListener { } #[derive(Clone, Debug, PartialEq, Eq)] -enum ShutdownListenerMode { +enum ClientOperatingMode { // Normal operations Listening, // Normal operations, but we don't report back if the we stop by getting dropped. @@ -340,20 +346,20 @@ enum ShutdownListenerMode { Dummy, } -impl ShutdownListenerMode { +impl ClientOperatingMode { fn is_dummy(&self) -> bool { - self == &ShutdownListenerMode::Dummy + self == &ClientOperatingMode::Dummy } fn should_signal_on_drop(&self) -> bool { match self { - ShutdownListenerMode::Listening => true, - ShutdownListenerMode::ListeningButDontReportHalt | ShutdownListenerMode::Dummy => false, + ClientOperatingMode::Listening => true, + ClientOperatingMode::ListeningButDontReportHalt | ClientOperatingMode::Dummy => false, } } fn set_should_not_signal_on_drop(&mut self) { - use ShutdownListenerMode::{Dummy, Listening, ListeningButDontReportHalt}; + use ClientOperatingMode::{Dummy, Listening, ListeningButDontReportHalt}; *self = match &self { ListeningButDontReportHalt | Listening => ListeningButDontReportHalt, Dummy => Dummy, @@ -367,7 +373,7 @@ mod tests { #[tokio::test] async fn signal_shutdown() { - let shutdown = ShutdownNotifier::default(); + let shutdown = TaskManager::default(); let mut listener = shutdown.subscribe(); let task = tokio::spawn(async move { diff --git a/common/task/src/signal.rs b/common/task/src/signal.rs index a04a0f5601..483c7c630b 100644 --- a/common/task/src/signal.rs +++ b/common/task/src/signal.rs @@ -1,4 +1,4 @@ -use crate::{shutdown::SentError, ShutdownNotifier}; +use crate::{manager::SentError, TaskManager}; #[cfg(unix)] pub async fn wait_for_signal() { @@ -29,7 +29,7 @@ pub async fn wait_for_signal() { } #[cfg(unix)] -pub async fn wait_for_signal_and_error(shutdown: &mut ShutdownNotifier) -> Result<(), SentError> { +pub async fn wait_for_signal_and_error(shutdown: &mut TaskManager) -> Result<(), SentError> { use tokio::signal::unix::{signal, SignalKind}; let mut sigterm = signal(SignalKind::terminate()).expect("Failed to setup SIGTERM channel"); @@ -56,7 +56,7 @@ pub async fn wait_for_signal_and_error(shutdown: &mut ShutdownNotifier) -> Resul } #[cfg(not(unix))] -pub async fn wait_for_signal_and_error(shutdown: &mut ShutdownNotifier) -> Result<(), SentError> { +pub async fn wait_for_signal_and_error(shutdown: &mut TaskManager) -> Result<(), SentError> { tokio::select! { _ = tokio::signal::ctrl_c() => { log::info!("Received SIGINT"); diff --git a/common/task/src/spawn.rs b/common/task/src/spawn.rs index ba66ea7f16..d30c9ac850 100644 --- a/common/task/src/spawn.rs +++ b/common/task/src/spawn.rs @@ -1,4 +1,4 @@ -use crate::ShutdownListener; +use crate::TaskClient; use std::future::Future; #[cfg(target_arch = "wasm32")] @@ -18,7 +18,7 @@ where tokio::spawn(future); } -pub fn spawn_with_report_error(future: F, mut shutdown: ShutdownListener) +pub fn spawn_with_report_error(future: F, mut shutdown: TaskClient) where F: Future> + Send + 'static, T: 'static, diff --git a/explorer-api/src/country_statistics/distribution.rs b/explorer-api/src/country_statistics/distribution.rs index f48e87eebb..93d12067b6 100644 --- a/explorer-api/src/country_statistics/distribution.rs +++ b/explorer-api/src/country_statistics/distribution.rs @@ -1,5 +1,5 @@ use log::info; -use task::ShutdownListener; +use task::TaskClient; use crate::country_statistics::country_nodes_distribution::CountryNodesDistribution; use crate::COUNTRY_DATA_REFRESH_INTERVAL; @@ -8,11 +8,11 @@ use crate::state::ExplorerApiStateContext; pub(crate) struct CountryStatisticsDistributionTask { state: ExplorerApiStateContext, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl CountryStatisticsDistributionTask { - pub(crate) fn new(state: ExplorerApiStateContext, shutdown: ShutdownListener) -> Self { + pub(crate) fn new(state: ExplorerApiStateContext, shutdown: TaskClient) -> Self { CountryStatisticsDistributionTask { state, shutdown } } diff --git a/explorer-api/src/country_statistics/geolocate.rs b/explorer-api/src/country_statistics/geolocate.rs index c77a61a9a1..0ae79985c7 100644 --- a/explorer-api/src/country_statistics/geolocate.rs +++ b/explorer-api/src/country_statistics/geolocate.rs @@ -4,15 +4,15 @@ use crate::mix_nodes::location::Location; use crate::state::ExplorerApiStateContext; use log::{info, warn}; -use task::ShutdownListener; +use task::TaskClient; pub(crate) struct GeoLocateTask { state: ExplorerApiStateContext, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl GeoLocateTask { - pub(crate) fn new(state: ExplorerApiStateContext, shutdown: ShutdownListener) -> Self { + pub(crate) fn new(state: ExplorerApiStateContext, shutdown: TaskClient) -> Self { GeoLocateTask { state, shutdown } } diff --git a/explorer-api/src/main.rs b/explorer-api/src/main.rs index 5154c87e78..e1a02c57ea 100644 --- a/explorer-api/src/main.rs +++ b/explorer-api/src/main.rs @@ -8,7 +8,7 @@ use dotenv::dotenv; use log::info; use logging::setup_logging; use network_defaults::setup_env; -use task::ShutdownNotifier; +use task::TaskManager; mod buy_terms; pub(crate) mod cache; @@ -57,7 +57,7 @@ impl ExplorerApi { let nym_api_url = self.state.inner.validator_client.api_endpoint(); info!("Using validator API - {}", nym_api_url); - let shutdown = ShutdownNotifier::default(); + let shutdown = TaskManager::default(); // spawn concurrent tasks crate::tasks::ExplorerApiTasks::new(self.state.clone(), shutdown.subscribe()).start(); @@ -78,7 +78,7 @@ impl ExplorerApi { self.wait_for_interrupt(shutdown).await } - async fn wait_for_interrupt(&self, mut shutdown: ShutdownNotifier) { + async fn wait_for_interrupt(&self, mut shutdown: TaskManager) { wait_for_signal().await; log::info!("Sending shutdown"); diff --git a/explorer-api/src/tasks.rs b/explorer-api/src/tasks.rs index bab29b798e..b7e72f72d2 100644 --- a/explorer-api/src/tasks.rs +++ b/explorer-api/src/tasks.rs @@ -4,7 +4,7 @@ use std::future::Future; use mixnet_contract_common::GatewayBond; -use task::ShutdownListener; +use task::TaskClient; use validator_client::models::MixNodeBondAnnotated; use validator_client::nymd::error::NymdError; use validator_client::nymd::{Paging, QueryNymdClient, ValidatorResponse}; @@ -15,11 +15,11 @@ use crate::state::ExplorerApiStateContext; pub(crate) struct ExplorerApiTasks { state: ExplorerApiStateContext, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl ExplorerApiTasks { - pub(crate) fn new(state: ExplorerApiStateContext, shutdown: ShutdownListener) -> Self { + pub(crate) fn new(state: ExplorerApiStateContext, shutdown: TaskClient) -> Self { ExplorerApiTasks { state, shutdown } } diff --git a/mixnode/src/node/listener/connection_handler/mod.rs b/mixnode/src/node/listener/connection_handler/mod.rs index 08e8395917..52203c89ab 100644 --- a/mixnode/src/node/listener/connection_handler/mod.rs +++ b/mixnode/src/node/listener/connection_handler/mod.rs @@ -5,7 +5,7 @@ use crate::node::listener::connection_handler::packet_processing::{ MixProcessingResult, PacketProcessor, }; use crate::node::packet_delayforwarder::PacketDelayForwardSender; -use crate::node::ShutdownListener; +use crate::node::TaskClient; use futures::StreamExt; use log::{error, info}; use nymsphinx::forwarding::packet::MixPacket; @@ -74,7 +74,7 @@ impl ConnectionHandler { self, conn: TcpStream, remote: SocketAddr, - mut shutdown: ShutdownListener, + mut shutdown: TaskClient, ) { debug!("Starting connection handler for {:?}", remote); let mut framed_conn = Framed::new(conn, SphinxCodec); diff --git a/mixnode/src/node/listener/mod.rs b/mixnode/src/node/listener/mod.rs index 6b8ddbee1a..18ab26bc63 100644 --- a/mixnode/src/node/listener/mod.rs +++ b/mixnode/src/node/listener/mod.rs @@ -8,17 +8,17 @@ use std::process; use tokio::net::TcpListener; use tokio::task::JoinHandle; -use super::ShutdownListener; +use super::TaskClient; pub(crate) mod connection_handler; pub(crate) struct Listener { address: SocketAddr, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl Listener { - pub(crate) fn new(address: SocketAddr, shutdown: ShutdownListener) -> Self { + pub(crate) fn new(address: SocketAddr, shutdown: TaskClient) -> Self { Listener { address, shutdown } } diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index e986c4fa67..9fdbff3ebb 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -26,7 +26,7 @@ use rand::thread_rng; use std::net::SocketAddr; use std::process; use std::sync::Arc; -use task::{wait_for_signal, ShutdownListener, ShutdownNotifier}; +use task::{wait_for_signal, TaskClient, TaskManager}; use version_checker::parse_version; mod http; @@ -153,7 +153,7 @@ impl MixNode { fn start_node_stats_controller( &self, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> (SharedNodeStats, node_statistics::UpdateSender) { info!("Starting node stats controller..."); let controller = node_statistics::Controller::new( @@ -171,7 +171,7 @@ impl MixNode { &self, node_stats_update_sender: node_statistics::UpdateSender, delay_forwarding_channel: PacketDelayForwardSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { info!("Starting socket listener..."); @@ -191,7 +191,7 @@ impl MixNode { fn start_packet_delay_forwarder( &mut self, node_stats_update_sender: node_statistics::UpdateSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> PacketDelayForwardSender { info!("Starting packet delay-forwarder..."); @@ -215,7 +215,7 @@ impl MixNode { packet_sender } - fn start_verloc_measurements(&self, shutdown: ShutdownListener) -> AtomicVerlocResult { + fn start_verloc_measurements(&self, shutdown: TaskClient) -> AtomicVerlocResult { info!("Starting the round-trip-time measurer..."); // this is a sanity check to make sure we didn't mess up with the minimum version at some point @@ -288,7 +288,7 @@ impl MixNode { .map(|node| node.bond_information.mix_node.identity_key.clone()) } - async fn wait_for_interrupt(&self, mut shutdown: ShutdownNotifier) { + async fn wait_for_interrupt(&self, mut shutdown: TaskManager) { wait_for_signal().await; log::info!("Sending shutdown"); @@ -315,7 +315,7 @@ impl MixNode { } } - let shutdown = ShutdownNotifier::default(); + let shutdown = TaskManager::default(); let (node_stats_pointer, node_stats_update_sender) = self.start_node_stats_controller(shutdown.subscribe()); diff --git a/mixnode/src/node/node_statistics.rs b/mixnode/src/node/node_statistics.rs index 86f98401ab..2fa8c39b8e 100644 --- a/mixnode/src/node/node_statistics.rs +++ b/mixnode/src/node/node_statistics.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use std::time::{Duration, SystemTime}; use tokio::sync::{RwLock, RwLockReadGuard}; -use super::ShutdownListener; +use super::TaskClient; // convenience aliases type PacketsMap = HashMap; @@ -211,14 +211,14 @@ impl CurrentPacketData { struct UpdateHandler { current_data: CurrentPacketData, update_receiver: PacketDataReceiver, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl UpdateHandler { fn new( current_data: CurrentPacketData, update_receiver: PacketDataReceiver, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { UpdateHandler { current_data, @@ -293,7 +293,7 @@ struct StatsUpdater { updating_delay: Duration, current_packet_data: CurrentPacketData, current_stats: SharedNodeStats, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl StatsUpdater { @@ -301,7 +301,7 @@ impl StatsUpdater { updating_delay: Duration, current_packet_data: CurrentPacketData, current_stats: SharedNodeStats, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { StatsUpdater { updating_delay, @@ -335,11 +335,11 @@ impl StatsUpdater { struct PacketStatsConsoleLogger { logging_delay: Duration, stats: SharedNodeStats, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl PacketStatsConsoleLogger { - fn new(logging_delay: Duration, stats: SharedNodeStats, shutdown: ShutdownListener) -> Self { + fn new(logging_delay: Duration, stats: SharedNodeStats, shutdown: TaskClient) -> Self { PacketStatsConsoleLogger { logging_delay, stats, @@ -451,7 +451,7 @@ impl Controller { pub(crate) fn new( logging_delay: Duration, stats_updating_delay: Duration, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> Self { let (sender, receiver) = mpsc::unbounded(); let shared_packet_data = CurrentPacketData::new(); @@ -503,13 +503,13 @@ impl Controller { #[cfg(test)] mod tests { use super::*; - use task::ShutdownNotifier; + use task::TaskManager; #[tokio::test] async fn node_stats_reported_are_received() { let logging_delay = Duration::from_millis(20); let stats_updating_delay = Duration::from_millis(10); - let shutdown = ShutdownNotifier::default(); + let shutdown = TaskManager::default(); let node_stats_controller = Controller::new(logging_delay, stats_updating_delay, shutdown.subscribe()); diff --git a/mixnode/src/node/packet_delayforwarder.rs b/mixnode/src/node/packet_delayforwarder.rs index 81e0303afd..da098bcdf9 100644 --- a/mixnode/src/node/packet_delayforwarder.rs +++ b/mixnode/src/node/packet_delayforwarder.rs @@ -9,7 +9,7 @@ use nymsphinx::forwarding::packet::MixPacket; use std::io; use tokio::time::Instant; -use super::ShutdownListener; +use super::TaskClient; // Delay + MixPacket vs Instant + MixPacket @@ -28,7 +28,7 @@ where packet_sender: PacketDelayForwardSender, packet_receiver: PacketDelayForwardReceiver, node_stats_update_sender: UpdateSender, - shutdown: ShutdownListener, + shutdown: TaskClient, } impl DelayForwarder @@ -38,7 +38,7 @@ where pub(crate) fn new( client: C, node_stats_update_sender: UpdateSender, - shutdown: ShutdownListener, + shutdown: TaskClient, ) -> DelayForwarder { let (packet_sender, packet_receiver) = mpsc::unbounded(); @@ -134,7 +134,7 @@ mod tests { use std::sync::{Arc, Mutex}; use std::time::Duration; - use task::ShutdownNotifier; + use task::TaskManager; use nymsphinx::addressing::nodes::NymNodeRoutingAddress; use nymsphinx_params::packet_sizes::PacketSize; @@ -205,7 +205,7 @@ mod tests { let node_stats_update_sender = UpdateSender::new(stats_sender); let client = TestClient::default(); let client_packets_sent = client.packets_sent.clone(); - let shutdown = ShutdownNotifier::default(); + let shutdown = TaskManager::default(); let mut delay_forwarder = DelayForwarder::new(client, node_stats_update_sender, shutdown.subscribe()); let packet_sender = delay_forwarder.sender(); diff --git a/nym-api/src/coconut/dkg/controller.rs b/nym-api/src/coconut/dkg/controller.rs index 6a7268af47..c54074141d 100644 --- a/nym-api/src/coconut/dkg/controller.rs +++ b/nym-api/src/coconut/dkg/controller.rs @@ -19,7 +19,7 @@ use rand::rngs::OsRng; use rand::RngCore; use std::path::PathBuf; use std::time::Duration; -use task::ShutdownListener; +use task::TaskClient; use tokio::time::interval; use validator_client::nymd::SigningNymdClient; @@ -134,7 +134,7 @@ impl DkgController { } } - pub(crate) async fn run(mut self, mut shutdown: ShutdownListener) { + pub(crate) async fn run(mut self, mut shutdown: TaskClient) { let mut interval = interval(self.polling_rate); while !shutdown.is_shutdown() { tokio::select! { diff --git a/nym-api/src/contract_cache/mod.rs b/nym-api/src/contract_cache/mod.rs index 61a7150a02..0775ca5a85 100644 --- a/nym-api/src/contract_cache/mod.rs +++ b/nym-api/src/contract_cache/mod.rs @@ -21,7 +21,7 @@ use std::ops::Deref; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Duration; -use task::ShutdownListener; +use task::TaskClient; use tokio::sync::{watch, RwLock}; use tokio::time; use validator_client::nymd::CosmWasmClient; @@ -198,7 +198,7 @@ impl ValidatorCacheRefresher { Ok(()) } - pub(crate) async fn run(&self, mut shutdown: ShutdownListener) + pub(crate) async fn run(&self, mut shutdown: TaskClient) where C: CosmWasmClient + Sync + Send, { diff --git a/nym-api/src/epoch_operations/mod.rs b/nym-api/src/epoch_operations/mod.rs index cf0233e453..7f109d3dea 100644 --- a/nym-api/src/epoch_operations/mod.rs +++ b/nym-api/src/epoch_operations/mod.rs @@ -35,7 +35,7 @@ mod helpers; use crate::epoch_operations::helpers::stake_to_f64; use crate::node_status_api::ONE_DAY; use error::RewardingError; -use task::ShutdownListener; +use task::TaskClient; #[derive(Debug, Clone, Copy)] pub(crate) struct MixnodeToReward { @@ -373,7 +373,7 @@ impl RewardedSetUpdater { Ok(()) } - async fn wait_until_epoch_end(&mut self, shutdown: &mut ShutdownListener) -> Option { + async fn wait_until_epoch_end(&mut self, shutdown: &mut TaskClient) -> Option { const POLL_INTERVAL: Duration = Duration::from_secs(120); loop { @@ -421,10 +421,7 @@ impl RewardedSetUpdater { } } - pub(crate) async fn run( - &mut self, - mut shutdown: ShutdownListener, - ) -> Result<(), RewardingError> { + pub(crate) async fn run(&mut self, mut shutdown: TaskClient) -> Result<(), RewardingError> { self.validator_cache.wait_for_initial_values().await; while !shutdown.is_shutdown() { diff --git a/nym-api/src/main.rs b/nym-api/src/main.rs index a47068f5fc..256bb527b9 100644 --- a/nym-api/src/main.rs +++ b/nym-api/src/main.rs @@ -31,7 +31,7 @@ use std::str::FromStr; use std::sync::Arc; use std::time::Duration; use std::{fs, process}; -use task::ShutdownNotifier; +use task::TaskManager; use tokio::sync::Notify; #[cfg(feature = "coconut")] use url::Url; @@ -206,7 +206,7 @@ fn parse_args() -> ArgMatches { base_app.get_matches() } -async fn wait_for_interrupt(mut shutdown: ShutdownNotifier) { +async fn wait_for_interrupt(mut shutdown: TaskManager) { wait_for_signal().await; log::info!("Sending shutdown"); @@ -527,7 +527,7 @@ async fn run_nym_api(matches: ArgMatches) -> Result<()> { let liftoff_notify = Arc::new(Notify::new()); // We need a bigger timeout - let shutdown = ShutdownNotifier::new(10); + let shutdown = TaskManager::new(10); #[cfg(feature = "coconut")] let coconut_keypair = coconut::keypair::KeyPair::new(); diff --git a/nym-api/src/network_monitor/mod.rs b/nym-api/src/network_monitor/mod.rs index 0048e2be02..ff4d6bd585 100644 --- a/nym-api/src/network_monitor/mod.rs +++ b/nym-api/src/network_monitor/mod.rs @@ -6,7 +6,7 @@ use crypto::asymmetric::{encryption, identity}; use futures::channel::mpsc; use gateway_client::bandwidth::BandwidthController; use std::sync::Arc; -use task::ShutdownNotifier; +use task::TaskManager; use validator_client::nymd::SigningNymdClient; use crate::config::Config; @@ -142,7 +142,7 @@ impl NetworkMonitorRunnables { // TODO: note, that is not exactly doing what we want, because when // `ReceivedProcessor` is constructed, it already spawns a future // this needs to be refactored! - pub(crate) fn spawn_tasks(self, shutdown: &ShutdownNotifier) { + pub(crate) fn spawn_tasks(self, shutdown: &TaskManager) { let mut packet_receiver = self.packet_receiver; let mut monitor = self.monitor; let shutdown_listener = shutdown.subscribe(); diff --git a/nym-api/src/network_monitor/monitor/gateways_pinger.rs b/nym-api/src/network_monitor/monitor/gateways_pinger.rs index 24cd581bf3..986c1db5fb 100644 --- a/nym-api/src/network_monitor/monitor/gateways_pinger.rs +++ b/nym-api/src/network_monitor/monitor/gateways_pinger.rs @@ -7,7 +7,7 @@ use crypto::asymmetric::identity; use crypto::asymmetric::identity::PUBLIC_KEY_LENGTH; use log::{debug, info, trace, warn}; use std::time::Duration; -use task::ShutdownListener; +use task::TaskClient; use tokio::time::{sleep, Instant}; // TODO: should it perhaps be moved to config along other timeout values? @@ -144,7 +144,7 @@ impl GatewayPinger { info!("Pinging all active gateways took {:?}", time_taken); } - pub(crate) async fn run(&self, mut shutdown: ShutdownListener) { + pub(crate) async fn run(&self, mut shutdown: TaskClient) { while !shutdown.is_shutdown() { tokio::select! { _ = sleep(self.pinging_interval) => { diff --git a/nym-api/src/network_monitor/monitor/mod.rs b/nym-api/src/network_monitor/monitor/mod.rs index c333c5e883..f0f17bad09 100644 --- a/nym-api/src/network_monitor/monitor/mod.rs +++ b/nym-api/src/network_monitor/monitor/mod.rs @@ -12,7 +12,7 @@ use crate::storage::NymApiStorage; use log::{debug, error, info}; use std::collections::{HashMap, HashSet}; use std::process; -use task::ShutdownListener; +use task::TaskClient; use tokio::time::{sleep, Duration, Instant}; pub(crate) mod gateway_clients_cache; @@ -301,7 +301,7 @@ impl Monitor { self.test_nonce += 1; } - pub(crate) async fn run(&mut self, mut shutdown: ShutdownListener) { + pub(crate) async fn run(&mut self, mut shutdown: TaskClient) { self.received_processor.start_receiving(); // wait for validator cache to be ready diff --git a/nym-api/src/network_monitor/monitor/receiver.rs b/nym-api/src/network_monitor/monitor/receiver.rs index 991da5fa05..c232458c6f 100644 --- a/nym-api/src/network_monitor/monitor/receiver.rs +++ b/nym-api/src/network_monitor/monitor/receiver.rs @@ -7,7 +7,7 @@ use crypto::asymmetric::identity; use futures::channel::mpsc; use futures::StreamExt; use gateway_client::{AcknowledgementReceiver, MixnetMessageReceiver}; -use task::ShutdownListener; +use task::TaskClient; pub(crate) type GatewayClientUpdateSender = mpsc::UnboundedSender; pub(crate) type GatewayClientUpdateReceiver = mpsc::UnboundedReceiver; @@ -56,7 +56,7 @@ impl PacketReceiver { .expect("packet processor seems to have crashed!"); } - pub(crate) async fn run(&mut self, mut shutdown: ShutdownListener) { + pub(crate) async fn run(&mut self, mut shutdown: TaskClient) { while !shutdown.is_shutdown() { tokio::select! { biased; diff --git a/nym-api/src/network_monitor/monitor/sender.rs b/nym-api/src/network_monitor/monitor/sender.rs index d2fa815a11..5c6f3df22d 100644 --- a/nym-api/src/network_monitor/monitor/sender.rs +++ b/nym-api/src/network_monitor/monitor/sender.rs @@ -24,7 +24,7 @@ use std::pin::Pin; use std::sync::Arc; use std::task::Poll; use std::time::Duration; -use task::ShutdownListener; +use task::TaskClient; use gateway_client::bandwidth::BandwidthController; @@ -166,11 +166,7 @@ impl PacketSender { } } - pub(crate) fn spawn_gateways_pinger( - &self, - pinging_interval: Duration, - shutdown: ShutdownListener, - ) { + pub(crate) fn spawn_gateways_pinger(&self, pinging_interval: Duration, shutdown: TaskClient) { let gateway_pinger = GatewayPinger::new( self.active_gateway_clients.clone(), self.fresh_gateway_client_data @@ -209,7 +205,7 @@ impl PacketSender { ack_sender, fresh_gateway_client_data.gateway_response_timeout, Some(fresh_gateway_client_data.bandwidth_controller.clone()), - task::ShutdownListener::dummy(), + task::TaskClient::dummy(), ); gateway_client diff --git a/nym-api/src/node_status_api/cache.rs b/nym-api/src/node_status_api/cache.rs index f485716e8e..5a76ffd85a 100644 --- a/nym-api/src/node_status_api/cache.rs +++ b/nym-api/src/node_status_api/cache.rs @@ -12,7 +12,7 @@ use nym_api_requests::models::{MixNodeBondAnnotated, MixnodeStatus}; use rocket::fairing::AdHoc; use std::collections::HashMap; use std::{sync::Arc, time::Duration}; -use task::ShutdownListener; +use task::TaskClient; use tokio::sync::RwLockReadGuard; use tokio::{ sync::{watch, RwLock}, @@ -174,7 +174,7 @@ impl NodeStatusCacheRefresher { } } - pub async fn run(&mut self, mut shutdown: ShutdownListener) { + pub async fn run(&mut self, mut shutdown: TaskClient) { let mut fallback_interval = time::interval(self.fallback_caching_interval); while !shutdown.is_shutdown() { tokio::select! { diff --git a/nym-api/src/node_status_api/uptime_updater.rs b/nym-api/src/node_status_api/uptime_updater.rs index cc22d75741..0c36c1a124 100644 --- a/nym-api/src/node_status_api/uptime_updater.rs +++ b/nym-api/src/node_status_api/uptime_updater.rs @@ -8,7 +8,7 @@ use crate::node_status_api::ONE_DAY; use crate::storage::NymApiStorage; use log::error; use std::time::Duration; -use task::ShutdownListener; +use task::TaskClient; use time::{OffsetDateTime, PrimitiveDateTime, Time}; use tokio::time::{interval, sleep}; @@ -68,7 +68,7 @@ impl HistoricalUptimeUpdater { Ok(()) } - pub(crate) async fn run(&self, mut shutdown: ShutdownListener) { + pub(crate) async fn run(&self, mut shutdown: TaskClient) { // update uptimes at 23:00 UTC each day so that we'd have data from the actual [almost] whole day // and so that we would avoid the edge case of starting validator API at 23:59 and having some // nodes update for different days diff --git a/service-providers/network-requester/src/connection.rs b/service-providers/network-requester/src/connection.rs index f4ffaca992..3457375737 100644 --- a/service-providers/network-requester/src/connection.rs +++ b/service-providers/network-requester/src/connection.rs @@ -7,7 +7,7 @@ use proxy_helpers::connection_controller::ConnectionReceiver; use proxy_helpers::proxy_runner::{MixProxySender, ProxyRunner}; use socks5_requests::{ConnectionId, Message as Socks5Message, RemoteAddress, Response}; use std::io; -use task::ShutdownListener; +use task::TaskClient; use tokio::net::TcpStream; /// A TCP connection between the Socks5 service provider, which makes @@ -42,7 +42,7 @@ impl Connection { mix_receiver: ConnectionReceiver, mix_sender: MixProxySender<(Socks5Message, ReturnAddress)>, lane_queue_lengths: LaneQueueLengths, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { let stream = self.conn.take().unwrap(); let remote_source_address = "???".to_string(); // we don't know ip address of requester diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index 202ac3d1c1..42ded9fbd0 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -28,7 +28,7 @@ use socks5_requests::{ use statistics_common::collector::StatisticsSender; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; -use task::ShutdownListener; +use task::TaskClient; use tokio_tungstenite::tungstenite::protocol::Message; use websocket_requests::{requests::ClientRequest, responses::ServerResponse}; @@ -250,7 +250,7 @@ impl ServiceProvider { controller_sender: ControllerSender, mix_input_sender: MixProxySender<(Socks5Message, ReturnAddress)>, lane_queue_lengths: LaneQueueLengths, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { let mut conn = match Connection::new(conn_id, remote_addr.clone(), return_address.clone()).await { @@ -313,7 +313,7 @@ impl ServiceProvider { lane_queue_lengths: LaneQueueLengths, sender_tag: Option, connect_req: Box, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { let return_address = match ReturnAddress::new(connect_req.return_address, sender_tag) { Some(address) => address, @@ -379,7 +379,7 @@ impl ServiceProvider { mix_input_sender: &MixProxySender<(Socks5Message, ReturnAddress)>, lane_queue_lengths: LaneQueueLengths, stats_collector: Option, - shutdown: ShutdownListener, + shutdown: TaskClient, ) { let deserialized_msg = match Socks5Message::try_from_bytes(&message.message) { Ok(msg) => msg, @@ -445,7 +445,7 @@ impl ServiceProvider { tokio::sync::mpsc::channel::<(Socks5Message, ReturnAddress)>(1); // Used to notify tasks to shutdown. Not all tasks fully supports this (yet). - let shutdown = task::ShutdownNotifier::default(); + let shutdown = task::TaskManager::default(); // Channel for announcing client connection state by the controller. // The `mixnet_response_listener` will use this to either report closed connection to the From 70fcb8c046a81e501dab232fdf2916b02563cc3d Mon Sep 17 00:00:00 2001 From: farbanas Date: Thu, 15 Dec 2022 10:07:19 +0100 Subject: [PATCH 018/591] feat: added the rest of the generators, updated some fields based on PR comments --- Cargo.lock | 4 ++ common/commands/Cargo.toml | 4 ++ .../cosmwasm/generators/coconut_bandwidth.rs | 47 ++++++++++++++ .../cosmwasm/generators/coconut_dkg.rs | 51 +++++++++++++++ .../validator/cosmwasm/generators/mixnet.rs | 33 +++++++--- .../src/validator/cosmwasm/generators/mod.rs | 6 ++ .../validator/cosmwasm/generators/multisig.rs | 62 +++++++++++++++++++ .../validator/cosmwasm/generators/vesting.rs | 21 +++++-- .../src/validator/cosmwasm/generators/mod.rs | 12 ++++ 9 files changed, 225 insertions(+), 15 deletions(-) create mode 100644 common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs create mode 100644 common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs create mode 100644 common/commands/src/validator/cosmwasm/generators/multisig.rs diff --git a/Cargo.lock b/Cargo.lock index f3c4c24118..b86923d884 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3154,14 +3154,18 @@ dependencies = [ "bs58", "cfg-if 1.0.0", "clap 3.2.8", + "coconut-bandwidth-contract-common", + "coconut-dkg-common", "comfy-table", "cosmrs", "cosmwasm-std", + "cw-utils", "handlebars", "humantime-serde", "k256", "log", "mixnet-contract-common", + "multisig-contract-common", "network-defaults", "rand 0.6.5", "serde", diff --git a/common/commands/Cargo.toml b/common/commands/Cargo.toml index ce0195cce4..21a1534c5d 100644 --- a/common/commands/Cargo.toml +++ b/common/commands/Cargo.toml @@ -11,6 +11,7 @@ bs58 = "0.4" comfy-table = "6.0.0" cfg-if = "1.0.0" clap = { version = "3.2", features = ["derive"] } +cw-utils = { version = "0.13.4" } handlebars = "3.0.1" humantime-serde = "1.0" k256 = { version = "0.10", features = ["ecdsa", "sha256"] } @@ -31,3 +32,6 @@ validator-client = { path = "../client-libs/validator-client", features = ["nymd network-defaults = { path = "../network-defaults" } mixnet-contract-common = { path = "../cosmwasm-smart-contracts/mixnet-contract" } vesting-contract-common = { path = "../cosmwasm-smart-contracts/vesting-contract" } +coconut-bandwidth-contract-common = { path = "../cosmwasm-smart-contracts/coconut-bandwidth-contract" } +coconut-dkg-common = { path = "../cosmwasm-smart-contracts/coconut-dkg" } +multisig-contract-common = { path = "../cosmwasm-smart-contracts/multisig-contract" } diff --git a/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs b/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs new file mode 100644 index 0000000000..76b632c851 --- /dev/null +++ b/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs @@ -0,0 +1,47 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use clap::Parser; +use log::{debug, info}; + +use coconut_bandwidth_contract_common::msg::InstantiateMsg; + +#[derive(Debug, Parser)] +pub struct Args { + #[clap(long, empty_values = false)] + pub pool_addr: String, + + #[clap(long)] + pub multisig_addr: Option, + + #[clap(long)] + pub mix_denom: Option, +} + +pub async fn generate(args: Args) { + info!("Starting to generate vesting contract instantiate msg"); + + debug!("Received arguments: {:?}", args); + + let multisig_addr = args.multisig_addr.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + .expect("Multisig address has to be set") + }); + + let mix_denom = args.mix_denom.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") + }); + + let instantiate_msg = InstantiateMsg { + pool_addr: args.pool_addr, + multisig_addr, + mix_denom, + }; + + debug!("instantiate_msg: {:?}", instantiate_msg); + + let res = + serde_json::to_string(&instantiate_msg).expect("failed to convert instantiate msg to json"); + + println!("{}", res) +} diff --git a/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs new file mode 100644 index 0000000000..fa06934ef6 --- /dev/null +++ b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs @@ -0,0 +1,51 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use clap::Parser; +use log::{debug, info}; + +use coconut_dkg_common::msg::InstantiateMsg; + +#[derive(Debug, Parser)] +pub struct Args { + #[clap(long, empty_values = false)] + pub group_addr: String, + + #[clap(long, empty_values = false)] + pub admin: String, + + #[clap(long)] + pub multisig_addr: Option, + + #[clap(long)] + pub mix_denom: Option, +} + +pub async fn generate(args: Args) { + info!("Starting to generate vesting contract instantiate msg"); + + debug!("Received arguments: {:?}", args); + + let multisig_addr = args.multisig_addr.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + .expect("Multisig address has to be set") + }); + + let mix_denom = args.mix_denom.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") + }); + + let instantiate_msg = InstantiateMsg { + group_addr: args.group_addr, + admin: args.admin, + multisig_addr, + mix_denom, + }; + + debug!("instantiate_msg: {:?}", instantiate_msg); + + let res = + serde_json::to_string(&instantiate_msg).expect("failed to convert instantiate msg to json"); + + println!("{}", res) +} diff --git a/common/commands/src/validator/cosmwasm/generators/mixnet.rs b/common/commands/src/validator/cosmwasm/generators/mixnet.rs index c93689a9a8..002b395a88 100644 --- a/common/commands/src/validator/cosmwasm/generators/mixnet.rs +++ b/common/commands/src/validator/cosmwasm/generators/mixnet.rs @@ -10,14 +10,14 @@ use std::time::Duration; #[derive(Debug, Parser)] pub struct Args { - #[clap(long, empty_values = false)] - pub rewarding_validator_address: String, + #[clap(long)] + pub rewarding_validator_address: Option, - #[clap(long, empty_values = false)] - pub vesting_contract_address: String, + #[clap(long)] + pub vesting_contract_address: Option, - #[clap(long, default_value = "unymt")] - pub rewarding_denom: String, + #[clap(long)] + pub rewarding_denom: Option, #[clap(long, default_value_t = 720)] pub epochs_in_interval: u32, @@ -76,10 +76,25 @@ pub async fn generate(args: Args) { debug!("initial_rewarding_params: {:?}", initial_rewarding_params); + let rewarding_validator_address = args.rewarding_validator_address.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + .expect("Rewarding validator address has to be set") + }); + + let vesting_contract_address = args.vesting_contract_address.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::VESTING_CONTRACT_ADDRESS) + .expect("Vesting contract address has to be set") + }); + + let rewarding_denom = args.rewarding_denom.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::MIX_DENOM) + .expect("Rewarding (mix) denom has to be set") + }); + let instantiate_msg = InstantiateMsg { - rewarding_validator_address: args.rewarding_validator_address, - vesting_contract_address: args.vesting_contract_address, - rewarding_denom: args.rewarding_denom, + rewarding_validator_address, + vesting_contract_address, + rewarding_denom, epochs_in_interval: args.epochs_in_interval, epoch_duration: Duration::from_secs(args.epoch_duration), initial_rewarding_params, diff --git a/common/commands/src/validator/cosmwasm/generators/mod.rs b/common/commands/src/validator/cosmwasm/generators/mod.rs index 330ba5508b..85bd5a93e2 100644 --- a/common/commands/src/validator/cosmwasm/generators/mod.rs +++ b/common/commands/src/validator/cosmwasm/generators/mod.rs @@ -3,7 +3,10 @@ use clap::{Args, Subcommand}; +pub mod coconut_bandwidth; +pub mod coconut_dkg; pub mod mixnet; +pub mod multisig; pub mod vesting; #[derive(Debug, Args)] @@ -15,6 +18,9 @@ pub struct GenerateMessage { #[derive(Debug, Subcommand)] pub enum GenerateMessageCommands { + CoconutBandwidth(coconut_bandwidth::Args), + CoconutDKG(coconut_dkg::Args), Mixnet(mixnet::Args), + Multisig(multisig::Args), Vesting(vesting::Args), } diff --git a/common/commands/src/validator/cosmwasm/generators/multisig.rs b/common/commands/src/validator/cosmwasm/generators/multisig.rs new file mode 100644 index 0000000000..7bc14cf080 --- /dev/null +++ b/common/commands/src/validator/cosmwasm/generators/multisig.rs @@ -0,0 +1,62 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use clap::Parser; +use log::{debug, info}; + +use cosmwasm_std::Decimal; +use cw_utils::{Duration, Threshold}; +use multisig_contract_common::msg::InstantiateMsg; + +#[derive(Debug, Parser)] +pub struct Args { + #[clap(long, empty_values = false)] + pub group_addr: String, + + #[clap(long, default_value_t = 67)] + pub threshold: u128, + + #[clap(long, default_value_t = 3600)] + pub max_voting_period: u64, + + #[clap(long)] + pub coconut_bandwidth_contract_address: Option, + + #[clap(long)] + pub coconut_dkg_contract_address: Option, +} + +pub async fn generate(args: Args) { + info!("Starting to generate vesting contract instantiate msg"); + + debug!("Received arguments: {:?}", args); + + let coconut_bandwidth_contract_address = + args.coconut_bandwidth_contract_address.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS) + .expect("Coconut bandwidth contract address has to be set") + }); + + let coconut_dkg_contract_address = args.coconut_dkg_contract_address.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::COCONUT_DKG_CONTRACT_ADDRESS) + .expect("Coconut DKG contract address has to be set") + }); + + let instantiate_msg = InstantiateMsg { + group_addr: args.group_addr, + threshold: Threshold::AbsolutePercentage { + percentage: Decimal::from_atomics(args.threshold, 2) + .expect("threshold can't be converted to Decimal"), + }, + max_voting_period: Duration::Time(args.max_voting_period), + coconut_bandwidth_contract_address, + coconut_dkg_contract_address, + }; + + debug!("instantiate_msg: {:?}", instantiate_msg); + + let res = + serde_json::to_string(&instantiate_msg).expect("failed to convert instantiate msg to json"); + + println!("{}", res) +} diff --git a/common/commands/src/validator/cosmwasm/generators/vesting.rs b/common/commands/src/validator/cosmwasm/generators/vesting.rs index 7c9299f0bc..5b60ea6db6 100644 --- a/common/commands/src/validator/cosmwasm/generators/vesting.rs +++ b/common/commands/src/validator/cosmwasm/generators/vesting.rs @@ -8,11 +8,11 @@ use vesting_contract_common::InitMsg; #[derive(Debug, Parser)] pub struct Args { - #[clap(long, empty_values = false)] - pub mixnet_contract_address: String, + #[clap(long)] + pub mixnet_contract_address: Option, - #[clap(long, default_value = "unymt", empty_values = false)] - pub mix_denom: String, + #[clap(long)] + pub mix_denom: Option, } pub async fn generate(args: Args) { @@ -20,9 +20,18 @@ pub async fn generate(args: Args) { debug!("Received arguments: {:?}", args); + let mixnet_contract_address = args.mixnet_contract_address.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::MIXNET_CONTRACT_ADDRESS) + .expect("Mixnet contract address has to be set") + }); + + let mix_denom = args.mix_denom.unwrap_or_else(|| { + std::env::var(network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") + }); + let instantiate_msg = InitMsg { - mixnet_contract_address: args.mixnet_contract_address, - mix_denom: args.mix_denom, + mixnet_contract_address, + mix_denom, }; debug!("instantiate_msg: {:?}", instantiate_msg); diff --git a/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs b/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs index 80f9786715..aba0aaa9a5 100644 --- a/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs +++ b/tools/nym-cli/src/validator/cosmwasm/generators/mod.rs @@ -9,6 +9,18 @@ pub(crate) async fn execute( nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::Vesting( args, ) => nym_cli_commands::validator::cosmwasm::generators::vesting::generate(args).await, + + nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::CoconutBandwidth( + args, + ) => nym_cli_commands::validator::cosmwasm::generators::coconut_bandwidth::generate(args).await, + + nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::CoconutDKG( + args, + ) => nym_cli_commands::validator::cosmwasm::generators::coconut_dkg::generate(args).await, + + nym_cli_commands::validator::cosmwasm::generators::GenerateMessageCommands::Multisig( + args, + ) => nym_cli_commands::validator::cosmwasm::generators::multisig::generate(args).await, } Ok(()) } From 5e600de9322e30814f7424f508435c1edbb479c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Thu, 15 Dec 2022 12:22:43 +0200 Subject: [PATCH 019/591] Modify wasm specific make targets (#2693) --- Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 8f5aba2678..883be67453 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ clippy-coconut: cargo clippy --workspace --features coconut -- -D warnings clippy-wasm: - cargo clippy --workspace --features wasm -- -D warnings + cargo clippy --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown --workspace -- -D warnings clippy-all-contracts: @@ -49,9 +49,6 @@ test-main: test-coconut: cargo test --workspace --features coconut -test-wasm: - cargo test --workspace --features wasm - test-main-expensive: cargo test --workspace -- --ignored From c2c883e8407cb7e65334a714e840abf2d638a898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Fri, 16 Dec 2022 00:23:58 +0100 Subject: [PATCH 020/591] client: create websocket handler builder (#2700) * client: create websocket handler builder * rustfmt --- clients/native/src/client/mod.rs | 6 +-- clients/native/src/websocket/handler.rs | 57 +++++++++++++----------- clients/native/src/websocket/listener.rs | 10 +++-- clients/native/src/websocket/mod.rs | 2 +- 4 files changed, 41 insertions(+), 34 deletions(-) diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index 1a90c48b6f..bc28ce514b 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -86,7 +86,7 @@ impl SocketClient { config: &Config, client_input: ClientInput, client_output: ClientOutput, - self_address: Recipient, + self_address: &Recipient, shutdown: task::TaskClient, ) { info!("Starting websocket listener..."); @@ -101,7 +101,7 @@ impl SocketClient { received_buffer_request_sender, } = client_output; - let websocket_handler = websocket::Handler::new( + let websocket_handler = websocket::HandlerBuilder::new( input_sender, connection_command_sender, received_buffer_request_sender, @@ -153,7 +153,7 @@ impl SocketClient { &self.config, client_input, client_output, - self_address, + &self_address, started_client.task_manager.subscribe(), ); diff --git a/clients/native/src/websocket/handler.rs b/clients/native/src/websocket/handler.rs index f35058485e..f22bf49c67 100644 --- a/clients/native/src/websocket/handler.rs +++ b/clients/native/src/websocket/handler.rs @@ -35,53 +35,33 @@ impl Default for ReceivedResponseType { } } -pub(crate) struct Handler { +pub(crate) struct HandlerBuilder { msg_input: InputMessageSender, client_connection_tx: ConnectionCommandSender, buffer_requester: ReceivedBufferRequestSender, self_full_address: Recipient, - socket: Option>, - received_response_type: ReceivedResponseType, lane_queue_lengths: LaneQueueLengths, - is_active: bool, } -impl Drop for Handler { - fn drop(&mut self) { - if self.is_active - && self - .buffer_requester - .unbounded_send(ReceivedBufferMessage::ReceiverDisconnect) - .is_err() - { - error!("we failed to disconnect the receiver from the buffer! presumably the shutdown procedure has been initiated!") - } - } -} - -impl Handler { +impl HandlerBuilder { pub(crate) fn new( msg_input: InputMessageSender, client_connection_tx: ConnectionCommandSender, buffer_requester: ReceivedBufferRequestSender, - self_full_address: Recipient, + self_full_address: &Recipient, lane_queue_lengths: LaneQueueLengths, ) -> Self { - Handler { + Self { msg_input, client_connection_tx, buffer_requester, - self_full_address, - socket: None, - received_response_type: Default::default(), + self_full_address: *self_full_address, lane_queue_lengths, - is_active: false, } } - // Used to use handler on a new connection, which initially is `None` // TODO: make sure we only ever have one active handler - pub fn create_active_handler(&self) -> Self { + pub fn create_active_handler(&self) -> Handler { Handler { msg_input: self.msg_input.clone(), client_connection_tx: self.client_connection_tx.clone(), @@ -90,10 +70,33 @@ impl Handler { socket: None, received_response_type: Default::default(), lane_queue_lengths: self.lane_queue_lengths.clone(), - is_active: true, } } +} +pub(crate) struct Handler { + msg_input: InputMessageSender, + client_connection_tx: ConnectionCommandSender, + buffer_requester: ReceivedBufferRequestSender, + self_full_address: Recipient, + socket: Option>, + received_response_type: ReceivedResponseType, + lane_queue_lengths: LaneQueueLengths, +} + +impl Drop for Handler { + fn drop(&mut self) { + if self + .buffer_requester + .unbounded_send(ReceivedBufferMessage::ReceiverDisconnect) + .is_err() + { + error!("we failed to disconnect the receiver from the buffer! presumably the shutdown procedure has been initiated!") + } + } +} + +impl Handler { async fn handle_send( &mut self, recipient: Recipient, diff --git a/clients/native/src/websocket/listener.rs b/clients/native/src/websocket/listener.rs index aef9150b43..459eb1bc17 100644 --- a/clients/native/src/websocket/listener.rs +++ b/clients/native/src/websocket/listener.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use super::handler::Handler; +use super::handler::HandlerBuilder; use log::*; use std::{net::SocketAddr, process, sync::Arc}; use tokio::io::AsyncWriteExt; @@ -32,7 +32,7 @@ impl Listener { } } - pub(crate) async fn run(&mut self, handler: Handler, mut task_client: task::TaskClient) { + pub(crate) async fn run(&mut self, handler: HandlerBuilder, mut task_client: task::TaskClient) { let tcp_listener = match tokio::net::TcpListener::bind(self.address).await { Ok(listener) => listener, Err(err) => { @@ -100,7 +100,11 @@ impl Listener { log::debug!("Websocket listener: Exiting"); } - pub(crate) fn start(mut self, handler: Handler, shutdown: task::TaskClient) -> JoinHandle<()> { + pub(crate) fn start( + mut self, + handler: HandlerBuilder, + shutdown: task::TaskClient, + ) -> JoinHandle<()> { info!("Running websocket on {:?}", self.address.to_string()); tokio::spawn(async move { self.run(handler, shutdown).await }) diff --git a/clients/native/src/websocket/mod.rs b/clients/native/src/websocket/mod.rs index bd17b6ee08..38dadbd005 100644 --- a/clients/native/src/websocket/mod.rs +++ b/clients/native/src/websocket/mod.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -pub(crate) use handler::Handler; +pub(crate) use handler::HandlerBuilder; pub(crate) use listener::Listener; pub(crate) mod handler; From 870c4f73a847b6d1e56ec515a3896eb9a22d44b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Fri, 16 Dec 2022 00:24:45 +0100 Subject: [PATCH 021/591] socks5: send additional status messages available for the frontend (#2715) * socks5: send network-requester error in status channel * Minor tidy * task-manager: send status msg to indicate ready * changelog: add note * coconut/tests: fix clippy for rustc 1.66 --- CHANGELOG.md | 4 +++ clients/socks5/src/client/mod.rs | 2 +- clients/socks5/src/error.rs | 7 +++++ clients/socks5/src/socks/mixnet_responses.rs | 29 +++++++++++++------ .../src/network_requester_response.rs | 2 +- common/task/src/manager.rs | 19 ++++++++++-- nym-api/src/coconut/tests.rs | 2 +- nym-connect/src-tauri/src/tasks.rs | 2 +- 8 files changed, 51 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a40671598e..6eaa8b5bea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +### Added + +- socks5: send status message for service ready, and network-requester error response + ### Changed - all-binaries: improved error logging ([#2686]) diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index 2f62354a01..c7710056f8 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -166,7 +166,7 @@ impl NymClient { let mut shutdown = self.start().await?; // Listen to status messages from task, that we forward back to the caller - shutdown.start_status_listener(sender); + shutdown.start_status_listener(sender).await; let res = tokio::select! { biased; diff --git a/clients/socks5/src/error.rs b/clients/socks5/src/error.rs index 23cd715cf5..6318d0ec0a 100644 --- a/clients/socks5/src/error.rs +++ b/clients/socks5/src/error.rs @@ -1,6 +1,7 @@ use crate::socks::types::SocksProxyError; use client_core::client::replies::reply_storage::fs_backend; use client_core::error::ClientCoreError; +use socks5_requests::ConnectionId; #[derive(thiserror::Error, Debug)] pub enum Socks5ClientError { @@ -21,4 +22,10 @@ pub enum Socks5ClientError { #[error("Fail to bind address")] FailToBindAddress, + + #[error("Network requester: connection id {connection_id}: {error}")] + NetworkRequesterError { + connection_id: ConnectionId, + error: String, + }, } diff --git a/clients/socks5/src/socks/mixnet_responses.rs b/clients/socks5/src/socks/mixnet_responses.rs index 97835340df..85d0a7da86 100644 --- a/clients/socks5/src/socks/mixnet_responses.rs +++ b/clients/socks5/src/socks/mixnet_responses.rs @@ -11,6 +11,8 @@ use proxy_helpers::connection_controller::{ControllerCommand, ControllerSender}; use socks5_requests::Message; use task::TaskClient; +use crate::error::Socks5ClientError; + pub(crate) struct MixnetResponseListener { buffer_requester: ReceivedBufferRequestSender, mix_response_receiver: ReconstructedMessagesReceiver, @@ -52,7 +54,10 @@ impl MixnetResponseListener { } } - async fn on_message(&self, reconstructed_message: ReconstructedMessage) { + fn on_message( + &self, + reconstructed_message: ReconstructedMessage, + ) -> Result<(), Socks5ClientError> { let raw_message = reconstructed_message.message; if reconstructed_message.sender_tag.is_some() { warn!("this message was sent anonymously - it couldn't have come from the service provider"); @@ -61,11 +66,11 @@ impl MixnetResponseListener { let response = match Message::try_from_bytes(&raw_message) { Err(err) => { warn!("failed to parse received response - {err}"); - return; + return Ok(()); } Ok(Message::Request(_)) => { warn!("unexpected request"); - return; + return Ok(()); } Ok(Message::Response(data)) => data, Ok(Message::NetworkRequesterResponse(r)) => { @@ -73,7 +78,10 @@ impl MixnetResponseListener { "Network requester failed on connection id {} with error: {}", r.connection_id, r.network_requester_error ); - return; + return Err(Socks5ClientError::NetworkRequesterError { + connection_id: r.connection_id, + error: r.network_requester_error, + }); } }; @@ -84,18 +92,21 @@ impl MixnetResponseListener { response.is_closed, )) .unwrap(); + + Ok(()) } pub(crate) async fn run(&mut self) { while !self.shutdown.is_shutdown() { tokio::select! { - received_responses = self.mix_response_receiver.next() => match received_responses { - Some(received_responses) => { + received_responses = self.mix_response_receiver.next() => { + if let Some(received_responses) = received_responses { for reconstructed_message in received_responses { - self.on_message(reconstructed_message).await; + if let Err(err) = self.on_message(reconstructed_message) { + self.shutdown.send_status_msg(Box::new(err)); + } } - }, - None => { + } else { log::trace!("MixnetResponseListener: Stopping since channel closed"); break; } diff --git a/common/socks5/requests/src/network_requester_response.rs b/common/socks5/requests/src/network_requester_response.rs index 64e459dfb0..eba3f88dd9 100644 --- a/common/socks5/requests/src/network_requester_response.rs +++ b/common/socks5/requests/src/network_requester_response.rs @@ -63,7 +63,7 @@ impl NetworkRequesterResponse { self.connection_id .to_be_bytes() .iter() - .cloned() + .copied() .chain(self.network_requester_error.into_bytes().into_iter()) .collect() } diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index 3729d317a9..82129e9478 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -28,6 +28,13 @@ enum TaskError { UnexpectedHalt, } +// TODO: possibly we should create a `Status` trait instead of reusing `Error` +#[derive(thiserror::Error, Debug)] +pub enum TaskStatus { + #[error("Ready")] + Ready, +} + /// Listens to status and error messages from tasks, as well as notifying them to gracefully /// shutdown. Keeps track of if task stop unexpectedly, such as in a panic. #[derive(Debug)] @@ -101,15 +108,21 @@ impl TaskManager { self.notify_tx.send(()) } - pub fn start_status_listener(&mut self, mut sender: StatusSender) { + pub async fn start_status_listener(&mut self, mut sender: StatusSender) { + // Announce that we are operational. This means that in the application where this is used, + // everything is up and running and ready to go. + if let Err(msg) = sender.send(Box::new(TaskStatus::Ready)).await { + log::error!("Error sending status message: {}", msg); + }; + if let Some(mut task_status_rx) = self.task_status_rx.take() { log::info!("Starting status message listener"); crate::spawn::spawn(async move { loop { if let Some(msg) = task_status_rx.next().await { log::trace!("Got msg: {}", msg); - if sender.send(msg).await.is_err() { - log::error!("Error sending status message"); + if let Err(msg) = sender.send(msg).await { + log::error!("Error sending status message: {}", msg); } } else { log::trace!("Stopping since channel closed"); diff --git a/nym-api/src/coconut/tests.rs b/nym-api/src/coconut/tests.rs index 3d9d6c46a7..3408dda0a3 100644 --- a/nym-api/src/coconut/tests.rs +++ b/nym-api/src/coconut/tests.rs @@ -282,7 +282,7 @@ impl super::client::Client for DummyClient { self.dealer_details.write().unwrap().insert( self.validator_address.to_string(), DealerDetails { - address: Addr::unchecked(&self.validator_address.to_string()), + address: Addr::unchecked(self.validator_address.to_string()), bte_public_key_with_proof, announce_address, assigned_index, diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index ea3c1b1fd9..3201648e6e 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -100,7 +100,7 @@ pub fn start_status_listener( log::info!("SOCKS5 proxy sent status message: {}", msg); window .emit( - "socks5-event", + "socks5-status-event", Payload { title: "SOCKS5 update".into(), message: msg.to_string(), From 254302ec38917c33cc4ff6031f1b366de32967ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Fri, 16 Dec 2022 12:21:39 +0200 Subject: [PATCH 022/591] Feature/auto dkg advance (#2714) * Add dkg epoch * Make epoch state advancement dependent only on time * Nym api tries advancing the dkg epoch state * Update the time table a bit It still needs to be changed before production, as the sign-up timeframe needs to be something like a few days. * Update changelog * Fix tests * Fix clippy after rustc update --- CHANGELOG.md | 2 + .../src/nymd/traits/dkg_query_client.rs | 6 +- .../src/nymd/traits/dkg_signing_client.rs | 16 ++ .../coconut-dkg/src/msg.rs | 1 - .../coconut-dkg/src/types.rs | 35 +++- contracts/coconut-dkg/src/contract.rs | 26 ++- contracts/coconut-dkg/src/dealers/queries.rs | 11 +- .../coconut-dkg/src/dealers/transactions.rs | 10 +- contracts/coconut-dkg/src/dealings/queries.rs | 6 - .../coconut-dkg/src/dealings/transactions.rs | 9 +- .../coconut-dkg/src/epoch_state/queries.rs | 23 ++- .../coconut-dkg/src/epoch_state/storage.rs | 4 +- .../src/epoch_state/transactions.rs | 178 +++++++++++++----- .../coconut-dkg/src/epoch_state/utils.rs | 14 +- contracts/coconut-dkg/src/error.rs | 3 + contracts/coconut-dkg/src/state/mod.rs | 1 - .../coconut-dkg/src/support/tests/fixtures.rs | 2 +- .../coconut-dkg/src/support/tests/helpers.rs | 1 - .../src/verification_key_shares/queries.rs | 5 - .../verification_key_shares/transactions.rs | 56 ++++-- .../src/submit_vk_creates_proposal.rs | 3 +- nym-api/src/coconut/client.rs | 5 +- nym-api/src/coconut/dkg/client.rs | 12 +- nym-api/src/coconut/dkg/controller.rs | 21 ++- nym-api/src/coconut/tests.rs | 18 +- nym-api/src/nymd_client.rs | 16 +- 26 files changed, 335 insertions(+), 149 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eaa8b5bea..2a6d66b676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,10 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// - all-binaries: improved error logging ([#2686]) - native client: bring shutdown logic up to the same level as socks5-client +- nym-api, coconut-dkg contract: automatic, time-based dkg epoch state advancement ([#2670]) [#2686]: https://github.com/nymtech/nym/pull/2686 +[#2670]: https://github.com/nymtech/nym/pull/2670 ## [v1.1.3] (2022-12-13) diff --git a/common/client-libs/validator-client/src/nymd/traits/dkg_query_client.rs b/common/client-libs/validator-client/src/nymd/traits/dkg_query_client.rs index b67627d316..ce69556137 100644 --- a/common/client-libs/validator-client/src/nymd/traits/dkg_query_client.rs +++ b/common/client-libs/validator-client/src/nymd/traits/dkg_query_client.rs @@ -8,13 +8,13 @@ use coconut_dkg_common::dealer::{ DealerDetailsResponse, PagedDealerResponse, PagedDealingsResponse, }; use coconut_dkg_common::msg::QueryMsg as DkgQueryMsg; -use coconut_dkg_common::types::EpochState; +use coconut_dkg_common::types::Epoch; use coconut_dkg_common::verification_key::PagedVKSharesResponse; use cosmrs::AccountId; #[async_trait] pub trait DkgQueryClient { - async fn get_current_epoch_state(&self) -> Result; + async fn get_current_epoch(&self) -> Result; async fn get_current_epoch_threshold(&self) -> Result, NymdError>; async fn get_dealer_details( &self, @@ -49,7 +49,7 @@ impl DkgQueryClient for NymdClient where C: CosmWasmClient + Send + Sync, { - async fn get_current_epoch_state(&self) -> Result { + async fn get_current_epoch(&self) -> Result { let request = DkgQueryMsg::GetCurrentEpochState {}; self.client .query_contract_smart(self.coconut_dkg_contract_address(), &request) diff --git a/common/client-libs/validator-client/src/nymd/traits/dkg_signing_client.rs b/common/client-libs/validator-client/src/nymd/traits/dkg_signing_client.rs index b0d1dfaf08..6fee83ac5d 100644 --- a/common/client-libs/validator-client/src/nymd/traits/dkg_signing_client.rs +++ b/common/client-libs/validator-client/src/nymd/traits/dkg_signing_client.rs @@ -12,6 +12,7 @@ use contracts_common::dealings::ContractSafeBytes; #[async_trait] pub trait DkgSigningClient { + async fn advance_dkg_epoch_state(&self, fee: Option) -> Result; async fn register_dealer( &self, bte_key: EncodedBTEPublicKeyWithProof, @@ -37,6 +38,21 @@ impl DkgSigningClient for NymdClient where C: SigningCosmWasmClient + Send + Sync, { + async fn advance_dkg_epoch_state(&self, fee: Option) -> Result { + let req = DkgExecuteMsg::AdvanceEpochState {}; + + self.client + .execute( + self.address(), + self.coconut_dkg_contract_address(), + &req, + fee.unwrap_or_default(), + "advancing DKG state", + vec![], + ) + .await + } + async fn register_dealer( &self, bte_key: EncodedBTEPublicKeyWithProof, diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs index b2d0f1ae20..7a85486eb0 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs @@ -11,7 +11,6 @@ use serde::{Deserialize, Serialize}; pub struct InstantiateMsg { pub group_addr: String, pub multisig_addr: String, - pub admin: String, pub mix_denom: String, } diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs index ffb1653919..4de725cebf 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs @@ -6,15 +6,48 @@ use std::fmt::{Display, Formatter}; pub use crate::dealer::{DealerDetails, PagedDealerResponse}; pub use contracts_common::dealings::ContractSafeBytes; -pub use cosmwasm_std::{Addr, Coin}; +pub use cosmwasm_std::{Addr, Coin, Timestamp}; pub type EncodedBTEPublicKeyWithProof = String; pub type EncodedBTEPublicKeyWithProofRef<'a> = &'a str; pub type NodeIndex = u64; +// The time sign-up is open for dealers to join (2 minutes) +pub const PUBLIC_KEY_SUBMISSION_TIME_SECS: u64 = 60 * 2; +pub const DEALING_EXCHANGE_TIME_SECS: u64 = 60 * 5; +pub const VERIFICATION_KEY_SUBMISSION_TIME_SECS: u64 = 60 * 5; +pub const VERIFICATION_KEY_VALIDATION_TIME_SECS: u64 = 60; +pub const VERIFICATION_KEY_FINALIZATION_TIME_SECS: u64 = 60; +// The time an epoch lasts (2 weeks) +pub const IN_PROGRESS_TIME_SECS: u64 = 60 * 60 * 24 * 14; + // 2 public attributes, 2 private attributes, 1 fixed for coconut credential pub const TOTAL_DEALINGS: usize = 2 + 2 + 1; +#[derive(Serialize, Deserialize, Default, Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)] +#[serde(rename_all = "snake_case")] +pub struct Epoch { + pub state: EpochState, + pub finish_timestamp: Timestamp, +} + +impl Epoch { + pub fn new(state: EpochState, current_timestamp: Timestamp) -> Self { + let duration = match state { + EpochState::PublicKeySubmission => PUBLIC_KEY_SUBMISSION_TIME_SECS, + EpochState::DealingExchange => DEALING_EXCHANGE_TIME_SECS, + EpochState::VerificationKeySubmission => VERIFICATION_KEY_SUBMISSION_TIME_SECS, + EpochState::VerificationKeyValidation => VERIFICATION_KEY_VALIDATION_TIME_SECS, + EpochState::VerificationKeyFinalization => VERIFICATION_KEY_FINALIZATION_TIME_SECS, + EpochState::InProgress => IN_PROGRESS_TIME_SECS, + }; + Epoch { + state, + finish_timestamp: current_timestamp.plus_seconds(duration), + } + } +} + // currently (it is still extremely likely to change, we might be able to get rid of verification key-related complaints), // the epoch can be in the following states (in order): // 1. PublicKeySubmission -> potential dealers are submitting their BTE and ed25519 public keys to participate in dealing exchange diff --git a/contracts/coconut-dkg/src/contract.rs b/contracts/coconut-dkg/src/contract.rs index 5394e845af..650cf312f0 100644 --- a/contracts/coconut-dkg/src/contract.rs +++ b/contracts/coconut-dkg/src/contract.rs @@ -7,16 +7,16 @@ use crate::dealers::queries::{ use crate::dealers::transactions::try_add_dealer; use crate::dealings::queries::query_dealings_paged; use crate::dealings::transactions::try_commit_dealings; -use crate::epoch_state::queries::{query_current_epoch_state, query_current_epoch_threshold}; -use crate::epoch_state::storage::CURRENT_EPOCH_STATE; +use crate::epoch_state::queries::{query_current_epoch, query_current_epoch_threshold}; +use crate::epoch_state::storage::CURRENT_EPOCH; use crate::epoch_state::transactions::advance_epoch_state; use crate::error::ContractError; -use crate::state::{State, ADMIN, MULTISIG, STATE}; +use crate::state::{State, MULTISIG, STATE}; use crate::verification_key_shares::queries::query_vk_shares_paged; use crate::verification_key_shares::transactions::try_commit_verification_key_share; use crate::verification_key_shares::transactions::try_verify_verification_key_share; use coconut_dkg_common::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; -use coconut_dkg_common::types::EpochState; +use coconut_dkg_common::types::{Epoch, EpochState}; use cosmwasm_std::{ entry_point, to_binary, Deps, DepsMut, Env, MessageInfo, QueryResponse, Response, }; @@ -30,13 +30,11 @@ use cw4::Cw4Contract; #[entry_point] pub fn instantiate( mut deps: DepsMut<'_>, - _env: Env, + env: Env, _info: MessageInfo, msg: InstantiateMsg, ) -> Result { - let admin_addr = deps.api.addr_validate(&msg.admin)?; let multisig_addr = deps.api.addr_validate(&msg.multisig_addr)?; - ADMIN.set(deps.branch(), Some(admin_addr))?; MULTISIG.set(deps.branch(), Some(multisig_addr.clone()))?; let group_addr = Cw4Contract(deps.api.addr_validate(&msg.group_addr).map_err(|_| { @@ -52,7 +50,10 @@ pub fn instantiate( }; STATE.save(deps.storage, &state)?; - CURRENT_EPOCH_STATE.save(deps.storage, &EpochState::default())?; + CURRENT_EPOCH.save( + deps.storage, + &Epoch::new(EpochState::default(), env.block.time), + )?; Ok(Response::default()) } @@ -79,14 +80,14 @@ pub fn execute( ExecuteMsg::VerifyVerificationKeyShare { owner } => { try_verify_verification_key_share(deps, info, owner) } - ExecuteMsg::AdvanceEpochState {} => advance_epoch_state(deps, info), + ExecuteMsg::AdvanceEpochState {} => advance_epoch_state(deps, env), } } #[entry_point] pub fn query(deps: Deps<'_>, _env: Env, msg: QueryMsg) -> Result { let response = match msg { - QueryMsg::GetCurrentEpochState {} => to_binary(&query_current_epoch_state(deps.storage)?)?, + QueryMsg::GetCurrentEpochState {} => to_binary(&query_current_epoch(deps.storage)?)?, QueryMsg::GetCurrentEpochThreshold {} => { to_binary(&query_current_epoch_threshold(deps.storage)?)? } @@ -120,9 +121,8 @@ pub fn migrate(_deps: DepsMut<'_>, _env: Env, _msg: MigrateMsg) -> Result, mapping: &IndexedDealersMap<'_>, size: usize) { for n in 0..size { @@ -95,8 +94,7 @@ pub(crate) mod tests { #[test] fn dealers_empty_on_init() { - let mut deps = init_contract(); - let env = mock_env(); + let deps = init_contract(); for mapping in [storage::current_dealers(), storage::past_dealers()] { let page1 = query_dealers(deps.as_ref(), None, None, &mapping).unwrap(); @@ -107,8 +105,6 @@ pub(crate) mod tests { #[test] fn dealers_paged_retrieval_obeys_limits() { let mut deps = init_contract(); - let env = mock_env(); - let owner = Addr::unchecked("owner"); let limit = 2; for mapping in [storage::current_dealers(), storage::past_dealers()] { @@ -124,7 +120,6 @@ pub(crate) mod tests { #[test] fn dealers_paged_retrieval_has_default_limit() { let mut deps = init_contract(); - let env = mock_env(); for mapping in [storage::current_dealers(), storage::past_dealers()] { fill_dealers(deps.as_mut(), &mapping, 1000); @@ -141,7 +136,6 @@ pub(crate) mod tests { #[test] fn dealers_paged_retrieval_has_max_limit() { let mut deps = init_contract(); - let env = mock_env(); // query with a crazily high limit in an attempt to use too many resources let crazy_limit = 1000 * DEALERS_PAGE_MAX_LIMIT; @@ -163,7 +157,6 @@ pub(crate) mod tests { #[test] fn dealers_pagination_works() { let mut deps = init_contract(); - let env = mock_env(); let per_page = 2; diff --git a/contracts/coconut-dkg/src/dealers/transactions.rs b/contracts/coconut-dkg/src/dealers/transactions.rs index 6c5ccbb8db..6566581221 100644 --- a/contracts/coconut-dkg/src/dealers/transactions.rs +++ b/contracts/coconut-dkg/src/dealers/transactions.rs @@ -70,21 +70,21 @@ pub fn try_add_dealer( pub(crate) mod tests { use super::*; use crate::epoch_state::transactions::advance_epoch_state; - use crate::support::tests::fixtures::dealer_details_fixture; use crate::support::tests::helpers; - use crate::support::tests::helpers::ADMIN_ADDRESS; - use cosmwasm_std::testing::mock_info; + use coconut_dkg_common::types::PUBLIC_KEY_SUBMISSION_TIME_SECS; + use cosmwasm_std::testing::{mock_env, mock_info}; #[test] fn invalid_state() { let mut deps = helpers::init_contract(); let owner = Addr::unchecked("owner"); + let mut env = mock_env(); let info = mock_info(owner.as_str(), &[]); - let dealer_details = dealer_details_fixture(1); let bte_key_with_proof = String::from("bte_key_with_proof"); let announce_address = String::from("localhost:8000"); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); + env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = try_add_dealer( deps.as_mut(), diff --git a/contracts/coconut-dkg/src/dealings/queries.rs b/contracts/coconut-dkg/src/dealings/queries.rs index 7fe476a458..0bf0452c14 100644 --- a/contracts/coconut-dkg/src/dealings/queries.rs +++ b/contracts/coconut-dkg/src/dealings/queries.rs @@ -50,7 +50,6 @@ pub(crate) mod tests { use crate::dealings::storage::{DEALINGS_PAGE_DEFAULT_LIMIT, DEALINGS_PAGE_MAX_LIMIT}; use crate::support::tests::fixtures::dealing_bytes_fixture; use crate::support::tests::helpers::init_contract; - use cosmwasm_std::testing::mock_env; use cosmwasm_std::{Addr, DepsMut}; fn fill_dealings(deps: DepsMut<'_>, size: usize) { @@ -68,7 +67,6 @@ pub(crate) mod tests { #[test] fn empty_on_bad_idx() { let mut deps = init_contract(); - let env = mock_env(); fill_dealings(deps.as_mut(), 1000); for idx in TOTAL_DEALINGS as u64..100 * TOTAL_DEALINGS as u64 { @@ -89,7 +87,6 @@ pub(crate) mod tests { #[test] fn dealings_paged_retrieval_obeys_limits() { let mut deps = init_contract(); - let env = mock_env(); let limit = 2; fill_dealings(deps.as_mut(), 1000); @@ -103,7 +100,6 @@ pub(crate) mod tests { #[test] fn dealings_paged_retrieval_has_default_limit() { let mut deps = init_contract(); - let env = mock_env(); fill_dealings(deps.as_mut(), 1000); for idx in 0..TOTAL_DEALINGS as u64 { @@ -117,7 +113,6 @@ pub(crate) mod tests { #[test] fn dealings_paged_retrieval_has_max_limit() { let mut deps = init_contract(); - let env = mock_env(); fill_dealings(deps.as_mut(), 1000); // query with a crazily high limit in an attempt to use too many resources @@ -135,7 +130,6 @@ pub(crate) mod tests { #[test] fn dealings_pagination_works() { let mut deps = init_contract(); - let env = mock_env(); fill_dealings(deps.as_mut(), 1); diff --git a/contracts/coconut-dkg/src/dealings/transactions.rs b/contracts/coconut-dkg/src/dealings/transactions.rs index 7320768979..fe2e5544cb 100644 --- a/contracts/coconut-dkg/src/dealings/transactions.rs +++ b/contracts/coconut-dkg/src/dealings/transactions.rs @@ -42,16 +42,16 @@ pub(crate) mod tests { use crate::epoch_state::transactions::advance_epoch_state; use crate::support::tests::fixtures::dealing_bytes_fixture; use crate::support::tests::helpers; - use crate::support::tests::helpers::ADMIN_ADDRESS; use coconut_dkg_common::dealer::DealerDetails; - use coconut_dkg_common::types::TOTAL_DEALINGS; - use cosmwasm_std::testing::mock_info; + use coconut_dkg_common::types::PUBLIC_KEY_SUBMISSION_TIME_SECS; + use cosmwasm_std::testing::{mock_env, mock_info}; use cosmwasm_std::Addr; #[test] fn invalid_commit_dealing() { let mut deps = helpers::init_contract(); let owner = Addr::unchecked("owner"); + let mut env = mock_env(); let info = mock_info(owner.as_str(), &[]); let dealing_bytes = dealing_bytes_fixture(); @@ -65,7 +65,8 @@ pub(crate) mod tests { } ); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); + env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = try_commit_dealings(deps.as_mut(), info.clone(), dealing_bytes.clone()).unwrap_err(); diff --git a/contracts/coconut-dkg/src/epoch_state/queries.rs b/contracts/coconut-dkg/src/epoch_state/queries.rs index a7027ca488..3a68e0117c 100644 --- a/contracts/coconut-dkg/src/epoch_state/queries.rs +++ b/contracts/coconut-dkg/src/epoch_state/queries.rs @@ -1,15 +1,13 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::epoch_state::storage::{CURRENT_EPOCH_STATE, THRESHOLD}; +use crate::epoch_state::storage::{CURRENT_EPOCH, THRESHOLD}; use crate::error::ContractError; -use coconut_dkg_common::types::EpochState; +use coconut_dkg_common::types::Epoch; use cosmwasm_std::Storage; -pub(crate) fn query_current_epoch_state( - storage: &dyn Storage, -) -> Result { - CURRENT_EPOCH_STATE +pub(crate) fn query_current_epoch(storage: &dyn Storage) -> Result { + CURRENT_EPOCH .load(storage) .map_err(|_| ContractError::EpochNotInitialised) } @@ -24,12 +22,21 @@ pub(crate) fn query_current_epoch_threshold( pub(crate) mod test { use super::*; use crate::support::tests::helpers::init_contract; + use coconut_dkg_common::types::{EpochState, PUBLIC_KEY_SUBMISSION_TIME_SECS}; + use cosmwasm_std::testing::mock_env; #[test] fn query_state() { let mut deps = init_contract(); - let state = query_current_epoch_state(deps.as_mut().storage).unwrap(); - assert_eq!(state, EpochState::PublicKeySubmission); + let epoch = query_current_epoch(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::PublicKeySubmission); + assert_eq!( + epoch.finish_timestamp, + mock_env() + .block + .time + .plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS) + ); } #[test] diff --git a/contracts/coconut-dkg/src/epoch_state/storage.rs b/contracts/coconut-dkg/src/epoch_state/storage.rs index b5c670d899..d5aac5b041 100644 --- a/contracts/coconut-dkg/src/epoch_state/storage.rs +++ b/contracts/coconut-dkg/src/epoch_state/storage.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use coconut_dkg_common::types::EpochState; +use coconut_dkg_common::types::Epoch; use cw_storage_plus::Item; -pub(crate) const CURRENT_EPOCH_STATE: Item<'_, EpochState> = Item::new("current_epoch_state"); +pub(crate) const CURRENT_EPOCH: Item<'_, Epoch> = Item::new("current_epoch"); pub const THRESHOLD: Item = Item::new("threshold"); diff --git a/contracts/coconut-dkg/src/epoch_state/transactions.rs b/contracts/coconut-dkg/src/epoch_state/transactions.rs index fbb597f668..e2e75a1678 100644 --- a/contracts/coconut-dkg/src/epoch_state/transactions.rs +++ b/contracts/coconut-dkg/src/epoch_state/transactions.rs @@ -2,25 +2,29 @@ // SPDX-License-Identifier: Apache-2.0 use crate::dealers::storage::current_dealers; -use crate::epoch_state::storage::{CURRENT_EPOCH_STATE, THRESHOLD}; +use crate::epoch_state::storage::{CURRENT_EPOCH, THRESHOLD}; use crate::error::ContractError; -use crate::state::ADMIN; -use coconut_dkg_common::types::EpochState; -use cosmwasm_std::{DepsMut, MessageInfo, Order, Response}; +use coconut_dkg_common::types::{Epoch, EpochState}; +use cosmwasm_std::{DepsMut, Env, Order, Response}; -pub(crate) fn advance_epoch_state( - deps: DepsMut<'_>, - info: MessageInfo, -) -> Result { - ADMIN.assert_admin(deps.as_ref(), &info.sender)?; - let current_epoch_state = - CURRENT_EPOCH_STATE.update::<_, ContractError>(deps.storage, |mut epoch_state| { - // TODO: When defaulting to the first state, some action will probably need to be taken on the - // rest of the contract, as we're starting with a new set of signers - epoch_state = epoch_state.next().unwrap_or_default(); - Ok(epoch_state) - })?; - if current_epoch_state == EpochState::DealingExchange { +pub(crate) fn advance_epoch_state(deps: DepsMut<'_>, env: Env) -> Result { + let epoch = CURRENT_EPOCH.load(deps.storage)?; + if epoch.finish_timestamp > env.block.time { + return Err(ContractError::EarlyEpochStateAdvancement( + epoch + .finish_timestamp + .minus_seconds(env.block.time.seconds()) + .seconds(), + )); + } + + let current_epoch = CURRENT_EPOCH.update::<_, ContractError>(deps.storage, |mut epoch| { + // TODO: When defaulting to the first state, some action will probably need to be taken on the + // rest of the contract, as we're starting with a new set of signers + epoch = Epoch::new(epoch.state.next().unwrap_or_default(), env.block.time); + Ok(epoch) + })?; + if current_epoch.state == EpochState::DealingExchange { let current_dealer_count = current_dealers() .keys(deps.storage, None, None, Order::Ascending) .count(); @@ -34,64 +38,147 @@ pub(crate) fn advance_epoch_state( #[cfg(test)] pub(crate) mod tests { use super::*; - use crate::support::tests::helpers::{init_contract, ADMIN_ADDRESS}; - use coconut_dkg_common::types::{DealerDetails, EpochState}; - use cosmwasm_std::testing::mock_info; + use crate::error::ContractError::EarlyEpochStateAdvancement; + use crate::support::tests::helpers::init_contract; + use coconut_dkg_common::types::{ + DealerDetails, EpochState, DEALING_EXCHANGE_TIME_SECS, IN_PROGRESS_TIME_SECS, + PUBLIC_KEY_SUBMISSION_TIME_SECS, VERIFICATION_KEY_FINALIZATION_TIME_SECS, + VERIFICATION_KEY_SUBMISSION_TIME_SECS, VERIFICATION_KEY_VALIDATION_TIME_SECS, + }; + use cosmwasm_std::testing::mock_env; use cosmwasm_std::Addr; - use cw_controllers::AdminError; #[test] fn advance_state() { let mut deps = init_contract(); - let info = mock_info("requester", &[]); - let admin_info = mock_info(ADMIN_ADDRESS, &[]); + let mut env = mock_env(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::PublicKeySubmission); assert_eq!( - advance_epoch_state(deps.as_mut(), info).unwrap_err(), - ContractError::Admin(AdminError::NotAdmin {}) + epoch.finish_timestamp, + env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS) ); - advance_epoch_state(deps.as_mut(), admin_info.clone()).unwrap(); + env.block.time = env + .block + .time + .plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS - 1); assert_eq!( - CURRENT_EPOCH_STATE.load(deps.as_mut().storage).unwrap(), - EpochState::DealingExchange + advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), + EarlyEpochStateAdvancement(1) ); - advance_epoch_state(deps.as_mut(), admin_info.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(1); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::DealingExchange); assert_eq!( - CURRENT_EPOCH_STATE.load(deps.as_mut().storage).unwrap(), - EpochState::VerificationKeySubmission + epoch.finish_timestamp, + env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS) ); - advance_epoch_state(deps.as_mut(), admin_info.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS - 2); assert_eq!( - CURRENT_EPOCH_STATE.load(deps.as_mut().storage).unwrap(), - EpochState::VerificationKeyValidation + advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), + EarlyEpochStateAdvancement(2) ); - advance_epoch_state(deps.as_mut(), admin_info.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(3); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::VerificationKeySubmission); assert_eq!( - CURRENT_EPOCH_STATE.load(deps.as_mut().storage).unwrap(), - EpochState::VerificationKeyFinalization + epoch.finish_timestamp, + env.block + .time + .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS) ); - advance_epoch_state(deps.as_mut(), admin_info.clone()).unwrap(); + env.block.time = env + .block + .time + .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS - 2); assert_eq!( - CURRENT_EPOCH_STATE.load(deps.as_mut().storage).unwrap(), - EpochState::InProgress + advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), + EarlyEpochStateAdvancement(2) ); - advance_epoch_state(deps.as_mut(), admin_info.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(3); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::VerificationKeyValidation); assert_eq!( - CURRENT_EPOCH_STATE.load(deps.as_mut().storage).unwrap(), - EpochState::PublicKeySubmission + epoch.finish_timestamp, + env.block + .time + .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS) + ); + + env.block.time = env + .block + .time + .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS - 3); + assert_eq!( + advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), + EarlyEpochStateAdvancement(3) + ); + + env.block.time = env.block.time.plus_seconds(3); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::VerificationKeyFinalization); + assert_eq!( + epoch.finish_timestamp, + env.block + .time + .plus_seconds(VERIFICATION_KEY_FINALIZATION_TIME_SECS) + ); + + env.block.time = env + .block + .time + .plus_seconds(VERIFICATION_KEY_FINALIZATION_TIME_SECS - 1); + assert_eq!( + advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), + EarlyEpochStateAdvancement(1) + ); + + env.block.time = env.block.time.plus_seconds(1); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::InProgress); + assert_eq!( + epoch.finish_timestamp, + env.block.time.plus_seconds(IN_PROGRESS_TIME_SECS) + ); + + env.block.time = env.block.time.plus_seconds(IN_PROGRESS_TIME_SECS - 100); + assert_eq!( + advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), + EarlyEpochStateAdvancement(100) + ); + + env.block.time = env.block.time.plus_seconds(50); + assert_eq!( + advance_epoch_state(deps.as_mut(), env.clone()).unwrap_err(), + EarlyEpochStateAdvancement(50) + ); + + env.block.time = env.block.time.plus_seconds(100); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!(epoch.state, EpochState::PublicKeySubmission); + assert_eq!( + epoch.finish_timestamp, + env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS) ); } #[test] fn verify_threshold() { let mut deps = init_contract(); - let admin_info = mock_info(ADMIN_ADDRESS, &[]); + let mut env = mock_env(); assert!(THRESHOLD.may_load(deps.as_mut().storage).unwrap().is_none()); @@ -111,7 +198,8 @@ pub(crate) mod tests { .unwrap(); } - advance_epoch_state(deps.as_mut(), admin_info.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env).unwrap(); assert_eq!( THRESHOLD.may_load(deps.as_mut().storage).unwrap().unwrap(), 67 diff --git a/contracts/coconut-dkg/src/epoch_state/utils.rs b/contracts/coconut-dkg/src/epoch_state/utils.rs index b944ad361d..280436ee2e 100644 --- a/contracts/coconut-dkg/src/epoch_state/utils.rs +++ b/contracts/coconut-dkg/src/epoch_state/utils.rs @@ -1,7 +1,7 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::epoch_state::storage::CURRENT_EPOCH_STATE; +use crate::epoch_state::storage::CURRENT_EPOCH; use crate::error::ContractError; use coconut_dkg_common::types::EpochState; use cosmwasm_std::Storage; @@ -10,7 +10,7 @@ pub(crate) fn check_epoch_state( storage: &dyn Storage, against: EpochState, ) -> Result<(), ContractError> { - let epoch_state = CURRENT_EPOCH_STATE.load(storage)?; + let epoch_state = CURRENT_EPOCH.load(storage)?.state; if epoch_state != against { Err(ContractError::IncorrectEpochState { current_state: epoch_state.to_string(), @@ -25,14 +25,20 @@ pub(crate) fn check_epoch_state( pub(crate) mod test { use super::*; use crate::support::tests::helpers::init_contract; + use coconut_dkg_common::types::Epoch; + use cosmwasm_std::testing::mock_env; #[test] pub fn check_state() { let mut deps = init_contract(); + let env = mock_env(); for fixed_state in EpochState::default().all_until(EpochState::InProgress) { - CURRENT_EPOCH_STATE - .save(deps.as_mut().storage, &fixed_state) + CURRENT_EPOCH + .save( + deps.as_mut().storage, + &Epoch::new(fixed_state, env.block.time), + ) .unwrap(); for against_state in EpochState::default().all_until(EpochState::InProgress) { let ret = check_epoch_state(deps.as_mut().storage, against_state); diff --git a/contracts/coconut-dkg/src/error.rs b/contracts/coconut-dkg/src/error.rs index cd359579d0..0baeae5edd 100644 --- a/contracts/coconut-dkg/src/error.rs +++ b/contracts/coconut-dkg/src/error.rs @@ -23,6 +23,9 @@ pub enum ContractError { #[error("This sender is already a dealer for the epoch")] AlreadyADealer, + #[error("Too soon to advance epoch state. {0} more seconds until it can be advanced")] + EarlyEpochStateAdvancement(u64), + #[error("Epoch hasn't been correctly initialised!")] EpochNotInitialised, diff --git a/contracts/coconut-dkg/src/state/mod.rs b/contracts/coconut-dkg/src/state/mod.rs index 729618ec60..533bd98a0a 100644 --- a/contracts/coconut-dkg/src/state/mod.rs +++ b/contracts/coconut-dkg/src/state/mod.rs @@ -10,7 +10,6 @@ use serde::{Deserialize, Serialize}; // unique items pub const STATE: Item = Item::new("state"); -pub const ADMIN: Admin = Admin::new("admin"); pub const MULTISIG: Admin = Admin::new("multisig"); #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] diff --git a/contracts/coconut-dkg/src/support/tests/fixtures.rs b/contracts/coconut-dkg/src/support/tests/fixtures.rs index e0bdee4e4d..19aad555d1 100644 --- a/contracts/coconut-dkg/src/support/tests/fixtures.rs +++ b/contracts/coconut-dkg/src/support/tests/fixtures.rs @@ -1,7 +1,7 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use coconut_dkg_common::dealer::{ContractDealing, DealerDetails}; +use coconut_dkg_common::dealer::DealerDetails; use coconut_dkg_common::types::ContractSafeBytes; use coconut_dkg_common::verification_key::ContractVKShare; use cosmwasm_std::Addr; diff --git a/contracts/coconut-dkg/src/support/tests/helpers.rs b/contracts/coconut-dkg/src/support/tests/helpers.rs index ec46ff0215..b59ee40bcf 100644 --- a/contracts/coconut-dkg/src/support/tests/helpers.rs +++ b/contracts/coconut-dkg/src/support/tests/helpers.rs @@ -17,7 +17,6 @@ pub fn init_contract() -> OwnedDeps> let msg = InstantiateMsg { group_addr: String::from(GROUP_CONTRACT), multisig_addr: String::from(MULTISIG_CONTRACT), - admin: String::from(ADMIN_ADDRESS), mix_denom: TEST_MIX_DENOM.to_string(), }; let env = mock_env(); diff --git a/contracts/coconut-dkg/src/verification_key_shares/queries.rs b/contracts/coconut-dkg/src/verification_key_shares/queries.rs index e9c4d00dca..331c42e58a 100644 --- a/contracts/coconut-dkg/src/verification_key_shares/queries.rs +++ b/contracts/coconut-dkg/src/verification_key_shares/queries.rs @@ -45,7 +45,6 @@ pub(crate) mod tests { use crate::verification_key_shares::storage::{ VERIFICATION_KEY_SHARES_PAGE_DEFAULT_LIMIT, VERIFICATION_KEY_SHARES_PAGE_MAX_LIMIT, }; - use cosmwasm_std::testing::mock_env; use cosmwasm_std::Addr; #[test] @@ -58,7 +57,6 @@ pub(crate) mod tests { #[test] fn vk_shares_paged_retrieval_obeys_limits() { let mut deps = init_contract(); - let env = mock_env(); let limit = 2; for n in 0..1000 { let vk_share = vk_share_fixture(n); @@ -75,7 +73,6 @@ pub(crate) mod tests { #[test] fn vk_shares_paged_retrieval_has_default_limit() { let mut deps = init_contract(); - let env = mock_env(); for n in 0..1000 { let vk_share = vk_share_fixture(n); let sender = Addr::unchecked(format!("owner{}", n)); @@ -96,7 +93,6 @@ pub(crate) mod tests { #[test] fn vk_shares_paged_retrieval_has_max_limit() { let mut deps = init_contract(); - let env = mock_env(); for n in 0..1000 { let vk_share = vk_share_fixture(n); let sender = Addr::unchecked(format!("owner{}", n)); @@ -117,7 +113,6 @@ pub(crate) mod tests { #[test] fn vk_shares_pagination_works() { let mut deps = init_contract(); - let env = mock_env(); let vk_share = vk_share_fixture(1); let sender = Addr::unchecked(format!("owner{}", 1)); diff --git a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs index 0f76fc7811..69df1bad7b 100644 --- a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs +++ b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs @@ -73,20 +73,21 @@ pub fn try_verify_verification_key_share( #[cfg(test)] mod tests { use super::*; - use crate::epoch_state::storage::CURRENT_EPOCH_STATE; use crate::epoch_state::transactions::advance_epoch_state; use crate::support::tests::helpers; - use crate::support::tests::helpers::{ADMIN_ADDRESS, MULTISIG_CONTRACT}; + use crate::support::tests::helpers::MULTISIG_CONTRACT; use coconut_dkg_common::dealer::DealerDetails; - use coconut_dkg_common::types::EpochState; + use coconut_dkg_common::types::{ + EpochState, DEALING_EXCHANGE_TIME_SECS, PUBLIC_KEY_SUBMISSION_TIME_SECS, + VERIFICATION_KEY_SUBMISSION_TIME_SECS, VERIFICATION_KEY_VALIDATION_TIME_SECS, + }; use cosmwasm_std::testing::{mock_env, mock_info}; - use cosmwasm_std::Storage; use cw_controllers::AdminError; #[test] fn commit_vk_share() { let mut deps = helpers::init_contract(); - let env = mock_env(); + let mut env = mock_env(); let info = mock_info("requester", &[]); let share = "share".to_string(); @@ -104,8 +105,10 @@ mod tests { expected_state: EpochState::VerificationKeySubmission.to_string() } ); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); + env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); let ret = try_commit_verification_key_share( deps.as_mut(), env.clone(), @@ -147,6 +150,7 @@ mod tests { #[test] fn invalid_verify_vk_share() { let mut deps = helpers::init_contract(); + let mut env = mock_env(); let info = mock_info("requester", &[]); let owner = Addr::unchecked("owner"); let multisig_info = mock_info(MULTISIG_CONTRACT, &[]); @@ -161,10 +165,20 @@ mod tests { } ); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); + env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + env.block.time = env + .block + .time + .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + env.block.time = env + .block + .time + .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = try_verify_verification_key_share(deps.as_mut(), info, owner.clone()).unwrap_err(); @@ -183,14 +197,16 @@ mod tests { #[test] fn verify_vk_share() { let mut deps = helpers::init_contract(); - let env = mock_env(); + let mut env = mock_env(); let owner = Addr::unchecked("owner"); let info = mock_info(owner.as_ref(), &[]); let share = "share".to_string(); let multisig_info = mock_info(MULTISIG_CONTRACT, &[]); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); + env.block.time = env.block.time.plus_seconds(PUBLIC_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + env.block.time = env.block.time.plus_seconds(DEALING_EXCHANGE_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); let dealer_details = DealerDetails { address: owner.clone(), @@ -204,8 +220,16 @@ mod tests { try_commit_verification_key_share(deps.as_mut(), env.clone(), info.clone(), share.clone()) .unwrap(); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); - advance_epoch_state(deps.as_mut(), mock_info(ADMIN_ADDRESS, &[])).unwrap(); + env.block.time = env + .block + .time + .plus_seconds(VERIFICATION_KEY_SUBMISSION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + env.block.time = env + .block + .time + .plus_seconds(VERIFICATION_KEY_VALIDATION_TIME_SECS); + advance_epoch_state(deps.as_mut(), env).unwrap(); try_verify_verification_key_share(deps.as_mut(), multisig_info, owner.clone()).unwrap(); } diff --git a/contracts/coconut-test/src/submit_vk_creates_proposal.rs b/contracts/coconut-test/src/submit_vk_creates_proposal.rs index 15bbd65341..1122115b6d 100644 --- a/contracts/coconut-test/src/submit_vk_creates_proposal.rs +++ b/contracts/coconut-test/src/submit_vk_creates_proposal.rs @@ -71,7 +71,6 @@ fn dkg_proposal() { let msg = DkgInstantiateMsg { group_addr: group_contract_addr.to_string(), multisig_addr: multisig_contract_addr.to_string(), - admin: Addr::unchecked(OWNER).to_string(), mix_denom: TEST_COIN_DENOM.to_string(), }; let coconut_dkg_contract_addr = app @@ -109,6 +108,7 @@ fn dkg_proposal() { .unwrap(); for _ in 0..2 { + app.update_block(|block| block.time = block.time.plus_seconds(1000)); app.execute_contract( Addr::unchecked(OWNER), coconut_dkg_contract_addr.clone(), @@ -175,6 +175,7 @@ fn dkg_proposal() { .unwrap(); for _ in 0..2 { + app.update_block(|block| block.time = block.time.plus_seconds(1000)); app.execute_contract( Addr::unchecked(OWNER), coconut_dkg_contract_addr.clone(), diff --git a/nym-api/src/coconut/client.rs b/nym-api/src/coconut/client.rs index 87a64a4e6e..92af589921 100644 --- a/nym-api/src/coconut/client.rs +++ b/nym-api/src/coconut/client.rs @@ -4,7 +4,7 @@ use crate::coconut::error::Result; use coconut_bandwidth_contract_common::spend_credential::SpendCredentialResponse; use coconut_dkg_common::dealer::{ContractDealing, DealerDetails, DealerDetailsResponse}; -use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, EpochState}; +use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, Epoch}; use coconut_dkg_common::verification_key::{ContractVKShare, VerificationKeyShare}; use contracts_common::dealings::ContractSafeBytes; use cw3::ProposalResponse; @@ -22,7 +22,7 @@ pub trait Client { &self, blinded_serial_number: String, ) -> Result; - async fn get_current_epoch_state(&self) -> Result; + async fn get_current_epoch(&self) -> Result; async fn get_current_epoch_threshold(&self) -> Result>; async fn get_self_registered_dealer_details(&self) -> Result; async fn get_current_dealers(&self) -> Result>; @@ -31,6 +31,7 @@ pub trait Client { async fn vote_proposal(&self, proposal_id: u64, vote_yes: bool, fee: Option) -> Result<()>; async fn execute_proposal(&self, proposal_id: u64) -> Result<()>; + async fn advance_epoch_state(&self) -> Result<()>; async fn register_dealer( &self, bte_key: EncodedBTEPublicKeyWithProof, diff --git a/nym-api/src/coconut/dkg/client.rs b/nym-api/src/coconut/dkg/client.rs index d8a0cf5d69..61b583b84b 100644 --- a/nym-api/src/coconut/dkg/client.rs +++ b/nym-api/src/coconut/dkg/client.rs @@ -4,7 +4,7 @@ use crate::coconut::client::Client; use crate::coconut::error::CoconutError; use coconut_dkg_common::dealer::{ContractDealing, DealerDetails, DealerDetailsResponse}; -use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, EpochState, NodeIndex}; +use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, Epoch, NodeIndex}; use coconut_dkg_common::verification_key::{ContractVKShare, VerificationKeyShare}; use contracts_common::dealings::ContractSafeBytes; use cw3::ProposalResponse; @@ -35,13 +35,13 @@ impl DkgClient { self.inner.address().await } - pub(crate) async fn get_current_epoch_state(&self) -> Result { - let mut ret = self.inner.get_current_epoch_state().await; + pub(crate) async fn get_current_epoch(&self) -> Result { + let mut ret = self.inner.get_current_epoch().await; for _ in 0..Self::RETRIES { if ret.is_ok() { return ret; } - ret = self.inner.get_current_epoch_state().await; + ret = self.inner.get_current_epoch().await; } ret } @@ -86,6 +86,10 @@ impl DkgClient { self.inner.list_proposals().await } + pub(crate) async fn advance_epoch_state(&self) -> Result<(), CoconutError> { + self.inner.advance_epoch_state().await + } + pub(crate) async fn register_dealer( &self, bte_key: EncodedBTEPublicKeyWithProof, diff --git a/nym-api/src/coconut/dkg/controller.rs b/nym-api/src/coconut/dkg/controller.rs index c54074141d..bebb68f4d1 100644 --- a/nym-api/src/coconut/dkg/controller.rs +++ b/nym-api/src/coconut/dkg/controller.rs @@ -18,7 +18,7 @@ use dkg::bte::keys::KeyPair as DkgKeyPair; use rand::rngs::OsRng; use rand::RngCore; use std::path::PathBuf; -use std::time::Duration; +use std::time::{Duration, SystemTime}; use task::TaskClient; use tokio::time::interval; use validator_client::nymd::SigningNymdClient; @@ -83,16 +83,16 @@ impl DkgController { } pub(crate) async fn handle_epoch_state(&mut self) { - match self.dkg_client.get_current_epoch_state().await { + match self.dkg_client.get_current_epoch().await { Err(e) => warn!("Could not get current epoch state {}", e), - Ok(epoch_state) => { - if let Err(e) = self.state.is_consistent(epoch_state).await { + Ok(epoch) => { + if let Err(e) = self.state.is_consistent(epoch.state).await { error!( "Epoch state is corrupted - {}, the process should be terminated", e ); } - let ret = match epoch_state { + let ret = match epoch.state { EpochState::PublicKeySubmission => { public_key_submission(&self.dkg_client, &mut self.state).await } @@ -122,7 +122,7 @@ impl DkgController { }; if let Err(e) = ret { warn!("Could not handle this iteration for the epoch state: {}", e); - } else if epoch_state != EpochState::InProgress { + } else if epoch.state != EpochState::InProgress { let persistent_state = PersistentState::from(&self.state); if let Err(e) = persistent_state.save_to_file(self.state.persistent_state_path()) @@ -130,6 +130,15 @@ impl DkgController { warn!("Could not backup the state for this iteration: {}", e); } } + if let Ok(current_timestamp) = + SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) + { + if current_timestamp.as_secs() >= epoch.finish_timestamp.seconds() { + // We try advancing the epoch state, on a best-effort basis + info!("Trying to advance the epoch"); + self.dkg_client.advance_epoch_state().await.ok(); + } + } } } } diff --git a/nym-api/src/coconut/tests.rs b/nym-api/src/coconut/tests.rs index 3408dda0a3..d0165e1f1e 100644 --- a/nym-api/src/coconut/tests.rs +++ b/nym-api/src/coconut/tests.rs @@ -40,7 +40,7 @@ use coconut_dkg_common::dealer::{ ContractDealing, DealerDetails, DealerDetailsResponse, DealerType, }; use coconut_dkg_common::event_attributes::{DKG_PROPOSAL_ID, NODE_INDEX}; -use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, EpochState, TOTAL_DEALINGS}; +use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, Epoch, TOTAL_DEALINGS}; use coconut_dkg_common::verification_key::{ContractVKShare, VerificationKeyShare}; use contracts_common::dealings::ContractSafeBytes; use crypto::asymmetric::{encryption, identity}; @@ -66,7 +66,7 @@ pub(crate) struct DummyClient { proposal_db: Arc>>, spent_credential_db: Arc>>, - epoch_state: Arc>, + epoch: Arc>, dealer_details: Arc>>, threshold: Arc>>, dealings: Arc>>>, @@ -80,7 +80,7 @@ impl DummyClient { tx_db: Arc::new(RwLock::new(HashMap::new())), proposal_db: Arc::new(RwLock::new(HashMap::new())), spent_credential_db: Arc::new(RwLock::new(HashMap::new())), - epoch_state: Arc::new(RwLock::new(EpochState::default())), + epoch: Arc::new(RwLock::new(Epoch::default())), dealer_details: Arc::new(RwLock::new(HashMap::new())), threshold: Arc::new(RwLock::new(None)), dealings: Arc::new(RwLock::new(HashMap::new())), @@ -109,8 +109,8 @@ impl DummyClient { self } - pub fn _with_epoch_state(mut self, epoch_state: &Arc>) -> Self { - self.epoch_state = Arc::clone(epoch_state); + pub fn _with_epoch(mut self, epoch: &Arc>) -> Self { + self.epoch = Arc::clone(epoch); self } @@ -188,8 +188,8 @@ impl super::client::Client for DummyClient { }) } - async fn get_current_epoch_state(&self) -> Result { - Ok(*self.epoch_state.read().unwrap()) + async fn get_current_epoch(&self) -> Result { + Ok(*self.epoch.read().unwrap()) } async fn get_current_epoch_threshold(&self) -> Result> { @@ -273,6 +273,10 @@ impl super::client::Client for DummyClient { Ok(()) } + async fn advance_epoch_state(&self) -> Result<()> { + todo!() + } + async fn register_dealer( &self, bte_public_key_with_proof: EncodedBTEPublicKeyWithProof, diff --git a/nym-api/src/nymd_client.rs b/nym-api/src/nymd_client.rs index d14a793fd4..f7780b2871 100644 --- a/nym-api/src/nymd_client.rs +++ b/nym-api/src/nymd_client.rs @@ -30,7 +30,7 @@ use coconut_bandwidth_contract_common::spend_credential::SpendCredentialResponse #[cfg(feature = "coconut")] use coconut_dkg_common::dealer::{ContractDealing, DealerDetails, DealerDetailsResponse}; #[cfg(feature = "coconut")] -use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, EpochState}; +use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, Epoch}; #[cfg(feature = "coconut")] use coconut_dkg_common::verification_key::{ContractVKShare, VerificationKeyShare}; #[cfg(feature = "coconut")] @@ -329,8 +329,8 @@ where .await?) } - async fn get_current_epoch_state(&self) -> crate::coconut::error::Result { - Ok(self.0.read().await.nymd.get_current_epoch_state().await?) + async fn get_current_epoch(&self) -> crate::coconut::error::Result { + Ok(self.0.read().await.nymd.get_current_epoch().await?) } async fn get_current_epoch_threshold( @@ -405,6 +405,16 @@ where Ok(()) } + async fn advance_epoch_state(&self) -> crate::coconut::error::Result<()> { + self.0 + .write() + .await + .nymd + .advance_dkg_epoch_state(None) + .await?; + Ok(()) + } + async fn register_dealer( &self, bte_key: EncodedBTEPublicKeyWithProof, From da094f02087f97bc8b301a28805dd07f82583efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Fri, 16 Dec 2022 12:02:23 +0100 Subject: [PATCH 023/591] wallet: rewrite some abci errors on the fly (#2716) * wallet: rewrite some abci errors on the fly * changelog: update * Tidy --- .../validator-client/src/connection_tester.rs | 2 +- .../src/nymd/cosmwasm_client/client.rs | 10 +--- .../validator-client/src/nymd/error.rs | 55 ++++++++++++++++--- nym-wallet/CHANGELOG.md | 4 ++ nym-wallet/src-tauri/src/error.rs | 33 ++++++++++- 5 files changed, 85 insertions(+), 19 deletions(-) diff --git a/common/client-libs/validator-client/src/connection_tester.rs b/common/client-libs/validator-client/src/connection_tester.rs index dc1acb8cd9..30e57ff95e 100644 --- a/common/client-libs/validator-client/src/connection_tester.rs +++ b/common/client-libs/validator-client/src/connection_tester.rs @@ -108,7 +108,7 @@ async fn test_nymd_connection( log::debug!("Checking: nymd_url: {url}: {}: {}", "failed".red(), e); false } - Ok(Err(NymdError::AbciError(code, log))) => { + Ok(Err(NymdError::AbciError { code, log, .. })) => { // We accept the mixnet contract not found as ok from a connection standpoint. This happens // for example on a pre-launch network. log::debug!( diff --git a/common/client-libs/validator-client/src/nymd/cosmwasm_client/client.rs b/common/client-libs/validator-client/src/nymd/cosmwasm_client/client.rs index 8da9d3192c..580a8c7c05 100644 --- a/common/client-libs/validator-client/src/nymd/cosmwasm_client/client.rs +++ b/common/client-libs/validator-client/src/nymd/cosmwasm_client/client.rs @@ -1,6 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::nymd; use crate::nymd::coin::Coin; use crate::nymd::cosmwasm_client::helpers::{create_pagination, next_page_key}; use crate::nymd::cosmwasm_client::types::{ @@ -23,7 +24,6 @@ use cosmrs::rpc::endpoint::broadcast; use cosmrs::rpc::endpoint::tx::Response as TxResponse; use cosmrs::rpc::query::Query; use cosmrs::rpc::{self, HttpClient, Order}; -use cosmrs::tendermint::abci::Code as AbciCode; use cosmrs::tendermint::abci::Transaction; use cosmrs::tendermint::{abci, block, chain}; use cosmrs::{tx, AccountId, Coin as CosmosCoin, Tx}; @@ -66,13 +66,9 @@ pub trait CosmWasmClient: rpc::Client { req.encode(&mut buf)?; let res = self.abci_query(path, buf, None, false).await?; + let res_success = nymd::error::parse_abci_query_result(res)?; - match res.code { - AbciCode::Err(code) => return Err(NymdError::AbciError(code, res.log)), - AbciCode::Ok => (), - } - - Ok(Res::decode(res.value.as_ref())?) + Ok(Res::decode(res_success.value.as_ref())?) } async fn get_chain_id(&self) -> Result { diff --git a/common/client-libs/validator-client/src/nymd/error.rs b/common/client-libs/validator-client/src/nymd/error.rs index 0b6dcfe22b..e530f6c54d 100644 --- a/common/client-libs/validator-client/src/nymd/error.rs +++ b/common/client-libs/validator-client/src/nymd/error.rs @@ -2,16 +2,23 @@ // SPDX-License-Identifier: Apache-2.0 use crate::nymd::cosmwasm_client::types::ContractCodeId; -use cosmrs::tendermint::{abci, block}; -use cosmrs::{bip32, tx, AccountId}; -use std::io; -use std::time::Duration; +use cosmrs::{ + bip32, + rpc::endpoint::abci_query::AbciQuery, + tendermint::{ + abci::{self, Code as AbciCode}, + block, + }, + tx, AccountId, +}; use thiserror::Error; -pub use cosmrs::rpc::error::{ - Error as TendermintRpcError, ErrorDetail as TendermintRpcErrorDetail, +use std::{io, time::Duration}; + +pub use cosmrs::rpc::{ + error::{Error as TendermintRpcError, ErrorDetail as TendermintRpcErrorDetail}, + response_error::{Code, ResponseError}, }; -pub use cosmrs::rpc::response_error::{Code, ResponseError}; #[derive(Debug, Error)] pub enum NymdError { @@ -110,8 +117,12 @@ pub enum NymdError { #[error("Failed to estimate gas price for the transaction")] GasEstimationFailure, - #[error("Abci query failed with code {0} - {1}")] - AbciError(u32, abci::Log), + #[error("Abci query failed with code {code} - {log}")] + AbciError { + code: u32, + log: abci::Log, + pretty_log: Option, + }, #[error("Unsupported account type: {type_url}")] UnsupportedAccountType { type_url: String }, @@ -135,6 +146,32 @@ pub enum NymdError { UnexpectedBech32Prefix { got: String, expected: String }, } +// The purpose of parsing the abci query result is that we want to generate the `pretty_log` if +// possible. +pub fn parse_abci_query_result(query_result: AbciQuery) -> Result { + match query_result.code { + AbciCode::Ok => Ok(query_result), + AbciCode::Err(code) => Err(NymdError::AbciError { + code, + log: query_result.log.clone(), + pretty_log: try_parse_abci_log(&query_result.log), + }), + } +} + +// Some of the error strings returned by the query are a bit too technical to present to the +// enduser. So we special case some commonly encountered errors. +fn try_parse_abci_log(log: &abci::Log) -> Option { + if log + .value() + .contains("Maximum amount of locked coins has already been pledged") + { + Some("Maximum amount of locked tokens has alredy been used. You can only use up tp 10% of your locked tokens for bonding and delegating.".to_string()) + } else { + None + } +} + impl NymdError { pub fn is_tendermint_response_timeout(&self) -> bool { match &self { diff --git a/nym-wallet/CHANGELOG.md b/nym-wallet/CHANGELOG.md index d6ca3521d9..ef1fb52d15 100644 --- a/nym-wallet/CHANGELOG.md +++ b/nym-wallet/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## UNRELEASED + +- wallet: present some cases of the more technical errors (abci, ..) in a more human readable form. + ## [nym-wallet-v1.1.3](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.3) (2022-12-13) - wallet: improved unbond screen. diff --git a/nym-wallet/src-tauri/src/error.rs b/nym-wallet/src-tauri/src/error.rs index e5a8feeef5..7f5dfe0812 100644 --- a/nym-wallet/src-tauri/src/error.rs +++ b/nym-wallet/src-tauri/src/error.rs @@ -24,9 +24,10 @@ pub enum BackendError { #[from] source: tendermint_rpc::Error, }, - #[error("{source}")] + #[error("{pretty_error}")] NymdError { - #[from] + pretty_error: String, + #[source] source: NymdError, }, #[error("{source}")] @@ -131,6 +132,34 @@ impl Serialize for BackendError { } } +impl From for BackendError { + fn from(source: NymdError) -> Self { + match source { + NymdError::AbciError { + code: _, + log: _, + ref pretty_log, + } => { + if let Some(pretty_log) = pretty_log { + Self::NymdError { + pretty_error: pretty_log.to_string(), + source, + } + } else { + Self::NymdError { + pretty_error: source.to_string(), + source, + } + } + } + nymd_error => Self::NymdError { + pretty_error: nymd_error.to_string(), + source: nymd_error, + }, + } + } +} + impl From for BackendError { fn from(e: ValidatorClientError) -> Self { match e { From 052a9a71c2411cf114aa6fe27719eee0b465c89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Fri, 16 Dec 2022 17:03:39 +0100 Subject: [PATCH 024/591] client: tweak shutdown order (#2724) * clients: slightly tweak shutdown * tweak log --- .../retransmission_request_listener.rs | 2 +- common/task/src/manager.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs index 50a930b94e..d8fb2b0a8d 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs @@ -149,7 +149,7 @@ where break; } }, - _ = shutdown.recv_with_delay() => { + _ = shutdown.recv() => { log::trace!("RetransmissionRequestListener: Received shutdown"); } } diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index 82129e9478..f40a525527 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -158,7 +158,7 @@ impl TaskManager { } pub async fn wait_for_shutdown(&mut self) { - log::info!("Waiting for shutdown"); + log::debug!("Waiting for shutdown"); if let Some(notify_rx) = self.notify_rx.take() { drop(notify_rx); } @@ -269,7 +269,7 @@ impl TaskClient { pub async fn recv_with_delay(&mut self) { self.recv() .then(|msg| async move { - sleep(Duration::from_secs(1)).await; + sleep(Duration::from_secs(2)).await; msg }) .await From 6c4f0bc2f498e3f6fb9e11f16c98064cd62495a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 19 Dec 2022 09:12:33 +0100 Subject: [PATCH 025/591] validator-client: fix typo in error message --- common/client-libs/validator-client/src/nymd/error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/client-libs/validator-client/src/nymd/error.rs b/common/client-libs/validator-client/src/nymd/error.rs index e530f6c54d..1ebaa4e020 100644 --- a/common/client-libs/validator-client/src/nymd/error.rs +++ b/common/client-libs/validator-client/src/nymd/error.rs @@ -166,7 +166,7 @@ fn try_parse_abci_log(log: &abci::Log) -> Option { .value() .contains("Maximum amount of locked coins has already been pledged") { - Some("Maximum amount of locked tokens has alredy been used. You can only use up tp 10% of your locked tokens for bonding and delegating.".to_string()) + Some("Maximum amount of locked tokens has alredy been used. You can only use up to 10% of your locked tokens for bonding and delegating.".to_string()) } else { None } From 7c12a3422cb6ad0d2fcca2f046c89f81f62ae640 Mon Sep 17 00:00:00 2001 From: Fouad Date: Mon, 19 Dec 2022 11:22:51 +0000 Subject: [PATCH 026/591] Feature/node settings apy playground (#1677) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * initial ui for test my node use svg for node path add stories for test my node * add initial rewards calculation * update validation for rewards playground * init playground with default values * get node uptime * get mixnode reward estimation * calculate saturation calculate stake saturation * Make ComputeRewardEstParam derive Debug * set active set to be always true Co-authored-by: Jon Häggblad --- .../validator-client/src/nym_api/mod.rs | 28 +++- .../validator-client/src/nym_api/routes.rs | 1 + nym-api/nym-api-requests/src/models.rs | 2 +- nym-wallet/src-tauri/src/main.rs | 3 + .../src-tauri/src/operations/mixnet/bond.rs | 15 ++ .../src/operations/mixnet/rewards.rs | 16 +- .../src/operations/nym_api/status.rs | 31 +++- nym-wallet/src/components/AppBar.tsx | 2 +- .../InclusionProbability.tsx | 19 +++ .../components/RewardsPlayground/Inputs.tsx | 91 ++++++++++++ .../RewardsPlayground/NodeDetail.tsx | 32 ++++ .../RewardsPlayground/ResultsTable.tsx | 75 ++++++++++ .../inputsValidationSchema.ts | 41 ++++++ nym-wallet/src/context/bonding.tsx | 15 +- nym-wallet/src/context/mocks/bonding.tsx | 4 +- .../bonding/node-settings/NodeSettings.tsx | 4 +- .../node-settings/apy-playground/index.tsx | 139 ++++++++++++++++++ .../node-settings/apy-playground/utils.tsx | 66 +++++++++ .../node-settings/node-settings.constant.tsx | 2 +- nym-wallet/src/requests/queries.ts | 15 ++ nym-wallet/src/requests/rewards.ts | 5 +- nym-wallet/src/types/rust/AppEnv.ts | 7 +- nym-wallet/src/types/rust/Network.ts | 3 +- nym-wallet/src/types/rust/StateParams.ts | 8 +- nym-wallet/src/types/rust/ValidatorUrl.ts | 6 +- nym-wallet/src/types/rust/ValidatorUrls.ts | 6 +- ts-packages/mui-theme/src/theme/theme.ts | 1 + ts-packages/types/src/types/rust/Account.ts | 1 + .../types/src/types/rust/AccountEntry.ts | 2 + .../src/types/rust/AccountWithMnemonic.ts | 1 + ts-packages/types/src/types/rust/Balance.ts | 1 + ts-packages/types/src/types/rust/Coin.ts | 2 + ts-packages/types/src/types/rust/CosmosFee.ts | 1 + .../types/src/types/rust/CurrencyDenom.ts | 2 + ts-packages/types/src/types/rust/DecCoin.ts | 1 + .../types/src/types/rust/Delegation.ts | 1 + .../types/src/types/rust/DelegationEvent.ts | 1 + .../src/types/rust/DelegationEventKind.ts | 2 + .../types/src/types/rust/DelegationResult.ts | 1 + .../types/rust/DelegationSummaryResponse.ts | 1 + .../types/rust/DelegationWithEverything.ts | 1 + ts-packages/types/src/types/rust/Fee.ts | 1 + .../types/src/types/rust/FeeDetails.ts | 1 + ts-packages/types/src/types/rust/Gas.ts | 2 + ts-packages/types/src/types/rust/GasInfo.ts | 1 + ts-packages/types/src/types/rust/Gateway.ts | 2 + .../types/src/types/rust/GatewayBond.ts | 1 + .../rust/InclusionProbabilityResponse.ts | 1 + ts-packages/types/src/types/rust/Interval.ts | 2 +- .../types/src/types/rust/MixNodeBond.ts | 1 + ts-packages/types/src/types/rust/Mixnode.ts | 2 + .../types/src/types/rust/MixnodeStatus.ts | 2 + .../src/types/rust/MixnodeStatusResponse.ts | 1 + .../src/types/rust/OriginalVestingResponse.ts | 1 + ts-packages/types/src/types/rust/Period.ts | 2 + .../types/src/types/rust/PledgeData.ts | 1 + .../src/types/rust/RewardedSetNodeStatus.ts | 2 + .../src/types/rust/RpcTransactionResponse.ts | 1 + .../types/src/types/rust/SendTxResult.ts | 1 + .../src/types/rust/StakeSaturationResponse.ts | 2 + .../src/types/rust/TransactionDetails.ts | 1 + .../types/rust/TransactionExecuteResult.ts | 1 + .../src/types/rust/VestingAccountInfo.ts | 1 + .../types/src/types/rust/VestingPeriod.ts | 2 + ts-packages/types/src/utils/decimal/index.ts | 3 + 65 files changed, 661 insertions(+), 29 deletions(-) create mode 100644 nym-wallet/src/components/RewardsPlayground/InclusionProbability.tsx create mode 100644 nym-wallet/src/components/RewardsPlayground/Inputs.tsx create mode 100644 nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx create mode 100644 nym-wallet/src/components/RewardsPlayground/ResultsTable.tsx create mode 100644 nym-wallet/src/components/RewardsPlayground/inputsValidationSchema.ts create mode 100644 nym-wallet/src/pages/bonding/node-settings/apy-playground/index.tsx create mode 100644 nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx diff --git a/common/client-libs/validator-client/src/nym_api/mod.rs b/common/client-libs/validator-client/src/nym_api/mod.rs index 00fd839d4e..e1d65959c6 100644 --- a/common/client-libs/validator-client/src/nym_api/mod.rs +++ b/common/client-libs/validator-client/src/nym_api/mod.rs @@ -9,10 +9,11 @@ use nym_api_requests::coconut::{ BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, }; use nym_api_requests::models::{ - GatewayCoreStatusResponse, GatewayStatusReportResponse, GatewayUptimeHistoryResponse, - InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, - MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, RequestError, - RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, + ComputeRewardEstParam, GatewayCoreStatusResponse, GatewayStatusReportResponse, + GatewayUptimeHistoryResponse, InclusionProbabilityResponse, MixNodeBondAnnotated, + MixnodeCoreStatusResponse, MixnodeStatusReportResponse, MixnodeStatusResponse, + MixnodeUptimeHistoryResponse, RequestError, RewardEstimationResponse, StakeSaturationResponse, + UptimeResponse, }; use reqwest::Response; use serde::{Deserialize, Serialize}; @@ -361,6 +362,25 @@ impl Client { .await } + pub async fn compute_mixnode_reward_estimation( + &self, + mix_id: MixId, + request_body: &ComputeRewardEstParam, + ) -> Result { + self.post_nym_api( + &[ + routes::API_VERSION, + routes::STATUS_ROUTES, + routes::MIXNODE, + &mix_id.to_string(), + routes::COMPUTE_REWARD_ESTIMATION, + ], + NO_PARAMS, + request_body, + ) + .await + } + pub async fn get_mixnode_stake_saturation( &self, mix_id: MixId, diff --git a/common/client-libs/validator-client/src/nym_api/routes.rs b/common/client-libs/validator-client/src/nym_api/routes.rs index 5b3d1c266d..cd8a16047a 100644 --- a/common/client-libs/validator-client/src/nym_api/routes.rs +++ b/common/client-libs/validator-client/src/nym_api/routes.rs @@ -28,6 +28,7 @@ pub const STATUS: &str = "status"; pub const REPORT: &str = "report"; pub const HISTORY: &str = "history"; pub const REWARD_ESTIMATION: &str = "reward-estimation"; +pub const COMPUTE_REWARD_ESTIMATION: &str = "compute-reward-estimation"; pub const AVG_UPTIME: &str = "avg_uptime"; pub const STAKE_SATURATION: &str = "stake-saturation"; pub const INCLUSION_CHANCE: &str = "inclusion-probability"; diff --git a/nym-api/nym-api-requests/src/models.rs b/nym-api/nym-api-requests/src/models.rs index eee713a701..df5fe07768 100644 --- a/nym-api/nym-api-requests/src/models.rs +++ b/nym-api/nym-api-requests/src/models.rs @@ -114,7 +114,7 @@ impl MixNodeBondAnnotated { } } -#[derive(Deserialize, JsonSchema)] +#[derive(Debug, Serialize, Deserialize, JsonSchema)] pub struct ComputeRewardEstParam { pub performance: Option, pub active_in_rewarded_set: Option, diff --git a/nym-wallet/src-tauri/src/main.rs b/nym-wallet/src-tauri/src/main.rs index 63e2a43e4f..8705891c0a 100644 --- a/nym-wallet/src-tauri/src/main.rs +++ b/nym-wallet/src-tauri/src/main.rs @@ -83,7 +83,9 @@ fn main() { mixnet::rewards::claim_delegator_reward, mixnet::rewards::claim_operator_reward, mixnet::rewards::claim_locked_and_unlocked_delegator_reward, + mixnet::rewards::get_current_rewarding_parameters, mixnet::send::send, + mixnet::bond::get_mixnode_uptime, network_config::add_validator, network_config::get_nym_api_urls, network_config::get_validator_nymd_urls, @@ -99,6 +101,7 @@ fn main() { utils::get_old_and_incorrect_hardcoded_fee, utils::try_convert_pubkey_to_mix_id, utils::default_mixnode_cost_params, + nym_api::status::compute_mixnode_reward_estimation, nym_api::status::gateway_core_node_status, nym_api::status::mixnode_core_node_status, nym_api::status::mixnode_inclusion_probability, diff --git a/nym-wallet/src-tauri/src/operations/mixnet/bond.rs b/nym-wallet/src-tauri/src/operations/mixnet/bond.rs index 5807fb7270..1ccdc243ae 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/bond.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/bond.rs @@ -341,3 +341,18 @@ pub async fn get_mix_node_description( .json() .await?) } + +#[tauri::command] +pub async fn get_mixnode_uptime( + mix_id: MixId, + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Get mixnode uptime"); + + let guard = state.read().await; + let client = guard.current_client()?; + let uptime = client.nym_api.get_mixnode_avg_uptime(mix_id).await?; + + log::info!(">>> Uptime response: {}", uptime.avg_uptime); + Ok(uptime.avg_uptime) +} diff --git a/nym-wallet/src-tauri/src/operations/mixnet/rewards.rs b/nym-wallet/src-tauri/src/operations/mixnet/rewards.rs index 6fb8893ee9..b4a048eeea 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/rewards.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/rewards.rs @@ -1,7 +1,7 @@ use crate::error::BackendError; use crate::state::WalletState; use crate::vesting::rewards::vesting_claim_delegator_reward; -use mixnet_contract_common::MixId; +use mixnet_contract_common::{MixId, RewardingParams}; use nym_types::transaction::TransactionExecuteResult; use validator_client::nymd::traits::{MixnetQueryClient, MixnetSigningClient}; use validator_client::nymd::Fee; @@ -95,3 +95,17 @@ pub async fn claim_locked_and_unlocked_delegator_reward( log::trace!("<<< {:?}", res); Ok(res) } + +#[tauri::command] +pub async fn get_current_rewarding_parameters( + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Get current rewarding params",); + + let guard = state.read().await; + let client = guard.current_client()?; + + let reward_params = client.nymd.get_rewarding_parameters().await?; + + Ok(reward_params) +} diff --git a/nym-wallet/src-tauri/src/operations/nym_api/status.rs b/nym-wallet/src-tauri/src/operations/nym_api/status.rs index 16c83cfb67..873a1fa0a4 100644 --- a/nym-wallet/src-tauri/src/operations/nym_api/status.rs +++ b/nym-wallet/src-tauri/src/operations/nym_api/status.rs @@ -4,11 +4,11 @@ use crate::api_client; use crate::error::BackendError; use crate::state::WalletState; -use mixnet_contract_common::{IdentityKeyRef, MixId}; +use mixnet_contract_common::{reward_params::Performance, Coin, IdentityKeyRef, MixId, Percent}; use validator_client::models::{ - GatewayCoreStatusResponse, GatewayStatusReportResponse, InclusionProbabilityResponse, - MixnodeCoreStatusResponse, MixnodeStatusResponse, RewardEstimationResponse, - StakeSaturationResponse, + ComputeRewardEstParam, GatewayCoreStatusResponse, GatewayStatusReportResponse, + InclusionProbabilityResponse, MixnodeCoreStatusResponse, MixnodeStatusResponse, + RewardEstimationResponse, StakeSaturationResponse, }; #[tauri::command] @@ -59,6 +59,29 @@ pub async fn mixnode_reward_estimation( .await?) } +#[tauri::command] +pub async fn compute_mixnode_reward_estimation( + mix_id: u32, + performance: Option, + pledge_amount: Option, + total_delegation: Option, + interval_operating_cost: Option, + profit_margin_percent: Option, + state: tauri::State<'_, WalletState>, +) -> Result { + let request_body = ComputeRewardEstParam { + performance, + active_in_rewarded_set: Some(true), + pledge_amount, + total_delegation, + interval_operating_cost, + profit_margin_percent, + }; + Ok(api_client!(state) + .compute_mixnode_reward_estimation(mix_id, &request_body) + .await?) +} + #[tauri::command] pub async fn mixnode_stake_saturation( mix_id: MixId, diff --git a/nym-wallet/src/components/AppBar.tsx b/nym-wallet/src/components/AppBar.tsx index 24b2f93942..3022646798 100644 --- a/nym-wallet/src/components/AppBar.tsx +++ b/nym-wallet/src/components/AppBar.tsx @@ -15,7 +15,7 @@ export const AppBar = () => { const navigate = useNavigate(); return ( - + diff --git a/nym-wallet/src/components/RewardsPlayground/InclusionProbability.tsx b/nym-wallet/src/components/RewardsPlayground/InclusionProbability.tsx new file mode 100644 index 0000000000..d60f7886c7 --- /dev/null +++ b/nym-wallet/src/components/RewardsPlayground/InclusionProbability.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { Typography } from '@mui/material'; +import { SelectionChance } from '@nymproject/types'; + +const colorMap: { [key in SelectionChance]: string } = { + Low: 'error.main', + Good: 'warning.main', + High: 'success.main', +}; + +const textMap: { [key in SelectionChance]: string } = { + Low: 'Low', + Good: 'Good', + High: 'High', +}; + +export const InclusionProbability = ({ probability }: { probability: SelectionChance }) => ( + {textMap[probability]} +); diff --git a/nym-wallet/src/components/RewardsPlayground/Inputs.tsx b/nym-wallet/src/components/RewardsPlayground/Inputs.tsx new file mode 100644 index 0000000000..1f1dbac935 --- /dev/null +++ b/nym-wallet/src/components/RewardsPlayground/Inputs.tsx @@ -0,0 +1,91 @@ +import React, { useCallback } from 'react'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Button, Grid, TextField, Typography } from '@mui/material'; +import { useForm } from 'react-hook-form'; +import { DefaultInputValues } from 'src/pages/bonding/node-settings/apy-playground'; +import { inputValidationSchema } from './inputsValidationSchema'; + +export type InputFields = { + label: string; + name: 'profitMargin' | 'uptime' | 'bond' | 'delegations' | 'operatorCost' | 'uptime'; + isPercentage?: boolean; +}[]; + +export type CalculateArgs = { + bond: string; + delegations: string; + uptime: string; + profitMargin: string; + operatorCost: string; +}; + +const inputFields: InputFields = [ + { label: 'Profit margin', name: 'profitMargin', isPercentage: true }, + { label: 'Operator cost', name: 'operatorCost' }, + { label: 'Bond', name: 'bond' }, + { label: 'Delegations', name: 'delegations' }, + { label: 'Uptime', name: 'uptime', isPercentage: true }, +]; + +export const Inputs = ({ + onCalculate, + defaultValues, +}: { + onCalculate: (args: CalculateArgs) => Promise; + defaultValues: DefaultInputValues; +}) => { + const handleCalculate = useCallback( + async (args: CalculateArgs) => { + onCalculate({ + bond: args.bond, + delegations: args.delegations, + uptime: args.uptime, + profitMargin: args.profitMargin, + operatorCost: args.operatorCost, + }); + }, + [onCalculate], + ); + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(inputValidationSchema), + defaultValues, + }); + + return ( + + {inputFields.map((field) => ( + + {field.isPercentage ? '%' : 'NYM'}, + }} + InputLabelProps={{ shrink: true }} + /> + + ))}{' '} + + + + + ); +}; diff --git a/nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx b/nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx new file mode 100644 index 0000000000..fb8a239be0 --- /dev/null +++ b/nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { Card, CardContent, Divider, Stack, Typography } from '@mui/material'; +import { SelectionChance } from '@nymproject/types'; +import { InclusionProbability } from './InclusionProbability'; + +const computeSelectionProbability = (saturation: number): SelectionChance => { + if (saturation < 5) return 'Low'; + + if (saturation > 5 && saturation < 15) return 'Good'; + + return 'High'; +}; + +export const NodeDetails = ({ saturation }: { saturation?: string }) => { + if (!saturation) return null; + + return ( + + + + Stake saturation + {saturation || '- '}% + + + + Selection probability + + + + + ); +}; diff --git a/nym-wallet/src/components/RewardsPlayground/ResultsTable.tsx b/nym-wallet/src/components/RewardsPlayground/ResultsTable.tsx new file mode 100644 index 0000000000..19196c176d --- /dev/null +++ b/nym-wallet/src/components/RewardsPlayground/ResultsTable.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { + Card, + CardContent, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, +} from '@mui/material'; + +export type Results = { + operator: { + daily: string; + monthly: string; + yearly: string; + }; + delegator: { + daily: string; + monthly: string; + yearly: string; + }; + total: { + daily: string; + monthly: string; + yearly: string; + }; +}; + +const tableHeader = [ + { title: 'Estimated rewards', bold: true }, + { title: 'Per day' }, + { title: 'Per month' }, + { title: 'Per year' }, +]; + +export const ResultsTable = ({ results }: { results: Results }) => { + const tableRows = [ + { title: 'Total node reward', ...results.total }, + { title: 'Operator rewards', ...results.operator }, + { title: 'Delegator rewards', ...results.delegator }, + ]; + + return ( + + + + + + + {tableHeader.map((header) => ( + + {header.title} + + ))} + + + + {tableRows.map((row) => ( + + {row.title} + {row.daily} + {row.monthly} + {row.yearly} + + ))} + +
+
+
+
+ ); +}; diff --git a/nym-wallet/src/components/RewardsPlayground/inputsValidationSchema.ts b/nym-wallet/src/components/RewardsPlayground/inputsValidationSchema.ts new file mode 100644 index 0000000000..ef5d9ecc0d --- /dev/null +++ b/nym-wallet/src/components/RewardsPlayground/inputsValidationSchema.ts @@ -0,0 +1,41 @@ +import * as Yup from 'yup'; +import { isGreaterThan, isLessThan } from 'src/utils'; + +export const inputValidationSchema = Yup.object().shape({ + profitMargin: Yup.string() + .required('profit margin is a required field') + .test('Is valid profit margin value', (value, ctx) => { + const stringValueToNumber = Math.round(Number(value)); + + if (isGreaterThan(stringValueToNumber, -1) && isLessThan(stringValueToNumber, 101)) return true; + return ctx.createError({ message: 'Profit margin must be a number from 0 and 100' }); + }), + uptime: Yup.string() + .required() + .test('Is valid uptime value', (value, ctx) => { + const stringValueToNumber = Math.round(Number(value)); + if (stringValueToNumber && isGreaterThan(stringValueToNumber, 0) && isLessThan(stringValueToNumber, 101)) + return true; + return ctx.createError({ message: 'Uptime must be a number between 0 and 100' }); + }), + bond: Yup.string() + .required() + .test('Is valid bond value', (value, ctx) => { + if (Number(value)) return true; + return ctx.createError({ message: 'Bond must be a valid number' }); + }), + delegations: Yup.string() + .required() + .test('Is valid delegation value', (value, ctx) => { + if (Number(value)) return true; + return ctx.createError({ message: 'Delegations must be a valid number' }); + }), + operatorCost: Yup.string() + .required('operator cost is a required field') + .test('Is valid operator cost value', (value, ctx) => { + const stringValueToNumber = Math.round(Number(value)); + + if (isGreaterThan(stringValueToNumber, -1) && isLessThan(stringValueToNumber, 101)) return true; + return ctx.createError({ message: 'Operator cost must be a valid number' }); + }), +}); diff --git a/nym-wallet/src/context/bonding.tsx b/nym-wallet/src/context/bonding.tsx index 7225360456..94bf5271ca 100644 --- a/nym-wallet/src/context/bonding.tsx +++ b/nym-wallet/src/context/bonding.tsx @@ -24,7 +24,6 @@ import { vestingBondMixNode, vestingUnbondGateway, vestingUnbondMixnode, - getPendingEpochEvents, updateMixnodeCostParams as updateMixnodeCostParamsRequest, vestingUpdateMixnodeCostParams as updateMixnodeVestingCostParamsRequest, getNodeDescription as getNodeDescriptionRequest, @@ -36,6 +35,7 @@ import { getMixnodeAvgUptime, getMixnodeRewardEstimation, getGatewayReport, + getMixnodeUptime, } from '../requests'; import { useCheckOwnership } from '../hooks/useCheckOwnership'; import { AppContext } from './main'; @@ -71,10 +71,12 @@ export type TBondedMixnode = { verlocPort: number; version: string; isUnbonding: boolean; + uptime: number; }; export interface TBondedGateway { - name: string; + name?: string; + id: number; identityKey: string; ip: string; bond: DecCoin; @@ -154,14 +156,18 @@ export const BondingContextProvider = ({ children }: { children?: React.ReactNod status: MixnodeStatus; stakeSaturation: string; estimatedRewards?: DecCoin; + uptime: number; } = { status: 'not_found', stakeSaturation: '0', + uptime: 0, }; try { const statusResponse = await getMixnodeStatus(mixId); + const uptime = await getMixnodeUptime(mixId); additionalDetails.status = statusResponse.status; + additionalDetails.uptime = uptime; } catch (e) { Console.log('getMixnodeStatus fails', e); } @@ -259,7 +265,8 @@ export const BondingContextProvider = ({ children }: { children?: React.ReactNod rewarding_details, bond_information: { mix_id }, } = data; - const { status, stakeSaturation, estimatedRewards } = await getAdditionalMixnodeDetails(mix_id); + + const { status, stakeSaturation, estimatedRewards, uptime } = await getAdditionalMixnodeDetails(mix_id); const setProbabilities = await getSetProbabilities(mix_id); const nodeDescription = await getNodeDescription( bond_information.mix_node.host, @@ -267,6 +274,7 @@ export const BondingContextProvider = ({ children }: { children?: React.ReactNod ); const routingScore = await getAvgUptime(); setBondedNode({ + id: data.bond_information.mix_id, name: nodeDescription?.name, mixId: mix_id, identityKey: bond_information.mix_node.identity_key, @@ -279,6 +287,7 @@ export const BondingContextProvider = ({ children }: { children?: React.ReactNod delegators: rewarding_details.unique_delegations, proxy: bond_information.proxy, operatorRewards, + uptime, status, stakeSaturation, operatorCost: decCoinToDisplay(rewarding_details.cost_params.interval_operating_cost), diff --git a/nym-wallet/src/context/mocks/bonding.tsx b/nym-wallet/src/context/mocks/bonding.tsx index 95e770850b..f38168ee28 100644 --- a/nym-wallet/src/context/mocks/bonding.tsx +++ b/nym-wallet/src/context/mocks/bonding.tsx @@ -7,8 +7,8 @@ import { mockSleep } from './utils'; const SLEEP_MS = 1000; const bondedMixnodeMock: TBondedMixnode = { - name: 'Monster node', mixId: 1, + name: 'Monster node', identityKey: '7mjM2fYbtN6kxMwp1TrmQ4VwPks3URR5pBgWPWhzT98F', stake: { denom: 'nym', amount: '1234' }, bond: { denom: 'nym', amount: '1234' }, @@ -28,9 +28,11 @@ const bondedMixnodeMock: TBondedMixnode = { verlocPort: 1790, version: '1.0.2', isUnbonding: false, + uptime: 1, }; const bondedGatewayMock: TBondedGateway = { + id: 1, name: 'Monster node', identityKey: 'WayM2fYbtN6kxMwp1TrmQ4VwPks3URR5pBgWPWhzT98F', ip: '112.43.234.57', diff --git a/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx b/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx index da50bc2d2d..798993dc49 100644 --- a/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx @@ -10,13 +10,14 @@ import { LoadingModal } from 'src/components/Modals/LoadingModal'; import { NymCard } from 'src/components'; import { PageLayout } from 'src/layouts'; import { Tabs } from 'src/components/Tabs'; -import { useBondingContext, BondingContextProvider } from 'src/context'; +import { useBondingContext, BondingContextProvider, TBondedMixnode } from 'src/context'; import { AppContext, urls } from 'src/context/main'; import { NodeGeneralSettings } from './settings-pages/general-settings'; import { NodeUnbondPage } from './settings-pages/NodeUnbondPage'; import { createNavItems } from './node-settings.constant'; import { isMixnode } from 'src/types'; +import { ApyPlayground } from './apy-playground'; export const NodeSettings = () => { const theme = useTheme(); @@ -123,6 +124,7 @@ export const NodeSettings = () => { {value === 'Unbond' && bondedNode && ( )} + {value === 'Playground' && bondedNode && } {confirmationDetails && confirmationDetails.status === 'success' && ( { + const { enqueueSnackbar } = useSnackbar(); + + const [results, setResults] = useState({ + total: { daily: '-', monthly: '-', yearly: '-' }, + operator: { daily: '-', monthly: '-', yearly: '-' }, + delegator: { daily: '-', monthly: '-', yearly: '-' }, + }); + + const [defaultInputValues, setDefaultInputValues] = useState(); + const [stakeSaturation, setStakeSaturation] = useState(); + const [isLoading, setIsLoading] = useState(true); + + const initialise = async (node: TBondedMixnode) => { + try { + const delegations = await getDelegationSummary(); + + const { estimation } = await computeEstimate({ + mixId: node.mixId, + uptime: node.uptime.toString(), + profitMargin: node.profitMargin, + operatorCost: node.operatorCost.amount, + totalDelegation: delegations.total_delegations.amount, + pledgeAmount: node.bond.amount, + }); + + setResults( + handleCalculatePeriodRewards({ + estimatedOperatorReward: estimation.operator, + estimatedDelegatorsReward: estimation.delegates, + }), + ); + + setStakeSaturation(node.stakeSaturation); + + setDefaultInputValues({ + profitMargin: node.profitMargin, + uptime: (node.uptime || 0).toString(), + bond: node.bond.amount || '', + delegations: delegations.total_delegations.amount, + operatorCost: node.operatorCost.amount, + }); + setIsLoading(false); + } catch (e) { + enqueueSnackbar(e as string, { variant: 'error' }); + } + }; + + useEffect(() => { + if (bondedNode) { + initialise(bondedNode); + } + }, []); + + if (isLoading) return ; + + const handleCalculateEstimate = async ({ bond, delegations, uptime, profitMargin, operatorCost }: CalculateArgs) => { + try { + const { estimation, reward_params } = await computeEstimate({ + mixId: bondedNode.mixId, + uptime: uptime, + profitMargin: profitMargin, + operatorCost: operatorCost, + totalDelegation: delegations, + pledgeAmount: bond, + }); + + const estimationResult = handleCalculatePeriodRewards({ + estimatedOperatorReward: estimation.operator, + estimatedDelegatorsReward: estimation.delegates, + }); + + const computedStakeSaturation = computeStakeSaturation( + bond, + delegations, + reward_params.interval.stake_saturation_point, + ); + + setStakeSaturation(computedStakeSaturation); + setResults(estimationResult); + } catch (e) { + console.log(e); + } + }; + + return ( + + + Playground + + + This is your parameters playground - change the parameters below to see the node specific estimations in the + table + + {defaultInputValues && ( + + + Estimation calculator + + } + /> + + + + + )} + + + + + + + + + + ); +}; diff --git a/nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx b/nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx new file mode 100644 index 0000000000..bc99898b45 --- /dev/null +++ b/nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx @@ -0,0 +1,66 @@ +import { decimalToPercentage, percentToDecimal } from '@nymproject/types'; +import { computeMixnodeRewardEstimation } from 'src/requests'; + +const SCALE_FACTOR = 1_000_000; + +export const computeStakeSaturation = (bond: string, delegations: string, stakeSaturationPoint: string) => { + const res = ((+bond + +delegations) * SCALE_FACTOR) / +stakeSaturationPoint; + return decimalToPercentage(res.toFixed(18).toString()); +}; + +export const computeEstimate = async ({ + mixId, + uptime, + pledgeAmount, + totalDelegation, + profitMargin, + operatorCost, +}: { + mixId: number; + uptime: string; + pledgeAmount: string; + totalDelegation: string; + profitMargin: string; + operatorCost: string; +}) => { + const computedEstimate = await computeMixnodeRewardEstimation({ + mixId: mixId, + performance: percentToDecimal(uptime), + pledgeAmount: Math.round(+pledgeAmount * SCALE_FACTOR), + totalDelegation: Math.round(+totalDelegation * SCALE_FACTOR), + profitMarginPercent: percentToDecimal(profitMargin), + intervalOperatingCost: { denom: 'unym', amount: Math.round(+operatorCost * SCALE_FACTOR).toString() }, + }); + + return computedEstimate; +}; + +export const handleCalculatePeriodRewards = ({ + estimatedOperatorReward, + estimatedDelegatorsReward, +}: { + estimatedOperatorReward: string; + estimatedDelegatorsReward: string; +}) => { + const dailyOperatorReward = (+estimatedOperatorReward / SCALE_FACTOR) * 24; // epoch_reward * 1 epoch_per_hour * 24 hours + const dailyDelegatorReward = (+estimatedDelegatorsReward / SCALE_FACTOR) * 24; + const dailyTotal = dailyOperatorReward + dailyDelegatorReward; + + return { + total: { + daily: dailyTotal.toFixed(3).toString(), + monthly: (dailyTotal * 30).toFixed(3).toString(), + yearly: (dailyTotal * 365).toFixed(3).toString(), + }, + operator: { + daily: dailyOperatorReward.toFixed(3).toString(), + monthly: (dailyOperatorReward * 30).toFixed(3).toString(), + yearly: (dailyOperatorReward * 365).toFixed(3).toString(), + }, + delegator: { + daily: dailyDelegatorReward.toFixed(3).toString(), + monthly: (dailyDelegatorReward * 30).toFixed(3).toString(), + yearly: (dailyDelegatorReward * 365).toFixed(3).toString(), + }, + }; +}; diff --git a/nym-wallet/src/pages/bonding/node-settings/node-settings.constant.tsx b/nym-wallet/src/pages/bonding/node-settings/node-settings.constant.tsx index f00409a182..0e8b6204fd 100644 --- a/nym-wallet/src/pages/bonding/node-settings/node-settings.constant.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/node-settings.constant.tsx @@ -1,5 +1,5 @@ export const createNavItems = (isMixnode: boolean) => { const navItems = ['Unbond']; - if (isMixnode) return ['General', ...navItems]; + if (isMixnode) return ['General', 'Playground', ...navItems]; return navItems; }; diff --git a/nym-wallet/src/requests/queries.ts b/nym-wallet/src/requests/queries.ts index 5fba51beec..640fc79abb 100644 --- a/nym-wallet/src/requests/queries.ts +++ b/nym-wallet/src/requests/queries.ts @@ -8,6 +8,7 @@ import { RewardEstimationResponse, WrappedDelegationEvent, PendingIntervalEvent, + Coin, } from '@nymproject/types'; import { Interval, TGatewayReport, TNodeDescription } from 'src/types'; import { invokeWrapper } from './wrapper'; @@ -51,3 +52,17 @@ export const getPendingIntervalEvents = async () => export const getGatewayReport = async (identity: string) => invokeWrapper('gateway_report', { identity }); + +export const computeMixnodeRewardEstimation = async (args: { + mixId: number; + performance: string; + pledgeAmount: number; + totalDelegation: number; + profitMarginPercent: string; + intervalOperatingCost: { denom: 'unym'; amount: string }; +}) => { + console.log(args); + + return invokeWrapper('compute_mixnode_reward_estimation', args); +}; +export const getMixnodeUptime = async (mixId: number) => invokeWrapper('get_mixnode_uptime', { mixId }); diff --git a/nym-wallet/src/requests/rewards.ts b/nym-wallet/src/requests/rewards.ts index 5c8c63e34e..36b90838e7 100644 --- a/nym-wallet/src/requests/rewards.ts +++ b/nym-wallet/src/requests/rewards.ts @@ -1,4 +1,4 @@ -import { Fee, FeeDetails, TransactionExecuteResult } from '@nymproject/types'; +import { Fee, FeeDetails, RewardingParams, TransactionExecuteResult } from '@nymproject/types'; import { invokeWrapper } from './wrapper'; export const claimOperatorReward = async (fee?: Fee) => @@ -9,3 +9,6 @@ export const claimDelegatorRewards = async (mixId: number, fee?: FeeDetails) => mixId, fee: fee?.fee, }); + +export const getCurrentRewardingParameter = async () => + invokeWrapper('get_current_rewarding_parameters', {}); diff --git a/nym-wallet/src/types/rust/AppEnv.ts b/nym-wallet/src/types/rust/AppEnv.ts index 3f47419469..861ecd9ef5 100644 --- a/nym-wallet/src/types/rust/AppEnv.ts +++ b/nym-wallet/src/types/rust/AppEnv.ts @@ -1,2 +1,5 @@ - -export interface AppEnv { ADMIN_ADDRESS: string | null, SHOW_TERMINAL: string | null, ENABLE_QA_MODE: string | null, } \ No newline at end of file +export interface AppEnv { + ADMIN_ADDRESS: string | null; + SHOW_TERMINAL: string | null; + ENABLE_QA_MODE: string | null; +} diff --git a/nym-wallet/src/types/rust/Network.ts b/nym-wallet/src/types/rust/Network.ts index fd31bccafa..f8615cd992 100644 --- a/nym-wallet/src/types/rust/Network.ts +++ b/nym-wallet/src/types/rust/Network.ts @@ -1,2 +1 @@ - -export type Network = "QA" | "SANDBOX" | "MAINNET"; \ No newline at end of file +export type Network = 'QA' | 'SANDBOX' | 'MAINNET'; diff --git a/nym-wallet/src/types/rust/StateParams.ts b/nym-wallet/src/types/rust/StateParams.ts index 85c362a3b2..c9420f50dc 100644 --- a/nym-wallet/src/types/rust/StateParams.ts +++ b/nym-wallet/src/types/rust/StateParams.ts @@ -1,3 +1,7 @@ -import type { DecCoin } from "../../../../ts-packages/types/src/types/rust/DecCoin"; +import type { DecCoin } from '../../../../ts-packages/types/src/types/rust/DecCoin'; -export interface TauriContractStateParams { minimum_mixnode_pledge: DecCoin, minimum_gateway_pledge: DecCoin, minimum_mixnode_delegation: DecCoin | null, } \ No newline at end of file +export interface TauriContractStateParams { + minimum_mixnode_pledge: DecCoin; + minimum_gateway_pledge: DecCoin; + minimum_mixnode_delegation: DecCoin | null; +} diff --git a/nym-wallet/src/types/rust/ValidatorUrl.ts b/nym-wallet/src/types/rust/ValidatorUrl.ts index 9c74679bac..801e045a00 100644 --- a/nym-wallet/src/types/rust/ValidatorUrl.ts +++ b/nym-wallet/src/types/rust/ValidatorUrl.ts @@ -1,2 +1,4 @@ - -export interface ValidatorUrl { url: string, name: string | null, } \ No newline at end of file +export interface ValidatorUrl { + url: string; + name: string | null; +} diff --git a/nym-wallet/src/types/rust/ValidatorUrls.ts b/nym-wallet/src/types/rust/ValidatorUrls.ts index 3a104150b1..98ca799fb5 100644 --- a/nym-wallet/src/types/rust/ValidatorUrls.ts +++ b/nym-wallet/src/types/rust/ValidatorUrls.ts @@ -1,3 +1,5 @@ -import type { ValidatorUrl } from "./ValidatorUrl"; +import type { ValidatorUrl } from './ValidatorUrl'; -export interface ValidatorUrls { urls: Array, } \ No newline at end of file +export interface ValidatorUrls { + urls: Array; +} diff --git a/ts-packages/mui-theme/src/theme/theme.ts b/ts-packages/mui-theme/src/theme/theme.ts index a12e706e9e..bb4dcae533 100644 --- a/ts-packages/mui-theme/src/theme/theme.ts +++ b/ts-packages/mui-theme/src/theme/theme.ts @@ -84,6 +84,7 @@ export const getDesignTokens = (mode: PaletteMode): ThemeOptions => { ].join(','), fontSize: 14, fontWeightRegular: 500, + fontWeightMedium: 600, button: { textTransform: 'none', fontWeight: '600', diff --git a/ts-packages/types/src/types/rust/Account.ts b/ts-packages/types/src/types/rust/Account.ts index ea0586828f..da0afb666e 100644 --- a/ts-packages/types/src/types/rust/Account.ts +++ b/ts-packages/types/src/types/rust/Account.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { CurrencyDenom } from './CurrencyDenom'; export interface Account { diff --git a/ts-packages/types/src/types/rust/AccountEntry.ts b/ts-packages/types/src/types/rust/AccountEntry.ts index f6ad1b53a9..472a9befcd 100644 --- a/ts-packages/types/src/types/rust/AccountEntry.ts +++ b/ts-packages/types/src/types/rust/AccountEntry.ts @@ -1,3 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export interface AccountEntry { id: string; address: string; diff --git a/ts-packages/types/src/types/rust/AccountWithMnemonic.ts b/ts-packages/types/src/types/rust/AccountWithMnemonic.ts index 6b3757bdab..edbf9b9de6 100644 --- a/ts-packages/types/src/types/rust/AccountWithMnemonic.ts +++ b/ts-packages/types/src/types/rust/AccountWithMnemonic.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Account } from './Account'; export interface AccountWithMnemonic { diff --git a/ts-packages/types/src/types/rust/Balance.ts b/ts-packages/types/src/types/rust/Balance.ts index ba6be26651..fe11917327 100644 --- a/ts-packages/types/src/types/rust/Balance.ts +++ b/ts-packages/types/src/types/rust/Balance.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; export interface Balance { diff --git a/ts-packages/types/src/types/rust/Coin.ts b/ts-packages/types/src/types/rust/Coin.ts index dda00291d7..493c2e6b41 100644 --- a/ts-packages/types/src/types/rust/Coin.ts +++ b/ts-packages/types/src/types/rust/Coin.ts @@ -1,3 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export interface Coin { denom: string; amount: bigint; diff --git a/ts-packages/types/src/types/rust/CosmosFee.ts b/ts-packages/types/src/types/rust/CosmosFee.ts index 54c0f689bc..d77c4d3dd8 100644 --- a/ts-packages/types/src/types/rust/CosmosFee.ts +++ b/ts-packages/types/src/types/rust/CosmosFee.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Coin } from './Coin'; export interface CosmosFee { diff --git a/ts-packages/types/src/types/rust/CurrencyDenom.ts b/ts-packages/types/src/types/rust/CurrencyDenom.ts index 04760b4fd7..3e7696c28d 100644 --- a/ts-packages/types/src/types/rust/CurrencyDenom.ts +++ b/ts-packages/types/src/types/rust/CurrencyDenom.ts @@ -1 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export type CurrencyDenom = 'unknown' | 'nym' | 'nymt' | 'nyx' | 'nyxt'; diff --git a/ts-packages/types/src/types/rust/DecCoin.ts b/ts-packages/types/src/types/rust/DecCoin.ts index d2b1b4dd69..9411bf358b 100644 --- a/ts-packages/types/src/types/rust/DecCoin.ts +++ b/ts-packages/types/src/types/rust/DecCoin.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { CurrencyDenom } from './CurrencyDenom'; export type DecCoin = { denom: CurrencyDenom; amount: string }; diff --git a/ts-packages/types/src/types/rust/Delegation.ts b/ts-packages/types/src/types/rust/Delegation.ts index 18d6df201f..58de13e6cc 100644 --- a/ts-packages/types/src/types/rust/Delegation.ts +++ b/ts-packages/types/src/types/rust/Delegation.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; export interface Delegation { diff --git a/ts-packages/types/src/types/rust/DelegationEvent.ts b/ts-packages/types/src/types/rust/DelegationEvent.ts index d9e2c0a21d..30ff21943f 100644 --- a/ts-packages/types/src/types/rust/DelegationEvent.ts +++ b/ts-packages/types/src/types/rust/DelegationEvent.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { DelegationEventKind } from './DelegationEventKind'; diff --git a/ts-packages/types/src/types/rust/DelegationEventKind.ts b/ts-packages/types/src/types/rust/DelegationEventKind.ts index a1db5fac12..a242220102 100644 --- a/ts-packages/types/src/types/rust/DelegationEventKind.ts +++ b/ts-packages/types/src/types/rust/DelegationEventKind.ts @@ -1 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export type DelegationEventKind = 'Delegate' | 'Undelegate'; diff --git a/ts-packages/types/src/types/rust/DelegationResult.ts b/ts-packages/types/src/types/rust/DelegationResult.ts index f6d29d9435..d8f8a77ce3 100644 --- a/ts-packages/types/src/types/rust/DelegationResult.ts +++ b/ts-packages/types/src/types/rust/DelegationResult.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; export interface DelegationResult { diff --git a/ts-packages/types/src/types/rust/DelegationSummaryResponse.ts b/ts-packages/types/src/types/rust/DelegationSummaryResponse.ts index 0cb9346c59..21e85d513b 100644 --- a/ts-packages/types/src/types/rust/DelegationSummaryResponse.ts +++ b/ts-packages/types/src/types/rust/DelegationSummaryResponse.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { DelegationWithEverything } from './DelegationWithEverything'; diff --git a/ts-packages/types/src/types/rust/DelegationWithEverything.ts b/ts-packages/types/src/types/rust/DelegationWithEverything.ts index 0d3423a133..ecf949c5ae 100644 --- a/ts-packages/types/src/types/rust/DelegationWithEverything.ts +++ b/ts-packages/types/src/types/rust/DelegationWithEverything.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { DelegationEvent } from './DelegationEvent'; import type { MixNodeCostParams } from './MixNodeCostParams'; diff --git a/ts-packages/types/src/types/rust/Fee.ts b/ts-packages/types/src/types/rust/Fee.ts index 5a7a0af56e..1e3f747e92 100644 --- a/ts-packages/types/src/types/rust/Fee.ts +++ b/ts-packages/types/src/types/rust/Fee.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { CosmosFee } from './CosmosFee'; export type Fee = { Manual: CosmosFee } | { Auto: number | null }; diff --git a/ts-packages/types/src/types/rust/FeeDetails.ts b/ts-packages/types/src/types/rust/FeeDetails.ts index 60bcd4cae5..7db283dbc1 100644 --- a/ts-packages/types/src/types/rust/FeeDetails.ts +++ b/ts-packages/types/src/types/rust/FeeDetails.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { Fee } from './Fee'; diff --git a/ts-packages/types/src/types/rust/Gas.ts b/ts-packages/types/src/types/rust/Gas.ts index e207dcb1e1..2b93e47509 100644 --- a/ts-packages/types/src/types/rust/Gas.ts +++ b/ts-packages/types/src/types/rust/Gas.ts @@ -1,3 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export interface Gas { gas_units: bigint; } diff --git a/ts-packages/types/src/types/rust/GasInfo.ts b/ts-packages/types/src/types/rust/GasInfo.ts index fd5b21e582..3e34323018 100644 --- a/ts-packages/types/src/types/rust/GasInfo.ts +++ b/ts-packages/types/src/types/rust/GasInfo.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Gas } from './Gas'; export interface GasInfo { diff --git a/ts-packages/types/src/types/rust/Gateway.ts b/ts-packages/types/src/types/rust/Gateway.ts index 1dbba0e5ed..4c449b578d 100644 --- a/ts-packages/types/src/types/rust/Gateway.ts +++ b/ts-packages/types/src/types/rust/Gateway.ts @@ -1,3 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export interface Gateway { host: string; mix_port: number; diff --git a/ts-packages/types/src/types/rust/GatewayBond.ts b/ts-packages/types/src/types/rust/GatewayBond.ts index 277994efac..405c1cab92 100644 --- a/ts-packages/types/src/types/rust/GatewayBond.ts +++ b/ts-packages/types/src/types/rust/GatewayBond.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { Gateway } from './Gateway'; diff --git a/ts-packages/types/src/types/rust/InclusionProbabilityResponse.ts b/ts-packages/types/src/types/rust/InclusionProbabilityResponse.ts index 56d81bde41..3f80b794a0 100644 --- a/ts-packages/types/src/types/rust/InclusionProbabilityResponse.ts +++ b/ts-packages/types/src/types/rust/InclusionProbabilityResponse.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { SelectionChance } from './SelectionChance'; export interface InclusionProbabilityResponse { diff --git a/ts-packages/types/src/types/rust/Interval.ts b/ts-packages/types/src/types/rust/Interval.ts index b47687ae22..7a7fa7bb4d 100644 --- a/ts-packages/types/src/types/rust/Interval.ts +++ b/ts-packages/types/src/types/rust/Interval.ts @@ -3,6 +3,6 @@ export interface Interval { epochs_in_interval: number; current_epoch_start: string; current_epoch_id: number; - epoch_length: string; + epoch_length: { secs: number; nanos: number }; total_elapsed_epochs: number; } diff --git a/ts-packages/types/src/types/rust/MixNodeBond.ts b/ts-packages/types/src/types/rust/MixNodeBond.ts index 37059b9b61..173ce9599d 100644 --- a/ts-packages/types/src/types/rust/MixNodeBond.ts +++ b/ts-packages/types/src/types/rust/MixNodeBond.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { MixNode } from './Mixnode'; diff --git a/ts-packages/types/src/types/rust/Mixnode.ts b/ts-packages/types/src/types/rust/Mixnode.ts index 0deaa5b919..8dddce4eb2 100644 --- a/ts-packages/types/src/types/rust/Mixnode.ts +++ b/ts-packages/types/src/types/rust/Mixnode.ts @@ -1,3 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export interface MixNode { host: string; mix_port: number; diff --git a/ts-packages/types/src/types/rust/MixnodeStatus.ts b/ts-packages/types/src/types/rust/MixnodeStatus.ts index da89c7e8a7..6421988dce 100644 --- a/ts-packages/types/src/types/rust/MixnodeStatus.ts +++ b/ts-packages/types/src/types/rust/MixnodeStatus.ts @@ -1 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export type MixnodeStatus = 'active' | 'standby' | 'inactive' | 'not_found'; diff --git a/ts-packages/types/src/types/rust/MixnodeStatusResponse.ts b/ts-packages/types/src/types/rust/MixnodeStatusResponse.ts index 2225b26df3..2dd6bb6f54 100644 --- a/ts-packages/types/src/types/rust/MixnodeStatusResponse.ts +++ b/ts-packages/types/src/types/rust/MixnodeStatusResponse.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { MixnodeStatus } from './MixnodeStatus'; export interface MixnodeStatusResponse { diff --git a/ts-packages/types/src/types/rust/OriginalVestingResponse.ts b/ts-packages/types/src/types/rust/OriginalVestingResponse.ts index 8d781d5ad0..ea10cd24af 100644 --- a/ts-packages/types/src/types/rust/OriginalVestingResponse.ts +++ b/ts-packages/types/src/types/rust/OriginalVestingResponse.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; export interface OriginalVestingResponse { diff --git a/ts-packages/types/src/types/rust/Period.ts b/ts-packages/types/src/types/rust/Period.ts index 05d9890d5f..76a8876b31 100644 --- a/ts-packages/types/src/types/rust/Period.ts +++ b/ts-packages/types/src/types/rust/Period.ts @@ -1 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export type Period = 'Before' | { In: number } | 'After'; diff --git a/ts-packages/types/src/types/rust/PledgeData.ts b/ts-packages/types/src/types/rust/PledgeData.ts index 9fb19f9aaf..76adc23018 100644 --- a/ts-packages/types/src/types/rust/PledgeData.ts +++ b/ts-packages/types/src/types/rust/PledgeData.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; export interface PledgeData { diff --git a/ts-packages/types/src/types/rust/RewardedSetNodeStatus.ts b/ts-packages/types/src/types/rust/RewardedSetNodeStatus.ts index 8ddd13d047..5a8da8dbea 100644 --- a/ts-packages/types/src/types/rust/RewardedSetNodeStatus.ts +++ b/ts-packages/types/src/types/rust/RewardedSetNodeStatus.ts @@ -1 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export type RewardedSetNodeStatus = 'Active' | 'Standby'; diff --git a/ts-packages/types/src/types/rust/RpcTransactionResponse.ts b/ts-packages/types/src/types/rust/RpcTransactionResponse.ts index 2463e3dd20..2f9c3bdc8a 100644 --- a/ts-packages/types/src/types/rust/RpcTransactionResponse.ts +++ b/ts-packages/types/src/types/rust/RpcTransactionResponse.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { Gas } from './Gas'; diff --git a/ts-packages/types/src/types/rust/SendTxResult.ts b/ts-packages/types/src/types/rust/SendTxResult.ts index b44de3324d..02fb0b5b0c 100644 --- a/ts-packages/types/src/types/rust/SendTxResult.ts +++ b/ts-packages/types/src/types/rust/SendTxResult.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { Gas } from './Gas'; import type { TransactionDetails } from './TransactionDetails'; diff --git a/ts-packages/types/src/types/rust/StakeSaturationResponse.ts b/ts-packages/types/src/types/rust/StakeSaturationResponse.ts index 038d261c46..6be2ae0e0e 100644 --- a/ts-packages/types/src/types/rust/StakeSaturationResponse.ts +++ b/ts-packages/types/src/types/rust/StakeSaturationResponse.ts @@ -1,3 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export interface StakeSaturationResponse { saturation: string; uncapped_saturation: string; diff --git a/ts-packages/types/src/types/rust/TransactionDetails.ts b/ts-packages/types/src/types/rust/TransactionDetails.ts index 8de1cf9ec3..043db71473 100644 --- a/ts-packages/types/src/types/rust/TransactionDetails.ts +++ b/ts-packages/types/src/types/rust/TransactionDetails.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; export interface TransactionDetails { diff --git a/ts-packages/types/src/types/rust/TransactionExecuteResult.ts b/ts-packages/types/src/types/rust/TransactionExecuteResult.ts index e6d93e8448..ce06484dd1 100644 --- a/ts-packages/types/src/types/rust/TransactionExecuteResult.ts +++ b/ts-packages/types/src/types/rust/TransactionExecuteResult.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { GasInfo } from './GasInfo'; diff --git a/ts-packages/types/src/types/rust/VestingAccountInfo.ts b/ts-packages/types/src/types/rust/VestingAccountInfo.ts index d317d045d1..538e941edb 100644 --- a/ts-packages/types/src/types/rust/VestingAccountInfo.ts +++ b/ts-packages/types/src/types/rust/VestingAccountInfo.ts @@ -1,3 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { DecCoin } from './DecCoin'; import type { VestingPeriod } from './VestingPeriod'; diff --git a/ts-packages/types/src/types/rust/VestingPeriod.ts b/ts-packages/types/src/types/rust/VestingPeriod.ts index de1089005f..dae6901c10 100644 --- a/ts-packages/types/src/types/rust/VestingPeriod.ts +++ b/ts-packages/types/src/types/rust/VestingPeriod.ts @@ -1,3 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + export interface VestingPeriod { start_time: bigint; period_seconds: bigint; diff --git a/ts-packages/types/src/utils/decimal/index.ts b/ts-packages/types/src/utils/decimal/index.ts index 2f58196372..62807f25d6 100644 --- a/ts-packages/types/src/utils/decimal/index.ts +++ b/ts-packages/types/src/utils/decimal/index.ts @@ -10,5 +10,8 @@ export const stringToDecimal = (raw: string): Decimal => Decimal.fromUserInput(r export const decimalToPercentage = (raw: string) => Math.round(Decimal.fromUserInput(raw, 18).toFloatApproximation() * 100).toString(); +export const percentToDecimal = (raw: string) => + (Decimal.fromUserInput(raw, 18).toFloatApproximation() / 100).toString(); + export const decimalToFloatApproximation = (raw: string): number => Decimal.fromUserInput(raw, 18).toFloatApproximation(); From a746738d489b5224864a893da88f80021b7372e9 Mon Sep 17 00:00:00 2001 From: Gala Date: Mon, 19 Dec 2022 13:40:26 +0100 Subject: [PATCH 027/591] make fields match button height --- explorer/src/components/TableToolbar.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/explorer/src/components/TableToolbar.tsx b/explorer/src/components/TableToolbar.tsx index 7452b4707a..7426433868 100644 --- a/explorer/src/components/TableToolbar.tsx +++ b/explorer/src/components/TableToolbar.tsx @@ -4,6 +4,8 @@ import Select, { SelectChangeEvent } from '@mui/material/Select'; import { Filters } from './Filters/Filters'; import { useIsMobile } from '../hooks/useIsMobile'; +const fieldsHeight = '42.25px'; + type TableToolBarProps = { onChangeSearch: (arg: string) => void; onChangePageSize: (event: SelectChangeEvent) => void; @@ -35,7 +37,7 @@ export const TableToolbar: React.FC = ({ }} > - + {childrenBefore} -

- -

- -

-

- -

-

- -

- -

Send messages from your browser, through the mixnet, and to the recipient using the "send" button.

-

Sent messages show in blue, received - messages show in green.

- -
-

- -

- - - - \ No newline at end of file diff --git a/clients/webassembly/js-example/index.js b/clients/webassembly/js-example/index.js deleted file mode 100644 index f0890bf12e..0000000000 --- a/clients/webassembly/js-example/index.js +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2020-2022 Nym Technologies SA -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -class WebWorkerClient { - worker = null; - - constructor() { - this.worker = new Worker('./worker.js'); - - this.worker.onmessage = (ev) => { - if (ev.data && ev.data.kind) { - switch (ev.data.kind) { - case 'Ready': - const { selfAddress } = ev.data.args; - displaySenderAddress(selfAddress); - break; - case 'ReceiveMessage': - const { message } = ev.data.args; - displayReceived(message); - break; - } - } - }; - } - - sendMessage = (message, recipient) => { - if (!this.worker) { - console.error('Could not send message because worker does not exist'); - return; - } - - this.worker.postMessage({ - kind: 'SendMessage', - args: { - message, recipient, - }, - }); - }; -} - -let client = null; - -async function main() { - client = new WebWorkerClient(); - - const sendButton = document.querySelector('#send-button'); - sendButton.onclick = function() { - sendMessageTo(); - }; -} - -/** - * Create a Sphinx packet and send it to the mixnet through the gateway node. - * - * Message and recipient are taken from the values in the user interface. - * - */ -async function sendMessageTo() { - const message = document.getElementById('message').value; - const recipient = document.getElementById('recipient').value; - - await client.sendMessage(message, recipient); - displaySend(message); -} - -/** - * Display messages that have been sent up the websocket. Colours them blue. - * - * @param {string} message - */ -function displaySend(message) { - let timestamp = new Date().toISOString().substr(11, 12); - - let sendDiv = document.createElement('div'); - let paragraph = document.createElement('p'); - paragraph.setAttribute('style', 'color: blue'); - let paragraphContent = document.createTextNode(timestamp + ' sent >>> ' + message); - paragraph.appendChild(paragraphContent); - - sendDiv.appendChild(paragraph); - document.getElementById('output').appendChild(sendDiv); -} - -/** - * Display received text messages in the browser. Colour them green. - * - * @param {Uint8Array} raw - */ -function displayReceived(raw, sender_tag) { - const content = new TextDecoder().decode(raw); - if (sender_tag !== undefined) { - console.log("this message also contained some surbs from", sender_tag) - } - - let timestamp = new Date().toISOString().substr(11, 12); - let receivedDiv = document.createElement('div'); - let paragraph = document.createElement('p'); - paragraph.setAttribute('style', 'color: green'); - let paragraphContent = document.createTextNode(timestamp + ' received >>> ' + content); - // let paragraphContent = document.createTextNode(timestamp + " received >>> " + content + ((replySurb != null) ? "Reply SURB was attached here (but we can't do anything with it yet" : " (NO REPLY-SURB AVAILABLE)")) - paragraph.appendChild(paragraphContent); - receivedDiv.appendChild(paragraph); - document.getElementById('output').appendChild(receivedDiv); -} - - -/** - * Display the nymClient's sender address in the user interface - * - * @param {String} address - */ -function displaySenderAddress(address) { - document.getElementById('sender').value = address; -} - -// Let's get started! -main(); \ No newline at end of file diff --git a/clients/webassembly/js-example/package-lock.json b/clients/webassembly/js-example/package-lock.json deleted file mode 100644 index 2e4adc6d90..0000000000 --- a/clients/webassembly/js-example/package-lock.json +++ /dev/null @@ -1,6872 +0,0 @@ -{ - "name": "create-wasm-app", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "create-wasm-app", - "version": "0.1.0", - "license": "Apache-2.0", - "dependencies": { - "@nymproject/nym-client-wasm": "file:../pkg" - }, - "bin": { - "create-wasm-app": ".bin/create-wasm-app.js" - }, - "devDependencies": { - "copy-webpack-plugin": "^10.2.4", - "hello-wasm-pack": "^0.1.0", - "webpack": "^5.70.0", - "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.7.4" - } - }, - "../pkg": { - "name": "@nymproject/nym-client-wasm", - "version": "0.0.1" - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nymproject/nym-client-wasm": { - "resolved": "../pkg", - "link": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/http-proxy": { - "version": "1.17.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.10", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "17.0.23", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/retry": { - "version": "0.12.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.6.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.7.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/async": { - "version": "2.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "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.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour": { - "version": "3.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.20.2", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001320", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/colorette": { - "version": "2.0.16", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-webpack-plugin": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.1", - "globby": "^12.0.2", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 12.20.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/del": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/del/node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-indexof": "^1.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.92", - "dev": true, - "license": "ISC" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.9.2", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "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.11.0", - "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" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.14.9", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "dev": true, - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "dev": true, - "license": "ISC" - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "license": "MIT" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hello-wasm-pack": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz", - "integrity": "sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w==", - "dev": true - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.3.2", - "dev": true, - "license": "MIT" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.3", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.1", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "dev": true, - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-forge": { - "version": "1.3.0", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/portfinder": { - "version": "1.0.28", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true, - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "node-forge": "^1.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sockjs": { - "version": "0.3.21", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/strip-ansi": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.12.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/watchpack": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "5.70.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.9.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", - "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - }, - "dependencies": { - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nymproject/nym-client-wasm": { - "version": "file:../pkg" - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.1", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.3", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/express": { - "version": "4.17.13", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.28", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/http-proxy": { - "version": "1.17.8", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.10", - "dev": true - }, - "@types/mime": { - "version": "1.3.2", - "dev": true - }, - "@types/node": { - "version": "17.0.23", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.1", - "dev": true - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.13.10", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "8.5.3", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.1.1", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.4.1", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.6.1", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.7.0", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "aggregate-error": { - "version": "3.1.0", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "6.0.1", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-flatten": { - "version": "2.1.2", - "dev": true - }, - "array-union": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", - "dev": true - }, - "async": { - "version": "2.6.4", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "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.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.20.2", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caniuse-lite": { - "version": "1.0.30001320", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "colorette": { - "version": "2.0.16", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-webpack-plugin": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", - "dev": true, - "requires": { - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.1", - "globby": "^12.0.2", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "del": { - "version": "6.0.0", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "array-union": { - "version": "2.1.0", - "dev": true - }, - "globby": { - "version": "11.1.0", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "slash": { - "version": "3.0.0", - "dev": true - } - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.92", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.9.2", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "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.11.0", - "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" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.14.9", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-monkey": { - "version": "1.0.3", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globby": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", - "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", - "dev": true, - "requires": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "graceful-fs": { - "version": "4.2.9", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "dev": true - }, - "hello-wasm-pack": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz", - "integrity": "sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-entities": { - "version": "2.3.2", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.3", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "2.0.4", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "indent-string": { - "version": "4.0.0", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-arguments": { - "version": "1.1.0", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.8.1", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.4", - "dev": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.3", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "loader-runner": { - "version": "4.2.0", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "3.4.1", - "dev": true, - "requires": { - "fs-monkey": "1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-forge": { - "version": "1.3.0", - "dev": true - }, - "node-releases": { - "version": "2.0.2", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "dev": true - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "4.6.1", - "dev": true, - "requires": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "portfinder": { - "version": "1.0.28", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.0.0", - "dev": true, - "requires": { - "node-forge": "^1.2.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "sockjs": { - "version": "0.3.21", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "7.0.1", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.12.1", - "dev": true, - "requires": { - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.1", - "dev": true, - "requires": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "watchpack": { - "version": "2.3.1", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "5.70.0", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-cli": { - "version": "4.9.2", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.1", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.1", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - } - }, - "webpack-dev-server": { - "version": "4.7.4", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", - "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "ws": { - "version": "8.5.0", - "dev": true, - "requires": {} - } - } -} diff --git a/clients/webassembly/js-example/package.json b/clients/webassembly/js-example/package.json deleted file mode 100644 index a843e96700..0000000000 --- a/clients/webassembly/js-example/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "create-wasm-app", - "version": "0.1.0", - "description": "create an app to consume rust-generated wasm packages", - "main": "index.js", - "bin": { - "create-wasm-app": ".bin/create-wasm-app.js" - }, - "scripts": { - "build": "webpack --config webpack.config.js", - "start": "webpack-dev-server --port 8001" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/rustwasm/create-wasm-app.git" - }, - "keywords": [ - "webassembly", - "wasm", - "rust", - "webpack" - ], - "author": "Dave Hrycyszyn ", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/nymtech/nym/issues" - }, - "homepage": "https://nymtech.net/docs", - "devDependencies": { - "copy-webpack-plugin": "^10.2.4", - "hello-wasm-pack": "^0.1.0", - "webpack": "^5.70.0", - "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.7.4" - }, - "dependencies": { - "@nymproject/nym-client-wasm": "file:../pkg" - } -} \ No newline at end of file diff --git a/clients/webassembly/js-example/webpack.config.js b/clients/webassembly/js-example/webpack.config.js deleted file mode 100644 index e07304fee3..0000000000 --- a/clients/webassembly/js-example/webpack.config.js +++ /dev/null @@ -1,33 +0,0 @@ -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const path = require('path'); - -module.exports = { - performance: { - hints: false, - maxEntrypointSize: 512000, - maxAssetSize: 512000 - }, - entry: { - bootstrap: './bootstrap.js', - worker: './worker.js', - }, - output: { - path: path.resolve(__dirname, 'dist'), - filename: '[name].js', - }, - // mode: 'development', - mode: 'production', - plugins: [ - new CopyWebpackPlugin({ - patterns: [ - 'index.html', - { - from: 'node_modules/@nymproject/nym-client-wasm/*.(js|wasm)', - to: '[name][ext]', - }, - ], - }), - - ], - experiments: { syncWebAssembly: true }, -}; diff --git a/clients/webassembly/js-example/worker.js b/clients/webassembly/js-example/worker.js deleted file mode 100644 index da066d6ea2..0000000000 --- a/clients/webassembly/js-example/worker.js +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2020-2022 Nym Technologies SA -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -importScripts('nym_client_wasm.js'); - -console.log('Initializing worker'); - -// wasm_bindgen creates a global variable (with the exports attached) that is in scope after `importScripts` -const { default_debug, NymClientBuilder, set_panic_hook, Config, GatewayEndpointConfig } = wasm_bindgen; - -let client = null; - -async function main() { - // load WASM package - await wasm_bindgen('nym_client_wasm_bg.wasm'); - - console.log('Loaded WASM'); - - // sets up better stack traces in case of in-rust panics - set_panic_hook(); - - // validator server we will use to get topology from - const validator = 'https://qwerty-validator-api.qa.nymte.ch/api'; - - const gatewayId = 'EVupP2tRUeZo5Y6RpBHAbm8kSntpgNyZNL6yCr7BDEoG'; - const gatewayOwner = 'n1rmlew3euapuq7rs4s4j9apv00whrsazr764kl7'; - const gatewayListener = 'ws://176.58.120.72:9000'; - const gatewayEndpoint = new GatewayEndpointConfig(gatewayId, gatewayOwner, gatewayListener) - - // only really useful if you want to adjust some settings like traffic rate - // (if not needed you can just pass a null) - const debug = default_debug(); - - debug.disable_main_poisson_packet_distribution = true; - debug.disable_loop_cover_traffic_stream = true; - debug.use_extended_packet_size = true; - // debug.average_packet_delay_ms = BigInt(10); - // debug.average_ack_delay_ms = BigInt(10); - // debug.ack_wait_addition_ms = BigInt(3000); - // debug.ack_wait_multiplier = 10; - - debug.topology_refresh_rate_ms = BigInt(60000) - - const config = new Config('my-awesome-wasm-client', validator, gatewayEndpoint, debug); - - const onMessageHandler = (message) => { - self.postMessage({ - kind: 'ReceiveMessage', - args: { - message, - }, - }); - }; - - console.log('Instantiating WASM client...'); - - let clientBuilder = new NymClientBuilder(config, onMessageHandler) - console.log('Web worker creating WASM client...'); - let local_client = await clientBuilder.start_client(); - console.log('WASM client running!'); - - const selfAddress = local_client.self_address(); - - // set the global (I guess we don't have to anymore?) - client = local_client; - - console.log(`Client address is ${selfAddress}`); - self.postMessage({ - kind: 'Ready', - args: { - selfAddress, - }, - }); - - // Set callback to handle messages passed to the worker. - self.onmessage = async event => { - if (event.data && event.data.kind) { - switch (event.data.kind) { - case 'SendMessage': { - const { message, recipient } = event.data.args; - let uint8Array = new TextEncoder().encode(message); - await client.send_regular_message(uint8Array, recipient); - } - } - } - }; -} - -// Let's get started! -main(); \ No newline at end of file diff --git a/explorer/package.json b/explorer/package.json index 2478774987..65ed064da2 100644 --- a/explorer/package.json +++ b/explorer/package.json @@ -55,10 +55,10 @@ "@types/topojson-client": "^3.1.0", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.3.0", "babel-plugin-root-import": "^6.6.0", "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.2.0", + "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^3.0.2", "dotenv-webpack": "^7.0.3", "eslint": "^8.10.0", @@ -82,13 +82,13 @@ "prettier": "2.3.2", "react-refresh": "^0.10.0", "react-refresh-typescript": "^2.0.2", - "style-loader": "^3.2.1", + "style-loader": "^3.3.1", "ts-jest": "^27.0.5", - "ts-loader": "^9.2.5", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^3.5.2", "typescript": "^4.6.2", "url-loader": "^4.1.1", - "webpack": "^5.64.3", + "webpack": "^5.75.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.5.0", "webpack-favicons": "^1.3.8", diff --git a/nym-connect/package.json b/nym-connect/package.json index f74779b2d4..7b970b9d1b 100644 --- a/nym-connect/package.json +++ b/nym-connect/package.json @@ -68,10 +68,10 @@ "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.3.0", "babel-plugin-root-import": "^6.6.0", "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.2.0", + "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^3.0.2", "dotenv-webpack": "^7.0.3", "eslint": "^8.10.0", @@ -97,14 +97,14 @@ "prettier": "2.3.2", "react-refresh": "^0.10.0", "react-refresh-typescript": "^2.0.2", - "style-loader": "^3.2.1", + "style-loader": "^3.3.1", "thread-loader": "^3.0.4", "ts-jest": "^27.0.5", - "ts-loader": "^9.2.5", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^3.5.2", "typescript": "^4.6.2", "url-loader": "^4.1.1", - "webpack": "^5.64.3", + "webpack": "^5.75.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.5.0", "webpack-favicons": "^1.3.8", diff --git a/nym-wallet/package.json b/nym-wallet/package.json index 72a440d733..891d73b53f 100644 --- a/nym-wallet/package.json +++ b/nym-wallet/package.json @@ -78,10 +78,10 @@ "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.3.0", "babel-plugin-root-import": "^6.6.0", "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.2.0", + "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^3.0.2", "dotenv-webpack": "^7.0.3", "eslint": "^8.10.0", @@ -107,14 +107,14 @@ "prettier": "2.3.2", "react-refresh": "^0.10.0", "react-refresh-typescript": "^2.0.2", - "style-loader": "^3.2.1", + "style-loader": "^3.3.1", "thread-loader": "^3.0.4", "ts-jest": "^27.0.5", - "ts-loader": "^9.2.5", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^3.5.2", "typescript": "^4.6.2", "url-loader": "^4.1.1", - "webpack": "^5.64.3", + "webpack": "^5.75.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.5.0", "webpack-favicons": "^1.3.8", diff --git a/sdk/typescript/examples/plain-html/package.json b/sdk/typescript/examples/plain-html/package.json index bd4415c528..2c42d7c54f 100644 --- a/sdk/typescript/examples/plain-html/package.json +++ b/sdk/typescript/examples/plain-html/package.json @@ -17,10 +17,10 @@ "@types/node": "^16.7.13", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.3.0", "babel-plugin-root-import": "^5.1.0", "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.2.0", + "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^3.0.2", "dotenv-webpack": "^7.0.3", "eslint": "^8.10.0", @@ -39,14 +39,14 @@ "mini-css-extract-plugin": "^2.2.2", "npm-run-all": "^4.1.5", "prettier": "^2.5.1", - "style-loader": "^3.2.1", + "style-loader": "^3.3.1", "thread-loader": "^3.0.4", "ts-jest": "^27.0.5", - "ts-loader": "^9.2.5", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^3.5.2", "typescript": "^4.6.2", "url-loader": "^4.1.1", - "webpack": "^5.64.3", + "webpack": "^5.75.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.5.0", "webpack-merge": "^5.8.0" diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/package.json b/sdk/typescript/examples/react-webpack-with-theme-example/package.json index 99dd547454..7889c6d339 100644 --- a/sdk/typescript/examples/react-webpack-with-theme-example/package.json +++ b/sdk/typescript/examples/react-webpack-with-theme-example/package.json @@ -34,10 +34,10 @@ "@types/react": "^17.0.34", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.3.0", "babel-plugin-root-import": "^5.1.0", "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.2.0", + "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^3.0.2", "dotenv-webpack": "^7.0.3", "eslint": "^8.10.0", @@ -61,14 +61,14 @@ "npm-run-all": "^4.1.5", "prettier": "^2.5.1", "react-refresh-typescript": "^2.0.3", - "style-loader": "^3.2.1", + "style-loader": "^3.3.1", "thread-loader": "^3.0.4", "ts-jest": "^27.0.5", - "ts-loader": "^9.2.5", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^3.5.2", "typescript": "^4.6.2", "url-loader": "^4.1.1", - "webpack": "^5.64.3", + "webpack": "^5.75.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.5.0", "webpack-favicons": "^1.3.8", diff --git a/ts-packages/react-webpack-with-theme-example/package.json b/ts-packages/react-webpack-with-theme-example/package.json index e4d7c16b46..fc05cce9c6 100644 --- a/ts-packages/react-webpack-with-theme-example/package.json +++ b/ts-packages/react-webpack-with-theme-example/package.json @@ -10,8 +10,8 @@ "@mui/styles": "^5.0.1", "@mui/icons-material": "^5.5.0", "@mui/lab": "^5.0.0-alpha.72", - "@nymproject/mui-theme" : "^1.0.0", - "@nymproject/react" : "^1.0.0" + "@nymproject/mui-theme": "^1.0.0", + "@nymproject/react": "^1.0.0" }, "devDependencies": { "@babel/core": "^7.15.0", @@ -30,10 +30,10 @@ "@types/react": "^17.0.34", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", - "babel-loader": "^8.2.2", + "babel-loader": "^8.3.0", "babel-plugin-root-import": "^5.1.0", "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.2.0", + "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^3.0.2", "dotenv-webpack": "^7.0.3", "eslint": "^8.10.0", @@ -56,14 +56,14 @@ "mini-css-extract-plugin": "^2.2.2", "prettier": "^2.5.1", "react-refresh-typescript": "^2.0.3", - "style-loader": "^3.2.1", + "style-loader": "^3.3.1", "thread-loader": "^3.0.4", "ts-jest": "^27.0.5", - "ts-loader": "^9.2.5", + "ts-loader": "^9.4.2", "tsconfig-paths-webpack-plugin": "^3.5.2", "typescript": "^4.6.2", "url-loader": "^4.1.1", - "webpack": "^5.64.3", + "webpack": "^5.75.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.5.0", "webpack-favicons": "^1.3.8", diff --git a/ts-packages/webpack/package.json b/ts-packages/webpack/package.json index 67ecfe1115..a75218889d 100644 --- a/ts-packages/webpack/package.json +++ b/ts-packages/webpack/package.json @@ -15,9 +15,9 @@ "@babel/preset-react": "^7.14.5", "@babel/preset-typescript": "^7.15.0", "@svgr/webpack": "^6.1.1", - "babel-loader": "^8.2.2", + "babel-loader": "^8.3.0", "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.2.0", + "css-loader": "^6.7.3", "dotenv-webpack": "^7.0.3", "eslint": "^8.10.0", "eslint-config-prettier": "^8.5.0", @@ -28,10 +28,10 @@ "fork-ts-checker-webpack-plugin": "^7.2.1", "html-webpack-plugin": "^5.3.2", "prettier": "^2.5.1", - "style-loader": "^3.2.1", + "style-loader": "^3.3.1", "tsconfig-paths-webpack-plugin": "^3.5.2", "url-loader": "^4.1.1", - "webpack": "^5.64.3", + "webpack": "^5.75.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^4.5.0", "webpack-favicons": "^1.3.8", diff --git a/yarn.lock b/yarn.lock index d8b9c5dc56..467c692143 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5972,7 +5972,7 @@ acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.0: +acorn@^8.0.0, acorn@^8.7.1: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== @@ -6512,7 +6512,7 @@ babel-jest@^27.5.1: graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@^8.0.0, babel-loader@^8.2.2, babel-loader@^8.2.3: +babel-loader@^8.0.0, babel-loader@^8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== @@ -6522,6 +6522,16 @@ babel-loader@^8.0.0, babel-loader@^8.2.2, babel-loader@^8.2.3: make-dir "^3.1.0" schema-utils "^2.6.5" +babel-loader@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + babel-plugin-add-react-displayname@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" @@ -8167,19 +8177,19 @@ css-loader@^5.0.1: schema-utils "^3.0.0" semver "^7.3.5" -css-loader@^6.2.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.6.0.tgz#c792ad5510bd1712618b49381bd0310574fafbd3" - integrity sha512-FK7H2lisOixPT406s5gZM1S3l8GrfhEBT3ZiL2UX1Ng1XWs0y2GPllz/OTyvbaHe12VgQrIXIzuEGVlbUhodqg== +css-loader@^6.7.3: + version "6.7.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== dependencies: icss-utils "^5.1.0" - postcss "^8.4.5" + postcss "^8.4.19" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.3.8" css-minimizer-webpack-plugin@^3.0.2: version "3.4.1" @@ -9145,7 +9155,7 @@ enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.8.3, enhanced-resolve@^5.9.2: +enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.2: version "5.9.2" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== @@ -9153,6 +9163,14 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.8.3, enhan graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enhanced-resolve@^5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" @@ -14283,6 +14301,11 @@ nanoid@^3.3.1: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -15742,12 +15765,12 @@ postcss@^8.2.15, postcss@^8.3.5: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.5: - version "8.4.7" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.7.tgz#f99862069ec4541de386bf57f5660a6c7a0875a8" - integrity sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A== +postcss@^8.4.19: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: - nanoid "^3.3.1" + nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -18151,7 +18174,7 @@ style-loader@^2.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -style-loader@^3.2.1: +style-loader@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== @@ -18668,10 +18691,10 @@ ts-jest@^27.0.5: semver "7.x" yargs-parser "20.x" -ts-loader@^9.2.5: - version "9.2.7" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.7.tgz#948654099ca96992b62ec47bd9cee5632006e101" - integrity sha512-Fxh44mKli9QezgbdCXkEJWxnedQ0ead7DXTH+lfXEPedu+Y9EtMJ2aQ9G3Dj1j7Q612E8931rww8NDZha4Tibg== +ts-loader@^9.4.2: + version "9.4.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" + integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" @@ -19446,6 +19469,14 @@ watchpack@^2.2.0, watchpack@^2.3.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" @@ -19690,34 +19721,34 @@ webpack@4: watchpack "^2.3.1" webpack-sources "^3.2.3" -webpack@^5.64.3: - version "5.69.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.69.1.tgz#8cfd92c192c6a52c99ab00529b5a0d33aa848dc5" - integrity sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A== +webpack@^5.75.0: + version "5.75.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" + integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" + json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" webpack@^5.9.0: From 2587d00b9ea76fd587d54033e0d42500c3c05638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 10 Jan 2023 17:36:27 +0000 Subject: [PATCH 148/591] feature: reduce staking address capabilities + refactor vesting storage (#2796) * checks for existing staking account * removed code for v2 migration * using stronger types for storage keys * Added type alias for the storage key and documented each `Map` * remove the hacky way of storing staker information * allow the staking address account to perform delegations with the additional msg argument * new unit tests * updated client code * modified migrate msg to explicitly require confirming having performed manual checks * re-ordered arguments --- .../src/nyxd/traits/vesting_signing_client.rs | 10 +- .../delegators/vesting_delegate_to_mixnode.rs | 5 +- .../vesting_undelegate_from_mixnode.rs | 5 +- .../vesting-contract/src/messages.rs | 5 +- contracts/vesting/src/contract.rs | 94 +++++++-- contracts/vesting/src/errors.rs | 31 +++ contracts/vesting/src/queued_migrations.rs | 13 -- contracts/vesting/src/storage.rs | 117 +++++++---- contracts/vesting/src/vesting/account/mod.rs | 6 +- .../src/vesting/account/vesting_account.rs | 4 +- contracts/vesting/src/vesting/mod.rs | 194 ++++++++++++++++-- .../src/operations/simulate/vesting.rs | 16 +- .../src/operations/vesting/delegate.rs | 4 +- 13 files changed, 400 insertions(+), 104 deletions(-) diff --git a/common/client-libs/validator-client/src/nyxd/traits/vesting_signing_client.rs b/common/client-libs/validator-client/src/nyxd/traits/vesting_signing_client.rs index 68b4bcc53a..a4060943f8 100644 --- a/common/client-libs/validator-client/src/nyxd/traits/vesting_signing_client.rs +++ b/common/client-libs/validator-client/src/nyxd/traits/vesting_signing_client.rs @@ -106,12 +106,14 @@ pub trait VestingSigningClient { &self, mix_id: MixId, amount: Coin, + on_behalf_of: Option, fee: Option, ) -> Result; async fn vesting_undelegate_from_mixnode( &self, mix_id: MixId, + on_behalf_of: Option, fee: Option, ) -> Result; @@ -367,6 +369,7 @@ impl VestingSigningClient for NyxdClient &self, mix_id: MixId, amount: Coin, + on_behalf_of: Option, fee: Option, ) -> Result { self.execute_vesting_contract( @@ -374,6 +377,7 @@ impl VestingSigningClient for NyxdClient VestingExecuteMsg::DelegateToMixnode { mix_id, amount: amount.into(), + on_behalf_of, }, vec![], ) @@ -383,11 +387,15 @@ impl VestingSigningClient for NyxdClient async fn vesting_undelegate_from_mixnode( &self, mix_id: MixId, + on_behalf_of: Option, fee: Option, ) -> Result { self.execute_vesting_contract( fee, - VestingExecuteMsg::UndelegateFromMixnode { mix_id }, + VestingExecuteMsg::UndelegateFromMixnode { + mix_id, + on_behalf_of, + }, vec![], ) .await diff --git a/common/commands/src/validator/mixnet/delegators/vesting_delegate_to_mixnode.rs b/common/commands/src/validator/mixnet/delegators/vesting_delegate_to_mixnode.rs index b4cef52bf3..273904122d 100644 --- a/common/commands/src/validator/mixnet/delegators/vesting_delegate_to_mixnode.rs +++ b/common/commands/src/validator/mixnet/delegators/vesting_delegate_to_mixnode.rs @@ -18,6 +18,9 @@ pub struct Args { #[clap(long)] pub identity_key: Option, + #[clap(long)] + pub on_behalf_of: Option, + #[clap(long)] pub amount: u128, } @@ -45,7 +48,7 @@ pub async fn vesting_delegate_to_mixnode(args: Args, client: SigningClient) { let coin = Coin::new(args.amount, denom); let res = client - .vesting_delegate_to_mixnode(mix_id, coin.into(), None) + .vesting_delegate_to_mixnode(mix_id, coin.into(), args.on_behalf_of, None) .await .expect("failed to delegate to mixnode!"); diff --git a/common/commands/src/validator/mixnet/delegators/vesting_undelegate_from_mixnode.rs b/common/commands/src/validator/mixnet/delegators/vesting_undelegate_from_mixnode.rs index 29b77c8a3b..2acafae9bd 100644 --- a/common/commands/src/validator/mixnet/delegators/vesting_undelegate_from_mixnode.rs +++ b/common/commands/src/validator/mixnet/delegators/vesting_undelegate_from_mixnode.rs @@ -16,6 +16,9 @@ pub struct Args { #[clap(long)] pub identity_key: Option, + + #[clap(long)] + pub on_behalf_of: Option, } pub async fn vesting_undelegate_from_mixnode(args: Args, client: SigningClient) { @@ -37,7 +40,7 @@ pub async fn vesting_undelegate_from_mixnode(args: Args, client: SigningClient) }; let res = client - .vesting_undelegate_from_mixnode(mix_id, None) + .vesting_undelegate_from_mixnode(mix_id, args.on_behalf_of, None) .await .expect("failed to remove stake from vesting account on mixnode!"); diff --git a/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs b/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs index 3e50448616..eff35b4c06 100644 --- a/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs +++ b/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs @@ -18,7 +18,8 @@ pub struct InitMsg { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct MigrateMsg { - pub v2_mixnet_contract_address: String, + // I'm making it explicit so that we wouldn't accidentally forget about it + pub manually_verified_no_staking_addresses: bool, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, Default)] @@ -96,9 +97,11 @@ pub enum ExecuteMsg { DelegateToMixnode { mix_id: MixId, amount: Coin, + on_behalf_of: Option, }, UndelegateFromMixnode { mix_id: MixId, + on_behalf_of: Option, }, CreateAccount { owner_address: String, diff --git a/contracts/vesting/src/contract.rs b/contracts/vesting/src/contract.rs index 48043b5451..73e3cd341f 100644 --- a/contracts/vesting/src/contract.rs +++ b/contracts/vesting/src/contract.rs @@ -1,5 +1,4 @@ use crate::errors::ContractError; -use crate::queued_migrations::migrate_to_v2_mixnet_contract; use crate::storage::{ account_from_address, save_account, BlockTimestampSecs, ACCOUNTS, ADMIN, DELEGATIONS, MIXNET_CONTRACT_ADDRESS, MIX_DENOM, @@ -10,7 +9,7 @@ use crate::traits::{ use crate::vesting::{populate_vesting_periods, Account}; use contracts_common::ContractBuildInformation; use cosmwasm_std::{ - coin, entry_point, to_binary, BankMsg, Coin, Deps, DepsMut, Env, MessageInfo, Order, + coin, entry_point, to_binary, Addr, BankMsg, Coin, Deps, DepsMut, Env, MessageInfo, Order, QueryResponse, Response, StdResult, Timestamp, Uint128, }; use cw_storage_plus::Bound; @@ -41,16 +40,28 @@ pub fn instantiate( info: MessageInfo, msg: InitMsg, ) -> Result { - //! ADMIN is set to the address that instantiated the contract - ADMIN.save(deps.storage, &info.sender.to_string())?; - MIXNET_CONTRACT_ADDRESS.save(deps.storage, &msg.mixnet_contract_address)?; + // validate the received mixnet contract address + let mixnet_contract_address = deps.api.addr_validate(&msg.mixnet_contract_address)?; + + // ADMIN is set to the address that instantiated the contract + ADMIN.save(deps.storage, &info.sender)?; + MIXNET_CONTRACT_ADDRESS.save(deps.storage, &mixnet_contract_address)?; MIX_DENOM.save(deps.storage, &msg.mix_denom)?; Ok(Response::default()) } #[entry_point] -pub fn migrate(deps: DepsMut<'_>, _env: Env, msg: MigrateMsg) -> Result { - migrate_to_v2_mixnet_contract(deps, msg) +pub fn migrate(_deps: DepsMut<'_>, _env: Env, msg: MigrateMsg) -> Result { + // we can't perform this check inside the migrate function since there are 12k addresses to check + // and this invariant MUST hold, otherwise we're gonna have bad time + if !msg.manually_verified_no_staking_addresses { + return Err(ContractError::Other { + message: + "the assumption that nobody has set a staking address hasn't been manually verified" + .to_string(), + }); + } + Ok(Response::new()) } #[entry_point] @@ -95,12 +106,15 @@ pub fn execute( ExecuteMsg::UpdateMixnetAddress { address } => { try_update_mixnet_address(address, info, deps) } - ExecuteMsg::DelegateToMixnode { mix_id, amount } => { - try_delegate_to_mixnode(mix_id, amount, info, env, deps) - } - ExecuteMsg::UndelegateFromMixnode { mix_id } => { - try_undelegate_from_mixnode(mix_id, info, deps) - } + ExecuteMsg::DelegateToMixnode { + mix_id, + amount, + on_behalf_of, + } => try_delegate_to_mixnode(mix_id, amount, on_behalf_of, info, env, deps), + ExecuteMsg::UndelegateFromMixnode { + mix_id, + on_behalf_of, + } => try_undelegate_from_mixnode(mix_id, on_behalf_of, info, deps), ExecuteMsg::CreateAccount { owner_address, staking_address, @@ -246,7 +260,9 @@ pub fn try_update_mixnet_address( if info.sender != ADMIN.load(deps.storage)? { return Err(ContractError::NotAdmin(info.sender.as_str().to_string())); } - MIXNET_CONTRACT_ADDRESS.save(deps.storage, &address)?; + let mixnet_contract_address = deps.api.addr_validate(&address)?; + + MIXNET_CONTRACT_ADDRESS.save(deps.storage, &mixnet_contract_address)?; Ok(Response::default()) } @@ -314,6 +330,13 @@ fn try_update_staking_address( info: MessageInfo, deps: DepsMut<'_>, ) -> Result { + if let Some(ref to_address) = to_address { + if account_from_address(to_address, deps.storage, deps.api).is_ok() { + // do not allow setting staking address to an existing account's address + return Err(ContractError::StakingAccountExists(to_address.to_string())); + } + } + let address = info.sender.clone(); let to_address = to_address.and_then(|x| deps.api.addr_validate(&x).ok()); let mut account = account_from_address(info.sender.as_str(), deps.storage, deps.api)?; @@ -455,13 +478,23 @@ fn try_track_undelegation( fn try_delegate_to_mixnode( mix_id: MixId, amount: Coin, + on_behalf_of: Option, info: MessageInfo, env: Env, deps: DepsMut<'_>, ) -> Result { let mix_denom = MIX_DENOM.load(deps.storage)?; let amount = validate_funds(&[amount], mix_denom)?; - let account = account_from_address(info.sender.as_str(), deps.storage, deps.api)?; + + let account = match on_behalf_of { + Some(account_owner) => { + let account = account_from_address(&account_owner, deps.storage, deps.api)?; + ensure_staking_permission(&info.sender, &account)?; + account + } + // you're the owner, you can do what you want + None => account_from_address(info.sender.as_str(), deps.storage, deps.api)?, + }; account.try_delegate_to_mixnode(mix_id, amount, &env, deps.storage) } @@ -489,10 +522,19 @@ fn try_claim_delegator_reward( /// Undelegates from a mixnode, sends [mixnet_contract_common::ExecuteMsg::UndelegateFromMixnodeOnBehalf] to [crate::storage::MIXNET_CONTRACT_ADDRESS]. fn try_undelegate_from_mixnode( mix_id: MixId, + on_behalf_of: Option, info: MessageInfo, deps: DepsMut<'_>, ) -> Result { - let account = account_from_address(info.sender.as_str(), deps.storage, deps.api)?; + let account = match on_behalf_of { + Some(account_owner) => { + let account = account_from_address(&account_owner, deps.storage, deps.api)?; + ensure_staking_permission(&info.sender, &account)?; + account + } + // you're the owner, you can do what you want + None => account_from_address(info.sender.as_str(), deps.storage, deps.api)?, + }; account.try_undelegate_from_mixnode(mix_id, deps.storage) } @@ -710,7 +752,9 @@ pub fn try_get_all_accounts( ) -> Result { let limit = limit.unwrap_or(150).min(250) as usize; - let start = start_after.map(Bound::exclusive); + let start = start_after + .map(|raw| deps.api.addr_validate(&raw).map(Bound::exclusive)) + .transpose()?; let accounts = ACCOUNTS .range(deps.storage, start, None, Order::Ascending) @@ -739,7 +783,9 @@ pub fn try_get_all_accounts_locked_coins( ) -> Result { let limit = limit.unwrap_or(150).min(250) as usize; - let start = start_after.map(Bound::exclusive); + let start = start_after + .map(|raw| deps.api.addr_validate(&raw).map(Bound::exclusive)) + .transpose()?; let accounts = ACCOUNTS .range(deps.storage, start, None, Order::Ascending) @@ -931,3 +977,15 @@ fn validate_funds(funds: &[Coin], mix_denom: String) -> Result Result<(), ContractError> { + if let Some(staking_address) = account.staking_address() { + if staking_address == addr { + return Ok(()); + } + } + Err(ContractError::InvalidStakingAccount { + address: addr.clone(), + for_account: account.owner_address(), + }) +} diff --git a/contracts/vesting/src/errors.rs b/contracts/vesting/src/errors.rs index 5244f4330d..822d30b1b5 100644 --- a/contracts/vesting/src/errors.rs +++ b/contracts/vesting/src/errors.rs @@ -6,50 +6,81 @@ use thiserror::Error; pub enum ContractError { #[error("VESTING ({}): {0}", line!())] Std(#[from] StdError), + #[error("VESTING ({}): Account does not exist - {0}", line!())] NoAccountForAddress(String), + #[error("VESTING ({}): Only admin can perform this action, {0} is not admin", line!())] NotAdmin(String), + #[error("VESTING ({}): Balance not found for existing account ({0}), this is a bug", line!())] NoBalanceForAddress(String), + #[error("VESTING ({}): Insufficient balance for address {0} -> {1}", line!())] InsufficientBalance(String, u128), + #[error("VESTING ({}): Insufficient spendable balance for address {0} -> {1}", line!())] InsufficientSpendable(String, u128), + #[error( "VESTING ({}):Only delegation owner can perform delegation actions, {0} is not the delegation owner" , line!())] NotDelegate(String), + #[error("VESTING ({}): Total vesting amount is inprobably low -> {0}, this is likely an error", line!())] ImprobableVestingAmount(u128), + #[error("VESTING ({}): Address {0} has already bonded a node", line!())] AlreadyBonded(String), + #[error("VESTING ({}): Received empty funds vector", line!())] EmptyFunds, + #[error("VESTING ({}): Received wrong denom: {0}, expected {1}", line!())] WrongDenom(String, String), + #[error("VESTING ({}): Received multiple denoms, expected 1", line!())] MultipleDenoms, + #[error("VESTING ({}): No delegations found for account {0}, mix_identity {1}", line!())] NoSuchDelegation(Addr, MixId), + #[error("VESTING ({}): Only mixnet contract can perform this operation, got {0}", line!())] NotMixnetContract(Addr), + #[error("VESTING ({}): Calculation underflowed", line!())] Underflow, + #[error("VESTING ({}): No bond found for account {0}", line!())] NoBondFound(String), + #[error("VESTING ({}): Action can only be executed by account owner -> {0}", line!())] NotOwner(String), + #[error("VESTING ({}): Invalid address: {0}", line!())] InvalidAddress(String), + #[error("VESTING ({}): Account already exists: {0}", line!())] AccountAlreadyExists(String), + #[error("VESTING ({}): Staking account already exists: {0}", line!())] StakingAccountAlreadyExists(String), + #[error("VESTING ({}): Too few coins sent for vesting account creation, sent {sent}, need at least {need}", line!())] MinVestingFunds { sent: u128, need: u128 }, + #[error("VESTING ({}): Maximum amount of locked coins has already been pledged: {current}, cap is {cap}", line!())] LockedPledgeCapReached { current: Uint128, cap: Uint128 }, + #[error("VESTING: ({}: Account owned by {owner} has unpopulated vesting periods!", line!())] UnpopulatedVestingPeriods { owner: Addr }, + + #[error("VESTING: Vesting account associated with {0} already exists, only addresses with not existing vesting accounts can be added as staking addresses")] + StakingAccountExists(String), + + #[error("VESTING: {address} is not permitted to perform staking on behalf of {for_account}")] + InvalidStakingAccount { address: Addr, for_account: Addr }, + + #[error("VESTING: {message}")] + Other { message: String }, } diff --git a/contracts/vesting/src/queued_migrations.rs b/contracts/vesting/src/queued_migrations.rs index 9bb44331a1..87d5c392c8 100644 --- a/contracts/vesting/src/queued_migrations.rs +++ b/contracts/vesting/src/queued_migrations.rs @@ -1,15 +1,2 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 - -use crate::errors::ContractError; -use crate::storage::MIXNET_CONTRACT_ADDRESS; -use cosmwasm_std::{DepsMut, Response}; -use vesting_contract_common::MigrateMsg; - -pub fn migrate_to_v2_mixnet_contract( - deps: DepsMut<'_>, - msg: MigrateMsg, -) -> Result { - MIXNET_CONTRACT_ADDRESS.save(deps.storage, &msg.v2_mixnet_contract_address)?; - Ok(Response::new()) -} diff --git a/contracts/vesting/src/storage.rs b/contracts/vesting/src/storage.rs index 2776baf847..a0b5b36ac7 100644 --- a/contracts/vesting/src/storage.rs +++ b/contracts/vesting/src/storage.rs @@ -6,23 +6,52 @@ use mixnet_contract_common::{IdentityKey, MixId}; use vesting_contract_common::PledgeData; pub(crate) type BlockTimestampSecs = u64; +pub(crate) type AccountStorageKey = u32; -pub const KEY: Item<'_, u32> = Item::new("key"); -pub const ACCOUNTS: Map<'_, String, Account> = Map::new("acc"); -// Holds data related to individual accounts -const BALANCES: Map<'_, u32, Uint128> = Map::new("blc"); -const WITHDRAWNS: Map<'_, u32, Uint128> = Map::new("wthd"); -const BOND_PLEDGES: Map<'_, u32, PledgeData> = Map::new("bnd"); -const GATEWAY_PLEDGES: Map<'_, u32, PledgeData> = Map::new("gtw"); -pub const _OLD_DELEGATIONS: Map<'_, (u32, IdentityKey, BlockTimestampSecs), Uint128> = +/// Counter for the unique, monotonically increasing storage key id for the vesting account data. +pub const KEY: Item<'_, AccountStorageKey> = Item::new("key"); + +/// Storage map containing vesting account information associated with particular owner address. +pub const ACCOUNTS: Map<'_, Addr, Account> = Map::new("acc"); + +/// Storage map containing information about amount of tokens associated with particular vesting account +/// that are currently present in the contract (and have not been withdrawn or staked in the mixnet contract) +// note: this assumes I understood the intent behind this correctly +const BALANCES: Map<'_, AccountStorageKey, Uint128> = Map::new("blc"); + +/// Storage map containing information about amount of tokens withdrawn from the contract by a particular vesting account. +const WITHDRAWNS: Map<'_, AccountStorageKey, Uint128> = Map::new("wthd"); + +/// Storage map containing information about amount of tokens pledged towards bonding mixnodes +/// in the mixnet contract using a particular vesting account. +const BOND_PLEDGES: Map<'_, AccountStorageKey, PledgeData> = Map::new("bnd"); + +/// Storage map containing information about amount of tokens pledged towards bonding gateways +/// in the mixnet contract using a particular vesting account. +const GATEWAY_PLEDGES: Map<'_, AccountStorageKey, PledgeData> = Map::new("gtw"); + +/// Old, pre-v2 migration, storage map that used to contain information about tokens delegated +/// towards particular mixnodes in the mixnet contract with given vesting account. +/// It should be completely empty. +pub const _OLD_DELEGATIONS: Map<'_, (AccountStorageKey, IdentityKey, BlockTimestampSecs), Uint128> = Map::new("dlg"); -pub const DELEGATIONS: Map<'_, (u32, MixId, BlockTimestampSecs), Uint128> = Map::new("dlg_v2"); -pub const ADMIN: Item<'_, String> = Item::new("adm"); -pub const MIXNET_CONTRACT_ADDRESS: Item<'_, String> = Item::new("mix"); + +/// Storage map containing information about tokens delegated towards particular mixnodes +/// in the mixnet contract with given vesting account. +pub const DELEGATIONS: Map<'_, (AccountStorageKey, MixId, BlockTimestampSecs), Uint128> = + Map::new("dlg_v2"); + +/// Explicit contract admin that is allowed, among other things, to create new vesting accounts. +pub const ADMIN: Item<'_, Addr> = Item::new("adm"); + +/// Address of the mixnet contract. +pub const MIXNET_CONTRACT_ADDRESS: Item<'_, Addr> = Item::new("mix"); + +/// The denomination of coin used for staking. pub const MIX_DENOM: Item<'_, String> = Item::new("den"); pub fn save_delegation( - key: (u32, MixId, BlockTimestampSecs), + key: (AccountStorageKey, MixId, BlockTimestampSecs), amount: Uint128, storage: &mut dyn Storage, ) -> Result<(), ContractError> { @@ -31,26 +60,27 @@ pub fn save_delegation( } pub fn remove_delegation( - key: (u32, MixId, BlockTimestampSecs), + key: (AccountStorageKey, MixId, BlockTimestampSecs), storage: &mut dyn Storage, ) -> Result<(), ContractError> { DELEGATIONS.remove(storage, key); Ok(()) } -pub fn delete_account(address: &Addr, storage: &mut dyn Storage) -> Result<(), ContractError> { - ACCOUNTS.remove(storage, address.to_owned().to_string()); - Ok(()) -} - -pub fn load_withdrawn(key: u32, storage: &dyn Storage) -> Result { +pub fn load_withdrawn( + key: AccountStorageKey, + storage: &dyn Storage, +) -> Result { Ok(WITHDRAWNS .may_load(storage, key) .unwrap_or(None) .unwrap_or_else(Uint128::zero)) } -pub fn load_balance(key: u32, storage: &dyn Storage) -> Result { +pub fn load_balance( + key: AccountStorageKey, + storage: &dyn Storage, +) -> Result { Ok(BALANCES .may_load(storage, key) .unwrap_or(None) @@ -58,7 +88,7 @@ pub fn load_balance(key: u32, storage: &dyn Storage) -> Result Result<(), ContractError> { @@ -67,7 +97,7 @@ pub fn save_balance( } pub fn save_withdrawn( - key: u32, + key: AccountStorageKey, value: Uint128, storage: &mut dyn Storage, ) -> Result<(), ContractError> { @@ -76,19 +106,22 @@ pub fn save_withdrawn( } pub fn load_bond_pledge( - key: u32, + key: AccountStorageKey, storage: &dyn Storage, ) -> Result, ContractError> { Ok(BOND_PLEDGES.may_load(storage, key).unwrap_or(None)) } -pub fn remove_bond_pledge(key: u32, storage: &mut dyn Storage) -> Result<(), ContractError> { +pub fn remove_bond_pledge( + key: AccountStorageKey, + storage: &mut dyn Storage, +) -> Result<(), ContractError> { BOND_PLEDGES.remove(storage, key); Ok(()) } pub fn save_bond_pledge( - key: u32, + key: AccountStorageKey, value: &PledgeData, storage: &mut dyn Storage, ) -> Result<(), ContractError> { @@ -97,14 +130,14 @@ pub fn save_bond_pledge( } pub fn load_gateway_pledge( - key: u32, + key: AccountStorageKey, storage: &dyn Storage, ) -> Result, ContractError> { Ok(GATEWAY_PLEDGES.may_load(storage, key).unwrap_or(None)) } pub fn save_gateway_pledge( - key: u32, + key: AccountStorageKey, value: &PledgeData, storage: &mut dyn Storage, ) -> Result<(), ContractError> { @@ -112,32 +145,34 @@ pub fn save_gateway_pledge( Ok(()) } -pub fn remove_gateway_pledge(key: u32, storage: &mut dyn Storage) -> Result<(), ContractError> { +pub fn remove_gateway_pledge( + key: AccountStorageKey, + storage: &mut dyn Storage, +) -> Result<(), ContractError> { GATEWAY_PLEDGES.remove(storage, key); Ok(()) } pub fn save_account(account: &Account, storage: &mut dyn Storage) -> Result<(), ContractError> { - // This is a bit dirty, but its a simple way to allow for both staking account and owner to load it from storage - if let Some(staking_address) = account.staking_address() { - ACCOUNTS.save(storage, staking_address.to_owned().to_string(), account)?; - } - ACCOUNTS.save(storage, account.owner_address().to_string(), account)?; + ACCOUNTS.save(storage, account.owner_address(), account)?; Ok(()) } pub fn load_account( - address: &Addr, + address: Addr, storage: &dyn Storage, ) -> Result, ContractError> { - Ok(ACCOUNTS - .may_load(storage, address.to_owned().to_string()) - .unwrap_or(None)) + Ok(ACCOUNTS.may_load(storage, address).unwrap_or(None)) } -fn validate_account(address: &Addr, storage: &dyn Storage) -> Result { - load_account(address, storage)? - .ok_or_else(|| ContractError::NoAccountForAddress(address.as_str().to_string())) +pub fn delete_account(address: Addr, storage: &mut dyn Storage) -> Result<(), ContractError> { + ACCOUNTS.remove(storage, address); + Ok(()) +} + +fn validate_account(address: Addr, storage: &dyn Storage) -> Result { + load_account(address.clone(), storage)? + .ok_or_else(|| ContractError::NoAccountForAddress(address.into_string())) } pub fn account_from_address( @@ -145,5 +180,5 @@ pub fn account_from_address( storage: &dyn Storage, api: &dyn Api, ) -> Result { - validate_account(&api.addr_validate(address)?, storage) + validate_account(api.addr_validate(address)?, storage) } diff --git a/contracts/vesting/src/vesting/account/mod.rs b/contracts/vesting/src/vesting/account/mod.rs index a368431689..7ba2ec0251 100644 --- a/contracts/vesting/src/vesting/account/mod.rs +++ b/contracts/vesting/src/vesting/account/mod.rs @@ -3,7 +3,7 @@ use crate::errors::ContractError; use crate::storage::{ load_balance, load_bond_pledge, load_gateway_pledge, load_withdrawn, remove_bond_pledge, remove_delegation, remove_gateway_pledge, save_account, save_balance, save_bond_pledge, - save_gateway_pledge, save_withdrawn, BlockTimestampSecs, DELEGATIONS, KEY, + save_gateway_pledge, save_withdrawn, AccountStorageKey, BlockTimestampSecs, DELEGATIONS, KEY, }; use crate::traits::VestingAccount; use cosmwasm_std::{Addr, Coin, Order, Storage, Timestamp, Uint128}; @@ -19,7 +19,7 @@ mod mixnode_bonding_account; mod node_families; mod vesting_account; -fn generate_storage_key(storage: &mut dyn Storage) -> Result { +fn generate_storage_key(storage: &mut dyn Storage) -> Result { let key = KEY.may_load(storage)?.unwrap_or(0) + 1; KEY.save(storage, &key)?; Ok(key) @@ -32,7 +32,7 @@ pub struct Account { pub start_time: Timestamp, pub periods: Vec, pub coin: Coin, - storage_key: u32, + storage_key: AccountStorageKey, #[serde(default)] pub pledge_cap: Option, } diff --git a/contracts/vesting/src/vesting/account/vesting_account.rs b/contracts/vesting/src/vesting/account/vesting_account.rs index 97c02c0214..e015fd1352 100644 --- a/contracts/vesting/src/vesting/account/vesting_account.rs +++ b/contracts/vesting/src/vesting/account/vesting_account.rs @@ -233,7 +233,7 @@ impl VestingAccount for Account { to_address: &Addr, storage: &mut dyn Storage, ) -> Result<(), ContractError> { - delete_account(&self.owner_address(), storage)?; + delete_account(self.owner_address(), storage)?; self.owner_address = to_address.to_owned(); save_account(self, storage)?; Ok(()) @@ -245,7 +245,7 @@ impl VestingAccount for Account { storage: &mut dyn Storage, ) -> Result<(), ContractError> { if let Some(staking_address) = self.staking_address() { - delete_account(staking_address, storage)?; + delete_account(staking_address.to_owned(), storage)?; } self.staking_address = to_address; save_account(self, storage)?; diff --git a/contracts/vesting/src/vesting/mod.rs b/contracts/vesting/src/vesting/mod.rs index 3eb6134e4e..4f9c5efbfa 100644 --- a/contracts/vesting/src/vesting/mod.rs +++ b/contracts/vesting/src/vesting/mod.rs @@ -37,6 +37,7 @@ pub fn populate_vesting_periods( #[cfg(test)] mod tests { use crate::contract::*; + use crate::errors::ContractError; use crate::storage::*; use crate::support::tests::helpers::vesting_account_percent_fixture; use crate::support::tests::helpers::{ @@ -47,7 +48,7 @@ mod tests { use crate::traits::{GatewayBondingAccount, MixnodeBondingAccount}; use crate::vesting::{populate_vesting_periods, Account}; use cosmwasm_std::testing::{mock_env, mock_info}; - use cosmwasm_std::{coins, Addr, Coin, Timestamp, Uint128}; + use cosmwasm_std::{coin, coins, Addr, Coin, Timestamp, Uint128}; use mixnet_contract_common::mixnode::MixNodeCostParams; use mixnet_contract_common::{Gateway, MixNode, Percent}; use vesting_contract_common::messages::{ExecuteMsg, VestingSpecification}; @@ -71,21 +72,44 @@ mod tests { let info = mock_info("admin", &coins(1_000_000_000_000, TEST_COIN_DENOM)); let _response = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - let created_account = load_account(&Addr::unchecked("owner"), &deps.storage) + let created_account = load_account(Addr::unchecked("owner"), &deps.storage) .unwrap() .unwrap(); - let created_account_test_by_staking = - load_account(&Addr::unchecked("staking"), &deps.storage) - .unwrap() - .unwrap(); - assert_eq!(created_account_test_by_staking, created_account); + assert_eq!( created_account.load_balance(&deps.storage).unwrap(), // One was liquidated Uint128::new(1_000_000_000_000) ); + + // nothing is saved for "staking" account! + let created_account_test_by_staking = + load_account(Addr::unchecked("staking"), &deps.storage).unwrap(); + assert!(created_account_test_by_staking.is_none()); + + // but we can stake on its behalf! + let stake_msg = ExecuteMsg::DelegateToMixnode { + on_behalf_of: Some("owner".to_string()), + mix_id: 42, + amount: coin(500, TEST_COIN_DENOM), + }; + + let response = execute( + deps.as_mut(), + env.clone(), + mock_info("staking", &[]), + stake_msg, + ); + assert!(response.is_ok()); + + assert_eq!( + created_account.load_balance(&deps.storage).unwrap(), + // One was liquidated + Uint128::new(999_999_999_500) + ); + // Try create the same account again - let _response = execute(deps.as_mut(), env.clone(), info, msg.clone()); + let response = execute(deps.as_mut(), env.clone(), info, msg); assert!(response.is_err()); let account_again = vesting_account_new_fixture(&mut deps.storage, &env); @@ -99,11 +123,12 @@ mod tests { let mut env = mock_env(); let info = mock_info("owner", &[]); let account = vesting_account_new_fixture(&mut deps.storage, &env); + let staker = account.staking_address().unwrap(); let msg = ExecuteMsg::TransferOwnership { to_address: "new_owner".to_string(), }; let _response = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()).unwrap(); - let new_owner_account = load_account(&Addr::unchecked("new_owner"), &deps.storage) + let new_owner_account = load_account(Addr::unchecked("new_owner"), &deps.storage) .unwrap() .unwrap(); assert_eq!( @@ -112,25 +137,45 @@ mod tests { ); // Check old account is gone - let old_owner_account = load_account(&Addr::unchecked("owner"), &deps.storage).unwrap(); + let old_owner_account = load_account(Addr::unchecked("owner"), &deps.storage).unwrap(); assert!(old_owner_account.is_none()); // Not the owner let response = execute(deps.as_mut(), env.clone(), info.clone(), msg); assert!(response.is_err()); + // can't stake on behalf of the original owner anymore, but we can do it for the new one! + let stake_msg = ExecuteMsg::DelegateToMixnode { + on_behalf_of: Some("owner".to_string()), + mix_id: 42, + amount: coin(500, TEST_COIN_DENOM), + }; + let response = execute( + deps.as_mut(), + env.clone(), + mock_info(staker.as_ref(), &[]), + stake_msg, + ); + assert!(response.is_err()); + + let new_stake_msg = ExecuteMsg::DelegateToMixnode { + on_behalf_of: Some("new_owner".to_string()), + mix_id: 42, + amount: coin(500, TEST_COIN_DENOM), + }; + let response = execute( + deps.as_mut(), + env.clone(), + mock_info(staker.as_ref(), &[]), + new_stake_msg, + ); + assert!(response.is_ok()); + let info = mock_info("new_owner", &[]); let msg = ExecuteMsg::UpdateStakingAddress { to_address: Some("new_staking".to_string()), }; let _response = execute(deps.as_mut(), env.clone(), info, msg).unwrap(); - let new_staking_account = load_account(&Addr::unchecked("new_staking"), &deps.storage) - .unwrap() - .unwrap(); - assert_eq!(new_staking_account.owner_address(), "new_owner".to_string()); - - let old_staking_account = load_account(&Addr::unchecked("staking"), &deps.storage).unwrap(); - assert!(old_staking_account.is_none()); let msg = ExecuteMsg::WithdrawVestedCoins { amount: Coin { @@ -172,6 +217,117 @@ mod tests { assert!(response.is_err()); } + #[test] + fn test_staking_address_change() { + let mut deps = init_contract(); + let env = mock_env(); + let account = vesting_account_new_fixture(&mut deps.storage, &env); + let original_staker = account.staking_address().unwrap(); + + // can stake on behalf without an issue + let stake_msg = ExecuteMsg::DelegateToMixnode { + on_behalf_of: Some("owner".to_string()), + mix_id: 42, + amount: coin(500, TEST_COIN_DENOM), + }; + let response = execute( + deps.as_mut(), + env.clone(), + mock_info(original_staker.as_ref(), &[]), + stake_msg.clone(), + ); + assert!(response.is_ok()); + + let info = mock_info("owner", &[]); + let msg = ExecuteMsg::UpdateStakingAddress { + to_address: Some("new_staking".to_string()), + }; + let _response = execute(deps.as_mut(), env.clone(), info, msg).unwrap(); + + // the old staking account can't do any staking anymore! + let response = execute( + deps.as_mut(), + env.clone(), + mock_info(original_staker.as_ref(), &[]), + stake_msg.clone(), + ); + assert!(response.is_err()); + + // but the new one can + let response = execute( + deps.as_mut(), + env.clone(), + mock_info("new_staking", &[]), + stake_msg, + ); + assert!(response.is_ok()); + } + + #[test] + fn test_staking_account_transfer() { + let mut deps = init_contract(); + let env = mock_env(); + + let amount1 = coin(1000000000, "unym"); + let amount2 = coin(100, "unym"); + + // create the accounts + let msg1 = ExecuteMsg::CreateAccount { + owner_address: "vesting1".to_string(), + staking_address: None, + vesting_spec: None, + cap: None, + }; + let res1 = execute( + deps.as_mut(), + env.clone(), + mock_info("admin", &[amount1.clone()]), + msg1, + ); + assert!(res1.is_ok()); + + let msg2 = ExecuteMsg::CreateAccount { + owner_address: "vesting2".to_string(), + staking_address: None, + vesting_spec: None, + cap: None, + }; + let res2 = execute( + deps.as_mut(), + env.clone(), + mock_info("admin", &[amount2.clone()]), + msg2, + ); + assert!(res2.is_ok()); + + let vesting1 = try_get_vesting_coins("vesting1", None, env.clone(), deps.as_ref()).unwrap(); + assert_eq!(vesting1, amount1); + + let vesting2 = try_get_vesting_coins("vesting2", None, env.clone(), deps.as_ref()).unwrap(); + assert_eq!(vesting2, amount2); + + let staking_address_change = ExecuteMsg::UpdateStakingAddress { + to_address: Some("vesting1".to_string()), + }; + let res = execute( + deps.as_mut(), + env.clone(), + mock_info("vesting2", &[]), + staking_address_change, + ); + assert_eq!( + Err(ContractError::StakingAccountExists("vesting1".to_string())), + res + ); + + // ensure nothing has changed! + let vesting1 = try_get_vesting_coins("vesting1", None, env.clone(), deps.as_ref()).unwrap(); + assert_eq!(vesting1, amount1); + + let vesting2 = try_get_vesting_coins("vesting2", None, env, deps.as_ref()).unwrap(); + assert_eq!(vesting2, amount2); + } + #[test] fn test_period_logic() { let mut deps = init_contract(); @@ -461,7 +617,7 @@ mod tests { let info = mock_info("admin", &coins(1_000_000_000_000, TEST_COIN_DENOM)); let _response = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - let account = load_account(&Addr::unchecked("owner"), &deps.storage) + let account = load_account(Addr::unchecked("owner"), &deps.storage) .unwrap() .unwrap(); @@ -518,7 +674,7 @@ mod tests { let total_delegations = account.total_delegations_for_mix(1, &deps.storage).unwrap(); assert_eq!(Uint128::new(90_000_000_000), total_delegations); - let account = load_account(&Addr::unchecked("owner"), &deps.storage) + let account = load_account(Addr::unchecked("owner"), &deps.storage) .unwrap() .unwrap(); diff --git a/nym-wallet/src-tauri/src/operations/simulate/vesting.rs b/nym-wallet/src-tauri/src/operations/simulate/vesting.rs index aff0d9b4c5..d34c2d6fcf 100644 --- a/nym-wallet/src-tauri/src/operations/simulate/vesting.rs +++ b/nym-wallet/src-tauri/src/operations/simulate/vesting.rs @@ -151,7 +151,11 @@ pub async fn simulate_vesting_delegate_to_mixnode( let amount = guard.attempt_convert_to_base_coin(amount)?.into(); simulate_vesting_operation( - ExecuteMsg::DelegateToMixnode { mix_id, amount }, + ExecuteMsg::DelegateToMixnode { + on_behalf_of: None, + mix_id, + amount, + }, None, &state, ) @@ -163,7 +167,15 @@ pub async fn simulate_vesting_undelegate_from_mixnode( mix_id: MixId, state: tauri::State<'_, WalletState>, ) -> Result { - simulate_vesting_operation(ExecuteMsg::UndelegateFromMixnode { mix_id }, None, &state).await + simulate_vesting_operation( + ExecuteMsg::UndelegateFromMixnode { + on_behalf_of: None, + mix_id, + }, + None, + &state, + ) + .await } #[tauri::command] diff --git a/nym-wallet/src-tauri/src/operations/vesting/delegate.rs b/nym-wallet/src-tauri/src/operations/vesting/delegate.rs index 0b3620b129..66498eb9ad 100644 --- a/nym-wallet/src-tauri/src/operations/vesting/delegate.rs +++ b/nym-wallet/src-tauri/src/operations/vesting/delegate.rs @@ -29,7 +29,7 @@ pub async fn vesting_delegate_to_mixnode( let res = guard .current_client()? .nyxd - .vesting_delegate_to_mixnode(mix_id, delegation, fee) + .vesting_delegate_to_mixnode(mix_id, delegation, None, fee) .await?; log::info!("<<< tx hash = {}", res.transaction_hash); log::trace!("<<< {:?}", res); @@ -54,7 +54,7 @@ pub async fn vesting_undelegate_from_mixnode( let res = guard .current_client()? .nyxd - .vesting_undelegate_from_mixnode(mix_id, fee) + .vesting_undelegate_from_mixnode(mix_id, None, fee) .await?; log::info!("<<< tx hash = {}", res.transaction_hash); log::trace!("<<< {:?}", res); From 74a4546d72631122444983a06bc6a1e59379c576 Mon Sep 17 00:00:00 2001 From: Mark Sinclair Date: Tue, 10 Jan 2023 18:25:42 +0000 Subject: [PATCH 149/591] GitHub Actions: post messages to another channel on job failures --- .github/workflows/support-files/.env.example | 1 + .github/workflows/support-files/notifications/send_message.js | 4 ++++ .../support-files/notifications/send_message_to_matrix.js | 1 - 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/support-files/.env.example b/.github/workflows/support-files/.env.example index 82e3526223..df05f1801c 100644 --- a/.github/workflows/support-files/.env.example +++ b/.github/workflows/support-files/.env.example @@ -4,6 +4,7 @@ KEYBASE_NYMBOT_PAPERKEY= MATRIX_SERVER= MATRIX_ROOM= +MATRIX_ROOM_OF_SHAME= MATRIX_USER_ID= MATRIX_TOKEN= MATRIX_DEVICE_ID= diff --git a/.github/workflows/support-files/notifications/send_message.js b/.github/workflows/support-files/notifications/send_message.js index 4a6c0fb6af..c83a43d88a 100644 --- a/.github/workflows/support-files/notifications/send_message.js +++ b/.github/workflows/support-files/notifications/send_message.js @@ -173,6 +173,10 @@ async function main() { if(context.env.MATRIX_ROOM) { await sendMatrixMessage(context, messageBody, context.env.MATRIX_ROOM) } + if(context.env.MATRIX_ROOM_OF_SHAME && context.env.IS_SUCCESS !== 'true') { + // when a job fails + await sendMatrixMessage(context, messageBody, context.env.MATRIX_ROOM_OF_SHAME) + } } // call main function and let NodeJS handle the promise diff --git a/.github/workflows/support-files/notifications/send_message_to_matrix.js b/.github/workflows/support-files/notifications/send_message_to_matrix.js index 85f1849b93..6b21b56184 100644 --- a/.github/workflows/support-files/notifications/send_message_to_matrix.js +++ b/.github/workflows/support-files/notifications/send_message_to_matrix.js @@ -65,7 +65,6 @@ async function markdownToHtml(messageAsMarkdown) { .use(remarkParse) .use(remarkHtml) .process(await vfile({ path: 'test.md', contents: messageAsMarkdown})); - console.log({file}); return String(file); } From df3d478caa7d38658cb631005d7fa9ecdf530460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 10 Jan 2023 23:28:26 +0100 Subject: [PATCH 150/591] rust-sdk: make new_from_dir return result --- Cargo.lock | 31 +++++++++++++++-------- sdk/rust/nym-sdk/examples/persist_keys.rs | 2 +- sdk/rust/nym-sdk/src/error.rs | 6 +++++ sdk/rust/nym-sdk/src/mixnet/paths.rs | 13 +++++++--- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5e6151786..eaa4d1aad9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -686,7 +686,7 @@ dependencies = [ [[package]] name = "client-core" -version = "1.1.4" +version = "1.1.5" dependencies = [ "async-trait", "client-connections", @@ -1788,7 +1788,7 @@ dependencies = [ [[package]] name = "explorer-api" -version = "1.1.1" +version = "1.1.2" dependencies = [ "chrono", "clap 4.0.26", @@ -2085,6 +2085,7 @@ dependencies = [ "nymsphinx", "pemstore", "rand 0.7.3", + "serde", "task", "thiserror", "tokio", @@ -3233,7 +3234,7 @@ dependencies = [ [[package]] name = "nym-api" -version = "1.1.4" +version = "1.1.5" dependencies = [ "anyhow", "async-trait", @@ -3329,7 +3330,7 @@ dependencies = [ [[package]] name = "nym-cli" -version = "1.1.4" +version = "1.1.5" dependencies = [ "anyhow", "base64", @@ -3360,14 +3361,18 @@ dependencies = [ "bs58", "cfg-if 1.0.0", "clap 4.0.26", + "coconut-bandwidth-contract-common", + "coconut-dkg-common", "comfy-table", "cosmrs", "cosmwasm-std", + "cw-utils", "handlebars", "humantime-serde", "k256", "log", "mixnet-contract-common", + "multisig-contract-common", "network-defaults", "rand 0.6.5", "serde", @@ -3383,7 +3388,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "1.1.4" +version = "1.1.5" dependencies = [ "build-information", "clap 4.0.26", @@ -3423,10 +3428,11 @@ dependencies = [ [[package]] name = "nym-gateway" -version = "1.1.4" +version = "1.1.5" dependencies = [ "anyhow", "async-trait", + "atty", "bip39", "bs58", "build-information", @@ -3450,12 +3456,14 @@ dependencies = [ "mixnode-common", "network-defaults", "nym-api-requests", + "nym-types", "nymsphinx", "once_cell", "pemstore", "pretty_env_logger", "rand 0.7.3", "serde", + "serde_json", "sqlx 0.5.11", "statistics-common", "subtle-encoding", @@ -3471,9 +3479,10 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.4" +version = "1.1.5" dependencies = [ "anyhow", + "atty", "bs58", "build-information", "clap 4.0.26", @@ -3492,6 +3501,7 @@ dependencies = [ "mixnet-client", "mixnode-common", "nonexhaustive-delayqueue", + "nym-types", "nymsphinx", "nymsphinx-params", "nymsphinx-types", @@ -3500,6 +3510,7 @@ dependencies = [ "rand 0.7.3", "rocket", "serde", + "serde_json", "sysinfo", "task", "tokio", @@ -3513,7 +3524,7 @@ dependencies = [ [[package]] name = "nym-network-requester" -version = "1.1.4" +version = "1.1.5" dependencies = [ "async-trait", "clap 4.0.26", @@ -3545,7 +3556,7 @@ dependencies = [ [[package]] name = "nym-network-statistics" -version = "1.1.4" +version = "1.1.5" dependencies = [ "dirs", "log", @@ -3601,7 +3612,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.4" +version = "1.1.5" dependencies = [ "build-information", "clap 4.0.26", diff --git a/sdk/rust/nym-sdk/examples/persist_keys.rs b/sdk/rust/nym-sdk/examples/persist_keys.rs index 0e88293764..8cf0567edc 100644 --- a/sdk/rust/nym-sdk/examples/persist_keys.rs +++ b/sdk/rust/nym-sdk/examples/persist_keys.rs @@ -11,7 +11,7 @@ async fn main() { // Setting `KeyMode::Keep` will use existing keys, and existing config, if there is one. // Regardles of `user_chosen_gateway`. - let keys = mixnet::StoragePaths::new_from_dir(mixnet::KeyMode::Keep, &config_dir); + let keys = mixnet::StoragePaths::new_from_dir(mixnet::KeyMode::Keep, &config_dir).unwrap(); // Provide key paths for the client to read/write keys to. let client = mixnet::ClientBuilder::new(None, Some(keys)).unwrap(); diff --git a/sdk/rust/nym-sdk/src/error.rs b/sdk/rust/nym-sdk/src/error.rs index 18e5718e13..77f6c1492c 100644 --- a/sdk/rust/nym-sdk/src/error.rs +++ b/sdk/rust/nym-sdk/src/error.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + #[derive(Debug, thiserror::Error)] pub enum Error { #[error("i/o error: {0}")] @@ -8,12 +10,16 @@ pub enum Error { TomlDeserializationError(#[from] toml::de::Error), #[error(transparent)] ClientCoreError(#[from] client_core::error::ClientCoreError), + #[error("key file encountered that we don't want to overwrite")] DontOverwrite, #[error("shared gateway key file encountered that we don't want to overwrite")] DontOverwriteGatewayKey, #[error("no gateway config available for writing")] GatewayNotAvailableForWriting, + + #[error("expected to received a directory, received: {0}")] + ExpectedDirectory(PathBuf), } pub type Result = std::result::Result; diff --git a/sdk/rust/nym-sdk/src/mixnet/paths.rs b/sdk/rust/nym-sdk/src/mixnet/paths.rs index 7a824ecce4..ad66f7bbcd 100644 --- a/sdk/rust/nym-sdk/src/mixnet/paths.rs +++ b/sdk/rust/nym-sdk/src/mixnet/paths.rs @@ -1,6 +1,8 @@ use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder; use std::path::{Path, PathBuf}; +use crate::error::{Error, Result}; + #[derive(Clone, Debug)] pub enum KeyMode { /// Use existing key files if they exists, otherwise create new ones. @@ -58,9 +60,12 @@ pub struct StoragePaths { } impl StoragePaths { - pub fn new_from_dir(operating_mode: KeyMode, dir: &Path) -> Self { - assert!(!dir.is_file(), "WIP"); - Self { + pub fn new_from_dir(operating_mode: KeyMode, dir: &Path) -> Result { + if !dir.is_file() { + return Err(Error::ExpectedDirectory(dir.to_owned())) + } + + Ok(Self { // These filenames were chosen to match the ones we use in `nym-client`. Consider // changing the defaults operating_mode, @@ -73,7 +78,7 @@ impl StoragePaths { gateway_endpoint_config: dir.join("gateway_endpoint_config.toml"), credential_database_path: dir.join("db.sqlite"), reply_surb_database_path: dir.join("persistent_reply_store.sqlite"), - } + }) } } From 87fad25ac3c0d20dba5e3a82242a909637ce45cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 11 Jan 2023 00:13:28 +0100 Subject: [PATCH 151/591] rust-sdk: implement manualy set/get keys --- .../client-core/src/client/base_client/mod.rs | 2 +- clients/client-core/src/client/key_manager.rs | 43 +++++++++++++------ .../manually_handle_keys_and_config.rs | 6 +-- sdk/rust/nym-sdk/src/mixnet.rs | 2 +- sdk/rust/nym-sdk/src/mixnet/client.rs | 26 +++++++---- sdk/rust/nym-sdk/src/mixnet/keys.rs | 31 +++++++++++++ sdk/rust/nym-sdk/src/mixnet/paths.rs | 2 +- 7 files changed, 83 insertions(+), 29 deletions(-) diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index cfa0c36da9..25556c6240 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -297,7 +297,7 @@ where .map_err(ClientCoreError::UnableToCreatePublicKeyFromGatewayId)?; // disgusting wasm workaround since there's no key persistence there (nor `client init`) - let shared_key = if self.key_manager.gateway_key_set() { + let shared_key = if self.key_manager.is_gateway_key_set() { Some(self.key_manager.gateway_shared_key()) } else { None diff --git a/clients/client-core/src/client/key_manager.rs b/clients/client-core/src/client/key_manager.rs index 83c9ba61f2..779df52cf7 100644 --- a/clients/client-core/src/client/key_manager.rs +++ b/clients/client-core/src/client/key_manager.rs @@ -72,14 +72,6 @@ impl KeyManager { } } - // this is actually **NOT** dead code - // I have absolutely no idea why the compiler insists it's unused. The call happens during client::init::execute - #[allow(dead_code)] - /// After shared key with the gateway is derived, puts its ownership to this instance of a [`KeyManager`]. - pub fn insert_gateway_shared_key(&mut self, gateway_shared_key: Arc) { - self.gateway_shared_key = Some(gateway_shared_key) - } - /// Loads previously stored client keys from the disk. fn load_client_keys(client_pathfinder: &ClientKeyPathfinder) -> io::Result { let identity_keypair: identity::KeyPair = @@ -189,16 +181,44 @@ impl KeyManager { Ok(()) } + /// Overwrite the existing identity keypair + pub fn set_identity_keypair(&mut self, id_keypair: identity::KeyPair) { + self.identity_keypair = Arc::new(id_keypair); + } + /// Gets an atomically reference counted pointer to [`identity::KeyPair`]. pub fn identity_keypair(&self) -> Arc { Arc::clone(&self.identity_keypair) } + /// Overwrite the existing encryption keypair + pub fn set_encryption_keypair(&mut self, enc_keypair: encryption::KeyPair) { + self.encryption_keypair = Arc::new(enc_keypair); + } + /// Gets an atomically reference counted pointer to [`encryption::KeyPair`]. pub fn encryption_keypair(&self) -> Arc { Arc::clone(&self.encryption_keypair) } + /// Overwrite the existing ack key + pub fn set_ack_key(&mut self, ack_key: AckKey) { + self.ack_key = Arc::new(ack_key); + } + + /// Gets an atomically reference counted pointer to [`AckKey`]. + pub fn ack_key(&self) -> Arc { + Arc::clone(&self.ack_key) + } + + // this is actually **NOT** dead code + // I have absolutely no idea why the compiler insists it's unused. The call happens during client::init::execute + #[allow(dead_code)] + /// After shared key with the gateway is derived, puts its ownership to this instance of a [`KeyManager`]. + pub fn insert_gateway_shared_key(&mut self, gateway_shared_key: Arc) { + self.gateway_shared_key = Some(gateway_shared_key) + } + /// Gets an atomically reference counted pointer to [`SharedKey`]. // since this function is not fully public, it is not expected to be used externally and // hence it's up to us to ensure it's called in correct context @@ -210,12 +230,7 @@ impl KeyManager { ) } - pub fn gateway_key_set(&self) -> bool { + pub fn is_gateway_key_set(&self) -> bool { self.gateway_shared_key.is_some() } - - /// Gets an atomically reference counted pointer to [`AckKey`]. - pub fn ack_key(&self) -> Arc { - Arc::clone(&self.ack_key) - } } diff --git a/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs b/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs index ed215d30af..a0b3da3eec 100644 --- a/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs +++ b/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs @@ -24,8 +24,8 @@ async fn main() { mock_storage.write(client.get_keys(), client.get_gateway_endpoint().unwrap()); } else { let (keys, gateway_config) = mock_storage.read(); - client.set_keys(&keys); - client.set_gateway_endpoint(&gateway_config); + client.set_keys(keys); + client.set_gateway_endpoint(gateway_config); } // Connect to the mixnet, now we're listening for incoming @@ -49,7 +49,7 @@ impl MockStorage { todo!(); } - fn write(&mut self, _keys: &mixnet::Keys, _gateway_config: &mixnet::GatewayEndpointConfig) { + fn write(&mut self, _keys: mixnet::KeysArc, _gateway_config: &mixnet::GatewayEndpointConfig) { todo!(); } diff --git a/sdk/rust/nym-sdk/src/mixnet.rs b/sdk/rust/nym-sdk/src/mixnet.rs index 21d9369790..9aa3a3be19 100644 --- a/sdk/rust/nym-sdk/src/mixnet.rs +++ b/sdk/rust/nym-sdk/src/mixnet.rs @@ -10,7 +10,7 @@ pub use nymsphinx::{ receiver::ReconstructedMessage, }; -pub use keys::Keys; +pub use keys::{Keys, KeysArc}; pub use paths::{GatewayKeyMode, KeyMode, StoragePaths}; pub use client::{Client, ClientBuilder}; diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index ea2f5f372f..bbe2a89cd3 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -1,4 +1,4 @@ -use std::path::Path; +use std::{path::Path, sync::Arc}; use client_connections::TransmissionLane; use client_core::{ @@ -20,7 +20,7 @@ use nymsphinx::{ }; use task::TaskManager; -use super::{connection_state::BuilderState, Config, GatewayKeyMode, Keys, StoragePaths}; +use super::{connection_state::BuilderState, Config, GatewayKeyMode, Keys, KeysArc, StoragePaths}; use crate::error::{Error, Result}; pub struct ClientBuilder { @@ -85,19 +85,27 @@ impl ClientBuilder { /// key, however, is created during the gateway registration handshake so it might not /// necessarily be available. fn has_gateway_key(&self) -> bool { - self.key_manager.gateway_key_set() + self.key_manager.is_gateway_key_set() } - pub fn set_keys(&mut self, _keys: &Keys) { - todo!(); + pub fn set_keys(&mut self, keys: Keys) { + self.key_manager.set_identity_keypair(keys.identity_keypair); + self.key_manager + .set_encryption_keypair(keys.encryption_keypair); + self.key_manager.set_ack_key(keys.ack_key); + + self.key_manager + .insert_gateway_shared_key(Arc::new(keys.gateway_shared_key)); } - pub fn get_keys(&self) -> &Keys { - todo!(); + pub fn get_keys(&self) -> KeysArc { + KeysArc::from(&self.key_manager) } - pub fn set_gateway_endpoint(&mut self, _gateway_endpoint_config: &GatewayEndpointConfig) { - todo!(); + pub fn set_gateway_endpoint(&mut self, gateway_endpoint_config: GatewayEndpointConfig) { + self.state = BuilderState::Registered { + gateway_endpoint_config, + } } pub fn get_gateway_endpoint(&self) -> Option<&GatewayEndpointConfig> { diff --git a/sdk/rust/nym-sdk/src/mixnet/keys.rs b/sdk/rust/nym-sdk/src/mixnet/keys.rs index c6a60f3494..76a3bab39d 100644 --- a/sdk/rust/nym-sdk/src/mixnet/keys.rs +++ b/sdk/rust/nym-sdk/src/mixnet/keys.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use client_core::client::key_manager::KeyManager; use crypto::asymmetric::{encryption, identity}; use gateway_requests::registration::handshake::SharedKeys; @@ -10,6 +12,13 @@ pub struct Keys { pub gateway_shared_key: SharedKeys, } +pub struct KeysArc { + pub identity_keypair: Arc, + pub encryption_keypair: Arc, + pub ack_key: Arc, + pub gateway_shared_key: Arc, +} + impl From for KeyManager { fn from(keys: Keys) -> Self { KeyManager::from_keys( @@ -20,3 +29,25 @@ impl From for KeyManager { ) } } + +impl From for KeysArc { + fn from(keys: Keys) -> Self { + KeysArc { + identity_keypair: keys.identity_keypair.into(), + encryption_keypair: keys.encryption_keypair.into(), + ack_key: keys.ack_key.into(), + gateway_shared_key: keys.gateway_shared_key.into(), + } + } +} + +impl From<&KeyManager> for KeysArc { + fn from(key_manager: &KeyManager) -> Self { + KeysArc { + identity_keypair: key_manager.identity_keypair(), + encryption_keypair: key_manager.encryption_keypair(), + ack_key: key_manager.ack_key(), + gateway_shared_key: key_manager.gateway_shared_key(), + } + } +} diff --git a/sdk/rust/nym-sdk/src/mixnet/paths.rs b/sdk/rust/nym-sdk/src/mixnet/paths.rs index ad66f7bbcd..1c044ef60c 100644 --- a/sdk/rust/nym-sdk/src/mixnet/paths.rs +++ b/sdk/rust/nym-sdk/src/mixnet/paths.rs @@ -62,7 +62,7 @@ pub struct StoragePaths { impl StoragePaths { pub fn new_from_dir(operating_mode: KeyMode, dir: &Path) -> Result { if !dir.is_file() { - return Err(Error::ExpectedDirectory(dir.to_owned())) + return Err(Error::ExpectedDirectory(dir.to_owned())); } Ok(Self { From 36496a519aea59fb5f2a8d752aa3aea72f7cafa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 11 Jan 2023 00:13:45 +0100 Subject: [PATCH 152/591] rust-sdk: add additinal example --- .../examples/simple_but_manually_connect.rs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs diff --git a/sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs b/sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs new file mode 100644 index 0000000000..0d79556dfd --- /dev/null +++ b/sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs @@ -0,0 +1,27 @@ +use nym_sdk::mixnet; + +#[tokio::main] +async fn main() { + logging::setup_logging(); + + // Create client builder, including ephemeral keys. The builder can be usable in the context + // where you don't want to connect just yet + let client = mixnet::ClientBuilder::new(None, None).unwrap(); + + // Now we connect to the mixnet, using ephemeral keys already created + let mut client = client.connect_to_mixnet().await.unwrap(); + + // Be able to get our client address + let our_address = client.nym_address(); + println!("Our client nym address is: {our_address}"); + + // Send a message throught the mixnet to ourselves + client + .send_str(&our_address.to_string(), "hello there") + .await; + + println!("Waiting for message"); + client + .on_messages(|msg| println!("Received: {}", String::from_utf8_lossy(&msg.message))) + .await; +} From b97a12186f289afa2f85689c15a7a429e971f872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 11 Jan 2023 00:32:21 +0100 Subject: [PATCH 153/591] rust-fmt: append path in error --- .../src/config/persistence/key_pathfinder.rs | 16 ++++++++++++++++ nym-wallet/Cargo.lock | 2 +- sdk/rust/nym-sdk/src/error.rs | 8 ++++---- sdk/rust/nym-sdk/src/mixnet/client.rs | 14 +++++++++++--- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/clients/client-core/src/config/persistence/key_pathfinder.rs b/clients/client-core/src/config/persistence/key_pathfinder.rs index 67a8fb010a..70bfe3610f 100644 --- a/clients/client-core/src/config/persistence/key_pathfinder.rs +++ b/clients/client-core/src/config/persistence/key_pathfinder.rs @@ -49,6 +49,15 @@ impl ClientKeyPathfinder { || matches!(self.ack_key.try_exists(), Ok(true)) } + pub fn any_file_exists_and_return(&self) -> Option { + file_exists(&self.identity_public_key) + .or_else(|| file_exists(&self.identity_private_key)) + .or_else(|| file_exists(&self.encryption_public_key)) + .or_else(|| file_exists(&self.encryption_private_key)) + .or_else(|| file_exists(&self.gateway_shared_key)) + .or_else(|| file_exists(&self.ack_key)) + } + pub fn gateway_key_file_exists(&self) -> bool { matches!(self.gateway_shared_key.try_exists(), Ok(true)) } @@ -77,3 +86,10 @@ impl ClientKeyPathfinder { &self.ack_key } } + +fn file_exists(path: &Path) -> Option { + if matches!(path.try_exists(), Ok(true)) { + return Some(path.to_path_buf()); + } + None +} diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 0a9ba7103f..7e52cca234 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -2932,7 +2932,7 @@ dependencies = [ [[package]] name = "nym_wallet" -version = "1.1.5" +version = "1.1.6" dependencies = [ "aes-gcm", "argon2 0.3.4", diff --git a/sdk/rust/nym-sdk/src/error.rs b/sdk/rust/nym-sdk/src/error.rs index 77f6c1492c..8f059ef001 100644 --- a/sdk/rust/nym-sdk/src/error.rs +++ b/sdk/rust/nym-sdk/src/error.rs @@ -11,10 +11,10 @@ pub enum Error { #[error(transparent)] ClientCoreError(#[from] client_core::error::ClientCoreError), - #[error("key file encountered that we don't want to overwrite")] - DontOverwrite, - #[error("shared gateway key file encountered that we don't want to overwrite")] - DontOverwriteGatewayKey, + #[error("key file encountered that we don't want to overwrite: {0}")] + DontOverwrite(PathBuf), + #[error("shared gateway key file encountered that we don't want to overwrite: {0}")] + DontOverwriteGatewayKey(PathBuf), #[error("no gateway config available for writing")] GatewayNotAvailableForWriting, diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index bbe2a89cd3..826e6aea23 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -57,10 +57,16 @@ impl ClientBuilder { Ok(key_manager) => key_manager, Err(err) => { log::debug!("Not loading keys: {err}"); - if path_finder.any_file_exists() && paths.operating_mode.is_keep() { - return Err(Error::DontOverwrite); + if let Some(path) = path_finder.any_file_exists_and_return() { + if paths.operating_mode.is_keep() { + return Err(Error::DontOverwrite(path)); + } } + // Double check using a function that has slightly different internal logic. I + // know this is a bit defensive, but I don't want to overwrite + assert!(!(path_finder.any_file_exists() && paths.operating_mode.is_keep())); + // Create new keys and write to storage let key_manager = client_core::init::new_client_keys(); // WARN: this will overwrite! @@ -134,7 +140,9 @@ impl ClientBuilder { fn write_gateway_key(&self, paths: StoragePaths, key_mode: &GatewayKeyMode) -> Result<()> { let path_finder = ClientKeyPathfinder::from(paths); if path_finder.gateway_key_file_exists() && key_mode.is_keep() { - return Err(Error::DontOverwriteGatewayKey); + return Err(Error::DontOverwriteGatewayKey( + path_finder.gateway_shared_key().to_path_buf(), + )); }; self.key_manager.store_gateway_key(&path_finder)?; Ok(()) From 70ae45b6c963930e54353c57a2fb88c3bafb9c60 Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 11 Jan 2023 12:59:16 +0100 Subject: [PATCH 154/591] Changing the explorers guru link --- explorer/src/api/constants.ts | 2 ++ explorer/src/pages/Gateways/index.tsx | 6 +++--- explorer/src/pages/Mixnodes/index.tsx | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/explorer/src/api/constants.ts b/explorer/src/api/constants.ts index dc6124c53d..e0488df565 100644 --- a/explorer/src/api/constants.ts +++ b/explorer/src/api/constants.ts @@ -20,3 +20,5 @@ export const UPTIME_STORY_API_GATEWAY = `${NYM_API_BASE_URL}/api/v1/status/gatew export const MIXNODE_API_ERROR = "We're having trouble finding that record, please try again or Contact Us."; export const NYM_WEBSITE = 'https://nymtech.net'; + +export const NYM_BIG_DIPPER = 'https://mixnet.explorers.guru'; diff --git a/explorer/src/pages/Gateways/index.tsx b/explorer/src/pages/Gateways/index.tsx index f35f7382b4..82b5ae9613 100644 --- a/explorer/src/pages/Gateways/index.tsx +++ b/explorer/src/pages/Gateways/index.tsx @@ -12,7 +12,7 @@ import { Title } from '../../components/Title'; import { cellStyles, UniversalDataGrid } from '../../components/Universal-DataGrid'; import { unymToNym } from '../../utils/currency'; import { Tooltip } from '../../components/Tooltip'; -import { BIG_DIPPER } from '../../api/constants'; +import { NYM_BIG_DIPPER } from '../../api/constants'; import { splice } from '../../utils'; export const PageGateways: React.FC = () => { @@ -134,7 +134,7 @@ export const PageGateways: React.FC = () => { renderCell: (params: GridRenderCellParams) => ( @@ -152,7 +152,7 @@ export const PageGateways: React.FC = () => { renderCell: (params: GridRenderCellParams) => ( diff --git a/explorer/src/pages/Mixnodes/index.tsx b/explorer/src/pages/Mixnodes/index.tsx index c502799c54..6695526f16 100644 --- a/explorer/src/pages/Mixnodes/index.tsx +++ b/explorer/src/pages/Mixnodes/index.tsx @@ -10,7 +10,7 @@ import { useMainContext } from '../../context/main'; import { MixnodeRowType, mixnodeToGridRow } from '../../components/MixNodes'; import { TableToolbar } from '../../components/TableToolbar'; import { MixNodeResponse, MixnodeStatusWithAll, toMixnodeStatus } from '../../typeDefs/explorer-api'; -import { BIG_DIPPER } from '../../api/constants'; +import { NYM_BIG_DIPPER } from '../../api/constants'; import { CustomColumnHeading } from '../../components/CustomColumnHeading'; import { Title } from '../../components/Title'; import { cellStyles, UniversalDataGrid } from '../../components/Universal-DataGrid'; @@ -261,7 +261,7 @@ export const PageMixnodes: React.FC = () => { headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( Date: Wed, 11 Jan 2023 12:14:16 +0000 Subject: [PATCH 155/591] made most of cli boolean arguments optional (#2819) so that if not provided, they would not overwrite config values --- clients/native/src/commands/init.rs | 4 ++-- clients/native/src/commands/mod.rs | 10 +++++----- clients/native/src/commands/run.rs | 4 ++-- clients/socks5/src/commands/init.rs | 4 ++-- clients/socks5/src/commands/mod.rs | 10 +++++----- clients/socks5/src/commands/run.rs | 4 ++-- gateway/src/commands/init.rs | 8 ++++---- gateway/src/commands/mod.rs | 11 +++++++---- gateway/src/commands/run.rs | 4 ++-- nym-api/src/main.rs | 19 +++++++++++-------- 10 files changed, 42 insertions(+), 36 deletions(-) diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index 8f8380349f..bb8295a34e 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -41,7 +41,7 @@ pub(crate) struct Init { /// Whether to not start the websocket #[clap(long)] - disable_socket: bool, + disable_socket: Option, /// Port for the socket (if applicable) to listen on in all subsequent runs #[clap(short, long)] @@ -60,7 +60,7 @@ pub(crate) struct Init { /// with bandwidth credential requirement. #[cfg(feature = "coconut")] #[clap(long)] - enabled_credentials_mode: bool, + enabled_credentials_mode: Option, /// Save a summary of the initialization to a json file #[clap(long)] diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index 14ac39056f..f3048c8a22 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -54,7 +54,7 @@ pub(crate) enum Commands { // Configuration that can be overridden. pub(crate) struct OverrideConfig { nym_apis: Option>, - disable_socket: bool, + disable_socket: Option, port: Option, fastmode: bool, no_cover: bool, @@ -62,7 +62,7 @@ pub(crate) struct OverrideConfig { #[cfg(feature = "coconut")] nyxd_urls: Option>, #[cfg(feature = "coconut")] - enabled_credentials_mode: bool, + enabled_credentials_mode: Option, } pub(crate) async fn execute(args: &Cli) -> Result<(), Box> { @@ -80,7 +80,7 @@ pub(crate) async fn execute(args: &Cli) -> Result<(), Box Config { config = config - .with_disabled_socket(args.disable_socket) + .with_optional(Config::with_disabled_socket, args.disable_socket) .with_base(BaseConfig::with_high_default_traffic_volume, args.fastmode) .with_base(BaseConfig::with_disabled_cover_traffic, args.no_cover) .with_optional(Config::with_port, args.port) @@ -100,9 +100,9 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi network_defaults::var_names::NYXD, config::parse_urls, ) - .with_base( + .with_optional_ext( BaseConfig::with_disabled_credentials, - !args.enabled_credentials_mode, + args.enabled_credentials_mode.map(|b| !b), ); } diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index 123bb827e4..47fd3d97e8 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -38,7 +38,7 @@ pub(crate) struct Run { /// Whether to not start the websocket #[clap(long)] - disable_socket: bool, + disable_socket: Option, /// Port for the socket to listen on #[clap(short, long)] @@ -57,7 +57,7 @@ pub(crate) struct Run { /// with bandwidth credential requirement. #[cfg(feature = "coconut")] #[clap(long)] - enabled_credentials_mode: bool, + enabled_credentials_mode: Option, } impl From for OverrideConfig { diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index 80087a59e6..f9bcf219a8 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -31,7 +31,7 @@ pub(crate) struct Init { /// Note that some service providers might not support this. // the alias here is included for backwards compatibility (1.1.4 and before) #[clap(long, alias = "use_anonymous_sender_tag")] - use_reply_surbs: bool, + use_reply_surbs: Option, /// Id of the gateway we are going to connect to. #[clap(long)] @@ -69,7 +69,7 @@ pub(crate) struct Init { /// with bandwidth credential requirement. #[cfg(feature = "coconut")] #[clap(long)] - enabled_credentials_mode: bool, + enabled_credentials_mode: Option, /// Save a summary of the initialization to a json file #[clap(long)] diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index a825fb882e..5674a94196 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -57,14 +57,14 @@ pub(crate) enum Commands { pub(crate) struct OverrideConfig { nym_apis: Option>, port: Option, - use_anonymous_replies: bool, + use_anonymous_replies: Option, fastmode: bool, no_cover: bool, #[cfg(feature = "coconut")] nyxd_urls: Option>, #[cfg(feature = "coconut")] - enabled_credentials_mode: bool, + enabled_credentials_mode: Option, } pub(crate) async fn execute(args: &Cli) -> Result<(), Box> { @@ -84,7 +84,7 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi config = config .with_base(BaseConfig::with_high_default_traffic_volume, args.fastmode) .with_base(BaseConfig::with_disabled_cover_traffic, args.no_cover) - .with_anonymous_replies(args.use_anonymous_replies) + .with_optional(Config::with_anonymous_replies, args.use_anonymous_replies) .with_optional(Config::with_port, args.port) .with_optional_custom_env_ext( BaseConfig::with_custom_nym_apis, @@ -102,9 +102,9 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi network_defaults::var_names::NYXD, config::parse_urls, ) - .with_base( + .with_optional_ext( BaseConfig::with_disabled_credentials, - !args.enabled_credentials_mode, + args.enabled_credentials_mode.map(|b| !b), ); } diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 9d60479e71..2498ac5148 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -31,7 +31,7 @@ pub(crate) struct Run { /// Note that some service providers might not support this. // the alias here is included for backwards compatibility (1.1.4 and before) #[clap(long, alias = "use_anonymous_sender_tag")] - use_anonymous_replies: bool, + use_anonymous_replies: Option, /// Address of the socks5 provider to send messages to. #[clap(long)] @@ -68,7 +68,7 @@ pub(crate) struct Run { /// with bandwidth credential requirement. #[cfg(feature = "coconut")] #[clap(long)] - enabled_credentials_mode: bool, + enabled_credentials_mode: Option, } impl From for OverrideConfig { diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index 040698e582..426962dc30 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -68,11 +68,11 @@ pub struct Init { /// bypass bandwidth credential requirement #[cfg(feature = "coconut")] #[clap(long)] - only_coconut_credentials: bool, + only_coconut_credentials: Option, /// Enable/disable gateway anonymized statistics that get sent to a statistics aggregator server #[clap(long)] - enabled_statistics: bool, + enabled_statistics: Option, /// URL where a statistics aggregator is running. The default value is a Nym aggregator server #[clap(long)] @@ -182,11 +182,11 @@ mod tests { nym_apis: None, mnemonic: None, statistics_service_url: None, - enabled_statistics: false, + enabled_statistics: None, #[cfg(feature = "coconut")] nyxd_urls: None, #[cfg(feature = "coconut")] - only_coconut_credentials: false, + only_coconut_credentials: None, }; std::env::set_var(BECH32_PREFIX, "n"); diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index aaf587c8ae..122749624c 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -52,7 +52,7 @@ pub(crate) struct OverrideConfig { clients_port: Option, datastore: Option, announce_host: Option, - enabled_statistics: bool, + enabled_statistics: Option, statistics_service_url: Option, nym_apis: Option>, mnemonic: Option, @@ -60,7 +60,7 @@ pub(crate) struct OverrideConfig { #[cfg(feature = "coconut")] nyxd_urls: Option>, #[cfg(feature = "coconut")] - only_coconut_credentials: bool, + only_coconut_credentials: Option, } pub(crate) async fn execute(args: Cli) { @@ -103,7 +103,7 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi NYM_API, config::parse_urls, ) - .with_enabled_statistics(args.enabled_statistics) + .with_optional(Config::with_enabled_statistics, args.enabled_statistics) .with_optional_env( Config::with_custom_statistics_service_url, args.statistics_service_url, @@ -130,7 +130,10 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi NYXD, config::parse_urls, ) - .with_only_coconut_credentials(args.only_coconut_credentials); + .with_optional( + Config::with_only_coconut_credentials, + args.only_coconut_credentials, + ); } config diff --git a/gateway/src/commands/run.rs b/gateway/src/commands/run.rs index 45a496f511..3198d97029 100644 --- a/gateway/src/commands/run.rs +++ b/gateway/src/commands/run.rs @@ -68,11 +68,11 @@ pub struct Run { /// bypass bandwidth credential requirement #[cfg(feature = "coconut")] #[clap(long)] - only_coconut_credentials: bool, + only_coconut_credentials: Option, /// Enable/disable gateway anonymized statistics that get sent to a statistics aggregator server #[clap(long)] - enabled_statistics: bool, + enabled_statistics: Option, /// URL where a statistics aggregator is running. The default value is a Nym aggregator server #[clap(long)] diff --git a/nym-api/src/main.rs b/nym-api/src/main.rs index 6b6b2313f4..3d54fde175 100644 --- a/nym-api/src/main.rs +++ b/nym-api/src/main.rs @@ -94,11 +94,11 @@ struct ApiArgs { /// Specifies whether network monitoring is enabled on this API #[clap(short = 'm', long)] - enable_monitor: bool, + enable_monitor: Option, /// Specifies whether network rewarding is enabled on this API #[clap(short = 'r', long, requires = "enable_monitor", requires = "mnemonic")] - enable_rewarding: bool, + enable_rewarding: Option, /// Endpoint to nyxd instance from which the monitor will grab nodes to test #[clap(long)] @@ -132,7 +132,7 @@ struct ApiArgs { /// Set this nym api to work in a enabled credentials that would attempt to use gateway with the bandwidth credential requirement #[clap(long)] - enabled_credentials_mode: bool, + enabled_credentials_mode: Option, /// Announced address where coconut clients will connect. #[cfg(feature = "coconut")] @@ -142,7 +142,7 @@ struct ApiArgs { /// Flag to indicate whether coconut signer authority is enabled on this API #[cfg(feature = "coconut")] #[clap(long, requires = "mnemonic", requires = "announce-address")] - enable_coconut: bool, + enable_coconut: Option, } async fn wait_for_interrupt(mut shutdown: TaskManager) { @@ -186,15 +186,18 @@ fn override_config(mut config: Config, args: ApiArgs) -> Config { Config::with_min_gateway_reliability, args.min_gateway_reliability, ) - .with_network_monitor_enabled(args.enable_monitor) - .with_rewarding_enabled(args.enable_rewarding) - .with_disabled_credentials_mode(!args.enabled_credentials_mode); + .with_optional(Config::with_network_monitor_enabled, args.enable_monitor) + .with_optional(Config::with_rewarding_enabled, args.enable_rewarding) + .with_optional( + Config::with_disabled_credentials_mode, + args.enabled_credentials_mode.map(|b| !b), + ); #[cfg(feature = "coconut")] { config = config .with_optional(Config::with_announce_address, args.announce_address) - .with_coconut_signer_enabled(args.enable_coconut); + .with_optional(Config::with_coconut_signer_enabled, args.enable_coconut); } if args.save_config { From 1e84f87bf56898580b36468ba037a90e3b8ef985 Mon Sep 17 00:00:00 2001 From: Gala Date: Wed, 11 Jan 2023 13:33:26 +0100 Subject: [PATCH 156/591] Revert "Changing the explorers guru link" This reverts commit 70ae45b6c963930e54353c57a2fb88c3bafb9c60. --- explorer/src/api/constants.ts | 2 -- explorer/src/pages/Gateways/index.tsx | 6 +++--- explorer/src/pages/Mixnodes/index.tsx | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/explorer/src/api/constants.ts b/explorer/src/api/constants.ts index e0488df565..dc6124c53d 100644 --- a/explorer/src/api/constants.ts +++ b/explorer/src/api/constants.ts @@ -20,5 +20,3 @@ export const UPTIME_STORY_API_GATEWAY = `${NYM_API_BASE_URL}/api/v1/status/gatew export const MIXNODE_API_ERROR = "We're having trouble finding that record, please try again or Contact Us."; export const NYM_WEBSITE = 'https://nymtech.net'; - -export const NYM_BIG_DIPPER = 'https://mixnet.explorers.guru'; diff --git a/explorer/src/pages/Gateways/index.tsx b/explorer/src/pages/Gateways/index.tsx index 82b5ae9613..f35f7382b4 100644 --- a/explorer/src/pages/Gateways/index.tsx +++ b/explorer/src/pages/Gateways/index.tsx @@ -12,7 +12,7 @@ import { Title } from '../../components/Title'; import { cellStyles, UniversalDataGrid } from '../../components/Universal-DataGrid'; import { unymToNym } from '../../utils/currency'; import { Tooltip } from '../../components/Tooltip'; -import { NYM_BIG_DIPPER } from '../../api/constants'; +import { BIG_DIPPER } from '../../api/constants'; import { splice } from '../../utils'; export const PageGateways: React.FC = () => { @@ -134,7 +134,7 @@ export const PageGateways: React.FC = () => { renderCell: (params: GridRenderCellParams) => ( @@ -152,7 +152,7 @@ export const PageGateways: React.FC = () => { renderCell: (params: GridRenderCellParams) => ( diff --git a/explorer/src/pages/Mixnodes/index.tsx b/explorer/src/pages/Mixnodes/index.tsx index 6695526f16..c502799c54 100644 --- a/explorer/src/pages/Mixnodes/index.tsx +++ b/explorer/src/pages/Mixnodes/index.tsx @@ -10,7 +10,7 @@ import { useMainContext } from '../../context/main'; import { MixnodeRowType, mixnodeToGridRow } from '../../components/MixNodes'; import { TableToolbar } from '../../components/TableToolbar'; import { MixNodeResponse, MixnodeStatusWithAll, toMixnodeStatus } from '../../typeDefs/explorer-api'; -import { NYM_BIG_DIPPER } from '../../api/constants'; +import { BIG_DIPPER } from '../../api/constants'; import { CustomColumnHeading } from '../../components/CustomColumnHeading'; import { Title } from '../../components/Title'; import { cellStyles, UniversalDataGrid } from '../../components/Universal-DataGrid'; @@ -261,7 +261,7 @@ export const PageMixnodes: React.FC = () => { headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( Date: Wed, 11 Jan 2023 13:19:59 +0000 Subject: [PATCH 157/591] Feature/nym connect gateway performance (#2815) * set up ui for gateway performance in nym-connect * reset gateway performance state periodically * remove duplicated imports * set and reset (when necessary) gateway performance * align gateway performance text left --- nym-connect/src/App.tsx | 1 + .../src/components/ConnectionStatus.tsx | 13 ++++- nym-connect/src/context/main.tsx | 38 +++++++++++-- nym-connect/src/context/mocks/main.tsx | 1 + nym-connect/src/layouts/ConnectedLayout.tsx | 12 +++- nym-connect/src/stories/AppFlow.stories.tsx | 55 ++++++++++--------- .../src/stories/ConnectedLayout.stories.tsx | 1 + .../src/stories/ConnectionStatus.stories.tsx | 8 +-- nym-connect/src/types/connection.ts | 2 + 9 files changed, 89 insertions(+), 42 deletions(-) diff --git a/nym-connect/src/App.tsx b/nym-connect/src/App.tsx index 9d5afd1427..86efd95ba2 100644 --- a/nym-connect/src/App.tsx +++ b/nym-connect/src/App.tsx @@ -74,6 +74,7 @@ export const App: React.FC = () => { onConnectClick={handleConnectClick} ipAddress="127.0.0.1" port={1080} + gatewayPerformance={context.gatewayPerformance} connectedSince={context.connectedSince} serviceProvider={context.serviceProvider} stats={[ diff --git a/nym-connect/src/components/ConnectionStatus.tsx b/nym-connect/src/components/ConnectionStatus.tsx index c2f9add9ad..7514898496 100644 --- a/nym-connect/src/components/ConnectionStatus.tsx +++ b/nym-connect/src/components/ConnectionStatus.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Box, CircularProgress, Divider, Stack, Tooltip, Typography } from '@mui/material'; import { DateTime } from 'luxon'; -import { ConnectionStatusKind } from '../types'; +import { ConnectionStatusKind, GatewayPerformance } from '../types'; import { ServiceProvider } from '../types/directory'; import { ServiceProviderInfo } from './ServiceProviderInfo'; @@ -58,9 +58,10 @@ const ConnectionStatusContent: React.FC<{ export const ConnectionStatus: React.FC<{ status: ConnectionStatusKind; + gatewayPerformance?: GatewayPerformance; connectedSince?: DateTime; serviceProvider?: ServiceProvider; -}> = ({ status, serviceProvider }) => { +}> = ({ status, serviceProvider, gatewayPerformance }) => { const color = status === ConnectionStatusKind.connected || status === ConnectionStatusKind.disconnecting ? '#21D072' @@ -69,7 +70,13 @@ export const ConnectionStatus: React.FC<{ return ( <> - + {status === ConnectionStatusKind.connected && gatewayPerformance !== 'Good' ? ( + + Gateway has issues + + ) : ( + + )} {serviceProvider ? ( }> diff --git a/nym-connect/src/context/main.tsx b/nym-connect/src/context/main.tsx index 3258978ff8..e00d353e24 100644 --- a/nym-connect/src/context/main.tsx +++ b/nym-connect/src/context/main.tsx @@ -1,15 +1,15 @@ -import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'; +import React, { createContext, useCallback, useContext, useEffect, useMemo, useState, useRef } from 'react'; import { DateTime } from 'luxon'; import { invoke } from '@tauri-apps/api'; import type { UnlistenFn } from '@tauri-apps/api/event'; import { listen } from '@tauri-apps/api/event'; import { forage } from '@tauri-apps/tauri-forage'; +import { ConnectionStatusKind, GatewayPerformance } from '../types'; +import { ConnectionStatsItem } from '../components/ConnectionStats'; +import { ServiceProvider, Services } from '../types/directory'; import { Error } from 'src/types/error'; import { TauriEvent } from 'src/types/event'; import { getVersion } from '@tauri-apps/api/app'; -import { ConnectionStatusKind } from '../types'; -import { ConnectionStatsItem } from '../components/ConnectionStats'; -import { ServiceProvider, Services } from '../types/directory'; const TAURI_EVENT_STATUS_CHANGED = 'app:connection-status-changed'; @@ -25,7 +25,7 @@ export type TClientContext = { serviceProvider?: ServiceProvider; showHelp: boolean; error?: Error; - + gatewayPerformance: GatewayPerformance; setMode: (mode: ModeType) => void; clearError: () => void; handleShowHelp: () => void; @@ -50,6 +50,7 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode const [showHelp, setShowHelp] = useState(false); const [error, setError] = useState(); const [appVersion, setAppVersion] = useState(); + const [gatewayPerformance, setGatewayPerformance] = useState('Good'); const getAppVersion = async () => { const version = await getVersion(); @@ -93,6 +94,16 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode unlisten.push(result); }); + listen('socks5-status-event', (e: TauriEvent) => { + if (e.payload.message.includes('slow')) { + setGatewayPerformance('Poor'); + } else { + setGatewayPerformance('Good'); + } + }).then((result) => { + unlisten.push(result); + }); + return () => { unlisten.forEach((unsubscribe) => unsubscribe()); }; @@ -110,6 +121,7 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode const startDisconnecting = useCallback(async () => { try { await invoke('start_disconnecting'); + setGatewayPerformance('Good'); } catch (e) { console.log(e); } @@ -167,6 +179,20 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode getSpFromStorage(); }, []); + const timerId = useRef(); + + useEffect(() => { + if (timerId.current) { + clearTimeout(timerId.current); + } + + if (gatewayPerformance !== 'Good') { + timerId.current = setTimeout(() => { + setGatewayPerformance('Good'); + }, 15000); + } + }, [gatewayPerformance]); + const contextValue = useMemo( () => ({ mode, @@ -187,6 +213,7 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode setServiceProvider, showHelp, handleShowHelp, + gatewayPerformance, }), [ appVersion, @@ -200,6 +227,7 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode connectedSince, services, serviceProvider, + gatewayPerformance, ], ); diff --git a/nym-connect/src/context/mocks/main.tsx b/nym-connect/src/context/mocks/main.tsx index 9b09b6dc71..c6c1c033f4 100644 --- a/nym-connect/src/context/mocks/main.tsx +++ b/nym-connect/src/context/mocks/main.tsx @@ -9,6 +9,7 @@ const mockValues: TClientContext = { services: [], showHelp: false, serviceProvider: { id: '1', description: 'Keybase service provider', gateway: 'abc123', address: '123abc' }, + gatewayPerformance: 'Good', setMode: () => {}, clearError: () => {}, handleShowHelp: () => {}, diff --git a/nym-connect/src/layouts/ConnectedLayout.tsx b/nym-connect/src/layouts/ConnectedLayout.tsx index 9cf37b9f12..d2ea86228b 100644 --- a/nym-connect/src/layouts/ConnectedLayout.tsx +++ b/nym-connect/src/layouts/ConnectedLayout.tsx @@ -4,7 +4,7 @@ import { DateTime } from 'luxon'; import { IpAddressAndPortModal } from 'src/components/IpAddressAndPortModal'; import { ConnectionTimer } from 'src/components/ConntectionTimer'; import { ConnectionStatus } from '../components/ConnectionStatus'; -import { ConnectionStatusKind } from '../types'; +import { ConnectionStatusKind, GatewayPerformance } from '../types'; import { ConnectionStatsItem } from '../components/ConnectionStats'; import { ConnectionButton } from '../components/ConnectionButton'; import { IpAddressAndPort } from '../components/IpAddressAndPort'; @@ -13,6 +13,7 @@ import { TestAndEarnButtonArea } from '../components/Growth/TestAndEarnButtonAre export const ConnectedLayout: React.FC<{ status: ConnectionStatusKind; + gatewayPerformance: GatewayPerformance; stats: ConnectionStatsItem[]; ipAddress: string; port: number; @@ -25,6 +26,7 @@ export const ConnectedLayout: React.FC<{ serviceProvider?: ServiceProvider; }> = ({ status, + gatewayPerformance, showInfoModal, handleCloseInfoModal, ipAddress, @@ -37,8 +39,12 @@ export const ConnectedLayout: React.FC<{ }) => ( <> - - + + diff --git a/nym-connect/src/stories/AppFlow.stories.tsx b/nym-connect/src/stories/AppFlow.stories.tsx index 7055288f63..248334d0c8 100644 --- a/nym-connect/src/stories/AppFlow.stories.tsx +++ b/nym-connect/src/stories/AppFlow.stories.tsx @@ -86,32 +86,33 @@ export const Mock: ComponentStory = () => { } return ( - - - undefined} - status={context.connectionStatus} - busy={busy} - onConnectClick={handleConnectClick} - ipAddress="127.0.0.1" - port={1080} - connectedSince={context.connectedSince} - serviceProvider={services[0].items[0]} - stats={[ - { - label: 'in:', - totalBytes: 1024, - rateBytesPerSecond: 1024 * 1024 * 1024 + 10, - }, - { - label: 'out:', - totalBytes: 1024 * 1024 * 1024 * 1024 * 20, - rateBytesPerSecond: 1024 * 1024 + 10, - }, - ]} - /> - - + + { + return undefined; + }} + status={context.connectionStatus} + busy={busy} + onConnectClick={handleConnectClick} + ipAddress="127.0.0.1" + port={1080} + connectedSince={context.connectedSince} + serviceProvider={services[0].items[0]} + stats={[ + { + label: 'in:', + totalBytes: 1024, + rateBytesPerSecond: 1024 * 1024 * 1024 + 10, + }, + { + label: 'out:', + totalBytes: 1024 * 1024 * 1024 * 1024 * 20, + rateBytesPerSecond: 1024 * 1024 + 10, + }, + ]} + /> + ); }; diff --git a/nym-connect/src/stories/ConnectedLayout.stories.tsx b/nym-connect/src/stories/ConnectedLayout.stories.tsx index 53538457bf..4d79900340 100644 --- a/nym-connect/src/stories/ConnectedLayout.stories.tsx +++ b/nym-connect/src/stories/ConnectedLayout.stories.tsx @@ -14,6 +14,7 @@ export const Default: ComponentStory = () => ( { return undefined; }} diff --git a/nym-connect/src/stories/ConnectionStatus.stories.tsx b/nym-connect/src/stories/ConnectionStatus.stories.tsx index 10eb4d61ac..d98e262374 100644 --- a/nym-connect/src/stories/ConnectionStatus.stories.tsx +++ b/nym-connect/src/stories/ConnectionStatus.stories.tsx @@ -10,17 +10,17 @@ export default { } as ComponentMeta; export const Disconnected: ComponentStory = () => ( - + ); export const Connecting: ComponentStory = () => ( - + ); export const Connected: ComponentStory = () => ( - + ); export const Disconnecting: ComponentStory = () => ( - + ); diff --git a/nym-connect/src/types/connection.ts b/nym-connect/src/types/connection.ts index f5665b58ea..8fb5234477 100644 --- a/nym-connect/src/types/connection.ts +++ b/nym-connect/src/types/connection.ts @@ -4,3 +4,5 @@ export enum ConnectionStatusKind { connected = 'connected', connecting = 'connecting', } + +export type GatewayPerformance = 'Good' | 'Poor' | 'VeryPoor'; From 8beb33fe9215a74a448573d4698cb5929e706b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 11 Jan 2023 14:37:05 +0000 Subject: [PATCH 158/591] bugfix: set default value for nym-api (and nyxd) for clients (#2822) * setting default urls in client config * using the same environmental variable for verloc --- Cargo.lock | 1 + clients/client-core/src/config/mod.rs | 21 +++++++++++++++++++-- common/mixnode-common/Cargo.toml | 1 + common/mixnode-common/src/verloc/mod.rs | 3 ++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eaa4d1aad9..20802e3db1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3067,6 +3067,7 @@ dependencies = [ "futures", "humantime-serde", "log", + "network-defaults", "nymsphinx-acknowledgements", "nymsphinx-addressing", "nymsphinx-forwarding", diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index 97b7c85c1a..1d3547dbd3 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -1,6 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use config::defaults::NymNetworkDetails; use config::{NymConfig, OptionalSet, DB_FILE_NAME}; use nymsphinx::params::PacketSize; use serde::{Deserialize, Serialize}; @@ -499,13 +500,29 @@ pub struct Client { impl Default for Client { fn default() -> Self { + let network = NymNetworkDetails::new_mainnet(); + let nyxd_urls = network + .endpoints + .iter() + .map(|validator| validator.nyxd_url()) + .collect(); + let nym_api_urls = network + .endpoints + .iter() + .filter_map(|validator| validator.api_url()) + .collect::>(); + + if nym_api_urls.is_empty() { + panic!("we do not have any default nym-api urls available!") + } + // there must be explicit checks for whether id is not empty later Client { version: env!("CARGO_PKG_VERSION").to_string(), id: "".to_string(), disabled_credentials_mode: true, - nyxd_urls: vec![], - nym_api_urls: vec![], + nyxd_urls, + nym_api_urls, private_identity_key_file: Default::default(), public_identity_key_file: Default::default(), private_encryption_key_file: Default::default(), diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml index d2e20ef29d..f2cc32465e 100644 --- a/common/mixnode-common/Cargo.toml +++ b/common/mixnode-common/Cargo.toml @@ -19,6 +19,7 @@ url = "2.2" thiserror = "1.0.37" crypto = { path = "../crypto" } +network-defaults = { path = "../network-defaults" } nymsphinx-acknowledgements = { path = "../nymsphinx/acknowledgements" } nymsphinx-addressing = { path = "../nymsphinx/addressing" } nymsphinx-forwarding = { path = "../nymsphinx/forwarding" } diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index 07fc80b4ba..cbcf590625 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -7,6 +7,7 @@ use crypto::asymmetric::identity; use futures::stream::FuturesUnordered; use futures::StreamExt; use log::*; +use network_defaults::mainnet::NYM_API; use rand::seq::SliceRandom; use rand::thread_rng; use std::net::SocketAddr; @@ -160,7 +161,7 @@ impl Default for ConfigBuilder { tested_nodes_batch_size: DEFAULT_BATCH_SIZE, testing_interval: DEFAULT_TESTING_INTERVAL, retry_timeout: DEFAULT_RETRY_TIMEOUT, - nym_api_urls: vec![], + nym_api_urls: vec![NYM_API.parse().expect("Invalid default API URL")], }) } } From dddc6eae57a760b04e8e697a068ba4a784da6341 Mon Sep 17 00:00:00 2001 From: farbanas Date: Thu, 12 Jan 2023 10:45:27 +0100 Subject: [PATCH 159/591] fix: added continue-on-error for clippy-check since they fail on forked repositories due to permission errors which we won't solve --- .github/workflows/build.yml | 1 + .github/workflows/connect.yml | 1 + .github/workflows/nightly_build.yml | 1 + .github/workflows/nightly_build_release.yml | 1 + .github/workflows/nightly_build_release2.yml | 1 + .github/workflows/wallet.yml | 1 + 6 files changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0eb21ddda7..9f5f983903 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,6 +56,7 @@ jobs: - uses: actions-rs/clippy-check@v1 name: Clippy checks + continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} args: --workspace --all-features diff --git a/.github/workflows/connect.yml b/.github/workflows/connect.yml index 292fee7482..1adc4da996 100644 --- a/.github/workflows/connect.yml +++ b/.github/workflows/connect.yml @@ -45,6 +45,7 @@ jobs: - uses: actions-rs/clippy-check@v1 name: Clippy checks + continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} args: --manifest-path nym-connect/Cargo.toml --workspace --all-features diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index 7fd70c8371..ad3c42e738 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -83,6 +83,7 @@ jobs: - uses: actions-rs/clippy-check@v1 name: Clippy checks + continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} args: --all-features diff --git a/.github/workflows/nightly_build_release.yml b/.github/workflows/nightly_build_release.yml index 275237ddc9..e302092a25 100644 --- a/.github/workflows/nightly_build_release.yml +++ b/.github/workflows/nightly_build_release.yml @@ -98,6 +98,7 @@ jobs: - uses: actions-rs/clippy-check@v1 name: Clippy checks + continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} args: --all-features diff --git a/.github/workflows/nightly_build_release2.yml b/.github/workflows/nightly_build_release2.yml index 28b9f8bf93..3f6ee0754b 100644 --- a/.github/workflows/nightly_build_release2.yml +++ b/.github/workflows/nightly_build_release2.yml @@ -98,6 +98,7 @@ jobs: - uses: actions-rs/clippy-check@v1 name: Clippy checks + continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} args: --all-features diff --git a/.github/workflows/wallet.yml b/.github/workflows/wallet.yml index 44e593d9cb..6e23f6833a 100644 --- a/.github/workflows/wallet.yml +++ b/.github/workflows/wallet.yml @@ -48,6 +48,7 @@ jobs: - uses: actions-rs/clippy-check@v1 name: Clippy checks + continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} args: --manifest-path nym-wallet/Cargo.toml --workspace --all-features From 5f88517e1dcfbcaf1b3cd56abd6c285c7ac81c50 Mon Sep 17 00:00:00 2001 From: Fouad Date: Thu, 12 Jan 2023 09:47:58 +0000 Subject: [PATCH 160/591] Feature/nym connect gateway performance (#2824) * set up ui for gateway performance in nym-connect remove duplicated imports * set and reset (when necessary) gateway performance * remove unneeded useEffect * remove log --- nym-connect/src/context/main.tsx | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/nym-connect/src/context/main.tsx b/nym-connect/src/context/main.tsx index e00d353e24..a16ffc513a 100644 --- a/nym-connect/src/context/main.tsx +++ b/nym-connect/src/context/main.tsx @@ -57,6 +57,8 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode setAppVersion(version); }; + const timerId = useRef(); + useEffect(() => { invoke('get_services').then((result) => { setServices(result as Services); @@ -97,8 +99,14 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode listen('socks5-status-event', (e: TauriEvent) => { if (e.payload.message.includes('slow')) { setGatewayPerformance('Poor'); - } else { - setGatewayPerformance('Good'); + + if (timerId.current) { + clearTimeout(timerId.current); + } + + timerId.current = setTimeout(() => { + setGatewayPerformance('Good'); + }, 10000); } }).then((result) => { unlisten.push(result); @@ -179,20 +187,6 @@ export const ClientContextProvider = ({ children }: { children: React.ReactNode getSpFromStorage(); }, []); - const timerId = useRef(); - - useEffect(() => { - if (timerId.current) { - clearTimeout(timerId.current); - } - - if (gatewayPerformance !== 'Good') { - timerId.current = setTimeout(() => { - setGatewayPerformance('Good'); - }, 15000); - } - }, [gatewayPerformance]); - const contextValue = useMemo( () => ({ mode, From 8b14321c4aa34349abfcc536af5f4d6bdb3e9e2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 12 Jan 2023 11:35:11 +0100 Subject: [PATCH 161/591] connect,wallet: make fern use same colors as env_pretty_logger (#2829) --- nym-connect/src-tauri/src/logging.rs | 9 +++++++-- nym-wallet/src-tauri/src/log.rs | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/nym-connect/src-tauri/src/logging.rs b/nym-connect/src-tauri/src/logging.rs index c805411107..804c1f2dae 100644 --- a/nym-connect/src-tauri/src/logging.rs +++ b/nym-connect/src-tauri/src/logging.rs @@ -1,12 +1,17 @@ use std::str::FromStr; -use fern::colors::ColoredLevelConfig; +use fern::colors::{Color, ColoredLevelConfig}; use serde::Serialize; use serde_repr::{Deserialize_repr, Serialize_repr}; use tauri::Manager; pub fn setup_logging(app_handle: tauri::AppHandle) -> Result<(), log::SetLoggerError> { - let colors = ColoredLevelConfig::new(); + let colors = ColoredLevelConfig::new() + .trace(Color::Magenta) + .debug(Color::Blue) + .info(Color::Green) + .warn(Color::Yellow) + .error(Color::Red); let base_config = fern::Dispatch::new() .level(global_level()) .filter_lowlevel_external_components() diff --git a/nym-wallet/src-tauri/src/log.rs b/nym-wallet/src-tauri/src/log.rs index b673d023ae..626200b469 100644 --- a/nym-wallet/src-tauri/src/log.rs +++ b/nym-wallet/src-tauri/src/log.rs @@ -1,12 +1,17 @@ use std::str::FromStr; -use fern::colors::ColoredLevelConfig; +use fern::colors::{Color, ColoredLevelConfig}; use serde::Serialize; use serde_repr::{Deserialize_repr, Serialize_repr}; use tauri::Manager; pub fn setup_logging(app_handle: tauri::AppHandle) -> Result<(), log::SetLoggerError> { - let colors = ColoredLevelConfig::new(); + let colors = ColoredLevelConfig::new() + .trace(Color::Magenta) + .debug(Color::Blue) + .info(Color::Green) + .warn(Color::Yellow) + .error(Color::Red); let base_config = fern::Dispatch::new() .level(global_level()) .filter_lowlevel_external_components() From a7f1242961b352b3a09f2d879dcb5e2a5355ef42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 12 Jan 2023 11:35:34 +0100 Subject: [PATCH 162/591] client-core: clean up gateway registration (#2827) * client-core: clean up gateway registration * client-core: tidy docs and clippy * clients: tidy output --- clients/client-core/src/config/mod.rs | 1 + clients/client-core/src/init/helpers.rs | 4 +- clients/client-core/src/init/mod.rs | 122 ++++++++++-------------- clients/native/src/commands/init.rs | 13 ++- clients/socks5/src/commands/init.rs | 13 ++- nym-connect/src-tauri/src/config/mod.rs | 12 +-- nym-connect/src-tauri/src/error.rs | 2 + sdk/rust/nym-sdk/src/error.rs | 3 + sdk/rust/nym-sdk/src/mixnet/client.rs | 13 ++- 9 files changed, 90 insertions(+), 93 deletions(-) diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index 1d3547dbd3..df1e0aa250 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -88,6 +88,7 @@ impl Config { Config::default().with_id(id) } + #[must_use] pub fn with_id>(mut self, id: S) -> Self where T: NymConfig, diff --git a/clients/client-core/src/init/helpers.rs b/clients/client-core/src/init/helpers.rs index 6ffa4bfd97..cd22774ecb 100644 --- a/clients/client-core/src/init/helpers.rs +++ b/clients/client-core/src/init/helpers.rs @@ -18,7 +18,7 @@ use url::Url; pub(super) async fn query_gateway_details( validator_servers: Vec, - chosen_gateway_id: Option, + chosen_gateway_id: Option, ) -> Result { let nym_api = validator_servers .choose(&mut thread_rng()) @@ -40,7 +40,7 @@ pub(super) async fn query_gateway_details( if let Some(gateway_id) = chosen_gateway_id { filtered_gateways .iter() - .find(|gateway| gateway.identity_key.to_base58_string() == gateway_id) + .find(|gateway| gateway.identity_key == gateway_id) .ok_or_else(|| ClientCoreError::NoGatewayWithId(gateway_id.to_string())) .cloned() } else { diff --git a/clients/client-core/src/init/mod.rs b/clients/client-core/src/init/mod.rs index f02d228242..6a84a3d37a 100644 --- a/clients/client-core/src/init/mod.rs +++ b/clients/client-core/src/init/mod.rs @@ -69,42 +69,21 @@ pub fn new_client_keys() -> KeyManager { KeyManager::new(&mut rng) } -/// Convenience function for setting up the gateway for a client. Depending on the arguments given -/// it will do the sensible thing. -pub async fn setup_gateway( - register_gateway: bool, - // TODO: this should get refactored to instead take Option - user_chosen_gateway_id: Option, - config: &Config, -) -> Result -where - C: NymConfig + ClientCoreConfigTrait, - T: NymConfig, -{ - let id = config.get_id(); - if register_gateway { - register_with_gateway_and_store(user_chosen_gateway_id, config).await - } else if let Some(user_chosen_gateway_id) = user_chosen_gateway_id { - config_gateway_with_existing_keys(user_chosen_gateway_id, config).await - } else { - reuse_existing_gateway_config::(&id) - } -} - -/// Get the gateway details by querying the validator-api. Either pick one at random or use -/// the chosen one if it's among the available ones. +/// Authenticate and register with a gateway. +/// Either pick one at random by querying the available gateways from the nym-api, or use the +/// chosen one if it's among the available ones. +/// The shared key is added to the supplied `KeyManager` and the endpoint details are returned. pub async fn register_with_gateway( key_manager: &mut KeyManager, nym_api_endpoints: Vec, - chosen_gateway_id: Option, + chosen_gateway_id: Option, ) -> Result { - // Our identity is derived from our key - let our_identity = key_manager.identity_keypair(); - // Get the gateway details of the gateway we will use let gateway = helpers::query_gateway_details(nym_api_endpoints, chosen_gateway_id).await?; log::debug!("Querying gateway gives: {}", gateway); + let our_identity = key_manager.identity_keypair(); + // Establish connection, authenticate and generate keys for talking with the gateway let shared_keys = helpers::register_with_gateway(&gateway, our_identity).await?; key_manager.insert_gateway_shared_key(shared_keys); @@ -112,59 +91,64 @@ pub async fn register_with_gateway( Ok(gateway.into()) } -/// Get the gateway details by querying the validator-api. Either pick one at random or use -/// the chosen one if it's among the available ones. -/// Saves keys to disk, specified by the paths in `config`. -pub async fn register_with_gateway_and_store( - chosen_gateway_id: Option, +/// Convenience function for setting up the gateway for a client given a `Config`. Depending on the +/// arguments given it will do the sensible thing. Either it will +/// +/// a. Reuse existing gateway configuration from storage. +/// b. Create a new gateway configuration but keep existing keys. This assumes that the caller +/// knows what they are doing and that the keys match the requested gateway. +/// c. Create a new gateway configuration with a newly registered gateway and keys. +pub async fn setup_gateway_from_config( + register_gateway: bool, + user_chosen_gateway_id: Option, config: &Config, ) -> Result where + C: NymConfig + ClientCoreConfigTrait, T: NymConfig, { - println!("Configuring gateway"); - let mut key_manager = new_client_keys(); + let id = config.get_id(); - let gateway = register_with_gateway( - &mut key_manager, - config.get_nym_api_endpoints(), - chosen_gateway_id, - ) - .await?; + // If we are not going to register gateway, and an explicitly chosed gateway is not passed in, + // load the existing configuration file + if !register_gateway && user_chosen_gateway_id.is_none() { + println!("Not registering gateway, will reuse existing config and keys"); + return load_existing_gateway_config::(&id); + } - helpers::store_keys(&key_manager, config)?; - println!("Saved all generated keys"); - - Ok(gateway) -} - -/// Set the gateway using the usual procedue of querying the validator-api, but don't register or -/// create any keys. -/// This assumes that the user knows what they are doing, and that the existing keys are valid for -/// the gateway being used -pub async fn config_gateway_with_existing_keys( - user_chosen_gateway_id: String, - config: &Config, -) -> Result -where - T: NymConfig, -{ - println!("Using gateway provided by user, keeping existing keys"); - let gateway = helpers::query_gateway_details( - config.get_nym_api_endpoints(), - Some(user_chosen_gateway_id), - ) - .await?; + // Else, we preceed by querying the nym-api + let gateway = + helpers::query_gateway_details(config.get_nym_api_endpoints(), user_chosen_gateway_id) + .await?; log::debug!("Querying gateway gives: {}", gateway); + + // If we are not registering, just return this and assume the caller has the keys already and + // wants to keep the, + if user_chosen_gateway_id.is_some() { + println!("Using gateway provided by user, keeping existing keys"); + return Ok(gateway.into()); + } + + // Create new keys and derive our identity + let mut key_manager = new_client_keys(); + let our_identity = key_manager.identity_keypair(); + + // Establish connection, authenticate and generate keys for talking with the gateway + println!("Registering with new gateway"); + let shared_keys = helpers::register_with_gateway(&gateway, our_identity).await?; + key_manager.insert_gateway_shared_key(shared_keys); + + // Write all keys to storage and just return the gateway endpoint config. It is assumed that we + // will load keys from storage when actually connecting. + helpers::store_keys(&key_manager, config)?; Ok(gateway.into()) } /// Read and reuse the existing gateway configuration from a file that was generate earlier. -pub fn reuse_existing_gateway_config(id: &str) -> Result +pub fn load_existing_gateway_config(id: &str) -> Result where T: NymConfig + ClientCoreConfigTrait, { - println!("Not registering gateway, will reuse existing config and keys"); T::load_from_file(Some(id)) .map(|existing_config| existing_config.get_gateway_endpoint().clone()) .map_err(|err| { @@ -242,9 +226,9 @@ where pub fn output_to_json(init_results: &T, output_file: &str) { match std::fs::File::create(output_file) { Ok(file) => match serde_json::to_writer_pretty(file, init_results) { - Ok(_) => println!("Saved: {}", output_file), - Err(err) => eprintln!("Could not save {}: {err}", output_file), + Ok(_) => println!("Saved: {output_file}"), + Err(err) => eprintln!("Could not save {output_file}: {err}"), }, - Err(err) => eprintln!("Could not save {}: {err}", output_file), + Err(err) => eprintln!("Could not save {output_file}: {err}"), } } diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index bb8295a34e..1515b24e62 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -114,16 +114,15 @@ pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> { let already_init = Config::default_config_file_path(Some(id)).exists(); if already_init { - println!( - "Client \"{}\" was already initialised before! \ - Config information will be overwritten (but keys will be kept)!", - id - ); + println!("Client \"{id}\" was already initialised before"); } // Usually you only register with the gateway on the first init, however you can force // re-registering if wanted. let user_wants_force_register = args.force_register_gateway; + if user_wants_force_register { + println!("Instructed to force registering gateway. This might overwrite keys!"); + } // If the client was already initialized, don't generate new keys and don't re-register with // the gateway (because this would create a new shared key). @@ -138,9 +137,9 @@ pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> { // Setup gateway by either registering a new one, or creating a new config from the selected // one but with keys kept, or reusing the gateway configuration. - let gateway = client_core::init::setup_gateway::( + let gateway = client_core::init::setup_gateway_from_config::( register_gateway, - user_chosen_gateway_id.map(|id| id.to_base58_string()), + user_chosen_gateway_id, config.get_base(), ) .await diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index f9bcf219a8..ebe01ad24d 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -124,16 +124,15 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { let already_init = Config::default_config_file_path(Some(id)).exists(); if already_init { - println!( - "SOCKS5 client \"{}\" was already initialised before! \ - Config information will be overwritten (but keys will be kept)!", - id - ); + println!("SOCKS5 client \"{id}\" was already initialised before"); } // Usually you only register with the gateway on the first init, however you can force // re-registering if wanted. let user_wants_force_register = args.force_register_gateway; + if user_wants_force_register { + println!("Instructed to force registering gateway. This might overwrite keys!"); + } // If the client was already initialized, don't generate new keys and don't re-register with // the gateway (because this would create a new shared key). @@ -151,9 +150,9 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { // Setup gateway by either registering a new one, or creating a new config from the selected // one but with keys kept, or reusing the gateway configuration. - let gateway = client_core::init::setup_gateway::( + let gateway = client_core::init::setup_gateway_from_config::( register_gateway, - user_chosen_gateway_id.map(|id| id.to_base58_string()), + user_chosen_gateway_id, config.get_base(), ) .await diff --git a/nym-connect/src-tauri/src/config/mod.rs b/nym-connect/src-tauri/src/config/mod.rs index 4cf4570207..4cde4ebaa4 100644 --- a/nym-connect/src-tauri/src/config/mod.rs +++ b/nym-connect/src-tauri/src/config/mod.rs @@ -4,6 +4,7 @@ use crate::{ }; use client_core::config::Config as BaseConfig; use config_common::NymConfig; +use crypto::asymmetric::identity; use nym_socks5::client::config::Config as Socks5Config; use std::path::PathBuf; use std::sync::Arc; @@ -109,11 +110,7 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str ); let already_init = Config::config_file_location(&id)?.exists(); if already_init { - log::info!( - "SOCKS5 client \"{}\" was already initialised before! \ - Config information will be overwritten (but keys will be kept)!", - id - ); + log::info!("SOCKS5 client \"{id}\" was already initialised before"); } // Future proofing. This flag exists for the other clients @@ -133,8 +130,11 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str .set_custom_nym_apis(config_common::parse_urls(&raw_validators)); } + let chosen_gateway_id = identity::PublicKey::from_base58_string(chosen_gateway_id) + .map_err(|_| BackendError::UnableToParseGateway)?; + // Setup gateway by either registering a new one, or reusing exiting keys - let gateway = client_core::init::setup_gateway::( + let gateway = client_core::init::setup_gateway_from_config::( register_gateway, Some(chosen_gateway_id), config.get_base(), diff --git a/nym-connect/src-tauri/src/error.rs b/nym-connect/src-tauri/src/error.rs index 124eeeddc4..53b8c9df44 100644 --- a/nym-connect/src-tauri/src/error.rs +++ b/nym-connect/src-tauri/src/error.rs @@ -68,6 +68,8 @@ pub enum BackendError { CouldNotLoadExistingGatewayConfiguration(std::io::Error), #[error("Unable to open a new window")] NewWindowError, + #[error("Unable to parse the specified gateway")] + UnableToParseGateway, } impl Serialize for BackendError { diff --git a/sdk/rust/nym-sdk/src/error.rs b/sdk/rust/nym-sdk/src/error.rs index 8f059ef001..6003256ad8 100644 --- a/sdk/rust/nym-sdk/src/error.rs +++ b/sdk/rust/nym-sdk/src/error.rs @@ -8,6 +8,9 @@ pub enum Error { TomlSerializationError(#[from] toml::ser::Error), #[error("toml deserialization error: {0}")] TomlDeserializationError(#[from] toml::de::Error), + #[error("Ed25519 error: {0}")] + Ed25519RecoveryError(#[from] crypto::asymmetric::identity::Ed25519RecoveryError), + #[error(transparent)] ClientCoreError(#[from] client_core::error::ClientCoreError), diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 826e6aea23..99fca9e424 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -13,13 +13,15 @@ use client_core::{ }, config::{persistence::key_pathfinder::ClientKeyPathfinder, GatewayEndpointConfig}, }; -use futures::StreamExt; +use crypto::asymmetric::identity; use nymsphinx::{ addressing::clients::{ClientIdentity, Recipient}, receiver::ReconstructedMessage, }; use task::TaskManager; +use futures::StreamExt; + use super::{connection_state::BuilderState, Config, GatewayKeyMode, Keys, KeysArc, StoragePaths}; use crate::error::{Error, Result}; @@ -124,10 +126,17 @@ impl ClientBuilder { "can only setup gateway when in `New` connection state" ); + let user_chosen_gateway = self + .config + .user_chosen_gateway + .as_ref() + .map(identity::PublicKey::from_base58_string) + .transpose()?; + let gateway_config = client_core::init::register_with_gateway( &mut self.key_manager, self.config.nym_api_endpoints.clone(), - self.config.user_chosen_gateway.clone(), + user_chosen_gateway, ) .await?; From 5709c45a50817a62f6ac7b95a0c7d2abac761090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 12 Jan 2023 10:39:21 +0000 Subject: [PATCH 163/591] Feature/circulating supply (#2814) * Fixed typo in node_status_cache constant * ibid * Moved some caching stuff around so I can see what depends on what * Finishing merge of conflicted files * Minor smoothing * Got cache reads working for circ supply and refactored common cache * Refactored nyxd client usages to make things bit more clear * Moved caching support stuff into the support folder * Moved storage code into support module * Removed dead code * Tweaks * Handling cases a little more nicely in circulating supply api * Renamed nymd_client to nyxd_client * Pulled CacheNotification into the caching support module * Pulled some domain-specific helpers out of cache refresher * Moving some more helper methods out of the cache refresher * Deleting unused code * Extracted a few more functions out of the cache refresher * A few comments as breadcrumbs * Renaming the anemic "helpers" to "node_sets" * Renaming the validator_cache module to nym_contract_cache * Renaming nym contract cache stuff to make things clearer * Renamging a few things in comments * Renaming validator_cache to nym_contract_cache * foomp * Started refactoring http and cli * Extracted cli arg parsing into its own module * Cleanup * Extracted start methods into various modules to clean main up * WIP commit * Build working, swagger not * Fixed swagger docs metadata * Removed log statement * Circulating supply cache now working with simple logic * Fixed up circulating supply method names * Starting to work in some (wrong) constants * Documented the cache * Renaming circulating-supply route * nym-api compiling after the rebasing but most likely not fully working yet * removed unused imports * only starting RewardedSetUpdater if the config flag is set * nym-api compiling with coconut feature * removed redundant process_runner * removed generic aspect of nym-api nyxd::Client * signle entry point for starting nym_contract_cache * do not eagerly grab instances of managed state * inlining openapi route spec * CirculatingSupplyResponse type * fixed compilation of coconut tests * calculating circulating supply based on mixmining reserve and vesting tokens * separated different variants of caching intervals * allow nym-api to specify address of the vesting contract * fixed types export * renamed the query on the vesting contract * reorganised startup procedure and made all start methods independent from rocket * cleaned up startup procedure for nym-api * startup checks for rewarding permisssions * updated changelog * added config flag to control whether circulating supply should be updated Co-authored-by: Dave Hrycyszyn --- CHANGELOG.md | 2 + Cargo.lock | 1 + .../client-libs/validator-client/src/error.rs | 4 +- .../client-libs/validator-client/src/lib.rs | 4 +- .../validator-client/src/nyxd/error.rs | 12 +- .../validator-client/src/nyxd/mod.rs | 4 +- common/network-defaults/src/mainnet.rs | 2 +- contracts/vesting/src/contract.rs | 4 +- nym-api/Cargo.toml | 1 + nym-api/nym-api-requests/src/models.rs | 8 + .../src/circulating_supply_api/cache/data.rs | 38 + .../src/circulating_supply_api/cache/mod.rs | 92 +++ .../circulating_supply_api/cache/refresher.rs | 134 ++++ nym-api/src/circulating_supply_api/mod.rs | 37 + nym-api/src/circulating_supply_api/routes.rs | 22 + nym-api/src/coconut/comm.rs | 7 +- nym-api/src/coconut/dkg/controller.rs | 43 +- nym-api/src/coconut/mod.rs | 29 +- nym-api/src/coconut/tests.rs | 2 +- nym-api/src/epoch_operations/error.rs | 7 + nym-api/src/epoch_operations/mod.rs | 91 ++- nym-api/src/main.rs | 652 ++++-------------- nym-api/src/network_monitor/mod.rs | 69 +- nym-api/src/network_monitor/monitor/mod.rs | 2 +- .../src/network_monitor/monitor/preparer.rs | 6 +- nym-api/src/node_status_api/cache.rs | 396 ----------- nym-api/src/node_status_api/cache/data.rs | 21 + nym-api/src/node_status_api/cache/mod.rs | 130 ++++ .../src/node_status_api/cache/node_sets.rs | 119 ++++ .../src/node_status_api/cache/refresher.rs | 160 +++++ nym-api/src/node_status_api/helpers.rs | 14 +- nym-api/src/node_status_api/mod.rs | 33 +- nym-api/src/node_status_api/routes.rs | 12 +- nym-api/src/node_status_api/uptime_updater.rs | 8 +- nym-api/src/nym_contract_cache/cache/data.rs | 41 ++ .../cache}/mod.rs | 333 ++------- .../src/nym_contract_cache/cache/refresher.rs | 133 ++++ nym-api/src/nym_contract_cache/mod.rs | 50 ++ .../routes.rs | 18 +- nym-api/src/support/caching/mod.rs | 51 ++ nym-api/src/support/cli/mod.rs | 183 +++++ nym-api/src/{ => support}/config/mod.rs | 62 +- nym-api/src/{ => support}/config/template.rs | 3 + nym-api/src/support/http/mod.rs | 97 +++ nym-api/src/support/http/openapi.rs | 38 + nym-api/src/support/mod.rs | 9 + .../{nyxd_client.rs => support/nyxd/mod.rs} | 185 +++-- nym-api/src/{ => support}/storage/manager.rs | 76 +- nym-api/src/{ => support}/storage/mod.rs | 0 nym-api/src/{ => support}/storage/models.rs | 0 nym-api/src/swagger.rs | 11 - 51 files changed, 1997 insertions(+), 1459 deletions(-) create mode 100644 nym-api/src/circulating_supply_api/cache/data.rs create mode 100644 nym-api/src/circulating_supply_api/cache/mod.rs create mode 100644 nym-api/src/circulating_supply_api/cache/refresher.rs create mode 100644 nym-api/src/circulating_supply_api/mod.rs create mode 100644 nym-api/src/circulating_supply_api/routes.rs delete mode 100644 nym-api/src/node_status_api/cache.rs create mode 100644 nym-api/src/node_status_api/cache/data.rs create mode 100644 nym-api/src/node_status_api/cache/mod.rs create mode 100644 nym-api/src/node_status_api/cache/node_sets.rs create mode 100644 nym-api/src/node_status_api/cache/refresher.rs create mode 100644 nym-api/src/nym_contract_cache/cache/data.rs rename nym-api/src/{contract_cache => nym_contract_cache/cache}/mod.rs (50%) create mode 100644 nym-api/src/nym_contract_cache/cache/refresher.rs create mode 100644 nym-api/src/nym_contract_cache/mod.rs rename nym-api/src/{contract_cache => nym_contract_cache}/routes.rs (84%) create mode 100644 nym-api/src/support/caching/mod.rs create mode 100644 nym-api/src/support/cli/mod.rs rename nym-api/src/{ => support}/config/mod.rs (90%) rename nym-api/src/{ => support}/config/template.rs (97%) create mode 100644 nym-api/src/support/http/mod.rs create mode 100644 nym-api/src/support/http/openapi.rs create mode 100644 nym-api/src/support/mod.rs rename nym-api/src/{nyxd_client.rs => support/nyxd/mod.rs} (77%) rename nym-api/src/{ => support}/storage/manager.rs (93%) rename nym-api/src/{ => support}/storage/mod.rs (100%) rename nym-api/src/{ => support}/storage/models.rs (100%) delete mode 100644 nym-api/src/swagger.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index e856ee7955..c62e28c61b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ### Added - nym-sdk: added initial version of a Rust client sdk +- nym-api: added `/circulating-supply` endpoint ([#2814]) ### Changed @@ -20,6 +21,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// [#2753]: https://github.com/nymtech/nym/pull/2753 [#2762]: https://github.com/nymtech/nym/pull/2762 +[#2814]: https://github.com/nymtech/nym/pull/2814 ## [v1.1.5] (2022-01-10) diff --git a/Cargo.lock b/Cargo.lock index 20802e3db1..b67a53bc52 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3297,6 +3297,7 @@ dependencies = [ "url", "validator-client", "version-checker", + "vesting-contract-common", ] [[package]] diff --git a/common/client-libs/validator-client/src/error.rs b/common/client-libs/validator-client/src/error.rs index 7b37ed6a14..08da52c626 100644 --- a/common/client-libs/validator-client/src/error.rs +++ b/common/client-libs/validator-client/src/error.rs @@ -6,7 +6,7 @@ use thiserror::Error; #[derive(Error, Debug)] pub enum ValidatorClientError { - #[error("There was an issue with the validator api request - {source}")] + #[error("nym api request failed - {source}")] NymAPIError { #[from] source: nym_api::error::NymAPIError, @@ -16,7 +16,7 @@ pub enum ValidatorClientError { MalformedUrlProvided(#[from] url::ParseError), #[cfg(feature = "nyxd-client")] - #[error("There was an issue with the Nyxd client - {0}")] + #[error("nyxd request failed - {0}")] NyxdError(#[from] crate::nyxd::error::NyxdError), #[error("No validator API url has been provided")] diff --git a/common/client-libs/validator-client/src/lib.rs b/common/client-libs/validator-client/src/lib.rs index 1c1c3a344c..4bdd9275fd 100644 --- a/common/client-libs/validator-client/src/lib.rs +++ b/common/client-libs/validator-client/src/lib.rs @@ -9,10 +9,8 @@ pub mod nym_api; #[cfg(feature = "nyxd-client")] pub mod nyxd; -#[cfg(feature = "nyxd-client")] -pub use crate::client::{CoconutApiClient, NymApiClient}; pub use crate::error::ValidatorClientError; pub use nym_api_requests::*; #[cfg(feature = "nyxd-client")] -pub use client::{Client, Config}; +pub use client::{Client, CoconutApiClient, Config, NymApiClient}; diff --git a/common/client-libs/validator-client/src/nyxd/error.rs b/common/client-libs/validator-client/src/nyxd/error.rs index 846cfd13c4..fab3965217 100644 --- a/common/client-libs/validator-client/src/nyxd/error.rs +++ b/common/client-libs/validator-client/src/nyxd/error.rs @@ -46,25 +46,25 @@ pub enum NyxdError { #[error("{0} is not a valid tx hash")] InvalidTxHash(String), - #[error("There was an issue with a tendermint RPC request - {0}")] + #[error("Tendermint RPC request failed - {0}")] TendermintError(#[from] TendermintRpcError), - #[error("There was an issue when attempting to serialize data ({0})")] + #[error("Failed when attempting to serialize data ({0})")] SerializationError(String), - #[error("There was an issue when attempting to deserialize data ({0})")] + #[error("Failed when attempting to deserialize data ({0})")] DeserializationError(String), - #[error("There was an issue when attempting to encode our protobuf data - {0}")] + #[error("Failed when attempting to encode our protobuf data - {0}")] ProtobufEncodingError(#[from] prost::EncodeError), - #[error("There was an issue when attempting to decode our protobuf data - {0}")] + #[error("Failed to decode our protobuf data - {0}")] ProtobufDecodingError(#[from] prost::DecodeError), #[error("Account {0} does not exist on the chain")] NonExistentAccountError(AccountId), - #[error("There was an issue with the serialization/deserialization - {0}")] + #[error("Failed on json serialization/deserialization - {0}")] SerdeJsonError(#[from] serde_json::Error), #[error("Account {0} is not a valid account address")] diff --git a/common/client-libs/validator-client/src/nyxd/mod.rs b/common/client-libs/validator-client/src/nyxd/mod.rs index df53071851..6e19d7f3b3 100644 --- a/common/client-libs/validator-client/src/nyxd/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/mod.rs @@ -17,11 +17,13 @@ use cosmrs::rpc::HttpClientUrl; use cosmrs::tx::Msg; use execute::execute; use log::debug; +use mixnet_contract_common::MixId; use network_defaults::{ChainDetails, NymNetworkDetails}; use serde::{Deserialize, Serialize}; use std::convert::TryInto; use std::time::SystemTime; use vesting_contract_common::ExecuteMsg as VestingExecuteMsg; +use vesting_contract_common::PledgeCap; pub use crate::nyxd::cosmwasm_client::client::CosmWasmClient; pub use crate::nyxd::cosmwasm_client::signing_client::SigningCosmWasmClient; @@ -43,10 +45,8 @@ pub use cosmrs::Coin as CosmosCoin; pub use cosmrs::{bip32, AccountId, Decimal, Denom}; pub use cosmwasm_std::Coin as CosmWasmCoin; pub use fee::{gas_price::GasPrice, GasAdjustable, GasAdjustment}; -use mixnet_contract_common::MixId; pub use signing_client::Client as SigningNyxdClient; pub use traits::{VestingQueryClient, VestingSigningClient}; -use vesting_contract_common::PledgeCap; pub mod coin; pub mod cosmwasm_client; diff --git a/common/network-defaults/src/mainnet.rs b/common/network-defaults/src/mainnet.rs index 4f8352c1c6..4af0376238 100644 --- a/common/network-defaults/src/mainnet.rs +++ b/common/network-defaults/src/mainnet.rs @@ -11,7 +11,7 @@ pub const STAKE_DENOM: DenomDetails = DenomDetails::new("unyx", "nyx", 6); pub const MIXNET_CONTRACT_ADDRESS: &str = "n17srjznxl9dvzdkpwpw24gg668wc73val88a6m5ajg6ankwvz9wtst0cznr"; -pub(crate) const VESTING_CONTRACT_ADDRESS: &str = +pub const VESTING_CONTRACT_ADDRESS: &str = "n1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrq73f2nw"; pub(crate) const BANDWIDTH_CLAIM_CONTRACT_ADDRESS: &str = "n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0"; diff --git a/contracts/vesting/src/contract.rs b/contracts/vesting/src/contract.rs index 73e3cd341f..edf82c2968 100644 --- a/contracts/vesting/src/contract.rs +++ b/contracts/vesting/src/contract.rs @@ -618,7 +618,7 @@ pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result to_binary(&try_get_all_accounts_locked_coins( + } => to_binary(&try_get_all_accounts_vesting_coins( deps, env, start_next_after, @@ -775,7 +775,7 @@ pub fn try_get_all_accounts( }) } -pub fn try_get_all_accounts_locked_coins( +pub fn try_get_all_accounts_vesting_coins( deps: Deps<'_>, env: Env, start_after: Option, diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 2e9e91ff48..796f25c41a 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -80,6 +80,7 @@ dkg = { path = "../common/crypto/dkg", optional = true } gateway-client = { path = "../common/client-libs/gateway-client" } inclusion-probability = { path = "../common/inclusion-probability" } mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet-contract" } +vesting-contract-common = { path = "../common/cosmwasm-smart-contracts/vesting-contract" } contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common", features = ["coconut"] } multisig-contract-common = { path = "../common/cosmwasm-smart-contracts/multisig-contract" } nymcoconut = { path = "../common/nymcoconut", optional = true } diff --git a/nym-api/nym-api-requests/src/models.rs b/nym-api/nym-api-requests/src/models.rs index df5fe07768..0c869be09a 100644 --- a/nym-api/nym-api-requests/src/models.rs +++ b/nym-api/nym-api-requests/src/models.rs @@ -282,3 +282,11 @@ pub struct GatewayUptimeHistoryResponse { pub owner: String, pub history: Vec, } + +#[derive(Clone, Serialize, Deserialize, schemars::JsonSchema)] +pub struct CirculatingSupplyResponse { + pub initial_supply: Coin, + pub mixmining_reserve: Coin, + pub vesting_tokens: Coin, + pub circulating_supply: Coin, +} diff --git a/nym-api/src/circulating_supply_api/cache/data.rs b/nym-api/src/circulating_supply_api/cache/data.rs new file mode 100644 index 0000000000..9fb68a8cac --- /dev/null +++ b/nym-api/src/circulating_supply_api/cache/data.rs @@ -0,0 +1,38 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::support::caching::Cache; +use nym_api_requests::models::CirculatingSupplyResponse; +use validator_client::nyxd::Coin; + +pub(crate) struct CirculatingSupplyCacheData { + // no need to cache that one as it's constant, but let's put it here for consistency sake + pub(crate) initial_supply: Coin, + pub(crate) mixmining_reserve: Cache, + pub(crate) vesting_tokens: Cache, + pub(crate) circulating_supply: Cache, +} + +impl CirculatingSupplyCacheData { + pub fn new(mix_denom: String) -> CirculatingSupplyCacheData { + let zero_coin = Coin::new(0, &mix_denom); + + CirculatingSupplyCacheData { + initial_supply: Coin::new(1_000_000_000_000_000, mix_denom), + mixmining_reserve: Cache::new(zero_coin.clone()), + vesting_tokens: Cache::new(zero_coin.clone()), + circulating_supply: Cache::new(zero_coin), + } + } +} + +impl<'a> From<&'a CirculatingSupplyCacheData> for CirculatingSupplyResponse { + fn from(value: &'a CirculatingSupplyCacheData) -> Self { + CirculatingSupplyResponse { + initial_supply: value.initial_supply.clone().into(), + mixmining_reserve: value.mixmining_reserve.clone().into_inner().into(), + vesting_tokens: value.vesting_tokens.clone().into_inner().into(), + circulating_supply: value.circulating_supply.clone().into_inner().into(), + } + } +} diff --git a/nym-api/src/circulating_supply_api/cache/mod.rs b/nym-api/src/circulating_supply_api/cache/mod.rs new file mode 100644 index 0000000000..5e12477476 --- /dev/null +++ b/nym-api/src/circulating_supply_api/cache/mod.rs @@ -0,0 +1,92 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use self::data::CirculatingSupplyCacheData; +use cosmwasm_std::Addr; +use nym_api_requests::models::CirculatingSupplyResponse; +use rocket::fairing::AdHoc; +use std::ops::Deref; +use std::{ + sync::{atomic::AtomicBool, Arc}, + time::Duration, +}; +use thiserror::Error; +use tokio::sync::RwLock; +use tokio::time; +use validator_client::nyxd::Coin; +use validator_client::ValidatorClientError; + +mod data; +pub(crate) mod refresher; + +#[derive(Debug, Error)] +enum CirculatingSupplyCacheError { + // this can only happen if somebody decides to set their staking address + // before https://github.com/nymtech/nym/pull/2796 is deployed + #[error("vesting account owned by {owner} with id {account_id} appeared more than once in the query response")] + DuplicateVestingAccountEntry { owner: Addr, account_id: u32 }, + + // this can happen if somehow the query was incomplete, like some paged sub-query didn't return full result + // or there's a bug with paging. or if, somehow, a vesting account got removed from the contract + #[error("got an inconsistent number of vesting account. received data on {got}, but expected {expected}")] + InconsistentNumberOfVestingAccounts { expected: usize, got: usize }, + + #[error(transparent)] + ClientError { + #[from] + source: ValidatorClientError, + }, +} + +/// A cache for the circulating supply of the network. Circulating supply is calculated by +/// taking the initial supply of 1bn coins, and subtracting the amount of coins that are +/// in the mixmining pool and tied up in vesting. +/// +/// The cache is quite simple and does not include an update listener that the other caches have. +#[derive(Clone)] +pub(crate) struct CirculatingSupplyCache { + initialised: Arc, + data: Arc>, +} + +impl CirculatingSupplyCache { + fn new(mix_denom: String) -> CirculatingSupplyCache { + CirculatingSupplyCache { + initialised: Arc::new(AtomicBool::new(false)), + data: Arc::new(RwLock::new(CirculatingSupplyCacheData::new(mix_denom))), + } + } + + pub(crate) async fn get_circulating_supply(&self) -> Option { + match time::timeout(Duration::from_millis(100), self.data.read()).await { + Ok(cache) => Some(cache.deref().into()), + Err(err) => { + error!("Failed to get circulating supply: {err}"); + None + } + } + } + + pub(crate) fn stage(mix_denom: String) -> AdHoc { + AdHoc::on_ignite("Circulating Supply Cache Stage", |rocket| async { + rocket.manage(Self::new(mix_denom)) + }) + } + + pub(crate) async fn update(&self, mixmining_reserve: Coin, vesting_tokens: Coin) { + let mut cache = self.data.write().await; + + let mut circulating_supply = cache.initial_supply.clone(); + circulating_supply.amount -= mixmining_reserve.amount; + circulating_supply.amount -= vesting_tokens.amount; + + log::info!("Updating circulating supply cache"); + log::info!("the mixmining reserve is now {mixmining_reserve}"); + log::info!("the number of tokens still vesting is now {vesting_tokens}"); + log::info!("the circulating supply is now {circulating_supply}"); + + cache.mixmining_reserve.update(mixmining_reserve); + cache.vesting_tokens.update(vesting_tokens); + cache.circulating_supply.update(circulating_supply); + } +} diff --git a/nym-api/src/circulating_supply_api/cache/refresher.rs b/nym-api/src/circulating_supply_api/cache/refresher.rs new file mode 100644 index 0000000000..7f621053b9 --- /dev/null +++ b/nym-api/src/circulating_supply_api/cache/refresher.rs @@ -0,0 +1,134 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use super::CirculatingSupplyCache; +use crate::circulating_supply_api::cache::CirculatingSupplyCacheError; +use crate::support::nyxd::Client; +use contracts_common::truncate_decimal; +use std::collections::HashSet; +use std::sync::atomic::Ordering; +use std::time::Duration; +use task::TaskClient; +use tokio::time; +use validator_client::nyxd::Coin; + +pub(crate) struct CirculatingSupplyCacheRefresher { + nyxd_client: Client, + cache: CirculatingSupplyCache, + caching_interval: Duration, +} + +impl CirculatingSupplyCacheRefresher { + pub(crate) fn new( + nyxd_client: Client, + cache: CirculatingSupplyCache, + caching_interval: Duration, + ) -> Self { + CirculatingSupplyCacheRefresher { + nyxd_client, + cache, + caching_interval, + } + } + + pub(crate) async fn run(&self, mut shutdown: TaskClient) { + let mut interval = time::interval(self.caching_interval); + while !shutdown.is_shutdown() { + tokio::select! { + _ = interval.tick() => { + tokio::select! { + biased; + _ = shutdown.recv() => { + trace!("CirculatingSupplyCacheRefresher: Received shutdown"); + } + ret = self.refresh() => { + if let Err(err) = ret { + error!("Failed to refresh circulating supply cache - {err}"); + } else { + // relaxed memory ordering is fine here. worst case scenario network monitor + // will just have to wait for an additional backoff to see the change. + // And so this will not really incur any performance penalties by setting it every loop iteration + self.cache.initialised.store(true, Ordering::Relaxed) + } + } + } + } + _ = shutdown.recv() => { + trace!("CirculatingSupplyCacheRefresher: Received shutdown"); + } + } + } + } + + async fn get_mixmining_reserve( + &self, + mix_denom: &str, + ) -> Result { + let reward_pool = self + .nyxd_client + .get_current_rewarding_parameters() + .await? + .interval + .reward_pool; + + Ok(Coin::new(truncate_decimal(reward_pool).u128(), mix_denom)) + } + + async fn get_total_vesting_tokens( + &self, + mix_denom: &str, + ) -> Result { + let all_vesting = self.nyxd_client.get_all_vesting_coins().await?; + + // sanity check invariants to make sure all accounts got considered and we got no duplicates + // the cache refreshes so infrequently that the performance penalty is negligible + let mut owners = HashSet::new(); + let mut ids = HashSet::new(); + for acc in &all_vesting { + if !owners.insert(acc.owner.clone()) { + return Err(CirculatingSupplyCacheError::DuplicateVestingAccountEntry { + owner: acc.owner.clone(), + account_id: acc.account_id, + }); + } + + if !ids.insert(acc.account_id) { + return Err(CirculatingSupplyCacheError::DuplicateVestingAccountEntry { + owner: acc.owner.clone(), + account_id: acc.account_id, + }); + } + } + + let current_storage_key = self + .nyxd_client + .get_current_vesting_account_storage_key() + .await?; + if all_vesting.len() != current_storage_key as usize { + return Err( + CirculatingSupplyCacheError::InconsistentNumberOfVestingAccounts { + expected: current_storage_key as usize, + got: all_vesting.len(), + }, + ); + } + + let mut total = Coin::new(0, mix_denom); + for account in all_vesting { + total.amount += account.still_vesting.amount.u128(); + } + + Ok(total) + } + + async fn refresh(&self) -> Result<(), CirculatingSupplyCacheError> { + let chain_details = self.nyxd_client.chain_details().await; + let mix_denom = &chain_details.mix_denom.base; + + let mixmining_reserve = self.get_mixmining_reserve(mix_denom).await?; + let vesting_tokens = self.get_total_vesting_tokens(mix_denom).await?; + + self.cache.update(mixmining_reserve, vesting_tokens).await; + Ok(()) + } +} diff --git a/nym-api/src/circulating_supply_api/mod.rs b/nym-api/src/circulating_supply_api/mod.rs new file mode 100644 index 0000000000..9d0e984ab6 --- /dev/null +++ b/nym-api/src/circulating_supply_api/mod.rs @@ -0,0 +1,37 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use okapi::openapi3::OpenApi; +use rocket::Route; +use rocket_okapi::{openapi_get_routes_spec, settings::OpenApiSettings}; +use task::TaskManager; + +use crate::support::{config::Config, nyxd}; + +use self::cache::refresher::CirculatingSupplyCacheRefresher; + +pub(crate) mod cache; +pub(crate) mod routes; + +/// Merges the routes with http information and returns it to Rocket for serving +pub(crate) fn circulating_supply_routes(settings: &OpenApiSettings) -> (Vec, OpenApi) { + openapi_get_routes_spec![settings: routes::get_circulating_supply] +} + +/// Spawn the circulating supply cache refresher. +pub(crate) fn start_cache_refresh( + config: &Config, + nyxd_client: nyxd::Client, + circulating_supply_cache: &cache::CirculatingSupplyCache, + shutdown: &TaskManager, +) { + if config.get_circulating_supply_enabled() { + let refresher = CirculatingSupplyCacheRefresher::new( + nyxd_client, + circulating_supply_cache.to_owned(), + config.get_circulating_supply_caching_interval(), + ); + let shutdown_listener = shutdown.subscribe(); + tokio::spawn(async move { refresher.run(shutdown_listener).await }); + } +} diff --git a/nym-api/src/circulating_supply_api/routes.rs b/nym-api/src/circulating_supply_api/routes.rs new file mode 100644 index 0000000000..898248445a --- /dev/null +++ b/nym-api/src/circulating_supply_api/routes.rs @@ -0,0 +1,22 @@ +use rocket::http::Status; +use rocket::serde::json::Json; +use rocket::State; + +use crate::circulating_supply_api::cache::CirculatingSupplyCache; +use crate::node_status_api::models::ErrorResponse; +use nym_api_requests::models::CirculatingSupplyResponse; +use rocket_okapi::openapi; + +#[openapi(tag = "circulating-supply")] +#[get("/circulating-supply")] +pub(crate) async fn get_circulating_supply( + cache: &State, +) -> Result, ErrorResponse> { + match cache.get_circulating_supply().await { + Some(value) => Ok(Json(value)), + None => Err(ErrorResponse::new( + "unavailable", + Status::InternalServerError, + )), + } +} diff --git a/nym-api/src/coconut/comm.rs b/nym-api/src/coconut/comm.rs index 75a15f9bc0..d0694d78d6 100644 --- a/nym-api/src/coconut/comm.rs +++ b/nym-api/src/coconut/comm.rs @@ -2,10 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 use crate::coconut::error::Result; -use crate::nyxd_client::Client; +use crate::nyxd; use coconut_interface::VerificationKey; use credentials::coconut::utils::obtain_aggregate_verification_key; -use validator_client::nyxd::SigningNyxdClient; use validator_client::CoconutApiClient; #[async_trait] @@ -14,11 +13,11 @@ pub trait APICommunicationChannel { } pub(crate) struct QueryCommunicationChannel { - nyxd_client: Client, + nyxd_client: nyxd::Client, } impl QueryCommunicationChannel { - pub fn new(nyxd_client: Client) -> Self { + pub fn new(nyxd_client: nyxd::Client) -> Self { QueryCommunicationChannel { nyxd_client } } } diff --git a/nym-api/src/coconut/dkg/controller.rs b/nym-api/src/coconut/dkg/controller.rs index ad60cf2027..3c1c353668 100644 --- a/nym-api/src/coconut/dkg/controller.rs +++ b/nym-api/src/coconut/dkg/controller.rs @@ -11,7 +11,8 @@ use crate::coconut::dkg::{ verification_key::verification_key_submission, }; use crate::coconut::keypair::KeyPair as CoconutKeyPair; -use crate::{nyxd_client, Config}; +use crate::nyxd; +use crate::support::config::Config; use anyhow::Result; use coconut_dkg_common::types::EpochState; use dkg::bte::keys::KeyPair as DkgKeyPair; @@ -19,9 +20,8 @@ use rand::rngs::OsRng; use rand::RngCore; use std::path::PathBuf; use std::time::{Duration, SystemTime}; -use task::TaskClient; +use task::{TaskClient, TaskManager}; use tokio::time::interval; -use validator_client::nyxd::SigningNyxdClient; pub(crate) fn init_keypair(config: &Config) -> Result<()> { let mut rng = OsRng; @@ -49,7 +49,7 @@ pub(crate) struct DkgController { impl DkgController { pub(crate) async fn new( config: &Config, - nyxd_client: nyxd_client::Client, + nyxd_client: nyxd::Client, coconut_keypair: CoconutKeyPair, rng: R, ) -> Result { @@ -84,13 +84,10 @@ impl DkgController { pub(crate) async fn handle_epoch_state(&mut self) { match self.dkg_client.get_current_epoch().await { - Err(e) => warn!("Could not get current epoch state {}", e), + Err(err) => warn!("Could not get current epoch state {err}"), Ok(epoch) => { - if let Err(e) = self.state.is_consistent(epoch.state).await { - error!( - "Epoch state is corrupted - {}, the process should be terminated", - e - ); + if let Err(err) = self.state.is_consistent(epoch.state).await { + error!("Epoch state is corrupted - {err}, the process should be terminated"); } let ret = match epoch.state { EpochState::PublicKeySubmission => { @@ -120,14 +117,14 @@ impl DkgController { // Just wait, in case we need to redo dkg at some point EpochState::InProgress => Ok(()), }; - if let Err(e) = ret { - warn!("Could not handle this iteration for the epoch state: {}", e); + if let Err(err) = ret { + warn!("Could not handle this iteration for the epoch state: {err}"); } else if epoch.state != EpochState::InProgress { let persistent_state = PersistentState::from(&self.state); - if let Err(e) = + if let Err(err) = persistent_state.save_to_file(self.state.persistent_state_path()) { - warn!("Could not backup the state for this iteration: {}", e); + warn!("Could not backup the state for this iteration: {err}"); } } if let Ok(current_timestamp) = @@ -154,4 +151,22 @@ impl DkgController { } } } + + // TODO: can we make it non-async? it seems we'd have to modify `coconut_keypair.set(coconut_keypair_value)` in new + // could we do it? + pub(crate) async fn start( + config: &Config, + nyxd_client: nyxd::Client, + coconut_keypair: CoconutKeyPair, + rng: R, + shutdown: &TaskManager, + ) -> Result<()> + where + R: Sync + Send + 'static, + { + let shutdown_listener = shutdown.subscribe(); + let dkg_controller = DkgController::new(config, nyxd_client, coconut_keypair, rng).await?; + tokio::spawn(async move { dkg_controller.run(shutdown_listener).await }); + Ok(()) + } } diff --git a/nym-api/src/coconut/mod.rs b/nym-api/src/coconut/mod.rs index 6fa4b2ed58..0bd7fc8477 100644 --- a/nym-api/src/coconut/mod.rs +++ b/nym-api/src/coconut/mod.rs @@ -1,20 +1,11 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -pub(crate) mod client; -pub(crate) mod comm; -mod deposit; -pub(crate) mod dkg; -pub(crate) mod error; -pub(crate) mod keypair; -#[cfg(test)] -pub(crate) mod tests; - +use self::comm::APICommunicationChannel; use crate::coconut::client::Client as LocalClient; use crate::coconut::deposit::extract_encryption_key; use crate::coconut::error::{CoconutError, Result}; -use crate::NymApiStorage; - +use crate::support::storage::NymApiStorage; use coconut_bandwidth_contract_common::spend_credential::{ funds_from_cosmos_msgs, SpendCredentialStatus, }; @@ -29,22 +20,28 @@ use credentials::coconut::params::{ use crypto::asymmetric::encryption; use crypto::shared_key::new_ephemeral_shared_key; use crypto::symmetric::stream_cipher; +use getset::{CopyGetters, Getters}; use keypair::KeyPair; use nym_api_requests::coconut::{ BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, }; -use validator_client::nym_api::routes::{BANDWIDTH, COCONUT_ROUTES}; -use validator_client::nyxd::{Coin, Fee}; - -use getset::{CopyGetters, Getters}; use rand_07::rngs::OsRng; use rocket::fairing::AdHoc; use rocket::serde::json::Json; use rocket::State as RocketState; use std::sync::Arc; use tokio::sync::Mutex; +use validator_client::nym_api::routes::{BANDWIDTH, COCONUT_ROUTES}; +use validator_client::nyxd::{Coin, Fee}; -use self::comm::APICommunicationChannel; +pub(crate) mod client; +pub(crate) mod comm; +mod deposit; +pub(crate) mod dkg; +pub(crate) mod error; +pub(crate) mod keypair; +#[cfg(test)] +pub(crate) mod tests; pub struct State { client: Arc, diff --git a/nym-api/src/coconut/tests.rs b/nym-api/src/coconut/tests.rs index 49f58e8c47..db222270d5 100644 --- a/nym-api/src/coconut/tests.rs +++ b/nym-api/src/coconut/tests.rs @@ -34,7 +34,7 @@ use validator_client::nyxd::Coin; use validator_client::nyxd::{tx::Hash, AccountId, DeliverTx, Event, Fee, Tag, TxResponse}; use crate::coconut::State; -use crate::NymApiStorage; +use crate::support::storage::NymApiStorage; use async_trait::async_trait; use coconut_dkg_common::dealer::{ ContractDealing, DealerDetails, DealerDetailsResponse, DealerType, diff --git a/nym-api/src/epoch_operations/error.rs b/nym-api/src/epoch_operations/error.rs index 91e8005dd7..6ebc8b5802 100644 --- a/nym-api/src/epoch_operations/error.rs +++ b/nym-api/src/epoch_operations/error.rs @@ -4,10 +4,17 @@ use crate::node_status_api::models::NymApiStorageError; use thiserror::Error; use validator_client::nyxd::error::NyxdError; +use validator_client::nyxd::AccountId; use validator_client::ValidatorClientError; #[derive(Debug, Error)] pub enum RewardingError { + #[error("Our account ({our_address}) is not permitted to update rewarded set and perform rewarding. The allowed address is {allowed_address}")] + Unauthorised { + our_address: AccountId, + allowed_address: AccountId, + }, + // #[error("There were no mixnodes to reward (network is dead)")] // NoMixnodesToReward, #[error("Failed to execute the smart contract - {0}")] diff --git a/nym-api/src/epoch_operations/mod.rs b/nym-api/src/epoch_operations/mod.rs index c38a52c706..c20ae3a363 100644 --- a/nym-api/src/epoch_operations/mod.rs +++ b/nym-api/src/epoch_operations/mod.rs @@ -2,20 +2,23 @@ // SPDX-License-Identifier: Apache-2.0 // there is couple of reasons for putting this in a separate module: -// 1. I didn't feel it fit well in validator "cache". It seems like purpose of cache is to just keep updating local data +// 1. I didn't feel it fit well in nym contract "cache". It seems like purpose of cache is to just keep updating local data // rather than attempting to change global view (i.e. the active set) // -// 2. However, even if it was to exist in the validator cache refresher, we'd have to create a different "run" +// 2. However, even if it was to exist in the nym contract cache refresher, we'd have to create a different "run" // method as it doesn't have access to the signing client which we need in the case of updating rewarded sets -// (because validator cache can be run by anyone regardless of whether, say, network monitor exists) +// (because nym contract cache can be run by anyone regardless of whether, say, network monitor exists) // // 3. Eventually this whole procedure is going to get expanded to allow for distribution of rewarded set generation // and hence this might be a good place for it. -use crate::contract_cache::ValidatorCache; -use crate::nyxd_client::Client; -use crate::storage::models::RewardingReport; -use crate::storage::NymApiStorage; +use crate::epoch_operations::helpers::stake_to_f64; +use crate::node_status_api::ONE_DAY; +use crate::nym_contract_cache::cache::NymContractCache; +use crate::support::nyxd::Client; +use crate::support::storage::models::RewardingReport; +use crate::support::storage::NymApiStorage; +use error::RewardingError; use mixnet_contract_common::families::FamilyHead; use mixnet_contract_common::{ reward_params::Performance, CurrentIntervalResponse, ExecuteMsg, Interval, MixId, @@ -26,17 +29,12 @@ use rand::rngs::OsRng; use std::collections::HashMap; use std::collections::HashSet; use std::time::Duration; +use task::{TaskClient, TaskManager}; use tokio::time::sleep; -use validator_client::nyxd::SigningNyxdClient; pub(crate) mod error; mod helpers; -use crate::epoch_operations::helpers::stake_to_f64; -use crate::node_status_api::ONE_DAY; -use error::RewardingError; -use task::TaskClient; - #[derive(Debug, Clone, Copy)] pub(crate) struct MixnodeToReward { pub(crate) mix_id: MixId, @@ -54,8 +52,8 @@ impl From for ExecuteMsg { } pub struct RewardedSetUpdater { - nyxd_client: Client, - validator_cache: ValidatorCache, + nyxd_client: Client, + nym_contract_cache: NymContractCache, storage: NymApiStorage, } @@ -76,16 +74,16 @@ impl RewardedSetUpdater { Ok(self.nyxd_client.get_current_interval().await?) } - pub(crate) async fn new( - nyxd_client: Client, - validator_cache: ValidatorCache, + pub(crate) fn new( + nyxd_client: Client, + nym_contract_cache: NymContractCache, storage: NymApiStorage, - ) -> Result { - Ok(RewardedSetUpdater { + ) -> Self { + RewardedSetUpdater { nyxd_client, - validator_cache, + nym_contract_cache, storage, - }) + } } async fn determine_layers( @@ -98,7 +96,7 @@ impl RewardedSetUpdater { let mut rng = OsRng; let layers = vec![Layer::One, Layer::Two, Layer::Three]; - let mix_to_family = self.validator_cache.mix_to_family().await.to_vec(); + let mix_to_family = self.nym_contract_cache.mix_to_family().await.to_vec(); let mix_to_family = mix_to_family .into_iter() @@ -181,9 +179,8 @@ impl RewardedSetUpdater { info!("There are no nodes to reward in this epoch"); } else if let Err(err) = self.nyxd_client.send_rewarding_messages(&to_reward).await { error!( - "failed to perform mixnode rewarding for epoch {}! Error encountered: {}", + "failed to perform mixnode rewarding for epoch {}! Error encountered: {err}", current_interval.current_epoch_absolute_id(), - err ); return Err(err.into()); } @@ -209,7 +206,7 @@ impl RewardedSetUpdater { Ok(nodes) => nodes.into_iter().map(|(id, _)| id).collect::>(), Err(err) => { warn!("failed to obtain the current rewarded set - {err}. falling back to the cached version"); - self.validator_cache + self.nym_contract_cache .rewarded_set() .await .into_inner() @@ -277,7 +274,7 @@ impl RewardedSetUpdater { let epoch_end = interval.current_epoch_end(); - let all_mixnodes = self.validator_cache.mixnodes().await; + let all_mixnodes = self.nym_contract_cache.mixnodes().await; if all_mixnodes.is_empty() { log::warn!("there don't seem to be any mixnodes on the network!") } @@ -355,7 +352,7 @@ impl RewardedSetUpdater { } } - self.validator_cache + self.nym_contract_cache .update_mixnodes_blacklist(mix_blacklist_add, mix_blacklist_remove) .await; @@ -367,7 +364,7 @@ impl RewardedSetUpdater { } } - self.validator_cache + self.nym_contract_cache .update_gateways_blacklist(gate_blacklist_add, gate_blacklist_remove) .await; Ok(()) @@ -379,7 +376,7 @@ impl RewardedSetUpdater { loop { let current_interval = match self.current_interval_details().await { Err(err) => { - error!("failed to obtain information about the current interval - {}. Going to retry in {}s", err, POLL_INTERVAL.as_secs()); + error!("failed to obtain information about the current interval - {err}. Going to retry in {}s", POLL_INTERVAL.as_secs()); tokio::select! { _ = sleep(POLL_INTERVAL) => { continue @@ -422,7 +419,7 @@ impl RewardedSetUpdater { } pub(crate) async fn run(&mut self, mut shutdown: TaskClient) -> Result<(), RewardingError> { - self.validator_cache.wait_for_initial_values().await; + self.nym_contract_cache.wait_for_initial_values().await; while !shutdown.is_shutdown() { let interval_details = match self.wait_until_epoch_end(&mut shutdown).await { @@ -442,4 +439,36 @@ impl RewardedSetUpdater { Ok(()) } + + pub(crate) fn start( + nyxd_client: Client, + nym_contract_cache: &NymContractCache, + storage: &NymApiStorage, + shutdown: &TaskManager, + ) { + let mut rewarded_set_updater = RewardedSetUpdater::new( + nyxd_client, + nym_contract_cache.to_owned(), + storage.to_owned(), + ); + let shutdown_listener = shutdown.subscribe(); + tokio::spawn(async move { rewarded_set_updater.run(shutdown_listener).await }); + } +} + +// before going any further, let's check whether we're allowed to perform rewarding +// (if not, let's blow up sooner rather than later) +pub(crate) async fn ensure_rewarding_permission( + nyxd_client: &Client, +) -> Result<(), RewardingError> { + let allowed_address = nyxd_client.get_rewarding_validator_address().await?; + let our_address = nyxd_client.client_address().await; + if allowed_address != our_address { + Err(RewardingError::Unauthorised { + our_address, + allowed_address, + }) + } else { + Ok(()) + } } diff --git a/nym-api/src/main.rs b/nym-api/src/main.rs index 3d54fde175..f3edb2b54f 100644 --- a/nym-api/src/main.rs +++ b/nym-api/src/main.rs @@ -4,537 +4,181 @@ #[macro_use] extern crate rocket; -use crate::config::Config; -use crate::contract_cache::ValidatorCacheRefresher; use crate::epoch_operations::RewardedSetUpdater; -use crate::network_monitor::NetworkMonitorBuilder; use crate::node_status_api::uptime_updater::HistoricalUptimeUpdater; -use crate::nyxd_client::Client; -use crate::storage::NymApiStorage; +use crate::support::cli; +use crate::support::cli::CliArgs; +use crate::support::config::Config; +use crate::support::storage; +use crate::support::storage::NymApiStorage; use ::config::defaults::setup_env; -use ::config::defaults::var_names::{MIXNET_CONTRACT_ADDRESS, MIX_DENOM}; -use ::config::{NymConfig, OptionalSet}; use anyhow::Result; -use build_information::BinaryBuildInformation; +use circulating_supply_api::cache::CirculatingSupplyCache; use clap::Parser; -use contract_cache::ValidatorCache; -use lazy_static::lazy_static; -use log::{info, warn}; +use config::NymConfig; +use log::info; use logging::setup_logging; use node_status_api::NodeStatusCache; -use okapi::openapi3::OpenApi; -use rocket::fairing::AdHoc; -use rocket::http::Method; -use rocket::{Ignite, Rocket}; -use rocket_cors::{AllowedHeaders, AllowedOrigins, Cors}; -use rocket_okapi::mount_endpoints_and_merged_docs; -use rocket_okapi::swagger_ui::make_swagger_ui; -use std::sync::Arc; -use std::time::Duration; -use std::{fs, process}; -use task::{wait_for_signal, TaskManager}; -use tokio::sync::Notify; -use validator_client::nyxd::{self, SigningNyxdClient}; +use nym_contract_cache::cache::NymContractCache; +use std::error::Error; +use support::{http, nyxd}; +use task::{wait_for_signal_and_error, TaskManager}; #[cfg(feature = "coconut")] -use coconut::{ - comm::QueryCommunicationChannel, - dkg::controller::{init_keypair, DkgController}, - InternalSignRequest, -}; +use coconut::dkg::controller::DkgController; + #[cfg(feature = "coconut")] use rand::rngs::OsRng; -pub(crate) mod config; -pub(crate) mod contract_cache; +mod circulating_supply_api; mod epoch_operations; mod network_monitor; -mod node_status_api; -pub(crate) mod nyxd_client; -pub(crate) mod storage; -mod swagger; +pub(crate) mod node_status_api; +pub(crate) mod nym_contract_cache; +pub(crate) mod support; #[cfg(feature = "coconut")] mod coconut; -lazy_static! { - pub static ref PRETTY_BUILD_INFORMATION: String = - BinaryBuildInformation::new(env!("CARGO_PKG_VERSION")).pretty_print(); -} - -// Helper for passing LONG_VERSION to clap -fn pretty_build_info_static() -> &'static str { - &PRETTY_BUILD_INFORMATION -} - -// explicitly defined custom parser (as opposed to just using -// #[arg(value_parser = clap::value_parser!(u8).range(0..100))] -// for better error message -fn threshold_in_range(s: &str) -> Result { - let threshold: usize = s - .parse() - .map_err(|_| format!("`{s}` isn't a valid threshold number"))?; - if threshold > 100 { - Err(format!("{threshold} is not within the range 0-100")) - } else { - Ok(threshold as u8) - } -} - -#[derive(Parser)] -#[clap(author = "Nymtech", version, long_version = pretty_build_info_static(), about)] -struct ApiArgs { - /// Path pointing to an env file that configures the Nym API. - #[clap(short, long)] - config_env_file: Option, - - /// Id of the nym-api we want to run - #[clap(long)] - id: Option, - - /// Specifies whether network monitoring is enabled on this API - #[clap(short = 'm', long)] - enable_monitor: Option, - - /// Specifies whether network rewarding is enabled on this API - #[clap(short = 'r', long, requires = "enable_monitor", requires = "mnemonic")] - enable_rewarding: Option, - - /// Endpoint to nyxd instance from which the monitor will grab nodes to test - #[clap(long)] - nyxd_validator: Option, - - /// Address of the mixnet contract managing the network - #[clap(long)] - mixnet_contract: Option, - - /// Mnemonic of the network monitor used for rewarding operators - // even though we're currently converting the mnemonic to string (and then back to the concrete type) - // at least we're getting immediate validation when passing the arguments - #[clap(long)] - mnemonic: Option, - - /// Specifies whether a config file based on provided arguments should be saved to a file - #[clap(short = 'w', long)] - save_config: bool, - - /// Specifies the minimum percentage of monitor test run data present in order to distribute rewards for given interval. - #[clap(long, value_parser = threshold_in_range)] - monitor_threshold: Option, - - /// Mixnodes with reliability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set. - #[clap(long, value_parser = threshold_in_range)] - min_mixnode_reliability: Option, - - /// Gateways with reliability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set. - #[clap(long, value_parser = threshold_in_range)] - min_gateway_reliability: Option, - - /// Set this nym api to work in a enabled credentials that would attempt to use gateway with the bandwidth credential requirement - #[clap(long)] - enabled_credentials_mode: Option, - - /// Announced address where coconut clients will connect. - #[cfg(feature = "coconut")] - #[clap(long)] - announce_address: Option, - - /// Flag to indicate whether coconut signer authority is enabled on this API - #[cfg(feature = "coconut")] - #[clap(long, requires = "mnemonic", requires = "announce-address")] - enable_coconut: Option, -} - -async fn wait_for_interrupt(mut shutdown: TaskManager) { - wait_for_signal().await; - - log::info!("Sending shutdown"); - shutdown.signal_shutdown().ok(); - - log::info!("Waiting for tasks to finish... (Press ctrl-c to force)"); - shutdown.wait_for_shutdown().await; - - log::info!("Stopping nym API"); -} - -fn override_config(mut config: Config, args: ApiArgs) -> Config { - if let Some(id) = args.id { - fs::create_dir_all(Config::default_config_directory(Some(&id))) - .expect("Could not create config directory"); - fs::create_dir_all(Config::default_data_directory(Some(&id))) - .expect("Could not create data directory"); - config = config.with_id(&id); - } - - config = config - .with_optional(Config::with_custom_nyxd_validator, args.nyxd_validator) - .with_optional_env( - Config::with_custom_mixnet_contract, - args.mixnet_contract, - MIXNET_CONTRACT_ADDRESS, - ) - .with_optional(Config::with_mnemonic, args.mnemonic) - .with_optional( - Config::with_minimum_interval_monitor_threshold, - args.monitor_threshold, - ) - .with_optional( - Config::with_min_mixnode_reliability, - args.min_mixnode_reliability, - ) - .with_optional( - Config::with_min_gateway_reliability, - args.min_gateway_reliability, - ) - .with_optional(Config::with_network_monitor_enabled, args.enable_monitor) - .with_optional(Config::with_rewarding_enabled, args.enable_rewarding) - .with_optional( - Config::with_disabled_credentials_mode, - args.enabled_credentials_mode.map(|b| !b), - ); - - #[cfg(feature = "coconut")] - { - config = config - .with_optional(Config::with_announce_address, args.announce_address) - .with_optional(Config::with_coconut_signer_enabled, args.enable_coconut); - } - - if args.save_config { - info!("Saving the configuration to a file"); - if let Err(err) = config.save_to_file(None) { - error!("Failed to write config to a file - {err}"); - process::exit(1) - } - } - - config -} - -fn setup_cors() -> Result { - let allowed_origins = AllowedOrigins::all(); - - // You can also deserialize this - let cors = rocket_cors::CorsOptions { - allowed_origins, - allowed_methods: vec![Method::Post, Method::Get] - .into_iter() - .map(From::from) - .collect(), - allowed_headers: AllowedHeaders::all(), - allow_credentials: true, - ..Default::default() - } - .to_cors()?; - - Ok(cors) -} - -fn setup_liftoff_notify(notify: Arc) -> AdHoc { - AdHoc::on_liftoff("Liftoff notifier", |_| { - Box::pin(async move { notify.notify_one() }) - }) -} - -fn setup_network_monitor<'a>( - config: &'a Config, - _nyxd_client: Client, - system_version: &str, - rocket: &Rocket, -) -> Option> { - if !config.get_network_monitor_enabled() { - return None; - } - - // get instances of managed states - let node_status_storage = rocket.state::().unwrap().clone(); - let validator_cache = rocket.state::().unwrap().clone(); - - Some(NetworkMonitorBuilder::new( - config, - _nyxd_client, - system_version, - node_status_storage, - validator_cache, - )) -} - -// TODO: Remove if still unused -#[allow(dead_code)] -fn expected_monitor_test_runs(config: &Config, interval_length: Duration) -> usize { - let test_delay = config.get_network_monitor_run_interval(); - - // this is just a rough estimate. In real world there will be slightly fewer test runs - // as they are not instantaneous and hence do not happen exactly every test_delay - (interval_length.as_secs() / test_delay.as_secs()) as usize -} - -async fn setup_rocket( - config: &Config, - _mix_denom: String, - liftoff_notify: Arc, - _nyxd_client: Client, - #[cfg(feature = "coconut")] coconut_keypair: coconut::keypair::KeyPair, -) -> Result> { - let openapi_settings = rocket_okapi::settings::OpenApiSettings::default(); - let mut rocket = rocket::build(); - - let custom_route_spec = (vec![], custom_openapi_spec()); - - mount_endpoints_and_merged_docs! { - rocket, - "/v1".to_owned(), - openapi_settings, - "/" => custom_route_spec, - "" => contract_cache::validator_cache_routes(&openapi_settings), - "/status" => node_status_api::node_status_routes(&openapi_settings, config.get_network_monitor_enabled()), - } - - let rocket = rocket - .mount("/swagger", make_swagger_ui(&swagger::get_docs())) - .attach(setup_cors()?) - .attach(setup_liftoff_notify(liftoff_notify)) - .attach(ValidatorCache::stage()) - .attach(NodeStatusCache::stage()); - - // This is not a very nice approach. A lazy value would be more suitable, but that's still - // a nightly feature: https://github.com/rust-lang/rust/issues/74465 - let storage = if cfg!(feature = "coconut") || config.get_network_monitor_enabled() { - Some(NymApiStorage::init(config.get_node_status_api_database_path()).await?) - } else { - None - }; - - #[cfg(feature = "coconut")] - let rocket = if config.get_coconut_signer_enabled() { - rocket.attach(InternalSignRequest::stage( - _nyxd_client.clone(), - _mix_denom, - coconut_keypair, - QueryCommunicationChannel::new(_nyxd_client), - storage.clone().unwrap(), - )) - } else { - rocket - }; - - // see if we should start up network monitor - let rocket = if config.get_network_monitor_enabled() { - rocket.attach(storage::NymApiStorage::stage(storage.unwrap())) - } else { - rocket - }; - - Ok(rocket.ignite().await?) -} - -fn custom_openapi_spec() -> OpenApi { - use rocket_okapi::okapi::openapi3::*; - OpenApi { - openapi: OpenApi::default_version(), - info: Info { - title: "Validator API".to_owned(), - description: None, - terms_of_service: None, - contact: None, - license: None, - version: env!("CARGO_PKG_VERSION").to_owned(), - ..Default::default() - }, - servers: get_servers(), - ..Default::default() - } -} - -fn get_servers() -> Vec { - if std::env::var_os("CARGO").is_some() { - return vec![]; - } - vec![rocket_okapi::okapi::openapi3::Server { - url: std::env::var("OPEN_API_BASE").unwrap_or_else(|_| "/api/v1/".to_owned()), - description: Some("API".to_owned()), - ..Default::default() - }] -} - -async fn run_nym_api(args: ApiArgs) -> Result<()> { - let system_version = env!("CARGO_PKG_VERSION"); - - // try to load config from the file, if it doesn't exist, use default values - let id = args.id.as_deref(); - let (config, _already_inited) = match Config::load_from_file(id) { - Ok(cfg) => (cfg, true), - Err(_) => { - let config_path = Config::default_config_file_path(id) - .into_os_string() - .into_string() - .unwrap(); - warn!( - "Could not load the configuration file from {config_path}. Either the file did not exist or was malformed. Using the default values instead", - ); - (Config::new(), false) - } - }; - - let save_to_file = args.save_config; - let config = override_config(config, args); - - #[cfg(feature = "coconut")] - if !_already_inited { - init_keypair(&config)?; - } - - // if we just wanted to write data to the config, exit - if save_to_file { - info!("Saving the configuration to a file"); - if let Err(err) = config.save_to_file(None) { - error!("Failed to write config to a file - {err}"); - process::exit(1) - } else { - return Ok(()); - } - } - - let mix_denom = std::env::var(MIX_DENOM).expect("mix denom not set"); - - let signing_nyxd_client = Client::new_signing(&config); - - let liftoff_notify = Arc::new(Notify::new()); - // We need a bigger timeout - let shutdown = TaskManager::new(10); - - #[cfg(feature = "coconut")] - let coconut_keypair = coconut::keypair::KeyPair::new(); - - // let's build our rocket! - let rocket = setup_rocket( - &config, - mix_denom, - Arc::clone(&liftoff_notify), - signing_nyxd_client.clone(), - #[cfg(feature = "coconut")] - coconut_keypair.clone(), - ) - .await?; - let monitor_builder = setup_network_monitor( - &config, - signing_nyxd_client.clone(), - system_version, - &rocket, - ); - - let validator_cache = rocket.state::().unwrap().clone(); - let node_status_cache = rocket.state::().unwrap().clone(); - - #[cfg(feature = "coconut")] - { - let dkg_controller = - DkgController::new(&config, signing_nyxd_client.clone(), coconut_keypair, OsRng) - .await?; - let shutdown_listener = shutdown.subscribe(); - tokio::spawn(async move { dkg_controller.run(shutdown_listener).await }); - } - - // if network monitor is disabled, we're not going to be sending any rewarding hence - // we're not starting signing client - let validator_cache_listener = if config.get_network_monitor_enabled() { - // Main storage - let storage = rocket.state::().unwrap().clone(); - - // setup our daily uptime updater. Note that if network monitor is disabled, then we have - // no data for the updates and hence we don't need to start it up - let uptime_updater = HistoricalUptimeUpdater::new(storage.clone()); - let shutdown_listener = shutdown.subscribe(); - tokio::spawn(async move { uptime_updater.run(shutdown_listener).await }); - - // spawn the validator cache refresher - let validator_cache_refresher = ValidatorCacheRefresher::new( - signing_nyxd_client.clone(), - config.get_caching_interval(), - validator_cache.clone(), - ); - let validator_cache_listener = validator_cache_refresher.subscribe(); - let shutdown_listener = shutdown.subscribe(); - tokio::spawn(async move { validator_cache_refresher.run(shutdown_listener).await }); - - // spawn rewarded set updater - if config.get_rewarding_enabled() { - let mut rewarded_set_updater = - RewardedSetUpdater::new(signing_nyxd_client, validator_cache.clone(), storage) - .await?; - let shutdown_listener = shutdown.subscribe(); - tokio::spawn(async move { rewarded_set_updater.run(shutdown_listener).await.unwrap() }); - } - validator_cache_listener - } else { - // Spawn the validator cache refresher. - // When the network monitor is not enabled, we spawn the validator cache refresher task - // with just a nyxd client, in contrast to a signing client. - let nyxd_client = Client::new_query(&config); - let validator_cache_refresher = ValidatorCacheRefresher::new( - nyxd_client, - config.get_caching_interval(), - validator_cache.clone(), - ); - let validator_cache_listener = validator_cache_refresher.subscribe(); - let shutdown_listener = shutdown.subscribe(); - tokio::spawn(async move { validator_cache_refresher.run(shutdown_listener).await }); - - validator_cache_listener - }; - - // Spawn the node status cache refresher. - // It is primarily refreshed in-sync with the validator cache, however provide a fallback - // caching interval that is twice the validator cache - let storage = rocket.state::().cloned(); - let mut nym_api_cache_refresher = node_status_api::NodeStatusCacheRefresher::new( - node_status_cache, - config.get_caching_interval().saturating_mul(2), - validator_cache, - validator_cache_listener, - storage, - ); - let shutdown_listener = shutdown.subscribe(); - tokio::spawn(async move { nym_api_cache_refresher.run(shutdown_listener).await }); - - // launch the rocket! - // Rocket handles shutdown on it's own, but its shutdown handling should be incorporated - // with that of the rest of the tasks. - // Currently it's runtime is forcefully terminated once the nym-api exits. - let shutdown_handle = rocket.shutdown(); - tokio::spawn(rocket.launch()); - - // to finish building our monitor, we need to have rocket up and running so that we could - // obtain our bandwidth credential - if let Some(monitor_builder) = monitor_builder { - info!("Starting network monitor..."); - // wait for rocket's liftoff stage - liftoff_notify.notified().await; - - // we're ready to go! spawn the network monitor! - let runnables = monitor_builder.build().await; - runnables.spawn_tasks(&shutdown); - } else { - info!("Network monitoring is disabled."); - } - - wait_for_interrupt(shutdown).await; - shutdown_handle.notify(); - - Ok(()) +struct ShutdownHandles { + task_manager_handle: TaskManager, + rocket_handle: rocket::Shutdown, } #[tokio::main] -async fn main() -> Result<()> { - println!("Starting validator api..."); +async fn main() -> Result<(), Box> { + println!("Starting nym api..."); cfg_if::cfg_if! {if #[cfg(feature = "console-subscriber")] { - // instriment tokio console subscriber needs RUSTFLAGS="--cfg tokio_unstable" at build time + // instrument tokio console subscriber needs RUSTFLAGS="--cfg tokio_unstable" at build time console_subscriber::init(); }} setup_logging(); - let args = ApiArgs::parse(); + let args = cli::CliArgs::parse(); setup_env(args.config_env_file.as_ref()); run_nym_api(args).await } + +async fn start_nym_api_tasks( + config: Config, +) -> Result> { + let system_version = clap::crate_version!(); + + let nyxd_client = nyxd::Client::new(&config); + let mix_denom = nyxd_client.chain_details().await.mix_denom.base; + + // TODO: question to @BN: why are we creating a fresh coconut keypair here every time as opposed + // to using some persistent keys? + #[cfg(feature = "coconut")] + let coconut_keypair = coconut::keypair::KeyPair::new(); + + // let's build our rocket! + let rocket = http::setup_rocket( + &config, + mix_denom, + nyxd_client.clone(), + #[cfg(feature = "coconut")] + coconut_keypair.clone(), + ) + .await?; + + // setup shutdowns + let shutdown = TaskManager::new(10); + + // Rocket handles shutdown on its own, but its shutdown handling should be incorporated + // with that of the rest of the tasks. Currently its runtime is forcefully terminated once + // nym-api exits. + let rocket_shutdown_handle = rocket.shutdown(); + + // get references to the managed state + let nym_contract_cache_state = rocket.state::().unwrap(); + let node_status_cache_state = rocket.state::().unwrap(); + let circulating_supply_cache_state = rocket.state::().unwrap(); + let maybe_storage = rocket.state::(); + + // start all the caches first + let nym_contract_cache_listener = nym_contract_cache::start_refresher( + &config, + nym_contract_cache_state, + nyxd_client.clone(), + &shutdown, + ); + node_status_api::start_cache_refresh( + &config, + nym_contract_cache_state, + node_status_cache_state, + maybe_storage, + nym_contract_cache_listener, + &shutdown, + ); + circulating_supply_api::start_cache_refresh( + &config, + nyxd_client.clone(), + circulating_supply_cache_state, + &shutdown, + ); + + // start dkg task + #[cfg(feature = "coconut")] + DkgController::start( + &config, + nyxd_client.clone(), + coconut_keypair, + OsRng, + &shutdown, + ) + .await?; + + // and then only start the uptime updater (and the monitor itself, duh) + // if the monitoring if it's enabled + if config.get_network_monitor_enabled() { + // if network monitor is enabled, the storage MUST BE available + let storage = maybe_storage.unwrap(); + + network_monitor::start( + &config, + nym_contract_cache_state, + storage, + nyxd_client.clone(), + system_version, + &shutdown, + ) + .await; + + HistoricalUptimeUpdater::start(storage, &shutdown); + + // start 'rewarding' if its enabled + if config.get_rewarding_enabled() { + epoch_operations::ensure_rewarding_permission(&nyxd_client).await?; + RewardedSetUpdater::start(nyxd_client, nym_contract_cache_state, storage, &shutdown); + } + } + + // Launch the rocket, serve http endpoints and finish the startup + tokio::spawn(rocket.launch()); + + Ok(ShutdownHandles { + task_manager_handle: shutdown, + rocket_handle: rocket_shutdown_handle, + }) +} + +async fn run_nym_api(cli_args: CliArgs) -> Result<(), Box> { + let save_to_file = cli_args.save_config; + let config = cli::build_config(cli_args)?; + + // if we just wanted to write data to the config, exit, don't start any tasks + if save_to_file { + info!("Saving the configuration to a file"); + config.save_to_file(None)?; + return Ok(()); + } + + let mut shutdown_handlers = start_nym_api_tasks(config).await?; + + let res = wait_for_signal_and_error(&mut shutdown_handlers.task_manager_handle).await; + shutdown_handlers.rocket_handle.notify(); + + res +} diff --git a/nym-api/src/network_monitor/mod.rs b/nym-api/src/network_monitor/mod.rs index e2a9dbdfc6..2d85101465 100644 --- a/nym-api/src/network_monitor/mod.rs +++ b/nym-api/src/network_monitor/mod.rs @@ -1,16 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use credential_storage::PersistentStorage; -use crypto::asymmetric::{encryption, identity}; -use futures::channel::mpsc; -use gateway_client::bandwidth::BandwidthController; -use std::sync::Arc; -use task::TaskManager; -use validator_client::nyxd::SigningNyxdClient; - -use crate::config::Config; -use crate::contract_cache::ValidatorCache; +use crate::network_monitor; use crate::network_monitor::monitor::preparer::PacketPreparer; use crate::network_monitor::monitor::processor::{ ReceivedProcessor, ReceivedProcessorReceiver, ReceivedProcessorSender, @@ -21,8 +12,16 @@ use crate::network_monitor::monitor::receiver::{ use crate::network_monitor::monitor::sender::PacketSender; use crate::network_monitor::monitor::summary_producer::SummaryProducer; use crate::network_monitor::monitor::Monitor; -use crate::nyxd_client::Client; +use crate::nym_contract_cache::cache::NymContractCache; use crate::storage::NymApiStorage; +use crate::support::config::Config; +use crate::support::nyxd; +use credential_storage::PersistentStorage; +use crypto::asymmetric::{encryption, identity}; +use futures::channel::mpsc; +use gateway_client::bandwidth::BandwidthController; +use std::sync::Arc; +use task::TaskManager; pub(crate) mod chunker; pub(crate) mod gateways_reader; @@ -32,21 +31,37 @@ pub(crate) mod test_route; pub(crate) const ROUTE_TESTING_TEST_NONCE: u64 = 0; +pub(crate) fn setup<'a>( + config: &'a Config, + nym_contract_cache_state: &NymContractCache, + storage: &NymApiStorage, + _nyxd_client: nyxd::Client, + system_version: &str, +) -> NetworkMonitorBuilder<'a> { + NetworkMonitorBuilder::new( + config, + _nyxd_client, + system_version, + storage.to_owned(), + nym_contract_cache_state.to_owned(), + ) +} + pub(crate) struct NetworkMonitorBuilder<'a> { config: &'a Config, - _nyxd_client: Client, + _nyxd_client: nyxd::Client, system_version: String, node_status_storage: NymApiStorage, - validator_cache: ValidatorCache, + validator_cache: NymContractCache, } impl<'a> NetworkMonitorBuilder<'a> { pub(crate) fn new( config: &'a Config, - _nyxd_client: Client, + _nyxd_client: nyxd::Client, system_version: &str, node_status_storage: NymApiStorage, - validator_cache: ValidatorCache, + validator_cache: NymContractCache, ) -> Self { NetworkMonitorBuilder { config, @@ -154,7 +169,7 @@ impl NetworkMonitorRunnables { fn new_packet_preparer( system_version: &str, - validator_cache: ValidatorCache, + validator_cache: NymContractCache, per_node_test_packets: usize, self_public_identity: identity::PublicKey, self_public_encryption: encryption::PublicKey, @@ -207,3 +222,25 @@ fn new_packet_receiver( ) -> PacketReceiver { PacketReceiver::new(gateways_status_updater, processor_packets_sender) } + +// TODO: 1) does it still have to have separate builder or could we get rid of it now? +// TODO: 2) how do we make it non-async as other 'start' methods? +pub(crate) async fn start( + config: &Config, + nym_contract_cache_state: &NymContractCache, + storage: &NymApiStorage, + nyxd_client: nyxd::Client, + system_version: &str, + shutdown: &TaskManager, +) { + let monitor_builder = network_monitor::setup( + config, + nym_contract_cache_state, + storage, + nyxd_client, + system_version, + ); + info!("Starting network monitor..."); + let runnables = monitor_builder.build().await; + runnables.spawn_tasks(shutdown); +} diff --git a/nym-api/src/network_monitor/monitor/mod.rs b/nym-api/src/network_monitor/monitor/mod.rs index f0f17bad09..d3cb775f26 100644 --- a/nym-api/src/network_monitor/monitor/mod.rs +++ b/nym-api/src/network_monitor/monitor/mod.rs @@ -1,7 +1,6 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::Config; use crate::network_monitor::monitor::preparer::PacketPreparer; use crate::network_monitor::monitor::processor::ReceivedProcessor; use crate::network_monitor::monitor::sender::PacketSender; @@ -9,6 +8,7 @@ use crate::network_monitor::monitor::summary_producer::{SummaryProducer, TestSum use crate::network_monitor::test_packet::TestPacket; use crate::network_monitor::test_route::TestRoute; use crate::storage::NymApiStorage; +use crate::support::config::Config; use log::{debug, error, info}; use std::collections::{HashMap, HashSet}; use std::process; diff --git a/nym-api/src/network_monitor/monitor/preparer.rs b/nym-api/src/network_monitor/monitor/preparer.rs index 2351dcca64..d8ca980635 100644 --- a/nym-api/src/network_monitor/monitor/preparer.rs +++ b/nym-api/src/network_monitor/monitor/preparer.rs @@ -1,11 +1,11 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::contract_cache::ValidatorCache; use crate::network_monitor::chunker::Chunker; use crate::network_monitor::monitor::sender::GatewayPackets; use crate::network_monitor::test_packet::{NodeType, TestPacket}; use crate::network_monitor::test_route::TestRoute; +use crate::nym_contract_cache::cache::NymContractCache; use crypto::asymmetric::{encryption, identity}; use log::info; use mixnet_contract_common::{Addr, GatewayBond, Layer, MixId, MixNodeBond}; @@ -134,7 +134,7 @@ pub(crate) struct PreparedPackets { pub(crate) struct PacketPreparer { system_version: String, chunker: Option, - validator_cache: ValidatorCache, + validator_cache: NymContractCache, /// Number of test packets sent to each node per_node_test_packets: usize, @@ -150,7 +150,7 @@ pub(crate) struct PacketPreparer { impl PacketPreparer { pub(crate) fn new( system_version: &str, - validator_cache: ValidatorCache, + validator_cache: NymContractCache, per_node_test_packets: usize, self_public_identity: identity::PublicKey, self_public_encryption: encryption::PublicKey, diff --git a/nym-api/src/node_status_api/cache.rs b/nym-api/src/node_status_api/cache.rs deleted file mode 100644 index 5a76ffd85a..0000000000 --- a/nym-api/src/node_status_api/cache.rs +++ /dev/null @@ -1,396 +0,0 @@ -// Copyright 2022 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::contract_cache::{Cache, CacheNotification, ValidatorCache}; -use crate::storage::NymApiStorage; -use mixnet_contract_common::families::FamilyHead; -use mixnet_contract_common::reward_params::Performance; -use mixnet_contract_common::{ - IdentityKey, Interval, MixId, MixNodeDetails, RewardedSetNodeStatus, RewardingParams, -}; -use nym_api_requests::models::{MixNodeBondAnnotated, MixnodeStatus}; -use rocket::fairing::AdHoc; -use std::collections::HashMap; -use std::{sync::Arc, time::Duration}; -use task::TaskClient; -use tokio::sync::RwLockReadGuard; -use tokio::{ - sync::{watch, RwLock}, - time, -}; - -use self::inclusion_probabilities::InclusionProbabilities; - -use super::reward_estimate::{compute_apy_from_reward, compute_reward_estimate}; - -mod inclusion_probabilities; - -const CACHE_TIMOUT_MS: u64 = 100; - -enum NodeStatusCacheError { - SimulationFailed, - SourceDataMissing, -} - -// A node status cache suitable for caching values computed in one sweep, such as active set -// inclusion probabilities that are computed for all mixnodes at the same time. -// -// The cache can be triggered to update on contract cache changes, and/or periodically on a timer. -#[derive(Clone)] -pub struct NodeStatusCache { - inner: Arc>, -} - -#[derive(Default)] -struct NodeStatusCacheInner { - mixnodes_annotated: Cache>, - rewarded_set_annotated: Cache>, - active_set_annotated: Cache>, - - // Estimated active set inclusion probabilities from Monte Carlo simulation - inclusion_probabilities: Cache, -} - -impl NodeStatusCache { - fn new() -> Self { - NodeStatusCache { - inner: Arc::new(RwLock::new(NodeStatusCacheInner::new())), - } - } - - pub fn stage() -> AdHoc { - AdHoc::on_ignite("Node Status Cache", |rocket| async { - rocket.manage(Self::new()) - }) - } - - async fn update_cache( - &self, - mixnodes: Vec, - rewarded_set: Vec, - active_set: Vec, - inclusion_probabilities: InclusionProbabilities, - ) { - match time::timeout(Duration::from_millis(CACHE_TIMOUT_MS), self.inner.write()).await { - Ok(mut cache) => { - cache.mixnodes_annotated.update(mixnodes); - cache.rewarded_set_annotated.update(rewarded_set); - cache.active_set_annotated.update(active_set); - cache - .inclusion_probabilities - .update(inclusion_probabilities); - } - Err(e) => error!("{e}"), - } - } - - async fn get_cache( - &self, - fn_arg: impl FnOnce(RwLockReadGuard<'_, NodeStatusCacheInner>) -> Cache, - ) -> Option> { - match time::timeout(Duration::from_millis(CACHE_TIMOUT_MS), self.inner.read()).await { - Ok(cache) => Some(fn_arg(cache)), - Err(e) => { - error!("{e}"); - None - } - } - } - - pub(crate) async fn mixnodes_annotated(&self) -> Option>> { - self.get_cache(|c| c.mixnodes_annotated.clone()).await - } - - pub(crate) async fn rewarded_set_annotated(&self) -> Option>> { - self.get_cache(|c| c.rewarded_set_annotated.clone()).await - } - - pub(crate) async fn active_set_annotated(&self) -> Option>> { - self.get_cache(|c| c.active_set_annotated.clone()).await - } - - pub(crate) async fn inclusion_probabilities(&self) -> Option> { - self.get_cache(|c| c.inclusion_probabilities.clone()).await - } - - pub async fn mixnode_details( - &self, - mix_id: MixId, - ) -> (Option, MixnodeStatus) { - // it might not be the most optimal to possibly iterate the entire vector to find (or not) - // the relevant value. However, the vectors are relatively small (< 10_000 elements, < 1000 for active set) - - let active_set = &self.active_set_annotated().await.unwrap().into_inner(); - if let Some(bond) = active_set.iter().find(|mix| mix.mix_id() == mix_id) { - return (Some(bond.clone()), MixnodeStatus::Active); - } - - let rewarded_set = &self.rewarded_set_annotated().await.unwrap().into_inner(); - if let Some(bond) = rewarded_set.iter().find(|mix| mix.mix_id() == mix_id) { - return (Some(bond.clone()), MixnodeStatus::Standby); - } - - let all_bonded = &self.mixnodes_annotated().await.unwrap().into_inner(); - if let Some(bond) = all_bonded.iter().find(|mix| mix.mix_id() == mix_id) { - (Some(bond.clone()), MixnodeStatus::Inactive) - } else { - (None, MixnodeStatus::NotFound) - } - } -} - -impl NodeStatusCacheInner { - pub fn new() -> Self { - Self::default() - } -} - -// Long running task responsible of keeping the cache up-to-date. -pub struct NodeStatusCacheRefresher { - // Main stored data - cache: NodeStatusCache, - fallback_caching_interval: Duration, - - // Sources for when refreshing data - contract_cache: ValidatorCache, - contract_cache_listener: watch::Receiver, - storage: Option, -} - -impl NodeStatusCacheRefresher { - pub(crate) fn new( - cache: NodeStatusCache, - fallback_caching_interval: Duration, - contract_cache: ValidatorCache, - contract_cache_listener: watch::Receiver, - storage: Option, - ) -> Self { - Self { - cache, - fallback_caching_interval, - contract_cache, - contract_cache_listener, - storage, - } - } - - pub async fn run(&mut self, mut shutdown: TaskClient) { - let mut fallback_interval = time::interval(self.fallback_caching_interval); - while !shutdown.is_shutdown() { - tokio::select! { - biased; - _ = shutdown.recv() => { - log::trace!("NodeStatusCacheRefresher: Received shutdown"); - } - // Update node status cache when the contract cache / validator cache is updated - Ok(_) = self.contract_cache_listener.changed() => { - tokio::select! { - _ = self.update_on_notify(&mut fallback_interval) => (), - _ = shutdown.recv() => { - log::trace!("NodeStatusCacheRefresher: Received shutdown"); - } - } - } - // ... however, if we don't receive any notifications we fall back to periodic - // refreshes - _ = fallback_interval.tick() => { - tokio::select! { - _ = self.update_on_timer() => (), - _ = shutdown.recv() => { - log::trace!("NodeStatusCacheRefresher: Received shutdown"); - } - } - } - } - } - log::info!("NodeStatusCacheRefresher: Exiting"); - } - - async fn update_on_notify(&self, fallback_interval: &mut time::Interval) { - log::debug!( - "Validator cache event detected: {:?}", - &*self.contract_cache_listener.borrow(), - ); - let _ = self.refresh_cache().await; - fallback_interval.reset(); - } - - async fn update_on_timer(&self) { - log::debug!("Timed trigger for the node status cache"); - let have_contract_cache_data = - *self.contract_cache_listener.borrow() != CacheNotification::Start; - - if have_contract_cache_data { - let _ = self.refresh_cache().await; - } else { - log::trace!( - "Skipping updating node status cache, is the contract cache not yet available?" - ); - } - } - - async fn refresh_cache(&self) -> Result<(), NodeStatusCacheError> { - log::info!("Updating node status cache"); - - // Fetch contract cache data to work with - let mixnode_details = self.contract_cache.mixnodes().await; - let interval_reward_params = self.contract_cache.interval_reward_params().await; - let current_interval = self.contract_cache.current_interval().await; - - let rewarded_set = self.contract_cache.rewarded_set().await; - let active_set = self.contract_cache.active_set().await; - let mix_to_family = self.contract_cache.mix_to_family().await; - - let interval_reward_params = - interval_reward_params.ok_or(NodeStatusCacheError::SourceDataMissing)?; - let current_interval = current_interval.ok_or(NodeStatusCacheError::SourceDataMissing)?; - - // Compute inclusion probabilities - let inclusion_probabilities = InclusionProbabilities::compute( - &mixnode_details, - interval_reward_params, - ) - .ok_or_else(|| { - error!("Failed to simulate selection probabilties for mixnodes, not updating cache"); - NodeStatusCacheError::SimulationFailed - })?; - - // Create annotated data - let rewarded_set_node_status = to_rewarded_set_node_status(&rewarded_set, &active_set); - let mixnodes_annotated = self - .annotate_node_with_details( - mixnode_details, - interval_reward_params, - current_interval, - &rewarded_set_node_status, - mix_to_family.to_vec(), - ) - .await; - - // Create the annotated rewarded and active sets - let (rewarded_set, active_set) = - split_into_active_and_rewarded_set(&mixnodes_annotated, &rewarded_set_node_status); - - self.cache - .update_cache( - mixnodes_annotated, - rewarded_set, - active_set, - inclusion_probabilities, - ) - .await; - Ok(()) - } - - async fn get_performance_from_storage( - &self, - mix_id: MixId, - epoch: Interval, - ) -> Option { - self.storage - .as_ref()? - .get_average_mixnode_uptime_in_the_last_24hrs( - mix_id, - epoch.current_epoch_end_unix_timestamp(), - ) - .await - .ok() - .map(Into::into) - } - - async fn annotate_node_with_details( - &self, - mixnodes: Vec, - interval_reward_params: RewardingParams, - current_interval: Interval, - rewarded_set: &HashMap, - mix_to_family: Vec<(IdentityKey, FamilyHead)>, - ) -> Vec { - let mix_to_family = mix_to_family - .into_iter() - .collect::>(); - - let mut annotated = Vec::new(); - for mixnode in mixnodes { - let stake_saturation = mixnode - .rewarding_details - .bond_saturation(&interval_reward_params); - - let uncapped_stake_saturation = mixnode - .rewarding_details - .uncapped_bond_saturation(&interval_reward_params); - - // If the performance can't be obtained, because the nym-api was not started with - // the monitoring (and hence, storage), then reward estimates will be all zero - let performance = self - .get_performance_from_storage(mixnode.mix_id(), current_interval) - .await - .unwrap_or_default(); - - let rewarded_set_status = rewarded_set.get(&mixnode.mix_id()).copied(); - - let reward_estimate = compute_reward_estimate( - &mixnode, - performance, - rewarded_set_status, - interval_reward_params, - current_interval, - ); - - let (estimated_operator_apy, estimated_delegators_apy) = - compute_apy_from_reward(&mixnode, reward_estimate, current_interval); - - let family = mix_to_family - .get(&mixnode.bond_information.identity().to_string()) - .cloned(); - - annotated.push(MixNodeBondAnnotated { - mixnode_details: mixnode, - stake_saturation, - uncapped_stake_saturation, - performance, - estimated_operator_apy, - estimated_delegators_apy, - family, - }); - } - annotated - } -} - -fn to_rewarded_set_node_status( - rewarded_set: &[MixNodeDetails], - active_set: &[MixNodeDetails], -) -> HashMap { - let mut rewarded_set_node_status: HashMap = rewarded_set - .iter() - .map(|m| (m.mix_id(), RewardedSetNodeStatus::Standby)) - .collect(); - for mixnode in active_set { - *rewarded_set_node_status - .get_mut(&mixnode.mix_id()) - .expect("All active nodes are rewarded nodes") = RewardedSetNodeStatus::Active; - } - rewarded_set_node_status -} - -fn split_into_active_and_rewarded_set( - mixnodes_annotated: &[MixNodeBondAnnotated], - rewarded_set_node_status: &HashMap, -) -> (Vec, Vec) { - let rewarded_set: Vec<_> = mixnodes_annotated - .iter() - .filter(|mixnode| rewarded_set_node_status.get(&mixnode.mix_id()).is_some()) - .cloned() - .collect(); - let active_set: Vec<_> = rewarded_set - .iter() - .filter(|mixnode| { - rewarded_set_node_status - .get(&mixnode.mix_id()) - .map_or(false, RewardedSetNodeStatus::is_active) - }) - .cloned() - .collect(); - (rewarded_set, active_set) -} diff --git a/nym-api/src/node_status_api/cache/data.rs b/nym-api/src/node_status_api/cache/data.rs new file mode 100644 index 0000000000..a7538cd8bf --- /dev/null +++ b/nym-api/src/node_status_api/cache/data.rs @@ -0,0 +1,21 @@ +use nym_api_requests::models::MixNodeBondAnnotated; + +use crate::support::caching::Cache; + +use super::inclusion_probabilities::InclusionProbabilities; + +#[derive(Default)] +pub(crate) struct NodeStatusCacheData { + pub(crate) mixnodes_annotated: Cache>, + pub(crate) rewarded_set_annotated: Cache>, + pub(crate) active_set_annotated: Cache>, + + // Estimated active set inclusion probabilities from Monte Carlo simulation + pub(crate) inclusion_probabilities: Cache, +} + +impl NodeStatusCacheData { + pub fn new() -> Self { + Self::default() + } +} diff --git a/nym-api/src/node_status_api/cache/mod.rs b/nym-api/src/node_status_api/cache/mod.rs new file mode 100644 index 0000000000..0bf1e31beb --- /dev/null +++ b/nym-api/src/node_status_api/cache/mod.rs @@ -0,0 +1,130 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::support::caching::Cache; + +use self::data::NodeStatusCacheData; +use self::inclusion_probabilities::InclusionProbabilities; +use mixnet_contract_common::MixId; +use nym_api_requests::models::{MixNodeBondAnnotated, MixnodeStatus}; +use rocket::fairing::AdHoc; +use std::{sync::Arc, time::Duration}; +use thiserror::Error; +use tokio::sync::RwLockReadGuard; +use tokio::{sync::RwLock, time}; + +const CACHE_TIMEOUT_MS: u64 = 100; + +pub mod data; +mod inclusion_probabilities; +mod node_sets; +pub mod refresher; + +#[derive(Debug, Error)] +enum NodeStatusCacheError { + #[error("failed to simulate selection probabilities for mixnodes, not updating cache")] + SimulationFailed, + + #[error("the current interval information is not available at the moment")] + SourceDataMissing, +} + +/// A node status cache suitable for caching values computed in one sweep, such as active set +/// inclusion probabilities that are computed for all mixnodes at the same time. +/// +/// The cache can be triggered to update on contract cache changes, and/or periodically on a timer. +#[derive(Clone)] +pub struct NodeStatusCache { + inner: Arc>, +} + +impl NodeStatusCache { + /// Creates a new cache with no data. + fn new() -> NodeStatusCache { + NodeStatusCache { + inner: Arc::new(RwLock::new(NodeStatusCacheData::new())), + } + } + + pub fn stage() -> AdHoc { + AdHoc::on_ignite("Node Status Cache", |rocket| async { + rocket.manage(Self::new()) + }) + } + + /// Updates the cache with the latest data. + async fn update( + &self, + mixnodes: Vec, + rewarded_set: Vec, + active_set: Vec, + inclusion_probabilities: InclusionProbabilities, + ) { + match time::timeout(Duration::from_millis(CACHE_TIMEOUT_MS), self.inner.write()).await { + Ok(mut cache) => { + cache.mixnodes_annotated.update(mixnodes); + cache.rewarded_set_annotated.update(rewarded_set); + cache.active_set_annotated.update(active_set); + cache + .inclusion_probabilities + .update(inclusion_probabilities); + } + Err(e) => error!("{e}"), + } + } + + /// Returns a copy of the current cache data. + async fn get( + &self, + fn_arg: impl FnOnce(RwLockReadGuard<'_, NodeStatusCacheData>) -> Cache, + ) -> Option> { + match time::timeout(Duration::from_millis(CACHE_TIMEOUT_MS), self.inner.read()).await { + Ok(cache) => Some(fn_arg(cache)), + Err(e) => { + error!("{e}"); + None + } + } + } + + pub(crate) async fn mixnodes_annotated(&self) -> Option>> { + self.get(|c| c.mixnodes_annotated.clone()).await + } + + pub(crate) async fn rewarded_set_annotated(&self) -> Option>> { + self.get(|c| c.rewarded_set_annotated.clone()).await + } + + pub(crate) async fn active_set_annotated(&self) -> Option>> { + self.get(|c| c.active_set_annotated.clone()).await + } + + pub(crate) async fn inclusion_probabilities(&self) -> Option> { + self.get(|c| c.inclusion_probabilities.clone()).await + } + + pub async fn mixnode_details( + &self, + mix_id: MixId, + ) -> (Option, MixnodeStatus) { + // it might not be the most optimal to possibly iterate the entire vector to find (or not) + // the relevant value. However, the vectors are relatively small (< 10_000 elements, < 1000 for active set) + + let active_set = &self.active_set_annotated().await.unwrap().into_inner(); + if let Some(bond) = active_set.iter().find(|mix| mix.mix_id() == mix_id) { + return (Some(bond.clone()), MixnodeStatus::Active); + } + + let rewarded_set = &self.rewarded_set_annotated().await.unwrap().into_inner(); + if let Some(bond) = rewarded_set.iter().find(|mix| mix.mix_id() == mix_id) { + return (Some(bond.clone()), MixnodeStatus::Standby); + } + + let all_bonded = &self.mixnodes_annotated().await.unwrap().into_inner(); + if let Some(bond) = all_bonded.iter().find(|mix| mix.mix_id() == mix_id) { + (Some(bond.clone()), MixnodeStatus::Inactive) + } else { + (None, MixnodeStatus::NotFound) + } + } +} diff --git a/nym-api/src/node_status_api/cache/node_sets.rs b/nym-api/src/node_status_api/cache/node_sets.rs new file mode 100644 index 0000000000..aa1d331ea6 --- /dev/null +++ b/nym-api/src/node_status_api/cache/node_sets.rs @@ -0,0 +1,119 @@ +use crate::node_status_api::reward_estimate::{compute_apy_from_reward, compute_reward_estimate}; +use crate::support::storage::NymApiStorage; +use mixnet_contract_common::families::FamilyHead; +use mixnet_contract_common::{reward_params::Performance, Interval, MixId}; +use mixnet_contract_common::{IdentityKey, MixNodeDetails, RewardedSetNodeStatus, RewardingParams}; +use nym_api_requests::models::MixNodeBondAnnotated; +use std::collections::HashMap; + +pub(super) fn to_rewarded_set_node_status( + rewarded_set: &[MixNodeDetails], + active_set: &[MixNodeDetails], +) -> HashMap { + let mut rewarded_set_node_status: HashMap = rewarded_set + .iter() + .map(|m| (m.mix_id(), RewardedSetNodeStatus::Standby)) + .collect(); + for mixnode in active_set { + *rewarded_set_node_status + .get_mut(&mixnode.mix_id()) + .expect("All active nodes are rewarded nodes") = RewardedSetNodeStatus::Active; + } + rewarded_set_node_status +} + +pub(super) fn split_into_active_and_rewarded_set( + mixnodes_annotated: &[MixNodeBondAnnotated], + rewarded_set_node_status: &HashMap, +) -> (Vec, Vec) { + let rewarded_set: Vec<_> = mixnodes_annotated + .iter() + .filter(|mixnode| rewarded_set_node_status.get(&mixnode.mix_id()).is_some()) + .cloned() + .collect(); + let active_set: Vec<_> = rewarded_set + .iter() + .filter(|mixnode| { + rewarded_set_node_status + .get(&mixnode.mix_id()) + .map_or(false, RewardedSetNodeStatus::is_active) + }) + .cloned() + .collect(); + (rewarded_set, active_set) +} + +pub(super) async fn get_performance_from_storage( + storage: &Option, + mix_id: MixId, + epoch: Interval, +) -> Option { + storage + .as_ref()? + .get_average_mixnode_uptime_in_the_last_24hrs( + mix_id, + epoch.current_epoch_end_unix_timestamp(), + ) + .await + .ok() + .map(Into::into) +} + +pub(super) async fn annotate_nodes_with_details( + storage: &Option, + mixnodes: Vec, + interval_reward_params: RewardingParams, + current_interval: Interval, + rewarded_set: &HashMap, + mix_to_family: Vec<(IdentityKey, FamilyHead)>, +) -> Vec { + let mix_to_family = mix_to_family + .into_iter() + .collect::>(); + + let mut annotated = Vec::new(); + for mixnode in mixnodes { + let stake_saturation = mixnode + .rewarding_details + .bond_saturation(&interval_reward_params); + + let uncapped_stake_saturation = mixnode + .rewarding_details + .uncapped_bond_saturation(&interval_reward_params); + + // If the performance can't be obtained, because the nym-api was not started with + // the monitoring (and hence, storage), then reward estimates will be all zero + + let performance = get_performance_from_storage(storage, mixnode.mix_id(), current_interval) + .await + .unwrap_or_default(); + + let rewarded_set_status = rewarded_set.get(&mixnode.mix_id()).copied(); + + let reward_estimate = compute_reward_estimate( + &mixnode, + performance, + rewarded_set_status, + interval_reward_params, + current_interval, + ); + + let (estimated_operator_apy, estimated_delegators_apy) = + compute_apy_from_reward(&mixnode, reward_estimate, current_interval); + + let family = mix_to_family + .get(&mixnode.bond_information.identity().to_string()) + .cloned(); + + annotated.push(MixNodeBondAnnotated { + mixnode_details: mixnode, + stake_saturation, + uncapped_stake_saturation, + performance, + estimated_operator_apy, + estimated_delegators_apy, + family, + }); + } + annotated +} diff --git a/nym-api/src/node_status_api/cache/refresher.rs b/nym-api/src/node_status_api/cache/refresher.rs new file mode 100644 index 0000000000..6741aa7f98 --- /dev/null +++ b/nym-api/src/node_status_api/cache/refresher.rs @@ -0,0 +1,160 @@ +use super::NodeStatusCache; +use crate::{ + node_status_api::cache::{ + inclusion_probabilities::InclusionProbabilities, + node_sets::{ + annotate_nodes_with_details, split_into_active_and_rewarded_set, + to_rewarded_set_node_status, + }, + NodeStatusCacheError, + }, + nym_contract_cache::cache::NymContractCache, + storage::NymApiStorage, + support::caching::CacheNotification, +}; +use std::time::Duration; +use task::TaskClient; +use tokio::sync::watch; +use tokio::time; + +// Long running task responsible for keeping the node status cache up-to-date. +pub struct NodeStatusCacheRefresher { + // Main stored data + cache: NodeStatusCache, + fallback_caching_interval: Duration, + + // Sources for when refreshing data + contract_cache: NymContractCache, + contract_cache_listener: watch::Receiver, + storage: Option, +} + +impl NodeStatusCacheRefresher { + pub(crate) fn new( + cache: NodeStatusCache, + fallback_caching_interval: Duration, + contract_cache: NymContractCache, + contract_cache_listener: watch::Receiver, + storage: Option, + ) -> Self { + Self { + cache, + fallback_caching_interval, + contract_cache, + contract_cache_listener, + storage, + } + } + + /// Runs the node status cache refresher task. + pub async fn run(&mut self, mut shutdown: TaskClient) { + let mut fallback_interval = time::interval(self.fallback_caching_interval); + while !shutdown.is_shutdown() { + tokio::select! { + biased; + _ = shutdown.recv() => { + log::trace!("NodeStatusCacheRefresher: Received shutdown"); + } + // Update node status cache when the contract cache / validator cache is updated + Ok(_) = self.contract_cache_listener.changed() => { + tokio::select! { + _ = self.update_on_notify(&mut fallback_interval) => (), + _ = shutdown.recv() => { + log::trace!("NodeStatusCacheRefresher: Received shutdown"); + } + } + } + // ... however, if we don't receive any notifications we fall back to periodic + // refreshes + _ = fallback_interval.tick() => { + tokio::select! { + _ = self.update_on_timer() => (), + _ = shutdown.recv() => { + log::trace!("NodeStatusCacheRefresher: Received shutdown"); + } + } + } + } + } + log::info!("NodeStatusCacheRefresher: Exiting"); + } + + /// Updates the node status cache when the contract cache / validator cache is updated + async fn update_on_notify(&self, fallback_interval: &mut time::Interval) { + log::debug!( + "Validator cache event detected: {:?}", + &*self.contract_cache_listener.borrow(), + ); + let _ = self.refresh().await; + fallback_interval.reset(); + } + + /// Updates the node status cache when the fallback interval is reached + async fn update_on_timer(&self) { + log::debug!("Timed trigger for the node status cache"); + let have_contract_cache_data = + *self.contract_cache_listener.borrow() != CacheNotification::Start; + + if have_contract_cache_data { + let _ = self.refresh().await; + } else { + log::trace!( + "Skipping updating node status cache, is the contract cache not yet available?" + ); + } + } + + /// Refreshes the node status cache by fetching the latest data from the contract cache + async fn refresh(&self) -> Result<(), NodeStatusCacheError> { + log::info!("Updating node status cache"); + + // Fetch contract cache data to work with + let mixnode_details = self.contract_cache.mixnodes().await; + let interval_reward_params = self.contract_cache.interval_reward_params().await; + let current_interval = self.contract_cache.current_interval().await; + let rewarded_set = self.contract_cache.rewarded_set().await; + let active_set = self.contract_cache.active_set().await; + let mix_to_family = self.contract_cache.mix_to_family().await; + + let interval_reward_params = + interval_reward_params.ok_or(NodeStatusCacheError::SourceDataMissing)?; + let current_interval = current_interval.ok_or(NodeStatusCacheError::SourceDataMissing)?; + + // Compute inclusion probabilities + let inclusion_probabilities = InclusionProbabilities::compute( + &mixnode_details, + interval_reward_params, + ) + .ok_or_else(|| { + error!("Failed to simulate selection probabilities for mixnodes, not updating cache"); + NodeStatusCacheError::SimulationFailed + })?; + + // Create annotated data + let rewarded_set_node_status = to_rewarded_set_node_status(&rewarded_set, &active_set); + let mixnodes_annotated = annotate_nodes_with_details( + &self.storage, + mixnode_details, + interval_reward_params, + current_interval, + &rewarded_set_node_status, + mix_to_family.to_vec(), + ) + .await; + + // Create the annotated rewarded and active sets + let (rewarded_set, active_set) = + split_into_active_and_rewarded_set(&mixnodes_annotated, &rewarded_set_node_status); + + // Update the cache + self.cache + .update( + mixnodes_annotated, + rewarded_set, + active_set, + inclusion_probabilities, + ) + .await; + Ok(()) + } +} diff --git a/nym-api/src/node_status_api/helpers.rs b/nym-api/src/node_status_api/helpers.rs index a2d102ebdd..aef71cc596 100644 --- a/nym-api/src/node_status_api/helpers.rs +++ b/nym-api/src/node_status_api/helpers.rs @@ -1,10 +1,10 @@ // Copyright 2021-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::contract_cache::Cache; use crate::node_status_api::models::ErrorResponse; use crate::storage::NymApiStorage; -use crate::{NodeStatusCache, ValidatorCache}; +use crate::support::caching::Cache; +use crate::{NodeStatusCache, NymContractCache}; use cosmwasm_std::Decimal; use mixnet_contract_common::reward_params::Performance; use mixnet_contract_common::{Interval, MixId, RewardedSetNodeStatus}; @@ -55,7 +55,7 @@ pub(crate) async fn _mixnode_core_status_count( } pub(crate) async fn _get_mixnode_status( - cache: &ValidatorCache, + cache: &NymContractCache, mix_id: MixId, ) -> MixnodeStatusResponse { MixnodeStatusResponse { @@ -65,7 +65,7 @@ pub(crate) async fn _get_mixnode_status( pub(crate) async fn _get_mixnode_reward_estimation( cache: &State, - validator_cache: &State, + validator_cache: &State, mix_id: MixId, ) -> Result { let (mixnode, status) = cache.mixnode_details(mix_id).await; @@ -121,7 +121,7 @@ async fn average_mixnode_performance( pub(crate) async fn _compute_mixnode_reward_estimation( user_reward_param: ComputeRewardEstParam, cache: &NodeStatusCache, - validator_cache: &ValidatorCache, + validator_cache: &NymContractCache, mix_id: MixId, ) -> Result { let (mixnode, actual_status) = cache.mixnode_details(mix_id).await; @@ -205,7 +205,7 @@ pub(crate) async fn _compute_mixnode_reward_estimation( pub(crate) async fn _get_mixnode_stake_saturation( cache: &NodeStatusCache, - validator_cache: &ValidatorCache, + validator_cache: &NymContractCache, mix_id: MixId, ) -> Result { let (mixnode, _) = cache.mixnode_details(mix_id).await; @@ -254,7 +254,7 @@ pub(crate) async fn _get_mixnode_inclusion_probability( } pub(crate) async fn _get_mixnode_avg_uptime( - cache: &ValidatorCache, + cache: &NymContractCache, storage: &NymApiStorage, mix_id: MixId, ) -> Result { diff --git a/nym-api/src/node_status_api/mod.rs b/nym-api/src/node_status_api/mod.rs index cbcf1784f2..28e918dad9 100644 --- a/nym-api/src/node_status_api/mod.rs +++ b/nym-api/src/node_status_api/mod.rs @@ -1,11 +1,19 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -pub(crate) use cache::{NodeStatusCache, NodeStatusCacheRefresher}; +pub(crate) use cache::NodeStatusCache; use okapi::openapi3::OpenApi; use rocket::Route; use rocket_okapi::{openapi_get_routes_spec, settings::OpenApiSettings}; use std::time::Duration; +use task::TaskManager; + +use crate::{ + nym_contract_cache::cache::NymContractCache, + support::{self, config::Config, storage}, +}; + +use self::cache::refresher::NodeStatusCacheRefresher; pub(crate) mod cache; pub(crate) mod helpers; pub(crate) mod local_guard; @@ -56,3 +64,26 @@ pub(crate) fn node_status_routes( ] } } + +/// Spawn the node status cache refresher. +/// +/// It is primarily refreshed in-sync with the nym contract cache, however provide a fallback +/// caching interval that is twice the nym contract cache +pub(crate) fn start_cache_refresh( + config: &Config, + nym_contract_cache_state: &NymContractCache, + node_status_cache_state: &NodeStatusCache, + storage: Option<&storage::NymApiStorage>, + nym_contract_cache_listener: tokio::sync::watch::Receiver, + shutdown: &TaskManager, +) { + let mut nym_api_cache_refresher = NodeStatusCacheRefresher::new( + node_status_cache_state.to_owned(), + config.get_node_status_caching_interval(), + nym_contract_cache_state.to_owned(), + nym_contract_cache_listener, + storage.cloned(), + ); + let shutdown_listener = shutdown.subscribe(); + tokio::spawn(async move { nym_api_cache_refresher.run(shutdown_listener).await }); +} diff --git a/nym-api/src/node_status_api/routes.rs b/nym-api/src/node_status_api/routes.rs index 70bb3db91e..51def235dd 100644 --- a/nym-api/src/node_status_api/routes.rs +++ b/nym-api/src/node_status_api/routes.rs @@ -11,7 +11,7 @@ use crate::node_status_api::helpers::{ }; use crate::node_status_api::models::ErrorResponse; use crate::storage::NymApiStorage; -use crate::ValidatorCache; +use crate::NymContractCache; use mixnet_contract_common::MixId; use nym_api_requests::models::{ AllInclusionProbabilitiesResponse, ComputeRewardEstParam, GatewayCoreStatusResponse, @@ -104,7 +104,7 @@ pub(crate) async fn mixnode_core_status_count( #[openapi(tag = "status")] #[get("/mixnode//status")] pub(crate) async fn get_mixnode_status( - cache: &State, + cache: &State, mix_id: MixId, ) -> Json { Json(_get_mixnode_status(cache, mix_id).await) @@ -114,7 +114,7 @@ pub(crate) async fn get_mixnode_status( #[get("/mixnode//reward-estimation")] pub(crate) async fn get_mixnode_reward_estimation( cache: &State, - validator_cache: &State, + validator_cache: &State, mix_id: MixId, ) -> Result, ErrorResponse> { Ok(Json( @@ -130,7 +130,7 @@ pub(crate) async fn get_mixnode_reward_estimation( pub(crate) async fn compute_mixnode_reward_estimation( user_reward_param: Json, cache: &State, - validator_cache: &State, + validator_cache: &State, mix_id: MixId, ) -> Result, ErrorResponse> { Ok(Json( @@ -148,7 +148,7 @@ pub(crate) async fn compute_mixnode_reward_estimation( #[get("/mixnode//stake-saturation")] pub(crate) async fn get_mixnode_stake_saturation( cache: &State, - validator_cache: &State, + validator_cache: &State, mix_id: MixId, ) -> Result, ErrorResponse> { Ok(Json( @@ -170,7 +170,7 @@ pub(crate) async fn get_mixnode_inclusion_probability( #[openapi(tag = "status")] #[get("/mixnode//avg_uptime")] pub(crate) async fn get_mixnode_avg_uptime( - cache: &State, + cache: &State, storage: &State, mix_id: MixId, ) -> Result, ErrorResponse> { diff --git a/nym-api/src/node_status_api/uptime_updater.rs b/nym-api/src/node_status_api/uptime_updater.rs index 0c36c1a124..e17dc9354a 100644 --- a/nym-api/src/node_status_api/uptime_updater.rs +++ b/nym-api/src/node_status_api/uptime_updater.rs @@ -8,7 +8,7 @@ use crate::node_status_api::ONE_DAY; use crate::storage::NymApiStorage; use log::error; use std::time::Duration; -use task::TaskClient; +use task::{TaskClient, TaskManager}; use time::{OffsetDateTime, PrimitiveDateTime, Time}; use tokio::time::{interval, sleep}; @@ -117,4 +117,10 @@ impl HistoricalUptimeUpdater { } } } + + pub(crate) fn start(storage: &NymApiStorage, shutdown: &TaskManager) { + let uptime_updater = HistoricalUptimeUpdater::new(storage.to_owned()); + let shutdown_listener = shutdown.subscribe(); + tokio::spawn(async move { uptime_updater.run(shutdown_listener).await }); + } } diff --git a/nym-api/src/nym_contract_cache/cache/data.rs b/nym-api/src/nym_contract_cache/cache/data.rs new file mode 100644 index 0000000000..8026229e08 --- /dev/null +++ b/nym-api/src/nym_contract_cache/cache/data.rs @@ -0,0 +1,41 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::support::caching::Cache; +use mixnet_contract_common::{ + families::FamilyHead, GatewayBond, IdentityKey, Interval, MixId, MixNodeDetails, + RewardingParams, +}; +use std::collections::HashSet; + +pub(crate) struct ValidatorCacheData { + pub(crate) mixnodes: Cache>, + pub(crate) gateways: Cache>, + + pub(crate) mixnodes_blacklist: Cache>, + pub(crate) gateways_blacklist: Cache>, + + pub(crate) rewarded_set: Cache>, + pub(crate) active_set: Cache>, + + pub(crate) current_reward_params: Cache>, + pub(crate) current_interval: Cache>, + + pub(crate) mix_to_family: Cache>, +} + +impl ValidatorCacheData { + pub(crate) fn new() -> Self { + ValidatorCacheData { + mixnodes: Cache::default(), + gateways: Cache::default(), + rewarded_set: Cache::default(), + active_set: Cache::default(), + mixnodes_blacklist: Cache::default(), + gateways_blacklist: Cache::default(), + current_interval: Cache::default(), + current_reward_params: Cache::default(), + mix_to_family: Cache::default(), + } + } +} diff --git a/nym-api/src/contract_cache/mod.rs b/nym-api/src/nym_contract_cache/cache/mod.rs similarity index 50% rename from nym-api/src/contract_cache/mod.rs rename to nym-api/src/nym_contract_cache/cache/mod.rs index 4608c9d9d5..fa6b392675 100644 --- a/nym-api/src/contract_cache/mod.rs +++ b/nym-api/src/nym_contract_cache/cache/mod.rs @@ -1,257 +1,36 @@ -// Copyright 2021-2022 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::nyxd_client::Client; -use ::time::OffsetDateTime; -use anyhow::Result; -use mixnet_contract_common::families::FamilyHead; +use crate::support::caching::Cache; +use data::ValidatorCacheData; use mixnet_contract_common::{ - mixnode::MixNodeDetails, reward_params::RewardingParams, GatewayBond, IdentityKey, Interval, - MixId, MixNodeBond, RewardedSetNodeStatus, + families::FamilyHead, GatewayBond, IdentityKey, Interval, MixId, MixNodeBond, MixNodeDetails, + RewardingParams, }; use nym_api_requests::models::MixnodeStatus; -use okapi::openapi3::OpenApi; use rocket::fairing::AdHoc; -use rocket::Route; -use rocket_okapi::openapi_get_routes_spec; -use rocket_okapi::settings::OpenApiSettings; -use serde::Serialize; -use std::collections::{HashMap, HashSet}; -use std::ops::Deref; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; -use std::time::Duration; -use task::TaskClient; -use tokio::sync::{watch, RwLock}; +use std::{ + collections::HashSet, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + time::Duration, +}; +use tokio::sync::RwLock; use tokio::time; -use validator_client::nyxd::CosmWasmClient; -pub(crate) mod routes; - -// The cache can emit notifications to listeners about the current state -#[derive(Debug, PartialEq, Eq)] -pub enum CacheNotification { - Start, - Updated, -} - -pub struct ValidatorCacheRefresher { - nyxd_client: Client, - cache: ValidatorCache, - caching_interval: Duration, - - // Notify listeners that the cache has been updated - update_notifier: watch::Sender, -} +mod data; +pub(crate) mod refresher; #[derive(Clone)] -pub struct ValidatorCache { - initialised: Arc, - inner: Arc>, +pub struct NymContractCache { + pub(crate) initialised: Arc, + pub(crate) inner: Arc>, } -struct ValidatorCacheInner { - mixnodes: Cache>, - gateways: Cache>, - - mixnodes_blacklist: Cache>, - gateways_blacklist: Cache>, - - rewarded_set: Cache>, - active_set: Cache>, - - current_reward_params: Cache>, - current_interval: Cache>, - - mix_to_family: Cache>, -} - -fn current_unix_timestamp() -> i64 { - let now = OffsetDateTime::now_utc(); - now.unix_timestamp() -} - -#[derive(Default, Serialize, Clone)] -pub struct Cache { - value: T, - as_at: i64, -} - -impl Cache { - pub(super) fn new(value: T) -> Self { - Cache { - value, - as_at: current_unix_timestamp(), - } - } - - pub(super) fn update(&mut self, value: T) { - self.value = value; - self.as_at = current_unix_timestamp() - } - - pub fn timestamp(&self) -> i64 { - self.as_at - } - - pub fn into_inner(self) -> T { - self.value - } -} - -impl Deref for Cache { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.value - } -} - -impl ValidatorCacheRefresher { - pub(crate) fn new( - nyxd_client: Client, - caching_interval: Duration, - cache: ValidatorCache, - ) -> Self { - let (tx, _) = watch::channel(CacheNotification::Start); - ValidatorCacheRefresher { - nyxd_client, - cache, - caching_interval, - update_notifier: tx, - } - } - - pub fn subscribe(&self) -> watch::Receiver { - self.update_notifier.subscribe() - } - - async fn get_rewarded_set_map(&self) -> HashMap - where - C: CosmWasmClient + Sync + Send, - { - self.nyxd_client - .get_rewarded_set_mixnodes() - .await - .map(|nodes| nodes.into_iter().collect()) - .unwrap_or_default() - } - - fn collect_rewarded_and_active_set_details( - all_mixnodes: &[MixNodeDetails], - rewarded_set_nodes: &HashMap, - ) -> (Vec, Vec) { - let mut active_set = Vec::new(); - let mut rewarded_set = Vec::new(); - - for mix in all_mixnodes { - if let Some(status) = rewarded_set_nodes.get(&mix.mix_id()) { - rewarded_set.push(mix.clone()); - if status.is_active() { - active_set.push(mix.clone()) - } - } - } - - (rewarded_set, active_set) - } - - async fn refresh_cache(&self) -> Result<()> - where - C: CosmWasmClient + Sync + Send, - { - let rewarding_params = self.nyxd_client.get_current_rewarding_parameters().await?; - let current_interval = self.nyxd_client.get_current_interval().await?.interval; - - let mixnodes = self.nyxd_client.get_mixnodes().await?; - let gateways = self.nyxd_client.get_gateways().await?; - - let mix_to_family = self.nyxd_client.get_all_family_members().await?; - - let rewarded_set_map = self.get_rewarded_set_map().await; - - let (rewarded_set, active_set) = - Self::collect_rewarded_and_active_set_details(&mixnodes, &rewarded_set_map); - - info!( - "Updating validator cache. There are {} mixnodes and {} gateways", - mixnodes.len(), - gateways.len(), - ); - - self.cache - .update_cache( - mixnodes, - gateways, - rewarded_set, - active_set, - rewarding_params, - current_interval, - mix_to_family, - ) - .await; - - if let Err(err) = self.update_notifier.send(CacheNotification::Updated) { - warn!("Failed to notify validator cache refresh: {err}"); - } - - Ok(()) - } - - pub(crate) async fn run(&self, mut shutdown: TaskClient) - where - C: CosmWasmClient + Sync + Send, - { - let mut interval = time::interval(self.caching_interval); - while !shutdown.is_shutdown() { - tokio::select! { - _ = interval.tick() => { - tokio::select! { - biased; - _ = shutdown.recv() => { - trace!("ValidatorCacheRefresher: Received shutdown"); - } - ret = self.refresh_cache() => { - if let Err(err) = ret { - error!("Failed to refresh validator cache - {err}"); - } else { - // relaxed memory ordering is fine here. worst case scenario network monitor - // will just have to wait for an additional backoff to see the change. - // And so this will not really incur any performance penalties by setting it every loop iteration - self.cache.initialised.store(true, Ordering::Relaxed) - } - } - } - } - _ = shutdown.recv() => { - trace!("ValidatorCacheRefresher: Received shutdown"); - } - } - } - } -} - -pub(crate) fn validator_cache_routes(settings: &OpenApiSettings) -> (Vec, OpenApi) { - openapi_get_routes_spec![ - settings: routes::get_mixnodes, - routes::get_mixnodes_detailed, - routes::get_gateways, - routes::get_active_set, - routes::get_active_set_detailed, - routes::get_rewarded_set, - routes::get_rewarded_set_detailed, - routes::get_blacklisted_mixnodes, - routes::get_blacklisted_gateways, - routes::get_interval_reward_params, - routes::get_current_epoch - ] -} - -impl ValidatorCache { +impl NymContractCache { fn new() -> Self { - ValidatorCache { + NymContractCache { initialised: Arc::new(AtomicBool::new(false)), - inner: Arc::new(RwLock::new(ValidatorCacheInner::new())), + inner: Arc::new(RwLock::new(ValidatorCacheData::new())), } } @@ -262,7 +41,7 @@ impl ValidatorCache { } #[allow(clippy::too_many_arguments)] - async fn update_cache( + pub(crate) async fn update( &self, mixnodes: Vec, gateways: Vec, @@ -282,8 +61,8 @@ impl ValidatorCache { cache.current_interval.update(Some(current_interval)); cache.mix_to_family.update(mix_to_family) } - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); } } } @@ -291,8 +70,8 @@ impl ValidatorCache { pub async fn mixnodes_blacklist(&self) -> Option>> { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => Some(cache.mixnodes_blacklist.clone()), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); None } } @@ -301,8 +80,8 @@ impl ValidatorCache { pub async fn gateways_blacklist(&self) -> Option>> { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => Some(cache.gateways_blacklist.clone()), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); None } } @@ -328,7 +107,7 @@ impl ValidatorCache { cache.mixnodes_blacklist.update(blacklist); return; } - Err(e) => error!("{}", e), + Err(err) => error!("{err}"), } } error!("Failed to update mixnodes blacklist"); @@ -358,7 +137,7 @@ impl ValidatorCache { cache.gateways_blacklist.update(blacklist); return; } - Err(e) => error!("{}", e), + Err(err) => error!("{err}"), } } error!("Failed to update gateways blacklist"); @@ -368,8 +147,8 @@ impl ValidatorCache { let blacklist = self.mixnodes_blacklist().await; let mixnodes = match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.mixnodes.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); return Vec::new(); } }; @@ -395,8 +174,8 @@ impl ValidatorCache { .into_iter() .map(|bond| bond.bond_information) .collect(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); Vec::new() } } @@ -406,8 +185,8 @@ impl ValidatorCache { let blacklist = self.gateways_blacklist().await; let gateways = match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.gateways.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); return Vec::new(); } }; @@ -427,8 +206,8 @@ impl ValidatorCache { pub async fn gateways_all(&self) -> Vec { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.gateways.value.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); Vec::new() } } @@ -437,8 +216,8 @@ impl ValidatorCache { pub async fn rewarded_set(&self) -> Cache> { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.rewarded_set.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); Cache::new(Vec::new()) } } @@ -447,8 +226,8 @@ impl ValidatorCache { pub async fn active_set(&self) -> Cache> { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.active_set.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); Cache::new(Vec::new()) } } @@ -457,8 +236,8 @@ impl ValidatorCache { pub async fn mix_to_family(&self) -> Cache> { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.mix_to_family.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); Cache::new(Vec::new()) } } @@ -467,8 +246,8 @@ impl ValidatorCache { pub(crate) async fn interval_reward_params(&self) -> Cache> { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.current_reward_params.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); Cache::new(None) } } @@ -477,8 +256,8 @@ impl ValidatorCache { pub(crate) async fn current_interval(&self) -> Cache> { match time::timeout(Duration::from_millis(100), self.inner.read()).await { Ok(cache) => cache.current_interval.clone(), - Err(e) => { - error!("{}", e); + Err(err) => { + error!("{err}"); Cache::new(None) } } @@ -526,19 +305,3 @@ impl ValidatorCache { } } } - -impl ValidatorCacheInner { - fn new() -> Self { - ValidatorCacheInner { - mixnodes: Cache::default(), - gateways: Cache::default(), - rewarded_set: Cache::default(), - active_set: Cache::default(), - mixnodes_blacklist: Cache::default(), - gateways_blacklist: Cache::default(), - current_interval: Cache::default(), - current_reward_params: Cache::default(), - mix_to_family: Cache::default(), - } - } -} diff --git a/nym-api/src/nym_contract_cache/cache/refresher.rs b/nym-api/src/nym_contract_cache/cache/refresher.rs new file mode 100644 index 0000000000..61524be7aa --- /dev/null +++ b/nym-api/src/nym_contract_cache/cache/refresher.rs @@ -0,0 +1,133 @@ +use super::NymContractCache; +use crate::nyxd::Client; +use crate::support::caching::CacheNotification; +use anyhow::Result; +use mixnet_contract_common::{MixId, MixNodeDetails, RewardedSetNodeStatus}; +use std::{collections::HashMap, sync::atomic::Ordering, time::Duration}; +use task::TaskClient; +use tokio::sync::watch; +use tokio::time; + +pub struct NymContractCacheRefresher { + nyxd_client: Client, + cache: NymContractCache, + caching_interval: Duration, + + // Notify listeners that the cache has been updated + update_notifier: watch::Sender, +} + +impl NymContractCacheRefresher { + pub(crate) fn new( + nyxd_client: Client, + caching_interval: Duration, + cache: NymContractCache, + ) -> Self { + let (tx, _) = watch::channel(CacheNotification::Start); + NymContractCacheRefresher { + nyxd_client, + cache, + caching_interval, + update_notifier: tx, + } + } + + pub fn subscribe(&self) -> watch::Receiver { + self.update_notifier.subscribe() + } + + async fn refresh(&self) -> Result<()> { + let rewarding_params = self.nyxd_client.get_current_rewarding_parameters().await?; + let current_interval = self.nyxd_client.get_current_interval().await?.interval; + + let mixnodes = self.nyxd_client.get_mixnodes().await?; + let gateways = self.nyxd_client.get_gateways().await?; + + let mix_to_family = self.nyxd_client.get_all_family_members().await?; + + let rewarded_set_map = self.get_rewarded_set_map().await; + + let (rewarded_set, active_set) = + Self::collect_rewarded_and_active_set_details(&mixnodes, &rewarded_set_map); + + info!( + "Updating validator cache. There are {} mixnodes and {} gateways", + mixnodes.len(), + gateways.len(), + ); + + self.cache + .update( + mixnodes, + gateways, + rewarded_set, + active_set, + rewarding_params, + current_interval, + mix_to_family, + ) + .await; + + if let Err(err) = self.update_notifier.send(CacheNotification::Updated) { + warn!("Failed to notify validator cache refresh: {err}"); + } + + Ok(()) + } + + async fn get_rewarded_set_map(&self) -> HashMap { + self.nyxd_client + .get_rewarded_set_mixnodes() + .await + .map(|nodes| nodes.into_iter().collect()) + .unwrap_or_default() + } + + fn collect_rewarded_and_active_set_details( + all_mixnodes: &[MixNodeDetails], + rewarded_set_nodes: &HashMap, + ) -> (Vec, Vec) { + let mut active_set = Vec::new(); + let mut rewarded_set = Vec::new(); + + for mix in all_mixnodes { + if let Some(status) = rewarded_set_nodes.get(&mix.mix_id()) { + rewarded_set.push(mix.clone()); + if status.is_active() { + active_set.push(mix.clone()) + } + } + } + + (rewarded_set, active_set) + } + + pub(crate) async fn run(&self, mut shutdown: TaskClient) { + let mut interval = time::interval(self.caching_interval); + while !shutdown.is_shutdown() { + tokio::select! { + _ = interval.tick() => { + tokio::select! { + biased; + _ = shutdown.recv() => { + trace!("ValidatorCacheRefresher: Received shutdown"); + } + ret = self.refresh() => { + if let Err(err) = ret { + error!("Failed to refresh validator cache - {err}"); + } else { + // relaxed memory ordering is fine here. worst case scenario network monitor + // will just have to wait for an additional backoff to see the change. + // And so this will not really incur any performance penalties by setting it every loop iteration + self.cache.initialised.store(true, Ordering::Relaxed) + } + } + } + } + _ = shutdown.recv() => { + trace!("ValidatorCacheRefresher: Received shutdown"); + } + } + } + } +} diff --git a/nym-api/src/nym_contract_cache/mod.rs b/nym-api/src/nym_contract_cache/mod.rs new file mode 100644 index 0000000000..242cb8ae7a --- /dev/null +++ b/nym-api/src/nym_contract_cache/mod.rs @@ -0,0 +1,50 @@ +// Copyright 2021-2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::nym_contract_cache::cache::NymContractCache; +use crate::support::config::Config; +use crate::support::{self, nyxd}; +use okapi::openapi3::OpenApi; +use rocket::Route; +use rocket_okapi::openapi_get_routes_spec; +use rocket_okapi::settings::OpenApiSettings; +use task::TaskManager; + +use self::cache::refresher::NymContractCacheRefresher; + +pub(crate) mod cache; +pub(crate) mod routes; + +pub(crate) fn nym_contract_cache_routes(settings: &OpenApiSettings) -> (Vec, OpenApi) { + openapi_get_routes_spec![ + settings: routes::get_mixnodes, + routes::get_mixnodes_detailed, + routes::get_gateways, + routes::get_active_set, + routes::get_active_set_detailed, + routes::get_rewarded_set, + routes::get_rewarded_set_detailed, + routes::get_blacklisted_mixnodes, + routes::get_blacklisted_gateways, + routes::get_interval_reward_params, + routes::get_current_epoch + ] +} + +pub(crate) fn start_refresher( + config: &Config, + nym_contract_cache_state: &NymContractCache, + nyxd_client: nyxd::Client, + shutdown: &TaskManager, +) -> tokio::sync::watch::Receiver { + let nym_contract_cache_refresher = NymContractCacheRefresher::new( + nyxd_client, + config.get_topology_caching_interval(), + nym_contract_cache_state.to_owned(), + ); + let nym_contract_cache_listener = nym_contract_cache_refresher.subscribe(); + let shutdown_listener = shutdown.subscribe(); + tokio::spawn(async move { nym_contract_cache_refresher.run(shutdown_listener).await }); + + nym_contract_cache_listener +} diff --git a/nym-api/src/contract_cache/routes.rs b/nym-api/src/nym_contract_cache/routes.rs similarity index 84% rename from nym-api/src/contract_cache/routes.rs rename to nym-api/src/nym_contract_cache/routes.rs index 2d6b71e606..d0b7ffbd13 100644 --- a/nym-api/src/contract_cache/routes.rs +++ b/nym-api/src/nym_contract_cache/routes.rs @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ - contract_cache::ValidatorCache, node_status_api::{ helpers::{_get_active_set_detailed, _get_mixnodes_detailed, _get_rewarded_set_detailed}, NodeStatusCache, }, + nym_contract_cache::cache::NymContractCache, }; use mixnet_contract_common::{ mixnode::MixNodeDetails, reward_params::RewardingParams, GatewayBond, Interval, MixId, @@ -19,7 +19,7 @@ use std::collections::HashSet; #[openapi(tag = "contract-cache")] #[get("/mixnodes")] -pub async fn get_mixnodes(cache: &State) -> Json> { +pub async fn get_mixnodes(cache: &State) -> Json> { Json(cache.mixnodes().await) } @@ -40,13 +40,13 @@ pub async fn get_mixnodes_detailed( #[openapi(tag = "contract-cache")] #[get("/gateways")] -pub async fn get_gateways(cache: &State) -> Json> { +pub async fn get_gateways(cache: &State) -> Json> { Json(cache.gateways().await) } #[openapi(tag = "contract-cache")] #[get("/mixnodes/rewarded")] -pub async fn get_rewarded_set(cache: &State) -> Json> { +pub async fn get_rewarded_set(cache: &State) -> Json> { Json(cache.rewarded_set().await.value) } @@ -67,7 +67,7 @@ pub async fn get_rewarded_set_detailed( #[openapi(tag = "contract-cache")] #[get("/mixnodes/active")] -pub async fn get_active_set(cache: &State) -> Json> { +pub async fn get_active_set(cache: &State) -> Json> { Json(cache.active_set().await.value) } @@ -89,7 +89,7 @@ pub async fn get_active_set_detailed( #[openapi(tag = "contract-cache")] #[get("/mixnodes/blacklisted")] pub async fn get_blacklisted_mixnodes( - cache: &State, + cache: &State, ) -> Json>> { Json(cache.mixnodes_blacklist().await.map(|c| c.value)) } @@ -97,7 +97,7 @@ pub async fn get_blacklisted_mixnodes( #[openapi(tag = "contract-cache")] #[get("/gateways/blacklisted")] pub async fn get_blacklisted_gateways( - cache: &State, + cache: &State, ) -> Json>> { Json(cache.gateways_blacklist().await.map(|c| c.value)) } @@ -105,13 +105,13 @@ pub async fn get_blacklisted_gateways( #[openapi(tag = "contract-cache")] #[get("/epoch/reward_params")] pub async fn get_interval_reward_params( - cache: &State, + cache: &State, ) -> Json> { Json(cache.interval_reward_params().await.value) } #[openapi(tag = "contract-cache")] #[get("/epoch/current")] -pub async fn get_current_epoch(cache: &State) -> Json> { +pub async fn get_current_epoch(cache: &State) -> Json> { Json(cache.current_interval().await.value) } diff --git a/nym-api/src/support/caching/mod.rs b/nym-api/src/support/caching/mod.rs new file mode 100644 index 0000000000..ad2e40e80d --- /dev/null +++ b/nym-api/src/support/caching/mod.rs @@ -0,0 +1,51 @@ +use serde::Serialize; +use std::ops::Deref; +use time::OffsetDateTime; + +#[derive(Default, Serialize, Clone)] +pub struct Cache { + pub value: T, + as_at: i64, +} + +impl Cache { + pub fn new(value: T) -> Self { + Cache { + value, + as_at: current_unix_timestamp(), + } + } + + pub(crate) fn update(&mut self, value: T) { + self.value = value; + self.as_at = current_unix_timestamp() + } + + pub fn timestamp(&self) -> i64 { + self.as_at + } + + pub fn into_inner(self) -> T { + self.value + } +} + +impl Deref for Cache { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.value + } +} + +fn current_unix_timestamp() -> i64 { + let now = OffsetDateTime::now_utc(); + now.unix_timestamp() +} + +// The cache can emit notifications to listeners about the current state +#[derive(Debug, PartialEq, Eq)] +pub enum CacheNotification { + Start, + Updated, +} diff --git a/nym-api/src/support/cli/mod.rs b/nym-api/src/support/cli/mod.rs new file mode 100644 index 0000000000..806e073287 --- /dev/null +++ b/nym-api/src/support/cli/mod.rs @@ -0,0 +1,183 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use super::config::Config; +use ::config::defaults::var_names::{MIXNET_CONTRACT_ADDRESS, VESTING_CONTRACT_ADDRESS}; +use anyhow::Result; +use build_information::BinaryBuildInformation; +use clap::Parser; +use config::{NymConfig, OptionalSet}; +use lazy_static::lazy_static; +use std::fs; +use validator_client::nyxd; + +lazy_static! { + pub static ref PRETTY_BUILD_INFORMATION: String = + BinaryBuildInformation::new(env!("CARGO_PKG_VERSION")).pretty_print(); +} + +// Helper for passing LONG_VERSION to clap +fn pretty_build_info_static() -> &'static str { + &PRETTY_BUILD_INFORMATION +} + +// explicitly defined custom parser (as opposed to just using +// #[arg(value_parser = clap::value_parser!(u8).range(0..100))] +// for better error message +fn threshold_in_range(s: &str) -> Result { + let threshold: usize = s + .parse() + .map_err(|_| format!("`{s}` isn't a valid threshold number"))?; + if threshold > 100 { + Err(format!("{threshold} is not within the range 0-100")) + } else { + Ok(threshold as u8) + } +} + +#[derive(Parser)] +#[clap(author = "Nymtech", version, long_version = pretty_build_info_static(), about)] +pub(crate) struct CliArgs { + /// Path pointing to an env file that configures the Nym API. + #[clap(short, long)] + pub(crate) config_env_file: Option, + + /// Id of the nym-api we want to run + #[clap(long)] + pub(crate) id: Option, + + /// Specifies whether network monitoring is enabled on this API + #[clap(short = 'm', long)] + pub(crate) enable_monitor: Option, + + /// Specifies whether network rewarding is enabled on this API + #[clap(short = 'r', long, requires = "enable_monitor", requires = "mnemonic")] + pub(crate) enable_rewarding: Option, + + /// Endpoint to nyxd instance from which the monitor will grab nodes to test + #[clap(long)] + pub(crate) nyxd_validator: Option, + + /// Address of the mixnet contract managing the network + #[clap(long)] + pub(crate) mixnet_contract: Option, + + /// Address of the vesting contract holding locked tokens + #[clap(long)] + pub(crate) vesting_contract: Option, + + /// Mnemonic of the network monitor used for rewarding operators + // even though we're currently converting the mnemonic to string (and then back to the concrete type) + // at least we're getting immediate validation when passing the arguments + #[clap(long)] + pub(crate) mnemonic: Option, + + /// Specifies whether a config file based on provided arguments should be saved to a file + #[clap(short = 'w', long)] + pub(crate) save_config: bool, + + /// Specifies the minimum percentage of monitor test run data present in order to distribute rewards for given interval. + #[clap(long, value_parser = threshold_in_range)] + pub(crate) monitor_threshold: Option, + + /// Mixnodes with reliability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set. + #[clap(long, value_parser = threshold_in_range)] + pub(crate) min_mixnode_reliability: Option, + + /// Gateways with reliability lower the this get blacklisted by network monitor, get no traffic and cannot be selected into a rewarded set. + #[clap(long, value_parser = threshold_in_range)] + pub(crate) min_gateway_reliability: Option, + + /// Set this nym api to work in a enabled credentials that would attempt to use gateway with the bandwidth credential requirement + #[clap(long)] + pub(crate) enabled_credentials_mode: Option, + + /// Announced address where coconut clients will connect. + #[cfg(feature = "coconut")] + #[clap(long)] + pub(crate) announce_address: Option, + + /// Flag to indicate whether coconut signer authority is enabled on this API + #[cfg(feature = "coconut")] + #[clap(long, requires = "mnemonic", requires = "announce-address")] + pub(crate) enable_coconut: Option, +} + +pub(crate) fn build_config(args: CliArgs) -> Result { + // try to load config from the file, if it doesn't exist, use default values + let id = args.id.as_deref(); + let (config_from_file, _already_initialized) = match Config::load_from_file(id) { + Ok(cfg) => (cfg, true), + Err(_) => { + let config_path = Config::default_config_file_path(id) + .into_os_string() + .into_string() + .unwrap(); + warn!( + "Could not load the configuration file from {}. Either the file did not exist or was malformed. Using the default values instead", + config_path + ); + (Config::new(), false) + } + }; + + let config = override_config(config_from_file, args); + + #[cfg(feature = "coconut")] + if !_already_initialized { + crate::coconut::dkg::controller::init_keypair(&config)?; + } + + Ok(config) +} + +pub(crate) fn override_config(mut config: Config, args: CliArgs) -> Config { + if let Some(id) = args.id { + fs::create_dir_all(Config::default_config_directory(Some(&id))) + .expect("Could not create config directory"); + fs::create_dir_all(Config::default_data_directory(Some(&id))) + .expect("Could not create data directory"); + config = config.with_id(&id); + } + + config = config + .with_optional(Config::with_custom_nyxd_validator, args.nyxd_validator) + .with_optional_env( + Config::with_custom_mixnet_contract, + args.mixnet_contract, + MIXNET_CONTRACT_ADDRESS, + ) + .with_optional_env( + Config::with_custom_vesting_contract, + args.vesting_contract, + VESTING_CONTRACT_ADDRESS, + ) + .with_optional(Config::with_mnemonic, args.mnemonic) + .with_optional( + Config::with_minimum_interval_monitor_threshold, + args.monitor_threshold, + ) + .with_optional( + Config::with_min_mixnode_reliability, + args.min_mixnode_reliability, + ) + .with_optional( + Config::with_min_gateway_reliability, + args.min_gateway_reliability, + ) + .with_optional(Config::with_network_monitor_enabled, args.enable_monitor) + .with_optional(Config::with_rewarding_enabled, args.enable_rewarding) + .with_optional( + Config::with_disabled_credentials_mode, + args.enabled_credentials_mode.map(|b| !b), + ); + + #[cfg(feature = "coconut")] + { + config = config + .with_optional(Config::with_announce_address, args.announce_address) + .with_optional(Config::with_coconut_signer_enabled, args.enable_coconut); + } + + config +} diff --git a/nym-api/src/config/mod.rs b/nym-api/src/support/config/mod.rs similarity index 90% rename from nym-api/src/config/mod.rs rename to nym-api/src/support/config/mod.rs index 3cecf2ffb7..fae7d281c0 100644 --- a/nym-api/src/config/mod.rs +++ b/nym-api/src/support/config/mod.rs @@ -1,8 +1,8 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::template::config_template; -use config::defaults::mainnet::MIXNET_CONTRACT_ADDRESS; +use self::template::config_template; +use config::defaults::mainnet::{MIXNET_CONTRACT_ADDRESS, VESTING_CONTRACT_ADDRESS}; use config::defaults::DEFAULT_NYM_API_PORT; use config::NymConfig; use serde::{Deserialize, Serialize}; @@ -33,7 +33,9 @@ const DEFAULT_MINIMUM_TEST_ROUTES: usize = 1; const DEFAULT_ROUTE_TEST_PACKETS: usize = 1000; const DEFAULT_PER_NODE_TEST_PACKETS: usize = 3; -const DEFAULT_CACHE_INTERVAL: Duration = Duration::from_secs(30); +const DEFAULT_TOPOLOGY_CACHE_INTERVAL: Duration = Duration::from_secs(30); +const DEFAULT_NODE_STATUS_CACHE_INTERVAL: Duration = Duration::from_secs(120); +const DEFAULT_CIRCULATING_SUPPLY_CACHE_INTERVAL: Duration = Duration::from_secs(3600); const DEFAULT_MONITOR_THRESHOLD: u8 = 60; const DEFAULT_MIN_MIXNODE_RELIABILITY: u8 = 50; const DEFAULT_MIN_GATEWAY_RELIABILITY: u8 = 20; @@ -52,6 +54,9 @@ pub struct Config { #[serde(default)] topology_cacher: TopologyCacher, + #[serde(default)] + circulating_supply_cacher: CirculatingSupplyCacher, + #[serde(default)] rewarding: Rewarding, @@ -104,6 +109,9 @@ pub struct Base { /// Address of the validator contract managing the network mixnet_contract_address: nyxd::AccountId, + /// Address of the vesting contract holding locked tokens + vesting_contract_address: nyxd::AccountId, + /// Mnemonic used for rewarding and/or multisig operations mnemonic: bip39::Mnemonic, } @@ -123,6 +131,7 @@ impl Default for Base { local_validator: default_validator, announce_address: default_announce_address, mixnet_contract_address: MIXNET_CONTRACT_ADDRESS.parse().unwrap(), + vesting_contract_address: VESTING_CONTRACT_ADDRESS.parse().unwrap(), mnemonic: bip39::Mnemonic::generate(24).unwrap(), } } @@ -225,6 +234,9 @@ impl Default for NetworkMonitor { pub struct NodeStatusAPI { /// Path to the database file containing uptime statuses for all mixnodes and gateways. database_path: PathBuf, + + #[serde(with = "humantime_serde")] + caching_interval: Duration, } impl NodeStatusAPI { @@ -239,6 +251,7 @@ impl Default for NodeStatusAPI { fn default() -> Self { NodeStatusAPI { database_path: Self::default_database_path(), + caching_interval: DEFAULT_NODE_STATUS_CACHE_INTERVAL, } } } @@ -253,7 +266,25 @@ pub struct TopologyCacher { impl Default for TopologyCacher { fn default() -> Self { TopologyCacher { - caching_interval: DEFAULT_CACHE_INTERVAL, + caching_interval: DEFAULT_TOPOLOGY_CACHE_INTERVAL, + } + } +} + +#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] +#[serde(default)] +pub struct CirculatingSupplyCacher { + enabled: bool, + + #[serde(with = "humantime_serde")] + caching_interval: Duration, +} + +impl Default for CirculatingSupplyCacher { + fn default() -> Self { + CirculatingSupplyCacher { + enabled: true, + caching_interval: DEFAULT_CIRCULATING_SUPPLY_CACHE_INTERVAL, } } } @@ -407,6 +438,11 @@ impl Config { self } + pub fn with_custom_vesting_contract(mut self, vesting_contract: nyxd::AccountId) -> Self { + self.base.vesting_contract_address = vesting_contract; + self + } + pub fn with_mnemonic(mut self, mnemonic: bip39::Mnemonic) -> Self { self.base.mnemonic = mnemonic; self @@ -465,6 +501,10 @@ impl Config { self.base.mixnet_contract_address.clone() } + pub fn get_vesting_contract_address(&self) -> nyxd::AccountId { + self.base.vesting_contract_address.clone() + } + pub fn get_mnemonic(&self) -> bip39::Mnemonic { self.base.mnemonic.clone() } @@ -513,10 +553,22 @@ impl Config { self.network_monitor.per_node_test_packets } - pub fn get_caching_interval(&self) -> Duration { + pub fn get_topology_caching_interval(&self) -> Duration { self.topology_cacher.caching_interval } + pub fn get_node_status_caching_interval(&self) -> Duration { + self.node_status_api.caching_interval + } + + pub fn get_circulating_supply_caching_interval(&self) -> Duration { + self.circulating_supply_cacher.caching_interval + } + + pub fn get_circulating_supply_enabled(&self) -> bool { + self.circulating_supply_cacher.enabled + } + pub fn get_node_status_api_database_path(&self) -> PathBuf { self.node_status_api.database_path.clone() } diff --git a/nym-api/src/config/template.rs b/nym-api/src/support/config/template.rs similarity index 97% rename from nym-api/src/config/template.rs rename to nym-api/src/support/config/template.rs index 79773f56b7..9676eed563 100644 --- a/nym-api/src/config/template.rs +++ b/nym-api/src/support/config/template.rs @@ -24,6 +24,9 @@ announce_address = '{{ base.announce_address }}' # Address of the validator contract managing the network. mixnet_contract_address = '{{ base.mixnet_contract_address }}' +# Address of the vesting contract holding locked tokens +vesting_contract_address = '{{ base.vesting_contract_address }}' + # Mnemonic used for rewarding and validator interaction mnemonic = '{{ base.mnemonic }}' diff --git a/nym-api/src/support/http/mod.rs b/nym-api/src/support/http/mod.rs new file mode 100644 index 0000000000..387f0005a9 --- /dev/null +++ b/nym-api/src/support/http/mod.rs @@ -0,0 +1,97 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::circulating_supply_api::cache::CirculatingSupplyCache; +use crate::node_status_api::{self, NodeStatusCache}; +use crate::nym_contract_cache::cache::NymContractCache; +use crate::support::config::Config; +use crate::support::{nyxd, storage}; +use crate::{circulating_supply_api, nym_contract_cache}; +use anyhow::Result; +use rocket::http::Method; +use rocket::{Ignite, Rocket}; +use rocket_cors::{AllowedHeaders, AllowedOrigins, Cors}; +use rocket_okapi::mount_endpoints_and_merged_docs; +use rocket_okapi::swagger_ui::make_swagger_ui; + +#[cfg(feature = "coconut")] +use crate::coconut::{self, comm::QueryCommunicationChannel, InternalSignRequest}; + +pub(crate) mod openapi; + +pub(crate) async fn setup_rocket( + config: &Config, + mix_denom: String, + _nyxd_client: nyxd::Client, + #[cfg(feature = "coconut")] coconut_keypair: coconut::keypair::KeyPair, +) -> anyhow::Result> { + let openapi_settings = rocket_okapi::settings::OpenApiSettings::default(); + let mut rocket = rocket::build(); + + mount_endpoints_and_merged_docs! { + rocket, + "/v1".to_owned(), + openapi_settings, + "/" => (vec![], openapi::custom_openapi_spec()), + "" => circulating_supply_api::circulating_supply_routes(&openapi_settings), + "" => nym_contract_cache::nym_contract_cache_routes(&openapi_settings), + "/status" => node_status_api::node_status_routes(&openapi_settings, config.get_network_monitor_enabled()), + } + + let rocket = rocket + .mount("/swagger", make_swagger_ui(&openapi::get_docs())) + .attach(setup_cors()?) + .attach(NymContractCache::stage()) + .attach(NodeStatusCache::stage()) + .attach(CirculatingSupplyCache::stage(mix_denom.clone())); + + // This is not a very nice approach. A lazy value would be more suitable, but that's still + // a nightly feature: https://github.com/rust-lang/rust/issues/74465 + let storage = if cfg!(feature = "coconut") || config.get_network_monitor_enabled() { + Some(storage::NymApiStorage::init(config.get_node_status_api_database_path()).await?) + } else { + None + }; + + #[cfg(feature = "coconut")] + let rocket = if config.get_coconut_signer_enabled() { + let comm_channel = QueryCommunicationChannel::new(_nyxd_client.clone()); + rocket.attach(InternalSignRequest::stage( + _nyxd_client.clone(), + mix_denom, + coconut_keypair, + comm_channel, + storage.clone().unwrap(), + )) + } else { + rocket + }; + + // see if we should start up network monitor + let rocket = if config.get_network_monitor_enabled() { + rocket.attach(storage::NymApiStorage::stage(storage.unwrap())) + } else { + rocket + }; + + Ok(rocket.ignite().await?) +} + +fn setup_cors() -> Result { + let allowed_origins = AllowedOrigins::all(); + + // You can also deserialize this + let cors = rocket_cors::CorsOptions { + allowed_origins, + allowed_methods: vec![Method::Post, Method::Get] + .into_iter() + .map(From::from) + .collect(), + allowed_headers: AllowedHeaders::all(), + allow_credentials: true, + ..Default::default() + } + .to_cors()?; + + Ok(cors) +} diff --git a/nym-api/src/support/http/openapi.rs b/nym-api/src/support/http/openapi.rs new file mode 100644 index 0000000000..bda05b0c7a --- /dev/null +++ b/nym-api/src/support/http/openapi.rs @@ -0,0 +1,38 @@ +use okapi::openapi3::OpenApi; +use rocket_okapi::swagger_ui::SwaggerUIConfig; + +pub fn custom_openapi_spec() -> OpenApi { + use rocket_okapi::okapi::openapi3::*; + OpenApi { + openapi: OpenApi::default_version(), + info: Info { + title: "Nym API".to_owned(), + description: None, + terms_of_service: None, + contact: None, + license: None, + version: env!("CARGO_PKG_VERSION").to_owned(), + ..Default::default() + }, + servers: get_servers(), + ..Default::default() + } +} + +fn get_servers() -> Vec { + if std::env::var_os("CARGO").is_some() { + return vec![]; + } + vec![rocket_okapi::okapi::openapi3::Server { + url: std::env::var("OPEN_API_BASE").unwrap_or_else(|_| "/api/v1/".to_owned()), + description: Some("API".to_owned()), + ..Default::default() + }] +} + +pub(crate) fn get_docs() -> SwaggerUIConfig { + SwaggerUIConfig { + url: "../v1/openapi.json".to_owned(), + ..SwaggerUIConfig::default() + } +} diff --git a/nym-api/src/support/mod.rs b/nym-api/src/support/mod.rs new file mode 100644 index 0000000000..322c3625b3 --- /dev/null +++ b/nym-api/src/support/mod.rs @@ -0,0 +1,9 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub(crate) mod caching; +pub(crate) mod cli; +pub(crate) mod config; +pub(crate) mod http; +pub(crate) mod nyxd; +pub(crate) mod storage; diff --git a/nym-api/src/nyxd_client.rs b/nym-api/src/support/nyxd/mod.rs similarity index 77% rename from nym-api/src/nyxd_client.rs rename to nym-api/src/support/nyxd/mod.rs index 37a19c0791..4492fbaa04 100644 --- a/nym-api/src/nyxd_client.rs +++ b/nym-api/src/support/nyxd/mod.rs @@ -1,9 +1,10 @@ -// Copyright 2021-2022 - Nym Technologies SA +// Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::Config; use crate::epoch_operations::MixnodeToReward; -use config::defaults::{NymNetworkDetails, DEFAULT_NYM_API_PORT}; +use crate::support::config::Config; +use anyhow::Result; +use config::defaults::{ChainDetails, NymNetworkDetails, DEFAULT_NYM_API_PORT}; use mixnet_contract_common::families::{Family, FamilyHead}; use mixnet_contract_common::mixnode::MixNodeDetails; use mixnet_contract_common::reward_params::RewardingParams; @@ -13,13 +14,14 @@ use mixnet_contract_common::{ }; use std::sync::Arc; use tokio::sync::RwLock; +use validator_client::nyxd::error::NyxdError; use validator_client::nyxd::traits::{MixnetQueryClient, MixnetSigningClient}; use validator_client::nyxd::{ hash::{Hash, SHA256_HASH_SIZE}, - Coin, CosmWasmClient, QueryNyxdClient, SigningCosmWasmClient, SigningNyxdClient, - TendermintTime, + AccountId, Coin, SigningNyxdClient, TendermintTime, VestingQueryClient, }; use validator_client::ValidatorClientError; +use vesting_contract_common::AccountVestingCoins; #[cfg(feature = "coconut")] use crate::coconut::error::CoconutError; @@ -28,11 +30,11 @@ use async_trait::async_trait; #[cfg(feature = "coconut")] use coconut_bandwidth_contract_common::spend_credential::SpendCredentialResponse; #[cfg(feature = "coconut")] -use coconut_dkg_common::dealer::{ContractDealing, DealerDetails, DealerDetailsResponse}; -#[cfg(feature = "coconut")] -use coconut_dkg_common::types::{EncodedBTEPublicKeyWithProof, Epoch}; -#[cfg(feature = "coconut")] -use coconut_dkg_common::verification_key::{ContractVKShare, VerificationKeyShare}; +use coconut_dkg_common::{ + dealer::{ContractDealing, DealerDetails, DealerDetailsResponse}, + types::{EncodedBTEPublicKeyWithProof, Epoch}, + verification_key::{ContractVKShare, VerificationKeyShare}, +}; #[cfg(feature = "coconut")] use contracts_common::dealings::ContractSafeBytes; #[cfg(feature = "coconut")] @@ -44,19 +46,19 @@ use validator_client::nyxd::{ CoconutBandwidthQueryClient, DkgQueryClient, DkgSigningClient, MultisigQueryClient, MultisigSigningClient, }, - AccountId, Fee, + Fee, }; -pub(crate) struct Client(pub(crate) Arc>>); +pub(crate) struct Client(pub(crate) Arc>>); -impl Clone for Client { +impl Clone for Client { fn clone(&self) -> Self { Client(Arc::clone(&self.0)) } } -impl Client { - pub(crate) fn new_query(config: &Config) -> Self { +impl Client { + pub(crate) fn new(config: &Config) -> Self { // the api address is irrelevant here as **WE ARE THE API** // and we won't be talking on the socket here. let api_url = format!("http://localhost:{}", DEFAULT_NYM_API_PORT) @@ -65,30 +67,8 @@ impl Client { let nyxd_url = config.get_nyxd_url(); let details = NymNetworkDetails::new_from_env() - .with_mixnet_contract(Some(config.get_mixnet_contract_address().as_ref())); - - let client_config = validator_client::Config::try_from_nym_network_details(&details) - .expect("failed to construct valid validator client config with the provided network") - .with_urls(nyxd_url, api_url); - - let inner = - validator_client::Client::new_query(client_config).expect("Failed to connect to nyxd!"); - - Client(Arc::new(RwLock::new(inner))) - } -} - -impl Client { - pub(crate) fn new_signing(config: &Config) -> Self { - // the api address is irrelevant here as **WE ARE THE API** - // and we won't be talking on the socket here. - let api_url = format!("http://localhost:{}", DEFAULT_NYM_API_PORT) - .parse() - .unwrap(); - let nyxd_url = config.get_nyxd_url(); - - let details = NymNetworkDetails::new_from_env() - .with_mixnet_contract(Some(config.get_mixnet_contract_address().as_ref())); + .with_mixnet_contract(Some(config.get_mixnet_contract_address().as_ref())) + .with_vesting_contract(Some(config.get_vesting_contract_address().as_ref())); let client_config = validator_client::Config::try_from_nym_network_details(&details) .expect("failed to construct valid validator client config with the provided network") @@ -101,17 +81,44 @@ impl Client { Client(Arc::new(RwLock::new(inner))) } -} -impl Client { + pub(crate) async fn client_address(&self) -> AccountId { + self.0.read().await.nyxd.address().clone() + } + + pub(crate) async fn chain_details(&self) -> ChainDetails { + self.0.read().await.nyxd.current_chain_details().clone() + } + + pub(crate) async fn get_rewarding_validator_address( + &self, + ) -> Result { + let cosmwasm_addr = self + .0 + .read() + .await + .nyxd + .get_mixnet_contract_state() + .await? + .rewarding_validator_address + .into_string(); + + // this should never fail otherwise it implies either + // 1) our mixnet contract state is invalid + // 2) cosmwasm accepts invalid addresses + // 3) cosmrs fails to parse valid addresses + // all of those options are BAD + cosmwasm_addr + .clone() + .parse() + .map_err(|_| NyxdError::MalformedAccountAddress(cosmwasm_addr).into()) + } + // a helper function for the future to obtain the current block timestamp #[allow(dead_code)] pub(crate) async fn current_block_timestamp( &self, - ) -> Result - where - C: CosmWasmClient + Sync, - { + ) -> Result { let time = self .0 .read() @@ -133,10 +140,7 @@ impl Client { pub(crate) async fn get_block_hash( &self, height: u32, - ) -> Result, ValidatorClientError> - where - C: CosmWasmClient + Sync, - { + ) -> Result, ValidatorClientError> { let hash = match self.0.read().await.nyxd.get_block_hash(height).await? { Hash::Sha256(hash) => Some(hash), Hash::None => None, @@ -145,44 +149,29 @@ impl Client { Ok(hash) } - pub(crate) async fn get_mixnodes(&self) -> Result, ValidatorClientError> - where - C: CosmWasmClient + Sync + Send, - { + pub(crate) async fn get_mixnodes(&self) -> Result, ValidatorClientError> { self.0.read().await.get_all_nyxd_mixnodes_detailed().await } - pub(crate) async fn get_gateways(&self) -> Result, ValidatorClientError> - where - C: CosmWasmClient + Sync + Send, - { + pub(crate) async fn get_gateways(&self) -> Result, ValidatorClientError> { self.0.read().await.get_all_nyxd_gateways().await } pub(crate) async fn get_current_interval( &self, - ) -> Result - where - C: CosmWasmClient + Sync + Send, - { + ) -> Result { Ok(self.0.read().await.get_current_interval_details().await?) } pub(crate) async fn get_current_rewarding_parameters( &self, - ) -> Result - where - C: CosmWasmClient + Sync + Send, - { + ) -> Result { Ok(self.0.read().await.get_rewarding_parameters().await?) } pub(crate) async fn get_rewarded_set_mixnodes( &self, - ) -> Result, ValidatorClientError> - where - C: CosmWasmClient + Sync + Send, - { + ) -> Result, ValidatorClientError> { self.0 .read() .await @@ -190,30 +179,47 @@ impl Client { .await } + pub(crate) async fn get_current_vesting_account_storage_key( + &self, + ) -> Result { + let guard = self.0.read().await; + let vesting_contract = guard.nyxd.vesting_contract_address(); + // TODO: I don't like the usage of the hardcoded value here + let res = guard + .nyxd + .query_contract_raw(vesting_contract, b"key".to_vec()) + .await?; + + Ok(serde_json::from_slice(&res).map_err(NyxdError::from)?) + } + + pub(crate) async fn get_all_vesting_coins( + &self, + ) -> Result, ValidatorClientError> { + Ok(self + .0 + .read() + .await + .nyxd + .get_all_accounts_vesting_coins() + .await?) + } + #[allow(dead_code)] - pub(crate) async fn get_all_node_families(&self) -> Result, ValidatorClientError> - where - C: CosmWasmClient + Sync + Send, - { + pub(crate) async fn get_all_node_families(&self) -> Result, ValidatorClientError> { self.0.read().await.get_all_node_families().await } pub(crate) async fn get_all_family_members( &self, - ) -> Result, ValidatorClientError> - where - C: CosmWasmClient + Sync + Send, - { + ) -> Result, ValidatorClientError> { self.0.read().await.get_all_family_members().await } pub(crate) async fn send_rewarding_messages( &self, nodes: &[MixnodeToReward], - ) -> Result<(), ValidatorClientError> - where - C: SigningCosmWasmClient + Sync + Send, - { + ) -> Result<(), ValidatorClientError> { // for some reason, compiler complains if this is explicitly inline in code ¯\_(ツ)_/¯ #[inline] #[allow(unused_variables)] @@ -255,10 +261,7 @@ impl Client { &self, new_rewarded_set: Vec, expected_active_set_size: u32, - ) -> Result<(), ValidatorClientError> - where - C: SigningCosmWasmClient + Sync + Send, - { + ) -> Result<(), ValidatorClientError> { self.0 .write() .await @@ -268,10 +271,7 @@ impl Client { Ok(()) } - pub(crate) async fn reconcile_epoch_events(&self) -> Result<(), ValidatorClientError> - where - C: SigningCosmWasmClient + Sync + Send, - { + pub(crate) async fn reconcile_epoch_events(&self) -> Result<(), ValidatorClientError> { self.0 .write() .await @@ -284,12 +284,9 @@ impl Client { #[async_trait] #[cfg(feature = "coconut")] -impl crate::coconut::client::Client for Client -where - C: SigningCosmWasmClient + Sync + Send, -{ +impl crate::coconut::client::Client for Client { async fn address(&self) -> AccountId { - self.0.read().await.nyxd.address().clone() + self.client_address().await } async fn get_tx( diff --git a/nym-api/src/storage/manager.rs b/nym-api/src/support/storage/manager.rs similarity index 93% rename from nym-api/src/storage/manager.rs rename to nym-api/src/support/storage/manager.rs index 6f736294de..9067c09fa0 100644 --- a/nym-api/src/storage/manager.rs +++ b/nym-api/src/support/storage/manager.rs @@ -3,7 +3,7 @@ use crate::network_monitor::monitor::summary_producer::{GatewayResult, MixnodeResult}; use crate::node_status_api::models::{HistoricalUptime, Uptime}; use crate::node_status_api::utils::{ActiveGatewayStatuses, ActiveMixnodeStatuses}; -use crate::storage::models::{ +use crate::support::storage::models::{ ActiveGateway, ActiveMixnode, NodeStatus, RewardingReport, TestingRoute, }; use mixnet_contract_common::{EpochId, IdentityKey, MixId}; @@ -46,7 +46,7 @@ impl AvgGatewayReliability { // all SQL goes here impl StorageManager { - pub(super) async fn get_mixnode_mix_ids_by_identity( + pub(crate) async fn get_mixnode_mix_ids_by_identity( &self, identity: &str, ) -> Result, sqlx::Error> { @@ -63,7 +63,7 @@ impl StorageManager { Ok(ids) } - pub(super) async fn get_all_avg_mix_reliability_in_last_24hr( + pub(crate) async fn get_all_avg_mix_reliability_in_last_24hr( &self, end_ts_secs: i64, ) -> Result, sqlx::Error> { @@ -72,7 +72,7 @@ impl StorageManager { .await } - pub(super) async fn get_all_avg_gateway_reliability_in_last_24hr( + pub(crate) async fn get_all_avg_gateway_reliability_in_last_24hr( &self, end_ts_secs: i64, ) -> Result, sqlx::Error> { @@ -81,7 +81,7 @@ impl StorageManager { .await } - pub(super) async fn get_all_avg_mix_reliability_in_time_interval( + pub(crate) async fn get_all_avg_mix_reliability_in_time_interval( &self, start_ts_secs: i64, end_ts_secs: i64, @@ -109,7 +109,7 @@ impl StorageManager { Ok(result) } - pub(super) async fn get_all_avg_gateway_reliability_in_interval( + pub(crate) async fn get_all_avg_gateway_reliability_in_interval( &self, start_ts_secs: i64, end_ts_secs: i64, @@ -142,7 +142,7 @@ impl StorageManager { /// # Arguments /// /// * `mix_id`: mix-id (as assigned by the smart contract) of the mixnode. - pub(super) async fn get_mixnode_database_id( + pub(crate) async fn get_mixnode_database_id( &self, mix_id: MixId, ) -> Result, sqlx::Error> { @@ -159,7 +159,7 @@ impl StorageManager { /// # Arguments /// /// * `identity`: identity (base58-encoded public key) of the gateway. - pub(super) async fn get_gateway_id(&self, identity: &str) -> Result, sqlx::Error> { + pub(crate) async fn get_gateway_id(&self, identity: &str) -> Result, sqlx::Error> { let id = sqlx::query!( "SELECT id FROM gateway_details WHERE identity = ?", identity @@ -176,7 +176,7 @@ impl StorageManager { /// # Arguments /// /// * `mix_id`: mix-id (as assigned by the smart contract) of the mixnode. - pub(super) async fn get_mixnode_owner( + pub(crate) async fn get_mixnode_owner( &self, mix_id: MixId, ) -> Result, sqlx::Error> { @@ -193,7 +193,7 @@ impl StorageManager { /// # Arguments /// /// * `mix_id`: mix-id (as assigned by the smart contract) of the mixnode. - pub(super) async fn get_mixnode_identity_key( + pub(crate) async fn get_mixnode_identity_key( &self, mix_id: MixId, ) -> Result, sqlx::Error> { @@ -213,7 +213,7 @@ impl StorageManager { /// # Arguments /// /// * `identity`: identity (base58-encoded public key) of the gateway. - pub(super) async fn get_gateway_owner( + pub(crate) async fn get_gateway_owner( &self, identity: &str, ) -> Result, sqlx::Error> { @@ -235,7 +235,7 @@ impl StorageManager { /// /// * `mix_id`: mix-id (as assigned by the smart contract) of the mixnode. /// * `timestamp`: unix timestamp of the lower bound of the selection. - pub(super) async fn get_mixnode_statuses_since( + pub(crate) async fn get_mixnode_statuses_since( &self, mix_id: MixId, timestamp: i64, @@ -263,7 +263,7 @@ impl StorageManager { /// /// * `identity`: identity (base58-encoded public key) of the gateway. /// * `timestamp`: unix timestamp of the lower bound of the selection. - pub(super) async fn get_gateway_statuses_since( + pub(crate) async fn get_gateway_statuses_since( &self, identity: &str, timestamp: i64, @@ -289,7 +289,7 @@ impl StorageManager { /// # Arguments /// /// * `mix_id`: mix-id (as assigned by the smart contract) of the mixnode. - pub(super) async fn get_mixnode_historical_uptimes( + pub(crate) async fn get_mixnode_historical_uptimes( &self, mix_id: MixId, ) -> Result, sqlx::Error> { @@ -327,7 +327,7 @@ impl StorageManager { /// # Arguments /// /// * `identity`: identity (base58-encoded public key) of the gateway. - pub(super) async fn get_gateway_historical_uptimes( + pub(crate) async fn get_gateway_historical_uptimes( &self, identity: &str, ) -> Result, sqlx::Error> { @@ -367,7 +367,7 @@ impl StorageManager { /// /// * `since`: unix timestamp indicating the lower bound interval of the selection. /// * `until`: unix timestamp indicating the upper bound interval of the selection. - pub(super) async fn get_mixnode_statuses_by_database_id( + pub(crate) async fn get_mixnode_statuses_by_database_id( &self, id: i64, since: i64, @@ -388,7 +388,7 @@ impl StorageManager { .await } - pub(super) async fn get_average_reliability_in_interval( + pub(crate) async fn get_average_reliability_in_interval( &self, id: i64, start: i64, @@ -415,7 +415,7 @@ impl StorageManager { /// /// * `since`: unix timestamp indicating the lower bound interval of the selection. /// * `until`: unix timestamp indicating the upper bound interval of the selection. - pub(super) async fn get_gateway_statuses_by_id( + pub(crate) async fn get_gateway_statuses_by_id( &self, id: i64, since: i64, @@ -442,7 +442,7 @@ impl StorageManager { /// /// * `timestamp`: unix timestamp indicating when the measurements took place. /// * `mixnode_results`: reliability results of each node that got tested. - pub(super) async fn submit_mixnode_statuses( + pub(crate) async fn submit_mixnode_statuses( &self, timestamp: i64, mixnode_results: Vec, @@ -488,7 +488,7 @@ impl StorageManager { /// /// * `timestamp`: unix timestamp indicating when the measurements took place. /// * `gateway_results`: reliability results of each node that got tested. - pub(super) async fn submit_gateway_statuses( + pub(crate) async fn submit_gateway_statuses( &self, timestamp: i64, gateway_results: Vec, @@ -537,7 +537,7 @@ impl StorageManager { /// # Arguments /// /// * `testing_route`: test route used for this particular network monitor run. - pub(super) async fn submit_testing_route_used( + pub(crate) async fn submit_testing_route_used( &self, testing_route: TestingRoute, ) -> Result<(), sqlx::Error> { @@ -565,7 +565,7 @@ impl StorageManager { /// /// * `db_mixnode_id`: id (as saved in the database) of the mixnode. /// * `since`: unix timestamp indicating the lower bound interval of the selection. - pub(super) async fn get_mixnode_testing_route_presence_count_since( + pub(crate) async fn get_mixnode_testing_route_presence_count_since( &self, db_mixnode_id: i64, since: i64, @@ -604,7 +604,7 @@ impl StorageManager { /// /// * `gateway_id`: id (as saved in the database) of the gateway. /// * `since`: unix timestamp indicating the lower bound interval of the selection. - pub(super) async fn get_gateway_testing_route_presence_count_since( + pub(crate) async fn get_gateway_testing_route_presence_count_since( &self, gateway_id: i64, since: i64, @@ -636,7 +636,7 @@ impl StorageManager { } /// Checks whether there are already any historical uptimes with this particular date. - pub(super) async fn check_for_historical_uptime_existence( + pub(crate) async fn check_for_historical_uptime_existence( &self, today_iso_8601: &str, ) -> Result { @@ -656,7 +656,7 @@ impl StorageManager { /// * `node_id`: id of the mixnode (as inserted in `mixnode_details_id` table). /// * `date`: date associated with the uptime represented in ISO 8601, i.e. YYYY-MM-DD. /// * `uptime`: the actual uptime of the node during the specified day. - pub(super) async fn insert_mixnode_historical_uptime( + pub(crate) async fn insert_mixnode_historical_uptime( &self, mix_id: i64, date: &str, @@ -678,7 +678,7 @@ impl StorageManager { /// * `node_id`: id of the gateway (as inserted in `gateway_details_id` table). /// * `date`: date associated with the uptime represented in ISO 8601, i.e. YYYY-MM-DD. /// * `uptime`: the actual uptime of the node during the specified day. - pub(super) async fn insert_gateway_historical_uptime( + pub(crate) async fn insert_gateway_historical_uptime( &self, mix_id: i64, date: &str, @@ -699,7 +699,7 @@ impl StorageManager { /// # Arguments /// /// * `timestamp`: unix timestamp at which the monitor test run has occurred - pub(super) async fn insert_monitor_run(&self, timestamp: i64) -> Result { + pub(crate) async fn insert_monitor_run(&self, timestamp: i64) -> Result { let res = sqlx::query!("INSERT INTO monitor_run(timestamp) VALUES (?)", timestamp) .execute(&self.connection_pool) .await?; @@ -712,7 +712,7 @@ impl StorageManager { /// /// * `since`: unix timestamp indicating the lower bound interval of the selection. /// * `until`: unix timestamp indicating the upper bound interval of the selection. - pub(super) async fn get_monitor_runs_count( + pub(crate) async fn get_monitor_runs_count( &self, since: i64, until: i64, @@ -734,7 +734,7 @@ impl StorageManager { /// # Arguments /// /// * `until`: timestamp specifying the purge cutoff. - pub(super) async fn purge_old_mixnode_statuses( + pub(crate) async fn purge_old_mixnode_statuses( &self, timestamp: i64, ) -> Result<(), sqlx::Error> { @@ -750,7 +750,7 @@ impl StorageManager { /// # Arguments /// /// * `until`: timestamp specifying the purge cutoff. - pub(super) async fn purge_old_gateway_statuses( + pub(crate) async fn purge_old_gateway_statuses( &self, timestamp: i64, ) -> Result<(), sqlx::Error> { @@ -767,7 +767,7 @@ impl StorageManager { /// /// * `since`: indicates the lower bound timestamp for deciding whether given mixnode is active /// * `until`: indicates the upper bound timestamp for deciding whether given mixnode is active - pub(super) async fn get_all_active_mixnodes_in_interval( + pub(crate) async fn get_all_active_mixnodes_in_interval( &self, since: i64, until: i64, @@ -801,7 +801,7 @@ impl StorageManager { /// /// * `since`: indicates the lower bound timestamp for deciding whether given gateway is active /// * `until`: indicates the upper bound timestamp for deciding whether given gateway is active - pub(super) async fn get_all_active_gateways_in_interval( + pub(crate) async fn get_all_active_gateways_in_interval( &self, since: i64, until: i64, @@ -847,7 +847,7 @@ impl StorageManager { /// # Arguments /// /// * `report`: report to insert into the database - pub(super) async fn insert_rewarding_report( + pub(crate) async fn insert_rewarding_report( &self, report: RewardingReport, ) -> Result<(), sqlx::Error> { @@ -865,7 +865,7 @@ impl StorageManager { Ok(()) } - pub(super) async fn get_rewarding_report( + pub(crate) async fn get_rewarding_report( &self, absolute_epoch_id: EpochId, ) -> Result, sqlx::Error> { @@ -890,7 +890,7 @@ impl StorageManager { /// /// * `since`: unix timestamp indicating the lower bound interval of the selection. /// * `until`: unix timestamp indicating the upper bound interval of the selection. - pub(super) async fn get_all_active_mixnodes_statuses_in_interval( + pub(crate) async fn get_all_active_mixnodes_statuses_in_interval( &self, since: i64, until: i64, @@ -924,7 +924,7 @@ impl StorageManager { /// /// * `since`: unix timestamp indicating the lower bound interval of the selection. /// * `until`: unix timestamp indicating the upper bound interval of the selection. - pub(super) async fn get_all_active_gateways_statuses_in_interval( + pub(crate) async fn get_all_active_gateways_statuses_in_interval( &self, since: i64, until: i64, @@ -958,7 +958,7 @@ impl StorageManager { /// * `tx_hash`: hash of the deposit transaction. /// * `blinded_signature_response`: the encrypted blinded signature response. #[cfg(feature = "coconut")] - pub(super) async fn insert_blinded_signature_response( + pub(crate) async fn insert_blinded_signature_response( &self, tx_hash: &str, blinded_signature_response: &str, @@ -979,7 +979,7 @@ impl StorageManager { /// /// * `tx_hash`: transaction hash of the deposit. #[cfg(feature = "coconut")] - pub(super) async fn get_blinded_signature_response( + pub(crate) async fn get_blinded_signature_response( &self, tx_hash: &str, ) -> Result, sqlx::Error> { diff --git a/nym-api/src/storage/mod.rs b/nym-api/src/support/storage/mod.rs similarity index 100% rename from nym-api/src/storage/mod.rs rename to nym-api/src/support/storage/mod.rs diff --git a/nym-api/src/storage/models.rs b/nym-api/src/support/storage/models.rs similarity index 100% rename from nym-api/src/storage/models.rs rename to nym-api/src/support/storage/models.rs diff --git a/nym-api/src/swagger.rs b/nym-api/src/swagger.rs deleted file mode 100644 index 02ff24c31e..0000000000 --- a/nym-api/src/swagger.rs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2022 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use rocket_okapi::swagger_ui::SwaggerUIConfig; - -pub(crate) fn get_docs() -> SwaggerUIConfig { - SwaggerUIConfig { - url: "../v1/openapi.json".to_owned(), - ..SwaggerUIConfig::default() - } -} From 4854e929ed05aa7aa86fb9658de2f5e49af08cf3 Mon Sep 17 00:00:00 2001 From: Fouad Date: Thu, 12 Jan 2023 11:33:28 +0000 Subject: [PATCH 164/591] link to the ng mixnet explorer for account info (#2823) --- nym-wallet/Cargo.lock | 2 +- nym-wallet/src/context/main.tsx | 1 + nym-wallet/src/pages/balance/balance.tsx | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 0a9ba7103f..7e52cca234 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -2932,7 +2932,7 @@ dependencies = [ [[package]] name = "nym_wallet" -version = "1.1.5" +version = "1.1.6" dependencies = [ "aes-gcm", "argon2 0.3.4", diff --git a/nym-wallet/src/context/main.tsx b/nym-wallet/src/context/main.tsx index f8956f9298..683cdbe4e0 100644 --- a/nym-wallet/src/context/main.tsx +++ b/nym-wallet/src/context/main.tsx @@ -21,6 +21,7 @@ import { Console } from '../utils/console'; export const urls = (networkName?: Network) => networkName === 'MAINNET' ? { + mixnetExplorer: 'https://mixnet.explorers.guru/', blockExplorer: 'https://blocks.nymtech.net', networkExplorer: 'https://explorer.nymtech.net', } diff --git a/nym-wallet/src/pages/balance/balance.tsx b/nym-wallet/src/pages/balance/balance.tsx index 82a5fec102..12183ef987 100644 --- a/nym-wallet/src/pages/balance/balance.tsx +++ b/nym-wallet/src/pages/balance/balance.tsx @@ -43,7 +43,7 @@ export const BalanceCard = () => { {network && ( Date: Thu, 12 Jan 2023 12:35:33 +0100 Subject: [PATCH 165/591] client-core: add note about msg string --- clients/client-core/src/error.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clients/client-core/src/error.rs b/clients/client-core/src/error.rs index 6162a5d9be..de08bb3f20 100644 --- a/clients/client-core/src/error.rs +++ b/clients/client-core/src/error.rs @@ -65,8 +65,10 @@ pub enum ClientCoreError { /// Set of messages that the client can send to listeners via the task manager #[derive(thiserror::Error, Debug)] pub enum ClientCoreStatusMessage { + // NOTE: The nym-connect frontend listens for these strings, so don't change them until we have a more robust mechanism in place #[error("The connected gateway is slow, or the connection to it is slow")] GatewayIsSlow, + // NOTE: The nym-connect frontend listens for these strings, so don't change them until we have a more robust mechanism in place #[error("The connected gateway is very slow, or the connection to it is very slow")] GatewayIsVerySlow, } From 65b819c649ac40ba3e2bc80dceb56009383a4e26 Mon Sep 17 00:00:00 2001 From: Mark Sinclair Date: Thu, 12 Jan 2023 12:52:31 +0000 Subject: [PATCH 166/591] GitHub Actions: add directory to fix error on runners with read-only file systems --- .github/workflows/support-files/scratch/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/workflows/support-files/scratch/.gitkeep diff --git a/.github/workflows/support-files/scratch/.gitkeep b/.github/workflows/support-files/scratch/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 From 74feb065f909292cc1277f76f8a17d80114f61f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 12 Jan 2023 14:03:26 +0100 Subject: [PATCH 167/591] outfox: fix some clippy warnings in tests (#2831) --- nym-outfox/tests/unittests.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nym-outfox/tests/unittests.rs b/nym-outfox/tests/unittests.rs index ea5b46571d..0123e55779 100644 --- a/nym-outfox/tests/unittests.rs +++ b/nym-outfox/tests/unittests.rs @@ -46,15 +46,15 @@ mod tests { ) .unwrap(); - assert!(&new_buffer[mix_params.payload_range()] != &buffer[mix_params.payload_range()]); - assert!(&new_buffer[mix_params.routing_data_range()] != &routing[..]); + assert!(new_buffer[mix_params.payload_range()] != buffer[mix_params.payload_range()]); + assert!(new_buffer[mix_params.routing_data_range()] != routing[..]); let _ = mix_params .decode_mix_layer(&mut new_buffer[..], &mix_secret) .unwrap(); - assert!(&new_buffer[mix_params.payload_range()] == &buffer[mix_params.payload_range()]); - assert!(&new_buffer[mix_params.routing_data_range()] == &routing[..]); + assert!(new_buffer[mix_params.payload_range()] == buffer[mix_params.payload_range()]); + assert!(new_buffer[mix_params.routing_data_range()] == routing[..]); } #[test] @@ -64,14 +64,14 @@ mod tests { let mut message_clone = message.clone(); lion_transform(&mut message_clone[..], &key, [1, 2, 3]).unwrap(); - assert!(&message_clone[..] != &message[..]); + assert!(message_clone[..] != message[..]); let mut message_clone_2 = message.clone(); lion_transform_encrypt(&mut message_clone_2, &key).unwrap(); assert_eq!(message_clone_2, message_clone); lion_transform(&mut message_clone[..], &key[..], [3, 2, 1]).unwrap(); - assert!(&message_clone[..] == &message[..]); + assert!(message_clone[..] == message[..]); } #[test] @@ -124,7 +124,7 @@ mod tests { .unwrap(); assert!( - &buf[params.total_packet_length() - 1025..params.total_packet_length()] != [0; 1025] + buf[params.total_packet_length() - 1025..params.total_packet_length()] != [0; 1025] ); let _ = layer_params2 From 3bd4343a3992631069925ff2d0cbaf531dea3b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 12 Jan 2023 14:18:46 +0100 Subject: [PATCH 168/591] client-core: tidy by removing some allow dead_code (#2832) --- clients/client-core/src/client/key_manager.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/clients/client-core/src/client/key_manager.rs b/clients/client-core/src/client/key_manager.rs index 779df52cf7..da0b9f5cbf 100644 --- a/clients/client-core/src/client/key_manager.rs +++ b/clients/client-core/src/client/key_manager.rs @@ -42,9 +42,6 @@ pub struct KeyManager { */ impl KeyManager { - // this is actually **NOT** dead code - // I have absolutely no idea why the compiler insists it's unused. The call happens during client::init::execute - #[allow(dead_code)] /// Creates new instance of a [`KeyManager`] pub fn new(rng: &mut R) -> Self where @@ -130,9 +127,6 @@ impl KeyManager { Ok(key_manager) } - // this is actually **NOT** dead code - // I have absolutely no idea why the compiler insists it's unused. The call happens during client::init::execute - #[allow(dead_code)] /// Stores all available keys on the disk. // While perhaps there is no much point in storing the `AckKey` on the disk, // it is done so for the consistency sake so that you wouldn't require an rng instance @@ -211,9 +205,6 @@ impl KeyManager { Arc::clone(&self.ack_key) } - // this is actually **NOT** dead code - // I have absolutely no idea why the compiler insists it's unused. The call happens during client::init::execute - #[allow(dead_code)] /// After shared key with the gateway is derived, puts its ownership to this instance of a [`KeyManager`]. pub fn insert_gateway_shared_key(&mut self, gateway_shared_key: Arc) { self.gateway_shared_key = Some(gateway_shared_key) From 2eee5195ccf006b5805e1b637605df2e5139ea8c Mon Sep 17 00:00:00 2001 From: Fouad Date: Thu, 12 Jan 2023 17:15:31 +0000 Subject: [PATCH 169/591] React / React DOM / Types upgrade to version 18 (#2830) * new react and reactdom packages in wallet * new react and reactdom packages in root * new react and reactdom packages in nym connect * new react and reactdom packages in root * update react and reactdom for explorer * react and react-dom upgrade for ts-packages remove unused import fix linting error * use custom FC typing move typings folder * fix type error --- explorer/package.json | 8 +-- explorer/src/App.tsx | 2 +- explorer/src/components/ComponentError.tsx | 2 +- explorer/src/components/ContentCard.tsx | 2 +- .../src/components/CustomColumnHeading.tsx | 2 +- explorer/src/components/DetailTable.tsx | 2 +- explorer/src/components/Footer.tsx | 2 +- .../src/components/MixNodes/BondBreakdown.tsx | 2 +- .../src/components/MixNodes/DetailSection.tsx | 2 +- .../MixNodes/Economics/EconomicsProgress.tsx | 2 +- .../components/MixNodes/Economics/Table.tsx | 2 +- explorer/src/components/MixNodes/Status.tsx | 2 +- .../components/MixNodes/StatusDropdown.tsx | 16 +++--- explorer/src/components/MobileNav.tsx | 6 +-- explorer/src/components/Nav.tsx | 4 +- explorer/src/components/Socials.tsx | 2 +- explorer/src/components/StatsCard.tsx | 9 +++- explorer/src/components/Switch.tsx | 4 +- explorer/src/components/TableToolbar.tsx | 2 +- explorer/src/components/Title.tsx | 2 +- explorer/src/components/TwoColSmallTable.tsx | 2 +- .../src/components/Universal-DataGrid.tsx | 2 +- explorer/src/components/UptimeChart.tsx | 2 +- explorer/src/components/WorldMap.tsx | 2 +- explorer/src/context/main.tsx | 2 +- explorer/src/context/mixnode.tsx | 3 +- explorer/src/errors/ErrorBoundaryContent.tsx | 2 +- explorer/src/icons/GatewaysSVG.tsx | 2 +- explorer/src/icons/LightSwitchSVG.tsx | 2 +- explorer/src/icons/MixnodesSVG.tsx | 2 +- explorer/src/icons/MobileDrawerClose.tsx | 2 +- explorer/src/icons/NetworksSVG.tsx | 2 +- explorer/src/icons/NodemapSVG.tsx | 2 +- explorer/src/icons/OverviewSVG.tsx | 2 +- explorer/src/icons/ValidatorsSVG.tsx | 2 +- explorer/src/icons/socials/DiscordIcon.tsx | 2 +- explorer/src/icons/socials/GitHubIcon.tsx | 2 +- explorer/src/icons/socials/TelegramIcon.tsx | 2 +- explorer/src/icons/socials/TwitterIcon.tsx | 2 +- explorer/src/index.tsx | 30 +++++++----- explorer/src/pages/404/index.tsx | 2 +- explorer/src/pages/GatewayDetail/index.tsx | 4 +- explorer/src/pages/Gateways/index.tsx | 2 +- explorer/src/pages/MixnodeDetail/index.tsx | 6 +-- explorer/src/pages/Mixnodes/index.tsx | 2 +- explorer/src/pages/MixnodesMap/index.tsx | 9 +++- explorer/src/pages/Overview/index.tsx | 2 +- explorer/src/routes/index.tsx | 4 +- explorer/src/routes/network-components.tsx | 4 +- explorer/src/theme/index.tsx | 2 +- explorer/src/typings/FC.d.ts | 1 + nym-connect/package.json | 8 +-- nym-connect/src/App.tsx | 2 +- nym-connect/src/components/AppWindowFrame.tsx | 2 +- .../src/components/ConnectionButton.tsx | 2 +- .../src/components/ConnectionStats.tsx | 2 +- .../src/components/ConnectionStatus.tsx | 4 +- .../Growth/TestAndEarnButtonArea.tsx | 4 +- .../Growth/TestAndEarnCurrentDraw.tsx | 10 ++-- .../components/Growth/TestAndEarnDraws.tsx | 6 +-- .../Growth/TestAndEarnEnterWalletAddress.tsx | 2 +- .../components/Growth/TestAndEarnError.tsx | 2 +- .../Growth/TestAndEarnPopup.stories.tsx | 14 +++--- .../components/Growth/TestAndEarnPopup.tsx | 4 +- .../components/Growth/TestAndEarnTakePart.tsx | 2 +- .../components/Growth/TestAndEarnWinner.tsx | 4 +- .../Growth/TestAndEarnWinnerWalletAddress.tsx | 2 +- .../Growth/context/TestAndEarnContext.tsx | 2 +- .../context/mocks/TestAndEarnContext.tsx | 14 +++--- .../src/components/IpAddressAndPort.tsx | 2 +- nym-connect/src/components/NeedHelp.tsx | 2 +- .../src/components/ServiceProviderPopup.tsx | 2 +- .../components/ServiceProviderSelector.tsx | 2 +- .../src/components/ServiceSelector.tsx | 2 +- nym-connect/src/context/main.tsx | 2 +- nym-connect/src/context/mocks/main.tsx | 2 +- nym-connect/src/index.tsx | 34 +++++++------ nym-connect/src/layouts/ConnectedLayout.tsx | 2 +- nym-connect/src/layouts/DefaultLayout.tsx | 2 +- nym-connect/src/theme/index.tsx | 4 +- nym-connect/src/typings/FC.d.ts | 1 + nym-wallet/package.json | 8 +-- nym-wallet/src/components/ActionsMenu.tsx | 12 ++--- .../Bonding/modals/BondOversaturatedModal.tsx | 2 +- nym-wallet/src/components/ClientAddress.tsx | 16 ++---- nym-wallet/src/components/ConfirmTX.tsx | 3 +- .../components/Delegation/DelegateBlocker.tsx | 2 +- .../components/Delegation/DelegateModal.tsx | 2 +- .../Delegation/DelegationActions.tsx | 4 +- .../components/Delegation/DelegationList.tsx | 4 +- .../Delegation/DelegationModal.stories.tsx | 2 +- .../components/Delegation/DelegationModal.tsx | 3 +- .../src/components/Delegation/Delegations.tsx | 2 +- .../components/Delegation/Modals.stories.tsx | 2 +- .../components/Delegation/UndelegateModal.tsx | 2 +- .../src/components/Modals/ErrorModal.tsx | 3 +- .../src/components/Modals/LoadingModal.tsx | 2 +- .../src/components/Modals/ModalDivider.tsx | 2 +- .../src/components/Modals/ModalListItem.tsx | 2 +- .../components/Modals/SimpleModal.stories.tsx | 2 +- .../src/components/Modals/SimpleModal.tsx | 3 +- nym-wallet/src/components/NetworkSelector.tsx | 2 +- nym-wallet/src/components/NymCard.tsx | 3 +- .../Rewards/RedeemModal.stories.tsx | 2 +- .../src/components/Rewards/RedeemModal.tsx | 2 +- .../src/components/Rewards/RewardsSummary.tsx | 2 +- nym-wallet/src/components/SuccessResponse.tsx | 2 +- nym-wallet/src/components/Title.tsx | 2 +- .../src/components/TokenPoolSelector.tsx | 2 +- .../src/components/TransactionDetails.tsx | 2 +- nym-wallet/src/components/textfields.tsx | 4 +- nym-wallet/src/context/accounts.tsx | 2 +- nym-wallet/src/context/auth.tsx | 2 +- nym-wallet/src/context/bonding.tsx | 2 +- nym-wallet/src/context/buy.tsx | 2 +- nym-wallet/src/context/delegations.tsx | 1 + nym-wallet/src/context/main.tsx | 2 +- nym-wallet/src/context/mocks/accounts.tsx | 2 +- nym-wallet/src/context/mocks/buy.tsx | 2 +- nym-wallet/src/context/mocks/delegations.tsx | 2 +- nym-wallet/src/context/mocks/main.tsx | 2 +- nym-wallet/src/context/mocks/rewards.tsx | 2 +- nym-wallet/src/context/rewards.tsx | 2 +- nym-wallet/src/index.tsx | 9 ++-- nym-wallet/src/layouts/AppLayout.tsx | 2 +- nym-wallet/src/layouts/AuthLayout.tsx | 2 +- nym-wallet/src/layouts/PageLayout.tsx | 5 +- nym-wallet/src/pages/Admin/index.tsx | 4 +- nym-wallet/src/pages/auth/pages/welcome.tsx | 2 +- .../balance/components/vesting-timeline.tsx | 4 +- .../src/pages/internal-docs/DocEntry.tsx | 2 +- nym-wallet/src/pages/settings/tabs.tsx | 4 +- nym-wallet/src/pages/terminal/index.tsx | 7 +-- nym-wallet/src/svg-icons/node.tsx | 2 +- nym-wallet/src/theme/NymWalletTheme.tsx | 5 +- nym-wallet/src/theme/index.tsx | 4 +- nym-wallet/src/typings/FC.d.ts | 1 + .../package.json | 7 +-- .../src/App.tsx | 6 +-- .../src/ThemeToggle.tsx | 2 +- .../src/context/index.tsx | 2 +- .../src/context/mixnet.tsx | 2 +- testnet-faucet/package.json | 4 +- testnet-faucet/src/context/index.tsx | 5 +- testnet-faucet/src/theme/index.tsx | 2 +- testnet-faucet/typings/FC.d.ts | 1 + .../package.json | 4 +- ts-packages/mui-theme/README.md | 8 +-- ts-packages/mui-theme/package.json | 6 +-- ts-packages/mui-theme/src/theme/index.tsx | 10 +++- ts-packages/mui-theme/src/typings/FC.d.ts | 1 + ts-packages/react-components/package.json | 19 ++++--- .../account/WalletAddressFormField.tsx | 2 +- .../components/clipboard/CopyToClipboard.tsx | 2 +- .../src/components/coins/CoinMark.tsx | 2 +- .../src/components/coins/CoinMarkTestnet.tsx | 2 +- .../src/components/currency/Currency.tsx | 2 +- .../components/currency/CurrencyAmount.tsx | 4 +- .../components/currency/CurrencyFormField.tsx | 2 +- .../currency/CurrencyWithCoinMark.tsx | 2 +- .../src/components/logo/NymIcon.tsx | 2 +- .../src/components/logo/NymLogo.tsx | 2 +- .../src/components/logo/NymWordmark.tsx | 2 +- .../mixnodes/IdentityKeyFormField.tsx | 2 +- .../components/networks/NetworkSelector.tsx | 4 +- .../src/playground/Playground.tsx | 2 +- .../src/playground/buttons.tsx | 4 +- .../src/playground/checkboxes.tsx | 2 +- .../react-components/src/playground/fonts.tsx | 2 +- .../src/playground/switches.tsx | 2 +- .../react-components/src/playground/theme.tsx | 4 +- .../src/playground/theme/MUIThemeExplorer.tsx | 4 +- .../src/playground/theme/PaletteSwatches.tsx | 6 +-- .../react-components/src/typings/FC.d.ts | 1 + .../README.md | 6 +-- .../package.json | 6 +-- .../src/App.tsx | 6 +-- .../src/ThemeToggle.tsx | 2 +- .../src/context/index.tsx | 2 +- .../src/typings/FC.d.ts | 1 + .../yarn-error.log | 4 +- ts-packages/webpack/package.json | 4 +- yarn.lock | 49 ++++++++++++------- 183 files changed, 392 insertions(+), 326 deletions(-) create mode 100644 explorer/src/typings/FC.d.ts create mode 100644 nym-connect/src/typings/FC.d.ts create mode 100644 nym-wallet/src/typings/FC.d.ts create mode 100644 testnet-faucet/typings/FC.d.ts create mode 100644 ts-packages/mui-theme/src/typings/FC.d.ts create mode 100644 ts-packages/react-components/src/typings/FC.d.ts create mode 100644 ts-packages/react-webpack-with-theme-example/src/typings/FC.d.ts diff --git a/explorer/package.json b/explorer/package.json index 65ed064da2..916e9b0aeb 100644 --- a/explorer/package.json +++ b/explorer/package.json @@ -18,8 +18,8 @@ "d3-scale": "^4.0.0", "date-fns": "^2.24.0", "i18n-iso-countries": "^6.8.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-error-boundary": "^3.1.4", "react-google-charts": "^3.0.15", "react-identicons": "^1.2.5", @@ -48,8 +48,8 @@ "@types/geojson": "^7946.0.8", "@types/jest": "^27.0.1", "@types/node": "^16.7.13", - "@types/react": "^17.0.34", - "@types/react-dom": "^17.0.9", + "@types/react": "^18.0.26", + "@types/react-dom": "^18.0.10", "@types/react-simple-maps": "^1.0.6", "@types/react-tooltip": "^4.2.4", "@types/topojson-client": "^3.1.0", diff --git a/explorer/src/App.tsx b/explorer/src/App.tsx index 9ce60f06f9..4e6fcc41e8 100644 --- a/explorer/src/App.tsx +++ b/explorer/src/App.tsx @@ -4,7 +4,7 @@ import { MobileNav } from './components/MobileNav'; import { Routes } from './routes/index'; import { useIsMobile } from './hooks/useIsMobile'; -export const App: React.FC = () => { +export const App: FCWithChildren = () => { const isMobile = useIsMobile(); if (isMobile) { diff --git a/explorer/src/components/ComponentError.tsx b/explorer/src/components/ComponentError.tsx index 34ca4b9d19..00b448fb9e 100644 --- a/explorer/src/components/ComponentError.tsx +++ b/explorer/src/components/ComponentError.tsx @@ -1,7 +1,7 @@ import { Typography } from '@mui/material'; import * as React from 'react'; -export const ComponentError: React.FC<{ text: string }> = ({ text }) => ( +export const ComponentError: FCWithChildren<{ text: string }> = ({ text }) => ( = ({ +export const ContentCard: FCWithChildren = ({ title, Icon, Action, diff --git a/explorer/src/components/CustomColumnHeading.tsx b/explorer/src/components/CustomColumnHeading.tsx index 4adcda4540..c15ef27f9b 100644 --- a/explorer/src/components/CustomColumnHeading.tsx +++ b/explorer/src/components/CustomColumnHeading.tsx @@ -4,7 +4,7 @@ import { ExpandLess, ExpandMore } from '@mui/icons-material'; import { useTheme } from '@mui/material/styles'; import { Tooltip } from '@nymproject/react/tooltip/Tooltip'; -export const CustomColumnHeading: React.FC<{ headingTitle: string; tooltipInfo?: string }> = ({ +export const CustomColumnHeading: FCWithChildren<{ headingTitle: string; tooltipInfo?: string }> = ({ headingTitle, tooltipInfo, }) => { diff --git a/explorer/src/components/DetailTable.tsx b/explorer/src/components/DetailTable.tsx index 75aaae36ab..17418de4f3 100644 --- a/explorer/src/components/DetailTable.tsx +++ b/explorer/src/components/DetailTable.tsx @@ -43,7 +43,7 @@ function formatCellValues(val: string | number, field: string) { return val; } -export const DetailTable: React.FC<{ +export const DetailTable: FCWithChildren<{ tableName: string; columnsData: ColumnsType[]; rows: MixnodeRowType[] | GatewayEnrichedRowType[]; diff --git a/explorer/src/components/Footer.tsx b/explorer/src/components/Footer.tsx index 2ee7c77198..c85ba47be4 100644 --- a/explorer/src/components/Footer.tsx +++ b/explorer/src/components/Footer.tsx @@ -4,7 +4,7 @@ import { Typography } from '@mui/material'; import { Socials } from './Socials'; import { useIsMobile } from '../hooks/useIsMobile'; -export const Footer: React.FC = () => { +export const Footer: FCWithChildren = () => { const isMobile = useIsMobile(); return ( diff --git a/explorer/src/components/MixNodes/BondBreakdown.tsx b/explorer/src/components/MixNodes/BondBreakdown.tsx index 06009be05d..d7faa163fc 100644 --- a/explorer/src/components/MixNodes/BondBreakdown.tsx +++ b/explorer/src/components/MixNodes/BondBreakdown.tsx @@ -13,7 +13,7 @@ import { currencyToString } from '../../utils/currency'; import { useMixnodeContext } from '../../context/mixnode'; import { useIsMobile } from '../../hooks/useIsMobile'; -export const BondBreakdownTable: React.FC = () => { +export const BondBreakdownTable: FCWithChildren = () => { const { mixNode, delegations, uniqDelegations } = useMixnodeContext(); const [showDelegations, toggleShowDelegations] = React.useState(false); diff --git a/explorer/src/components/MixNodes/DetailSection.tsx b/explorer/src/components/MixNodes/DetailSection.tsx index b338487fd2..dcf0f830b5 100644 --- a/explorer/src/components/MixNodes/DetailSection.tsx +++ b/explorer/src/components/MixNodes/DetailSection.tsx @@ -11,7 +11,7 @@ interface MixNodeDetailProps { mixnodeDescription: MixNodeDescriptionResponse; } -export const MixNodeDetailSection: React.FC = ({ mixNodeRow, mixnodeDescription }) => { +export const MixNodeDetailSection: FCWithChildren = ({ mixNodeRow, mixnodeDescription }) => { const theme = useTheme(); const palette = [theme.palette.text.primary]; const isMobile = useIsMobile(); diff --git a/explorer/src/components/MixNodes/Economics/EconomicsProgress.tsx b/explorer/src/components/MixNodes/Economics/EconomicsProgress.tsx index 1779d8d18f..9f8525a754 100644 --- a/explorer/src/components/MixNodes/Economics/EconomicsProgress.tsx +++ b/explorer/src/components/MixNodes/Economics/EconomicsProgress.tsx @@ -6,7 +6,7 @@ import { Box } from '@mui/system'; const parseToNumber = (value: number | undefined | string) => typeof value === 'string' ? parseInt(value || '', 10) : value || 0; -export const EconomicsProgress: React.FC< +export const EconomicsProgress: FCWithChildren< LinearProgressProps & { threshold?: number; } diff --git a/explorer/src/components/MixNodes/Economics/Table.tsx b/explorer/src/components/MixNodes/Economics/Table.tsx index 5977847436..929445254a 100644 --- a/explorer/src/components/MixNodes/Economics/Table.tsx +++ b/explorer/src/components/MixNodes/Economics/Table.tsx @@ -66,7 +66,7 @@ const formatCellValues = (value: EconomicsRowsType, field: string) => { ); }; -export const DelegatorsInfoTable: React.FC> = ({ +export const DelegatorsInfoTable: FCWithChildren> = ({ tableName, columnsData, rows, diff --git a/explorer/src/components/MixNodes/Status.tsx b/explorer/src/components/MixNodes/Status.tsx index 88cfe6c1eb..a2da302c87 100644 --- a/explorer/src/components/MixNodes/Status.tsx +++ b/explorer/src/components/MixNodes/Status.tsx @@ -36,7 +36,7 @@ export const getMixNodeStatusText = (status: MixnodeStatus) => { } }; -export const MixNodeStatus: React.FC = ({ status }) => { +export const MixNodeStatus: FCWithChildren = ({ status }) => { const theme = useTheme(); const Icon = React.useMemo(() => getMixNodeIcon(status), [status]); const color = React.useMemo(() => getMixNodeStatusColor(theme, status), [status, theme]); diff --git a/explorer/src/components/MixNodes/StatusDropdown.tsx b/explorer/src/components/MixNodes/StatusDropdown.tsx index 18263edf6e..9cb34a2f0c 100644 --- a/explorer/src/components/MixNodes/StatusDropdown.tsx +++ b/explorer/src/components/MixNodes/StatusDropdown.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { MenuItem } from '@mui/material'; import Select from '@mui/material/Select'; -import { SelectInputProps } from '@mui/material/Select/SelectInput'; +import { SelectChangeEvent } from '@mui/material/Select/SelectInput'; import { SxProps } from '@mui/system'; import { MixNodeStatus } from './Status'; import { MixnodeStatus, MixnodeStatusWithAll } from '../../typeDefs/explorer-api'; @@ -16,14 +16,18 @@ interface MixNodeStatusDropdownProps { onSelectionChanged?: (status?: MixnodeStatusWithAll) => void; } -export const MixNodeStatusDropdown: React.FC = ({ status, onSelectionChanged, sx }) => { +export const MixNodeStatusDropdown: FCWithChildren = ({ + status, + onSelectionChanged, + sx, +}) => { const isMobile = useIsMobile(); const [statusValue, setStatusValue] = React.useState(status || MixnodeStatusWithAll.all); - const onChange: SelectInputProps['onChange'] = React.useCallback( - ({ target: { value } }) => { - setStatusValue(value); + const onChange = React.useCallback( + (event: SelectChangeEvent) => { + setStatusValue(event.target.value as MixnodeStatusWithAll); if (onSelectionChanged) { - onSelectionChanged(value); + onSelectionChanged(event.target.value as MixnodeStatusWithAll); } }, [onSelectionChanged], diff --git a/explorer/src/components/MobileNav.tsx b/explorer/src/components/MobileNav.tsx index cb44210e9d..ac03cb9c80 100644 --- a/explorer/src/components/MobileNav.tsx +++ b/explorer/src/components/MobileNav.tsx @@ -25,11 +25,7 @@ import { NYM_WEBSITE } from '../api/constants'; import { ExpandableButton } from './Nav'; import { DarkLightSwitchMobile } from './Switch'; -type MobileNavProps = { - children: React.ReactNode; -}; - -export const MobileNav: React.FC<{ children: React.ReactNode }> = ({ children }: MobileNavProps) => { +export const MobileNav: FCWithChildren = ({ children }) => { const theme = useTheme(); const { navState, updateNavState } = useMainContext(); const [drawerOpen, setDrawerOpen] = React.useState(false); diff --git a/explorer/src/components/Nav.tsx b/explorer/src/components/Nav.tsx index e2808871a0..2461263ff5 100644 --- a/explorer/src/components/Nav.tsx +++ b/explorer/src/components/Nav.tsx @@ -87,7 +87,7 @@ type ExpandableButtonType = { setToActive: (num: number) => void; }; -export const ExpandableButton: React.FC = ({ +export const ExpandableButton: FCWithChildren = ({ id, url, setToActive, @@ -230,7 +230,7 @@ ExpandableButton.defaultProps = { closeDrawer: undefined, }; -export const Nav: React.FC = ({ children }) => { +export const Nav: FCWithChildren = ({ children }) => { const { updateNavState, navState } = useMainContext(); const [drawerIsOpen, setDrawerToOpen] = React.useState(false); const [fixedOpen, setFixedOpen] = React.useState(false); diff --git a/explorer/src/components/Socials.tsx b/explorer/src/components/Socials.tsx index f359a24ac1..138b0e18eb 100644 --- a/explorer/src/components/Socials.tsx +++ b/explorer/src/components/Socials.tsx @@ -12,7 +12,7 @@ export const TWITTER_LINK = 'https://twitter.com/nymproject'; export const GITHUB_LINK = 'https://github.com/nymtech'; export const DISCORD_LINK = 'https://discord.gg/nym'; -export const Socials: React.FC<{ isFooter?: boolean }> = ({ isFooter }) => { +export const Socials: FCWithChildren<{ isFooter?: boolean }> = ({ isFooter }) => { const theme = useTheme(); const color = isFooter ? theme.palette.nym.networkExplorer.footer.socialIcons diff --git a/explorer/src/components/StatsCard.tsx b/explorer/src/components/StatsCard.tsx index a571441015..36355b1759 100644 --- a/explorer/src/components/StatsCard.tsx +++ b/explorer/src/components/StatsCard.tsx @@ -11,7 +11,14 @@ interface StatsCardProps { onClick?: () => void; color?: string; } -export const StatsCard: React.FC = ({ icon, title, count, onClick, errorMsg, color: colorProp }) => { +export const StatsCard: FCWithChildren = ({ + icon, + title, + count, + onClick, + errorMsg, + color: colorProp, +}) => { const theme = useTheme(); const color = colorProp || theme.palette.text.primary; return ( diff --git a/explorer/src/components/Switch.tsx b/explorer/src/components/Switch.tsx index 835100a1db..e5cbd47385 100644 --- a/explorer/src/components/Switch.tsx +++ b/explorer/src/components/Switch.tsx @@ -51,7 +51,7 @@ export const DarkLightSwitch = styled(Switch)(({ theme }) => ({ }, })); -export const DarkLightSwitchMobile: React.FC = () => { +export const DarkLightSwitchMobile: FCWithChildren = () => { const { toggleMode } = useMainContext(); return ( diff --git a/ts-packages/react-components/src/playground/checkboxes.tsx b/ts-packages/react-components/src/playground/checkboxes.tsx index 90a020e2e0..a903fc1f59 100644 --- a/ts-packages/react-components/src/playground/checkboxes.tsx +++ b/ts-packages/react-components/src/playground/checkboxes.tsx @@ -3,7 +3,7 @@ import Checkbox from '@mui/material/Checkbox'; const label = { inputProps: { 'aria-label': 'Checkbox demo' } }; -export const PlaygroundCheckboxes: React.FC = () => ( +export const PlaygroundCheckboxes: FCWithChildren = () => (
diff --git a/ts-packages/react-components/src/playground/fonts.tsx b/ts-packages/react-components/src/playground/fonts.tsx index 5bbd822905..a7347c0191 100644 --- a/ts-packages/react-components/src/playground/fonts.tsx +++ b/ts-packages/react-components/src/playground/fonts.tsx @@ -4,7 +4,7 @@ const CONTENT = 'The quick brown fox jumped over the white fence'; const WEIGHTS = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000]; -export const PlaygroundFonts: React.FC = () => ( +export const PlaygroundFonts: FCWithChildren = () => (
{WEIGHTS.map((fontWeight) => (
diff --git a/ts-packages/react-components/src/playground/switches.tsx b/ts-packages/react-components/src/playground/switches.tsx index edda1654a9..dde14e1e2b 100644 --- a/ts-packages/react-components/src/playground/switches.tsx +++ b/ts-packages/react-components/src/playground/switches.tsx @@ -3,7 +3,7 @@ import Switch from '@mui/material/Switch'; const label = { inputProps: { 'aria-label': 'Switch demo' } }; -export const PlaygroundBasicSwitches: React.FC = () => ( +export const PlaygroundBasicSwitches: FCWithChildren = () => (
diff --git a/ts-packages/react-components/src/playground/theme.tsx b/ts-packages/react-components/src/playground/theme.tsx index 609dd86aa9..8bab62e51b 100644 --- a/ts-packages/react-components/src/playground/theme.tsx +++ b/ts-packages/react-components/src/playground/theme.tsx @@ -3,7 +3,7 @@ import { useTheme } from '@mui/material'; import { MUIThemeExplorer } from './theme/MUIThemeExplorer'; import { PaletteSwatches, PaletteSwatchesList } from './theme/PaletteSwatches'; -export const PlaygroundTheme: React.FC = () => { +export const PlaygroundTheme: FCWithChildren = () => { const theme = useTheme(); return ( <> @@ -15,7 +15,7 @@ export const PlaygroundTheme: React.FC = () => { ); }; -export const PlaygroundPalette: React.FC = () => { +export const PlaygroundPalette: FCWithChildren = () => { const theme = useTheme(); return ; }; diff --git a/ts-packages/react-components/src/playground/theme/MUIThemeExplorer.tsx b/ts-packages/react-components/src/playground/theme/MUIThemeExplorer.tsx index e395969a72..82b64dae9c 100644 --- a/ts-packages/react-components/src/playground/theme/MUIThemeExplorer.tsx +++ b/ts-packages/react-components/src/playground/theme/MUIThemeExplorer.tsx @@ -7,7 +7,7 @@ import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; import ArrowRightIcon from '@mui/icons-material/ArrowRight'; import { Box } from '@mui/material'; -const MUIThemeExplorerItem: React.FC<{ +const MUIThemeExplorerItem: FCWithChildren<{ path: string; parentKey: string; theme: Theme; @@ -82,7 +82,7 @@ const MUIThemeExplorerItem: React.FC<{ return null; }; -export const MUIThemeExplorer: React.FC<{ +export const MUIThemeExplorer: FCWithChildren<{ theme: Theme; }> = ({ theme }) => ( ); -export const PaletteSwatches: React.FC<{ +export const PaletteSwatches: FCWithChildren<{ theme: Theme; }> = ({ theme }) => { const swatches = React.useMemo(() => flatten(theme.palette), [theme.palette]); @@ -46,7 +46,7 @@ export const PaletteSwatches: React.FC<{ ); }; -export const PaletteSwatchesList: React.FC<{ +export const PaletteSwatchesList: FCWithChildren<{ theme: Theme; }> = ({ theme }) => { const swatches = React.useMemo(() => flatten(theme.palette), [theme.palette]); diff --git a/ts-packages/react-components/src/typings/FC.d.ts b/ts-packages/react-components/src/typings/FC.d.ts new file mode 100644 index 0000000000..08ebdfa298 --- /dev/null +++ b/ts-packages/react-components/src/typings/FC.d.ts @@ -0,0 +1 @@ +declare type FCWithChildren

= React.FC>; diff --git a/ts-packages/react-webpack-with-theme-example/README.md b/ts-packages/react-webpack-with-theme-example/README.md index 37a3029f11..a95d916957 100644 --- a/ts-packages/react-webpack-with-theme-example/README.md +++ b/ts-packages/react-webpack-with-theme-example/README.md @@ -51,7 +51,7 @@ Storybook is available in [@nymproject/react](../react-components/src/stories/In The [Nym theme](../mui-theme/src/theme/theme.ts) provides a theme provider that you can add as follows: ```typescript jsx -export const App: React.FC = () => ( +export const App: FCWithChildren = () => ( @@ -59,13 +59,13 @@ export const App: React.FC = () => ( ); -export const AppTheme: React.FC = ({ children }) => { +export const AppTheme: FCWithChildren = ({ children }) => { const { mode } = useAppContext(); return {children}; }; -export const Content: React.FC = () => { +export const Content: FCWithChildren = () => { ... } ``` diff --git a/ts-packages/react-webpack-with-theme-example/package.json b/ts-packages/react-webpack-with-theme-example/package.json index fc05cce9c6..078ebc27cb 100644 --- a/ts-packages/react-webpack-with-theme-example/package.json +++ b/ts-packages/react-webpack-with-theme-example/package.json @@ -4,8 +4,8 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "@mui/material": "^5.0.1", "@mui/styles": "^5.0.1", "@mui/icons-material": "^5.5.0", @@ -27,7 +27,7 @@ "@testing-library/react": "^12.0.0", "@types/jest": "^27.0.1", "@types/node": "^16.7.13", - "@types/react": "^17.0.34", + "@types/react": "^18.0.26", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", "babel-loader": "^8.3.0", diff --git a/ts-packages/react-webpack-with-theme-example/src/App.tsx b/ts-packages/react-webpack-with-theme-example/src/App.tsx index 80ca1cc33a..6f70787807 100644 --- a/ts-packages/react-webpack-with-theme-example/src/App.tsx +++ b/ts-packages/react-webpack-with-theme-example/src/App.tsx @@ -8,13 +8,13 @@ import { useTheme } from '@mui/material/styles'; import { ThemeToggle } from './ThemeToggle'; import { AppContextProvider, useAppContext } from './context'; -export const AppTheme: React.FC = ({ children }) => { +export const AppTheme: FCWithChildren = ({ children }) => { const { mode } = useAppContext(); return {children}; }; -export const Content: React.FC = () => { +export const Content: FCWithChildren = () => { const { mode } = useAppContext(); const theme = useTheme(); const isMounted = useIsMounted(); @@ -70,7 +70,7 @@ export const Content: React.FC = () => { ); }; -export const App: React.FC = () => ( +export const App: FCWithChildren = () => ( diff --git a/ts-packages/react-webpack-with-theme-example/src/ThemeToggle.tsx b/ts-packages/react-webpack-with-theme-example/src/ThemeToggle.tsx index e52ed5dce5..2739f429e9 100644 --- a/ts-packages/react-webpack-with-theme-example/src/ThemeToggle.tsx +++ b/ts-packages/react-webpack-with-theme-example/src/ThemeToggle.tsx @@ -4,7 +4,7 @@ import DarkModeIcon from '@mui/icons-material/DarkMode'; import LightModeIcon from '@mui/icons-material/LightMode'; import { useAppContext } from './context'; -export const ThemeToggle: React.FC = () => { +export const ThemeToggle: FCWithChildren = () => { const { mode, toggleMode } = useAppContext(); return ( +

+ +

Send messages from your browser, through the mixnet, and to the recipient using the "send" button.

+

Sent messages show in blue, received + messages show in green.

+ +
+

+

+

+ + + diff --git a/sdk/typescript/examples/parcel/src/index.ts b/sdk/typescript/examples/parcel/src/index.ts new file mode 100644 index 0000000000..3871d1c0a7 --- /dev/null +++ b/sdk/typescript/examples/parcel/src/index.ts @@ -0,0 +1,53 @@ +import { createNymMixnetClient, NymMixnetClient } from '@nymproject/sdk'; +import { displayReceived, sendMessageTo, displaySenderAddress } from './dom-utils'; + +let nym: NymMixnetClient | null = null; + +/** + * The main entry point + */ +async function main() { + nym = await createNymMixnetClient(); + + if (!nym) { + console.error('Oh no! Could not create client'); + return; + } + + const nymApiUrl = 'https://validator.nymtech.net/api'; + const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM'; + + // subscribe to connect event, so that we can show the client's address + nym.events.subscribeToConnected((e) => { + if (e.args.address) { + displaySenderAddress(e.args.address); + } + }); + + // subscribe to message received events and show any string messages received + nym.events.subscribeToTextMessageReceivedEvent((e) => { + displayReceived(e.args.payload); + }); + + const sendButton: HTMLButtonElement = document.querySelector('#send-button') as HTMLButtonElement; + if (sendButton) { + sendButton.onclick = function () { + if (nym) { + sendMessageTo(nym); + } + }; + } + + // start up the client + await nym.client.start({ + clientId: 'My awesome client', + nymApiUrl, + preferredGatewayIdentityKey, + }); +} + +// wait for the html to load +window.addEventListener('DOMContentLoaded', () => { + // let's do this! + main(); +}); diff --git a/sdk/typescript/examples/parcel/tsconfig.json b/sdk/typescript/examples/parcel/tsconfig.json new file mode 100644 index 0000000000..b8059e8698 --- /dev/null +++ b/sdk/typescript/examples/parcel/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "outDir": "./dist" + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx" + ], + "exclude": [ + "node_modules", + "build", + "dist" + ] +} diff --git a/sdk/typescript/examples/plain-html/README.md b/sdk/typescript/examples/plain-html/README.md index cd071de5ef..7be33f8e2f 100644 --- a/sdk/typescript/examples/plain-html/README.md +++ b/sdk/typescript/examples/plain-html/README.md @@ -4,6 +4,15 @@ This is an example of using the Nym Mixnet to send text chat messages, with opti You can use this example as a seed for a new project. +## Before you start + +You will need to have the Rust WASM toolchain installed. Please [follow the instructions here](https://rustwasm.github.io/docs/book/game-of-life/setup.html) +to install `wasm-pack` and then run the sample. + +> **VERY IMPORTANT** Please note that this example will build the WASM client locally using Rust and will not use the latest published NPM package. + +## Running the example + Try out the chat app by running: ``` @@ -20,7 +29,7 @@ a WASM library that builds and encrypts Sphinx packets in the browser to send ov The WASM code encrypts each layer of the Sphinx packet in the browser, before sending the Sphinx packet over a websocket to the ingress gateway: -![Sphinx packet](../docs/sphinx2.svg) +![Sphinx packet](../docs/sphinx.svg) diff --git a/sdk/typescript/examples/plain-html/package.json b/sdk/typescript/examples/plain-html/package.json index fa36c8d616..bf93d01dfd 100644 --- a/sdk/typescript/examples/plain-html/package.json +++ b/sdk/typescript/examples/plain-html/package.json @@ -52,7 +52,9 @@ "webpack-merge": "^5.8.0" }, "scripts": { + "prestart": "yarn build:dependencies", "start": "webpack serve --progress --port 3000", + "start:only-this": "webpack serve --progress --port 3000", "build:dependencies": "run-s build:dependencies:nym-client-wasm build:dependencies:ts-packages build:dependencies:sdk", "build:dependencies:nym-client-wasm": "../../packages/nym-client-wasm/scripts/build.sh", "build:dependencies:ts-packages": "cd ../../../.. && yarn && yarn build", @@ -68,4 +70,4 @@ "lint": "eslint src", "lint:fix": "eslint src --fix" } -} \ No newline at end of file +} diff --git a/sdk/typescript/examples/plain-html/src/dom-utils.ts b/sdk/typescript/examples/plain-html/src/dom-utils.ts index b2926cbcec..7e98532ea3 100644 --- a/sdk/typescript/examples/plain-html/src/dom-utils.ts +++ b/sdk/typescript/examples/plain-html/src/dom-utils.ts @@ -1,4 +1,4 @@ -import { NymMixnetClient } from '@nymproject/sdk'; +import { NymMixnetClient, MimeTypes } from '@nymproject/sdk'; /** * Create a Sphinx packet and send it to the mixnet through the gateway node. @@ -8,11 +8,11 @@ import { NymMixnetClient } from '@nymproject/sdk'; * @param {Client} nymClient the nym client to use for message sending */ export async function sendMessageTo(nym: NymMixnetClient) { - const payload = (document.getElementById('message') as HTMLFormElement).value; + const message = (document.getElementById('message') as HTMLFormElement).value; const recipient = (document.getElementById('recipient') as HTMLFormElement).value; - await nym.client.sendMessage({ payload, recipient }); - displaySend(payload); + await nym.client.send({ payload: { message, mimeType: MimeTypes.TextPlain }, recipient }); + displaySend(message); } /** diff --git a/sdk/typescript/examples/plain-html/src/index.ts b/sdk/typescript/examples/plain-html/src/index.ts index d279586b72..3871d1c0a7 100644 --- a/sdk/typescript/examples/plain-html/src/index.ts +++ b/sdk/typescript/examples/plain-html/src/index.ts @@ -14,13 +14,8 @@ async function main() { return; } - // // mixnet v1 - // const nymApiUrl = 'https://validator.nymtech.net/api'; - // const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM'; - - // mixnet v2 - const nymApiUrl = 'https://qwerty-validator-api.qa.nymte.ch/api'; // "http://localhost:8081"; - const preferredGatewayIdentityKey = undefined; // '36vfvEyBzo5cWEFbnP7fqgY39kFw9PQhvwzbispeNaxL'; + const nymApiUrl = 'https://validator.nymtech.net/api'; + const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM'; // subscribe to connect event, so that we can show the client's address nym.events.subscribeToConnected((e) => { diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/README.md b/sdk/typescript/examples/react-webpack-with-theme-example/README.md index 4afa796f9b..fc0ca2bb46 100644 --- a/sdk/typescript/examples/react-webpack-with-theme-example/README.md +++ b/sdk/typescript/examples/react-webpack-with-theme-example/README.md @@ -10,6 +10,15 @@ You can use this example as a seed for a new project, and it uses: - Web Workers - Material UI (MUI) +## Before you start + +You will need to have the Rust WASM toolchain installed. Please [follow the instructions here](https://rustwasm.github.io/docs/book/game-of-life/setup.html) +to install `wasm-pack` and then run the sample. + +> **VERY IMPORTANT** Please note that this example will build the WASM client locally using Rust and will not use the latest published NPM package. + +## Running the example + Try out the chat app by running: ``` diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/package.json b/sdk/typescript/examples/react-webpack-with-theme-example/package.json index 377130917f..e3f767dfed 100644 --- a/sdk/typescript/examples/react-webpack-with-theme-example/package.json +++ b/sdk/typescript/examples/react-webpack-with-theme-example/package.json @@ -76,6 +76,7 @@ "webpack-merge": "^5.8.0" }, "scripts": { + "prestart": "yarn build:dependencies", "start": "webpack serve --progress --port 3000", "start:only-this": "webpack serve --progress --port 3000", "build:dependencies": "run-s build:dependencies:nym-client-wasm build:dependencies:ts-packages build:dependencies:sdk", @@ -93,4 +94,4 @@ "lint": "eslint src", "lint:fix": "eslint src --fix" } -} \ No newline at end of file +} diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx b/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx index 633a6ede8c..034754d017 100644 --- a/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx +++ b/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx @@ -143,13 +143,13 @@ export const Content: FCWithChildren = () => { if (events) { const unsubcribe = events.subscribeToBinaryMessageReceivedEvent((e) => { // the headers will be JSON (see the mixnet context for how they are created), so parse them - const headers = parseBinaryMessageHeaders(e.args.headers); + const headers = e.args.headers ? parseBinaryMessageHeaders(e.args.headers) : undefined; - const blob = new Blob([new Uint8Array(e.args.payload)], { type: headers.mimeType }); + const blob = new Blob([new Uint8Array(e.args.payload)], { type: headers?.mimeType }); log.current.push({ kind: 'rx', timestamp: new Date(), - filename: headers.filename, + filename: headers?.filename, fileDownloadUrl: URL.createObjectURL(blob), filesize: e.args.payload.length, }); diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/src/context/mixnet.tsx b/sdk/typescript/examples/react-webpack-with-theme-example/src/context/mixnet.tsx index 919402f779..1a2588ce40 100644 --- a/sdk/typescript/examples/react-webpack-with-theme-example/src/context/mixnet.tsx +++ b/sdk/typescript/examples/react-webpack-with-theme-example/src/context/mixnet.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createNymMixnetClient, IWebWorkerEvents, NymClientConfig, NymMixnetClient } from '@nymproject/sdk'; +import { createNymMixnetClient, IWebWorkerEvents, MimeTypes, NymClientConfig, NymMixnetClient } from '@nymproject/sdk'; export interface BinaryMessageHeaders { filename: string; @@ -67,7 +67,10 @@ export const MixnetContextProvider: FCWithChildren = ({ children }) => { console.error('Nym client has not initialised. Please wrap in useEffect on `isReady` prop of this context.'); return; } - await nym.current.client.sendMessage(args); + await nym.current.client.send({ + recipient: args.recipient, + payload: { message: args.payload, mimeType: MimeTypes.TextPlain }, + }); }; const sendBinaryMessage = async (args: { payload: Uint8Array; recipient: string; headers: BinaryMessageHeaders }) => { @@ -76,8 +79,10 @@ export const MixnetContextProvider: FCWithChildren = ({ children }) => { return; } // convert headers to JSON - const sendArgs = { ...args, headers: JSON.stringify(args.headers) }; - await nym.current.client.sendBinaryMessage(sendArgs); + await nym.current.client.send({ + recipient: args.recipient, + payload: { message: args.payload, mimeType: 'application/octet-stream', headers: JSON.stringify(args.headers) }, + }); }; const value = React.useMemo( diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/src/typings/FC.d.ts b/sdk/typescript/examples/react-webpack-with-theme-example/src/typings/FC.d.ts new file mode 100644 index 0000000000..08ebdfa298 --- /dev/null +++ b/sdk/typescript/examples/react-webpack-with-theme-example/src/typings/FC.d.ts @@ -0,0 +1 @@ +declare type FCWithChildren

= React.FC>; diff --git a/sdk/typescript/packages/nym-client-wasm/scripts/build.sh b/sdk/typescript/packages/nym-client-wasm/scripts/build.sh index 8914b7d7b7..8f33f3ef3b 100755 --- a/sdk/typescript/packages/nym-client-wasm/scripts/build.sh +++ b/sdk/typescript/packages/nym-client-wasm/scripts/build.sh @@ -9,12 +9,12 @@ cd "$(dirname "$0")" cd .. # clear out any files and suppress missing file errors -rm nym_client_wasm* package.json || true +rm -f nym_client_wasm* package.json || true # let wasm-pack build the files and put them in the output location rather than `./pkg` cd ../../../../clients/webassembly -wasm-pack build --scope nymproject --target no-modules --out-dir ../../sdk/typescript/packages/nym-client-wasm +wasm-pack build --scope nymproject --target web --out-dir ../../sdk/typescript/packages/nym-client-wasm # clean up some files that come with the build cd ../../sdk/typescript/packages/nym-client-wasm -rm README.md LICENSE_APACHE \ No newline at end of file +rm README.md LICENSE_APACHE diff --git a/sdk/typescript/packages/sdk/README.md b/sdk/typescript/packages/sdk/README.md index af847d969a..cd85fbc318 100644 --- a/sdk/typescript/packages/sdk/README.md +++ b/sdk/typescript/packages/sdk/README.md @@ -49,6 +49,21 @@ Send a message to another user (you will need to know their address at a Gateway await nym.client.sendMessage({ payload, recipient }); ``` +### Building from source + +You will need to have the Rust WASM toolchain installed. Please [follow the instructions here](https://rustwasm.github.io/docs/book/game-of-life/setup.html) +to install `wasm-pack`. + +Make sure you have either Node 16 LTS or Node 18 LTS installed and are using it to do the build. + +Run these commands to build the SDK: +``` +yarn +yarn build +``` + +The output bundle will be created in the `dist` directory. + ### Packaging If you're a Nym platform developer who's made changes to the Rust (or JS) files and wants to re-publish the package to NPM, here's how you do it: diff --git a/sdk/typescript/packages/sdk/package.json b/sdk/typescript/packages/sdk/package.json index e2e4c5b008..f48bbc187d 100644 --- a/sdk/typescript/packages/sdk/package.json +++ b/sdk/typescript/packages/sdk/package.json @@ -27,10 +27,13 @@ "build:dependencies:ts-packages": "cd ../../../.. && yarn && yarn build", "build:dependencies:nym-client-wasm": "../nym-client-wasm/scripts/build.sh", "prebuild": "yarn build:dependencies", - "build": "tsc", - "postbuild": "cp ../nym-client-wasm/nym_client_wasm* dist/mixnet/wasm && yarn copy:readme", - "build:only-this": "tsc", - "postbuild:only-this": "cp ../nym-client-wasm/nym_client_wasm* dist/mixnet/wasm", + "build": "yarn build:only-this", + "build:only-this": "run-s build:worker build:tsc build:worker:move", + "postbuild:only-this": "yarn copy:readme", + "build:tsc": "tsc", + "build:worker": "rollup src/mixnet/wasm/worker.ts -c rollup.config.mjs", + "postbuild:worker": "rm -rf dist/index.d.ts dist/coconut dist/mixnet && mkdir -p dist/mixnet/wasm", + "build:worker:move": "rm dist/mixnet/wasm/worker.js && mv dist/worker.js dist/mixnet/wasm", "copy:readme": "cp README.md dist" }, "dependencies": { @@ -38,10 +41,13 @@ }, "devDependencies": { "@nymproject/eslint-config-react-typescript": "^1.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-terser": "^0.2.1", + "@rollup/plugin-typescript": "^10.0.1", + "@rollup/plugin-wasm": "^6.1.1", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", - "rimraf": "^3.0.2", - "typescript": "^4.8.4", "eslint": "^8.10.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^16.1.0", @@ -52,6 +58,11 @@ "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.29.2", - "eslint-plugin-react-hooks": "^4.3.0" + "eslint-plugin-react-hooks": "^4.3.0", + "rimraf": "^3.0.2", + "rollup": "^3.9.1", + "rollup-plugin-base64": "^1.0.1", + "rollup-plugin-web-worker-loader": "^1.6.1", + "typescript": "^4.8.4" } } diff --git a/sdk/typescript/packages/sdk/rollup.config.mjs b/sdk/typescript/packages/sdk/rollup.config.mjs new file mode 100644 index 0000000000..6907c8c2d3 --- /dev/null +++ b/sdk/typescript/packages/sdk/rollup.config.mjs @@ -0,0 +1,28 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import { wasm } from '@rollup/plugin-wasm'; +import replace from '@rollup/plugin-replace'; + +const extensions = [ + '.js', '.jsx', '.ts', '.tsx', +]; + +export default { + input: 'src/index.ts', + output: { + dir: 'dist', + format: 'es', + }, + plugins: [ + resolve({ extensions }), + // this is some nasty monkey patching that removes the WASM URL (because it is handled by the `wasm` plugin) + replace({ + values: { 'input = new URL(\'nym_client_wasm_bg.wasm\', import.meta.url);': 'input = undefined;' }, + delimiters: ['', ''], + preventAssignment: true, + }), + // force the wasm plugin to embed the wasm bundle - this means no downstream bundlers have to worry about handling it + wasm({ maxFileSize: 10000000, targetEnv: 'browser' }), + typescript(), + ], +}; diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts index 24d6472d7e..5a3e6b3a92 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts @@ -8,6 +8,7 @@ import { LoadedEvent, StringMessageReceivedEvent, BinaryMessageReceivedEvent, + MimeTypes, } from './types'; /** @@ -22,7 +23,9 @@ export interface NymMixnetClient { * Create a client to send and receive traffic from the Nym mixnet. * */ -export const createNymMixnetClient = async (): Promise => { +export const createNymMixnetClient = async (options?: { + mimeTypes?: string[] | MimeTypes[]; +}): Promise => { // create a web worker that runs the WASM client on another thread and wait until it signals that it is ready // eslint-disable-next-line @typescript-eslint/no-use-before-define const worker = await createWorker(); @@ -89,6 +92,11 @@ export const createNymMixnetClient = async (): Promise => { // let comlink handle interop with the web worker const client = Comlink.wrap(worker); + // set any options + if (options?.mimeTypes) { + await client.setTextMimeTypes(options.mimeTypes); + } + // pass the client interop and subscription manage back to the caller return { client, diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts index 498e1b40de..e3b9673d30 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts @@ -1,10 +1,25 @@ -/// +import { Debug } from '@nymproject/nym-client-wasm'; -export type OnStringMessageFn = (message: string) => void; +/** + * Some common mime types, however, you can always just specify the mime-type as a string + */ +export enum MimeTypes { + ApplicationOctetStream = 'application/octet-stream', + TextPlain = 'text/plain', + ApplicationJson = 'application/json', +} -export type OnBinaryMessageFn = (message: Uint8Array) => void; +export interface Payload { + message: string | Uint8Array; -export type OnConnectFn = (address?: string) => void; + mimeType?: MimeTypes | string; + + headers?: string; +} + +export type OnPayloadFn = (payload: Payload) => void; + +export type OnRawPayloadFn = (payload: Uint8Array) => void; export type EventHandlerFn = (e: E) => void | Promise; @@ -36,14 +51,16 @@ export interface NymClientConfig { /** * Optional. Settings for the WASM client. */ - debug?: wasm_bindgen.Debug; + debug?: Debug; } export interface IWebWorker { start: (config: NymClientConfig) => void; + stop: () => void; selfAddress: () => string | undefined; - sendMessage: (args: { payload: string; recipient: string }) => void; - sendBinaryMessage: (args: { payload: Uint8Array; recipient: string; headers?: string }) => void; + setTextMimeTypes: (mimeTypes: string[]) => void; + getTextMimeTypes: () => string[]; + send: (args: { payload: Payload; recipient: string; replySurbs?: number }) => void; } export enum EventKinds { @@ -70,17 +87,19 @@ export interface ConnectedEvent { export interface StringMessageReceivedEvent { kind: EventKinds.StringMessageReceived; args: { - kind: number; + mimeType: MimeTypes; payload: string; + payloadRaw: Uint8Array; + headers?: string; }; } export interface BinaryMessageReceivedEvent { kind: EventKinds.BinaryMessageReceived; args: { - kind: number; + mimeType: MimeTypes; payload: Uint8Array; - headers: string; + headers?: string; }; } diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts index 87d44bbb4b..063b59894b 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts @@ -1,69 +1,94 @@ -/* eslint-disable no-console,no-restricted-globals */ -/// /** * NB: URL syntax is used so that bundlers like webpack can load this package's code when inside the final bundle * the files from ../../../../nym-client-wasm will be copied into the dist directory of this package, so all import * paths are _relative to the output directory_ of this package (`dist`) - don't get confused! */ import * as Comlink from 'comlink'; + +// +// Rollup will replace wasmBytes with a function that loads the WASM bundle from a base64 string embedded in the output. +// +// Doing it this way, saves having to support a large variety of bundlers and their quirks. +// +// @ts-ignore +import wasmBytes from '@nymproject/nym-client-wasm/nym_client_wasm_bg.wasm'; + +import init, { + NymClient, + NymClientBuilder, + Config, + get_gateway, + default_debug, + decode_payload, + parse_utf8_string, + utf8_string_to_byte_array, + encode_payload_with_headers, +} from '@nymproject/nym-client-wasm'; + import type { + BinaryMessageReceivedEvent, ConnectedEvent, IWebWorker, LoadedEvent, - OnStringMessageFn, - OnBinaryMessageFn, - OnConnectFn, - StringMessageReceivedEvent, - BinaryMessageReceivedEvent, NymClientConfig, + OnRawPayloadFn, + StringMessageReceivedEvent, } from './types'; -import { EventKinds } from './types'; +import { EventKinds, MimeTypes } from './types'; // web workers are only allowed to load external scripts as the load -importScripts(new URL('./nym_client_wasm.js', import.meta.url)); +// importScripts(new URL('./nym_client_wasm.js', import.meta.url)); +// eslint-disable-next-line import/extensions console.log('[Nym WASM client] Starting Nym WASM web worker...'); -// again, construct a URL that can be used by a bundler to repackage the WASM binary -const wasmUrl = new URL('./nym_client_wasm_bg.wasm', import.meta.url); - /** * Helper method to send typed messages. * @param event The strongly typed message to send back to the calling thread. */ const postMessageWithType = (event: E) => self.postMessage(event); -// ------------ the 1st byte of messages is the kind from the list below ------------ -const PAYLOAD_KIND_TEXT = 0; -const PAYLOAD_KIND_BINARY = 1; - /** * This class holds the state of the Nym WASM client and provides any interop needed. */ class ClientWrapper { - client: wasm_bindgen.NymClient | null = null; + client: NymClient | null = null; + + builder: NymClientBuilder | null = null; + + mimeTypes: string[] = [MimeTypes.TextPlain, MimeTypes.ApplicationJson]; /** * Creates the WASM client and initialises it. */ - init = ( - config: wasm_bindgen.Config, - onConnectHandler: OnConnectFn, - onStringMessageHandler?: OnStringMessageFn, - onBinaryMessageHandler?: OnBinaryMessageFn, - ) => { - this.client = new wasm_bindgen.NymClient(config); - if (onBinaryMessageHandler) { - this.client.set_on_binary_message(onBinaryMessageHandler); - } + init = (config: Config, onRawPayloadHandler?: OnRawPayloadFn) => { + const onMessageHandler = (message: Uint8Array) => { + try { + if (onRawPayloadHandler) { + onRawPayloadHandler(message); + } + } catch (e) { + console.error('Unhandled exception in `ClientWrapper.onRawPayloadHandler`: ', e); + } + }; - // NB: because we set the `kind` byte in the message payload first, we don't need to bother to try to parse - // all messages as string - // if (onStringMessageHandler) { - // this.client.set_on_message(onStringMessageHandler); - // } + this.builder = new NymClientBuilder(config, onMessageHandler); }; + /** + * Sets the mime-types that will be parsed for UTF-8 string content. + * + * @param mimeTypes An array of mime-types to treat as having string content. + */ + setTextMimeTypes = (mimeTypes: string[]) => { + this.mimeTypes = mimeTypes; + }; + + /** + * Gest the mime-types that are considered as string and will be automatically converted to byte arrays. + */ + getTextMimeTypes = () => this.mimeTypes; + /** * Returns the address of this client. */ @@ -80,47 +105,51 @@ class ClientWrapper { * Connects to the gateway and starts the client sending traffic. */ start = async () => { - if (!this.client) { - console.error('Client has not been initialised. Please call `init` first.'); + if (!this.builder) { + console.error('Client config has not been initialised. Please call `init` first.'); return; } // this is current limitation of wasm in rust - for async methods you can't take self by reference... // I'm trying to figure out if I can somehow hack my way around it, but for time being you have to re-assign // the object (it's the same one) - this.client = await this.client.start(); + this.client = await this.builder.start_client(); }; - sendMessage = async ({ payload, recipient }: { recipient: string; payload: string }) => { + /** + * Stops the client and cleans up. + */ + stop = () => { if (!this.client) { console.error('Client has not been initialised. Please call `init` first.'); return; } - const message = wasm_bindgen.create_binary_message_from_string(PAYLOAD_KIND_TEXT, payload); - this.client = await this.client.send_binary_message(message, recipient); + this.client.free(); + this.client = null; }; - sendBinaryMessage = async ({ + send = async ({ payload, recipient, - headers, + replySurbs = 0, }: { recipient: string; payload: Uint8Array; - headers?: string; + replySurbs?: number; }) => { if (!this.client) { console.error('Client has not been initialised. Please call `init` first.'); return; } - const message = wasm_bindgen.create_binary_message_with_headers(PAYLOAD_KIND_BINARY, payload, headers || ''); - this.client = await this.client.send_binary_message(message, recipient); + // TODO: currently we don't do anything with the result, it needs some typing and exposed back on the main thread + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const res = await this.client.send_anonymous_message(payload, recipient, replySurbs); }; } // load WASM binary -wasm_bindgen(wasmUrl) - .then((importResult) => { +init(wasmBytes()) + .then((importResult: any) => { // sets up better stack traces in case of in-rust panics importResult.set_panic_hook(); @@ -129,48 +158,34 @@ wasm_bindgen(wasmUrl) const startHandler = async (config: NymClientConfig) => { // fetch the gateway details (randomly chosen if no preferred gateway is set) - const gatewayEndpoint = await wasm_bindgen.get_gateway( - config.nymApiUrl, - config.preferredGatewayIdentityKey, - ); + const gatewayEndpoint = await get_gateway(config.nymApiUrl, config.preferredGatewayIdentityKey); // set a different gatewayListener in order to avoid workaround ws over https error - if (config.gatewayListener) - gatewayEndpoint.gateway_listener = config.gatewayListener; + if (config.gatewayListener) gatewayEndpoint.gateway_listener = config.gatewayListener; // create the client, passing handlers for events wrapper.init( - new wasm_bindgen.Config( - config.clientId, - config.nymApiUrl, - gatewayEndpoint, - config.debug || wasm_bindgen.default_debug(), - ), - () => { - console.log(); - }, - undefined, + new Config(config.clientId, config.nymApiUrl, gatewayEndpoint, config.debug || default_debug()), async (message) => { try { - const { kind, payload, headers } = await wasm_bindgen.parse_binary_message_with_headers(message); - switch (kind) { - case PAYLOAD_KIND_TEXT: { - const stringMessage = await wasm_bindgen.parse_string_message_with_headers(message); - postMessageWithType({ - kind: EventKinds.StringMessageReceived, - args: { kind, payload: stringMessage.payload }, - }); - break; - } - case PAYLOAD_KIND_BINARY: - postMessageWithType({ - kind: EventKinds.BinaryMessageReceived, - args: { kind, payload, headers: headers || '' }, - }); - break; - default: - console.error('Could not determine message kind from 1st byte of message', { message, kind, payload }); + const decodedPayload = decode_payload(message); + const { payload, headers } = decodedPayload; + const mimeType = decodedPayload.mimeType as MimeTypes; + + if (wrapper.getTextMimeTypes().includes(mimeType)) { + const stringMessage = parse_utf8_string(payload); + + postMessageWithType({ + kind: EventKinds.StringMessageReceived, + args: { mimeType, payload: stringMessage, payloadRaw: payload, headers }, + }); + return; } + + postMessageWithType({ + kind: EventKinds.BinaryMessageReceived, + args: { mimeType, payload, headers }, + }); } catch (e) { console.error('Failed to parse binary message', e); } @@ -191,14 +206,43 @@ wasm_bindgen(wasmUrl) console.log('[Nym WASM client] Starting...', { config }); startHandler(config).catch((e) => console.error('[Nym WASM client] Failed to start', e)); }, + stop() { + wrapper.stop(); + }, selfAddress() { return wrapper.selfAddress(); }, - sendMessage(args) { - wrapper.sendMessage(args).catch((e) => console.error('[Nym WASM client] Failed to send message', e)); + setTextMimeTypes(mimeTypes) { + wrapper.setTextMimeTypes(mimeTypes); }, - sendBinaryMessage(args) { - wrapper.sendBinaryMessage(args).catch((e) => console.error('[Nym WASM client] Failed to send message', e)); + getTextMimeTypes() { + return wrapper.getTextMimeTypes(); + }, + send(args) { + const { + recipient, + replySurbs, + payload: { mimeType, headers }, + } = args; + let payloadBytes = new Uint8Array(); + if (mimeType && wrapper.getTextMimeTypes().includes(mimeType) && typeof args.payload.message === 'string') { + payloadBytes = utf8_string_to_byte_array(args.payload.message); + } else if (typeof args.payload.message !== 'string') { + payloadBytes = args.payload.message; + } else { + console.error( + '[Nym WASM client] Payload is a string. It should be a UintArray, or the mime-type should be set with `setTextMimeTypes` for auto-conversion', + ); + return; + } + const payload = encode_payload_with_headers( + mimeType || MimeTypes.ApplicationOctetStream, + payloadBytes, + headers, + ); + wrapper + .send({ payload, recipient, replySurbs }) + .catch((e) => console.error('[Nym WASM client] Failed to send message', e)); }, }; diff --git a/yarn.lock b/yarn.lock index 10c6066412..46dc81dc27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" + integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + "@ampproject/remapping@^2.1.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" @@ -9,6 +14,15 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -23,11 +37,23 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.20.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" + integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== + "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" @@ -71,6 +97,36 @@ json5 "^2.1.2" semver "^6.3.0" +"@babel/core@^7.11.1", "@babel/core@^7.16.0": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/eslint-parser@^7.16.3": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.17.3", "@babel/generator@^7.7.2": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" @@ -80,6 +136,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" @@ -87,6 +152,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" @@ -95,6 +167,14 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" @@ -105,6 +185,17 @@ browserslist "^4.17.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1", "@babel/helper-create-class-features-plugin@^7.17.6": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" @@ -131,6 +222,20 @@ "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-create-regexp-features-plugin@^7.16.7": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" @@ -139,6 +244,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^5.0.1" +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + "@babel/helper-define-polyfill-provider@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" @@ -167,6 +280,18 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-environment-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" @@ -174,6 +299,11 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" @@ -181,6 +311,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" @@ -198,6 +335,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + "@babel/helper-get-function-arity@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" @@ -212,6 +357,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-member-expression-to-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" @@ -226,6 +378,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" @@ -233,6 +392,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" @@ -247,6 +413,20 @@ "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" + "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" @@ -254,6 +434,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" @@ -269,6 +456,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" @@ -278,6 +470,16 @@ "@babel/helper-wrap-function" "^7.16.8" "@babel/types" "^7.16.8" +"@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== + 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-replace-supers@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" @@ -289,6 +491,18 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + "@babel/helper-simple-access@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" @@ -296,6 +510,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" @@ -303,6 +524,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" @@ -310,6 +538,18 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" @@ -320,11 +560,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== +"@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-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/helper-wrap-function@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" @@ -335,6 +585,16 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + "@babel/helpers@^7.12.5", "@babel/helpers@^7.17.2": version "7.17.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" @@ -344,7 +604,16 @@ "@babel/traverse" "^7.17.0" "@babel/types" "^7.17.0" -"@babel/highlight@^7.10.4": +"@babel/helpers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" + integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -367,6 +636,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== +"@babel/parser@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" + integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" 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.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" @@ -374,6 +648,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@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== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" @@ -383,6 +664,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.16.7" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" @@ -392,6 +682,16 @@ "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" @@ -400,6 +700,14 @@ "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-class-static-block@^7.16.7": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" @@ -409,6 +717,15 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-proposal-decorators@^7.12.12": version "7.17.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493" @@ -420,6 +737,17 @@ "@babel/plugin-syntax-decorators" "^7.17.0" charcodes "^0.2.0" +"@babel/plugin-proposal-decorators@^7.16.4": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" + integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.19.0" + "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" @@ -428,6 +756,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-export-default-from@^7.12.1": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz#a40ab158ca55627b71c5513f03d3469026a9e929" @@ -444,6 +780,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" @@ -452,6 +796,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-proposal-logical-assignment-operators@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" @@ -460,6 +812,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" @@ -468,6 +828,22 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" @@ -496,6 +872,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.16.7" +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" @@ -504,6 +891,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" @@ -513,6 +908,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.11": version "7.16.11" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" @@ -521,6 +925,14 @@ "@babel/helper-create-class-features-plugin" "^7.16.10" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object@^7.12.1": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" @@ -541,6 +953,16 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" @@ -549,6 +971,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-proposal-unicode-property-regex@^7.18.6": + 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-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -584,6 +1014,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-decorators@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" + integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -612,6 +1049,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -640,6 +1091,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -703,6 +1161,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" @@ -710,6 +1175,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-async-to-generator@^7.14.5", "@babel/plugin-transform-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" @@ -719,6 +1191,15 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-remap-async-to-generator" "^7.16.8" +"@babel/plugin-transform-async-to-generator@^7.18.6": + 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== + 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/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" @@ -726,6 +1207,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" @@ -733,6 +1221,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" + integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" @@ -747,6 +1242,21 @@ "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + 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.19.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" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" @@ -754,6 +1264,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + "@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.16.7": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz#c445f75819641788a27a0a3a759d9df911df6abc" @@ -761,6 +1279,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" @@ -769,6 +1294,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-dotall-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-duplicate-keys@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" @@ -776,6 +1309,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" @@ -784,6 +1324,22 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@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== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.16.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-flow" "^7.18.6" + "@babel/plugin-transform-flow-strip-types@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" @@ -799,6 +1355,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" @@ -808,6 +1371,15 @@ "@babel/helper-function-name" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" @@ -815,6 +1387,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@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== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" @@ -822,6 +1401,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@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== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-modules-amd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" @@ -831,6 +1417,14 @@ "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.19.6": + 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== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-modules-commonjs@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" @@ -841,6 +1435,15 @@ "@babel/helper-simple-access" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + "@babel/plugin-transform-modules-systemjs@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" @@ -852,6 +1455,16 @@ "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/plugin-transform-modules-umd@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" @@ -860,6 +1473,14 @@ "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" @@ -867,6 +1488,14 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" @@ -874,6 +1503,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" @@ -882,6 +1518,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" @@ -889,6 +1533,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" @@ -896,6 +1547,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" + integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-react-constant-elements@^7.14.5": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz#6cc273c2f612a6a50cb657e63ee1303e5e68d10a" @@ -903,6 +1568,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-react-display-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" @@ -917,6 +1589,13 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.16.7": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" @@ -928,6 +1607,17 @@ "@babel/plugin-syntax-jsx" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" + integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.20.7" + "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" @@ -936,6 +1626,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-regenerator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" @@ -943,6 +1641,14 @@ dependencies: regenerator-transform "^0.14.2" +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + "@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" @@ -950,6 +1656,25 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + "@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" @@ -957,6 +1682,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" @@ -965,6 +1697,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" +"@babel/plugin-transform-spread@^7.19.0": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" @@ -972,6 +1712,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" @@ -979,6 +1726,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-typeof-symbol@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" @@ -986,6 +1740,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-typescript@^7.16.7": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" @@ -995,6 +1756,15 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-typescript" "^7.16.7" +"@babel/plugin-transform-typescript@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" + integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" @@ -1002,6 +1772,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" @@ -1010,6 +1787,95 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@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-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@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.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + "@babel/preset-env@^7.12.11", "@babel/preset-env@^7.15.0", "@babel/preset-env@^7.15.6": version "7.16.11" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" @@ -1122,6 +1988,18 @@ "@babel/plugin-transform-react-jsx-development" "^7.16.7" "@babel/plugin-transform-react-pure-annotations" "^7.16.7" +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.15.0": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" @@ -1131,6 +2009,15 @@ "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-transform-typescript" "^7.16.7" +"@babel/preset-typescript@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/register@^7.12.1": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.17.0.tgz#8051e0b7cb71385be4909324f072599723a1f084" @@ -1208,6 +2095,15 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.2": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" @@ -1224,6 +2120,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" + integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" @@ -1232,6 +2144,15 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -1553,6 +2474,137 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.25.6.tgz#934d9a967180baa66163847616a74358732227ca" integrity sha512-ofOYiuxVKNo238vCPPlaDzqPXy2AQ/5/nashBo5rvPZJkxt9LciGfUEQWPCOb1BIJDNx2Dzu0z4XCf/dwzl0Dg== +"@craco/craco@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-7.0.0.tgz#4e9243e53fba6ed4d2bc08aa65aae9d1b63541ed" + integrity sha512-OyjL9zpURB6Ha1HO62Hlt27Xd7UYJ8DRiBNuE4DBB8Ue0iQ9q/xsv3ze7ROm6gCZqV6I2Gxjnq0EHCCye+4xDQ== + dependencies: + autoprefixer "^10.4.12" + cosmiconfig "^7.0.1" + cosmiconfig-typescript-loader "^1.0.0" + cross-spawn "^7.0.3" + lodash "^4.17.21" + semver "^7.3.7" + webpack-merge "^5.8.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@csstools/normalize.css@*": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" + integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== + "@date-io/core@^2.13.1": version "2.13.1" resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.13.1.tgz#f041765aff5c55fbc7e37fdd75fc1792733426d6" @@ -1856,6 +2908,21 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -1866,6 +2933,15 @@ resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.8.8.tgz#17cf806485435877fdafce9f3bee6ff68f7f87b6" integrity sha512-meAEDur1IJBfKyTo9yPYAuzjIfrxA7m9Ov+1nxaW/YupsqMeseWifoUjWK03+hz/RJizsVQAaUjVxFEkyu0GWg== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -1884,6 +2960,11 @@ debug "^4.1.1" minimatch "^3.0.4" +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + "@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" @@ -1922,6 +3003,18 @@ jest-util "^27.5.1" slash "^3.0.0" +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + "@jest/core@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" @@ -2051,6 +3144,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" @@ -2137,16 +3240,56 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@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": version "3.0.5" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.13": + 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": version "1.4.11" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.0": version "0.3.4" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" @@ -2155,6 +3298,19 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + "@lerna/add@4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-4.0.0.tgz#c36f57d132502a57b9e7058d1548b7a565ef183f" @@ -3083,6 +4239,13 @@ prop-types "^15.8.1" reselect "^4.1.5" +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + "@noble/hashes@^1": version "1.1.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" @@ -3111,7 +4274,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -3195,6 +4358,11 @@ "@cosmjs/stargate" "^0.25.5" axios "^0.21.1" +"@nymproject/sdk@file:sdk/typescript/packages/sdk": + version "1.1.4" + dependencies: + comlink "^4.3.1" + "@octokit/auth-token@^2.4.4": version "2.5.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" @@ -3389,6 +4557,99 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-node-resolve@^15.0.1": + version "15.0.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz#72be449b8e06f6367168d5b3cd5e2802e0248971" + integrity sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.0" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/plugin-replace@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz#45f53501b16311feded2485e98419acb8448c61d" + integrity sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + magic-string "^0.27.0" + +"@rollup/plugin-terser@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.2.1.tgz#dcf0b163216dafb64611b170a7667e76a7f03d2b" + integrity sha512-hV52c8Oo6/cXZZxVVoRNBb4zh+EKSHS4I1sedWV5pf0O+hTLSkrf6w86/V0AZutYtwBguB6HLKwz89WDBfwGOA== + dependencies: + serialize-javascript "^6.0.0" + smob "^0.0.6" + terser "^5.15.1" + +"@rollup/plugin-typescript@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz#270b515b116ea28320e6bb62451c4767d49072d6" + integrity sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A== + dependencies: + "@rollup/pluginutils" "^5.0.1" + resolve "^1.22.1" + +"@rollup/plugin-wasm@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-wasm/-/plugin-wasm-6.1.1.tgz#4433583997703c46ac22ebd7d079cf8f165a909b" + integrity sha512-dccyb8OvtpY21KiYjaNmibWlQJd/kBg+IVP24x9l1dsIRXBmGqLt+wsPjU296FNO8ap0SSEsTpi/7AfrlvQvBQ== + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + 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== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rushstack/eslint-patch@^1.1.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + "@sinclair/typebox@^0.24.1": version "0.24.19" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.19.tgz#5297278e0d8a1aea084685a3216074910ac6c113" @@ -4783,46 +6044,110 @@ regenerator-runtime "^0.13.7" resolve-from "^5.0.0" +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + "@svgr/babel-plugin-add-jsx-attribute@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz#bd6d1ff32a31b82b601e73672a789cc41e84fe18" integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA== +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + "@svgr/babel-plugin-remove-jsx-attribute@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz#58654908beebfa069681a83332544b17e5237e89" integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw== +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + "@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz#d06dd6e8a8f603f92f9979bb9990a1f85a4f57ba" integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA== +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + "@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz#0b85837577b02c31c09c758a12932820f5245cee" integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ== +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + "@svgr/babel-plugin-svg-dynamic-title@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz#28236ec26f7ab9d486a487d36ae52d58ba15676f" integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg== +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + "@svgr/babel-plugin-svg-em-dimensions@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz#40267c5dea1b43c4f83a0eb6169e08b43d8bafce" integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA== +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + "@svgr/babel-plugin-transform-react-native-svg@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz#eb688d0a5f539e34d268d8a516e81f5d7fede7c9" integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ== +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + "@svgr/babel-plugin-transform-svg-component@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz#7ba61d9fc1fb42b0ba1a04e4630019fa7e993c4f" integrity sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg== +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + "@svgr/babel-preset@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.2.0.tgz#1d3ad8c7664253a4be8e4a0f0e6872f30d8af627" @@ -4837,6 +6162,15 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0" "@svgr/babel-plugin-transform-svg-component" "^6.2.0" +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + "@svgr/core@^6.2.1": version "6.2.1" resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.2.1.tgz#195de807a9f27f9e0e0d678e01084b05c54fdf61" @@ -4846,6 +6180,13 @@ camelcase "^6.2.0" cosmiconfig "^7.0.1" +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + "@svgr/hast-util-to-babel-ast@^6.2.1": version "6.2.1" resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz#ae065567b74cbe745afae617053adf9a764bea25" @@ -4854,6 +6195,16 @@ "@babel/types" "^7.15.6" entities "^3.0.1" +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + "@svgr/plugin-jsx@^6.2.1": version "6.2.1" resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz#5668f1d2aa18c2f1bb7a1fc9f682d3f9aed263bd" @@ -4864,6 +6215,15 @@ "@svgr/hast-util-to-babel-ast" "^6.2.1" svg-parser "^2.0.2" +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + "@svgr/plugin-svgo@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz#4cbe6a33ccccdcae4e3b63ded64cc1cbe1faf48c" @@ -4873,6 +6233,20 @@ deepmerge "^4.2.2" svgo "^2.5.0" +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + "@svgr/webpack@^6.1.1": version "6.2.1" resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.2.1.tgz#ef5d51c1b6be4e7537fb9f76b3f2b2e22b63c58d" @@ -5036,6 +6410,20 @@ lz-string "^1.4.4" pretty-format "^27.0.2" +"@testing-library/dom@^8.5.0": + version "8.19.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.1.tgz#0e2dafd281dedb930bb235eac1045470b4129d0e" + integrity sha512-P6iIPyYQ+qH8CvGauAqanhVnjrnRe0IZFSYCeGkSRW9q3u8bdVn2NPI+lasFyVsEQn1J/IFmp5Aax41+dAP9wg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + "@testing-library/jest-dom@^5.14.1": version "5.16.2" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz#f329b36b44aa6149cd6ced9adf567f8b6aa1c959" @@ -5051,6 +6439,21 @@ lodash "^4.17.15" redent "^3.0.0" +"@testing-library/jest-dom@^5.16.5": + 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== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + "@testing-library/react@^12.0.0": version "12.1.3" resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.3.tgz#ef26c5f122661ea9b6f672b23dc6b328cadbbf26" @@ -5060,7 +6463,16 @@ "@testing-library/dom" "^8.0.0" "@types/react-dom" "*" -"@testing-library/user-event@^13.2.1": +"@testing-library/react@^13.4.0": + version "13.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^13.2.1", "@testing-library/user-event@^13.5.0": version "13.5.0" resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== @@ -5077,6 +6489,26 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" @@ -5089,6 +6521,11 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== +"@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== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.18" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" @@ -5250,6 +6687,14 @@ "@types/estree" "*" "@types/json-schema" "*" +"@types/eslint@^7.29.0 || ^8.4.1": + version "8.4.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" + integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== + 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" @@ -5262,6 +6707,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@types/estree@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" @@ -5374,6 +6824,14 @@ jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" +"@types/jest@^27.5.2": + version "27.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" + integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + "@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.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -5411,6 +6869,11 @@ resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.3.tgz#43fd32414f17fcbeced3578109a6edd877a2d96e" integrity sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ== +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -5459,6 +6922,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.39.tgz#07223cd2bc332ad9d92135e3a522eebdee3b060e" integrity sha512-K0MsdV42vPwm9L6UwhIxMAOmcvH/1OoVkZyCgEtVu4Wx7sElGloy/W7kMBNe/oJ7V/jW9BVt1F6RahH6e7tPXw== +"@types/node@^16.18.3": + version "16.18.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.11.tgz#cbb15c12ca7c16c85a72b6bdc4d4b01151bb3cae" + integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA== + "@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" @@ -5499,6 +6967,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@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== + "@types/qrcode.react@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/qrcode.react/-/qrcode.react-1.0.2.tgz#f892432cc41b5dac52e3ca8873b717c8bfea6002" @@ -5523,7 +6996,7 @@ dependencies: "@types/react" "*" -"@types/react-dom@^18.0.10": +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.10", "@types/react-dom@^18.0.8": version "18.0.10" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== @@ -5577,7 +7050,7 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^18.0.26": +"@types/react@^18.0.25", "@types/react@^18.0.26": version "18.0.26" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== @@ -5586,6 +7059,18 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + "@types/retry@^0.12.0": version "0.12.1" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" @@ -5596,6 +7081,11 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + "@types/semver@^7.3.8": version "7.3.9" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" @@ -5616,6 +7106,14 @@ "@types/mime" "^1" "@types/node" "*" +"@types/serve-static@^1.13.10": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + dependencies: + "@types/mime" "*" + "@types/node" "*" + "@types/sockjs@^0.3.33": version "0.3.33" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" @@ -5660,6 +7158,11 @@ dependencies: "@types/geojson" "*" +"@types/trusted-types@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + "@types/uglify-js@*": version "3.13.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" @@ -5710,6 +7213,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + 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" @@ -5751,6 +7261,21 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz#54f8368d080eb384a455f60c2ee044e948a8ce67" + integrity sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ== + dependencies: + "@typescript-eslint/scope-manager" "5.48.0" + "@typescript-eslint/type-utils" "5.48.0" + "@typescript-eslint/utils" "5.48.0" + debug "^4.3.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/eslint-plugin@^5.7.0": version "5.30.6" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz#9c6017b6c1d04894141b4a87816388967f64c359" @@ -5766,6 +7291,13 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.48.0.tgz#10c0871a1dfee734fbcd49399b6a07ce38bdb61c" + integrity sha512-ehoJFf67UViwnYuz6JUneZ8qxgDk0qEWKiTLmpE8WpPEr15e2cSLtp0E6Zicx2DaYdwctUA0uLRTbLckxQpurg== + dependencies: + "@typescript-eslint/utils" "5.48.0" + "@typescript-eslint/experimental-utils@^5.3.0": version "5.14.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.14.0.tgz#73a455cd975d52830360a5b4131b7c4f8f1ff06f" @@ -5783,6 +7315,16 @@ "@typescript-eslint/typescript-estree" "5.13.0" debug "^4.3.2" +"@typescript-eslint/parser@^5.5.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.48.0.tgz#02803355b23884a83e543755349809a50b7ed9ba" + integrity sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg== + dependencies: + "@typescript-eslint/scope-manager" "5.48.0" + "@typescript-eslint/types" "5.48.0" + "@typescript-eslint/typescript-estree" "5.48.0" + debug "^4.3.4" + "@typescript-eslint/parser@^5.7.0": version "5.30.6" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.6.tgz#add440db038fa9d777e4ebdaf66da9e7fb7abe92" @@ -5817,6 +7359,14 @@ "@typescript-eslint/types" "5.30.6" "@typescript-eslint/visitor-keys" "5.30.6" +"@typescript-eslint/scope-manager@5.48.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz#607731cb0957fbc52fd754fd79507d1b6659cecf" + integrity sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow== + dependencies: + "@typescript-eslint/types" "5.48.0" + "@typescript-eslint/visitor-keys" "5.48.0" + "@typescript-eslint/type-utils@5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.13.0.tgz#b0efd45c85b7bab1125c97b752cab3a86c7b615d" @@ -5835,6 +7385,16 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@5.48.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz#40496dccfdc2daa14a565f8be80ad1ae3882d6d6" + integrity sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g== + dependencies: + "@typescript-eslint/typescript-estree" "5.48.0" + "@typescript-eslint/utils" "5.48.0" + debug "^4.3.4" + tsutils "^3.21.0" + "@typescript-eslint/types@5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.13.0.tgz#da1de4ae905b1b9ff682cab0bed6b2e3be9c04e5" @@ -5850,6 +7410,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.6.tgz#86369d0a7af8c67024115ac1da3e8fb2d38907e1" integrity sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg== +"@typescript-eslint/types@5.48.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.0.tgz#d725da8dfcff320aab2ac6f65c97b0df30058449" + integrity sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw== + "@typescript-eslint/typescript-estree@5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.13.0.tgz#b37c07b748ff030a3e93d87c842714e020b78141" @@ -5889,6 +7454,19 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.48.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz#a7f04bccb001003405bb5452d43953a382c2fac2" + integrity sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw== + dependencies: + "@typescript-eslint/types" "5.48.0" + "@typescript-eslint/visitor-keys" "5.48.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.13.0", "@typescript-eslint/utils@^5.10.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.13.0.tgz#2328feca700eb02837298339a2e49c46b41bd0af" @@ -5925,6 +7503,20 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" +"@typescript-eslint/utils@5.48.0", "@typescript-eslint/utils@^5.13.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.0.tgz#eee926af2733f7156ad8d15e51791e42ce300273" + integrity sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.48.0" + "@typescript-eslint/types" "5.48.0" + "@typescript-eslint/typescript-estree" "5.48.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + "@typescript-eslint/visitor-keys@5.13.0": version "5.13.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.13.0.tgz#f45ff55bcce16403b221ac9240fbeeae4764f0fd" @@ -5949,6 +7541,14 @@ "@typescript-eslint/types" "5.30.6" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.48.0": + version "5.48.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz#4446d5e7f6cadde7140390c0e284c8702d944904" + integrity sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q== + dependencies: + "@typescript-eslint/types" "5.48.0" + eslint-visitor-keys "^3.3.0" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" @@ -6286,27 +7886,41 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1, acorn-walk@^7.2.0: +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0, acorn-walk@^7.1.1, acorn-walk@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1: +acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.0, acorn@^8.7.1: +acorn@^8.0.0, acorn@^8.7.1, acorn@^8.8.0: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== @@ -6326,6 +7940,19 @@ address@^1.0.1: resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== +address@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -6427,6 +8054,16 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@^8.6.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-align@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -6449,7 +8086,7 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -6549,6 +8186,16 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -6604,7 +8251,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-flatten@^2.1.0: +array-flatten@^2.1.0, array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== @@ -6625,6 +8272,17 @@ array-includes@^3.0.3, array-includes@^3.1.3, array-includes@^3.1.4: get-intrinsic "^1.1.1" is-string "^1.0.7" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -6665,6 +8323,16 @@ array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + array.prototype.map@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.4.tgz#0d97b640cfdd036c1b41cfe706a5e699aa0711f2" @@ -6676,6 +8344,28 @@ array.prototype.map@^1.0.4: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + 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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -6686,7 +8376,7 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0: +asap@^2.0.0, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -6760,6 +8450,11 @@ async@^2.6.2: dependencies: lodash "^4.17.14" +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -6785,6 +8480,18 @@ author-regex@^1.0.0: resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA= +autoprefixer@^10.4.12, autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + autoprefixer@^9.8.6: version "9.8.8" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" @@ -6798,6 +8505,11 @@ autoprefixer@^9.8.6: postcss "^7.0.32" postcss-value-parser "^4.1.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -6832,7 +8544,7 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^27.5.1: +babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== @@ -6939,7 +8651,7 @@ babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.6.1: cosmiconfig "^6.0.0" resolve "^1.12.0" -babel-plugin-macros@^3.0.1: +babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== @@ -6948,6 +8660,11 @@ babel-plugin-macros@^3.0.1: cosmiconfig "^7.0.0" resolve "^1.19.0" +babel-plugin-named-asset-import@^0.3.8: + version "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-named-exports-order@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz#ae14909521cf9606094a2048239d69847540cb09" @@ -6962,6 +8679,15 @@ babel-plugin-polyfill-corejs2@^0.3.0: "@babel/helper-define-polyfill-provider" "^0.3.1" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" @@ -6978,6 +8704,14 @@ babel-plugin-polyfill-corejs3@^0.5.0: "@babel/helper-define-polyfill-provider" "^0.3.1" core-js-compat "^3.21.0" +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" @@ -6985,6 +8719,13 @@ babel-plugin-polyfill-regenerator@^0.3.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + babel-plugin-react-docgen@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz#7cc8e2f94e8dc057a06e953162f0810e4e72257b" @@ -7013,6 +8754,11 @@ babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -7039,6 +8785,28 @@ babel-preset-jest@^27.5.1: babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" + integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-decorators" "^7.16.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-transform-flow-strip-types" "^7.16.0" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.4" + "@babel/preset-env" "^7.16.4" + "@babel/preset-react" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.3" + babel-plugin-macros "^3.1.0" + babel-plugin-transform-react-remove-prop-types "^0.4.24" + bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -7108,6 +8876,16 @@ better-opn@^2.1.1: dependencies: open "^7.0.3" +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== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + big-integer@^1.6.7: version "1.6.51" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" @@ -7195,6 +8973,34 @@ body-parser@1.19.2: raw-body "2.4.3" type-is "~1.6.18" +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + 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.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.14" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7" + integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" @@ -7207,7 +9013,7 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@^1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -7264,7 +9070,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -7374,6 +9180,16 @@ browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^ node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -7427,6 +9243,11 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +builtin-modules@^3.1.0, builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -7561,7 +9382,7 @@ camel-case@^4.1.1, camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1: +camelcase-css@2.0.1, camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== @@ -7593,7 +9414,7 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -7613,6 +9434,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001312, can resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001390.tgz" integrity sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g== +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: + version "1.0.30001442" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz#40337f1cf3be7c637b061e2f78582dc1daec0614" + integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -7620,7 +9446,7 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -case-sensitive-paths-webpack-plugin@^2.3.0: +case-sensitive-paths-webpack-plugin@^2.3.0, case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== @@ -7657,7 +9483,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -7670,6 +9496,11 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" @@ -7715,6 +9546,11 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +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== + chokidar@3.5.3, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -7933,6 +9769,15 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -7975,7 +9820,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -8094,6 +9939,11 @@ common-path-prefix@^3.0.0: resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -8165,7 +10015,7 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" -confusing-browser-globals@^1.0.10: +confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== @@ -8175,6 +10025,11 @@ connect-history-api-fallback@^1.6.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -8301,6 +10156,11 @@ cookie@0.4.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -8326,6 +10186,13 @@ core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.8.1: browserslist "^4.19.1" semver "7.0.0" +core-js-compat@^3.25.1: + version "3.27.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.1.tgz#b5695eb25c602d72b1d30cbfba3cb7e5e4cf0a67" + integrity sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA== + dependencies: + browserslist "^4.21.4" + core-js-pure@^3.20.2, core-js-pure@^3.8.1: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" @@ -8336,6 +10203,11 @@ core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== +core-js@^3.19.2: + version "3.27.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.1.tgz#23cc909b315a6bb4e418bf40a52758af2103ba46" + integrity sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -8346,6 +10218,14 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig-typescript-loader@^1.0.0: + version "1.0.9" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" + integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== + dependencies: + cosmiconfig "^7" + ts-node "^10.7.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -8357,6 +10237,17 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" +cosmiconfig@^7: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" @@ -8432,6 +10323,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -8469,6 +10365,18 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + css-declaration-sorter@^6.0.3: version "6.1.4" resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz#b9bfb4ed9a41f8dcca9bf7184d849ea94a8294b4" @@ -8476,6 +10384,13 @@ css-declaration-sorter@^6.0.3: dependencies: timsort "^0.3.0" +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + css-loader@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" @@ -8511,7 +10426,7 @@ css-loader@^5.0.1: schema-utils "^3.0.0" semver "^7.3.5" -css-loader@^6.7.3: +css-loader@^6.5.1, css-loader@^6.7.3: version "6.7.3" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== @@ -8525,7 +10440,7 @@ css-loader@^6.7.3: postcss-value-parser "^4.2.0" semver "^7.3.8" -css-minimizer-webpack-plugin@^3.0.2: +css-minimizer-webpack-plugin@^3.0.2, css-minimizer-webpack-plugin@^3.2.0: version "3.4.1" resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== @@ -8537,6 +10452,26 @@ css-minimizer-webpack-plugin@^3.0.2: serialize-javascript "^6.0.0" source-map "^0.6.1" +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + css-select@^4.1.3: version "4.2.1" resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" @@ -8548,6 +10483,14 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -8569,6 +10512,11 @@ css-vendor@^2.0.8: "@babel/runtime" "^7.8.3" is-in-browser "^1.0.2" +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + css-what@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" @@ -8588,6 +10536,11 @@ css@^3.0.0: source-map "^0.6.1" source-map-resolve "^0.6.0" +cssdb@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.2.0.tgz#f44bd4abc430f0ff7f4c64b8a1fb857a753f77a8" + integrity sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -8642,7 +10595,7 @@ cssnano@^5.0.6: lilconfig "^2.0.3" yaml "^1.10.2" -csso@^4.2.0: +csso@^4.0.2, csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== @@ -9018,6 +10971,14 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -9040,6 +11001,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -9077,6 +11043,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -9100,6 +11071,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -9149,6 +11125,14 @@ detect-package-manager@^2.0.1: dependencies: execa "^5.1.1" +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + detect-port@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" @@ -9157,6 +11141,15 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -9170,6 +11163,11 @@ diacritics@1.3.0: resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1" integrity sha1-PvqHMj67hj5mls67AILUj/PW96E= +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + diff-sequences@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" @@ -9190,6 +11188,11 @@ diff@^3.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diff@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" @@ -9218,6 +11221,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -9231,6 +11239,13 @@ dns-packet@^1.3.1: ip "^1.1.0" safe-buffer "^5.0.1" +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" @@ -9279,6 +11294,14 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + dom-serializer@^1.0.1: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" @@ -9298,6 +11321,11 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" @@ -9317,6 +11345,14 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: dependencies: domelementtype "^2.2.0" +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -9367,12 +11403,17 @@ dotenv-webpack@^7.0.3: dependencies: dotenv-defaults "^2.0.2" +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + dotenv@^8.0.0, dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -duplexer@^0.1.1: +duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -9400,6 +11441,18 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + electron-to-chromium@^1.4.71: version "1.4.75" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz#d1ad9bb46f2f1bf432118c2be21d27ffeae82fdd" @@ -9423,6 +11476,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -9566,6 +11624,44 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" +es-abstract@^1.17.2, es-abstract@^1.20.4: + version "1.21.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.0.tgz#dd1b69ea5bfc3c27199c9753efd4de015102c252" + integrity sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g== + dependencies: + call-bind "^1.0.2" + es-set-tostringtag "^2.0.0" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.4" + is-array-buffer "^3.0.0" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + es-abstract@^1.19.0, es-abstract@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" @@ -9616,6 +11712,22 @@ es-module-lexer@^0.9.0: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-set-tostringtag@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -9703,6 +11815,26 @@ eslint-config-prettier@^8.3.0, eslint-config-prettier@^8.5.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + eslint-import-resolver-node@^0.3.2, eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" @@ -9727,6 +11859,40 @@ eslint-module-utils@^2.7.2: debug "^3.2.7" find-up "^2.1.0" +eslint-module-utils@^2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.25.3: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + eslint-plugin-import@^2.25.4: version "2.25.4" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" @@ -9746,6 +11912,13 @@ eslint-plugin-import@^2.25.4: resolve "^1.20.0" tsconfig-paths "^3.12.0" +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + eslint-plugin-jest@^26.1.1: version "26.1.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.1.1.tgz#7176dd745ef8bca3070263f62cdf112f2dfc9aa1" @@ -9791,6 +11964,27 @@ eslint-plugin-react-hooks@^4.3.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== +eslint-plugin-react@^7.27.1: + version "7.31.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" + integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + eslint-plugin-react@^7.29.2: version "7.29.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.2.tgz#2d4da69d30d0a736efd30890dc6826f3e91f3f7c" @@ -9820,6 +12014,13 @@ eslint-plugin-storybook@^0.5.12: "@typescript-eslint/experimental-utils" "^5.3.0" requireindex "^1.1.0" +eslint-plugin-testing-library@^5.0.1: + version "5.9.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.9.1.tgz#12e4bd34c48683ee98af4df2e3318ec9f51dcf8a" + integrity sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ== + dependencies: + "@typescript-eslint/utils" "^5.13.0" + eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -9863,7 +12064,7 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "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== @@ -9873,6 +12074,17 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-webpack-plugin@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== + dependencies: + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" + micromatch "^4.0.5" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + eslint@^7.18.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -9960,6 +12172,51 @@ eslint@^8.10.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^8.3.0: + version "8.31.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.31.0.tgz#75028e77cbcff102a9feae1d718135931532d524" + integrity sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA== + dependencies: + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + 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.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" @@ -9978,6 +12235,15 @@ espree@^9.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^3.3.0" +espree@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -10054,6 +12320,16 @@ estree-util-visit@^1.0.0: "@types/estree-jsx" "^1.0.0" "@types/unist" "^2.0.0" +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + estree-walker@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.1.tgz#c2a9fb4a30232f5039b7c030b37ead691932debd" @@ -10200,6 +12476,43 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +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== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + 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.11.0" + 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" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -10280,6 +12593,17 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.2.12: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" @@ -10296,7 +12620,7 @@ fast-json-parse@^1.0.3: resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -10433,6 +12757,18 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -10455,6 +12791,19 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + 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" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -10572,6 +12921,13 @@ follow-redirects@^1.14.8: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -10622,6 +12978,25 @@ fork-ts-checker-webpack-plugin@^6.0.4: semver "^7.3.2" tapable "^1.0.0" +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + fork-ts-checker-webpack-plugin@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.1.tgz#c37a538e12730fe11fd725bcf0fce29487950833" @@ -10667,6 +13042,11 @@ 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== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -10774,7 +13154,7 @@ 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.0: +function.prototype.name@^1.1.0, 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== @@ -10851,6 +13231,20 @@ get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -10982,7 +13376,7 @@ glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -11029,6 +13423,22 @@ glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -11042,6 +13452,13 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.19.0: + version "13.19.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + dependencies: + type-fest "^0.20.2" + globals@^13.6.0, globals@^13.9.0: version "13.12.1" resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb" @@ -11056,6 +13473,13 @@ globalthis@^1.0.0, globalthis@^1.0.1: dependencies: define-properties "^1.1.3" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.0.1, globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -11093,11 +13517,30 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -11133,11 +13576,21 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -11155,6 +13608,18 @@ has-glob@^1.0.0: dependencies: is-glob "^3.0.0" +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -11378,6 +13843,11 @@ hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react- dependencies: react-is "^16.7.0" +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -11453,7 +13923,7 @@ html-void-elements@^1.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== -html-webpack-plugin@>=5.0.0, html-webpack-plugin@^5.0.0, html-webpack-plugin@^5.3.2: +html-webpack-plugin@>=5.0.0, html-webpack-plugin@^5.0.0, html-webpack-plugin@^5.3.2, html-webpack-plugin@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== @@ -11510,6 +13980,17 @@ http-errors@1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + 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" + http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -11545,6 +14026,17 @@ http-proxy-middleware@^2.0.0: is-plain-obj "^3.0.0" micromatch "^4.0.2" +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -11607,7 +14099,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: +iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -11626,6 +14118,18 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== + dependencies: + harmony-reflect "^1.4.6" + ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -11658,6 +14162,11 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== +immer@^9.0.7: + version "9.0.17" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.17.tgz#7cfe8fbb8b461096444e9da7a5ec4a67c6c4adf4" + integrity sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg== + import-fresh@^3.0.0, 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" @@ -11719,7 +14228,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -11770,6 +14279,15 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + side-channel "^1.0.4" + "internmap@1 - 2": version "2.0.3" resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" @@ -11858,6 +14376,15 @@ is-arguments@^1.0.4, is-arguments@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -11907,6 +14434,18 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-builtin-module@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" + integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw== + dependencies: + builtin-modules "^3.3.0" + +is-callable@^1.1.3, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -11926,6 +14465,13 @@ is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0, is-core-mod dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -12071,7 +14617,12 @@ is-map@^2.0.2: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-negative-zero@^2.0.1: +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -12095,6 +14646,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -12124,7 +14680,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -12181,6 +14737,16 @@ is-regex@^1.0.4, is-regex@^1.1.2, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" @@ -12191,6 +14757,13 @@ is-shared-array-buffer@^1.0.1: resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== +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" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + is-ssh@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" @@ -12229,6 +14802,17 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.10, 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== + 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-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -12244,7 +14828,7 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== -is-weakref@^1.0.1: +is-weakref@^1.0.1, is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -12393,6 +14977,16 @@ iterate-value@^1.0.2: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + javascript-stringify@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" @@ -12698,6 +15292,11 @@ jest-regex-util@^27.5.1: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + jest-resolve-dependencies@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" @@ -12707,7 +15306,7 @@ jest-resolve-dependencies@^27.5.1: jest-regex-util "^27.5.1" jest-snapshot "^27.5.1" -jest-resolve@^27.5.1: +jest-resolve@^27.4.2, jest-resolve@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== @@ -12870,6 +15469,19 @@ jest-validate@^27.5.1: leven "^3.1.0" pretty-format "^27.5.1" +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" + jest-watcher@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" @@ -12883,7 +15495,21 @@ jest-watcher@^27.5.1: jest-util "^27.5.1" string-length "^4.0.1" -jest-worker@^26.5.0, jest-worker@^26.6.2: +jest-watcher@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^26.2.1, jest-worker@^26.5.0, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -12901,7 +15527,16 @@ jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.1.0: +jest-worker@^28.0.2: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.1.0, jest@^27.4.3: version "27.5.1" resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== @@ -12910,6 +15545,11 @@ jest@^27.1.0: import-local "^3.0.2" jest-cli "^27.5.1" +js-sdsl@^4.1.4: + version "4.2.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" + integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== + js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -13008,7 +15648,7 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: +json-schema@0.4.0, json-schema@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== @@ -13035,6 +15675,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.2.0, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonc-parser@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d" @@ -13061,6 +15706,11 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + jsprim@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" @@ -13195,7 +15845,7 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@^2.0.4: +klona@^2.0.4, klona@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== @@ -13313,6 +15963,11 @@ lilconfig@^2.0.3: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== +lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -13377,6 +16032,11 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + localforage@^1.7.3: version "1.10.0" resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" @@ -13454,6 +16114,11 @@ lodash.padend@^4.6.1: resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -13571,6 +16236,20 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + 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" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -13844,6 +16523,11 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -14267,6 +16951,14 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" +micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -14344,6 +17036,13 @@ mini-css-extract-plugin@^2.2.2: dependencies: schema-utils "^4.0.0" +mini-css-extract-plugin@^2.4.5: + version "2.7.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz#e049d3ea7d3e4e773aad585c6cb329ce0c7b72d7" + integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== + dependencies: + schema-utils "^4.0.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -14361,7 +17060,7 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -14516,6 +17215,13 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mocha@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" @@ -14599,6 +17305,14 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -14662,6 +17376,11 @@ napi-build-utils@^1.0.1: resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -14726,6 +17445,11 @@ node-fetch@^2.6.1, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + node-forge@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.0.tgz#37a874ea723855f37db091e6c186e5b67a01d4b2" @@ -14803,6 +17527,11 @@ node-releases@^2.0.2: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== +node-releases@^2.0.6: + version "2.0.8" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== + nopt@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -15005,6 +17734,13 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + nth-check@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" @@ -15046,12 +17782,17 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.11.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-inspect@^1.9.0: +object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== @@ -15086,6 +17827,16 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.entries@^1.1.0, object.entries@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" @@ -15095,6 +17846,15 @@ object.entries@^1.1.0, object.entries@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + "object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" @@ -15104,6 +17864,15 @@ object.entries@^1.1.0, object.entries@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" @@ -15113,6 +17882,16 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2 define-properties "^1.1.3" es-abstract "^1.19.1" +object.getownpropertydescriptors@^2.1.0: + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + object.hasown@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" @@ -15121,6 +17900,14 @@ object.hasown@^1.1.0: define-properties "^1.1.3" es-abstract "^1.19.1" +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== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -15137,6 +17924,15 @@ object.values@^1.1.0, object.values@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + objectorarray@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.5.tgz#2c05248bbefabd8f43ad13b41085951aac5e68a5" @@ -15147,6 +17943,13 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -15686,7 +18489,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -15754,6 +18557,13 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -15789,6 +18599,18 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + postcss-calc@^8.2.3: version "8.2.4" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" @@ -15797,6 +18619,34 @@ postcss-calc@^8.2.3: postcss-selector-parser "^6.0.9" postcss-value-parser "^4.2.0" +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + postcss-colormin@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" @@ -15814,6 +18664,34 @@ postcss-convert-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + postcss-discard-comments@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.0.tgz#87be4e0953bf599935837b940c701f8d4eca7d0b" @@ -15834,6 +18712,21 @@ postcss-discard-overridden@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + postcss-flexbugs-fixes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" @@ -15841,6 +18734,79 @@ postcss-flexbugs-fixes@^4.2.1: dependencies: postcss "^7.0.26" +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + postcss-loader@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" @@ -15852,6 +18818,25 @@ postcss-loader@^4.2.0: schema-utils "^3.0.0" semver "^7.3.4" +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + postcss-merge-longhand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.0.tgz#f716bffbf0bdfbde6ea78c36088e21559f8a0a95" @@ -15963,6 +18948,21 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + postcss-normalize-charset@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" @@ -16026,6 +19026,20 @@ postcss-normalize-whitespace@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== + dependencies: + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + postcss-ordered-values@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz#04ef429e0991b0292bc918b135cd4c038f7b889f" @@ -16034,6 +19048,87 @@ postcss-ordered-values@^5.1.0: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.0.1: + version "7.8.3" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + postcss-reduce-initial@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" @@ -16049,6 +19144,18 @@ postcss-reduce-transforms@^5.1.0: dependencies: postcss-value-parser "^4.2.0" +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: version "6.0.9" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" @@ -16057,6 +19164,14 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-selector-parser@^6.0.10: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-svgo@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" @@ -16077,12 +19192,12 @@ postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -16099,6 +19214,15 @@ postcss@^8.2.15, postcss@^8.3.5: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.18, postcss@^8.4.4: + version "8.4.20" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" + integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^8.4.19: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" @@ -16177,6 +19301,11 @@ prettier@^2.5.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== +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" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + pretty-bytes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.0.0.tgz#928be2ad1f51a2e336add8ba764739f9776a8140" @@ -16281,7 +19410,14 @@ promise.prototype.finally@^3.1.0: define-properties "^1.1.3" es-abstract "^1.19.1" -prompts@^2.0.1, prompts@^2.4.0: +promise@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -16464,7 +19600,7 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -q@^1.5.1: +q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -16483,6 +19619,13 @@ qrcode.react@^1.0.1: prop-types "^15.6.0" qr.js "0.0.0" +qs@6.11.0, qs@^6.9.4: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@6.9.7: version "6.9.7" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" @@ -16495,13 +19638,6 @@ qs@^6.10.0: dependencies: side-channel "^1.0.4" -qs@^6.9.4: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -16542,6 +19678,18 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + rambda@^7.1.0: version "7.1.4" resolved "https://registry.yarnpkg.com/rambda/-/rambda-7.1.4.tgz#7faa9665a54c5d81773975532a942b3113bb4a56" @@ -16587,6 +19735,16 @@ raw-body@2.4.3: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + 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" + raw-loader@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" @@ -16605,6 +19763,48 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== + dependencies: + core-js "^3.19.2" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + react-docgen-typescript@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c" @@ -16668,6 +19868,11 @@ react-error-boundary@^3.1.3, react-error-boundary@^3.1.4: dependencies: "@babel/runtime" "^7.12.5" +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + react-google-charts@^3.0.15: version "3.0.15" resolved "https://registry.yarnpkg.com/react-google-charts/-/react-google-charts-3.0.15.tgz#30759a470f48336e744fd383d054122b039a1ff2" @@ -16835,6 +20040,61 @@ react-router@6.3.0: dependencies: history "^5.2.0" +react-scripts@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" + bfj "^7.0.2" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" + optionalDependencies: + fsevents "^2.3.2" + react-simple-maps@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/react-simple-maps/-/react-simple-maps-2.3.0.tgz#7fdb55120335a9b1ef5bf62e0dcb669511705f3e" @@ -16899,6 +20159,13 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + read-cmd-shim@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" @@ -17095,6 +20362,13 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -17135,6 +20409,13 @@ regenerate-unicode-properties@^10.0.1: dependencies: regenerate "^1.4.2" +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== + dependencies: + regenerate "^1.4.2" + regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -17150,6 +20431,11 @@ regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4, regenerator-runtime@^0 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +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.14.2: version "0.14.5" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" @@ -17157,6 +20443,13 @@ regenerator-transform@^0.14.2: dependencies: "@babel/runtime" "^7.8.4" +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== + dependencies: + "@babel/runtime" "^7.8.4" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -17165,6 +20458,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regex-parser@^2.2.11: + version "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.2.0, regexp.prototype.flags@^1.3.1: version "1.4.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" @@ -17173,6 +20471,15 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -17190,11 +20497,28 @@ regexpu-core@^5.0.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + regjsgen@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + regjsparser@^0.8.2: version "0.8.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" @@ -17202,6 +20526,13 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -17424,6 +20755,17 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -17434,6 +20776,15 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve@^1.1.7, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.9.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" @@ -17511,6 +20862,42 @@ ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: hash-base "^3.0.0" inherits "^2.0.1" +rollup-plugin-base64@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-base64/-/rollup-plugin-base64-1.0.1.tgz#b3529b94d23baeb66e1e3bffd04477fa792985eb" + integrity sha512-IbdX8fjuXO/Op3hYmRPjVo0VwcSenwsQDaDTFdoe+70B5ZGoLMtr96L2yhHXCfxv7HwZVvxZqLsuWj6VwzRt3g== + dependencies: + "@rollup/pluginutils" "^3.1.0" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup-plugin-web-worker-loader@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-web-worker-loader/-/rollup-plugin-web-worker-loader-1.6.1.tgz#9d7a27575b64b0780fe4e8b3bc87470d217e485f" + integrity sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A== + +rollup@^2.43.1: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +rollup@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.9.1.tgz#27501d3d026418765fe379d5620d25954ff2a011" + integrity sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w== + optionalDependencies: + fsevents "~2.3.2" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -17564,6 +20951,15 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -17591,7 +20987,20 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@>=0.6.0: +sanitize.css@*: + version "13.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sax@>=0.6.0, 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== @@ -17668,6 +21077,13 @@ selfsigned@^2.0.0: dependencies: node-forge "^1.2.0" +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -17723,6 +21139,25 @@ send@0.17.2: range-parser "~1.2.1" statuses "~1.5.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + 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" + serialize-javascript@6.0.0, serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -17778,6 +21213,16 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -17880,6 +21325,11 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== +shell-quote@^1.7.3: + version "1.7.4" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + shiki@^0.10.1: version "0.10.1" resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" @@ -17944,6 +21394,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -17963,6 +21418,11 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +smob@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/smob/-/smob-0.0.6.tgz#09b268fea916158a2781c152044c6155adbb8aa1" + integrity sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -17993,7 +21453,7 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs@^0.3.21: +sockjs@^0.3.21, sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== @@ -18042,16 +21502,25 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -source-list-map@^2.0.0: +source-list-map@^2.0.0, source-list-map@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2: +source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-loader@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -18084,16 +21553,16 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@^0.7.0: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" @@ -18104,6 +21573,18 @@ source-map@^0.7.3, source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" @@ -18253,6 +21734,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -18308,6 +21794,19 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + string-to-color@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/string-to-color/-/string-to-color-2.2.2.tgz#46210bf7777dc9198dcdf997bd18ae6749cc9a73" @@ -18352,6 +21851,20 @@ string-width@^1.0.1: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + string.prototype.padend@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" @@ -18378,6 +21891,15 @@ string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" @@ -18386,6 +21908,15 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -18408,6 +21939,15 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -18422,7 +21962,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.0: +strip-ansi@^7.0.0, strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== @@ -18446,6 +21986,11 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -18569,6 +22114,25 @@ svg-parser@^2.0.2: resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + svgo@^2.5.0, svgo@^2.7.0: version "2.8.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" @@ -18618,6 +22182,35 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" +tailwindcss@^3.0.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" + integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.18" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -18707,6 +22300,11 @@ temp-dir@^1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + temp-write@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" @@ -18718,6 +22316,16 @@ temp-write@^4.0.0: temp-dir "^1.0.0" uuid "^3.3.2" +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -18767,6 +22375,17 @@ terser-webpack-plugin@^5.0.3, terser-webpack-plugin@^5.1.3: source-map "^0.6.1" terser "^5.7.2" +terser-webpack-plugin@^5.2.5: + version "5.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + terser@^4.1.2, terser@^4.6.3: version "4.8.1" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" @@ -18776,6 +22395,16 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" +terser@^5.0.0, terser@^5.14.1, terser@^5.15.1: + version "5.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: version "5.12.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.0.tgz#728c6bff05f7d1dcb687d8eace0644802a9dae8a" @@ -18956,6 +22585,13 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -19003,6 +22639,11 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + ts-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" @@ -19055,6 +22696,25 @@ ts-node@7.0.1: source-map-support "^0.5.6" yn "^2.0.0" +ts-node@^10.7.0: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + 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" + ts-pnp@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" @@ -19079,7 +22739,7 @@ tsconfig-paths@^3.12.0: minimist "^1.2.0" strip-bom "^3.0.0" -tsconfig-paths@^3.5.0: +tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== @@ -19167,6 +22827,11 @@ type-detect@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== +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -19205,6 +22870,15 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +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" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -19263,6 +22937,16 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + 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" + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -19294,6 +22978,11 @@ unicode-match-property-value-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + unicode-property-aliases-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" @@ -19348,6 +23037,13 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + unist-builder@2.0.3, unist-builder@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" @@ -19489,6 +23185,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -19504,7 +23205,7 @@ untildify@^2.0.0: dependencies: os-homedir "^1.0.0" -upath@^1.1.1: +upath@^1.1.1, upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== @@ -19514,6 +23215,14 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -19575,6 +23284,16 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + 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" @@ -19629,6 +23348,11 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -19827,11 +23551,21 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-vitals@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" + integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -19930,6 +23664,41 @@ webpack-dev-server@^4.5.0: webpack-dev-middleware "^5.3.1" ws "^8.4.2" +webpack-dev-server@^4.6.0: + version "4.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + webpack-favicons@^1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/webpack-favicons/-/webpack-favicons-1.3.8.tgz#cc986bf8f4cd7629af44a726ca142e14c66e7be5" @@ -19960,6 +23729,14 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== + dependencies: + tapable "^2.0.0" + webpack-sources "^2.2.0" + webpack-merge@^5.7.3, webpack-merge@^5.8.0: version "5.8.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" @@ -19976,6 +23753,14 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: source-list-map "^2.0.0" source-map "~0.6.1" +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" @@ -20052,7 +23837,7 @@ webpack@4: watchpack "^2.3.1" webpack-sources "^3.2.3" -webpack@^5.75.0: +webpack@^5.64.4, webpack@^5.75.0: version "5.75.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== @@ -20133,6 +23918,11 @@ whatwg-encoding@^1.0.5: dependencies: 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== + whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" @@ -20146,6 +23936,15 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-url@^8.0.0, whatwg-url@^8.4.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" @@ -20166,6 +23965,18 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +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== + 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" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -20209,6 +24020,175 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +workbox-background-sync@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" + integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== + dependencies: + idb "^7.0.1" + workbox-core "6.5.4" + +workbox-broadcast-update@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" + integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== + dependencies: + workbox-core "6.5.4" + +workbox-build@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" + integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.5.4" + workbox-broadcast-update "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-google-analytics "6.5.4" + workbox-navigation-preload "6.5.4" + workbox-precaching "6.5.4" + workbox-range-requests "6.5.4" + workbox-recipes "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + workbox-streams "6.5.4" + workbox-sw "6.5.4" + workbox-window "6.5.4" + +workbox-cacheable-response@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" + integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== + dependencies: + workbox-core "6.5.4" + +workbox-core@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" + integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== + +workbox-expiration@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" + integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== + dependencies: + idb "^7.0.1" + workbox-core "6.5.4" + +workbox-google-analytics@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" + integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== + dependencies: + workbox-background-sync "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-navigation-preload@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" + integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== + dependencies: + workbox-core "6.5.4" + +workbox-precaching@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" + integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== + dependencies: + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-range-requests@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" + integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== + dependencies: + workbox-core "6.5.4" + +workbox-recipes@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" + integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== + dependencies: + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-precaching "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-routing@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" + integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== + dependencies: + workbox-core "6.5.4" + +workbox-strategies@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" + integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== + dependencies: + workbox-core "6.5.4" + +workbox-streams@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" + integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== + dependencies: + workbox-core "6.5.4" + workbox-routing "6.5.4" + +workbox-sw@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" + integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== + +workbox-webpack-plugin@^6.4.1: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" + integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.5.4" + +workbox-window@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" + integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "6.5.4" + worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -20342,7 +24322,7 @@ xstream@^11.14.0: globalthis "^1.0.1" symbol-observable "^2.0.3" -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -20419,6 +24399,11 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" From 86e9463c423894232ec16bd7e3a9b650de005fec Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 20 Jan 2023 18:17:15 +0000 Subject: [PATCH 219/591] Typescript: fix eslint errors and add GitHub Action for linting (#2886) * Fix eslint errors * GitHub Actions: add Typescript project linting * Fix dependency * Revert changes and exclude rule Co-authored-by: Mark Sinclair --- .github/workflows/typescript-lint.yml | 49 +++++++++++++++++++ lerna.json | 4 +- nym-connect/package.json | 2 + nym-connect/src/components/AppVersion.tsx | 2 +- .../src/components/ConnectionButton.tsx | 9 +--- .../src/components/ConnectionStatus.tsx | 2 +- .../Growth/TestAndEarnButtonArea.tsx | 1 + .../Growth/TestAndEarnDraws.stories.tsx | 1 + .../components/Growth/TestAndEarnDraws.tsx | 3 +- .../Growth/TestAndEarnEnterWalletAddress.tsx | 4 +- .../Growth/TestAndEarnPopup.stories.tsx | 5 -- .../components/Growth/TestAndEarnTakePart.tsx | 2 +- .../Growth/TestAndEarnWinner.stories.tsx | 1 + .../components/Growth/TestAndEarnWinner.tsx | 2 +- .../Growth/TestAndEarnWinnerWalletAddress.tsx | 4 +- .../src/components/Growth/context/types.ts | 2 - .../src/components/ServiceProviderPopup.tsx | 4 +- .../components/ServiceProviderSelector.tsx | 4 +- nym-connect/src/context/main.tsx | 6 +-- nym-connect/src/context/mocks/main.tsx | 9 ++-- nym-connect/src/stories/AppFlow.stories.tsx | 5 +- .../src/stories/ConnectedLayout.stories.tsx | 4 +- nym-connect/src/theme/index.tsx | 1 + nym-connect/src/theme/theme.tsx | 1 + .../Accounts/modals/MnemonicModal.tsx | 6 +-- .../src/components/Bonding/BondedMixnode.tsx | 6 +-- .../Bonding/forms/BondMixnodeForm.tsx | 2 +- .../Bonding/forms/gatewayValidationSchema.ts | 1 + .../Bonding/forms/mixnodeValidationSchema.ts | 1 + .../Bonding/modals/BondMoreModal.tsx | 2 +- .../Bonding/modals/NodeSettingsModal.tsx | 4 +- .../components/Bonding/modals/UnbondModal.tsx | 2 +- nym-wallet/src/components/Buy/Tutorial.tsx | 7 +-- nym-wallet/src/components/ClientAddress.tsx | 2 + .../Delegation/DelegationActions.tsx | 1 - .../components/Delegation/DelegationItem.tsx | 9 ++-- .../components/Delegation/UndelegateModal.tsx | 1 - nym-wallet/src/components/LogViewer/index.tsx | 1 + nym-wallet/src/components/Modals/ModalFee.tsx | 14 +++--- .../RewardsPlayground/NodeDetail.tsx | 2 +- .../src/components/Send/SendSuccessModal.tsx | 2 +- nym-wallet/src/context/bonding.tsx | 1 + nym-wallet/src/context/delegations.tsx | 8 +-- nym-wallet/src/context/main.tsx | 2 +- nym-wallet/src/context/mocks/bonding.tsx | 4 +- nym-wallet/src/context/mocks/delegations.tsx | 35 +++++++------ nym-wallet/src/context/mocks/main.tsx | 2 +- nym-wallet/src/context/mocks/rewards.tsx | 2 +- nym-wallet/src/context/rewards.tsx | 2 +- nym-wallet/src/pages/balance/index.tsx | 2 +- nym-wallet/src/pages/balance/vesting.tsx | 3 +- nym-wallet/src/pages/bonding/Bonding.tsx | 14 +++--- .../bonding/node-settings/NodeSettings.tsx | 4 +- .../node-settings/apy-playground/index.tsx | 16 +++--- .../node-settings/apy-playground/utils.tsx | 2 +- .../settings-pages/NodeUnbondPage.tsx | 3 +- .../general-settings/InfoSettings.tsx | 6 +-- .../general-settings/ParametersSettings.tsx | 16 ++---- .../settings-pages/general-settings/index.tsx | 4 +- nym-wallet/src/pages/delegation/index.tsx | 12 ++--- nym-wallet/src/requests/actions.ts | 3 +- nym-wallet/src/requests/queries.ts | 13 +++-- nym-wallet/src/requests/simulate.ts | 3 +- nym-wallet/src/requests/vesting.ts | 15 ++---- nym-wallet/src/svg-icons/poweredByBity.tsx | 2 +- nym-wallet/src/types/global.ts | 11 +---- nym-wallet/src/types/rust/Epoch.ts | 7 ++- nym-wallet/src/types/rust/StateParams.ts | 2 +- nym-wallet/src/utils/index.ts | 4 +- nym-wallet/src/utils/nextEpoch.ts | 23 --------- .../src/App.tsx | 3 +- .../packages/sdk/src/mixnet/wasm/types.ts | 1 + .../packages/sdk/src/mixnet/wasm/worker.ts | 3 ++ .../mui-theme/src/theme/network-explorer.ts | 9 ++-- ts-packages/mui-theme/src/theme/theme.ts | 36 +++----------- ts-packages/mui-theme/src/theme/utils.ts | 31 ++++++++++++ .../components/banners/MaintenanceBanner.tsx | 1 + .../coins/CoinMarkTestnet.stories.tsx | 1 - .../src/components/currency/Currency.tsx | 2 +- .../components/tooltip/Tooltip.stories.tsx | 24 +++++---- .../src/components/tooltip/Tooltip.tsx | 18 +++++-- .../types/src/types/rust/PendingEpochEvent.ts | 8 +-- .../src/types/rust/PendingIntervalEvent.ts | 8 +-- ts-packages/webpack/webpack.common.js | 17 +++---- 84 files changed, 299 insertions(+), 274 deletions(-) create mode 100644 .github/workflows/typescript-lint.yml delete mode 100644 nym-wallet/src/utils/nextEpoch.ts create mode 100644 ts-packages/mui-theme/src/theme/utils.ts diff --git a/.github/workflows/typescript-lint.yml b/.github/workflows/typescript-lint.yml new file mode 100644 index 0000000000..c8234e0e44 --- /dev/null +++ b/.github/workflows/typescript-lint.yml @@ -0,0 +1,49 @@ +name: CI for linting Typescript + +on: + push: + paths: + - 'ts-packages/**' + - 'sdk/typescript/**' + - nym-connect + - nym-wallet + +jobs: + build: + runs-on: custom-runner-linux + steps: + - uses: actions/checkout@v2 + - name: Install rsync + run: sudo apt-get install rsync + - uses: rlespinasse/github-slug-action@v3.x + - uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Setup yarn + run: npm install -g yarn + - name: Lint + run: yarn && yarn lint + - name: Keybase - Node Install + run: npm install + working-directory: .github/workflows/support-files + - name: Keybase - Send Notification + env: + NYM_NOTIFICATION_KIND: ts-packages + NYM_PROJECT_NAME: "ts-packages" + NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}" + NYM_CI_WWW_LOCATION: "ts-${{ env.GITHUB_REF_SLUG }}" + GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}" + GIT_BRANCH: "${GITHUB_REF##*/}" + KEYBASE_NYMBOT_USERNAME: "${{ secrets.KEYBASE_NYMBOT_USERNAME }}" + KEYBASE_NYMBOT_PAPERKEY: "${{ secrets.KEYBASE_NYMBOT_PAPERKEY }}" + KEYBASE_NYMBOT_TEAM: "${{ secrets.KEYBASE_NYMBOT_TEAM }}" + KEYBASE_NYM_CHANNEL: "ci-ts-packages" + IS_SUCCESS: "${{ job.status == 'success' }}" + MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}" + MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}" + MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}" + MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}" + MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}" + uses: docker://keybaseio/client:stable-node + with: + args: .github/workflows/support-files/notifications/entry_point.sh diff --git a/lerna.json b/lerna.json index cc6884af07..a2393382ed 100644 --- a/lerna.json +++ b/lerna.json @@ -1,7 +1,9 @@ { "packages": [ "ts-packages/*", - "nym-wallet" + "nym-wallet", + "nym-connect", + "sdk/typescript/**" ], "version": "0.0.0" } diff --git a/nym-connect/package.json b/nym-connect/package.json index c2de26db48..9214e54a1b 100644 --- a/nym-connect/package.json +++ b/nym-connect/package.json @@ -30,6 +30,8 @@ "@mui/icons-material": "^5.2.0", "@mui/material": "^5.2.2", "@mui/styles": "^5.2.2", + "@mui/system": ">= 5", + "@mui/lab": "^5.0.0-alpha.72", "@nymproject/react": "^1.0.0", "@tauri-apps/api": "^1.2.0", "@tauri-apps/tauri-forage": "^1.0.0-beta.2", diff --git a/nym-connect/src/components/AppVersion.tsx b/nym-connect/src/components/AppVersion.tsx index f82f99b5a2..2a0250e86b 100644 --- a/nym-connect/src/components/AppVersion.tsx +++ b/nym-connect/src/components/AppVersion.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Typography, Box } from '@mui/material'; +import { Box } from '@mui/material'; import { useClientContext } from 'src/context/main'; export const AppVersion = () => { diff --git a/nym-connect/src/components/ConnectionButton.tsx b/nym-connect/src/components/ConnectionButton.tsx index 74f4846519..29fb90c1db 100644 --- a/nym-connect/src/components/ConnectionButton.tsx +++ b/nym-connect/src/components/ConnectionButton.tsx @@ -1,13 +1,6 @@ import React from 'react'; import { ConnectionStatusKind } from '../types'; -const getBusyFillColor = (color: string): string => { - if (color === '#F4B02D') { - return '#21D072'; - } - return '#F4B02D'; -}; - const getStatusFillColor = (status: ConnectionStatusKind, hover: boolean, isError: boolean): string => { if (isError && hover) { return '#21D072'; @@ -57,7 +50,7 @@ export const ConnectionButton: FCWithChildren<{ busy?: boolean; isError?: boolean; onClick?: (status: ConnectionStatusKind) => void; -}> = ({ status, disabled, isError, onClick, busy }) => { +}> = ({ status, disabled, isError, onClick }) => { const [hover, setHover] = React.useState(false); const handleClick = React.useCallback(() => { diff --git a/nym-connect/src/components/ConnectionStatus.tsx b/nym-connect/src/components/ConnectionStatus.tsx index 8ad2c9932c..c8dadd2e67 100644 --- a/nym-connect/src/components/ConnectionStatus.tsx +++ b/nym-connect/src/components/ConnectionStatus.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Box, CircularProgress, Divider, Stack, Tooltip, Typography } from '@mui/material'; +import { Box, CircularProgress, Tooltip, Typography } from '@mui/material'; import { DateTime } from 'luxon'; import { ConnectionStatusKind, GatewayPerformance } from '../types'; import { ServiceProvider } from '../types/directory'; diff --git a/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx b/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx index e3f8372c60..92c88ec321 100644 --- a/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx @@ -18,6 +18,7 @@ export const Wrapper: FCWithChildren<{ disabled: boolean }> = ({ disabled, child ); } + // eslint-disable-next-line react/jsx-no-useless-fragment return <>{children}; }; diff --git a/nym-connect/src/components/Growth/TestAndEarnDraws.stories.tsx b/nym-connect/src/components/Growth/TestAndEarnDraws.stories.tsx index 83776d8e20..c70f223420 100644 --- a/nym-connect/src/components/Growth/TestAndEarnDraws.stories.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnDraws.stories.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/jsx-pascal-case */ import * as React from 'react'; import { ComponentMeta } from '@storybook/react'; import { NymShipyardTheme } from 'src/theme'; diff --git a/nym-connect/src/components/Growth/TestAndEarnDraws.tsx b/nym-connect/src/components/Growth/TestAndEarnDraws.tsx index 929313982e..24d97b7439 100644 --- a/nym-connect/src/components/Growth/TestAndEarnDraws.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnDraws.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/jsx-no-useless-fragment */ import React from 'react'; import LoadingButton from '@mui/lab/LoadingButton'; import { @@ -134,7 +135,7 @@ const StatusText: FCWithChildren<{ entry: DrawEntry }> = ({ entry }) => { export const TestAndEarnDraws: FCWithChildren<{ sx?: SxProps; -}> = ({ sx }) => { +}> = () => { const context = useTestAndEarnContext(); const draws = React.useMemo( diff --git a/nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.tsx b/nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.tsx index efafc67d50..60aea1d51b 100644 --- a/nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { WalletAddressFormField } from '@nymproject/react/account/WalletAddressFormField'; import { SxProps } from '@mui/system'; -import { Paper, Stack, Button, Box } from '@mui/material'; +import { Box, Button, Paper, Stack } from '@mui/material'; import ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight'; import { useTestAndEarnContext } from './context/TestAndEarnContext'; @@ -10,7 +10,7 @@ export const TestAndEarnEnterWalletAddress: FCWithChildren<{ placeholder?: string; onSubmit?: () => Promise | void; sx?: SxProps; -}> = ({ initialValue, placeholder, onSubmit, sx }) => { +}> = ({ initialValue, placeholder, onSubmit }) => { const context = useTestAndEarnContext(); const [isAddressValid, setAddressIsValid] = React.useState(false); return ( diff --git a/nym-connect/src/components/Growth/TestAndEarnPopup.stories.tsx b/nym-connect/src/components/Growth/TestAndEarnPopup.stories.tsx index ec5da3282a..7e000ca093 100644 --- a/nym-connect/src/components/Growth/TestAndEarnPopup.stories.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnPopup.stories.tsx @@ -7,13 +7,8 @@ import { TestAndEarnPopup, TestAndEarnPopupContent } from './TestAndEarnPopup'; import { TestAndEarnContextProvider } from './context/TestAndEarnContext'; import { MockProvider } from '../../context/mocks/main'; import { ConnectionStatusKind } from '../../types'; -import { TestAndEarnCurrentDraw } from './TestAndEarnCurrentDraw'; -import { TestAndEarnWinner } from './TestAndEarnWinner'; -import { TestAndEarnDraws } from './TestAndEarnDraws'; -import { TestAndEarnWinnerWalletAddress } from './TestAndEarnWinnerWalletAddress'; import { MockTestAndEarnProvider_NotRegistered, - MockTestAndEarnProvider_Registered, MockTestAndEarnProvider_RegisteredAndError, MockTestAndEarnProvider_RegisteredWithDraws, MockTestAndEarnProvider_RegisteredWithDrawsAndEntry, diff --git a/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx b/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx index b447c9c735..9238c8ce75 100644 --- a/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx @@ -5,7 +5,7 @@ import { SxProps } from '@mui/system'; import ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight'; import { invoke } from '@tauri-apps/api'; import { useTestAndEarnContext } from './context/TestAndEarnContext'; -import { ClientId, Registration } from './context/types'; +import { Registration } from './context/types'; export const TestAndEarnTakePart: FCWithChildren<{ websiteLinkUrl: string; diff --git a/nym-connect/src/components/Growth/TestAndEarnWinner.stories.tsx b/nym-connect/src/components/Growth/TestAndEarnWinner.stories.tsx index ed12362122..03ed77aa53 100644 --- a/nym-connect/src/components/Growth/TestAndEarnWinner.stories.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnWinner.stories.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/jsx-pascal-case */ import * as React from 'react'; import { ComponentMeta } from '@storybook/react'; import { NymShipyardTheme } from 'src/theme'; diff --git a/nym-connect/src/components/Growth/TestAndEarnWinner.tsx b/nym-connect/src/components/Growth/TestAndEarnWinner.tsx index 980e285a99..41db329a2a 100644 --- a/nym-connect/src/components/Growth/TestAndEarnWinner.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnWinner.tsx @@ -11,7 +11,7 @@ import Content from './content/en.yaml'; export const TestAndEarnWinner: FCWithChildren<{ sx?: SxProps; entry?: DrawEntry; -}> = ({ sx, entry }) => { +}> = ({ entry }) => { const context = useTestAndEarnContext(); const [busy, setBusy] = React.useState(false); const [error, setError] = React.useState(); diff --git a/nym-connect/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx b/nym-connect/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx index f07593b828..deea1049e7 100644 --- a/nym-connect/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx @@ -1,11 +1,11 @@ import React from 'react'; -import { Box, Button, Card, CardContent, CardMedia, Typography } from '@mui/material'; +import { Box } from '@mui/material'; import { SxProps } from '@mui/system'; import Content from './content/TestAndEarn/WinnerEntersWalletAddress.mdx'; export const TestAndEarnWinnerWalletAddress: FCWithChildren<{ sx?: SxProps; -}> = ({ sx }) => ( +}> = () => ( diff --git a/nym-connect/src/components/Growth/context/types.ts b/nym-connect/src/components/Growth/context/types.ts index ebedf20d91..c7574b282f 100644 --- a/nym-connect/src/components/Growth/context/types.ts +++ b/nym-connect/src/components/Growth/context/types.ts @@ -1,5 +1,3 @@ -import { DateTime } from 'luxon'; - export interface ClientId { client_id: string; client_id_signature: string; diff --git a/nym-connect/src/components/ServiceProviderPopup.tsx b/nym-connect/src/components/ServiceProviderPopup.tsx index 79a47c375a..660fee4134 100644 --- a/nym-connect/src/components/ServiceProviderPopup.tsx +++ b/nym-connect/src/components/ServiceProviderPopup.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Autocomplete, Box, Chip, Dialog, DialogProps, TextField, Typography } from '@mui/material'; -import { ServiceProvider, Service, Services } from '../types/directory'; +import { Autocomplete, Box, Dialog, DialogProps, TextField, Typography } from '@mui/material'; +import { Service, ServiceProvider, Services } from '../types/directory'; export const ServiceProviderPopup: FCWithChildren< DialogProps & { services: Services; onServiceProviderChanged: (sp?: ServiceProvider, s?: Service) => void } diff --git a/nym-connect/src/components/ServiceProviderSelector.tsx b/nym-connect/src/components/ServiceProviderSelector.tsx index 52bdfece50..741465dac4 100644 --- a/nym-connect/src/components/ServiceProviderSelector.tsx +++ b/nym-connect/src/components/ServiceProviderSelector.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useMemo } from 'react'; -import { Box, CircularProgress, Stack, TextField, Tooltip, Typography, MenuItem, ListItemIcon } from '@mui/material'; -import { ServiceProvider, Service, Services } from '../types/directory'; +import { Box, CircularProgress, MenuItem, Stack, TextField, Tooltip, Typography } from '@mui/material'; +import { Service, ServiceProvider, Services } from '../types/directory'; import { useTauriEvents } from '../utils'; type ServiceWithRandomSp = { diff --git a/nym-connect/src/context/main.tsx b/nym-connect/src/context/main.tsx index d4cbd9cf99..bba01764e7 100644 --- a/nym-connect/src/context/main.tsx +++ b/nym-connect/src/context/main.tsx @@ -4,12 +4,12 @@ import { invoke } from '@tauri-apps/api'; import type { UnlistenFn } from '@tauri-apps/api/event'; import { listen } from '@tauri-apps/api/event'; import { forage } from '@tauri-apps/tauri-forage'; -import { ConnectionStatusKind, GatewayPerformance } from '../types'; -import { ConnectionStatsItem } from '../components/ConnectionStats'; -import { ServiceProvider, Services } from '../types/directory'; import { Error } from 'src/types/error'; import { TauriEvent } from 'src/types/event'; import { getVersion } from '@tauri-apps/api/app'; +import { ConnectionStatusKind, GatewayPerformance } from '../types'; +import { ConnectionStatsItem } from '../components/ConnectionStats'; +import { ServiceProvider, Services } from '../types/directory'; const TAURI_EVENT_STATUS_CHANGED = 'app:connection-status-changed'; diff --git a/nym-connect/src/context/mocks/main.tsx b/nym-connect/src/context/mocks/main.tsx index 0845aa49be..9b4341cc23 100644 --- a/nym-connect/src/context/mocks/main.tsx +++ b/nym-connect/src/context/mocks/main.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { ConnectionStatusKind } from 'src/types'; import { ClientContext, TClientContext } from '../main'; @@ -24,6 +24,7 @@ const mockValues: TClientContext = { export const MockProvider: FCWithChildren<{ children?: React.ReactNode; connectionStatus?: ConnectionStatusKind; -}> = ({ connectionStatus = ConnectionStatusKind.disconnected, children }) => ( - {children} -); +}> = ({ connectionStatus = ConnectionStatusKind.disconnected, children }) => { + const value = useMemo(() => ({ ...mockValues, connectionStatus }), [connectionStatus]); + return {children}; +}; diff --git a/nym-connect/src/stories/AppFlow.stories.tsx b/nym-connect/src/stories/AppFlow.stories.tsx index 248334d0c8..f0c8428058 100644 --- a/nym-connect/src/stories/AppFlow.stories.tsx +++ b/nym-connect/src/stories/AppFlow.stories.tsx @@ -8,7 +8,6 @@ import { ConnectionStatusKind } from '../types'; import { DefaultLayout } from '../layouts/DefaultLayout'; import { ConnectedLayout } from '../layouts/ConnectedLayout'; import { Services } from '../types/directory'; -import { TestAndEarnButtonArea } from '../components/Growth/TestAndEarnButtonArea'; export default { title: 'App/Flow', @@ -90,9 +89,7 @@ export const Mock: ComponentStory = () => { { - return undefined; - }} + handleCloseInfoModal={() => undefined} status={context.connectionStatus} busy={busy} onConnectClick={handleConnectClick} diff --git a/nym-connect/src/stories/ConnectedLayout.stories.tsx b/nym-connect/src/stories/ConnectedLayout.stories.tsx index 4d79900340..216e9c38db 100644 --- a/nym-connect/src/stories/ConnectedLayout.stories.tsx +++ b/nym-connect/src/stories/ConnectedLayout.stories.tsx @@ -15,9 +15,7 @@ export const Default: ComponentStory = () => ( { - return undefined; - }} + handleCloseInfoModal={() => undefined} status={ConnectionStatusKind.connected} connectedSince={DateTime.now()} ipAddress="127.0.0.1" diff --git a/nym-connect/src/theme/index.tsx b/nym-connect/src/theme/index.tsx index 7eb23af5df..ad2350053d 100644 --- a/nym-connect/src/theme/index.tsx +++ b/nym-connect/src/theme/index.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { CssBaseline } from '@mui/material'; import { getDesignTokens } from './theme'; +// eslint-disable-next-line import/no-relative-packages import '../../../assets/fonts/non-variable/fonts.css'; /** diff --git a/nym-connect/src/theme/theme.tsx b/nym-connect/src/theme/theme.tsx index a580ae0b4e..abda87ef72 100644 --- a/nym-connect/src/theme/theme.tsx +++ b/nym-connect/src/theme/theme.tsx @@ -73,6 +73,7 @@ const lightMode: NymPaletteVariant = { * IMPORTANT: do not export this constant, always use the MUI `useTheme` hook to get the correct * colours for dark/light mode. */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars const nymMixnetPalette = (variant: NymPaletteVariant): NymMixnetPalette => ({ nymMixnet: {}, }); diff --git a/nym-wallet/src/components/Accounts/modals/MnemonicModal.tsx b/nym-wallet/src/components/Accounts/modals/MnemonicModal.tsx index bede36211b..c9ea2202a3 100644 --- a/nym-wallet/src/components/Accounts/modals/MnemonicModal.tsx +++ b/nym-wallet/src/components/Accounts/modals/MnemonicModal.tsx @@ -3,18 +3,16 @@ import { Box, Button, CircularProgress, - Paper, Dialog, DialogActions, DialogContent, DialogTitle, - IconButton, + Paper, Typography, } from '@mui/material'; -import { ArrowBackSharp } from '@mui/icons-material'; import { AccountsContext } from 'src/context'; import { useClipboard } from 'use-clipboard-copy'; -import { PasswordInput, Mnemonic } from 'src/components'; +import { Mnemonic, PasswordInput } from 'src/components'; import { StyledBackButton } from 'src/components/StyledBackButton'; export const MnemonicModal = () => { diff --git a/nym-wallet/src/components/Bonding/BondedMixnode.tsx b/nym-wallet/src/components/Bonding/BondedMixnode.tsx index ae32fdefba..199c8f5653 100644 --- a/nym-wallet/src/components/Bonding/BondedMixnode.tsx +++ b/nym-wallet/src/components/Bonding/BondedMixnode.tsx @@ -7,11 +7,11 @@ import { TBondedMixnode, urls } from 'src/context'; import { NymCard } from 'src/components'; import { IdentityKey } from 'src/components/IdentityKey'; import { NodeStatus } from 'src/components/NodeStatus'; +import { getIntervalAsDate } from 'src/utils'; import { Node as NodeIcon } from '../../svg-icons/node'; import { Cell, Header, NodeTable } from './NodeTable'; import { BondedMixnodeActions, TBondedMixnodeActions } from './BondedMixnodeActions'; import { NodeStats } from './NodeStats'; -import { getIntervalAsDate } from 'src/utils'; const textWhenNotName = 'This node has not yet set a name'; @@ -85,8 +85,8 @@ export const BondedMixnode = ({ const getNextInterval = async () => { try { - const { nextEpoch } = await getIntervalAsDate(); - setNextEpoch(nextEpoch); + const { nextEpoch: newNextEpoch } = await getIntervalAsDate(); + setNextEpoch(newNextEpoch); } catch { setNextEpoch(Error()); } diff --git a/nym-wallet/src/components/Bonding/forms/BondMixnodeForm.tsx b/nym-wallet/src/components/Bonding/forms/BondMixnodeForm.tsx index 6f229a403d..2f8864a017 100644 --- a/nym-wallet/src/components/Bonding/forms/BondMixnodeForm.tsx +++ b/nym-wallet/src/components/Bonding/forms/BondMixnodeForm.tsx @@ -9,8 +9,8 @@ import { checkHasEnoughFunds, checkHasEnoughLockedTokens } from 'src/utils'; import { NodeTypeSelector, TokenPoolSelector } from 'src/components'; import { MixnodeAmount, MixnodeData } from 'src/pages/bonding/types'; import { ModalListItem } from 'src/components/Modals/ModalListItem'; -import { amountSchema, mixnodeValidationSchema } from './mixnodeValidationSchema'; import { AppContext } from 'src/context'; +import { amountSchema, mixnodeValidationSchema } from './mixnodeValidationSchema'; const NodeFormData = ({ mixnodeData, onNext }: { mixnodeData: MixnodeData; onNext: (data: any) => void }) => { const [showAdvancedOptions, setShowAdvancedOptions] = useState(false); diff --git a/nym-wallet/src/components/Bonding/forms/gatewayValidationSchema.ts b/nym-wallet/src/components/Bonding/forms/gatewayValidationSchema.ts index c126d6c309..82de5cd3a2 100644 --- a/nym-wallet/src/components/Bonding/forms/gatewayValidationSchema.ts +++ b/nym-wallet/src/components/Bonding/forms/gatewayValidationSchema.ts @@ -60,6 +60,7 @@ export const amountSchema = Yup.object().shape({ operatorCost: Yup.object().shape({ amount: Yup.string() .required('An operating cost is required') + // eslint-disable-next-line .test('valid-operating-cost', 'A valid amount is required (min 40)', async function isValidAmount(this, value) { if (value && (!Number(value) || isLessThan(+value, 40))) { return false; diff --git a/nym-wallet/src/components/Bonding/forms/mixnodeValidationSchema.ts b/nym-wallet/src/components/Bonding/forms/mixnodeValidationSchema.ts index aa5752f4aa..2289760520 100644 --- a/nym-wallet/src/components/Bonding/forms/mixnodeValidationSchema.ts +++ b/nym-wallet/src/components/Bonding/forms/mixnodeValidationSchema.ts @@ -40,6 +40,7 @@ const operatingCostAndPmValidation = { operatorCost: Yup.object().shape({ amount: Yup.string() .required('An operating cost is required') + // eslint-disable-next-line prefer-arrow-callback .test('valid-operating-cost', 'A valid amount is required (min 40)', async function isValidAmount(this, value) { if (value && (!Number(value) || isLessThan(+value, 40))) { return false; diff --git a/nym-wallet/src/components/Bonding/modals/BondMoreModal.tsx b/nym-wallet/src/components/Bonding/modals/BondMoreModal.tsx index e2145e431e..e99315b467 100644 --- a/nym-wallet/src/components/Bonding/modals/BondMoreModal.tsx +++ b/nym-wallet/src/components/Bonding/modals/BondMoreModal.tsx @@ -4,7 +4,7 @@ import { CurrencyFormField } from '@nymproject/react/currency/CurrencyFormField' import { ModalListItem } from 'src/components/Modals/ModalListItem'; import { SimpleModal } from 'src/components/Modals/SimpleModal'; import { DecCoin } from '@nymproject/types'; -import { TokenPoolSelector, TPoolOption } from 'src/components/TokenPoolSelector'; +import { TPoolOption } from 'src/components/TokenPoolSelector'; import { ConfirmTx } from 'src/components/ConfirmTX'; import { useGetFee } from 'src/hooks/useGetFee'; import { validateAmount } from 'src/utils'; diff --git a/nym-wallet/src/components/Bonding/modals/NodeSettingsModal.tsx b/nym-wallet/src/components/Bonding/modals/NodeSettingsModal.tsx index 3a8dca5576..0aa53e7368 100644 --- a/nym-wallet/src/components/Bonding/modals/NodeSettingsModal.tsx +++ b/nym-wallet/src/components/Bonding/modals/NodeSettingsModal.tsx @@ -12,7 +12,7 @@ import { simulateUpdateMixnodeCostParams, simulateVestingUpdateMixnodeCostParams import { LoadingModal } from 'src/components/Modals/LoadingModal'; import { FeeDetails } from '@nymproject/types'; -//Now we are using the node setting page instead of this modal +// Now we are using the node setting page instead of this modal export const NodeSettings = ({ currentPm, isVesting, @@ -108,7 +108,7 @@ export const NodeSettings = ({ okLabel="Next" onClose={onClose} > - + Set profit margin diff --git a/nym-wallet/src/components/Bonding/modals/UnbondModal.tsx b/nym-wallet/src/components/Bonding/modals/UnbondModal.tsx index 15b46b517b..41eeb45211 100644 --- a/nym-wallet/src/components/Bonding/modals/UnbondModal.tsx +++ b/nym-wallet/src/components/Bonding/modals/UnbondModal.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; +import { useEffect } from 'react'; import { Typography } from '@mui/material'; -import { useEffect, useState } from 'react'; import { TBondedGateway, TBondedMixnode } from 'src/context'; import { useGetFee } from 'src/hooks/useGetFee'; import { isGateway, isMixnode } from 'src/types'; diff --git a/nym-wallet/src/components/Buy/Tutorial.tsx b/nym-wallet/src/components/Buy/Tutorial.tsx index 8d403cb2e6..be669a38a5 100644 --- a/nym-wallet/src/components/Buy/Tutorial.tsx +++ b/nym-wallet/src/components/Buy/Tutorial.tsx @@ -2,10 +2,10 @@ import React, { useContext, useState } from 'react'; import { Button, Stack, Typography, Grid, useMediaQuery, useTheme } from '@mui/material'; import { Tune as TuneIcon, BorderColor as BorderColorIcon } from '@mui/icons-material'; import { CoinMark } from '@nymproject/react/coins/CoinMark'; -import { NymCard, ClientAddress } from '../../components'; -import { SignMessageModal } from './SignMessageModal'; import { PoweredByBity } from 'src/svg-icons'; import { AppContext } from 'src/context'; +import { NymCard, ClientAddress } from '..'; +import { SignMessageModal } from './SignMessageModal'; // TODO retrieve this value from env const EXCHANGE_URL = 'https://buy.nymtech.net'; @@ -114,7 +114,8 @@ export const Tutorial = () => { icon={} text={ t.palette.nym.text.muted }}> - {`Send the defined BTC amount to Bity's address that's given to you. As soon as your BTC tx has 4 confirmations, Bity will send the purchased NYM tokens to your wallet.`} + {`Send the defined BTC amount to Bity's address that's given to you. As soon as your BTC tx has 4 + confirmations, Bity will send the purchased NYM tokens to your wallet.`} } /> diff --git a/nym-wallet/src/components/ClientAddress.tsx b/nym-wallet/src/components/ClientAddress.tsx index a7039ca8d4..7ab858306e 100644 --- a/nym-wallet/src/components/ClientAddress.tsx +++ b/nym-wallet/src/components/ClientAddress.tsx @@ -6,11 +6,13 @@ import { splice } from '../utils'; const AddressTooltip: FCWithChildren<{ visible?: boolean; address?: string }> = ({ visible, address, children }) => { if (!visible || !address) { + // eslint-disable-next-line react/jsx-no-useless-fragment return <>{children}; } return ( + {/* eslint-disable-next-line react/jsx-no-useless-fragment */} <>{children} ); diff --git a/nym-wallet/src/components/Delegation/DelegationActions.tsx b/nym-wallet/src/components/Delegation/DelegationActions.tsx index 628a893443..2b9001de7c 100644 --- a/nym-wallet/src/components/Delegation/DelegationActions.tsx +++ b/nym-wallet/src/components/Delegation/DelegationActions.tsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import { Box, Button, Stack, Tooltip, Typography } from '@mui/material'; -import { DelegationEventKind } from '@nymproject/types'; import { Delegate, Undelegate } from '../../svg-icons'; import { ActionsMenu, ActionsMenuItem } from '../ActionsMenu'; import { DelegateListItemPending } from './types'; diff --git a/nym-wallet/src/components/Delegation/DelegationItem.tsx b/nym-wallet/src/components/Delegation/DelegationItem.tsx index 1b4327621c..188901902f 100644 --- a/nym-wallet/src/components/Delegation/DelegationItem.tsx +++ b/nym-wallet/src/components/Delegation/DelegationItem.tsx @@ -12,6 +12,7 @@ const getStakeSaturation = (item: DelegationWithEverything) => !item.stake_saturation ? '-' : `${decimalToPercentage(item.stake_saturation)}%`; const getRewardValue = (item: DelegationWithEverything) => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { unclaimed_rewards } = item; return !unclaimed_rewards ? '-' : `${unclaimed_rewards.amount} ${unclaimed_rewards.denom}`; }; @@ -32,11 +33,11 @@ export const DelegationItem = ({ const tooltipText = () => { if (nodeIsUnbonded) { return 'This node has unbonded and it does not exist anymore. You need to undelegate from it to get your stake and outstanding rewards (if any) back.'; - } else if (item.uses_vesting_contract_tokens) { - return 'Delegation made with locked tockens'; - } else { - return ''; } + if (item.uses_vesting_contract_tokens) { + return 'Delegation made with locked tockens'; + } + return ''; }; return ( diff --git a/nym-wallet/src/components/Delegation/UndelegateModal.tsx b/nym-wallet/src/components/Delegation/UndelegateModal.tsx index 368b9d6fce..fe518d37ff 100644 --- a/nym-wallet/src/components/Delegation/UndelegateModal.tsx +++ b/nym-wallet/src/components/Delegation/UndelegateModal.tsx @@ -1,5 +1,4 @@ import { Box, SxProps } from '@mui/material'; -import { IdentityKeyFormField } from '@nymproject/react/mixnodes/IdentityKeyFormField'; import React, { useEffect } from 'react'; import { FeeDetails } from '@nymproject/types'; import { useGetFee } from 'src/hooks/useGetFee'; diff --git a/nym-wallet/src/components/LogViewer/index.tsx b/nym-wallet/src/components/LogViewer/index.tsx index f2a9d2e6d0..c7d4e69911 100644 --- a/nym-wallet/src/components/LogViewer/index.tsx +++ b/nym-wallet/src/components/LogViewer/index.tsx @@ -42,6 +42,7 @@ export const LogViewer: FC = () => { useEffect(() => { listen('log://log', (event) => { + // eslint-disable-next-line no-console console.log(event.payload); const payload = event.payload as RecordPayload; messages.current.unshift(payload); diff --git a/nym-wallet/src/components/Modals/ModalFee.tsx b/nym-wallet/src/components/Modals/ModalFee.tsx index 752be087a7..835b73e689 100644 --- a/nym-wallet/src/components/Modals/ModalFee.tsx +++ b/nym-wallet/src/components/Modals/ModalFee.tsx @@ -27,11 +27,9 @@ export const ModalFee = ({ fee, isLoading, error, divider }: TFeeProps) => ( ); -export const ModalTotalAmount = ({ fee, amount, isLoading, error, divider }: TTotalAmountProps) => { - return ( - <> - - {divider && } - - ); -}; +export const ModalTotalAmount = ({ fee, amount, isLoading, error, divider }: TTotalAmountProps) => ( + <> + + {divider && } + +); diff --git a/nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx b/nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx index fb8a239be0..d067dc3e5b 100644 --- a/nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx +++ b/nym-wallet/src/components/RewardsPlayground/NodeDetail.tsx @@ -24,7 +24,7 @@ export const NodeDetails = ({ saturation }: { saturation?: string }) => { Selection probability - + diff --git a/nym-wallet/src/components/Send/SendSuccessModal.tsx b/nym-wallet/src/components/Send/SendSuccessModal.tsx index cee7c2fdff..ffee6dd2e2 100644 --- a/nym-wallet/src/components/Send/SendSuccessModal.tsx +++ b/nym-wallet/src/components/Send/SendSuccessModal.tsx @@ -1,9 +1,9 @@ import React, { useContext } from 'react'; import { Stack, Typography, SxProps } from '@mui/material'; import { Link } from '@nymproject/react/link/Link'; +import { AppContext } from 'src/context'; import { TTransactionDetails } from './types'; import { ConfirmationModal } from '../Modals/ConfirmationModal'; -import { AppContext } from 'src/context'; export const SendSuccessModal = ({ txDetails, diff --git a/nym-wallet/src/context/bonding.tsx b/nym-wallet/src/context/bonding.tsx index c8a64b98b5..48d8d8409d 100644 --- a/nym-wallet/src/context/bonding.tsx +++ b/nym-wallet/src/context/bonding.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ import { FeeDetails, DecCoin, diff --git a/nym-wallet/src/context/delegations.tsx b/nym-wallet/src/context/delegations.tsx index 2324b141da..79ee6380f7 100644 --- a/nym-wallet/src/context/delegations.tsx +++ b/nym-wallet/src/context/delegations.tsx @@ -1,12 +1,12 @@ import React, { createContext, FC, useCallback, useContext, useEffect, useMemo, useState } from 'react'; -import { getDelegationSummary, undelegateAllFromMixnode, undelegateFromMixnode } from 'src/requests/delegation'; +import { getDelegationSummary, undelegateFromMixnode } from 'src/requests/delegation'; import { - DelegationWithEverything, - FeeDetails, DecCoin, + DelegationWithEverything, + Fee, + FeeDetails, TransactionExecuteResult, WrappedDelegationEvent, - Fee, } from '@nymproject/types'; import type { Network } from 'src/types'; import { diff --git a/nym-wallet/src/context/main.tsx b/nym-wallet/src/context/main.tsx index ae82bff958..a638a7568d 100644 --- a/nym-wallet/src/context/main.tsx +++ b/nym-wallet/src/context/main.tsx @@ -2,7 +2,7 @@ import React, { createContext, useEffect, useMemo, useState } from 'react'; import { forage } from '@tauri-apps/tauri-forage'; import { useNavigate } from 'react-router-dom'; import { useSnackbar } from 'notistack'; -import { Account, AccountEntry, MixNodeBond, MixNodeDetails } from '@nymproject/types'; +import { Account, AccountEntry, MixNodeDetails } from '@nymproject/types'; import { getVersion } from '@tauri-apps/api/app'; import { AppEnv, Network } from '../types'; import { TUseuserBalance, useGetBalance } from '../hooks/useGetBalance'; diff --git a/nym-wallet/src/context/mocks/bonding.tsx b/nym-wallet/src/context/mocks/bonding.tsx index f38168ee28..610b9ee299 100644 --- a/nym-wallet/src/context/mocks/bonding.tsx +++ b/nym-wallet/src/context/mocks/bonding.tsx @@ -1,7 +1,7 @@ -import { FeeDetails, DecCoin, TransactionExecuteResult } from '@nymproject/types'; +import { FeeDetails, TransactionExecuteResult } from '@nymproject/types'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import type { Network } from 'src/types'; -import { TBondedGateway, TBondedMixnode, BondingContext } from '../bonding'; +import { BondingContext, TBondedGateway, TBondedMixnode } from '../bonding'; import { mockSleep } from './utils'; const SLEEP_MS = 1000; diff --git a/nym-wallet/src/context/mocks/delegations.tsx b/nym-wallet/src/context/mocks/delegations.tsx index 58c5ea61cb..0c42a2b2e4 100644 --- a/nym-wallet/src/context/mocks/delegations.tsx +++ b/nym-wallet/src/context/mocks/delegations.tsx @@ -1,11 +1,11 @@ -import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { - DelegationWithEverything, - DecCoin, - TransactionExecuteResult, - FeeDetails, - Fee, CurrencyDenom, + DecCoin, + DelegationWithEverything, + Fee, + FeeDetails, + TransactionExecuteResult, } from '@nymproject/types'; import { DelegationContext, TDelegationTransaction } from '../delegations'; @@ -190,18 +190,17 @@ export const MockDelegationContextProvider: FCWithChildren = ({ children }) => { }; }; - const undelegateVesting = async (mix_id: number, _fee?: FeeDetails) => { - return { - logs_json: '', - data_json: '', - transaction_hash: '', - gas_info: { - gas_wanted: { gas_units: BigInt(1) }, - gas_used: { gas_units: BigInt(1) }, - }, - fee: { amount: '1', denom: 'nym' as CurrencyDenom }, - }; - }; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const undelegateVesting = async (mix_id: number, _fee?: FeeDetails) => ({ + logs_json: '', + data_json: '', + transaction_hash: '', + gas_info: { + gas_wanted: { gas_units: BigInt(1) }, + gas_used: { gas_units: BigInt(1) }, + }, + fee: { amount: '1', denom: 'nym' as CurrencyDenom }, + }); const resetState = () => { setIsLoading(true); diff --git a/nym-wallet/src/context/mocks/main.tsx b/nym-wallet/src/context/mocks/main.tsx index 0a073c47d8..ff49784f7b 100644 --- a/nym-wallet/src/context/mocks/main.tsx +++ b/nym-wallet/src/context/mocks/main.tsx @@ -1,4 +1,4 @@ -import React, { FC, useMemo } from 'react'; +import React, { useMemo } from 'react'; import type { TAppContext } from '../main'; import { AppContext } from '../main'; diff --git a/nym-wallet/src/context/mocks/rewards.tsx b/nym-wallet/src/context/mocks/rewards.tsx index fff2cbb21e..c89fdb00b3 100644 --- a/nym-wallet/src/context/mocks/rewards.tsx +++ b/nym-wallet/src/context/mocks/rewards.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { DelegationWithEverything, TransactionExecuteResult } from '@nymproject/types'; import { RewardsContext, TRewardsTransaction } from '../rewards'; import { useDelegationContext } from '../delegations'; diff --git a/nym-wallet/src/context/rewards.tsx b/nym-wallet/src/context/rewards.tsx index b65e2c6768..dc6b72a44f 100644 --- a/nym-wallet/src/context/rewards.tsx +++ b/nym-wallet/src/context/rewards.tsx @@ -1,4 +1,4 @@ -import React, { createContext, FC, useContext, useEffect, useMemo, useState } from 'react'; +import React, { createContext, useContext, useEffect, useMemo, useState } from 'react'; import { FeeDetails, TransactionExecuteResult } from '@nymproject/types'; import { useDelegationContext } from './delegations'; import { claimDelegatorRewards } from '../requests'; diff --git a/nym-wallet/src/pages/balance/index.tsx b/nym-wallet/src/pages/balance/index.tsx index a788a1c460..e214d1bddf 100644 --- a/nym-wallet/src/pages/balance/index.tsx +++ b/nym-wallet/src/pages/balance/index.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from 'react'; +import React, { useContext, useState } from 'react'; import { Box } from '@mui/material'; import { AppContext } from '../../context/main'; diff --git a/nym-wallet/src/pages/balance/vesting.tsx b/nym-wallet/src/pages/balance/vesting.tsx index 1ef8e0f30e..d84accf898 100644 --- a/nym-wallet/src/pages/balance/vesting.tsx +++ b/nym-wallet/src/pages/balance/vesting.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { Refresh } from '@mui/icons-material'; import { Box, @@ -14,7 +14,6 @@ import { Typography, } from '@mui/material'; import { useSnackbar } from 'notistack'; -import { useContext, useEffect, useState } from 'react'; import { NymCard } from 'src/components'; import { AppContext } from 'src/context/main'; import { Period } from 'src/types'; diff --git a/nym-wallet/src/pages/bonding/Bonding.tsx b/nym-wallet/src/pages/bonding/Bonding.tsx index 1aa6bd5ef2..1eae1d3924 100644 --- a/nym-wallet/src/pages/bonding/Bonding.tsx +++ b/nym-wallet/src/pages/bonding/Bonding.tsx @@ -99,8 +99,8 @@ const Bonding = () => { (await getMixnodeStakeSaturation(newMixId)).uncapped_saturation, ); if (newSaturation && newSaturation > 1) { - const saturationPercentage = Math.round(newSaturation * 100); - return { isOverSaturated: true, saturationPercentage }; + const newSaturationPercentage = Math.round(newSaturation * 100); + return { isOverSaturated: true, saturationPercentage: newSaturationPercentage }; } return { isOverSaturated: false, saturationPercentage: undefined }; } catch (e) { @@ -113,10 +113,12 @@ const Bonding = () => { switch (action) { case 'bondMore': { if (bondedNode && isMixnode(bondedNode)) { - const { isOverSaturated, saturationPercentage } = await handleCheckStakeSaturation(bondedNode.mixId); - if (isOverSaturated && saturationPercentage) { + const { isOverSaturated, saturationPercentage: newSaturationPercentage } = await handleCheckStakeSaturation( + bondedNode.mixId, + ); + if (isOverSaturated && newSaturationPercentage) { setShowModal('bond-more-oversaturated'); - setSaturationPercentage(saturationPercentage.toString()); + setSaturationPercentage(newSaturationPercentage.toString()); break; } } @@ -178,7 +180,7 @@ const Bonding = () => { {showModal === 'bond-more-oversaturated' && saturationPercentage && ( setShowModal(undefined)} onContinue={() => setShowModal('bond-more')} saturationPercentage={saturationPercentage} diff --git a/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx b/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx index 2a9ef67f13..a390c0e7c0 100644 --- a/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/NodeSettings.tsx @@ -13,12 +13,12 @@ import { Tabs } from 'src/components/Tabs'; import { useBondingContext, BondingContextProvider, TBondedMixnode } from 'src/context'; import { AppContext, urls } from 'src/context/main'; +import { isMixnode } from 'src/types'; +import { getIntervalAsDate } from 'src/utils'; import { NodeGeneralSettings } from './settings-pages/general-settings'; import { NodeUnbondPage } from './settings-pages/NodeUnbondPage'; import { createNavItems } from './node-settings.constant'; -import { isMixnode } from 'src/types'; import { ApyPlayground } from './apy-playground'; -import { getIntervalAsDate } from 'src/utils'; export const NodeSettings = () => { const theme = useTheme(); diff --git a/nym-wallet/src/pages/bonding/node-settings/apy-playground/index.tsx b/nym-wallet/src/pages/bonding/node-settings/apy-playground/index.tsx index 5a3b5f4c6b..efac9050cb 100644 --- a/nym-wallet/src/pages/bonding/node-settings/apy-playground/index.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/apy-playground/index.tsx @@ -1,14 +1,13 @@ -import React, { useState, useEffect, useContext } from 'react'; +import React, { useEffect, useState } from 'react'; import { Box, Card, CardContent, CardHeader, Grid, Typography } from '@mui/material'; -import { decimalToPercentage, percentToDecimal } from '@nymproject/types'; import { ResultsTable } from 'src/components/RewardsPlayground/ResultsTable'; import { getDelegationSummary } from 'src/requests'; import { NodeDetails } from 'src/components/RewardsPlayground/NodeDetail'; -import { Inputs, CalculateArgs } from 'src/components/RewardsPlayground/Inputs'; -import { AppContext, TBondedMixnode } from 'src/context'; -import { computeEstimate, computeStakeSaturation, handleCalculatePeriodRewards } from './utils'; +import { CalculateArgs, Inputs } from 'src/components/RewardsPlayground/Inputs'; +import { TBondedMixnode } from 'src/context'; import { useSnackbar } from 'notistack'; import { LoadingModal } from 'src/components/Modals/LoadingModal'; +import { computeEstimate, computeStakeSaturation, handleCalculatePeriodRewards } from './utils'; export type DefaultInputValues = { profitMargin: string; @@ -76,11 +75,12 @@ export const ApyPlayground = ({ bondedNode }: { bondedNode: TBondedMixnode }) => const handleCalculateEstimate = async ({ bond, delegations, uptime, profitMargin, operatorCost }: CalculateArgs) => { try { + // eslint-disable-next-line @typescript-eslint/naming-convention const { estimation, reward_params } = await computeEstimate({ mixId: bondedNode.mixId, - uptime: uptime, - profitMargin: profitMargin, - operatorCost: operatorCost, + uptime, + profitMargin, + operatorCost, totalDelegation: delegations, pledgeAmount: bond, }); diff --git a/nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx b/nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx index bc99898b45..c86be7b22d 100644 --- a/nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/apy-playground/utils.tsx @@ -24,7 +24,7 @@ export const computeEstimate = async ({ operatorCost: string; }) => { const computedEstimate = await computeMixnodeRewardEstimation({ - mixId: mixId, + mixId, performance: percentToDecimal(uptime), pledgeAmount: Math.round(+pledgeAmount * SCALE_FACTOR), totalDelegation: Math.round(+totalDelegation * SCALE_FACTOR), diff --git a/nym-wallet/src/pages/bonding/node-settings/settings-pages/NodeUnbondPage.tsx b/nym-wallet/src/pages/bonding/node-settings/settings-pages/NodeUnbondPage.tsx index 347ed2467a..7cccb8d3f7 100644 --- a/nym-wallet/src/pages/bonding/node-settings/settings-pages/NodeUnbondPage.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/settings-pages/NodeUnbondPage.tsx @@ -4,6 +4,7 @@ import { TBondedMixnode, TBondedGateway } from 'src/context/bonding'; import { Error } from 'src/components/Error'; import { UnbondModal } from 'src/components/Bonding/modals/UnbondModal'; import { isMixnode } from 'src/types'; + interface Props { bondedNode: TBondedMixnode | TBondedGateway; @@ -13,7 +14,7 @@ interface Props { export const NodeUnbondPage = ({ bondedNode, onConfirm, onError }: Props) => { const [confirmField, setConfirmField] = useState(''); const [isConfirmed, setIsConfirmed] = useState(false); - //TODO: Check what happens with a gateway + // TODO: Check what happens with a gateway return ( diff --git a/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/InfoSettings.tsx b/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/InfoSettings.tsx index 31e88a0f31..00a409dab2 100644 --- a/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/InfoSettings.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/InfoSettings.tsx @@ -1,11 +1,11 @@ -import { useState } from 'react'; +import React, { useState } from 'react'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; -import { Button, Divider, Typography, TextField, Grid, CircularProgress, Box } from '@mui/material'; +import { Box, Button, Divider, Grid, TextField, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import { isMixnode } from 'src/types'; import { simulateUpdateMixnodeConfig, simulateVestingUpdateMixnodeConfig, updateMixnodeConfig } from 'src/requests'; -import { TBondedMixnode, TBondedGateway } from 'src/context/bonding'; +import { TBondedGateway, TBondedMixnode } from 'src/context/bonding'; import { SimpleModal } from 'src/components/Modals/SimpleModal'; import { bondedInfoParametersValidationSchema } from 'src/components/Bonding/forms/mixnodeValidationSchema'; import { Console } from 'src/utils/console'; diff --git a/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/ParametersSettings.tsx b/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/ParametersSettings.tsx index b342f32d15..a4e2bac152 100644 --- a/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/ParametersSettings.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/ParametersSettings.tsx @@ -1,7 +1,7 @@ import React, { useContext, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; -import { Button, Divider, Typography, TextField, InputAdornment, Grid, Box, FormHelperText } from '@mui/material'; +import { Box, Button, Divider, FormHelperText, Grid, InputAdornment, TextField, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import { CurrencyDenom, MixNodeCostParams } from '@nymproject/types'; import { CurrencyFormField } from '@nymproject/react/currency/CurrencyFormField'; @@ -88,7 +88,7 @@ export const ParametersSettings = ({ bondedNode }: { bondedNode: TBondedMixnode const onSubmit = async (data: { operatorCost: { amount: string; denom: CurrencyDenom }; profitMargin: string }) => { resetFeeState(); if (data.operatorCost && data.profitMargin) { - const MixNodeCostParams = { + const mixNodeCostParams = { profit_margin_percent: (+data.profitMargin / 100).toString(), interval_operating_cost: { amount: data.operatorCost.amount, @@ -97,9 +97,9 @@ export const ParametersSettings = ({ bondedNode }: { bondedNode: TBondedMixnode }; try { if (bondedNode.proxy) { - await vestingUpdateMixnodeCostParams(MixNodeCostParams); + await vestingUpdateMixnodeCostParams(mixNodeCostParams); } else { - await updateMixnodeCostParams(MixNodeCostParams); + await updateMixnodeCostParams(mixNodeCostParams); } await getPendingEvents(); reset(); @@ -132,13 +132,7 @@ export const ParametersSettings = ({ bondedNode }: { bondedNode: TBondedMixnode /> )} {isSubmitting && } - - {`Next interval: ${intervalTime}`} - - } - /> + {`Next interval: ${intervalTime}`}} /> diff --git a/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/index.tsx b/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/index.tsx index 6597c096f7..edc8ac0f45 100644 --- a/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/index.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/settings-pages/general-settings/index.tsx @@ -1,15 +1,15 @@ import React, { useState } from 'react'; import { Box, Button, Divider, Grid } from '@mui/material'; +import { isMixnode } from 'src/types'; import { TBondedMixnode, TBondedGateway } from '../../../../../context/bonding'; import { InfoSettings } from './InfoSettings'; import { ParametersSettings } from './ParametersSettings'; -import { isMixnode } from 'src/types'; const nodeGeneralNav = ['Info', 'Parameters']; export const NodeGeneralSettings = ({ bondedNode }: { bondedNode: TBondedMixnode | TBondedGateway }) => { const [settingsCard, setSettingsCard] = useState(nodeGeneralNav[0]); - //TODO: Check what happens with a gateway + // TODO: Check what happens with a gateway return ( diff --git a/nym-wallet/src/pages/delegation/index.tsx b/nym-wallet/src/pages/delegation/index.tsx index 50ac86b354..05914742eb 100644 --- a/nym-wallet/src/pages/delegation/index.tsx +++ b/nym-wallet/src/pages/delegation/index.tsx @@ -1,6 +1,6 @@ import React, { FC, useContext, useEffect, useState } from 'react'; -import { Box, Button, Paper, Stack, Typography, CircularProgress } from '@mui/material'; -import { useTheme, Theme } from '@mui/material/styles'; +import { Box, Button, CircularProgress, Paper, Stack, Typography } from '@mui/material'; +import { Theme, useTheme } from '@mui/material/styles'; import { DecCoin, decimalToFloatApproximation, DelegationWithEverything, FeeDetails } from '@nymproject/types'; import { Link } from '@nymproject/react/link/Link'; import { AppContext, urls } from 'src/context/main'; @@ -9,8 +9,9 @@ import { TPoolOption } from 'src/components'; import { Console } from 'src/utils/console'; import { OverSaturatedBlockerModal } from 'src/components/Delegation/DelegateBlocker'; import { getSpendableCoins, userBalance } from 'src/requests'; +import { getIntervalAsDate, toPercentIntegerString } from 'src/utils'; import { RewardsSummary } from '../../components/Rewards/RewardsSummary'; -import { DelegationContextProvider, useDelegationContext, TDelegations } from '../../context/delegations'; +import { DelegationContextProvider, TDelegations, useDelegationContext } from '../../context/delegations'; import { RewardsContextProvider, useRewardsContext } from '../../context/rewards'; import { DelegateModal } from '../../components/Delegation/DelegateModal'; import { UndelegateModal } from '../../components/Delegation/UndelegateModal'; @@ -18,7 +19,6 @@ import { DelegationListItemActions } from '../../components/Delegation/Delegatio import { RedeemModal } from '../../components/Rewards/RedeemModal'; import { DelegationModal, DelegationModalProps } from '../../components/Delegation/DelegationModal'; import { backDropStyles, modalStyles } from '../../../.storybook/storiesStyles'; -import { toPercentIntegerString, getIntervalAsDate } from 'src/utils'; const storybookStyles = (theme: Theme, isStorybook?: boolean, backdropProps?: object) => isStorybook @@ -77,8 +77,8 @@ export const Delegation: FC<{ isStorybook?: boolean }> = ({ isStorybook }) => { const getNextInterval = async () => { try { - const { nextEpoch } = await getIntervalAsDate(); - setNextEpoch(nextEpoch); + const { nextEpoch: newNextEpoch } = await getIntervalAsDate(); + setNextEpoch(newNextEpoch); } catch { setNextEpoch(Error()); } diff --git a/nym-wallet/src/requests/actions.ts b/nym-wallet/src/requests/actions.ts index b4aaa144c0..db4e715fb4 100644 --- a/nym-wallet/src/requests/actions.ts +++ b/nym-wallet/src/requests/actions.ts @@ -33,5 +33,4 @@ export const unbond = async (type: EnumNodeType) => { return unbondGateway(); }; -export const bondMore = async (args: TBondMoreArgs) => - invokeWrapper('pledge_more', args); +export const bondMore = async (args: TBondMoreArgs) => invokeWrapper('pledge_more', args); diff --git a/nym-wallet/src/requests/queries.ts b/nym-wallet/src/requests/queries.ts index 640fc79abb..e80fd313fa 100644 --- a/nym-wallet/src/requests/queries.ts +++ b/nym-wallet/src/requests/queries.ts @@ -1,14 +1,13 @@ import { - StakeSaturationResponse, - MixnodeStatusResponse, - InclusionProbabilityResponse, DecCoin, - MixNodeDetails, GatewayBond, - RewardEstimationResponse, - WrappedDelegationEvent, + InclusionProbabilityResponse, + MixNodeDetails, + MixnodeStatusResponse, PendingIntervalEvent, - Coin, + RewardEstimationResponse, + StakeSaturationResponse, + WrappedDelegationEvent, } from '@nymproject/types'; import { Interval, TGatewayReport, TNodeDescription } from 'src/types'; import { invokeWrapper } from './wrapper'; diff --git a/nym-wallet/src/requests/simulate.ts b/nym-wallet/src/requests/simulate.ts index 4a1b82f0d4..bee1644298 100644 --- a/nym-wallet/src/requests/simulate.ts +++ b/nym-wallet/src/requests/simulate.ts @@ -64,8 +64,7 @@ export const simulateClaimOperatorReward = async () => invokeWrapper export const simulateVestingClaimOperatorReward = async () => invokeWrapper('simulate_vesting_claim_operator_reward'); -export const simulateBondMore = async (args: any) => - invokeWrapper('simulate_pledge_more', args); +export const simulateBondMore = async (args: any) => invokeWrapper('simulate_pledge_more', args); export const simulateVestingBondMore = async (args: any) => invokeWrapper('simulate_vesting_pledge_more', args); diff --git a/nym-wallet/src/requests/vesting.ts b/nym-wallet/src/requests/vesting.ts index bad2f7febf..993910dd14 100644 --- a/nym-wallet/src/requests/vesting.ts +++ b/nym-wallet/src/requests/vesting.ts @@ -106,13 +106,8 @@ export const vestingClaimOperatorReward = async (fee?: Fee) => export const vestingClaimDelegatorRewards = async (mixId: number) => invokeWrapper('vesting_claim_delegator_reward', { mixId }); -export const vestingBondMore = async ({ - fee, - additionalPledge, -}: { - fee?: Fee; - additionalPledge: DecCoin; -}) => invokeWrapper('vesting_pledge_more', { - fee, - additionalPledge, -}); +export const vestingBondMore = async ({ fee, additionalPledge }: { fee?: Fee; additionalPledge: DecCoin }) => + invokeWrapper('vesting_pledge_more', { + fee, + additionalPledge, + }); diff --git a/nym-wallet/src/svg-icons/poweredByBity.tsx b/nym-wallet/src/svg-icons/poweredByBity.tsx index 3b061ae7d3..458a77369f 100644 --- a/nym-wallet/src/svg-icons/poweredByBity.tsx +++ b/nym-wallet/src/svg-icons/poweredByBity.tsx @@ -5,7 +5,7 @@ export const PoweredByBity = (props: SvgIconProps) => ( - + diff --git a/nym-wallet/src/types/global.ts b/nym-wallet/src/types/global.ts index 2c16901cfe..c5f0fc3a95 100644 --- a/nym-wallet/src/types/global.ts +++ b/nym-wallet/src/types/global.ts @@ -1,12 +1,4 @@ -import { - Gateway, - DecCoin, - MixNode, - PledgeData, - MixNodeCostParams, - PendingIntervalEventData, - PendingEpochEventData, -} from '@nymproject/types'; +import { DecCoin, Gateway, MixNode, MixNodeCostParams, PledgeData } from '@nymproject/types'; import { Fee } from '@nymproject/types/dist/types/rust/Fee'; import { TBondedGateway, TBondedMixnode } from 'src/context'; @@ -52,7 +44,6 @@ export type TBondMixNodeArgs = { export type TBondMoreArgs = { additionalPledge: DecCoin; fee?: Fee; - }; export type TNodeDescription = { diff --git a/nym-wallet/src/types/rust/Epoch.ts b/nym-wallet/src/types/rust/Epoch.ts index b9529dc336..21ec4ac2df 100644 --- a/nym-wallet/src/types/rust/Epoch.ts +++ b/nym-wallet/src/types/rust/Epoch.ts @@ -1,3 +1,8 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface Epoch { id: number, start: bigint, end: bigint, duration_seconds: bigint, } \ No newline at end of file +export interface Epoch { + id: number; + start: bigint; + end: bigint; + duration_seconds: bigint; +} diff --git a/nym-wallet/src/types/rust/StateParams.ts b/nym-wallet/src/types/rust/StateParams.ts index c9420f50dc..a394fb0d42 100644 --- a/nym-wallet/src/types/rust/StateParams.ts +++ b/nym-wallet/src/types/rust/StateParams.ts @@ -1,4 +1,4 @@ -import type { DecCoin } from '../../../../ts-packages/types/src/types/rust/DecCoin'; +import type { DecCoin } from '@nymproject/types'; export interface TauriContractStateParams { minimum_mixnode_pledge: DecCoin; diff --git a/nym-wallet/src/utils/index.ts b/nym-wallet/src/utils/index.ts index 936a89e57d..704fe9b80b 100644 --- a/nym-wallet/src/utils/index.ts +++ b/nym-wallet/src/utils/index.ts @@ -3,7 +3,7 @@ import bs58 from 'bs58'; import Big from 'big.js'; import { valid } from 'semver'; import { add, format, fromUnixTime } from 'date-fns'; -import { isValidRawCoin, DecCoin, MixNodeCostParams } from '@nymproject/types'; +import { DecCoin, isValidRawCoin, MixNodeCostParams } from '@nymproject/types'; import { TPoolOption } from 'src/components'; import { getCurrentInterval, @@ -14,8 +14,6 @@ import { } from '../requests'; import { Console } from './console'; -export * from './nextEpoch'; - export const validateKey = (key: string, bytesLength: number): boolean => { // it must be a valid base58 key try { diff --git a/nym-wallet/src/utils/nextEpoch.ts b/nym-wallet/src/utils/nextEpoch.ts deleted file mode 100644 index db80a22280..0000000000 --- a/nym-wallet/src/utils/nextEpoch.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { getCurrentInterval } from 'src/requests'; -import { add, format, fromUnixTime } from 'date-fns'; - -export const getIntervalAsDate = async () => { - const interval = await getCurrentInterval(); - const secondsToNextInterval = - Number(interval.epochs_in_interval - interval.current_epoch_id) * Number(interval.epoch_length_seconds); - - const intervalTime = format( - add(new Date(), { - seconds: secondsToNextInterval, - }), - 'dd/MM/yyyy, HH:mm', - ); - const nextEpoch = format( - add(fromUnixTime(Number(interval.current_epoch_start_unix)), { - seconds: Number(interval.epoch_length_seconds), - }), - 'HH:mm', - ); - - return { intervalTime, nextEpoch }; -}; \ No newline at end of file diff --git a/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx b/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx index 034754d017..0fa57567cd 100644 --- a/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx +++ b/sdk/typescript/examples/react-webpack-with-theme-example/src/App.tsx @@ -69,7 +69,8 @@ export const Content: FCWithChildren = () => { }; const log = React.useRef([]); - const [_logTrigger, setLogTrigger] = React.useState(Date.now()); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [logTrigger, setLogTrigger] = React.useState(Date.now()); const [uploadState, setUploadState] = React.useState({ dialogOpen: false, diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts index e3b9673d30..8d59de9859 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-extraneous-dependencies import { Debug } from '@nymproject/nym-client-wasm'; /** diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts index 063b59894b..f30d82e1dd 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts @@ -11,8 +11,10 @@ import * as Comlink from 'comlink'; // Doing it this way, saves having to support a large variety of bundlers and their quirks. // // @ts-ignore +// eslint-disable-next-line import/no-extraneous-dependencies import wasmBytes from '@nymproject/nym-client-wasm/nym_client_wasm_bg.wasm'; +// eslint-disable-next-line import/no-extraneous-dependencies import init, { NymClient, NymClientBuilder, @@ -46,6 +48,7 @@ console.log('[Nym WASM client] Starting Nym WASM web worker...'); * Helper method to send typed messages. * @param event The strongly typed message to send back to the calling thread. */ +// eslint-disable-next-line no-restricted-globals const postMessageWithType = (event: E) => self.postMessage(event); /** diff --git a/ts-packages/mui-theme/src/theme/network-explorer.ts b/ts-packages/mui-theme/src/theme/network-explorer.ts index 776a07290e..2078a6d0ef 100644 --- a/ts-packages/mui-theme/src/theme/network-explorer.ts +++ b/ts-packages/mui-theme/src/theme/network-explorer.ts @@ -1,7 +1,8 @@ -import { Color, PaletteMode } from '@mui/material'; +import { PaletteMode } from '@mui/material'; import { createTheme, ThemeOptions } from '@mui/material/styles'; import { darkMode, nymPalette, NymPaletteVariant } from './common'; -import { createDarkModePalette, createLightModePalette } from './theme'; +// eslint-disable-next-line import/no-cycle +import { createDarkModePalette, createLightModePalette } from './utils'; /** * A palette definition only for the Network Explorer that extends the Nym palette @@ -53,7 +54,7 @@ export interface NetworkExplorerPalette { backgroud: string; color: string; border: string; - } + }; }; } @@ -111,7 +112,7 @@ export const networkExplorerPalette = (variant: NymPaletteVariant): NetworkExplo backgroud: variant.mode === 'light' ? '#FAFAFA' : '#C7C9CD', color: variant.mode === 'light' ? '#7D7D7D' : '#636466', border: variant.mode === 'light' ? '#DFDEDE' : '#DDDDDD', - } + }, }, }); diff --git a/ts-packages/mui-theme/src/theme/theme.ts b/ts-packages/mui-theme/src/theme/theme.ts index bb4dcae533..2ea995b313 100644 --- a/ts-packages/mui-theme/src/theme/theme.ts +++ b/ts-packages/mui-theme/src/theme/theme.ts @@ -1,8 +1,12 @@ -import { createTheme, Palette, PaletteOptions, ThemeOptions } from '@mui/material/styles'; +import { createTheme, Palette, ThemeOptions } from '@mui/material/styles'; import { PaletteMode } from '@mui/material'; -import { darkMode, lightMode, nymPalette, NymPalette, variantToMUIPalette } from './common'; -import { NymWalletPalette, nymWalletPallete } from './wallet'; -import { networkExplorerPalette, NetworkExplorerPalette } from './network-explorer'; +import { nymPalette, NymPalette } from './common'; +// eslint-disable-next-line import/no-cycle +import { NymWalletPalette } from './wallet'; +// eslint-disable-next-line import/no-cycle +import { NetworkExplorerPalette } from './network-explorer'; +// eslint-disable-next-line import/no-cycle +import { createDarkModePalette, createLightModePalette } from './utils'; /** * To use the theme, copy the file in `../../template/mui-theme.d.ts` into `src/typings/mui-theme.d.ts` in your project. @@ -30,30 +34,6 @@ export interface NymTheme { */ export type NymPaletteWithExtensionsOptions = Partial; -/** - * Returns the Nym palette for light mode. - */ -export const createLightModePalette = (): PaletteOptions & NymPaletteWithExtensionsOptions => ({ - nym: { - ...nymPalette, - ...nymWalletPallete(lightMode), - ...networkExplorerPalette(lightMode), - }, - ...variantToMUIPalette(lightMode), -}); - -/** - * Returns the Nym palette for dark mode. - */ -export const createDarkModePalette = (): PaletteOptions & NymPaletteWithExtensionsOptions => ({ - nym: { - ...nymPalette, - ...nymWalletPallete(darkMode), - ...networkExplorerPalette(darkMode), - }, - ...variantToMUIPalette(darkMode), -}); - /** * Gets the theme options to be passed to `createTheme`. * diff --git a/ts-packages/mui-theme/src/theme/utils.ts b/ts-packages/mui-theme/src/theme/utils.ts new file mode 100644 index 0000000000..a6d74daa7a --- /dev/null +++ b/ts-packages/mui-theme/src/theme/utils.ts @@ -0,0 +1,31 @@ +import { PaletteOptions } from '@mui/material/styles'; +import { darkMode, lightMode, nymPalette, variantToMUIPalette } from './common'; +import { nymWalletPallete } from './wallet'; +// eslint-disable-next-line import/no-cycle +import { networkExplorerPalette } from './network-explorer'; +// eslint-disable-next-line import/no-cycle +import { NymPaletteWithExtensionsOptions } from './theme'; + +/** + * Returns the Nym palette for light mode. + */ +export const createLightModePalette = (): PaletteOptions & NymPaletteWithExtensionsOptions => ({ + nym: { + ...nymPalette, + ...nymWalletPallete(lightMode), + ...networkExplorerPalette(lightMode), + }, + ...variantToMUIPalette(lightMode), +}); + +/** + * Returns the Nym palette for dark mode. + */ +export const createDarkModePalette = (): PaletteOptions & NymPaletteWithExtensionsOptions => ({ + nym: { + ...nymPalette, + ...nymWalletPallete(darkMode), + ...networkExplorerPalette(darkMode), + }, + ...variantToMUIPalette(darkMode), +}); diff --git a/ts-packages/react-components/src/components/banners/MaintenanceBanner.tsx b/ts-packages/react-components/src/components/banners/MaintenanceBanner.tsx index 86e7cd4f2e..6400203708 100644 --- a/ts-packages/react-components/src/components/banners/MaintenanceBanner.tsx +++ b/ts-packages/react-components/src/components/banners/MaintenanceBanner.tsx @@ -1,3 +1,4 @@ +import * as React from 'react'; import { Box, Collapse, Alert, IconButton, Typography, Divider } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import { SxProps } from '@mui/system'; diff --git a/ts-packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx b/ts-packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx index ba45395b4c..bbe7389732 100644 --- a/ts-packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx +++ b/ts-packages/react-components/src/components/coins/CoinMarkTestnet.stories.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; import { ComponentMeta } from '@storybook/react'; import { Stack, Typography } from '@mui/material'; -import { CoinMark } from './CoinMark'; import { CoinMarkTestnet } from './CoinMarkTestnet'; export default { diff --git a/ts-packages/react-components/src/components/currency/Currency.tsx b/ts-packages/react-components/src/components/currency/Currency.tsx index 6c2f394dc0..56f201bc74 100644 --- a/ts-packages/react-components/src/components/currency/Currency.tsx +++ b/ts-packages/react-components/src/components/currency/Currency.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import type { DecCoin } from '@nymproject/types'; -import { Stack, SxProps, Typography } from '@mui/material'; +import { Stack, SxProps } from '@mui/material'; import { CurrencyWithCoinMark } from './CurrencyWithCoinMark'; import { CURRENCY_AMOUNT_SPACING, CurrencyAmount } from './CurrencyAmount'; diff --git a/ts-packages/react-components/src/components/tooltip/Tooltip.stories.tsx b/ts-packages/react-components/src/components/tooltip/Tooltip.stories.tsx index a8960a5986..873295874b 100644 --- a/ts-packages/react-components/src/components/tooltip/Tooltip.stories.tsx +++ b/ts-packages/react-components/src/components/tooltip/Tooltip.stories.tsx @@ -9,16 +9,14 @@ export default { export const Default = () => ; -export const NEStyle = () => { - return ( - - ); -}; +export const NEStyle = () => ( + +); diff --git a/ts-packages/react-components/src/components/tooltip/Tooltip.tsx b/ts-packages/react-components/src/components/tooltip/Tooltip.tsx index 68375649a3..57956dd3ed 100644 --- a/ts-packages/react-components/src/components/tooltip/Tooltip.tsx +++ b/ts-packages/react-components/src/components/tooltip/Tooltip.tsx @@ -1,12 +1,24 @@ import * as React from 'react'; -import { Tooltip as MUITooltip, TooltipProps, IconButton } from '@mui/material'; +import { IconButton, Tooltip as MUITooltip } from '@mui/material'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; export interface CustomTooltipProps { title: string; arrow?: boolean; id: string; - placement?: "bottom" | "left" | "right" | "top" | "bottom-end" | "bottom-start" | "left-end" | "left-start" | "right-end" | "right-start" | "top-end" | "top-start"; + placement?: + | 'bottom' + | 'left' + | 'right' + | 'top' + | 'bottom-end' + | 'bottom-start' + | 'left-end' + | 'left-start' + | 'right-end' + | 'right-start' + | 'top-end' + | 'top-start'; textColor?: string; bgColor?: string; maxWidth?: number; @@ -42,7 +54,7 @@ export const Tooltip = (props: CustomTooltipProps) => { componentsProps={{ tooltip: { sx: { - maxWidth: maxWidth, + maxWidth, background: bgColor, color: textColor, '& .MuiTooltip-arrow': { diff --git a/ts-packages/types/src/types/rust/PendingEpochEvent.ts b/ts-packages/types/src/types/rust/PendingEpochEvent.ts index e775e935c0..3788781f07 100644 --- a/ts-packages/types/src/types/rust/PendingEpochEvent.ts +++ b/ts-packages/types/src/types/rust/PendingEpochEvent.ts @@ -1,7 +1,7 @@ -import type {PendingEpochEventData} from "./PendingEpochEventData"; +import type { PendingEpochEventData } from './PendingEpochEventData'; export interface PendingEpochEvent { - id: number, - created_at: bigint, - event: PendingEpochEventData, + id: number; + created_at: bigint; + event: PendingEpochEventData; } diff --git a/ts-packages/types/src/types/rust/PendingIntervalEvent.ts b/ts-packages/types/src/types/rust/PendingIntervalEvent.ts index 1c72712ef5..29c7e9249a 100644 --- a/ts-packages/types/src/types/rust/PendingIntervalEvent.ts +++ b/ts-packages/types/src/types/rust/PendingIntervalEvent.ts @@ -1,7 +1,7 @@ -import type {PendingIntervalEventData} from "./PendingIntervalEventData"; +import type { PendingIntervalEventData } from './PendingIntervalEventData'; export interface PendingIntervalEvent { - id: number, - created_at: bigint, - event: PendingIntervalEventData, + id: number; + created_at: bigint; + event: PendingIntervalEventData; } diff --git a/ts-packages/webpack/webpack.common.js b/ts-packages/webpack/webpack.common.js index 6c74ed3a13..64c0b8d168 100644 --- a/ts-packages/webpack/webpack.common.js +++ b/ts-packages/webpack/webpack.common.js @@ -61,17 +61,14 @@ module.exports = (baseDir, htmlPath) => ({ plugins: [ // new CleanWebpackPlugin(), - ... Array.isArray(htmlPath) - ? htmlPath.map( - (item) => - new HtmlWebpackPlugin(item), - ) + ...(Array.isArray(htmlPath) + ? htmlPath.map((item) => new HtmlWebpackPlugin(item)) : [ - new HtmlWebpackPlugin({ - filename: 'index.html', - template: path.resolve(baseDir, htmlPath || 'src/index.html'), - }) - ], + new HtmlWebpackPlugin({ + filename: 'index.html', + template: path.resolve(baseDir, htmlPath || 'src/index.html'), + }), + ]), new ForkTsCheckerWebpackPlugin({ typescript: { From d03f769b14fe1f0f5798f65d841f1b48a0e1506d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 23 Jan 2023 09:04:23 +0100 Subject: [PATCH 220/591] nym-api: add endpoint for a list of GatewayBondAnnotated (#2833) --- CHANGELOG.md | 1 + nym-api/nym-api-requests/src/models.rs | 8 ++- nym-api/src/node_status_api/cache/data.rs | 4 +- nym-api/src/node_status_api/cache/mod.rs | 8 ++- .../src/node_status_api/cache/node_sets.rs | 54 ++++++++++++++++--- .../src/node_status_api/cache/refresher.rs | 9 +++- nym-api/src/node_status_api/helpers.rs | 16 ++++-- nym-api/src/node_status_api/mod.rs | 1 + nym-api/src/node_status_api/routes.rs | 19 +++++-- nym-api/src/support/storage/manager.rs | 22 +++++++- nym-api/src/support/storage/mod.rs | 43 ++++++++++++++- 11 files changed, 163 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a78613a7f..c6f60658bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// - nym-sdk: added initial version of a Rust client sdk - nym-api: added `/circulating-supply` endpoint ([#2814]) +- nym-api: add endpoint listing detailed gateway info by @octol in https://github.com/nymtech/nym/pull/2833 ### Changed diff --git a/nym-api/nym-api-requests/src/models.rs b/nym-api/nym-api-requests/src/models.rs index 0c869be09a..237f4ce90d 100644 --- a/nym-api/nym-api-requests/src/models.rs +++ b/nym-api/nym-api-requests/src/models.rs @@ -7,7 +7,7 @@ use mixnet_contract_common::mixnode::MixNodeDetails; use mixnet_contract_common::reward_params::{Performance, RewardingParams}; use mixnet_contract_common::rewarding::RewardEstimate; use mixnet_contract_common::{ - IdentityKey, Interval, MixId, MixNode, Percent, RewardedSetNodeStatus, + GatewayBond, IdentityKey, Interval, MixId, MixNode, Percent, RewardedSetNodeStatus, }; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -114,6 +114,12 @@ impl MixNodeBondAnnotated { } } +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +pub struct GatewayBondAnnotated { + pub gateway_bond: GatewayBond, + pub performance: Performance, +} + #[derive(Debug, Serialize, Deserialize, JsonSchema)] pub struct ComputeRewardEstParam { pub performance: Option, diff --git a/nym-api/src/node_status_api/cache/data.rs b/nym-api/src/node_status_api/cache/data.rs index a7538cd8bf..b1fb52ea6e 100644 --- a/nym-api/src/node_status_api/cache/data.rs +++ b/nym-api/src/node_status_api/cache/data.rs @@ -1,4 +1,4 @@ -use nym_api_requests::models::MixNodeBondAnnotated; +use nym_api_requests::models::{GatewayBondAnnotated, MixNodeBondAnnotated}; use crate::support::caching::Cache; @@ -10,6 +10,8 @@ pub(crate) struct NodeStatusCacheData { pub(crate) rewarded_set_annotated: Cache>, pub(crate) active_set_annotated: Cache>, + pub(crate) gateways_annotated: Cache>, + // Estimated active set inclusion probabilities from Monte Carlo simulation pub(crate) inclusion_probabilities: Cache, } diff --git a/nym-api/src/node_status_api/cache/mod.rs b/nym-api/src/node_status_api/cache/mod.rs index 0bf1e31beb..1d3d94fbc6 100644 --- a/nym-api/src/node_status_api/cache/mod.rs +++ b/nym-api/src/node_status_api/cache/mod.rs @@ -6,7 +6,7 @@ use crate::support::caching::Cache; use self::data::NodeStatusCacheData; use self::inclusion_probabilities::InclusionProbabilities; use mixnet_contract_common::MixId; -use nym_api_requests::models::{MixNodeBondAnnotated, MixnodeStatus}; +use nym_api_requests::models::{GatewayBondAnnotated, MixNodeBondAnnotated, MixnodeStatus}; use rocket::fairing::AdHoc; use std::{sync::Arc, time::Duration}; use thiserror::Error; @@ -58,6 +58,7 @@ impl NodeStatusCache { mixnodes: Vec, rewarded_set: Vec, active_set: Vec, + gateways: Vec, inclusion_probabilities: InclusionProbabilities, ) { match time::timeout(Duration::from_millis(CACHE_TIMEOUT_MS), self.inner.write()).await { @@ -65,6 +66,7 @@ impl NodeStatusCache { cache.mixnodes_annotated.update(mixnodes); cache.rewarded_set_annotated.update(rewarded_set); cache.active_set_annotated.update(active_set); + cache.gateways_annotated.update(gateways); cache .inclusion_probabilities .update(inclusion_probabilities); @@ -99,6 +101,10 @@ impl NodeStatusCache { self.get(|c| c.active_set_annotated.clone()).await } + pub(crate) async fn gateways_annotated(&self) -> Option>> { + self.get(|c| c.gateways_annotated.clone()).await + } + pub(crate) async fn inclusion_probabilities(&self) -> Option> { self.get(|c| c.inclusion_probabilities.clone()).await } diff --git a/nym-api/src/node_status_api/cache/node_sets.rs b/nym-api/src/node_status_api/cache/node_sets.rs index aa1d331ea6..be017c10de 100644 --- a/nym-api/src/node_status_api/cache/node_sets.rs +++ b/nym-api/src/node_status_api/cache/node_sets.rs @@ -2,8 +2,10 @@ use crate::node_status_api::reward_estimate::{compute_apy_from_reward, compute_r use crate::support::storage::NymApiStorage; use mixnet_contract_common::families::FamilyHead; use mixnet_contract_common::{reward_params::Performance, Interval, MixId}; -use mixnet_contract_common::{IdentityKey, MixNodeDetails, RewardedSetNodeStatus, RewardingParams}; -use nym_api_requests::models::MixNodeBondAnnotated; +use mixnet_contract_common::{ + GatewayBond, IdentityKey, MixNodeDetails, RewardedSetNodeStatus, RewardingParams, +}; +use nym_api_requests::models::{GatewayBondAnnotated, MixNodeBondAnnotated}; use std::collections::HashMap; pub(super) fn to_rewarded_set_node_status( @@ -43,7 +45,7 @@ pub(super) fn split_into_active_and_rewarded_set( (rewarded_set, active_set) } -pub(super) async fn get_performance_from_storage( +pub(super) async fn get_mixnode_performance_from_storage( storage: &Option, mix_id: MixId, epoch: Interval, @@ -59,6 +61,22 @@ pub(super) async fn get_performance_from_storage( .map(Into::into) } +pub(super) async fn get_gateway_performance_from_storage( + storage: &Option, + gateway_id: &str, + epoch: Interval, +) -> Option { + storage + .as_ref()? + .get_average_gateway_uptime_in_the_last_24hrs( + gateway_id, + epoch.current_epoch_end_unix_timestamp(), + ) + .await + .ok() + .map(Into::into) +} + pub(super) async fn annotate_nodes_with_details( storage: &Option, mixnodes: Vec, @@ -84,9 +102,10 @@ pub(super) async fn annotate_nodes_with_details( // If the performance can't be obtained, because the nym-api was not started with // the monitoring (and hence, storage), then reward estimates will be all zero - let performance = get_performance_from_storage(storage, mixnode.mix_id(), current_interval) - .await - .unwrap_or_default(); + let performance = + get_mixnode_performance_from_storage(storage, mixnode.mix_id(), current_interval) + .await + .unwrap_or_default(); let rewarded_set_status = rewarded_set.get(&mixnode.mix_id()).copied(); @@ -117,3 +136,26 @@ pub(super) async fn annotate_nodes_with_details( } annotated } + +pub(crate) async fn annotate_gateways_with_details( + storage: &Option, + gateway_bonds: Vec, + current_interval: Interval, +) -> Vec { + let mut annotated = Vec::new(); + for gateway_bond in gateway_bonds { + let performance = get_gateway_performance_from_storage( + storage, + gateway_bond.identity(), + current_interval, + ) + .await + .unwrap_or_default(); + + annotated.push(GatewayBondAnnotated { + gateway_bond, + performance, + }); + } + annotated +} diff --git a/nym-api/src/node_status_api/cache/refresher.rs b/nym-api/src/node_status_api/cache/refresher.rs index 6741aa7f98..704aaca203 100644 --- a/nym-api/src/node_status_api/cache/refresher.rs +++ b/nym-api/src/node_status_api/cache/refresher.rs @@ -3,8 +3,8 @@ use crate::{ node_status_api::cache::{ inclusion_probabilities::InclusionProbabilities, node_sets::{ - annotate_nodes_with_details, split_into_active_and_rewarded_set, - to_rewarded_set_node_status, + annotate_gateways_with_details, annotate_nodes_with_details, + split_into_active_and_rewarded_set, to_rewarded_set_node_status, }, NodeStatusCacheError, }, @@ -115,6 +115,7 @@ impl NodeStatusCacheRefresher { let rewarded_set = self.contract_cache.rewarded_set().await; let active_set = self.contract_cache.active_set().await; let mix_to_family = self.contract_cache.mix_to_family().await; + let gateway_bonds = self.contract_cache.gateways().await; let interval_reward_params = interval_reward_params.ok_or(NodeStatusCacheError::SourceDataMissing)?; @@ -146,12 +147,16 @@ impl NodeStatusCacheRefresher { let (rewarded_set, active_set) = split_into_active_and_rewarded_set(&mixnodes_annotated, &rewarded_set_node_status); + let gateways_annotated = + annotate_gateways_with_details(&self.storage, gateway_bonds, current_interval).await; + // Update the cache self.cache .update( mixnodes_annotated, rewarded_set, active_set, + gateways_annotated, inclusion_probabilities, ) .await; diff --git a/nym-api/src/node_status_api/helpers.rs b/nym-api/src/node_status_api/helpers.rs index aef71cc596..0208d09140 100644 --- a/nym-api/src/node_status_api/helpers.rs +++ b/nym-api/src/node_status_api/helpers.rs @@ -9,10 +9,10 @@ use cosmwasm_std::Decimal; use mixnet_contract_common::reward_params::Performance; use mixnet_contract_common::{Interval, MixId, RewardedSetNodeStatus}; use nym_api_requests::models::{ - AllInclusionProbabilitiesResponse, ComputeRewardEstParam, InclusionProbabilityResponse, - MixNodeBondAnnotated, MixnodeCoreStatusResponse, MixnodeStatusReportResponse, - MixnodeStatusResponse, MixnodeUptimeHistoryResponse, RewardEstimationResponse, - StakeSaturationResponse, UptimeResponse, + AllInclusionProbabilitiesResponse, ComputeRewardEstParam, GatewayBondAnnotated, + InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, + MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, + RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, }; use rocket::http::Status; use rocket::State; @@ -319,3 +319,11 @@ pub(crate) async fn _get_active_set_detailed(cache: &NodeStatusCache) -> Vec Vec { + cache + .gateways_annotated() + .await + .unwrap_or_default() + .into_inner() +} diff --git a/nym-api/src/node_status_api/mod.rs b/nym-api/src/node_status_api/mod.rs index 28e918dad9..8b403ad4c8 100644 --- a/nym-api/src/node_status_api/mod.rs +++ b/nym-api/src/node_status_api/mod.rs @@ -49,6 +49,7 @@ pub(crate) fn node_status_routes( routes::get_mixnodes_detailed, routes::get_rewarded_set_detailed, routes::get_active_set_detailed, + routes::get_gateways_detailed, ] } else { // in the minimal variant we would not have access to endpoints relying on existence diff --git a/nym-api/src/node_status_api/routes.rs b/nym-api/src/node_status_api/routes.rs index 51def235dd..4a11c84527 100644 --- a/nym-api/src/node_status_api/routes.rs +++ b/nym-api/src/node_status_api/routes.rs @@ -1,6 +1,7 @@ // Copyright 2021-2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use super::helpers::_get_gateways_detailed; use super::NodeStatusCache; use crate::node_status_api::helpers::{ _compute_mixnode_reward_estimation, _get_active_set_detailed, _get_mixnode_avg_uptime, @@ -14,11 +15,11 @@ use crate::storage::NymApiStorage; use crate::NymContractCache; use mixnet_contract_common::MixId; use nym_api_requests::models::{ - AllInclusionProbabilitiesResponse, ComputeRewardEstParam, GatewayCoreStatusResponse, - GatewayStatusReportResponse, GatewayUptimeHistoryResponse, InclusionProbabilityResponse, - MixNodeBondAnnotated, MixnodeCoreStatusResponse, MixnodeStatusReportResponse, - MixnodeStatusResponse, MixnodeUptimeHistoryResponse, RewardEstimationResponse, - StakeSaturationResponse, UptimeResponse, + AllInclusionProbabilitiesResponse, ComputeRewardEstParam, GatewayBondAnnotated, + GatewayCoreStatusResponse, GatewayStatusReportResponse, GatewayUptimeHistoryResponse, + InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, + MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, + RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, }; use rocket::http::Status; use rocket::serde::json::Json; @@ -208,3 +209,11 @@ pub async fn get_active_set_detailed( ) -> Json> { Json(_get_active_set_detailed(cache).await) } + +#[openapi(tag = "status")] +#[get("/gateways/detailed")] +pub async fn get_gateways_detailed( + cache: &State, +) -> Json> { + Json(_get_gateways_detailed(cache).await) +} diff --git a/nym-api/src/support/storage/manager.rs b/nym-api/src/support/storage/manager.rs index 9067c09fa0..785aa725f5 100644 --- a/nym-api/src/support/storage/manager.rs +++ b/nym-api/src/support/storage/manager.rs @@ -388,7 +388,7 @@ impl StorageManager { .await } - pub(crate) async fn get_average_reliability_in_interval( + pub(crate) async fn get_mixnode_average_reliability_in_interval( &self, id: i64, start: i64, @@ -408,6 +408,26 @@ impl StorageManager { Ok(result.reliability) } + pub(super) async fn get_gateway_average_reliability_in_interval( + &self, + id: i64, + start: i64, + end: i64, + ) -> Result, sqlx::Error> { + let result = sqlx::query!( + r#" + SELECT AVG(reliability) as "reliability: f32" FROM gateway_status + WHERE gateway_details_id= ? AND timestamp >= ? AND timestamp <= ? + "#, + id, + start, + end + ) + .fetch_one(&self.connection_pool) + .await?; + Ok(result.reliability) + } + /// Gets all reliability statuses for gateway with particular id that were inserted /// into the database within the specified time interval. /// diff --git a/nym-api/src/support/storage/mod.rs b/nym-api/src/support/storage/mod.rs index 1d513defdf..a5529daaa2 100644 --- a/nym-api/src/support/storage/mod.rs +++ b/nym-api/src/support/storage/mod.rs @@ -307,6 +307,16 @@ impl NymApiStorage { .await } + pub(crate) async fn get_average_gateway_uptime_in_the_last_24hrs( + &self, + identity: &str, + end_ts_secs: i64, + ) -> Result { + let start = end_ts_secs - 86400; + self.get_average_gateway_uptime_in_time_interval(identity, start, end_ts_secs) + .await + } + /// Based on the data available in the validator API, determines the average uptime of particular /// mixnode during the specified time interval. /// @@ -328,7 +338,38 @@ impl NymApiStorage { let reliability = self .manager - .get_average_reliability_in_interval(mixnode_database_id, start, end) + .get_mixnode_average_reliability_in_interval(mixnode_database_id, start, end) + .await?; + + if let Some(reliability) = reliability { + Ok(Uptime::new(reliability)) + } else { + Ok(Uptime::zero()) + } + } + + /// Based on the data available in the validator API, determines the average uptime of particular + /// gateway during the specified time interval. + /// + /// # Arguments + /// + /// * `identity`: base58-encoded identity of the gateway. + /// * `since`: unix timestamp indicating the lower bound interval of the selection. + /// * `end`: unix timestamp indicating the upper bound interval of the selection. + pub(crate) async fn get_average_gateway_uptime_in_time_interval( + &self, + identity: &str, + start: i64, + end: i64, + ) -> Result { + let gateway_database_id = match self.manager.get_gateway_id(identity).await? { + Some(id) => id, + None => return Ok(Uptime::zero()), + }; + + let reliability = self + .manager + .get_gateway_average_reliability_in_interval(gateway_database_id, start, end) .await?; if let Some(reliability) = reliability { From e83e83abedd9414405ebd17fb4431b766aed803c Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 23 Jan 2023 11:56:02 +0100 Subject: [PATCH 221/591] Since we have two runners on the same machine apt might get locked. This will allow it to fail, maybe those deps are already installed --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 67d28d826f..402d5e2def 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,7 @@ jobs: steps: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true - name: Check out repository code uses: actions/checkout@v2 From a693fa91906a2eb0734594e6563336476b2da4ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Mon, 23 Jan 2023 11:58:07 +0100 Subject: [PATCH 222/591] Handling edge-case for when no vesting accounts exist (#2888) --- nym-api/src/support/nyxd/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nym-api/src/support/nyxd/mod.rs b/nym-api/src/support/nyxd/mod.rs index 4492fbaa04..7ec23b9780 100644 --- a/nym-api/src/support/nyxd/mod.rs +++ b/nym-api/src/support/nyxd/mod.rs @@ -189,6 +189,9 @@ impl Client { .nyxd .query_contract_raw(vesting_contract, b"key".to_vec()) .await?; + if res.is_empty() { + return Ok(0); + } Ok(serde_json::from_slice(&res).map_err(NyxdError::from)?) } From a0ed1c8edd234d6ec4f839b040ab2915560818c7 Mon Sep 17 00:00:00 2001 From: Dave Hrycyszyn Date: Mon, 23 Jan 2023 12:33:45 +0000 Subject: [PATCH 223/591] Added a few items to the nym-api README --- nym-api/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nym-api/README.md b/nym-api/README.md index 9ed9b223cd..7d3d6c3b49 100644 --- a/nym-api/README.md +++ b/nym-api/README.md @@ -13,7 +13,13 @@ The Nym directory is contained in the mixnet smart contract in the Nyx blockchai Nym Network Monitoring ----------------------- -The Nym API periodically sends test packets through the entire of the Nym mixnet to test node liveness and quality of service. +The Nym API periodically sends test packets through the entire Nym mixnet to test node liveness and quality of service. + + +Nym Epoch Advancement and Payment +--------------------------------- + +The Nym API periodically advances the epoch and triggers payment based on network monitoring measurements. Coconut Credentials From b75199e4dc6f77547e330ce56e677cbdce095492 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 23 Jan 2023 15:43:49 +0100 Subject: [PATCH 224/591] added yarn tsc to typescript check --- .github/workflows/typescript-lint.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/typescript-lint.yml b/.github/workflows/typescript-lint.yml index c8234e0e44..f9671fd6a7 100644 --- a/.github/workflows/typescript-lint.yml +++ b/.github/workflows/typescript-lint.yml @@ -15,6 +15,7 @@ jobs: - uses: actions/checkout@v2 - name: Install rsync run: sudo apt-get install rsync + continue-on-error: true - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: @@ -22,7 +23,7 @@ jobs: - name: Setup yarn run: npm install -g yarn - name: Lint - run: yarn && yarn lint + run: yarn && yarn lint && yarn tsc - name: Keybase - Node Install run: npm install working-directory: .github/workflows/support-files From ded7e51071758eed69430932bb2c7a6c4b8e837a Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 23 Jan 2023 15:47:42 +0100 Subject: [PATCH 225/591] fix: add continue-on-error: true to all apt calls since if it fails due to lock those packages most likely already exist --- .github/workflows/build-ts-packages.yml | 1 + .github/workflows/connect.yml | 1 + .github/workflows/network-explorer-api.yml | 1 + .github/workflows/network-explorer.yml | 1 + .github/workflows/nightly_build.yml | 1 + .github/workflows/nightly_build_release.yml | 1 + .github/workflows/nightly_build_release2.yml | 1 + .github/workflows/nym-connect-publish-ubuntu.yml | 1 + .github/workflows/nym-connect.yml | 1 + .github/workflows/nym-release-publish.yml | 1 + .github/workflows/nym-wallet-publish-ubuntu.yml | 1 + .github/workflows/nym-wallet-storybook.yml | 1 + .github/workflows/nym_wallet.yml | 1 + 13 files changed, 13 insertions(+) diff --git a/.github/workflows/build-ts-packages.yml b/.github/workflows/build-ts-packages.yml index 41c1348ace..82a9d0b9b5 100644 --- a/.github/workflows/build-ts-packages.yml +++ b/.github/workflows/build-ts-packages.yml @@ -12,6 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Install rsync run: sudo apt-get install rsync + continue-on-error: true - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: diff --git a/.github/workflows/connect.yml b/.github/workflows/connect.yml index 1adc4da996..1d56e12ad7 100644 --- a/.github/workflows/connect.yml +++ b/.github/workflows/connect.yml @@ -13,6 +13,7 @@ jobs: steps: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools libayatana-appindicator3-dev + continue-on-error: true - name: Check out repository code uses: actions/checkout@v2 diff --git a/.github/workflows/network-explorer-api.yml b/.github/workflows/network-explorer-api.yml index 5c60038347..86b8a33ac6 100644 --- a/.github/workflows/network-explorer-api.yml +++ b/.github/workflows/network-explorer-api.yml @@ -21,6 +21,7 @@ jobs: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true - name: Check the release tag starts with `nym-explorer-api-` if: startsWith(github.ref, 'refs/tags/nym-explorer-api-') == false && github.event_name != 'workflow_dispatch' diff --git a/.github/workflows/network-explorer.yml b/.github/workflows/network-explorer.yml index 0745026fa9..4ae55435de 100644 --- a/.github/workflows/network-explorer.yml +++ b/.github/workflows/network-explorer.yml @@ -17,6 +17,7 @@ jobs: - uses: actions/checkout@v2 - name: Install rsync run: sudo apt-get install rsync + continue-on-error: true - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index 5a1ee07db3..79eeff6e42 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -25,6 +25,7 @@ jobs: steps: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true if: matrix.os == 'ubuntu-20.04' - name: Check out repository code diff --git a/.github/workflows/nightly_build_release.yml b/.github/workflows/nightly_build_release.yml index 1b749f6f4c..31fb1b1d4c 100644 --- a/.github/workflows/nightly_build_release.yml +++ b/.github/workflows/nightly_build_release.yml @@ -38,6 +38,7 @@ jobs: steps: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true if: matrix.os == 'ubuntu-20.04' - name: Check out latest release branch diff --git a/.github/workflows/nightly_build_release2.yml b/.github/workflows/nightly_build_release2.yml index 12525e7065..69e3570980 100644 --- a/.github/workflows/nightly_build_release2.yml +++ b/.github/workflows/nightly_build_release2.yml @@ -38,6 +38,7 @@ jobs: steps: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true if: matrix.os == 'ubuntu-20.04' - name: Check out latest release branch diff --git a/.github/workflows/nym-connect-publish-ubuntu.yml b/.github/workflows/nym-connect-publish-ubuntu.yml index a4eb77cae1..390c087e4c 100644 --- a/.github/workflows/nym-connect-publish-ubuntu.yml +++ b/.github/workflows/nym-connect-publish-ubuntu.yml @@ -23,6 +23,7 @@ jobs: run: > sudo apt-get update && sudo apt-get install -y webkit2gtk-4.0 libayatana-appindicator3-dev + continue-on-error: true - name: Check the release tag starts with `nym-connect-` if: startsWith(github.ref, 'refs/tags/nym-connect-') == false && github.event_name != 'workflow_dispatch' uses: actions/github-script@v3 diff --git a/.github/workflows/nym-connect.yml b/.github/workflows/nym-connect.yml index b13ff0bafe..e941259252 100644 --- a/.github/workflows/nym-connect.yml +++ b/.github/workflows/nym-connect.yml @@ -16,6 +16,7 @@ jobs: - uses: actions/checkout@v2 - name: Install rsync run: sudo apt-get install rsync + continue-on-error: true - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: diff --git a/.github/workflows/nym-release-publish.yml b/.github/workflows/nym-release-publish.yml index 565834e789..1b100f34ed 100644 --- a/.github/workflows/nym-release-publish.yml +++ b/.github/workflows/nym-release-publish.yml @@ -27,6 +27,7 @@ jobs: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true - name: Check the release tag starts with `nym-binaries-` if: startsWith(github.ref, 'refs/tags/nym-binaries-') == false && github.event_name != 'workflow_dispatch' diff --git a/.github/workflows/nym-wallet-publish-ubuntu.yml b/.github/workflows/nym-wallet-publish-ubuntu.yml index 04ff746851..d0a7e778b2 100644 --- a/.github/workflows/nym-wallet-publish-ubuntu.yml +++ b/.github/workflows/nym-wallet-publish-ubuntu.yml @@ -22,6 +22,7 @@ jobs: run: > sudo apt-get update && sudo apt-get install -y webkit2gtk-4.0 + continue-on-error: true - name: Check the release tag starts with `nym-wallet-` if: startsWith(github.ref, 'refs/tags/nym-wallet-') == false uses: actions/github-script@v3 diff --git a/.github/workflows/nym-wallet-storybook.yml b/.github/workflows/nym-wallet-storybook.yml index c2fbea2d50..7c17893beb 100644 --- a/.github/workflows/nym-wallet-storybook.yml +++ b/.github/workflows/nym-wallet-storybook.yml @@ -12,6 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Install rsync run: sudo apt-get install rsync + continue-on-error: true - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: diff --git a/.github/workflows/nym_wallet.yml b/.github/workflows/nym_wallet.yml index 49b2381ed0..4b921ffb7a 100644 --- a/.github/workflows/nym_wallet.yml +++ b/.github/workflows/nym_wallet.yml @@ -26,6 +26,7 @@ jobs: libappindicator3-dev webkit2gtk-driver xvfb + continue-on-error: true - name: Install minimal stable uses: actions-rs/toolchain@v1 From e1ec3594ea35064268d40b6f666537aa1057efea Mon Sep 17 00:00:00 2001 From: Fouad Date: Mon, 23 Jan 2023 16:33:53 +0000 Subject: [PATCH 226/591] Fix delegations sorting (#2885) * map and sort delegations * allow sorting on profit margin and operator cost * update wallet changelog --- nym-wallet/CHANGELOG.md | 21 +++++----- nym-wallet/Cargo.lock | 2 +- .../components/Delegation/DelegationList.tsx | 40 ++++++++++++++++--- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/nym-wallet/CHANGELOG.md b/nym-wallet/CHANGELOG.md index 7e5efac2f3..d73e728f2a 100644 --- a/nym-wallet/CHANGELOG.md +++ b/nym-wallet/CHANGELOG.md @@ -4,7 +4,8 @@ ## [nym-wallet-v1.1.7](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.7) (2023-01-17) -- link to the ng mixnet explorer for account info ([#2823]) +- link to the ng mixnet explorer for account info ([#2823]) +- Fix delegations sorting ([#2885]) (2023-01-23) [#2823]: https://github.com/nymtech/nym/pull/2823 @@ -21,7 +22,7 @@ This release contains the APY calculator feature. ## [nym-wallet-v1.1.4](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.4) (2022-12-20) -This release contains a bugfix for hiding and displaying the mnemonic, and displays the Bity wallet address in the buy page, as well as better error handling. +This release contains a bugfix for hiding and displaying the mnemonic, and displays the Bity wallet address in the buy page, as well as better error handling. - wallet: present some cases of the more technical errors (abci, ..) in a more human readable form. - Bug fix/hide display mnemonic by @fmtabbara in https://github.com/nymtech/nym/pull/1874 @@ -41,13 +42,12 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ - wallet: compatibility with nym-binaries-1.1.1 - ## [nym-wallet-v1.1.0](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.0) (2022-11-09) - wallet: Add window for showing logs for when the terminal is not available. - wallet: Rework of rewarding ([#1472]) - wallet: Highlight delegations on an unbonded node to notify the delegator to undelegate stake -- wallet: Group delegations on unbonded nodes at the top of the list +- wallet: Group delegations on unbonded nodes at the top of the list - wallet: Simplified delegation screen when user has no delegations - wallet: Update "create password" howto guide - wallet: Allow setting of operating cost when node is bonded @@ -67,7 +67,7 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ - wallet: new bonding flow and screen for bonded node - wallet: compound and redeem functionalities for operator rewards -- wallet: a few minor touch ups and bug fixes +- wallet: a few minor touch ups and bug fixes ## [nym-wallet-v1.0.7](https://github.com/nymtech/nym/tree/nym-wallet-v1.0.7) (2022-07-11) @@ -76,7 +76,6 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ [#1388]: https://github.com/nymtech/nym/pull/1388 - ## [nym-wallet-v1.0.6](https://github.com/nymtech/nym/tree/nym-wallet-v1.0.6) (2022-06-21) - wallet: undelegating now uses either the mixnet or vesting contract, or both, depending on how delegations were made @@ -137,7 +136,7 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ - Type safe bounds [\#1179](https://github.com/nymtech/nym/pull/1179) ([durch](https://github.com/durch)) - Fix delegation paging [\#1174](https://github.com/nymtech/nym/pull/1174) ([durch](https://github.com/durch)) - Update binaries to rc version [\#1172](https://github.com/nymtech/nym/pull/1172) ([tommyv1987](https://github.com/tommyv1987)) -- Bump ansi-regex from 4.1.0 to 4.1.1 in /docker/typescript\_client/upload\_contract [\#1171](https://github.com/nymtech/nym/pull/1171) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump ansi-regex from 4.1.0 to 4.1.1 in /docker/typescript_client/upload_contract [\#1171](https://github.com/nymtech/nym/pull/1171) ([dependabot[bot]](https://github.com/apps/dependabot)) ## [nym-wallet-v1.0.2](https://github.com/nymtech/nym/tree/nym-wallet-v1.0.2) (2022-04-05) @@ -153,7 +152,7 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ - wallet: add test for decrypting stored wallet file [\#1189](https://github.com/nymtech/nym/pull/1189) ([octol](https://github.com/octol)) - Fix clippy warnings [\#1188](https://github.com/nymtech/nym/pull/1188) ([octol](https://github.com/octol)) - Password for wallet with routes [\#1187](https://github.com/nymtech/nym/pull/1187) ([mmsinclair](https://github.com/mmsinclair)) -- wallet: add validate\_mnemonic [\#1186](https://github.com/nymtech/nym/pull/1186) ([octol](https://github.com/octol)) +- wallet: add validate_mnemonic [\#1186](https://github.com/nymtech/nym/pull/1186) ([octol](https://github.com/octol)) - wallet: support removing accounts from the wallet file [\#1185](https://github.com/nymtech/nym/pull/1185) ([octol](https://github.com/octol)) - Feature/adding discord [\#1184](https://github.com/nymtech/nym/pull/1184) ([gala1234](https://github.com/gala1234)) - wallet: config backend for validator selection [\#1183](https://github.com/nymtech/nym/pull/1183) ([octol](https://github.com/octol)) @@ -192,7 +191,7 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ **Closed issues:** - Rewarded set inclusion probability API endpoint [\#1037](https://github.com/nymtech/nym/issues/1037) -- Update cw-storage-plus to 0.11 [\#1032](https://github.com/nymtech/nym/issues/1032) +- Update cw-storage-plus to 0.11 [\#1032](https://github.com/nymtech/nym/issues/1032) - Change `u128` fields in `RewardEstimationResponse` to `u64` [\#1029](https://github.com/nymtech/nym/issues/1029) - Test out the mainnet Gravity Bridge [\#1006](https://github.com/nymtech/nym/issues/1006) - Add vesting contract interface to nym-wallet [\#959](https://github.com/nymtech/nym/issues/959) @@ -214,7 +213,7 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ - Bump follow-redirects from 1.14.1 to 1.14.7 in /clients/native/examples/js-examples/websocket [\#1079](https://github.com/nymtech/nym/pull/1079) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump nanoid from 3.1.23 to 3.2.0 in /clients/native/examples/js-examples/websocket [\#1078](https://github.com/nymtech/nym/pull/1078) ([dependabot[bot]](https://github.com/apps/dependabot)) - Setup basic test for mixnode stats reporting [\#1077](https://github.com/nymtech/nym/pull/1077) ([octol](https://github.com/octol)) -- Make wallet\_address mandatory for mixnode init [\#1076](https://github.com/nymtech/nym/pull/1076) ([octol](https://github.com/octol)) +- Make wallet_address mandatory for mixnode init [\#1076](https://github.com/nymtech/nym/pull/1076) ([octol](https://github.com/octol)) - Tidy nym-mixnode module visibility [\#1075](https://github.com/nymtech/nym/pull/1075) ([octol](https://github.com/octol)) - Feature/wallet login with password [\#1074](https://github.com/nymtech/nym/pull/1074) ([fmtabbara](https://github.com/fmtabbara)) - Add trait to mock client dependency in DelayForwarder [\#1073](https://github.com/nymtech/nym/pull/1073) ([octol](https://github.com/octol)) @@ -223,7 +222,7 @@ This release contains a bugfix for hiding and displaying the mnemonic, and displ - Add @octol as codeowner [\#1068](https://github.com/nymtech/nym/pull/1068) ([octol](https://github.com/octol)) - set-up inclusion probability [\#1067](https://github.com/nymtech/nym/pull/1067) ([fmtabbara](https://github.com/fmtabbara)) - Feature/wasm client [\#1066](https://github.com/nymtech/nym/pull/1066) ([neacsu](https://github.com/neacsu)) -- Changed bech32\_prefix from punk to nymt [\#1064](https://github.com/nymtech/nym/pull/1064) ([jstuczyn](https://github.com/jstuczyn)) +- Changed bech32_prefix from punk to nymt [\#1064](https://github.com/nymtech/nym/pull/1064) ([jstuczyn](https://github.com/jstuczyn)) - Bump nanoid from 3.1.30 to 3.2.0 in /testnet-faucet [\#1063](https://github.com/nymtech/nym/pull/1063) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump nanoid from 3.1.30 to 3.2.0 in /nym-wallet [\#1062](https://github.com/nymtech/nym/pull/1062) ([dependabot[bot]](https://github.com/apps/dependabot)) - Rework vesting contract storage [\#1061](https://github.com/nymtech/nym/pull/1061) ([durch](https://github.com/durch)) diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 094176c68b..09241b5cfa 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -2932,7 +2932,7 @@ dependencies = [ [[package]] name = "nym_wallet" -version = "1.1.6" +version = "1.1.7" dependencies = [ "aes-gcm", "argon2 0.3.4", diff --git a/nym-wallet/src/components/Delegation/DelegationList.tsx b/nym-wallet/src/components/Delegation/DelegationList.tsx index 1e9599b8f1..42f4a5e3a3 100644 --- a/nym-wallet/src/components/Delegation/DelegationList.tsx +++ b/nym-wallet/src/components/Delegation/DelegationList.tsx @@ -12,13 +12,16 @@ import { } from '@mui/material'; import { visuallyHidden } from '@mui/utils'; import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; +import { orderBy as _orderBy } from 'lodash'; import { DelegationWithEverything } from '@nymproject/types'; import { DelegationListItemActions } from './DelegationActions'; -import { DelegationWithEvent, isDelegation, isPendingDelegation, TDelegations } from '../../context/delegations'; +import { isDelegation, isPendingDelegation, TDelegations } from '../../context/delegations'; import { DelegationItem } from './DelegationItem'; import { PendingDelegationItem } from './PendingDelegationItem'; type Order = 'asc' | 'desc'; +type AdditionalTypes = { profit_margin_percent: number; operating_cost: number }; +type SortingKeys = keyof AdditionalTypes | keyof DelegationWithEverything; interface EnhancedTableProps { onRequestSort: (event: React.MouseEvent, property: string) => void; @@ -82,7 +85,8 @@ const EnhancedTableHead: FCWithChildren = ({ order, orderBy, ); }; -const sortByUnbondedMixnodeFirst = (a: DelegationWithEvent) => { +// Pin delegations on unbonded nodes to the top of the list +const sortByUnbondedMixnodeFirst = (a: any) => { if (!a.node_identity) return -1; return 1; }; @@ -95,21 +99,47 @@ export const DelegationList: FCWithChildren<{ // eslint-disable-next-line @typescript-eslint/no-unused-vars }> = ({ isLoading, items, onItemActionClick, explorerUrl }) => { const [order, setOrder] = React.useState('asc'); - const [orderBy, setOrderBy] = React.useState('delegated_on_iso_datetime'); + const [orderBy, setOrderBy] = React.useState('delegated_on_iso_datetime'); - const handleRequestSort = (event: React.MouseEvent, property: string) => { + const handleRequestSort = (event: React.MouseEvent, property: any) => { const isAsc = orderBy === property && order === 'asc'; setOrder(isAsc ? 'desc' : 'asc'); setOrderBy(property); }; + // if sorting by either amount or unclaimed_rewards + // base sorting on their number counterparts + const mapOrderBy = (key: SortingKeys) => { + if (key === 'amount') return 'delegationValue'; + if (key === 'unclaimed_rewards') return 'operatorReward'; + if (key === 'profit_margin_percent') return 'profitMarginValue'; + if (key === 'operating_cost') return 'operatorCostValue'; + return key; + }; + + const mapAndSort = (_items: TDelegations) => { + const map = _items.map((item) => + isDelegation(item) + ? { + ...item, + delegationValue: Number(item.amount.amount), + operatorReward: Number(item.unclaimed_rewards?.amount), + profitMarginValue: Number(item.cost_params?.profit_margin_percent), + operatorCostValue: Number(item.cost_params?.interval_operating_cost), + } + : item, + ); + + return _orderBy(map, mapOrderBy(orderBy), order).sort(sortByUnbondedMixnodeFirst); + }; + return ( {items.length ? ( - items.sort(sortByUnbondedMixnodeFirst).map((item) => { + mapAndSort(items).map((item: any) => { if (isPendingDelegation(item)) return ; if (isDelegation(item)) return ( From 4c19187c787cc6b05858d0b837439a03296fd036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 24 Jan 2023 08:50:59 +0100 Subject: [PATCH 227/591] rust-sdk: start adding rustdoc (#2895) * rust-sdk: start adding some rustdoc * rust-sdk: whole bunch of rustdoc * rustfmt --- .../manually_handle_keys_and_config.rs | 5 +- sdk/rust/nym-sdk/examples/persist_keys.rs | 6 +- sdk/rust/nym-sdk/examples/simple.rs | 4 +- .../examples/simple_but_manually_connect.rs | 6 +- sdk/rust/nym-sdk/src/error.rs | 10 +- sdk/rust/nym-sdk/src/lib.rs | 9 +- sdk/rust/nym-sdk/src/mixnet.rs | 40 +- sdk/rust/nym-sdk/src/mixnet/client.rs | 345 +++++++++++------- sdk/rust/nym-sdk/src/mixnet/config.rs | 2 + .../nym-sdk/src/mixnet/connection_state.rs | 2 +- sdk/rust/nym-sdk/src/mixnet/keys.rs | 15 + sdk/rust/nym-sdk/src/mixnet/paths.rs | 26 +- 12 files changed, 317 insertions(+), 153 deletions(-) diff --git a/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs b/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs index a412a6921a..95b76fd75e 100644 --- a/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs +++ b/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs @@ -10,7 +10,7 @@ async fn main() { let config = mixnet::Config::new(user_chosen_gateway_id, nym_api_endpoints); - let mut client = mixnet::MixnetClientBuilder::new(Some(config), None) + let mut client = mixnet::MixnetClient::builder(Some(config), None) .await .unwrap(); @@ -37,7 +37,8 @@ async fn main() { println!("Our client address is {}", client.nym_address()); // Send important info up the pipe to a buddy - client.send_str("foo.bar@blah", "flappappa").await; + let recipient = mixnet::Recipient::try_from_base58_string("foo.bar@blah").unwrap(); + client.send_str(recipient, "flappappa").await; } #[allow(unused)] diff --git a/sdk/rust/nym-sdk/examples/persist_keys.rs b/sdk/rust/nym-sdk/examples/persist_keys.rs index c4240d484f..dc983e695a 100644 --- a/sdk/rust/nym-sdk/examples/persist_keys.rs +++ b/sdk/rust/nym-sdk/examples/persist_keys.rs @@ -14,7 +14,7 @@ async fn main() { let keys = mixnet::StoragePaths::new_from_dir(mixnet::KeyMode::Keep, &config_dir).unwrap(); // Provide key paths for the client to read/write keys to. - let client = mixnet::MixnetClientBuilder::new(None, Some(keys)) + let client = mixnet::MixnetClient::builder(None, Some(keys)) .await .unwrap(); @@ -26,9 +26,7 @@ async fn main() { println!("Our client nym address is: {our_address}"); // Send a message throught the mixnet to ourselves - client - .send_str(&our_address.to_string(), "hello there") - .await; + client.send_str(*our_address, "hello there").await; println!("Waiting for message"); if let Some(received) = client.wait_for_messages().await { diff --git a/sdk/rust/nym-sdk/examples/simple.rs b/sdk/rust/nym-sdk/examples/simple.rs index d11d4c85a6..a485dbf75e 100644 --- a/sdk/rust/nym-sdk/examples/simple.rs +++ b/sdk/rust/nym-sdk/examples/simple.rs @@ -12,9 +12,7 @@ async fn main() { println!("Our client nym address is: {our_address}"); // Send a message throught the mixnet to ourselves - client - .send_str(&our_address.to_string(), "hello there") - .await; + client.send_str(*our_address, "hello there").await; println!("Waiting for message (ctrl-c to exit)"); client diff --git a/sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs b/sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs index 453ae795bd..5e9a98fa7e 100644 --- a/sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs +++ b/sdk/rust/nym-sdk/examples/simple_but_manually_connect.rs @@ -7,7 +7,7 @@ async fn main() { // Create client builder, including ephemeral keys. The builder can be usable in the context // where you don't want to connect just yet. // Since not storage paths are given, the surb storage will be inactive. - let client = mixnet::MixnetClientBuilder::new(None, None).await.unwrap(); + let client = mixnet::MixnetClient::builder(None, None).await.unwrap(); // Now we connect to the mixnet, using ephemeral keys already created let mut client = client.connect_to_mixnet().await.unwrap(); @@ -17,9 +17,7 @@ async fn main() { println!("Our client nym address is: {our_address}"); // Send a message throught the mixnet to ourselves - client - .send_str(&our_address.to_string(), "hello there") - .await; + client.send_str(*our_address, "hello there").await; println!("Waiting for message"); if let Some(received) = client.wait_for_messages().await { diff --git a/sdk/rust/nym-sdk/src/error.rs b/sdk/rust/nym-sdk/src/error.rs index 6003256ad8..5e835db540 100644 --- a/sdk/rust/nym-sdk/src/error.rs +++ b/sdk/rust/nym-sdk/src/error.rs @@ -1,5 +1,6 @@ use std::path::PathBuf; +/// Top-level Error enum for the mixnet client and its relevant types. #[derive(Debug, thiserror::Error)] pub enum Error { #[error("i/o error: {0}")] @@ -20,9 +21,16 @@ pub enum Error { DontOverwriteGatewayKey(PathBuf), #[error("no gateway config available for writing")] GatewayNotAvailableForWriting, - #[error("expected to received a directory, received: {0}")] ExpectedDirectory(PathBuf), + + #[error("failed to transition to registered state before connection to mixnet")] + FailedToTransitionToRegisteredState, + #[error( + "registering with gateway when the client is already in a registered state is not \ + supported, and likely and user mistake" + )] + ReregisteringGatewayNotSupported, } pub type Result = std::result::Result; diff --git a/sdk/rust/nym-sdk/src/lib.rs b/sdk/rust/nym-sdk/src/lib.rs index de6ec53412..d4306ab336 100644 --- a/sdk/rust/nym-sdk/src/lib.rs +++ b/sdk/rust/nym-sdk/src/lib.rs @@ -1,2 +1,9 @@ -pub mod error; +//! Rust SDK for the Nym platform +//! +//! The main component currently is [`mixnet`]. + +mod error; + pub mod mixnet; + +pub use error::{Error, Result}; diff --git a/sdk/rust/nym-sdk/src/mixnet.rs b/sdk/rust/nym-sdk/src/mixnet.rs index 1428d6ae45..c4c4164958 100644 --- a/sdk/rust/nym-sdk/src/mixnet.rs +++ b/sdk/rust/nym-sdk/src/mixnet.rs @@ -1,17 +1,47 @@ +//! The mixnet component of the Rust SDK for the Nym platform +//! +//! +//! # Basic example +//! +//! ```no_run +//! use nym_sdk::mixnet; +//! +//! #[tokio::main] +//! async fn main() { +//! // Passing no config makes the client fire up an ephemeral session and figure stuff out on +//! // its own +//! let mut client = mixnet::MixnetClient::connect().await.unwrap(); +//! +//! // Be able to get our client address +//! let our_address = client.nym_address(); +//! println!("Our client nym address is: {our_address}"); +//! +//! // Send a message throught the mixnet to ourselves +//! client.send_str(*our_address, "hello there").await; +//! +//! println!("Waiting for message"); +//! if let Some(received) = client.wait_for_messages().await { +//! for r in received { +//! println!("Received: {}", String::from_utf8_lossy(&r.message)); +//! } +//! } +//! +//! client.disconnect().await; +//! } +//! ``` + mod client; mod config; mod connection_state; mod keys; mod paths; +pub use client::{MixnetClient, MixnetClientBuilder}; pub use client_core::config::GatewayEndpointConfig; +pub use config::Config; +pub use keys::{Keys, KeysArc}; pub use nymsphinx::{ addressing::clients::{ClientIdentity, Recipient}, receiver::ReconstructedMessage, }; - -pub use keys::{Keys, KeysArc}; pub use paths::{GatewayKeyMode, KeyMode, StoragePaths}; - -pub use client::{MixnetClient, MixnetClientBuilder}; -pub use config::Config; diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 9a7df7ee96..4de5f04a81 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -24,10 +24,18 @@ use task::TaskManager; use futures::StreamExt; use validator_client::nyxd::SigningNyxdClient; -use super::{connection_state::BuilderState, Config, GatewayKeyMode, Keys, KeysArc, StoragePaths}; -use crate::error::{Error, Result}; +use crate::{Error, Result}; -pub struct MixnetClientBuilder { +use super::{connection_state::BuilderState, Config, GatewayKeyMode, Keys, KeysArc, StoragePaths}; + +/// Represents a client that is not yet connected to the mixnet. You typically create one when you +/// want to have a separate configuration and connection phase. Once the mixnet client builder is +/// configured, call [`MixnetClientBuilder::connect_to_mixnet()`] to transition to a connected +/// client. +pub struct MixnetClientBuilder +where + B: ReplyStorageBackend, +{ /// Keys handled by the client key_manager: KeyManager, @@ -45,105 +53,10 @@ pub struct MixnetClientBuilder { reply_storage_backend: B, } -impl MixnetClientBuilder { - /// Create a new mixnet client. If no config options are supplied, creates a new client with - /// ephemeral keys stored in RAM, which will be discarded at application close. - /// - /// Callers have the option of supplying futher parameters to store persistent identities at a - /// location on-disk, if desired. - pub async fn new(config: Option, paths: Option) -> Result { - let config = config.unwrap_or_default(); - - let reply_surb_database_path = paths.as_ref().map(|p| p.reply_surb_database_path.clone()); - - let reply_storage_backend = non_wasm_helpers::setup_fs_reply_surb_backend( - reply_surb_database_path, - &config.debug_config, - ) - .await?; - - MixnetClientBuilder::new_with_custom_storage(Some(config), paths, reply_storage_backend) - } -} - -impl MixnetClientBuilder { - /// Create a new mixnet client. If no config options are supplied, creates a new client with - /// ephemeral keys stored in RAM, which will be discarded at application close. - /// - /// Callers have the option of supplying futher parameters to store persistent identities at a - /// location on-disk, if desired. - pub fn new_without_storage( - config: Option, - paths: Option, - ) -> Result { - let config = config.unwrap_or_default(); - - let reply_storage_backend = - non_wasm_helpers::setup_empty_reply_surb_backend(&config.debug_config); - - MixnetClientBuilder::new_with_custom_storage(Some(config), paths, reply_storage_backend) - } -} - impl MixnetClientBuilder where B: ReplyStorageBackend + Sync + Send + 'static, { - /// Create a new mixnet client. If no config options are supplied, creates a new client with - /// ephemeral keys stored in RAM, which will be discarded at application close. - /// - /// Callers have the option of supplying futher parameters to store persistent identities at a - /// location on-disk, if desired. - /// - /// A custom storage backend can be passed in. - pub fn new_with_custom_storage( - config_option: Option, - paths: Option, - reply_storage_backend: B, - ) -> Result { - let config = config_option.unwrap_or_default(); - - // If we are provided paths to keys, use them if they are available. And if they are - // not, write the generated keys back to storage. - let key_manager = if let Some(ref paths) = paths { - let path_finder = ClientKeyPathfinder::from(paths.clone()); - - // Try load keys - match KeyManager::load_keys_but_gateway_is_optional(&path_finder) { - Ok(key_manager) => key_manager, - Err(err) => { - log::debug!("Not loading keys: {err}"); - if let Some(path) = path_finder.any_file_exists_and_return() { - if paths.operating_mode.is_keep() { - return Err(Error::DontOverwrite(path)); - } - } - - // Double check using a function that has slightly different internal logic. I - // know this is a bit defensive, but I don't want to overwrite - assert!(!(path_finder.any_file_exists() && paths.operating_mode.is_keep())); - - // Create new keys and write to storage - let key_manager = client_core::init::new_client_keys(); - // WARN: this will overwrite! - key_manager.store_keys(&path_finder)?; - key_manager - } - } - } else { - // Ephemeral keys that we only store in memory - client_core::init::new_client_keys() - }; - - Ok(Self { - key_manager, - config, - storage_paths: paths, - state: BuilderState::New, - reply_storage_backend, - }) - } - /// Client keys are generated at client creation if none were found. The gateway shared /// key, however, is created during the gateway registration handshake so it might not /// necessarily be available. @@ -151,6 +64,7 @@ where self.key_manager.is_gateway_key_set() } + /// Sets the keys of this [`MixnetClientBuilder`]. pub fn set_keys(&mut self, keys: Keys) { self.key_manager.set_identity_keypair(keys.identity_keypair); self.key_manager @@ -161,25 +75,35 @@ where .insert_gateway_shared_key(Arc::new(keys.gateway_shared_key)); } + /// Returns the keys of this [`MixnetClientBuilder`]. Client keys are always available since + /// if none are specified at creation time, new random ones are generated. pub fn get_keys(&self) -> KeysArc { KeysArc::from(&self.key_manager) } + /// Sets the gateway endpoint of this [`MixnetClientBuilder`]. pub fn set_gateway_endpoint(&mut self, gateway_endpoint_config: GatewayEndpointConfig) { self.state = BuilderState::Registered { gateway_endpoint_config, } } + /// Returns the get gateway endpoint of this [`MixnetClientBuilder`]. pub fn get_gateway_endpoint(&self) -> Option<&GatewayEndpointConfig> { self.state.gateway_endpoint_config() } + /// Register with a gateway. If a gateway is provided in the config then that will try to be + /// used. If none is specified, a gateway at random will be picked. + /// + /// # Errors + /// + /// This function will return an error if you try to re-register when in an already registered + /// state. pub async fn register_with_gateway(&mut self) -> Result<()> { - assert!( - matches!(self.state, BuilderState::New), - "can only setup gateway when in `New` connection state" - ); + if self.state != BuilderState::New { + return Err(Error::ReregisteringGatewayNotSupported); + } let user_chosen_gateway = self .config @@ -237,7 +161,24 @@ where Ok(()) } - /// Connects to the mixnet via the gateway in the client config + /// Connect the client to the mixnet. + /// + /// - If the client is already registered with a gateway, use that gateway. + /// - If no gateway is registered, but there is an existing configuration and key, use that. + /// - If no gateway is registered, and there is no pre-existing configuration or key, try to + /// register a new gateway. + /// + /// # Example + /// + /// ```no_run + /// use nym_sdk::mixnet; + /// + /// #[tokio::main] + /// async fn main() { + /// let client = mixnet::MixnetClient::builder(None, None).await.unwrap(); + /// let client = client.connect_to_mixnet().await.unwrap(); + /// } + /// ``` pub async fn connect_to_mixnet(mut self) -> Result where ::StorageError: Sync + Send, @@ -269,7 +210,7 @@ where // At this point we should be in a registered state, either at function entry or by the // above convenience logic. let BuilderState::Registered { gateway_endpoint_config } = self.state else { - todo!(); + return Err(Error::FailedToTransitionToRegisteredState); }; let nym_address = @@ -278,7 +219,7 @@ where // TODO: we currently don't support having a bandwidth controller let bandwidth_controller = None; - let base_builder: BaseClientBuilder<_, SigningNyxdClient> = BaseClientBuilder::new( + let base_builder: BaseClientBuilder<'_, _, SigningNyxdClient> = BaseClientBuilder::new( &gateway_endpoint_config, &self.config.debug_config, self.key_manager.clone(), @@ -288,13 +229,13 @@ where self.config.nym_api_endpoints.clone(), ); - let mut started_client = base_builder.start_base().await.unwrap(); + let mut started_client = base_builder.start_base().await?; let client_input = started_client.client_input.register_producer(); let mut client_output = started_client.client_output.register_consumer(); let client_state = started_client.client_state; // Register our receiver - let reconstructed_receiver = client_output.register_receiver().unwrap(); + let reconstructed_receiver = client_output.register_receiver()?; Ok(MixnetClient { nym_address, @@ -308,31 +249,170 @@ where } } +/// Client connected to the Nym mixnet. pub struct MixnetClient { + /// The nym address of this connected client. nym_address: Recipient, /// Keys handled by the client key_manager: KeyManager, + /// Input to the client from the users perspective. This can be either data to send or controll + /// messages. client_input: ClientInput, + /// Output from the client from the users perspective. This is typically messages arriving from + /// the mixnet. #[allow(dead_code)] client_output: ClientOutput, + /// The current state of the client that is exposed to the user. This includes things like + /// current message send queue length. #[allow(dead_code)] client_state: ClientState, + /// A channel for messages arriving from the mixnet after they have been reconstructed. reconstructed_receiver: ReconstructedMessagesReceiver, + /// The task manager that controlls all the spawned tasks that the clients uses to do it's job. task_manager: TaskManager, } impl MixnetClient { + /// Create a new client and connect to the mixnet using ephemeral in-memory keys that are + /// discarded at application close. + /// + /// # Examples + /// + /// ```no_run + /// use nym_sdk::mixnet; + /// + /// #[tokio::main] + /// async fn main() { + /// let mut client = mixnet::MixnetClient::connect().await; + /// } + /// + /// ``` pub async fn connect() -> Result { - let client = MixnetClientBuilder::new_without_storage(None, None)?; + let client = MixnetClient::builder_without_storage(None, None)?; client.connect_to_mixnet().await } + /// Create a new mixnet client builder. If no config options are supplied, creates a new client + /// with ephemeral keys stored in RAM, which will be discarded at application close. + /// + /// Callers have the option of supplying futher parameters to store persistent identities at a + /// location on-disk, if desired. + /// + /// # Examples + /// + /// ```no_run + /// use nym_sdk::mixnet; + /// + /// #[tokio::main] + /// async fn main() { + /// let client = mixnet::MixnetClient::builder(None, None).await; + /// } + /// ``` + pub async fn builder( + config: Option, + paths: Option, + ) -> Result> { + let config = config.unwrap_or_default(); + + let reply_surb_database_path = paths.as_ref().map(|p| p.reply_surb_database_path.clone()); + + let reply_storage_backend = non_wasm_helpers::setup_fs_reply_surb_backend( + reply_surb_database_path, + &config.debug_config, + ) + .await?; + + MixnetClient::builder_with_custom_storage(Some(config), paths, reply_storage_backend) + } + + /// Create a new mixnet client builder. If no config options are supplied, creates a new client with + /// ephemeral keys stored in RAM, which will be discarded at application close. + /// + /// Callers have the option of supplying futher parameters to store persistent identities at a + /// location on-disk, if desired. + /// + /// # Examples + /// + /// ``` + /// use nym_sdk::mixnet; + /// let client = mixnet::MixnetClient::builder_without_storage(None, None); + /// ``` + pub fn builder_without_storage( + config: Option, + paths: Option, + ) -> Result> { + let config = config.unwrap_or_default(); + + let reply_storage_backend = + non_wasm_helpers::setup_empty_reply_surb_backend(&config.debug_config); + + MixnetClient::builder_with_custom_storage(Some(config), paths, reply_storage_backend) + } + + /// Create a new mixnet client builder. If no config options are supplied, creates a new client with + /// ephemeral keys stored in RAM, which will be discarded at application close. + /// + /// Callers have the option of supplying futher parameters to store persistent identities at a + /// location on-disk, if desired. + /// + /// A custom storage backend can be passed in. + pub fn builder_with_custom_storage( + config_option: Option, + paths: Option, + reply_storage_backend: B, + ) -> Result> + where + B: ReplyStorageBackend, + { + let config = config_option.unwrap_or_default(); + + // If we are provided paths to keys, use them if they are available. And if they are + // not, write the generated keys back to storage. + let key_manager = if let Some(ref paths) = paths { + let path_finder = ClientKeyPathfinder::from(paths.clone()); + + // Try load keys + match KeyManager::load_keys_but_gateway_is_optional(&path_finder) { + Ok(key_manager) => key_manager, + Err(err) => { + log::debug!("Not loading keys: {err}"); + if let Some(path) = path_finder.any_file_exists_and_return() { + if paths.operating_mode.is_keep() { + return Err(Error::DontOverwrite(path)); + } + } + + // Double check using a function that has slightly different internal logic. I + // know this is a bit defensive, but I don't want to overwrite + assert!(!(path_finder.any_file_exists() && paths.operating_mode.is_keep())); + + // Create new keys and write to storage + let key_manager = client_core::init::new_client_keys(); + // WARN: this will overwrite! + key_manager.store_keys(&path_finder)?; + key_manager + } + } + } else { + // Ephemeral keys that we only store in memory + client_core::init::new_client_keys() + }; + + Ok(MixnetClientBuilder { + key_manager, + config, + storage_paths: paths, + state: BuilderState::New, + reply_storage_backend, + }) + } + /// Get the client identity, which is the public key of the identity key pair. pub fn identity(&self) -> ClientIdentity { *self.key_manager.identity_keypair().public_key() @@ -345,39 +425,59 @@ impl MixnetClient { } /// Sends stringy data to the supplied Nym address - pub async fn send_str(&self, address: &str, message: &str) { + pub async fn send_str(&self, address: Recipient, message: &str) { let message_bytes = message.to_string().into_bytes(); self.send_bytes(address, message_bytes).await; } /// Sends stringy data to the supplied Nym address, and skip sending reply-SURBs - pub async fn send_str_direct(&self, address: &str, message: &str) { + pub async fn send_str_direct(&self, address: Recipient, message: &str) { let message_bytes = message.to_string().into_bytes(); self.send_bytes(address, message_bytes).await; } /// Sends bytes to the supplied Nym address - pub async fn send_bytes(&self, address: &str, message: Vec) { + /// + /// # Example + /// + /// ```no_run + /// use nym_sdk::mixnet; + /// + /// #[tokio::main] + /// async fn main() { + /// let address = "foobar"; + /// let recipient = mixnet::Recipient::try_from_base58_string(address).unwrap(); + /// let mut client = mixnet::MixnetClient::connect().await.unwrap(); + /// client.send_bytes(recipient, "hi".to_owned().into_bytes()).await; + /// } + /// ``` + pub async fn send_bytes(&self, address: Recipient, message: Vec) { let lane = TransmissionLane::General; - let recipient = Recipient::try_from_base58_string(address).unwrap(); - let input_msg = InputMessage::new_anonymous(recipient, message, 20, lane); - self.client_input + let input_msg = InputMessage::new_anonymous(address, message, 20, lane); + if self + .client_input .input_sender .send(input_msg) .await - .unwrap(); + .is_err() + { + log::error!("Failed to send message"); + } } /// Sends bytes to the supplied Nym address, and skip sending reply-SURBs - pub async fn send_bytes_direct(&self, address: &str, message: Vec) { + pub async fn send_bytes_direct(&self, address: Recipient, message: Vec) { let lane = TransmissionLane::General; - let recipient = Recipient::try_from_base58_string(address).unwrap(); - let input_msg = InputMessage::new_regular(recipient, message, lane); - self.client_input + let input_msg = InputMessage::new_regular(address, message, lane); + if self + .client_input .input_sender .send(input_msg) .await - .unwrap(); + .is_err() + { + log::error!("Failed to send message"); + } } /// Wait for messages from the mixnet @@ -385,10 +485,7 @@ impl MixnetClient { self.reconstructed_receiver.next().await } - pub fn wait_for_messages_split(&mut self) -> Option { - todo!(); - } - + /// Provide a callback to execute on incoming messages from the mixnet. pub async fn on_messages(&mut self, fun: F) where F: Fn(ReconstructedMessage), diff --git a/sdk/rust/nym-sdk/src/mixnet/config.rs b/sdk/rust/nym-sdk/src/mixnet/config.rs index 641b1c01a5..b5705cae92 100644 --- a/sdk/rust/nym-sdk/src/mixnet/config.rs +++ b/sdk/rust/nym-sdk/src/mixnet/config.rs @@ -2,6 +2,7 @@ use client_core::config::DebugConfig; use network_defaults::mainnet; use url::Url; +/// Config struct for [`crate::mixnet::MixnetClient`] pub struct Config { /// If the user has explicitly specified a gateway. pub user_chosen_gateway: Option, @@ -26,6 +27,7 @@ impl Default for Config { } impl Config { + /// Creates a new [`Config`]. pub fn new(user_chosen_gateway: Option, nym_api_endpoints: Vec) -> Self { Self { user_chosen_gateway, diff --git a/sdk/rust/nym-sdk/src/mixnet/connection_state.rs b/sdk/rust/nym-sdk/src/mixnet/connection_state.rs index 2988948a60..611184298b 100644 --- a/sdk/rust/nym-sdk/src/mixnet/connection_state.rs +++ b/sdk/rust/nym-sdk/src/mixnet/connection_state.rs @@ -1,6 +1,6 @@ use client_core::config::GatewayEndpointConfig; -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub(super) enum BuilderState { New, Registered { diff --git a/sdk/rust/nym-sdk/src/mixnet/keys.rs b/sdk/rust/nym-sdk/src/mixnet/keys.rs index 76a3bab39d..5d1a1d8f98 100644 --- a/sdk/rust/nym-sdk/src/mixnet/keys.rs +++ b/sdk/rust/nym-sdk/src/mixnet/keys.rs @@ -5,17 +5,32 @@ use crypto::asymmetric::{encryption, identity}; use gateway_requests::registration::handshake::SharedKeys; use nymsphinx::acknowledgements::AckKey; +/// The set of keys used by the client. Identity, encryption and ack keys are generated at creating +/// unless specified to loaded from storage or somehow explictly specified. The gateway shared key +/// is generated when registering with a gateway. pub struct Keys { + /// The identity key of the client. pub identity_keypair: identity::KeyPair, + /// The encryption key of the client. pub encryption_keypair: encryption::KeyPair, + /// The ack key used by the client. pub ack_key: AckKey, + + /// The gateway shared key that is obtained after registering with a gateway. pub gateway_shared_key: SharedKeys, } +/// The set of keys used by the client, but where each key is stored in an [`std::sync::Arc`] for +/// easy cloning. pub struct KeysArc { + /// The identity key of the client. pub identity_keypair: Arc, + /// The encryption key of the client. pub encryption_keypair: Arc, + /// The ack key used by the client. pub ack_key: Arc, + + /// The gateway shared key that is obtained after registering with a gateway. pub gateway_shared_key: Arc, } diff --git a/sdk/rust/nym-sdk/src/mixnet/paths.rs b/sdk/rust/nym-sdk/src/mixnet/paths.rs index 852da6c9e9..ccf0da2640 100644 --- a/sdk/rust/nym-sdk/src/mixnet/paths.rs +++ b/sdk/rust/nym-sdk/src/mixnet/paths.rs @@ -30,36 +30,46 @@ impl GatewayKeyMode { } } +/// Set of storage paths that the client will use if it is setup to persist keys, credentials, and +/// reply-SURBs. #[derive(Clone, Debug)] pub struct StoragePaths { - // Determines how to handle existing key files found. + /// Determines how to handle existing key files found. pub operating_mode: KeyMode, - // Client identity keys + /// Client private identity key pub private_identity: PathBuf, + /// Client public identity key pub public_identity: PathBuf, - // Client encryption keys + /// Client private encryption key pub private_encryption: PathBuf, + /// Client public encryption key pub public_encryption: PathBuf, - // Key for handling acks + /// Key for handling acks pub ack_key: PathBuf, - // Key setup after authenticating with a gateway + /// Key setup after authenticating with a gateway pub gateway_shared_key: PathBuf, - // The key isn't much use without knowing which entity it refers to. + /// The key isn't much use without knowing which entity it refers to. pub gateway_endpoint_config: PathBuf, - // The database containing credentials + /// The database containing credentials pub credential_database_path: PathBuf, - // The database storing reply surbs in-between sessions + /// The database storing reply surbs in-between sessions pub reply_surb_database_path: PathBuf, } impl StoragePaths { + /// Create a set of storage paths from a given directory. + /// + /// # Errors + /// + /// This function will return an error if it is passed a path to an existing file instead of a + /// directory. pub fn new_from_dir(operating_mode: KeyMode, dir: &Path) -> Result { if dir.is_file() { return Err(Error::ExpectedDirectory(dir.to_owned())); From 48af0ae6b481e4c02972ec1eb6b3c3fb2995df3f Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Tue, 24 Jan 2023 09:15:07 +0100 Subject: [PATCH 228/591] feat(explorer): copy changes (#2892) --- explorer/src/components/MixNodes/Economics/Columns.ts | 2 +- explorer/src/pages/Mixnodes/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/explorer/src/components/MixNodes/Economics/Columns.ts b/explorer/src/components/MixNodes/Economics/Columns.ts index 133551bcc6..3c20e0eebd 100644 --- a/explorer/src/components/MixNodes/Economics/Columns.ts +++ b/explorer/src/components/MixNodes/Economics/Columns.ts @@ -31,7 +31,7 @@ export const EconomicsInfoColumns: ColumnsType[] = [ flex: 1, headerAlign: 'left', tooltipInfo: - 'Level of stake saturation for this node. Nodes receive more rewards the higher their saturation level, up to 100%. Beyond 100% no additional rewards are granted. The current stake saturation level is: 750k NYM, computed as S/K where S is total amount of tokens available to stakeholders and K is the number of nodes in the reward set.', + 'Level of stake saturation for this node. Nodes receive more rewards the higher their saturation level, up to 100%. Beyond 100% no additional rewards are granted. The current stake saturation level is 730k NYM, computed as S/K where S is target amount of tokens staked in the network and K is the number of nodes in the reward set.', }, { field: 'profitMargin', diff --git a/explorer/src/pages/Mixnodes/index.tsx b/explorer/src/pages/Mixnodes/index.tsx index f199a7adc8..5aaa02640f 100644 --- a/explorer/src/pages/Mixnodes/index.tsx +++ b/explorer/src/pages/Mixnodes/index.tsx @@ -149,7 +149,7 @@ export const PageMixnodes: FCWithChildren = () => { renderHeader: () => ( ), headerClassName: 'MuiDataGrid-header-override', From 17771b57428ae13934318c0a004f4fe4c8d6ec39 Mon Sep 17 00:00:00 2001 From: Fouad Date: Tue, 24 Jan 2023 08:27:38 +0000 Subject: [PATCH 229/591] Fix NC Build (#2893) * check if sx prop is array or not fix sx prop breakage yarn lock update * return dist folder * update lock file --- .../Growth/TestAndEarnCurrentDraw.tsx | 2 +- .../components/Growth/TestAndEarnTakePart.tsx | 2 +- yarn.lock | 9931 +++++------------ 3 files changed, 2573 insertions(+), 7362 deletions(-) diff --git a/nym-connect/src/components/Growth/TestAndEarnCurrentDraw.tsx b/nym-connect/src/components/Growth/TestAndEarnCurrentDraw.tsx index f5bd5a7003..b1b2bb951a 100644 --- a/nym-connect/src/components/Growth/TestAndEarnCurrentDraw.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnCurrentDraw.tsx @@ -151,7 +151,7 @@ export const TestAndEarnCurrentDraw: FCWithChildren<{ if (draw && closesIn && endsUtc) { return ( - +

{"Today's task ends "} diff --git a/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx b/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx index 9238c8ce75..b8a096acf6 100644 --- a/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx @@ -41,7 +41,7 @@ export const TestAndEarnTakePart: FCWithChildren<{ }; return ( <> - + setAgree(checked)} /> diff --git a/yarn.lock b/yarn.lock index 46dc81dc27..07c6d1bd97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,25 +3,17 @@ "@adobe/css-tools@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" - integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.2.tgz#bd7d13543a186c3ff3eabb44bec2b22e8fb18ee0" + integrity sha512-Fx6tYjk2wKUgLi8uMANZr8GNZx05u44ArIJldn9VxLvolzlJVgHbTUCbwhMd6bcYky178+WUSxPHO3DAtGLWpw== "@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@jridgewell/trace-mapping" "^0.3.0" - -"@apideck/better-ajv-errors@^0.3.1": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" - integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== - dependencies: - json-schema "^0.4.0" - jsonpointer "^5.0.0" - leven "^3.1.0" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" "@babel/code-frame@7.12.11": version "7.12.11" @@ -30,25 +22,13 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" - integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== - "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.20.10" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" @@ -76,28 +56,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.15.0", "@babel/core@^7.15.5", "@babel/core@^7.17.5", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": - version "7.17.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" - integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.3" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - -"@babel/core@^7.11.1", "@babel/core@^7.16.0": +"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.15.0", "@babel/core@^7.17.5", "@babel/core@^7.19.6", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== @@ -118,25 +77,7 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/eslint-parser@^7.16.3": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" - integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.0" - -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.17.3", "@babel/generator@^7.7.2": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" - integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.20.7": +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.20.7", "@babel/generator@^7.7.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== @@ -145,13 +86,6 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -159,14 +93,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" @@ -175,17 +101,7 @@ "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== @@ -196,33 +112,7 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1", "@babel/helper-create-class-features-plugin@^7.17.6": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" - integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-class-features-plugin@^7.17.12": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" - integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== @@ -236,14 +126,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" - integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" - "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" @@ -266,20 +148,6 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" @@ -292,25 +160,11 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -318,23 +172,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" @@ -343,20 +180,6 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -364,20 +187,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" - integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-member-expression-to-functions@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== - dependencies: - "@babel/types" "^7.17.0" - "@babel/helper-member-expression-to-functions@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" @@ -385,35 +194,14 @@ dependencies: "@babel/types" "^7.20.7" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6": +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" - integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== @@ -427,13 +215,6 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" @@ -446,30 +227,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-plugin-utils@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" - integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== - -"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": +"@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.13.0", "@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.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - "@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" @@ -480,17 +242,6 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" @@ -503,13 +254,6 @@ "@babel/traverse" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-simple-access@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" @@ -517,13 +261,6 @@ dependencies: "@babel/types" "^7.20.2" -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" @@ -531,13 +268,6 @@ dependencies: "@babel/types" "^7.20.0" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" @@ -550,41 +280,16 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-identifier@^7.19.1": +"@babel/helper-validator-identifier@^7.18.6", "@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-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - "@babel/helper-wrap-function@^7.18.9": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" @@ -595,22 +300,13 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.17.2": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" - integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" - -"@babel/helpers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" - integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.20.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" + "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": @@ -622,31 +318,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" - integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== - -"@babel/parser@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - 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.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" + integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -655,15 +330,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" @@ -673,15 +339,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" @@ -692,15 +349,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -708,15 +357,6 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" - integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.6" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-proposal-class-static-block@^7.18.6": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" @@ -727,35 +367,16 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.12.12": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493" - integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.13.tgz#b6bea3b18e88443688fa7ed2cc06d2c60da9f4a7" + integrity sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.1" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.17.0" - charcodes "^0.2.0" - -"@babel/plugin-proposal-decorators@^7.16.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc" - integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.20.12" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/plugin-syntax-decorators" "^7.19.0" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" @@ -765,20 +386,12 @@ "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-proposal-export-default-from@^7.12.1": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz#a40ab158ca55627b71c5513f03d3469026a9e929" - integrity sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg== + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz#091f4794dbce4027c03cf4ebc64d3fb96b75c206" + integrity sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-default-from" "^7.16.7" - -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-default-from" "^7.18.6" "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" @@ -788,14 +401,6 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-proposal-json-strings@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" @@ -804,14 +409,6 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" @@ -820,15 +417,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -836,7 +425,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": +"@babel/plugin-proposal-numeric-separator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== @@ -844,14 +433,6 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" @@ -861,18 +442,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" - integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== - dependencies: - "@babel/compat-data" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -883,14 +453,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" @@ -899,16 +461,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": +"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== @@ -917,15 +470,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.11": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== @@ -933,27 +478,7 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.12.1": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" - integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": +"@babel/plugin-proposal-private-property-in-object@^7.12.1", "@babel/plugin-proposal-private-property-in-object@^7.18.6": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== @@ -963,15 +488,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6": +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@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== @@ -1007,13 +524,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz#a2be3b2c9fe7d78bd4994e790896bc411e2f166d" - integrity sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-decorators@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" @@ -1028,12 +538,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz#fa89cf13b60de2c3f79acdc2b52a21174c6de060" - integrity sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA== +"@babel/plugin-syntax-export-default-from@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz#8df076711a4818c4ce4f23e61d622b0ba2ff84bc" + integrity sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -1042,13 +552,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" - integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-flow@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" @@ -1084,14 +587,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-jsx@^7.18.6": +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -1154,44 +650,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.16.7", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-syntax-typescript@^7.20.0": +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-arrow-functions@^7.18.6": +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.14.5", "@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - -"@babel/plugin-transform-async-to-generator@^7.18.6": +"@babel/plugin-transform-async-to-generator@^7.14.5", "@babel/plugin-transform-async-to-generator@^7.18.6": 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== @@ -1200,13 +673,6 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" @@ -1214,35 +680,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-block-scoping@^7.20.2": +"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.20.2": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.20.2": +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== @@ -1257,13 +702,6 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-computed-properties@^7.18.9": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" @@ -1272,29 +710,14 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz#c445f75819641788a27a0a3a759d9df911df6abc" - integrity sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-destructuring@^7.20.2": +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-dotall-regex@^7.18.6": +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== @@ -1302,13 +725,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-duplicate-keys@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" @@ -1316,14 +732,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@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" @@ -1332,7 +740,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-flow-strip-types@^7.16.0": +"@babel/plugin-transform-flow-strip-types@^7.18.6": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== @@ -1340,37 +748,13 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-flow-strip-types@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" - integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-flow" "^7.16.7" - -"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-for-of@^7.18.8": +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== - dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" @@ -1380,13 +764,6 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@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" @@ -1394,13 +771,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@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" @@ -1408,15 +778,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-amd@^7.19.6": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" @@ -1425,16 +786,6 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" - integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" @@ -1444,17 +795,6 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== - dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" @@ -1465,14 +805,6 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" @@ -1481,13 +813,6 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" @@ -1496,13 +821,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.20.5" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" @@ -1510,14 +828,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" @@ -1526,27 +836,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" @@ -1554,41 +850,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-constant-elements@^7.12.1": +"@babel/plugin-transform-react-constant-elements@^7.18.12": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-react-constant-elements@^7.14.5": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz#6cc273c2f612a6a50cb657e63ee1303e5e68d10a" - integrity sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@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.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" @@ -1596,21 +871,10 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.18.6" -"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" - integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" - integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== +"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.18.6": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz#f950f0b0c36377503d29a712f16287cedf886cbb" + integrity sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-module-imports" "^7.18.6" @@ -1618,14 +882,6 @@ "@babel/plugin-syntax-jsx" "^7.18.6" "@babel/types" "^7.20.7" -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" @@ -1634,13 +890,6 @@ "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== - dependencies: - regenerator-transform "^0.14.2" - "@babel/plugin-transform-regenerator@^7.18.6": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" @@ -1649,13 +898,6 @@ "@babel/helper-plugin-utils" "^7.20.2" regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" @@ -1663,41 +905,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-runtime@^7.16.4": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-spread@^7.19.0": +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.19.0": 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== @@ -1705,13 +920,6 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" @@ -1719,27 +927,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-template-literals@^7.18.9": +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-typeof-symbol@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" @@ -1747,31 +941,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.16.7": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" - integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-typescript" "^7.16.7" - "@babel/plugin-transform-typescript@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.7.tgz#673f49499cd810ae32a1ea5f3f8fab370987e055" - integrity sha512-m3wVKEvf6SoszD8pu4NZz3PvfKRCMgk6D6d0Qi9hNnlM5M6CFS92EgF4EiHVLKbU0r/r7ty1hg7NPZwE7WRbYw== + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz#e3581b356b8694f6ff450211fe6774eaff8d25ab" + integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.20.12" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" @@ -1779,14 +957,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" @@ -1795,7 +965,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": +"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.15.0", "@babel/preset-env@^7.19.4": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== @@ -1876,94 +1046,14 @@ core-js-compat "^3.25.1" semver "^6.3.0" -"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.15.0", "@babel/preset-env@^7.15.6": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - "@babel/preset-flow@^7.12.1": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.16.7.tgz#7fd831323ab25eeba6e4b77a589f680e30581cbd" - integrity sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug== + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb" + integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-flow-strip-types" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-flow-strip-types" "^7.18.6" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -1976,19 +1066,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.14.5": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" - -"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": +"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.14.5", "@babel/preset-react@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== @@ -2000,16 +1078,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.18.6" "@babel/plugin-transform-react-pure-annotations" "^7.18.6" -"@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.15.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" - integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-typescript" "^7.16.7" - -"@babel/preset-typescript@^7.16.0": +"@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.15.0", "@babel/preset-typescript@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== @@ -2019,9 +1088,9 @@ "@babel/plugin-transform-typescript" "^7.18.6" "@babel/register@^7.12.1": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.17.0.tgz#8051e0b7cb71385be4909324f072599723a1f084" - integrity sha512-UNZsMAZ7uKoGHo1HlEXfteEOYssf64n/PNLHGqOKq/bgYcu/4LrQWAHJwSCb3BRZK8Hi5gkJdRcwrGTO2wtRCg== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" + integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -2029,14 +1098,6 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime-corejs3@^7.10.2": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz#fdca2cd05fba63388babe85d349b6801b008fd13" - integrity sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg== - dependencies: - core-js-pure "^3.20.2" - regenerator-runtime "^0.13.4" - "@babel/runtime@7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a" @@ -2044,40 +1105,12 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.16.7", "@babel/runtime@^7.17.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" - integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580" - integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.17.8": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" - integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.15.4": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.4.4": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== - dependencies: - regenerator-runtime "^0.13.10" + regenerator-runtime "^0.13.11" "@babel/runtime@~7.5.4": version "7.5.5" @@ -2086,16 +1119,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.12.7", "@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7": +"@babel/template@^7.12.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -2104,26 +1128,10 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.2": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" - integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.3" - "@babel/types" "^7.17.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" - integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== +"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.7" @@ -2131,20 +1139,12 @@ "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.7" + "@babel/parser" "^7.20.13" "@babel/types" "^7.20.7" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7": +"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== @@ -2171,6 +1171,11 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@confio/ics23@^0.6.3", "@confio/ics23@^0.6.8": version "0.6.8" resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" @@ -2179,15 +1184,15 @@ "@noble/hashes" "^1.0.0" protobufjs "^6.8.8" -"@cosmjs/amino@0.28.11": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.28.11.tgz#cbd3c40b2e14a717675f4de23c76c92cd48d96a5" - integrity sha512-WJkQQq8gbk5doJJ/3Gcax26I+VC4HdbbSlNdyT5hc6T+U2Jmyry9RLSE+wEZyFMgEabhr43SbIxf64gWZeR8YA== +"@cosmjs/amino@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.28.13.tgz#b51417a23c1ff8ef8b85a6862eba8492c6c44f38" + integrity sha512-IHnH2zGwaY69qT4mVAavr/pfzx6YE+ud1NHJbvVePlbGiz68CXTi5LHR+K0lrKB5mQ7E+ZErWz2mw5U/x+V1wQ== dependencies: - "@cosmjs/crypto" "0.28.11" - "@cosmjs/encoding" "0.28.11" - "@cosmjs/math" "0.28.11" - "@cosmjs/utils" "0.28.11" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/utils" "0.28.13" "@cosmjs/amino@^0.25.6": version "0.25.6" @@ -2230,30 +1235,30 @@ protobufjs "~6.10.2" "@cosmjs/cosmwasm-stargate@^0.28.0": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.28.11.tgz#73e30208a0f7668c0550c5a2410e5289ae46cbd2" - integrity sha512-sZ04c9ZvwAC7IngNeOhTnHJLBu7PXX3QfWM2vCVGd9puP9f3Hj3nbre75WKjHZ3DDVvxfS3u3JUJ6LjVWeIRuQ== + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.28.13.tgz#bea77bc999aaafdb677f446465f648cd000c5b4a" + integrity sha512-dVZNOiRd8btQreRUabncGhVXGCS2wToXqxi9l3KEHwCJQ2RWTshuqV+EZAdCaYHE5W6823s2Ol2W/ukA9AXJPw== dependencies: - "@cosmjs/amino" "0.28.11" - "@cosmjs/crypto" "0.28.11" - "@cosmjs/encoding" "0.28.11" - "@cosmjs/math" "0.28.11" - "@cosmjs/proto-signing" "0.28.11" - "@cosmjs/stargate" "0.28.11" - "@cosmjs/tendermint-rpc" "0.28.11" - "@cosmjs/utils" "0.28.11" + "@cosmjs/amino" "0.28.13" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/proto-signing" "0.28.13" + "@cosmjs/stargate" "0.28.13" + "@cosmjs/tendermint-rpc" "0.28.13" + "@cosmjs/utils" "0.28.13" cosmjs-types "^0.4.0" long "^4.0.0" pako "^2.0.2" -"@cosmjs/crypto@0.28.11", "@cosmjs/crypto@^0.28.0": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.28.11.tgz#e427fe5ae2402d6662c850cc65768f71e3c425ac" - integrity sha512-oJXOeBX4FP8bp0ZVydJFcRplErHp8cC6vNoULRck+7hcLuvp9tyv3SBOkBkwxTv81VcQyGCgn7WE0NYEKrpUbw== +"@cosmjs/crypto@0.28.13", "@cosmjs/crypto@^0.28.0": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.28.13.tgz#541b6a36f616b2da5a568ead46d4e83841ceb412" + integrity sha512-ynKfM0q/tMBQMHJby6ad8lR3gkgBKaelQhIsCZTjClsnuC7oYT9y3ThSZCUWr7Pa9h0J8ahU2YV2oFWFVWJQzQ== dependencies: - "@cosmjs/encoding" "0.28.11" - "@cosmjs/math" "0.28.11" - "@cosmjs/utils" "0.28.11" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/utils" "0.28.13" "@noble/hashes" "^1" bn.js "^5.2.0" elliptic "^6.5.3" @@ -2275,10 +1280,10 @@ ripemd160 "^2.0.2" sha.js "^2.4.11" -"@cosmjs/encoding@0.28.11": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.11.tgz#da6dd30ff105ff6a9e045aa6abed2526c94adb12" - integrity sha512-J7pvlzAt8hBZn316wGRmUlK3xwMgNXUvj4v56DK4fA0fv6VfGwMvVtHCXaqNQtzOGkC6EQcshzA/fL5MBIwu6A== +"@cosmjs/encoding@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.13.tgz#7994e8e2c435beaf0690296ffb0f7f3eaec8150b" + integrity sha512-jtXbAYtV77rLHxoIrjGFsvgGjeTKttuHRv6cvuy3toCZzY7JzTclKH5O2g36IIE4lXwD9xwuhGJ2aa6A3dhNkA== dependencies: base64-js "^1.3.0" bech32 "^1.1.4" @@ -2293,12 +1298,12 @@ bech32 "^1.1.4" readonly-date "^1.0.0" -"@cosmjs/json-rpc@0.28.11": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.28.11.tgz#17b4c543d2de978b41bed973c88a2425a794af37" - integrity sha512-YNZTozu5yWHyGGet5Wfc0CcxQezkMr37YaeU9elCaa11ClHlYAQ2NrPpPBOmgnJKsMhzfiKcAE9Sf6f4a0hCxA== +"@cosmjs/json-rpc@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.28.13.tgz#ff3f0c4a2f363b1a2c6779f8624a897e217fe297" + integrity sha512-fInSvg7x9P6p+GWqet+TMhrMTM3OWWdLJOGS5w2ryubMjgpR1rLiAx77MdTNkArW+/6sUwku0sN4veM4ENQu6A== dependencies: - "@cosmjs/stream" "0.28.11" + "@cosmjs/stream" "0.28.13" xstream "^11.14.0" "@cosmjs/json-rpc@^0.25.6": @@ -2322,10 +1327,10 @@ axios "^0.21.1" fast-deep-equal "^3.1.3" -"@cosmjs/math@0.28.11", "@cosmjs/math@^0.28.0": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.28.11.tgz#cb8c0171179417156dd59795d5f24aaa27d0320d" - integrity sha512-MyhPnC4sYu86c2/0PpEeynaPl4nvAmLZH3acPh96SzcjERONbGZjjKtBFPq1avBrev2CCSPrZ4O8u9xpQ4aSvg== +"@cosmjs/math@0.28.13", "@cosmjs/math@^0.28.0": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.28.13.tgz#50c05bc67007a04216f7f5e0c93f57270f8cc077" + integrity sha512-PDpL8W/kbyeWi0mQ2OruyqE8ZUAdxPs1xCbDX3WXJwy2oU+X2UTbkuweJHVpS9CIqmZulBoWQAmlf6t6zr1N/g== dependencies: bn.js "^5.2.0" @@ -2337,22 +1342,22 @@ bn.js "^4.11.8" "@cosmjs/math@^0.26.2": - version "0.26.6" - resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.26.6.tgz#11f3273634bab69187c6361533a14c72f611f6a2" - integrity sha512-nblvidxwugM/kh1Vx95s7MQ596r5ap1ZUpjHYJTLbnYvnObHvfYvM3qb8SJzY0u7x5+u9E0oSFzLwMRfUTEQ3g== + version "0.26.8" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.26.8.tgz#29d7fc8df96a0da25f8b110482d510af93505b0d" + integrity sha512-AfooIaqhOks5xPDc4kDEXje/90iPm2STu+0YWvDStEEib2xxPTtXU3OuK+KpJ3CCFfQwbKCrzEIzJWCYmTs7mw== dependencies: - bn.js "^4.11.8" + bn.js "^5.2.0" -"@cosmjs/proto-signing@0.28.11", "@cosmjs/proto-signing@^0.28.0": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.11.tgz#7eecb60a025ab55a409441daa14a07bb1d9b2825" - integrity sha512-ym0DpLff+0RBkD/mtFf6wrzyuGhcbcjuDMEdcUWOrJTo6n8DXeRmHkJkyy/mrG3QC4tQX/A81+DhfkANQmgcxw== +"@cosmjs/proto-signing@0.28.13", "@cosmjs/proto-signing@^0.28.0": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.13.tgz#95ac12f0da0f0814f348f5ae996c3e96d015df61" + integrity sha512-nSl/2ZLsUJYz3Ad0RY3ihZUgRHIow2OnYqKsESMu+3RA/jTi9bDYhiBu8mNMHI0xrEJry918B2CyI56pOUHdPQ== dependencies: - "@cosmjs/amino" "0.28.11" - "@cosmjs/crypto" "0.28.11" - "@cosmjs/encoding" "0.28.11" - "@cosmjs/math" "0.28.11" - "@cosmjs/utils" "0.28.11" + "@cosmjs/amino" "0.28.13" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/utils" "0.28.13" cosmjs-types "^0.4.0" long "^4.0.0" @@ -2365,12 +1370,12 @@ long "^4.0.0" protobufjs "~6.10.2" -"@cosmjs/socket@0.28.11": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.28.11.tgz#78840a50dd10d658b641413643b1c1e387828a6b" - integrity sha512-4BhsWN984SLBhwPCD89riQ3SEJzJ1RLJPeP6apIGjhh6pguQZmwa2U/TZjnEUOGnJkUG2FZUH99jRGSTYaIvZg== +"@cosmjs/socket@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.28.13.tgz#d8443ad6e91d080fc6b80a7e9cf297a56b1f6833" + integrity sha512-lavwGxQ5VdeltyhpFtwCRVfxeWjH5D5mmN7jgx9nuCf3XSFbTcOYxrk2pQ4usenu1Q1KZdL4Yl5RCNrJuHD9Ug== dependencies: - "@cosmjs/stream" "0.28.11" + "@cosmjs/stream" "0.28.13" isomorphic-ws "^4.0.1" ws "^7" xstream "^11.14.0" @@ -2385,19 +1390,19 @@ ws "^7" xstream "^11.14.0" -"@cosmjs/stargate@0.28.11", "@cosmjs/stargate@^0.28.0": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.28.11.tgz#ad89a008ead81cea884714570276523310e95822" - integrity sha512-UyFH/mTNNKTZohVhj+SmjCRv/xopqU/UinGedmWzs4MqEZteX9xs6D3HTmRCgpmBQ03lpbTslE/FhhT9Hkl9KQ== +"@cosmjs/stargate@0.28.13", "@cosmjs/stargate@^0.28.0": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.28.13.tgz#a73d837a46ee8944e6eafe162f2ff6943c14350e" + integrity sha512-dVBMazDz8/eActHsRcZjDHHptOBMqvibj5CFgEtZBp22gP6ASzoAUXTlkSVk5FBf4sfuUHoff6st134/+PGMAg== dependencies: "@confio/ics23" "^0.6.8" - "@cosmjs/amino" "0.28.11" - "@cosmjs/encoding" "0.28.11" - "@cosmjs/math" "0.28.11" - "@cosmjs/proto-signing" "0.28.11" - "@cosmjs/stream" "0.28.11" - "@cosmjs/tendermint-rpc" "0.28.11" - "@cosmjs/utils" "0.28.11" + "@cosmjs/amino" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/proto-signing" "0.28.13" + "@cosmjs/stream" "0.28.13" + "@cosmjs/tendermint-rpc" "0.28.13" + "@cosmjs/utils" "0.28.13" cosmjs-types "^0.4.0" long "^4.0.0" protobufjs "~6.11.3" @@ -2419,10 +1424,10 @@ long "^4.0.0" protobufjs "~6.10.2" -"@cosmjs/stream@0.28.11": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.28.11.tgz#68ec8f524edf70e0e97244c7e8261d246b70c1b7" - integrity sha512-3b6P4Il8mYzvY2bvEQyzgP+cm0HIGSpHNtuGjiWsQF3Wtp450iVRfEJqdt4+91vvxzfdjQEkQOLMaymnswX3sw== +"@cosmjs/stream@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.28.13.tgz#1e79d1116fda1e63e5ecddbd9d803d403942b1fa" + integrity sha512-AnjtfwT8NwPPkd3lhZhjOlOzT0Kn9bgEu2IPOZjQ1nmG2bplsr6TJmnwn0dJxHT7UGtex17h6whKB5N4wU37Wg== dependencies: xstream "^11.14.0" @@ -2433,18 +1438,18 @@ dependencies: xstream "^11.14.0" -"@cosmjs/tendermint-rpc@0.28.11", "@cosmjs/tendermint-rpc@^0.28.0": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.28.11.tgz#00c5854b14f24fd5eb0a5f11bd7278fc02d6815d" - integrity sha512-TUhWsUYxbKftQmHQK5TBH62vNaKB1ybxoFZ2uJtGMVvY3jcBux7P0Ll/u5nwrM0ETAeo2RjucehJUpGBy9q+HQ== +"@cosmjs/tendermint-rpc@0.28.13", "@cosmjs/tendermint-rpc@^0.28.0": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.28.13.tgz#0bf587ae66fa3f88319edbd258492d28e73f9f29" + integrity sha512-GB+ZmfuJIGQm0hsRtLYjeR3lOxF7Z6XyCBR0cX5AAYOZzSEBJjevPgUHD6tLn8zIhvzxaW3/VKnMB+WmlxdH4w== dependencies: - "@cosmjs/crypto" "0.28.11" - "@cosmjs/encoding" "0.28.11" - "@cosmjs/json-rpc" "0.28.11" - "@cosmjs/math" "0.28.11" - "@cosmjs/socket" "0.28.11" - "@cosmjs/stream" "0.28.11" - "@cosmjs/utils" "0.28.11" + "@cosmjs/crypto" "0.28.13" + "@cosmjs/encoding" "0.28.13" + "@cosmjs/json-rpc" "0.28.13" + "@cosmjs/math" "0.28.13" + "@cosmjs/socket" "0.28.13" + "@cosmjs/stream" "0.28.13" + "@cosmjs/utils" "0.28.13" axios "^0.21.2" readonly-date "^1.0.0" xstream "^11.14.0" @@ -2464,180 +1469,16 @@ readonly-date "^1.0.0" xstream "^11.14.0" -"@cosmjs/utils@0.28.11": - version "0.28.11" - resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.28.11.tgz#dee7902a4b3cac8f66563b7e8f99fa976f9c4f1f" - integrity sha512-FXVEr7Pg6MX9VbY5NemuKbtFVabSlUlArWIV+R74FQg5LIuSa+0QkxSpNldCuOLBEU4/GlrzybT4uEl338vSzg== +"@cosmjs/utils@0.28.13": + version "0.28.13" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.28.13.tgz#2fd2844ec832d7833811e2ae1691305d09791a08" + integrity sha512-dVeMBiyg+46x7XBZEfJK8yTihphbCFpjVYmLJVqmTsHfJwymQ65cpyW/C+V/LgWARGK8hWQ/aX9HM5Ao8QmMSg== "@cosmjs/utils@^0.25.6": version "0.25.6" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.25.6.tgz#934d9a967180baa66163847616a74358732227ca" integrity sha512-ofOYiuxVKNo238vCPPlaDzqPXy2AQ/5/nashBo5rvPZJkxt9LciGfUEQWPCOb1BIJDNx2Dzu0z4XCf/dwzl0Dg== -"@craco/craco@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-7.0.0.tgz#4e9243e53fba6ed4d2bc08aa65aae9d1b63541ed" - integrity sha512-OyjL9zpURB6Ha1HO62Hlt27Xd7UYJ8DRiBNuE4DBB8Ue0iQ9q/xsv3ze7ROm6gCZqV6I2Gxjnq0EHCCye+4xDQ== - dependencies: - autoprefixer "^10.4.12" - cosmiconfig "^7.0.1" - cosmiconfig-typescript-loader "^1.0.0" - cross-spawn "^7.0.3" - lodash "^4.17.21" - semver "^7.3.7" - webpack-merge "^5.8.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@csstools/normalize.css@*": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" - integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== - -"@csstools/postcss-cascade-layers@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" - integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== - dependencies: - "@csstools/selector-specificity" "^2.0.2" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-color-function@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" - integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-font-format-keywords@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" - integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-hwb-function@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" - integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-ic-unit@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" - integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-is-pseudo-class@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" - integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - -"@csstools/postcss-nested-calc@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" - integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-normalize-display-values@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" - integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-oklab-function@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" - integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" - integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-stepped-value-functions@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" - integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-text-decoration-shorthand@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" - integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-trigonometric-functions@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" - integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== - dependencies: - postcss-value-parser "^4.2.0" - -"@csstools/postcss-unset-value@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" - integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== - -"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" - integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== - -"@date-io/core@^2.13.1": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.13.1.tgz#f041765aff5c55fbc7e37fdd75fc1792733426d6" - integrity sha512-pVI9nfkf2qClb2Cxdq0Q4zJhdawMG4ybWZUVGifT78FDwzRMX2SwXBb55s5NRJk0HcIicDuxktmCtemZqMH1Zg== - -"@date-io/date-fns@^2.13.1": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.13.1.tgz#19d8a245dab61c03c95ba492d679d98d2b0b4af5" - integrity sha512-8fmfwjiLMpFLD+t4NBwDx0eblWnNcgt4NgfT/uiiQTGI81fnPu9tpBMYdAcuWxaV7LLpXgzLBx1SYWAMDVUDQQ== - dependencies: - "@date-io/core" "^2.13.1" - -"@date-io/dayjs@^2.13.1": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-2.13.1.tgz#98461d22ee98179b9f2dca3b36f1b618704ae593" - integrity sha512-5bL4WWWmlI4uGZVScANhHJV7Mjp93ec2gNeUHDqqLaMZhp51S0NgD25oqj/k0LqBn1cdU2MvzNpk/ObMmVv5cQ== - dependencies: - "@date-io/core" "^2.13.1" - -"@date-io/luxon@^2.13.1": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/luxon/-/luxon-2.13.1.tgz#3701b3cabfffda5102af302979aa6e58acfda91a" - integrity sha512-yG+uM7lXfwLyKKEwjvP8oZ7qblpmfl9gxQYae55ifbwiTs0CoCTkYkxEaQHGkYtTqGTzLqcb0O9Pzx6vgWg+yg== - dependencies: - "@date-io/core" "^2.13.1" - -"@date-io/moment@^2.13.1": - version "2.13.1" - resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-2.13.1.tgz#122a51e4bdedf71ff3babb264427737dc022c1e6" - integrity sha512-XX1X/Tlvl3TdqQy2j0ZUtEJV6Rl8tOyc5WOS3ki52He28Uzme4Ro/JuPWTMBDH63weSWIZDlbR7zBgp3ZA2y1A== - dependencies: - "@date-io/core" "^2.13.1" - "@design-systems/utils@2.12.0": version "2.12.0" resolved "https://registry.yarnpkg.com/@design-systems/utils/-/utils-2.12.0.tgz#955c108be07cb8f01532207cbfea8f848fa760c9" @@ -2649,234 +1490,153 @@ react-merge-refs "^1.0.0" "@devtools-ds/object-inspector@^1.1.2": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@devtools-ds/object-inspector/-/object-inspector-1.2.0.tgz#64a132fbd4159affa5a87c8cf6cf8540c337aed2" - integrity sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@devtools-ds/object-inspector/-/object-inspector-1.2.1.tgz#2b380ed475d898d2828e7855c2dc2c82f091d326" + integrity sha512-nrAVVj4c4Iv9958oE4HA7Mk6T+4Mn/4xBRlFDeX4Ps6SMzsqO8bKhw/y6+bOfNyb/TYHmC0/pnPS68GDVZcg5Q== dependencies: "@babel/runtime" "7.7.2" - "@devtools-ds/object-parser" "^1.2.0" - "@devtools-ds/themes" "^1.2.0" - "@devtools-ds/tree" "^1.2.0" + "@devtools-ds/object-parser" "^1.2.1" + "@devtools-ds/themes" "^1.2.1" + "@devtools-ds/tree" "^1.2.1" clsx "1.1.0" -"@devtools-ds/object-parser@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@devtools-ds/object-parser/-/object-parser-1.2.0.tgz#8da39bf481687afdf113c78dbac5ced6fd8e30d1" - integrity sha512-SjGGyiFFY8dtUpiWXAvRSzRT+hE11EAAysrq2PsC/GVLf2ZLyT2nHlQO5kDStywyTz+fjw7S7pyDRj1HG9YTTA== +"@devtools-ds/object-parser@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@devtools-ds/object-parser/-/object-parser-1.2.1.tgz#5ab709a2db807ce99cb12bf35511379d6e47a3b8" + integrity sha512-6qB+THhQfJqXyHn8wpJ1KFxXcbpLTlRyCVmkelhr0c1+MPLZcC+0XJxpVZ1AOEXPa6CWVZThBYSCvnYQEvfCqw== dependencies: "@babel/runtime" "~7.5.4" -"@devtools-ds/themes@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@devtools-ds/themes/-/themes-1.2.0.tgz#2fda60af9741e97bc09257b512e49a7aecf6f4bc" - integrity sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw== +"@devtools-ds/themes@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@devtools-ds/themes/-/themes-1.2.1.tgz#060a0a1a2b38f68b01deca62240d2c94585f00dd" + integrity sha512-4/KFsHnokGxUq8CSCchINcVBb6fQ74HtEfNtMuitGtGg3VCRV0kaVSOsz6wzShzhLEaVLd5coSRQKaZj7yx72w== dependencies: "@babel/runtime" "~7.5.4" "@design-systems/utils" "2.12.0" clsx "1.1.0" -"@devtools-ds/tree@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@devtools-ds/tree/-/tree-1.2.0.tgz#e882d10ae13a30f2aa02e75c3eeb6c44a47a80c3" - integrity sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA== +"@devtools-ds/tree@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@devtools-ds/tree/-/tree-1.2.1.tgz#88d44dbbf96101fd8f18af92e514ed9dd00c8ceb" + integrity sha512-2ZHG28oWJno0gD+20EoSJO0yffm6JS5r7YzYhGMkrnLGvcCRZuwXSxMmIshSPLIR0cjidiAfGCqsrigHIR4ZQA== dependencies: "@babel/runtime" "7.7.2" - "@devtools-ds/themes" "^1.2.0" + "@devtools-ds/themes" "^1.2.1" clsx "1.1.0" "@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@emotion/babel-plugin@^11.7.1": - version "11.7.2" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz#fec75f38a6ab5b304b0601c74e2a5e77c95e5fa0" - integrity sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ== +"@emotion/babel-plugin@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" + integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/runtime" "^7.13.10" - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.5" - "@emotion/serialize" "^1.0.2" - babel-plugin-macros "^2.6.1" + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" - stylis "4.0.13" + stylis "4.1.3" -"@emotion/cache@^10.0.27": - version "10.0.29" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" - integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ== +"@emotion/cache@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== dependencies: - "@emotion/sheet" "0.9.4" - "@emotion/stylis" "0.8.5" - "@emotion/utils" "0.11.3" - "@emotion/weak-memoize" "0.2.5" + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" -"@emotion/cache@^11.7.1": - version "11.7.1" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.7.1.tgz#08d080e396a42e0037848214e8aa7bf879065539" - integrity sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A== +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - stylis "4.0.13" + "@emotion/memoize" "^0.8.0" -"@emotion/core@^10.1.1": - version "10.3.1" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.3.1.tgz#4021b6d8b33b3304d48b0bb478485e7d7421c69d" - integrity sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/cache" "^10.0.27" - "@emotion/css" "^10.0.27" - "@emotion/serialize" "^0.11.15" - "@emotion/sheet" "0.9.4" - "@emotion/utils" "0.11.3" - -"@emotion/css@^10.0.27": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c" - integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== - dependencies: - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - babel-plugin-emotion "^10.0.27" - -"@emotion/hash@0.8.0", "@emotion/hash@^0.8.0": +"@emotion/memoize@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/is-prop-valid@0.8.8", "@emotion/is-prop-valid@^0.8.6": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/is-prop-valid@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" - integrity sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ== - dependencies: - "@emotion/memoize" "^0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== "@emotion/react@^11.4.1", "@emotion/react@^11.7.0": - version "11.8.1" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.8.1.tgz#5358b8c78367063881e26423057c030c57ce52eb" - integrity sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q== + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" + integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.7.1" - "@emotion/cache" "^11.7.1" - "@emotion/serialize" "^1.0.2" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.1.0" - "@emotion/weak-memoize" "^0.2.5" + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": - version "0.11.16" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" - integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== +"@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== dependencies: - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/unitless" "0.7.5" - "@emotion/utils" "0.11.3" - csstype "^2.5.7" - -"@emotion/serialize@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" - integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== - dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" csstype "^3.0.2" -"@emotion/sheet@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" - integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== - -"@emotion/sheet@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" - integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== - -"@emotion/styled-base@^10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.3.0.tgz#9aa2c946100f78b47316e4bc6048321afa6d4e36" - integrity sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/is-prop-valid" "0.8.8" - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - -"@emotion/styled@^10.0.27": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.3.0.tgz#8ee959bf75730789abb5f67f7c3ded0c30aec876" - integrity sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ== - dependencies: - "@emotion/styled-base" "^10.3.0" - babel-plugin-emotion "^10.0.27" +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== "@emotion/styled@^11.3.0", "@emotion/styled@^11.6.0": - version "11.8.1" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.8.1.tgz#856f6f63aceef0eb783985fa2322e2bf66d04e17" - integrity sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ== + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.5.tgz#1fe7bf941b0909802cb826457e362444e7e96a79" + integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.7.1" - "@emotion/is-prop-valid" "^1.1.2" - "@emotion/serialize" "^1.0.2" - "@emotion/utils" "^1.1.0" + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.5" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" -"@emotion/stylis@0.8.5": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== -"@emotion/unitless@0.7.5", "@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== -"@emotion/utils@0.11.3": - version "0.11.3" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" - integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== -"@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf" - integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ== - -"@emotion/weak-memoize@0.2.5", "@emotion/weak-memoize@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -2893,21 +1653,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.0.tgz#7ce1547a5c46dfe56e1e45c3c9ed18038c721c6a" - integrity sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.3.1" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - "@eslint/eslintrc@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" @@ -2923,15 +1668,27 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@floating-ui/core@^1.0.5": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.1.0.tgz#0a1dee4bbce87ff71602625d33f711cafd8afc08" + integrity sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ== + +"@floating-ui/dom@^1.0.4": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.1.0.tgz#29fea1344fdef15b6ba270a733d20b7134fee5c2" + integrity sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A== + dependencies: + "@floating-ui/core" "^1.0.5" + "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@hookform/resolvers@^2.8.0": - version "2.8.8" - resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.8.8.tgz#17cf806485435877fdafce9f3bee6ff68f7f87b6" - integrity sha512-meAEDur1IJBfKyTo9yPYAuzjIfrxA7m9Ov+1nxaW/YupsqMeseWifoUjWK03+hz/RJizsVQAaUjVxFEkyu0GWg== + version "2.9.10" + resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.9.10.tgz#e7e88942ee34e97b7bc937b0be4694194c9cd420" + integrity sha512-JIL1DgJIlH9yuxcNGtyhsWX/PgNltz+5Gr6+8SX9fhXc/hPbEIk6wPI82nhgvp3uUb6ZfAM5mqg/x7KR7NAb+A== "@humanwhocodes/config-array@^0.11.8": version "0.11.8" @@ -2951,15 +1708,6 @@ debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/config-array@^0.9.2": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" - integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.4" - "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" @@ -2986,7 +1734,7 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -3003,18 +1751,6 @@ jest-util "^27.5.1" slash "^3.0.0" -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - "@jest/core@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" @@ -3066,6 +1802,13 @@ dependencies: jest-get-type "^28.0.2" +"@jest/expect-utils@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" + integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== + dependencies: + jest-get-type "^29.2.0" + "@jest/fake-timers@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" @@ -3125,6 +1868,13 @@ dependencies: "@sinclair/typebox" "^0.24.1" +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== + dependencies: + "@sinclair/typebox" "^0.24.1" + "@jest/source-map@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" @@ -3144,16 +1894,6 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== - dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - "@jest/test-sequencer@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" @@ -3240,6 +1980,26 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -3254,12 +2014,7 @@ 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": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== - -"@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== @@ -3272,33 +2027,12 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.13": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": 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": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" - integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -3983,9 +2717,9 @@ write-file-atomic "^3.0.3" "@mdx-js/loader@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-2.1.5.tgz#4e764c65333530fd786dfe4f36e918dfeac0200b" - integrity sha512-oXjfTa/iAcMmW8DdQ+hQFodPCLqw5VKT2yoZkLwrZfPVVpUgKrI+5/ZePYq328xxtAUStZmR3ed0PWJrwd5Pkg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-2.2.1.tgz#71634e87659cd29240933d174a151a4d4ab3b70c" + integrity sha512-J4E8A5H+xtk4otZiEZ5AXl61Tj04Avm5MqLQazITdI3+puVXVnTTuZUKM1oNHTtfDIfOl0uMt+o/Ij+x6Fvf+g== dependencies: "@mdx-js/mdx" "^2.0.0" source-map "^0.7.0" @@ -4016,9 +2750,9 @@ unist-util-visit "2.0.3" "@mdx-js/mdx@^2.0.0": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.1.5.tgz#577937349fd555154382c2f805f5f52834a64903" - integrity sha512-zEG0lt+Bl/r5U6e0TOS7qDbsXICtemfAPquxWFsMbdzrvlWaqMGemLl+sjVpqlyaaiCiGVQBSGdCk0t1qXjkQg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.2.1.tgz#611af1b68135c94eb467eb07e006fa1d8eebe029" + integrity sha512-hZ3ex7exYLJn6FfReq8yTvA6TE53uW9UHJQM9IlSauOuS55J9y8RtA7W+dzp6Yrzr00/U1sd7q+Wf61q6SfiTQ== dependencies: "@types/estree-jsx" "^1.0.0" "@types/mdx" "^2.0.0" @@ -4056,205 +2790,151 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@mui/base@5.0.0-alpha.70": - version "5.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.70.tgz#e280ee3b69d86034f2cff445161747940129d576" - integrity sha512-8UZWhz1JYuQnPkAbC37cl4aL1JyNWZ08wDXlp57W7fYQp5xFpBP/7p56AcWg2qG9CNJP0IlFg2Wp4md1v2l4iA== +"@mui/base@5.0.0-alpha.115": + version "5.0.0-alpha.115" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.115.tgz#582b147fda56fe52d561fe9f64406e036d882338" + integrity sha512-OGQ84whT/yNYd6xKCGGS6MxqEfjVjk5esXM7HP6bB2Rim7QICUapxZt4nm8q39fpT08rNDkv3xPVqDDwRdRg1g== dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/is-prop-valid" "^1.1.2" - "@mui/utils" "^5.4.4" - "@popperjs/core" "^2.4.4" - clsx "^1.1.1" - prop-types "^15.7.2" - react-is "^17.0.2" + "@babel/runtime" "^7.20.7" + "@emotion/is-prop-valid" "^1.2.0" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.2" + "@popperjs/core" "^2.11.6" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" -"@mui/base@5.0.0-alpha.71": - version "5.0.0-alpha.71" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.71.tgz#628f5ae10a8c015d61d3d1e6f04d66afc7500b90" - integrity sha512-LinacyjmZOS+roUqCyhrcbNIW7TlRf1U+15ETGwMn6biNXI9YEVgcc1Kak08CRtjM0yczxxzLWetiAjHMCVSjQ== - dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/is-prop-valid" "^1.1.2" - "@mui/utils" "^5.4.4" - "@popperjs/core" "^2.11.2" - clsx "^1.1.1" - prop-types "^15.7.2" - react-is "^17.0.2" +"@mui/core-downloads-tracker@^5.11.6": + version "5.11.6" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.6.tgz#79a60c0d95a08859cccd62a8d9a5336ef477a840" + integrity sha512-lbD3qdafBOf2dlqKhOcVRxaPAujX+9UlPC6v8iMugMeAXe0TCgU3QbGXY3zrJsu6ex64WYDpH4y1+WOOBmWMuA== -"@mui/icons-material@^5.0.0", "@mui/icons-material@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.5.0.tgz#23d5f13c62c19a75b184374a6ea6ed0f8019531d" - integrity sha512-rMs5flT3INyd/m1A/x8DDlNTfHmCartX8stCuSDDMmaMV123oSwg8werJ/Hg4j1FWuVk5rE5HRY45gBf12BCGw== +"@mui/icons-material@^5.0.0", "@mui/icons-material@^5.2.0", "@mui/icons-material@^5.5.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.0.tgz#9ea6949278b2266d2683866069cd43009eaf6464" + integrity sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A== dependencies: - "@babel/runtime" "^7.17.2" - -"@mui/icons-material@^5.2.0": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.4.4.tgz#0dc7b4e68cbbdfc675f09f0763be1100aad910af" - integrity sha512-7zoRpjO8vsd+bPvXq6rtXu0V8Saj70X09dtTQogZmxQKabrYW3g7+Yym7SCRA7IYVF3ysz2AvdQrGD1P/sGepg== - dependencies: - "@babel/runtime" "^7.17.2" + "@babel/runtime" "^7.20.6" "@mui/lab@^5.0.0-alpha.72": - version "5.0.0-alpha.72" - resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.72.tgz#e784875bea3476be3437fc79dbee9c5b1e74535a" - integrity sha512-opml6yNpDvJzrCM9XzbckZMtfah+jFrYB8nB6kzORaQ3ixcMt+7RbFTPXG7NvQxW8VdxlGgfeBAMSWLDiFVMWA== + version "5.0.0-alpha.117" + resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.117.tgz#c7913aa13f42a5c9534e658607384e01c8001b5a" + integrity sha512-g+EN4jnoy6bwf3U/4q+L9gAVXoOky+T+VEDWzOP3BZLVghO63X0oaBx12TPOCnGDJKm0crFsIiyQQmYQkaGJqA== dependencies: - "@babel/runtime" "^7.17.2" - "@date-io/date-fns" "^2.13.1" - "@date-io/dayjs" "^2.13.1" - "@date-io/luxon" "^2.13.1" - "@date-io/moment" "^2.13.1" - "@mui/base" "5.0.0-alpha.71" - "@mui/system" "^5.5.0" - "@mui/utils" "^5.4.4" - clsx "^1.1.1" - prop-types "^15.7.2" - react-is "^17.0.2" - react-transition-group "^4.4.2" - rifm "^0.12.1" + "@babel/runtime" "^7.20.7" + "@mui/base" "5.0.0-alpha.115" + "@mui/system" "^5.11.5" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.2" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" "@mui/material@^5.0.1", "@mui/material@^5.2.2": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.4.4.tgz#2652a07085bf107da590007286336640f605055e" - integrity sha512-VDJC7GzO1HTFqfMe2zwvaW/sRhABBJXFkKEv5gO3uXx7x9fdwJHQr4udU7NWZCUdOcx9Y0h3BsAILLefYq+WPw== + version "5.11.6" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.11.6.tgz#0055e7bdf5f89bb7f2a5cf0a3252dadfc9122c50" + integrity sha512-MzkkL5KC2PCkFiv8cLpkzgLUPXSrAtnvJBR0emV7mLVWbkwV3n5832vjBx154B6R032fHjFTziTh7YEb50nK6Q== dependencies: - "@babel/runtime" "^7.17.2" - "@mui/base" "5.0.0-alpha.70" - "@mui/system" "^5.4.4" - "@mui/types" "^7.1.2" - "@mui/utils" "^5.4.4" - "@types/react-transition-group" "^4.4.4" - clsx "^1.1.1" - csstype "^3.0.10" - hoist-non-react-statics "^3.3.2" - prop-types "^15.7.2" - react-is "^17.0.2" - react-transition-group "^4.4.2" + "@babel/runtime" "^7.20.7" + "@mui/base" "5.0.0-alpha.115" + "@mui/core-downloads-tracker" "^5.11.6" + "@mui/system" "^5.11.5" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.2" + "@types/react-transition-group" "^4.4.5" + clsx "^1.2.1" + csstype "^3.1.1" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" -"@mui/private-theming@^5.4.4": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.4.4.tgz#cc2b2d897888ce5d1c319adfa2c50c0063a649ab" - integrity sha512-V/gxttr6736yJoU9q+4xxXsa0K/w9Hn9pg99zsOHt7i/O904w2CX5NHh5WqDXtoUzVcayLF0RB17yr6l79CE+A== +"@mui/private-theming@^5.11.2": + version "5.11.2" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.11.2.tgz#93eafb317070888a988efa8d6a9ec1f69183a606" + integrity sha512-qZwMaqRFPwlYmqwVKblKBGKtIjJRAj3nsvX93pOmatsXyorW7N/0IPE/swPgz1VwChXhHO75DwBEx8tB+aRMNg== dependencies: - "@babel/runtime" "^7.17.2" - "@mui/utils" "^5.4.4" - prop-types "^15.7.2" + "@babel/runtime" "^7.20.7" + "@mui/utils" "^5.11.2" + prop-types "^15.8.1" -"@mui/styled-engine@^5.4.4": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.4.4.tgz#8991b2e2dd47ae60071e7f042a5fab8e6e092e82" - integrity sha512-AKx3rSgB6dmt5f7iP4K18mLFlE5/9EfJe/5EH9Pyqez8J/CPkTgYhJ/Va6qtlrcunzpui+uG/vfuf04yAZekSg== +"@mui/styled-engine@^5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.11.0.tgz#79afb30c612c7807c4b77602cf258526d3997c7b" + integrity sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ== dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/cache" "^11.7.1" - prop-types "^15.7.2" + "@babel/runtime" "^7.20.6" + "@emotion/cache" "^11.10.5" + csstype "^3.1.1" + prop-types "^15.8.1" "@mui/styles@^5.0.1", "@mui/styles@^5.2.2": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.4.4.tgz#e6a18f3528a494d782fd80e7feb01bd75a3570dd" - integrity sha512-w+9VIC1+JiPfF7osomX1j+aX7yyNNw8BnMYo6niK+zbwIxSYX/wcq4Jh7rlt6FSiaKL4Qi1uf7MPlNAhIxXq3g== + version "5.11.2" + resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.11.2.tgz#8616272389051f0287e1e3b24d2bae937757552e" + integrity sha512-Yg6+PMPV4Mx1UJHow2e/nND2bQNWS1H38zrkJxlucXfaR0+aglO6u8R/OXmVspDj+Z5YW5B27lxRDvxCQN9nGw== dependencies: - "@babel/runtime" "^7.17.2" - "@emotion/hash" "^0.8.0" - "@mui/private-theming" "^5.4.4" - "@mui/types" "^7.1.2" - "@mui/utils" "^5.4.4" - clsx "^1.1.1" - csstype "^3.0.10" + "@babel/runtime" "^7.20.7" + "@emotion/hash" "^0.9.0" + "@mui/private-theming" "^5.11.2" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.2" + clsx "^1.2.1" + csstype "^3.1.1" hoist-non-react-statics "^3.3.2" - jss "^10.8.2" - jss-plugin-camel-case "^10.8.2" - jss-plugin-default-unit "^10.8.2" - jss-plugin-global "^10.8.2" - jss-plugin-nested "^10.8.2" - jss-plugin-props-sort "^10.8.2" - jss-plugin-rule-value-function "^10.8.2" - jss-plugin-vendor-prefixer "^10.8.2" - prop-types "^15.7.2" + jss "^10.9.2" + jss-plugin-camel-case "^10.9.2" + jss-plugin-default-unit "^10.9.2" + jss-plugin-global "^10.9.2" + jss-plugin-nested "^10.9.2" + jss-plugin-props-sort "^10.9.2" + jss-plugin-rule-value-function "^10.9.2" + jss-plugin-vendor-prefixer "^10.9.2" + prop-types "^15.8.1" -"@mui/system@^5.0.1", "@mui/system@^5.4.4": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.4.4.tgz#cd5d3d35c75594abd88708e715b5e39a8874ff51" - integrity sha512-Zjbztq2o/VRuRRCWjG44juRrPKYLQMqtQpMHmMttGu5BnvK6PAPW3WOY0r1JCAwLhbd8Kug9nyhGQYKETjo+tQ== +"@mui/system@>= 5", "@mui/system@^5.0.1", "@mui/system@^5.11.5": + version "5.11.5" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.11.5.tgz#c880199634708c866063396f88d3fdd4c1dfcb48" + integrity sha512-KNVsJ0sgRRp2XBqhh4wPS5aacteqjwxgiYTVwVnll2fgkgunZKo3DsDiGMrFlCg25ZHA3Ax58txWGE9w58zp0w== dependencies: - "@babel/runtime" "^7.17.2" - "@mui/private-theming" "^5.4.4" - "@mui/styled-engine" "^5.4.4" - "@mui/types" "^7.1.2" - "@mui/utils" "^5.4.4" - clsx "^1.1.1" - csstype "^3.0.10" - prop-types "^15.7.2" + "@babel/runtime" "^7.20.7" + "@mui/private-theming" "^5.11.2" + "@mui/styled-engine" "^5.11.0" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.2" + clsx "^1.2.1" + csstype "^3.1.1" + prop-types "^15.8.1" -"@mui/system@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.5.0.tgz#df7e540b12218db21a5edb16a6fa1d571d26455b" - integrity sha512-zFOfERv3Y4m5ehwTRR9cGaPuMvlD2qVXmFKC60P0Gte3aD6vYObyNriZv+mDVGlhDxZTZhxBrNPH3ns25xSFtQ== +"@mui/types@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.3.tgz#06faae1c0e2f3a31c86af6f28b3a4a42143670b9" + integrity sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw== + +"@mui/utils@^5.10.3", "@mui/utils@^5.11.2", "@mui/utils@^5.7.0": + version "5.11.2" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.11.2.tgz#29764311acb99425159b159b1cb382153ad9be1f" + integrity sha512-AyizuHHlGdAtH5hOOXBW3kriuIwUIKUIgg0P7LzMvzf6jPhoQbENYqY6zJqfoZ7fAWMNNYT8mgN5EftNGzwE2w== dependencies: - "@babel/runtime" "^7.17.2" - "@mui/private-theming" "^5.4.4" - "@mui/styled-engine" "^5.4.4" - "@mui/types" "^7.1.2" - "@mui/utils" "^5.4.4" - clsx "^1.1.1" - csstype "^3.0.11" - prop-types "^15.7.2" - -"@mui/types@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.1.2.tgz#4f3678ae77a7a3efab73b6e040469cc6df2144ac" - integrity sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ== - -"@mui/utils@^5.4.2", "@mui/utils@^5.4.4": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.4.4.tgz#bd7dde4f48f60c02b6debf976bd74f3505b188fe" - integrity sha512-hfYIXEuhc2mXMGN5nUPis8beH6uE/zl3uMWJcyHX0/LN/+QxO9zhYuV6l8AsAaphHFyS/fBv0SW3Nid7jw5hKQ== - dependencies: - "@babel/runtime" "^7.17.2" - "@types/prop-types" "^15.7.4" - "@types/react-is" "^16.7.1 || ^17.0.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -"@mui/utils@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.7.0.tgz#7e96df6b871f4d3da13f26a623d73ddf9a11b19c" - integrity sha512-uWpDIEXl7bWYkJwKQQ4Rdhc2dcotVETRYuLy29V6qLYZyAbs7AMKwDDz0XKy3RMNmU7S2R/jEeSb9xjXscQUHQ== - dependencies: - "@babel/runtime" "^7.17.2" + "@babel/runtime" "^7.20.7" "@types/prop-types" "^15.7.5" "@types/react-is" "^16.7.1 || ^17.0.0" prop-types "^15.8.1" - react-is "^17.0.2" + react-is "^18.2.0" "@mui/x-data-grid@^5.0.0-beta.5": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-5.6.0.tgz#8f0c5e6bb9ac949fe50dc653463c7dd8d80d0895" - integrity sha512-Ys6L0eHelc14waRrgRw7jdoDNc6fgJcb4ev9AHvjX9zLss3xCQ4Zdk4rn+4nLUZPQcr2zbZl5pHvLx1Nq0DPTg== + version "5.17.20" + resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-5.17.20.tgz#ab50eadc330f10cdc056910598229ebcdcd3b062" + integrity sha512-khOe5l2deUBxUCkY9qKzevjIcg0l2rab2GjVwRfpJ/FUlV9cEsTvA9fSv4ylo6BsPfENBH6GPjZwxkr5GsXYgw== dependencies: - "@mui/utils" "^5.4.2" - clsx "^1.1.1" + "@babel/runtime" "^7.18.9" + "@mui/utils" "^5.10.3" + clsx "^1.2.1" prop-types "^15.8.1" - reselect "^4.1.5" + reselect "^4.1.6" -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - -"@noble/hashes@^1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== - -"@noble/hashes@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" - integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/hashes@^1", "@noble/hashes@^1.0.0": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" + integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -4358,11 +3038,6 @@ "@cosmjs/stargate" "^0.25.5" axios "^0.21.1" -"@nymproject/sdk@file:sdk/typescript/packages/sdk": - version "1.1.4" - dependencies: - comlink "^4.3.1" - "@octokit/auth-token@^2.4.4": version "2.5.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" @@ -4371,13 +3046,13 @@ "@octokit/types" "^6.0.3" "@octokit/core@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.5.1.tgz#8601ceeb1ec0e1b1b8217b960a413ed8e947809b" - integrity sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" + integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== dependencies: "@octokit/auth-token" "^2.4.4" "@octokit/graphql" "^4.5.8" - "@octokit/request" "^5.6.0" + "@octokit/request" "^5.6.3" "@octokit/request-error" "^2.0.5" "@octokit/types" "^6.0.3" before-after-hook "^2.2.0" @@ -4401,10 +3076,10 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^11.2.0": - version "11.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" - integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== +"@octokit/openapi-types@^12.11.0": + version "12.11.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" @@ -4412,11 +3087,11 @@ integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== "@octokit/plugin-paginate-rest@^2.16.8": - version "2.17.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7" - integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== + version "2.21.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e" + integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.40.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" @@ -4424,11 +3099,11 @@ integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== "@octokit/plugin-rest-endpoint-methods@^5.12.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba" - integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== + version "5.16.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342" + integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.39.0" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -4440,7 +3115,7 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.6.0": +"@octokit/request@^5.6.0", "@octokit/request@^5.6.3": version "5.6.3" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== @@ -4462,47 +3137,32 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.12.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": - version "6.34.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" - integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": + version "6.41.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== dependencies: - "@octokit/openapi-types" "^11.2.0" + "@octokit/openapi-types" "^12.11.0" -"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz#58f8217ba70069cc6a73f5d7e05e85b458c150e2" - integrity sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q== +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3", "@pmmmwh/react-refresh-webpack-plugin@^0.5.4": + 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== dependencies: ansi-html-community "^0.0.8" common-path-prefix "^3.0.0" - core-js-pure "^3.8.1" + core-js-pure "^3.23.3" error-stack-parser "^2.0.6" find-up "^5.0.0" html-entities "^2.1.0" - loader-utils "^2.0.0" + loader-utils "^2.0.4" schema-utils "^3.0.0" source-map "^0.7.3" -"@pmmmwh/react-refresh-webpack-plugin@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz#df0d0d855fc527db48aac93c218a0bf4ada41f99" - integrity sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw== - dependencies: - ansi-html-community "^0.0.8" - common-path-prefix "^3.0.0" - core-js-pure "^3.8.1" - error-stack-parser "^2.0.6" - find-up "^5.0.0" - html-entities "^2.1.0" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - source-map "^0.7.3" - -"@popperjs/core@^2.11.2", "@popperjs/core@^2.4.4": - version "2.11.2" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9" - integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== +"@popperjs/core@^2.11.6": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -4557,25 +3217,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@rollup/plugin-babel@^5.2.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" - integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@rollup/pluginutils" "^3.1.0" - -"@rollup/plugin-node-resolve@^11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" - integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.19.0" +"@remix-run/router@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.0.tgz#b6ee542c7f087b73b3d8215b9bf799f648be71cb" + integrity sha512-nwQoYb3m4DDpHTeOwpJEuDt8lWVcujhYYSFGLluC+9es2PyLjm+jjq3IeRBQbwBtPLJE/lkuHuGHr8uQLgmJRA== "@rollup/plugin-node-resolve@^15.0.1": version "15.0.1" @@ -4589,14 +3234,6 @@ is-module "^1.0.0" resolve "^1.22.1" -"@rollup/plugin-replace@^2.4.1": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - "@rollup/plugin-replace@^5.0.2": version "5.0.2" resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz#45f53501b16311feded2485e98419acb8448c61d" @@ -4623,9 +3260,9 @@ resolve "^1.22.1" "@rollup/plugin-wasm@^6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-wasm/-/plugin-wasm-6.1.1.tgz#4433583997703c46ac22ebd7d079cf8f165a909b" - integrity sha512-dccyb8OvtpY21KiYjaNmibWlQJd/kBg+IVP24x9l1dsIRXBmGqLt+wsPjU296FNO8ap0SSEsTpi/7AfrlvQvBQ== + version "6.1.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-wasm/-/plugin-wasm-6.1.2.tgz#faf57f8e2ed12b9e0e898ba67963c52e1cd5f4c3" + integrity sha512-YdrQ7zfnZ54Y+6raCev3tR1PrhQGxYKSTajGylhyP0oBacouuNo6KcNCk+pYKw9M98jxRWLFFca/udi76IDXzg== "@rollup/pluginutils@^3.1.0": version "3.1.0" @@ -4645,20 +3282,15 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rushstack/eslint-patch@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" - integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== - "@sinclair/typebox@^0.24.1": - version "0.24.19" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.19.tgz#5297278e0d8a1aea084685a3216074910ac6c113" - integrity sha512-gHJu8cdYTD5p4UqmQHrxaWrtb/jkH5imLXzuBypWhKzNkW0qfmgz+w1xaJccWVuJta1YYUdlDiPHXRTR4Ku0MQ== + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" @@ -4669,18 +3301,18 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@storybook/addon-actions@6.5.8", "@storybook/addon-actions@^6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.5.8.tgz#c1f544acc016a4a0d5dcb373535dc991b5737c5f" - integrity sha512-9ciR1iWBTzQNBDlq0iQs9+TV7gng+FbQxW5mHNxNvT9SxY1dt02wCPHZeVE/5la61wBXZs/zpEepZA93VzVBDw== +"@storybook/addon-actions@6.5.15", "@storybook/addon-actions@^6.5.8": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.5.15.tgz#ba737561dbf8a358ea8bc588f3da9fddd1a4267e" + integrity sha512-cnLzVK1S+EydFDSuvxMmMAxVqNXijBGdV9QTgsu6ys5sOkoiXRETKZmxuN8/ZRbkfc4N+1KAylSCZOOHzBQTBQ== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-events" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.8" + "@storybook/theming" "6.5.15" core-js "^3.8.2" fast-deep-equal "^3.1.3" global "^4.4.0" @@ -4694,18 +3326,18 @@ util-deprecate "^1.0.2" uuid-browser "^3.1.0" -"@storybook/addon-backgrounds@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.8.tgz#d7ab67d7bf98f7866b8f95cd92da068f00997b74" - integrity sha512-pvlP5ZVVfd2sWzgCqG/f6RJX/h9648znYbzaLQ4Z6whQIFobP3H3/cj9k/RTy3uXg5vC0IWDHSEaCXgin2sW1Q== +"@storybook/addon-backgrounds@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.15.tgz#bb97df61a9436f6f5a61f751f4f3fedcfe19fb84" + integrity sha512-9ddB3QIL8mRurf7TvYG1P9i1sW0b8Iik3kGlHggKogHER9WJPzbiUeH0XDjkASSa4rMCZdYn5CZKNkIAoJ2jdA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-events" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.8" + "@storybook/theming" "6.5.15" core-js "^3.8.2" global "^4.4.0" memoizerific "^1.11.3" @@ -4713,47 +3345,47 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/addon-controls@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.5.8.tgz#779407655d990f88e1d3bb734cf116bc419ab6ba" - integrity sha512-fB6p5DgVHUnJKUzOlT2mtvaSCincnO+vuYLyf++f+l4BlYK1Es9HNl/puaRoMgdW+LoGJjXPTIMcMByeHVIt6Q== +"@storybook/addon-controls@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.5.15.tgz#2a1f590d5624f658561b8e0ff144667248baf907" + integrity sha512-q5y0TvD0stvQoJZ2PnFmmKIRNSOI4/k2NKyZq//J2cBUBcP1reYlFxdsNwLZWmAFpSIkc2+nsliEzNxU1WByoA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-common" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-common" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/node-logger" "6.5.8" - "@storybook/store" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/node-logger" "6.5.15" + "@storybook/store" "6.5.15" + "@storybook/theming" "6.5.15" core-js "^3.8.2" lodash "^4.17.21" ts-dedent "^2.0.0" -"@storybook/addon-docs@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.5.8.tgz#0b6c379cd7b9f2544aa78fdf520939f8f9bd9ecc" - integrity sha512-pAvWwh5YCrsW9nHCrd5BpFigvqn92JisX0aEnwAqKC9B1AW1LxhdPn1o9CQCeszQGaq163RA6AzkCejvAqhtUQ== +"@storybook/addon-docs@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.5.15.tgz#d5f4b991636953f30daea6aa89d5bfdfa97b9116" + integrity sha512-k3LAu+wVp6pNhfh6B1soCRl6+7sNTNxtqy6WTrIeVJVCGbXbyc5s7gQ48gJ4WAk6meoDEZbypiP4NK1El03YLg== dependencies: "@babel/plugin-transform-react-jsx" "^7.12.12" "@babel/preset-env" "^7.12.11" "@jest/transform" "^26.6.2" "@mdx-js/react" "^1.6.22" - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-common" "6.5.15" + "@storybook/core-events" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/docs-tools" "6.5.8" + "@storybook/docs-tools" "6.5.15" "@storybook/mdx1-csf" "^0.0.1" - "@storybook/node-logger" "6.5.8" - "@storybook/postinstall" "6.5.8" - "@storybook/preview-web" "6.5.8" - "@storybook/source-loader" "6.5.8" - "@storybook/store" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/node-logger" "6.5.15" + "@storybook/postinstall" "6.5.15" + "@storybook/preview-web" "6.5.15" + "@storybook/source-loader" "6.5.15" + "@storybook/store" "6.5.15" + "@storybook/theming" "6.5.15" babel-loader "^8.0.0" core-js "^3.8.2" fast-deep-equal "^3.1.3" @@ -4766,41 +3398,41 @@ util-deprecate "^1.0.2" "@storybook/addon-essentials@^6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.5.8.tgz#db89307cb8445c49d23ecaa346516b3793baa28a" - integrity sha512-K/Aw/GLugCz5/S3c2tz5lnfC8aN6dSoQQDr8xaMDcBlT9h/xZ1l4jQQnx/mvY/qEvXtexBF41DE6ROWGKSZeSg== + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.5.15.tgz#cfbf6cacfbc7d14ac30aab118efcac818f0814ba" + integrity sha512-m3EY6BhUk6Z9Et7P5wGaRGNoEDHzJIOsLbGS/4IXvIoDfrqmNIilqUQl8kfDqpVdBSFprvpacHpKpLosu9H37w== dependencies: - "@storybook/addon-actions" "6.5.8" - "@storybook/addon-backgrounds" "6.5.8" - "@storybook/addon-controls" "6.5.8" - "@storybook/addon-docs" "6.5.8" - "@storybook/addon-measure" "6.5.8" - "@storybook/addon-outline" "6.5.8" - "@storybook/addon-toolbars" "6.5.8" - "@storybook/addon-viewport" "6.5.8" - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/node-logger" "6.5.8" + "@storybook/addon-actions" "6.5.15" + "@storybook/addon-backgrounds" "6.5.15" + "@storybook/addon-controls" "6.5.15" + "@storybook/addon-docs" "6.5.15" + "@storybook/addon-measure" "6.5.15" + "@storybook/addon-outline" "6.5.15" + "@storybook/addon-toolbars" "6.5.15" + "@storybook/addon-viewport" "6.5.15" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/core-common" "6.5.15" + "@storybook/node-logger" "6.5.15" core-js "^3.8.2" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" "@storybook/addon-interactions@^6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-interactions/-/addon-interactions-6.5.8.tgz#f44cf3aa572bc4f611bbdf60a1d2c24606523552" - integrity sha512-eX/L27xmj891A7yM7B0FjTqvT3wkgfmZ7bwOeBs+ICyBT1sEY+TaUFGm3nb0hTsQSevQZoP4Rsi+AMI3/XUxNA== + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-interactions/-/addon-interactions-6.5.15.tgz#d176a47fa45bbc41cd9ecd4f672bdd19af49bbe5" + integrity sha512-9mDhkKJeWPvfrSBvuE5zn3DAKTXw37ZT21jkQzIt+dUEu0X3jCLY1dWel3Rbr9JI/PLnUnANDHOY/YtFUfrK9Q== dependencies: "@devtools-ds/object-inspector" "^1.1.2" - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-common" "6.5.15" + "@storybook/core-events" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/instrumenter" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/instrumenter" "6.5.15" + "@storybook/theming" "6.5.15" core-js "^3.8.2" global "^4.4.0" jest-mock "^27.0.6" @@ -4808,15 +3440,15 @@ ts-dedent "^2.2.0" "@storybook/addon-links@^6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-6.5.8.tgz#ec4b640bf89dbb653592e6f05968ba771bb10b4a" - integrity sha512-UxzEPnT1PLPsuy3tt+o3UJTbI4Kihec+/yzpzzGKreUnCC8EWTsOhtMQAVVit2t4BMl4vNrxKO0mKSc8saT3Gw== + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-6.5.15.tgz#97508726090a006f6c042a687ec89496c96436c4" + integrity sha512-L7Q3u/xEUuy1uPq8ttjDfvDj19Hr2Crq/Us0RfowfGAAzOb7fCoiUJDP37ADtRUlCYyuKM5V/nHxN8eGpWtugw== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/core-events" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.8" + "@storybook/router" "6.5.15" "@types/qs" "^6.9.5" core-js "^3.8.2" global "^4.4.0" @@ -4825,83 +3457,66 @@ regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" -"@storybook/addon-measure@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-6.5.8.tgz#af4c0d1ec4394d89f79593561a898612d4c52177" - integrity sha512-zpNAt1XwBLnQ3OjCfj63J7vC2WCTyAjvbGVAsUkpQb21vr/e3sPFQZPKGwio85SYjIX7AJ+Oi28mbEwWzS8wFA== +"@storybook/addon-measure@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-6.5.15.tgz#a174bf498168e52469f602a8d6ba6160d4b8a9d6" + integrity sha512-j77WX/v6qpWK8ZuYscWLIc+Am4/WOJRsVgyXLIw1EZIviQsjoXPo7mmyoTneEIbbHfPtWlLRbtmkjh8DAVDrCA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-events" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" core-js "^3.8.2" global "^4.4.0" -"@storybook/addon-outline@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-6.5.8.tgz#e6a464ef63b67067e162e13e07d7d3629313f080" - integrity sha512-/bEjYTVJNM5QEiguS5nVQlerl5NhgOod1zLExnkchc8+FTJC58Vy7CRfzr2iaIMuf1QRPqBwSIy6ZqLJOdUfnQ== +"@storybook/addon-outline@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-6.5.15.tgz#7cf9127f3d321136d6780ea2db525b4fd2678281" + integrity sha512-8yGEZQOYypnliU3rsakoZlgT4Pkq8iOhX9JclVXZL/fJMQWFQGCsXqlLaRn8sx7qsa+21PPxY5bd2+Hv/Au4zQ== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-events" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" core-js "^3.8.2" global "^4.4.0" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.5.8.tgz#533b7f4bb925d353c9f826d5b92d6801b7418faa" - integrity sha512-16eRbbtn4/cH1xU8JlPZRdShwUwSsPcqpyH1JNl+rgYQ6SaSNq3aO/jDFeQe93guSD0YPRWHz8dKtn6OxVeozQ== +"@storybook/addon-toolbars@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.5.15.tgz#6c11c9cbcc958ffe881c04cd5f04c2f47ed22f44" + integrity sha512-btwDTgElmaaT0dBRASABbTpq6m1UiQXQmLUmxfjLxVC3I2SK5tyJKbPQ2hVLFAQHK4cQn4u45BxdZ5LDpJ830A== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/theming" "6.5.15" core-js "^3.8.2" regenerator-runtime "^0.13.7" -"@storybook/addon-viewport@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.5.8.tgz#3184a6ef12582af6f2361af27f404dffee0b32ae" - integrity sha512-MTpZWkBWNPH55iNHK4tBNKTdew5xKfoNvOj0pZn1rYDHlylMTlq7aoccwRjjK2jZeHHNnb1rm6ZkQDjmYu0Tcw== +"@storybook/addon-viewport@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.5.15.tgz#c30d0f865d86658c380d31f1ae3589392046e23b" + integrity sha512-oOiVzgFMlTnzPLVoHWQNzWdmpksrUyT6Aq8ZOyBPNMQ0RN2doIgFr7W53nZ1OBB5cPQx9q2FgWwzJ7Tawo+iVA== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-events" "6.5.15" + "@storybook/theming" "6.5.15" core-js "^3.8.2" global "^4.4.0" memoizerific "^1.11.3" prop-types "^15.7.2" regenerator-runtime "^0.13.7" -"@storybook/addons@6.4.19": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.4.19.tgz#797d912b8b5a86cd6e0d31fa4c42d1f80808a432" - integrity sha512-QNyRYhpqmHV8oJxxTBdkRlLSbDFhpBvfvMfIrIT1UXb/eemdBZTaCGVvXZ9UixoEEI7f8VwAQ44IvkU5B1509w== - dependencies: - "@storybook/api" "6.4.19" - "@storybook/channels" "6.4.19" - "@storybook/client-logger" "6.4.19" - "@storybook/core-events" "6.4.19" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/router" "6.4.19" - "@storybook/theming" "6.4.19" - "@types/webpack-env" "^1.16.0" - core-js "^3.8.2" - global "^4.4.0" - regenerator-runtime "^0.13.7" - "@storybook/addons@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.5.15.tgz#3c3fafbf3c9ce2182d652cb6682f6581ba6580e1" @@ -4919,46 +3534,6 @@ global "^4.4.0" regenerator-runtime "^0.13.7" -"@storybook/addons@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.5.8.tgz#c529a2989830a09d26308277a3e356228479053d" - integrity sha512-L3LmbsYP9tDHHvpr/yv8YuEkzym7SXp/jZ0km31tpG3EuZmgGu7MXPrZ2ymEw4PkAhQzztgRr23VTfKobGUojA== - dependencies: - "@storybook/api" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.8" - "@storybook/theming" "6.5.8" - "@types/webpack-env" "^1.16.0" - core-js "^3.8.2" - global "^4.4.0" - regenerator-runtime "^0.13.7" - -"@storybook/api@6.4.19": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.4.19.tgz#8000a0e4c52c39b910b4ccc6731419e8e71800ef" - integrity sha512-aDvea+NpQCBjpNp9YidO1Pr7fzzCp15FSdkG+2ihGQfv5raxrN+IIJnGUXecpe71nvlYiB+29UXBVK7AL0j51Q== - dependencies: - "@storybook/channels" "6.4.19" - "@storybook/client-logger" "6.4.19" - "@storybook/core-events" "6.4.19" - "@storybook/csf" "0.0.2--canary.87bc651.0" - "@storybook/router" "6.4.19" - "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.4.19" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" - telejson "^5.3.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - "@storybook/api@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.5.15.tgz#a189dac82a57ae9cfac43c887207b1075a2a2e96" @@ -4982,29 +3557,6 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/api@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.5.8.tgz#8bd400b8a5b18ec6bff5d35a898593d9c1c630f9" - integrity sha512-/MueV+wLCvy9gFA3ih4g7QYjDmn14i+D2ydonfaEC7R+agFGXxXwJGPKkz3yBNrRpNkBwcbY9mAmv8lE2AqgqQ== - dependencies: - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/router" "6.5.8" - "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.5.8" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" - telejson "^6.0.8" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - "@storybook/builder-webpack4@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.5.15.tgz#8050b2eec84e055eee9b181e067d9a8aa76e252a" @@ -5059,26 +3611,26 @@ webpack-virtual-modules "^0.2.2" "@storybook/builder-webpack5@^6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-6.5.8.tgz#8d1e366c4bc2c8bec49849073031cfd195682309" - integrity sha512-bc7LSGzOqTUImejsfjWAHEHwBreoPQKS6pfnWYkjKMvfvWOwlHSAxwOSM5DyS4cvpcpMDG8yBJNz2QcvXFVLxA== + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-6.5.15.tgz#0c45ed6699d88a9d51f00c8c312750fcd707c37d" + integrity sha512-BnSoAmI02pvbGBSyzCx+voXb/d5EopQ78zx/lYv4CeOspBFOYEfGvAgYHILFo04V12S2/k8aSOc/tCYw5AqPtw== dependencies: "@babel/core" "^7.12.10" - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/node-logger" "6.5.8" - "@storybook/preview-web" "6.5.8" - "@storybook/router" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/api" "6.5.15" + "@storybook/channel-postmessage" "6.5.15" + "@storybook/channels" "6.5.15" + "@storybook/client-api" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/components" "6.5.15" + "@storybook/core-common" "6.5.15" + "@storybook/core-events" "6.5.15" + "@storybook/node-logger" "6.5.15" + "@storybook/preview-web" "6.5.15" + "@storybook/router" "6.5.15" "@storybook/semver" "^7.3.2" - "@storybook/store" "6.5.8" - "@storybook/theming" "6.5.8" + "@storybook/store" "6.5.15" + "@storybook/theming" "6.5.15" "@types/node" "^14.0.10 || ^16.0.0" babel-loader "^8.0.0" babel-plugin-named-exports-order "^0.0.2" @@ -5115,19 +3667,6 @@ qs "^6.10.0" telejson "^6.0.8" -"@storybook/channel-postmessage@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.5.8.tgz#989af9a55eba391b64487640f6b5b0cfd1fde2f9" - integrity sha512-6IkIKk+UMYKk05vN8gWHvvOV/EZNXpQG/5gesGDALjkCyvRmcktHak1a9tHpoihZ3L7/gDwXOZraCZmuy8vBcQ== - dependencies: - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - core-js "^3.8.2" - global "^4.4.0" - qs "^6.10.0" - telejson "^6.0.8" - "@storybook/channel-websocket@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.5.15.tgz#3fa090412d122428a7bc3d622e4cd36fdac7dd78" @@ -5139,26 +3678,6 @@ global "^4.4.0" telejson "^6.0.8" -"@storybook/channel-websocket@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.5.8.tgz#722743619f86ebc9325bbff026acf6eba13b21ca" - integrity sha512-lAtvgO0FWsyS3u7uFbsGIYp2aSWJfWU/LOtc3x1K5c84JJAd9fncYkyZMwP1gMbdNgYxJoxe8HXtVtfeNegPuQ== - dependencies: - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - core-js "^3.8.2" - global "^4.4.0" - telejson "^6.0.8" - -"@storybook/channels@6.4.19": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.4.19.tgz#095bbaee494bf5b03f7cb92d34626f2f5063cb31" - integrity sha512-EwyoncFvTfmIlfsy8jTfayCxo2XchPkZk/9txipugWSmc057HdklMKPLOHWP0z5hLH0IbVIKXzdNISABm36jwQ== - dependencies: - core-js "^3.8.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - "@storybook/channels@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.5.15.tgz#586681b6ec458124da084c39bc8c518d9e96b10b" @@ -5168,15 +3687,6 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/channels@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.5.8.tgz#e85ffd2076813b67336b1b9b274c37aa5f1b80e0" - integrity sha512-fNql1lEIvWlI1NiRtwFMWOOvfW6qxgeSP6xoqiAJ0b+QYegEFG9UxJDuEvVHq++S81FulgQ5U+p+5R9XSV19tQ== - dependencies: - core-js "^3.8.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - "@storybook/client-api@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.5.15.tgz#70f3ced6d0fcc7b71217cae858bf81c3b2c50eba" @@ -5203,41 +3713,7 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-api@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.5.8.tgz#cf1b3d4a71a3a156636a9b6b51acc4239b259d86" - integrity sha512-mdU+qQ4+T2OUbEnl+3MWRKxEPju/EOIUg66hMgmif8c5u7YFYBFulUMUYLICMjll8Jlu+37+g+qO3K2eEz6CEw== - dependencies: - "@storybook/addons" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.8" - "@types/qs" "^6.9.5" - "@types/webpack-env" "^1.16.0" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/client-logger@6.4.19", "@storybook/client-logger@^6.4.0 || >=6.5.0-0": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.4.19.tgz#b2011ad2fa446cce4a9afdb41974b2a576e9fad2" - integrity sha512-zmg/2wyc9W3uZrvxaW4BfHcr40J0v7AGslqYXk9H+ERLVwIvrR4NhxQFaS6uITjBENyRDxwzfU3Va634WcmdDQ== - dependencies: - core-js "^3.8.2" - global "^4.4.0" - -"@storybook/client-logger@6.5.15": +"@storybook/client-logger@6.5.15", "@storybook/client-logger@^6.4.0 || >=6.5.0-0": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.5.15.tgz#0d9878af893a3493b6ee108cc097ae1436d7da4d" integrity sha512-0uyxKvodq+FycGv6aUwC1wUR6suXf2+7ywMFAOlYolI4UvNj8NyU/5AfgKT5XnxYAgPmoCiAjOE700TrfHrosw== @@ -5245,14 +3721,6 @@ core-js "^3.8.2" global "^4.4.0" -"@storybook/client-logger@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.5.8.tgz#551f818c4448ef6e6adf9c3ad256e1ae61e2d75c" - integrity sha512-dH6HSaVuOIMHy1+rpsqcD3SJxVZEEbuEtsNpdUGwLJaIuduhUJJpM2xQfUW0siZDyrgwoa+znll+G0YNUbv7sg== - dependencies: - core-js "^3.8.2" - global "^4.4.0" - "@storybook/components@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.5.15.tgz#8145be807bf48c1d010f29114411f390a9e3228f" @@ -5267,21 +3735,6 @@ regenerator-runtime "^0.13.7" util-deprecate "^1.0.2" -"@storybook/components@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.5.8.tgz#eb18cfcc4e88b7f4081b20b8a81b92d7ae9eaeac" - integrity sha512-YE+LZ1/GXoqertxodsf+L9ehcohbICRAxgE/iNqc7MZfk95SD3XRSUbxhCpGe8QTIZJpzs1tK4LFZ3Fg5w/+Lg== - dependencies: - "@storybook/client-logger" "6.5.8" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/theming" "6.5.8" - "@types/react-syntax-highlighter" "11.0.5" - core-js "^3.8.2" - qs "^6.10.0" - react-syntax-highlighter "^15.4.5" - regenerator-runtime "^0.13.7" - util-deprecate "^1.0.2" - "@storybook/core-client@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.5.15.tgz#57d86a07f920ab0cb058820dbcb1f48cc9dc6257" @@ -5308,32 +3761,6 @@ unfetch "^4.2.0" util-deprecate "^1.0.2" -"@storybook/core-client@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.5.8.tgz#4be4ce024a74b51c0650d346f1f3a11a0f921952" - integrity sha512-8x8qKQ2clvpfDcoWrNBmQ8Xt9z/i32TFIBp4PEZMcbB7eqo517nzfllLiXDipiJgO7BGxKtY5CRHQ9pAU9G27A== - dependencies: - "@storybook/addons" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/channel-websocket" "6.5.8" - "@storybook/client-api" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/preview-web" "6.5.8" - "@storybook/store" "6.5.8" - "@storybook/ui" "6.5.8" - airbnb-js-shims "^2.2.1" - ansi-to-html "^0.6.11" - core-js "^3.8.2" - global "^4.4.0" - lodash "^4.17.21" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - ts-dedent "^2.0.0" - unfetch "^4.2.0" - util-deprecate "^1.0.2" - "@storybook/core-common@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.5.15.tgz#3ab524c7abdae52024caeb5c0349a764cb08769f" @@ -5390,69 +3817,6 @@ util-deprecate "^1.0.2" webpack "4" -"@storybook/core-common@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.5.8.tgz#6972c7109477914f9ed72bedbe3769cec0eb8c56" - integrity sha512-ELGKLMx1d0oEA2LT+fsmo85X2RNE1EO+It7B1bw//g7jyf1hmZ7t3lXMZUCqt7eml1qy1N72LDkfmmU+H9H6ww== - dependencies: - "@babel/core" "^7.12.10" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-decorators" "^7.12.12" - "@babel/plugin-proposal-export-default-from" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-private-property-in-object" "^7.12.1" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.12" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/preset-env" "^7.12.11" - "@babel/preset-react" "^7.12.10" - "@babel/preset-typescript" "^7.12.7" - "@babel/register" "^7.12.1" - "@storybook/node-logger" "6.5.8" - "@storybook/semver" "^7.3.2" - "@types/node" "^14.0.10 || ^16.0.0" - "@types/pretty-hrtime" "^1.0.0" - babel-loader "^8.0.0" - babel-plugin-macros "^3.0.1" - babel-plugin-polyfill-corejs3 "^0.1.0" - chalk "^4.1.0" - core-js "^3.8.2" - express "^4.17.1" - file-system-cache "^1.0.5" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.0.4" - fs-extra "^9.0.1" - glob "^7.1.6" - handlebars "^4.7.7" - interpret "^2.2.0" - json5 "^2.1.3" - lazy-universal-dotenv "^3.0.1" - picomatch "^2.3.0" - pkg-dir "^5.0.0" - pretty-hrtime "^1.0.3" - resolve-from "^5.0.0" - slash "^3.0.0" - telejson "^6.0.8" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - webpack "4" - -"@storybook/core-events@6.4.19": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.4.19.tgz#d2a03156783a3cb9bd9f7ba81a06a798a5c296ae" - integrity sha512-KICzUw6XVQUJzFSCXfvhfHAuyhn4Q5J4IZEfuZkcGJS4ODkrO6tmpdYE5Cfr+so95Nfp0ErWiLUuodBsW9/rtA== - dependencies: - core-js "^3.8.2" - "@storybook/core-events@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.5.15.tgz#c12f645b50231c50eb9b26038aa67ab92b1ba24e" @@ -5460,13 +3824,6 @@ dependencies: core-js "^3.8.2" -"@storybook/core-events@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.5.8.tgz#bc405d37d0ed1a6eafa2682fc085b2a7a992233c" - integrity sha512-lzG4Lg65WFYvjs2k/E3CP4+eyPexEGrDyRMO9Pbj9H9x+eosYptauEbT/wXF83bmUWZKLWWVUAZX7hDcxBO8cw== - dependencies: - core-js "^3.8.2" - "@storybook/core-server@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.5.15.tgz#217c40d7a33708b9ac69f73dd51ed9d2f031d19d" @@ -5553,13 +3910,6 @@ dependencies: lodash "^4.17.15" -"@storybook/csf@0.0.2--canary.87bc651.0": - version "0.0.2--canary.87bc651.0" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.2--canary.87bc651.0.tgz#c7b99b3a344117ef67b10137b6477a3d2750cf44" - integrity sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw== - dependencies: - lodash "^4.17.15" - "@storybook/csf@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" @@ -5580,38 +3930,15 @@ lodash "^4.17.21" regenerator-runtime "^0.13.7" -"@storybook/docs-tools@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/docs-tools/-/docs-tools-6.5.8.tgz#6189fd20fafa9eb2aa4a19e311d65295992dd105" - integrity sha512-CWMW+3LSstvQmHKV5ggPR1beQZTpwCXEhfysZ9u4Yp/4fcoDIuQ7DTOK5uNFynGCGl1FG3lATriEOhEZ3bZCvQ== +"@storybook/instrumenter@6.5.15", "@storybook/instrumenter@^6.4.0 || >=6.5.0-0": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-6.5.15.tgz#4dcb826201fcc09465fd5d6e37bd9147ec1dcfd0" + integrity sha512-93WyH0s63RCv496eHjQ5dWFXoExXg9dlNMe7i4/FVVbWeDdb1pPVIHsLn28WxOiVQahQEAW2EA7Mao3BiBWg+A== dependencies: - "@babel/core" "^7.12.10" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/client-logger" "6.5.15" + "@storybook/core-events" "6.5.15" core-js "^3.8.2" - doctrine "^3.0.0" - lodash "^4.17.21" - regenerator-runtime "^0.13.7" - -"@storybook/instrumenter@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-6.5.8.tgz#ef8f96e59ede7ab6c4db63ab8ad0ee769caedd1d" - integrity sha512-MENB68yhmOnmBJW8NzlBSiFD4I7GfnBUMNMlGuoq6mT3/2C3BZqwtiVUx2ry1Rf+Yl9yoI3jMUa/JOJrQ/B34w== - dependencies: - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - core-js "^3.8.2" - global "^4.4.0" - -"@storybook/instrumenter@^6.4.0 || >=6.5.0-0": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-6.4.19.tgz#1586624d0315713c20f3d7b4e2c7fc595730b934" - integrity sha512-KwOJUW7tItZw1CLffUbaSfEzH1p1HdGmJs1Q42uWGJSbXbVHZ7i7bJWYb3Lf90+yHTlqQjTr1PKAymwDwHseTA== - dependencies: - "@storybook/addons" "6.4.19" - "@storybook/client-logger" "6.4.19" - "@storybook/core-events" "6.4.19" global "^4.4.0" "@storybook/manager-webpack4@6.5.15": @@ -5656,19 +3983,19 @@ webpack-virtual-modules "^0.2.2" "@storybook/manager-webpack5@^6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/manager-webpack5/-/manager-webpack5-6.5.8.tgz#36e97096506073c837716897495fffe4a616fe83" - integrity sha512-foW/ZvTqGZAl4TfcfGKdS3RlaBDDAgEjUCbCaVShlZRshZ8tzWBVu3JQFqbPVGslH89T5qp9DUYoN/SJqTUpcg== + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/manager-webpack5/-/manager-webpack5-6.5.15.tgz#e17ae2538c7bd013e77597f20a3843e448d1cb5b" + integrity sha512-yrHVFUHGdVRWq/oGJwQu+UOZzxELH5SS+Lpn5oIQ/Dblam9piQC0KmBZtFuA9X8acaw4BBVnXgF/aiqs9fOp/Q== dependencies: "@babel/core" "^7.12.10" "@babel/plugin-transform-template-literals" "^7.12.1" "@babel/preset-react" "^7.12.10" - "@storybook/addons" "6.5.8" - "@storybook/core-client" "6.5.8" - "@storybook/core-common" "6.5.8" - "@storybook/node-logger" "6.5.8" - "@storybook/theming" "6.5.8" - "@storybook/ui" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/core-client" "6.5.15" + "@storybook/core-common" "6.5.15" + "@storybook/node-logger" "6.5.15" + "@storybook/theming" "6.5.15" + "@storybook/ui" "6.5.15" "@types/node" "^14.0.10 || ^16.0.0" babel-loader "^8.0.0" case-sensitive-paths-webpack-plugin "^2.3.0" @@ -5721,21 +4048,10 @@ npmlog "^5.0.1" pretty-hrtime "^1.0.3" -"@storybook/node-logger@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.5.8.tgz#d1244c846da5a296a7432444f8682f77853fb81e" - integrity sha512-BHdkSipgjnfsh4FRYbV2R0npM5gVx9JLRsDQ0KiTolRpN4SU98kT/6885zb9jZg6I0EY+UG9Qdr3fvL9VLpY1g== - dependencies: - "@types/npmlog" "^4.1.2" - chalk "^4.1.0" - core-js "^3.8.2" - npmlog "^5.0.1" - pretty-hrtime "^1.0.3" - -"@storybook/postinstall@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.5.8.tgz#e803fd5652eea68e7da81f6d70e46d9db9c633c1" - integrity sha512-Z6zQnBOaMj+gHtF1XPMpwTIxYRCmh6eNirrJLrkPk5c+fKXtw6+vNCbmPvsyTGxGEHnyn/tYwe1fvwJTHDctUw== +"@storybook/postinstall@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.5.15.tgz#90989c8049357a6df6f38c933172210c9c6caf8c" + integrity sha512-l7pApTgLD10OedNOyuf4vUdVCHLOSaIUIL9gdJl1WaSFHiUpJvvzBIh5M4aRICYPbnuExQc8y2GAjERKO4Ep+g== dependencies: core-js "^3.8.2" @@ -5761,28 +4077,6 @@ unfetch "^4.2.0" util-deprecate "^1.0.2" -"@storybook/preview-web@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/preview-web/-/preview-web-6.5.8.tgz#b1c86d56e99032c02ba47bab628c36d76a0385b6" - integrity sha512-jEEAgvTVZfFA0B20mRJfLW6dPA5mG5PxUJtjMx6wH4Yw4+i3Sld/U63hTRt7ktpKdrcu4lX9E+PuaRLPq7S2kg== - dependencies: - "@storybook/addons" "6.5.8" - "@storybook/channel-postmessage" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - "@storybook/store" "6.5.8" - ansi-to-html "^0.6.11" - core-js "^3.8.2" - global "^4.4.0" - lodash "^4.17.21" - qs "^6.10.0" - regenerator-runtime "^0.13.7" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - unfetch "^4.2.0" - util-deprecate "^1.0.2" - "@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0": version "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0" resolved "https://registry.yarnpkg.com/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0.tgz#3103532ff494fb7dc3cf835f10740ecf6a26c0f9" @@ -5837,23 +4131,6 @@ util-deprecate "^1.0.2" webpack ">=4.43.0 <6.0.0" -"@storybook/router@6.4.19": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.4.19.tgz#e653224dd9a521836bbd2610f604f609a2c77af2" - integrity sha512-KWWwIzuyeEIWVezkCihwY2A76Il9tUNg0I410g9qT7NrEsKyqXGRYOijWub7c1GGyNjLqz0jtrrehtixMcJkuA== - dependencies: - "@storybook/client-logger" "6.4.19" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - history "5.0.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - qs "^6.10.0" - react-router "^6.0.0" - react-router-dom "^6.0.0" - ts-dedent "^2.0.0" - "@storybook/router@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.5.15.tgz#bf01d35bdd4603bf188629a6578489e313a312fd" @@ -5865,15 +4142,6 @@ qs "^6.10.0" regenerator-runtime "^0.13.7" -"@storybook/router@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.5.8.tgz#241e3842bdd174e0eeeb9d1de6adb2975615884d" - integrity sha512-tseNJpZ2ZzVYowjekUMpGJVVRMrwOkttieD9mRbHrhh+2n7b+SoMKnuLi3ow0xeOyPL8ZDng2FgRjQzQHXA5Sw== - dependencies: - "@storybook/client-logger" "6.5.8" - core-js "^3.8.2" - regenerator-runtime "^0.13.7" - "@storybook/semver@^7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" @@ -5882,18 +4150,18 @@ core-js "^3.6.5" find-up "^4.1.0" -"@storybook/source-loader@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.5.8.tgz#106694fe821f5e42abc4e8e653e5f268a043e470" - integrity sha512-3bVxXKE2o6lS4WGga/S7WwgITxPQ96qsY+pQ1I7A+e4/cKSmZxlVWM9qfMW2ScmHTVoZE0Ujsmn6DWftxzCyrQ== +"@storybook/source-loader@6.5.15": + version "6.5.15" + resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.5.15.tgz#363a9b2812a2cef6cc5cb948e55d8a2624e18643" + integrity sha512-MaWzki40g0/7NWmJgUBhOp+e7y8Ohw6G/bRr/rcDP7eXSnud6ThYylXv0QqBScLPPTy8txjmBClCoqdLGyvLWQ== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" + "@storybook/addons" "6.5.15" + "@storybook/client-logger" "6.5.15" "@storybook/csf" "0.0.2--canary.4566f4d.1" core-js "^3.8.2" estraverse "^5.2.0" global "^4.4.0" - loader-utils "^2.0.0" + loader-utils "^2.0.4" lodash "^4.17.21" prettier ">=2.2.1 <=2.3.0" regenerator-runtime "^0.13.7" @@ -5919,27 +4187,6 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/store@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/store/-/store-6.5.8.tgz#528bf9a2decf5121045fb0a19b8caf795b4a5647" - integrity sha512-5rhGjN/O0oLebRv947B0vgapq48qBBBYYOgq4krRUYU2ecS6LUgtAHR/kTa324o9aBO8cnIXHH78jZcSvMiJlQ== - dependencies: - "@storybook/addons" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/csf" "0.0.2--canary.4566f4d.1" - core-js "^3.8.2" - fast-deep-equal "^3.1.3" - global "^4.4.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - regenerator-runtime "^0.13.7" - slash "^3.0.0" - stable "^0.1.8" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - "@storybook/telemetry@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/telemetry/-/telemetry-6.5.15.tgz#852050c1e54bf704a104e47e4e498d999096e0e7" @@ -5969,24 +4216,6 @@ "@testing-library/user-event" "^13.2.1" ts-dedent "^2.2.0" -"@storybook/theming@6.4.19": - version "6.4.19" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.4.19.tgz#0a6834d91e0b0eadbb10282e7fb2947e2bbf9e9e" - integrity sha512-V4pWmTvAxmbHR6B3jA4hPkaxZPyExHvCToy7b76DpUTpuHihijNDMAn85KhOQYIeL9q14zP/aiz899tOHsOidg== - dependencies: - "@emotion/core" "^10.1.1" - "@emotion/is-prop-valid" "^0.8.6" - "@emotion/styled" "^10.0.27" - "@storybook/client-logger" "6.4.19" - core-js "^3.8.2" - deep-object-diff "^1.1.0" - emotion-theming "^10.0.27" - global "^4.4.0" - memoizerific "^1.11.3" - polished "^4.0.5" - resolve-from "^5.0.0" - ts-dedent "^2.0.0" - "@storybook/theming@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.5.15.tgz#048461b37ad0c29dc8d91a065a6bf1c90067524c" @@ -5997,15 +4226,6 @@ memoizerific "^1.11.3" regenerator-runtime "^0.13.7" -"@storybook/theming@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.5.8.tgz#240a3c83ea53a9c7b1f3a2c47d6324f38ecb8771" - integrity sha512-1VaKHqj38Ls1bJwDpg3+aEOlvVib/DCFkP6WYrP/AQtNAzxiyw5WkaoRlTVJZvCdu5TxjpG4O6/Ai5TI9QftIg== - dependencies: - "@storybook/client-logger" "6.5.8" - core-js "^3.8.2" - regenerator-runtime "^0.13.7" - "@storybook/ui@6.5.15": version "6.5.15" resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.5.15.tgz#e4d80465116e53d48d2c3bb616909c37f5405181" @@ -6026,365 +4246,176 @@ regenerator-runtime "^0.13.7" resolve-from "^5.0.0" -"@storybook/ui@6.5.8": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.5.8.tgz#acd8dadd221c68f65c4963c4ab86b4a757860591" - integrity sha512-rL09kxgY9pCVbxr/VUK4b5FL5VbALfciZR+50sNT1EcTDb9k0OPeqx7a4Ptc+KNkgyPdSTxUGvhzVqH5PYrhZQ== +"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + +"@svgr/babel-plugin-remove-jsx-attribute@*": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e" + integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@*": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8" + integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + +"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + +"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + +"@svgr/babel-plugin-transform-svg-component@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + +"@svgr/babel-preset@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== dependencies: - "@storybook/addons" "6.5.8" - "@storybook/api" "6.5.8" - "@storybook/channels" "6.5.8" - "@storybook/client-logger" "6.5.8" - "@storybook/components" "6.5.8" - "@storybook/core-events" "6.5.8" - "@storybook/router" "6.5.8" - "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.5.8" - core-js "^3.8.2" - regenerator-runtime "^0.13.7" - resolve-from "^5.0.0" + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@surma/rollup-plugin-off-main-thread@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" - integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== +"@svgr/core@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: - ejs "^3.1.6" - json5 "^2.2.0" - magic-string "^0.25.0" - string.prototype.matchall "^4.0.6" - -"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" - integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== - -"@svgr/babel-plugin-add-jsx-attribute@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz#bd6d1ff32a31b82b601e73672a789cc41e84fe18" - integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA== - -"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" - integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== - -"@svgr/babel-plugin-remove-jsx-attribute@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz#58654908beebfa069681a83332544b17e5237e89" - integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw== - -"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" - integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz#d06dd6e8a8f603f92f9979bb9990a1f85a4f57ba" - integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" - integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz#0b85837577b02c31c09c758a12932820f5245cee" - integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ== - -"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" - integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== - -"@svgr/babel-plugin-svg-dynamic-title@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz#28236ec26f7ab9d486a487d36ae52d58ba15676f" - integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg== - -"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" - integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== - -"@svgr/babel-plugin-svg-em-dimensions@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz#40267c5dea1b43c4f83a0eb6169e08b43d8bafce" - integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA== - -"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" - integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== - -"@svgr/babel-plugin-transform-react-native-svg@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz#eb688d0a5f539e34d268d8a516e81f5d7fede7c9" - integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ== - -"@svgr/babel-plugin-transform-svg-component@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" - integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== - -"@svgr/babel-plugin-transform-svg-component@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz#7ba61d9fc1fb42b0ba1a04e4630019fa7e993c4f" - integrity sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg== - -"@svgr/babel-preset@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" - integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" - "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" - "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" - "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" - "@svgr/babel-plugin-transform-svg-component" "^5.5.0" - -"@svgr/babel-preset@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.2.0.tgz#1d3ad8c7664253a4be8e4a0f0e6872f30d8af627" - integrity sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^6.0.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.0.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.0.0" - "@svgr/babel-plugin-svg-dynamic-title" "^6.0.0" - "@svgr/babel-plugin-svg-em-dimensions" "^6.0.0" - "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0" - "@svgr/babel-plugin-transform-svg-component" "^6.2.0" - -"@svgr/core@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" - integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== - dependencies: - "@svgr/plugin-jsx" "^5.5.0" - camelcase "^6.2.0" - cosmiconfig "^7.0.0" - -"@svgr/core@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.2.1.tgz#195de807a9f27f9e0e0d678e01084b05c54fdf61" - integrity sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA== - dependencies: - "@svgr/plugin-jsx" "^6.2.1" + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" camelcase "^6.2.0" cosmiconfig "^7.0.1" -"@svgr/hast-util-to-babel-ast@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" - integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== +"@svgr/hast-util-to-babel-ast@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== dependencies: - "@babel/types" "^7.12.6" + "@babel/types" "^7.20.0" + entities "^4.4.0" -"@svgr/hast-util-to-babel-ast@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz#ae065567b74cbe745afae617053adf9a764bea25" - integrity sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ== +"@svgr/plugin-jsx@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== dependencies: - "@babel/types" "^7.15.6" - entities "^3.0.1" + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" -"@svgr/plugin-jsx@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" - integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== - dependencies: - "@babel/core" "^7.12.3" - "@svgr/babel-preset" "^5.5.0" - "@svgr/hast-util-to-babel-ast" "^5.5.0" - svg-parser "^2.0.2" - -"@svgr/plugin-jsx@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz#5668f1d2aa18c2f1bb7a1fc9f682d3f9aed263bd" - integrity sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g== - dependencies: - "@babel/core" "^7.15.5" - "@svgr/babel-preset" "^6.2.0" - "@svgr/hast-util-to-babel-ast" "^6.2.1" - svg-parser "^2.0.2" - -"@svgr/plugin-svgo@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" - integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== - dependencies: - cosmiconfig "^7.0.0" - deepmerge "^4.2.2" - svgo "^1.2.2" - -"@svgr/plugin-svgo@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz#4cbe6a33ccccdcae4e3b63ded64cc1cbe1faf48c" - integrity sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q== +"@svgr/plugin-svgo@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== dependencies: cosmiconfig "^7.0.1" deepmerge "^4.2.2" - svgo "^2.5.0" - -"@svgr/webpack@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" - integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== - dependencies: - "@babel/core" "^7.12.3" - "@babel/plugin-transform-react-constant-elements" "^7.12.1" - "@babel/preset-env" "^7.12.1" - "@babel/preset-react" "^7.12.5" - "@svgr/core" "^5.5.0" - "@svgr/plugin-jsx" "^5.5.0" - "@svgr/plugin-svgo" "^5.5.0" - loader-utils "^2.0.0" + svgo "^2.8.0" "@svgr/webpack@^6.1.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.2.1.tgz#ef5d51c1b6be4e7537fb9f76b3f2b2e22b63c58d" - integrity sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw== + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== dependencies: - "@babel/core" "^7.15.5" - "@babel/plugin-transform-react-constant-elements" "^7.14.5" - "@babel/preset-env" "^7.15.6" - "@babel/preset-react" "^7.14.5" - "@babel/preset-typescript" "^7.15.0" - "@svgr/core" "^6.2.1" - "@svgr/plugin-jsx" "^6.2.1" - "@svgr/plugin-svgo" "^6.2.0" + "@babel/core" "^7.19.6" + "@babel/plugin-transform-react-constant-elements" "^7.18.12" + "@babel/preset-env" "^7.19.4" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@svgr/core" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + "@svgr/plugin-svgo" "^6.5.1" "@tauri-apps/api@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.2.0.tgz#1f196b3e012971227f41b98214c846430a4eb477" integrity sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw== -"@tauri-apps/cli-darwin-arm64@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.0.5.tgz#6fd17a8d9e0e7982b5c9887639407fdec783a744" - integrity sha512-oxpFb9ZeMiC3xPUJ9NsXWCnnwFSVkPbJUvDKpc9IaoDIUpsMTV72W4P0Nh0uQRbyhx4modPpstt7+ONypNVYNg== +"@tauri-apps/cli-darwin-arm64@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.2.3.tgz#dae9142e683c00199f4d7e088f22b564b08b9cac" + integrity sha512-phJN3fN8FtZZwqXg08bcxfq1+X1JSDglLvRxOxB7VWPq+O5SuB8uLyssjJsu+PIhyZZnIhTGdjhzLSFhSXfLsw== -"@tauri-apps/cli-darwin-arm64@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.2.2.tgz#f18b0689b399b64dc67da41c0fd4da474be324fe" - integrity sha512-W+Cp2weUMlvmGkRJeUjypbz9Lpl6o98xkgKAtobZSum5SNwpsBQfawJTESakNoD+FXyVg/snIk5sRdHge+tAaA== +"@tauri-apps/cli-darwin-x64@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.2.3.tgz#c6f84a11a1a7800e3e8e22c8fa5b95d0b3d1f802" + integrity sha512-jFZ/y6z8z6v4yliIbXKBXA7BJgtZVMsITmEXSuD6s5+eCOpDhQxbRkr6CA+FFfr+/r96rWSDSgDenDQuSvPAKw== -"@tauri-apps/cli-darwin-x64@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.0.5.tgz#6aaaadd68739c4c4f86546f3d17b2fb60a5a0c04" - integrity sha512-hRNYC6L9edz2dEqK33tssPylF2ti6x6udidBlGWc5GSoeEb/05qKMEA1MESQYKBG+4q+wjJvACA2vvz6AfgJ3Q== +"@tauri-apps/cli-linux-arm-gnueabihf@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.2.3.tgz#ecccec4c255ab32903fb36e1c746ed7b4eff0d1d" + integrity sha512-C7h5vqAwXzY0kRGSU00Fj8PudiDWFCiQqqUNI1N+fhCILrzWZB9TPBwdx33ZfXKt/U4+emdIoo/N34v3TiAOmQ== -"@tauri-apps/cli-darwin-x64@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.2.2.tgz#4450bd244f586da346651f62a5a41686cee36db7" - integrity sha512-vmVAqt+ECH2d6cbcGJ7ddcCAZgmKe5xmxlL5r4xoaphu7OqU4gnv4VFURYkVltOfwzIFQVOPVSqwYyIDToCYNQ== +"@tauri-apps/cli-linux-arm64-gnu@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.2.3.tgz#c3915de83a8fbe6f406eaa0b524a17c091a9a2cd" + integrity sha512-buf1c8sdkuUzVDkGPQpyUdAIIdn5r0UgXU6+H5fGPq/Xzt5K69JzXaeo6fHsZEZghbV0hOK+taKV4J0m30UUMQ== -"@tauri-apps/cli-linux-arm-gnueabihf@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.0.5.tgz#d2d01c8b85ee3771656386bfda3852af8ed811da" - integrity sha512-hc/Jp3TtFpxB8XVkLEwWy7MNcUBlS8rNCafQBUt4KSElXB+/oGo50jPO+wd5GSMSOR59UCzH08v11P0b+sAa/w== +"@tauri-apps/cli-linux-arm64-musl@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.2.3.tgz#40f9f7cf0b4088964661fd412eff7310cb4ac605" + integrity sha512-x88wPS9W5xAyk392vc4uNHcKBBvCp0wf4H9JFMF9OBwB7vfd59LbQCFcPSu8f0BI7bPrOsyHqspWHuFL8ojQEA== -"@tauri-apps/cli-linux-arm-gnueabihf@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.2.2.tgz#a4d5b95665620605fb0f54cb77f8134239b58370" - integrity sha512-yYTdQurgi4QZR8z+fANjl522jdQz/VtesFpw+C/A0+zXg7tiRjicsywBDdPsvNzCqFeGKKkmTR+Lny5qxhGaeQ== +"@tauri-apps/cli-linux-x64-gnu@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.2.3.tgz#0b3e4c1fda6205dbe872f4b69506669476f60591" + integrity sha512-ZMz1jxEVe0B4/7NJnlPHmwmSIuwiD6ViXKs8F+OWWz2Y4jn5TGxWKFg7DLx5OwQTRvEIZxxT7lXHi5CuTNAxKg== -"@tauri-apps/cli-linux-arm64-gnu@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.0.5.tgz#7ca848120c2e90b57188aaa9daee11cf29e2e2f4" - integrity sha512-btFlkD2PG+yzJBZzWeJmyCy8ZV+iys2Jl66Fs4g9lSi3KrBDnyfQ26RpGZb2pRfkkcVP8/x1WSfByO+Rj+PTBA== +"@tauri-apps/cli-linux-x64-musl@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.2.3.tgz#edcf8f53da50337a2e763d4fda750ef56124036c" + integrity sha512-B/az59EjJhdbZDzawEVox0LQu2ZHCZlk8rJf85AMIktIUoAZPFbwyiUv7/zjzA/sY6Nb58OSJgaPL2/IBy7E0A== -"@tauri-apps/cli-linux-arm64-gnu@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.2.2.tgz#c992907586b42e2085160d45b3a17316c99febea" - integrity sha512-ZSOVT6Eq1ay2+27B8KfA0MnpO7KYzONU6TjenH7DNcQki6eWGG5JoNu8QQ9Mdn3dAzY0XBP9i1ZHQOFu4iPtEg== +"@tauri-apps/cli-win32-ia32-msvc@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.2.3.tgz#0592d3e4eee4685674579ba897eef1469c6f1cfe" + integrity sha512-ypdO1OdC5ugNJAKO2m3sb1nsd+0TSvMS9Tr5qN/ZSMvtSduaNwrcZ3D7G/iOIanrqu/Nl8t3LYlgPZGBKlw7Ng== -"@tauri-apps/cli-linux-arm64-musl@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.0.5.tgz#5ba65790849e0737f560f3ccd12f7a2a88c25b23" - integrity sha512-p5JFdWab2AWhfgAZW/mgOLu+YiIJXKV0NdATGmdiBgQCMmz1k/FM8iOFApCgGbo3/zkR58cJ7Z7hyWmQ07M6Pw== +"@tauri-apps/cli-win32-x64-msvc@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.2.3.tgz#89f0cc36e11e56564161602cd6add155cc7b0dfb" + integrity sha512-CsbHQ+XhnV/2csOBBDVfH16cdK00gNyNYUW68isedmqcn8j+s0e9cQ1xXIqi+Hue3awp8g3ImYN5KPepf3UExw== -"@tauri-apps/cli-linux-arm64-musl@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.2.2.tgz#f8bd7901ce525b8433919e2cfe7ec22aace0f776" - integrity sha512-/NHSkqNQ+Pr4PshvyD1CeNFaPCaCpe1OeuAQgVi0rboSecC9fXN96G5dQbSBoxOUcCo6f8aTVE7zkZ4WchFVog== - -"@tauri-apps/cli-linux-x64-gnu@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.0.5.tgz#d06430c608316cb5a29ec805d4c5d078a293c3ae" - integrity sha512-fOXR635AXxwSO7MCfBhMLnGpcg1H83XGw9ocuyg4jjvtE8QoYPwC4ksfb5lLhDVMui9iIKY93NAK3EkQiSGGmQ== - -"@tauri-apps/cli-linux-x64-gnu@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.2.2.tgz#a558862d7101b0a641c5a994c9ee74edb8300fc5" - integrity sha512-4YTmfPuyvlHsvCkATDMwhklfuQm3HKxYXv/IOW9H0ra6pS9efVhrFYIC9Vfv6XaKN85Vnn/FYTEGMJLwCxZw2Q== - -"@tauri-apps/cli-linux-x64-musl@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.0.5.tgz#813c90531f4001453e73b3ad2d4c75929412a249" - integrity sha512-8be4zJVkuMs427JqONhFx5Ia5zWsQ5tbZXd80C3dHNL+5/3VIOK6nGQ0iijyZSLXiE9JKEH2jp1EHB+1TVJRcw== - -"@tauri-apps/cli-linux-x64-musl@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.2.2.tgz#573e965a638864a65b606783d3dbd34114939277" - integrity sha512-wr46tbscwFuCcA931R+ItOiUTT0djMmgKLd1HFCmFF82V9BKE2reIjr6O9l0NCXCo2WeD4pe3jA/Pt1dxDu+JA== - -"@tauri-apps/cli-win32-ia32-msvc@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.0.5.tgz#a3eb6f56c3f4ba35f6311e1fb31bd30e6892b316" - integrity sha512-WpnIfzS1e4InGhvd1IDSKC3w6kbI5c6oJgMmtkMTBlhjhiZXhZmQF4XA784A5Y13pzsbXnbNJKOp8DuPVkoTRQ== - -"@tauri-apps/cli-win32-ia32-msvc@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.2.2.tgz#0fe38283ffeb71acac6a6a317951dc75ec2d3dad" - integrity sha512-6VmbVJOWUZJK5/JKhb3mNFKrKGfq0KV7lJGumfN95WJgkHeyL61p8bZit+o6ZgUGUhrOabkAawhDkrRY+ZQhIw== - -"@tauri-apps/cli-win32-x64-msvc@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.0.5.tgz#f1e0860166e8f86b550e35aaf22ef95d6da5a7c8" - integrity sha512-8iEhVD3X4LZfrlxEPOV+mAj4QrJrEqKTICiJnwmgjvhYQOOsNHzg5kca7pcBbqcgorQOBydLpfGJtxWRusVPaw== - -"@tauri-apps/cli-win32-x64-msvc@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.2.2.tgz#9b8ea7c63f2883af105e204fc4f1f11a83990a59" - integrity sha512-YRPJguJma+zSuRZpFoSZqls6+laggG1vqG0FPQWQTi+ywATgMpai2b2RZnffDlpHKp9mt4V/s2dtqOy6bpGZHg== - -"@tauri-apps/cli@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.0.5.tgz#a15a61e8467be29277b72707c4189c58c33d94bf" - integrity sha512-vbY+MwK+xN65x0R/o16UQPxBtJl8pmzVzC0TZKokZfmeOkomoqOEOinSwznAMeyR1ZMJW+fXVgJCPvGsRQ0LGg== +"@tauri-apps/cli@^1.0.5", "@tauri-apps/cli@^1.2.2": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.2.3.tgz#957f8a3a370f306e9e1ea5a891cb30aed91af64e" + integrity sha512-erxtXuPhMEGJPBtnhPILD4AjuT81GZsraqpFvXAmEJZ2p8P6t7MVBifCL8LznRknznM3jn90D3M8RNBP3wcXTw== optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "1.0.5" - "@tauri-apps/cli-darwin-x64" "1.0.5" - "@tauri-apps/cli-linux-arm-gnueabihf" "1.0.5" - "@tauri-apps/cli-linux-arm64-gnu" "1.0.5" - "@tauri-apps/cli-linux-arm64-musl" "1.0.5" - "@tauri-apps/cli-linux-x64-gnu" "1.0.5" - "@tauri-apps/cli-linux-x64-musl" "1.0.5" - "@tauri-apps/cli-win32-ia32-msvc" "1.0.5" - "@tauri-apps/cli-win32-x64-msvc" "1.0.5" - -"@tauri-apps/cli@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.2.2.tgz#cf7cb90d11c3c3b757efe07b7e2c48abde045ada" - integrity sha512-D8zib3A0vWCvPPSyYLxww/OdDlVcY7fpcDVBH6qUvheOjj2aCyU7H9AYMRBwpgCfz8zY5+vomee+laLeB0H13w== - optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "1.2.2" - "@tauri-apps/cli-darwin-x64" "1.2.2" - "@tauri-apps/cli-linux-arm-gnueabihf" "1.2.2" - "@tauri-apps/cli-linux-arm64-gnu" "1.2.2" - "@tauri-apps/cli-linux-arm64-musl" "1.2.2" - "@tauri-apps/cli-linux-x64-gnu" "1.2.2" - "@tauri-apps/cli-linux-x64-musl" "1.2.2" - "@tauri-apps/cli-win32-ia32-msvc" "1.2.2" - "@tauri-apps/cli-win32-x64-msvc" "1.2.2" + "@tauri-apps/cli-darwin-arm64" "1.2.3" + "@tauri-apps/cli-darwin-x64" "1.2.3" + "@tauri-apps/cli-linux-arm-gnueabihf" "1.2.3" + "@tauri-apps/cli-linux-arm64-gnu" "1.2.3" + "@tauri-apps/cli-linux-arm64-musl" "1.2.3" + "@tauri-apps/cli-linux-x64-gnu" "1.2.3" + "@tauri-apps/cli-linux-x64-musl" "1.2.3" + "@tauri-apps/cli-win32-ia32-msvc" "1.2.3" + "@tauri-apps/cli-win32-x64-msvc" "1.2.3" "@tauri-apps/tauri-forage@^1.0.0-beta.2": version "1.0.0-beta.2" @@ -6397,23 +4428,9 @@ tweetnacl-util "^0.15.0" "@testing-library/dom@^8.0.0", "@testing-library/dom@^8.3.0": - version "8.11.3" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.11.3.tgz#38fd63cbfe14557021e88982d931e33fb7c1a808" - integrity sha512-9LId28I+lx70wUiZjLvi1DB/WT2zGOxUh46glrSNMaWVx849kKAluezVzZrXJfTKKoQTmEOutLes/bHg4Bj3aA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" - aria-query "^5.0.0" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.4.4" - pretty-format "^27.0.2" - -"@testing-library/dom@^8.5.0": - version "8.19.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.1.tgz#0e2dafd281dedb930bb235eac1045470b4129d0e" - integrity sha512-P6iIPyYQ+qH8CvGauAqanhVnjrnRe0IZFSYCeGkSRW9q3u8bdVn2NPI+lasFyVsEQn1J/IFmp5Aax41+dAP9wg== + version "8.20.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" + integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" @@ -6425,21 +4442,6 @@ pretty-format "^27.0.2" "@testing-library/jest-dom@^5.14.1": - version "5.16.2" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz#f329b36b44aa6149cd6ced9adf567f8b6aa1c959" - integrity sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug== - dependencies: - "@babel/runtime" "^7.9.2" - "@types/testing-library__jest-dom" "^5.9.1" - aria-query "^5.0.0" - chalk "^3.0.0" - css "^3.0.0" - css.escape "^1.5.1" - dom-accessibility-api "^0.5.6" - lodash "^4.17.15" - redent "^3.0.0" - -"@testing-library/jest-dom@^5.16.5": 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== @@ -6455,24 +4457,15 @@ redent "^3.0.0" "@testing-library/react@^12.0.0": - version "12.1.3" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.3.tgz#ef26c5f122661ea9b6f672b23dc6b328cadbbf26" - integrity sha512-oCULRXWRrBtC9m6G/WohPo1GLcLesH7T4fuKzRAKn1CWVu9BzXtqLXDDTA6KhFNNtRwLtfSMr20HFl+Qrdrvmg== + version "12.1.5" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" + integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^8.0.0" - "@types/react-dom" "*" + "@types/react-dom" "<18.0.0" -"@testing-library/react@^13.4.0": - version "13.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" - integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== - dependencies: - "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.5.0" - "@types/react-dom" "^18.0.0" - -"@testing-library/user-event@^13.2.1", "@testing-library/user-event@^13.5.0": +"@testing-library/user-event@^13.2.1": version "13.5.0" resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== @@ -6489,26 +4482,6 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" @@ -6516,23 +4489,18 @@ dependencies: "@types/estree" "*" -"@types/aria-query@^4.2.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== - "@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== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -6553,9 +4521,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== dependencies: "@babel/types" "^7.3.0" @@ -6601,34 +4569,49 @@ dependencies: "@types/node" "*" +"@types/d3-array@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" + integrity sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ== + +"@types/d3-color@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.0.tgz#6594da178ded6c7c3842f3cc0ac84b156f12f2d4" + integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== + "@types/d3-color@^1": version "1.4.2" resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.2.tgz#944f281d04a0f06e134ea96adbb68303515b2784" integrity sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA== "@types/d3-dsv@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.1.tgz#c51a3505cee42653454b74a00f8713dc3548c362" + integrity sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw== + +"@types/d3-ease@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.0.tgz#f3c61fb117bd493ec0e814856feb804a14cfc311" - integrity sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A== + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.0.tgz#c29926f8b596f9dadaeca062a32a45365681eae0" + integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== "@types/d3-fetch@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.1.tgz#f9fa88b81aa2eea5814f11aec82ecfddbd0b8fe0" - integrity sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.2.tgz#fe1f335243e07c9bd520c9a71756fed8330c54b1" + integrity sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA== dependencies: "@types/d3-dsv" "*" "@types/d3-geo@^1": - version "1.12.3" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.12.3.tgz#512ebe735cb1cdf5f87ad59608416e2e9e868c5a" - integrity sha512-yZbPb7/5DyL/pXkeOmZ7L5ySpuGr4H48t1cuALjnJy5sXQqmSSAYBiwa6Ya/XpWKX2rJqGDDubmh3nOaopOpeA== + version "1.12.4" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.12.4.tgz#7fbd90b6fdb25e34ce4f557c0de73360d662850f" + integrity sha512-lNDaAuOaML6w2d1XE0Txr5YOXLBQSF1q2IU6eXh/u1TTPQSm2Ah+TMIub1+CIMq8J/7DOzi5Cr8/yHqjNvqLKA== dependencies: "@types/geojson" "*" "@types/d3-geo@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.2.tgz#e7ec5f484c159b2c404c42d260e6d99d99f45d9a" - integrity sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.3.tgz#535e5f24be13722964c52354301be09b752f5d6e" + integrity sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw== dependencies: "@types/geojson" "*" @@ -6639,10 +4622,22 @@ dependencies: "@types/d3-color" "^1" -"@types/d3-scale@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.2.tgz#41be241126af4630524ead9cb1008ab2f0f26e69" - integrity sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA== +"@types/d3-interpolate@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz#939e3a784ae4f80b1fde8098b91af1776ff1312b" + integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== + +"@types/d3-scale@^4.0.1", "@types/d3-scale@^4.0.2": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.3.tgz#7a5780e934e52b6f63ad9c24b105e33dd58102b5" + integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== dependencies: "@types/d3-time" "*" @@ -6651,11 +4646,23 @@ resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.4.3.tgz#36928bbe64eb8e0bbcbaa01fb05c21ff6c71fa93" integrity sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA== -"@types/d3-time@*": +"@types/d3-shape@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.1.tgz#15cc497751dac31192d7aef4e67a8d2c62354b95" + integrity sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time@*", "@types/d3-time@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== +"@types/d3-timer@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz#e2505f1c21ec08bda8915238e397fb71d2fc54ce" + integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== + "@types/d3-zoom@^1": version "1.8.3" resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.8.3.tgz#00237900c6fdc2bb4fe82679ee4d74eb8fbe7b3c" @@ -6672,22 +4679,14 @@ "@types/ms" "*" "@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + 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== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/eslint@^7.29.0 || ^8.4.1": version "8.4.10" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== @@ -6702,37 +4701,37 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.31": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + version "4.17.16" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.16.tgz#986caf0b4b850611254505355daa24e1b8323de8" + integrity sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.31" "@types/qs" "*" "@types/serve-static" "*" @@ -6749,11 +4748,19 @@ integrity sha512-3zsplnP2djeps5P9OyarTxwRpMLoe5Ash8aL9iprw0JxB+FAHjY+ifn4yZUuW4/9hqtnmor6uvjSRzJhiVbrEQ== "@types/geojson@*", "@types/geojson@^7946.0.8": - version "7946.0.8" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" - integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA== + version "7946.0.10" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" + integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== -"@types/glob@*", "@types/glob@^7.1.1": +"@types/glob@*": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.1.tgz#6e3041640148b7764adf21ce5c7138ad454725b0" + integrity sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + +"@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== @@ -6762,9 +4769,9 @@ "@types/node" "*" "@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + 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== dependencies: "@types/node" "*" @@ -6786,9 +4793,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-proxy@^1.17.8": - version "1.17.8" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" - integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== dependencies: "@types/node" "*" @@ -6816,15 +4823,15 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^27.0.1": - version "27.4.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" - integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== +"@types/jest@*": + version "29.2.6" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.6.tgz#1d43c8e533463d0437edef30b2d45d5aa3d95b0a" + integrity sha512-XEUC/Tgw3uMh6Ho8GkUtQ2lPhY5Fmgyp3TdlkTJs1W9VgNxs+Ow/x3Elh8lHQKqCbZL0AubQuqWjHVT033Hhrw== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" -"@types/jest@^27.5.2": +"@types/jest@^27.0.1": version "27.5.2" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== @@ -6833,19 +4840,19 @@ pretty-format "^27.0.0" "@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.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.167", "@types/lodash@^4.14.175": - version "4.14.182" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" - integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/long@^4.0.1": version "4.0.2" @@ -6853,9 +4860,9 @@ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/luxon@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.3.2.tgz#8a3f2cdd4858ce698b56cd8597d9243b8e9d3c65" - integrity sha512-WOehptuhKIXukSUUkRgGbj2c997Uv/iUgYgII8U7XLJqq9W2oF0kQ6frEznRQbdurioz+L/cdaIm4GutTQfgmA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.4.0.tgz#897d3abc23b68d78b69d76a12c21e01eb5adab95" + integrity sha512-oCavjEjRXuR6URJEtQm0eBdfsBiEcGBZbq21of8iGkeKxU1+1xgKuFPClaBZl2KB8ZZBSWlgk61tH6Mf+nvZVw== "@types/mdast@^3.0.0": version "3.0.10" @@ -6874,12 +4881,12 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@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== +"@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== -"@types/minimatch@*", "@types/minimatch@^3.0.3": +"@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== @@ -6895,17 +4902,17 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node-fetch@^2.5.7": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*", "@types/node@>=13.7.0": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== + version "18.11.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" + integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== "@types/node@11.11.6": version "11.11.6" @@ -6918,11 +4925,6 @@ integrity sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ== "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^16.7.13": - version "16.11.39" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.39.tgz#07223cd2bc332ad9d92135e3a522eebdee3b060e" - integrity sha512-K0MsdV42vPwm9L6UwhIxMAOmcvH/1OoVkZyCgEtVu4Wx7sElGloy/W7kMBNe/oJ7V/jW9BVt1F6RahH6e7tPXw== - -"@types/node@^16.18.3": version "16.18.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.11.tgz#cbb15c12ca7c16c85a72b6bdc4d4b01151bb3cae" integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA== @@ -6948,30 +4950,20 @@ integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== "@types/prettier@^2.1.5": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/pretty-hrtime@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== -"@types/prop-types@*", "@types/prop-types@^15.7.4": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== - -"@types/prop-types@^15.0.0", "@types/prop-types@^15.7.5": +"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.5": 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== -"@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== - "@types/qrcode.react@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/qrcode.react/-/qrcode.react-1.0.2.tgz#f892432cc41b5dac52e3ca8873b717c8bfea6002" @@ -6989,14 +4981,14 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@*": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.13.tgz#a3323b974ee4280070982b3112351bb1952a7809" - integrity sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ== +"@types/react-dom@<18.0.0": + version "17.0.18" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.18.tgz#8f7af38f5d9b42f79162eea7492e5a1caff70dc2" + integrity sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw== dependencies: - "@types/react" "*" + "@types/react" "^17" -"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.10", "@types/react-dom@^18.0.8": +"@types/react-dom@^18.0.10": version "18.0.10" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== @@ -7020,13 +5012,6 @@ "@types/geojson" "*" "@types/react" "*" -"@types/react-syntax-highlighter@11.0.5": - version "11.0.5" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087" - integrity sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg== - dependencies: - "@types/react" "*" - "@types/react-tooltip@^4.2.4": version "4.2.4" resolved "https://registry.yarnpkg.com/@types/react-tooltip/-/react-tooltip-4.2.4.tgz#d0acad2a3061806e10aab91dd26a95a77fd35125" @@ -7034,63 +5019,51 @@ dependencies: react-tooltip "*" -"@types/react-transition-group@^4.4.4": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" - integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== +"@types/react-transition-group@^4.4.5": + version "4.4.5" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" + integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== dependencies: "@types/react" "*" -"@types/react@*": - version "17.0.39" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.39.tgz#d0f4cde092502a6db00a1cded6e6bf2abb7633ce" - integrity sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug== +"@types/react@*", "@types/react@^18.0.26": + version "18.0.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^18.0.25", "@types/react@^18.0.26": - version "18.0.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== +"@types/react@^17": + version "17.0.53" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.53.tgz#10d4d5999b8af3d6bc6a9369d7eb953da82442ab" + integrity sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - "@types/resolve@1.20.2": version "1.20.2" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== -"@types/semver@^7.3.12": +"@types/semver@^7.3.12", "@types/semver@^7.3.8": version "7.3.13" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== -"@types/semver@^7.3.8": - version "7.3.9" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== - "@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" @@ -7098,15 +5071,7 @@ dependencies: "@types/express" "*" -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@^1.13.10": +"@types/serve-static@*", "@types/serve-static@^1.13.10": version "1.15.0" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== @@ -7137,16 +5102,16 @@ integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/testing-library__jest-dom@^5.9.1": - version "5.14.3" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz#ee6c7ffe9f8595882ee7bda8af33ae7b8789ef17" - integrity sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw== + version "5.14.5" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" + integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== dependencies: "@types/jest" "*" "@types/topojson-client@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/topojson-client/-/topojson-client-3.1.0.tgz#2fd96d5e64f4f512742f22194f3e1e0443c27233" - integrity sha512-wmjTmMkF6k6m3Tn4mIyRjw8KUQZLHB1TxNcpGYirvV/aCINkC0eMJsUO/OPMkKIB6VO5iA6Vp39bmAq6QgvSfA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/topojson-client/-/topojson-client-3.1.1.tgz#d1396b2e79f530ef69bb162523cddf94576bd5a9" + integrity sha512-E4/Z2Xg56kVLRzYWem/6uOKVcVNqqxEqlWM9qCG2tCV1BxuzvvXC02/ELoGJWgtKkQhfycBPlMFEuTFdA/YiTg== dependencies: "@types/geojson" "*" "@types/topojson-specification" "*" @@ -7158,15 +5123,10 @@ dependencies: "@types/geojson" "*" -"@types/trusted-types@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== - "@types/uglify-js@*": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" - integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== + version "3.17.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.1.tgz#e0ffcef756476410e5bce2cb01384ed878a195b5" + integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== dependencies: source-map "^0.6.1" @@ -7181,9 +5141,9 @@ integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/webpack-env@^1.16.0": - version "1.16.3" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" - integrity sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw== + version "1.18.0" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.0.tgz#ed6ecaa8e5ed5dfe8b2b3d00181702c9925f13fb" + integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== "@types/webpack-sources@*": version "3.2.0" @@ -7195,9 +5155,9 @@ source-map "^0.7.3" "@types/webpack@^4.41.26", "@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== + version "4.41.33" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.33.tgz#16164845a5be6a306bcbe554a8e67f9cac215ffc" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== dependencies: "@types/node" "*" "@types/tapable" "^1" @@ -7206,13 +5166,6 @@ anymatch "^3.0.0" source-map "^0.6.0" -"@types/ws@^8.2.2": - version "8.5.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.2.tgz#77e0c2e360e9579da930ffcfa53c5975ea3bdd26" - integrity sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw== - dependencies: - "@types/node" "*" - "@types/ws@^8.5.1": version "8.5.4" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" @@ -7226,49 +5179,34 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + version "15.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== dependencies: "@types/yargs-parser" "*" "@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" - integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + version "17.0.20" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.20.tgz#107f0fcc13bd4a524e352b41c49fe88aab5c54d5" + integrity sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.13.0.tgz#2809052b85911ced9c54a60dac10e515e9114497" - integrity sha512-vLktb2Uec81fxm/cfz2Hd6QaWOs8qdmVAZXLdOBX6JFJDhf6oDZpMzZ4/LZ6SFM/5DgDcxIMIvy3F+O9yZBuiQ== +"@typescript-eslint/eslint-plugin@^5.13.0", "@typescript-eslint/eslint-plugin@^5.7.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz#d0b4556f0792194bf0c2fb297897efa321492389" + integrity sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q== dependencies: - "@typescript-eslint/scope-manager" "5.13.0" - "@typescript-eslint/type-utils" "5.13.0" - "@typescript-eslint/utils" "5.13.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.2.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/eslint-plugin@^5.5.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.0.tgz#54f8368d080eb384a455f60c2ee044e948a8ce67" - integrity sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ== - dependencies: - "@typescript-eslint/scope-manager" "5.48.0" - "@typescript-eslint/type-utils" "5.48.0" - "@typescript-eslint/utils" "5.48.0" + "@typescript-eslint/scope-manager" "5.49.0" + "@typescript-eslint/type-utils" "5.49.0" + "@typescript-eslint/utils" "5.49.0" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -7276,284 +5214,81 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/eslint-plugin@^5.7.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz#9c6017b6c1d04894141b4a87816388967f64c359" - integrity sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg== - dependencies: - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/type-utils" "5.30.6" - "@typescript-eslint/utils" "5.30.6" - debug "^4.3.4" - functional-red-black-tree "^1.0.1" - ignore "^5.2.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@^5.0.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.48.0.tgz#10c0871a1dfee734fbcd49399b6a07ce38bdb61c" - integrity sha512-ehoJFf67UViwnYuz6JUneZ8qxgDk0qEWKiTLmpE8WpPEr15e2cSLtp0E6Zicx2DaYdwctUA0uLRTbLckxQpurg== - dependencies: - "@typescript-eslint/utils" "5.48.0" - "@typescript-eslint/experimental-utils@^5.3.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.14.0.tgz#73a455cd975d52830360a5b4131b7c4f8f1ff06f" - integrity sha512-ke48La1A/TWAn949cdgQiP3oK0NT7ArhDAOVOmNLVjT/uAXlFyrJY8dM4qqxHrATzIp8glg+G2OZjy2lRKBIUA== + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.49.0.tgz#7962b4611eb0c8be0e330d6caf4da7f8261c8203" + integrity sha512-veLpCJLYn44Fru7mSvi2doxQMzMCOFSDYdMUQhAzaH1vFYq2RVNpecZ8d18Wh6UMv07yahXkiv/aShWE48iE9Q== dependencies: - "@typescript-eslint/utils" "5.14.0" + "@typescript-eslint/utils" "5.49.0" -"@typescript-eslint/parser@^5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.13.0.tgz#0394ed8f2f849273c0bf4b811994d177112ced5c" - integrity sha512-GdrU4GvBE29tm2RqWOM0P5QfCtgCyN4hXICj/X9ibKED16136l9ZpoJvCL5pSKtmJzA+NRDzQ312wWMejCVVfg== +"@typescript-eslint/parser@^5.13.0", "@typescript-eslint/parser@^5.7.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.49.0.tgz#d699734b2f20e16351e117417d34a2bc9d7c4b90" + integrity sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg== dependencies: - "@typescript-eslint/scope-manager" "5.13.0" - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/typescript-estree" "5.13.0" - debug "^4.3.2" - -"@typescript-eslint/parser@^5.5.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.48.0.tgz#02803355b23884a83e543755349809a50b7ed9ba" - integrity sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg== - dependencies: - "@typescript-eslint/scope-manager" "5.48.0" - "@typescript-eslint/types" "5.48.0" - "@typescript-eslint/typescript-estree" "5.48.0" + "@typescript-eslint/scope-manager" "5.49.0" + "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/typescript-estree" "5.49.0" debug "^4.3.4" -"@typescript-eslint/parser@^5.7.0": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.6.tgz#add440db038fa9d777e4ebdaf66da9e7fb7abe92" - integrity sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA== +"@typescript-eslint/scope-manager@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz#81b5d899cdae446c26ddf18bd47a2f5484a8af3e" + integrity sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ== dependencies: - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/typescript-estree" "5.30.6" - debug "^4.3.4" + "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/visitor-keys" "5.49.0" -"@typescript-eslint/scope-manager@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.13.0.tgz#cf6aff61ca497cb19f0397eea8444a58f46156b6" - integrity sha512-T4N8UvKYDSfVYdmJq7g2IPJYCRzwtp74KyDZytkR4OL3NRupvswvmJQJ4CX5tDSurW2cvCc1Ia1qM7d0jpa7IA== +"@typescript-eslint/type-utils@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz#8d5dcc8d422881e2ccf4ebdc6b1d4cc61aa64125" + integrity sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA== dependencies: - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/visitor-keys" "5.13.0" - -"@typescript-eslint/scope-manager@5.14.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz#ea518962b42db8ed0a55152ea959c218cb53ca7b" - integrity sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw== - dependencies: - "@typescript-eslint/types" "5.14.0" - "@typescript-eslint/visitor-keys" "5.14.0" - -"@typescript-eslint/scope-manager@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz#ce1b49ff5ce47f55518d63dbe8fc9181ddbd1a33" - integrity sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g== - dependencies: - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/visitor-keys" "5.30.6" - -"@typescript-eslint/scope-manager@5.48.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.0.tgz#607731cb0957fbc52fd754fd79507d1b6659cecf" - integrity sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow== - dependencies: - "@typescript-eslint/types" "5.48.0" - "@typescript-eslint/visitor-keys" "5.48.0" - -"@typescript-eslint/type-utils@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.13.0.tgz#b0efd45c85b7bab1125c97b752cab3a86c7b615d" - integrity sha512-/nz7qFizaBM1SuqAKb7GLkcNn2buRdDgZraXlkhz+vUGiN1NZ9LzkA595tHHeduAiS2MsHqMNhE2zNzGdw43Yg== - dependencies: - "@typescript-eslint/utils" "5.13.0" - debug "^4.3.2" - tsutils "^3.21.0" - -"@typescript-eslint/type-utils@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz#a64aa9acbe609ab77f09f53434a6af2b9685f3af" - integrity sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA== - dependencies: - "@typescript-eslint/utils" "5.30.6" + "@typescript-eslint/typescript-estree" "5.49.0" + "@typescript-eslint/utils" "5.49.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@5.48.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.48.0.tgz#40496dccfdc2daa14a565f8be80ad1ae3882d6d6" - integrity sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g== +"@typescript-eslint/types@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.49.0.tgz#ad66766cb36ca1c89fcb6ac8b87ec2e6dac435c3" + integrity sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg== + +"@typescript-eslint/typescript-estree@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz#ebd6294c0ea97891fce6af536048181e23d729c8" + integrity sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA== dependencies: - "@typescript-eslint/typescript-estree" "5.48.0" - "@typescript-eslint/utils" "5.48.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.13.0.tgz#da1de4ae905b1b9ff682cab0bed6b2e3be9c04e5" - integrity sha512-LmE/KO6DUy0nFY/OoQU0XelnmDt+V8lPQhh8MOVa7Y5k2gGRd6U9Kp3wAjhB4OHg57tUO0nOnwYQhRRyEAyOyg== - -"@typescript-eslint/types@5.14.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.14.0.tgz#96317cf116cea4befabc0defef371a1013f8ab11" - integrity sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw== - -"@typescript-eslint/types@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.6.tgz#86369d0a7af8c67024115ac1da3e8fb2d38907e1" - integrity sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg== - -"@typescript-eslint/types@5.48.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.0.tgz#d725da8dfcff320aab2ac6f65c97b0df30058449" - integrity sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw== - -"@typescript-eslint/typescript-estree@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.13.0.tgz#b37c07b748ff030a3e93d87c842714e020b78141" - integrity sha512-Q9cQow0DeLjnp5DuEDjLZ6JIkwGx3oYZe+BfcNuw/POhtpcxMTy18Icl6BJqTSd+3ftsrfuVb7mNHRZf7xiaNA== - dependencies: - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/visitor-keys" "5.13.0" - debug "^4.3.2" - globby "^11.0.4" - is-glob "^4.0.3" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/typescript-estree@5.14.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz#78b7f7385d5b6f2748aacea5c9b7f6ae62058314" - integrity sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA== - dependencies: - "@typescript-eslint/types" "5.14.0" - "@typescript-eslint/visitor-keys" "5.14.0" - debug "^4.3.2" - globby "^11.0.4" - is-glob "^4.0.3" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/typescript-estree@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz#a84a0d6a486f9b54042da1de3d671a2c9f14484e" - integrity sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A== - dependencies: - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/visitor-keys" "5.30.6" + "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/visitor-keys" "5.49.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.48.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.0.tgz#a7f04bccb001003405bb5452d43953a382c2fac2" - integrity sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw== - dependencies: - "@typescript-eslint/types" "5.48.0" - "@typescript-eslint/visitor-keys" "5.48.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.13.0", "@typescript-eslint/utils@^5.10.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.13.0.tgz#2328feca700eb02837298339a2e49c46b41bd0af" - integrity sha512-+9oHlPWYNl6AwwoEt5TQryEHwiKRVjz7Vk6kaBeD3/kwHE5YqTGHtm/JZY8Bo9ITOeKutFaXnBlMgSATMJALUQ== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.13.0" - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/typescript-estree" "5.13.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/utils@5.14.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.14.0.tgz#6c8bc4f384298cbbb32b3629ba7415f9f80dc8c4" - integrity sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.14.0" - "@typescript-eslint/types" "5.14.0" - "@typescript-eslint/typescript-estree" "5.14.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/utils@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.6.tgz#1de2da14f678e7d187daa6f2e4cdb558ed0609dc" - integrity sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.30.6" - "@typescript-eslint/types" "5.30.6" - "@typescript-eslint/typescript-estree" "5.30.6" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/utils@5.48.0", "@typescript-eslint/utils@^5.13.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.0.tgz#eee926af2733f7156ad8d15e51791e42ce300273" - integrity sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ== +"@typescript-eslint/utils@5.49.0", "@typescript-eslint/utils@^5.10.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.49.0.tgz#1c07923bc55ff7834dfcde487fff8d8624a87b32" + integrity sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.48.0" - "@typescript-eslint/types" "5.48.0" - "@typescript-eslint/typescript-estree" "5.48.0" + "@typescript-eslint/scope-manager" "5.49.0" + "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/typescript-estree" "5.49.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.13.0.tgz#f45ff55bcce16403b221ac9240fbeeae4764f0fd" - integrity sha512-HLKEAS/qA1V7d9EzcpLFykTePmOQqOFim8oCvhY3pZgQ8Hi38hYpHd9e5GN6nQBFQNecNhws5wkS9Y5XIO0s/g== +"@typescript-eslint/visitor-keys@5.49.0": + version "5.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz#2561c4da3f235f5c852759bf6c5faec7524f90fe" + integrity sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg== dependencies: - "@typescript-eslint/types" "5.13.0" - eslint-visitor-keys "^3.0.0" - -"@typescript-eslint/visitor-keys@5.14.0": - version "5.14.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz#1927005b3434ccd0d3ae1b2ecf60e65943c36986" - integrity sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw== - dependencies: - "@typescript-eslint/types" "5.14.0" - eslint-visitor-keys "^3.0.0" - -"@typescript-eslint/visitor-keys@5.30.6": - version "5.30.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz#94dd10bb481c8083378d24de1742a14b38a2678c" - integrity sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA== - dependencies: - "@typescript-eslint/types" "5.30.6" + "@typescript-eslint/types" "5.49.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.48.0": - version "5.48.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.0.tgz#4446d5e7f6cadde7140390c0e284c8702d944904" - integrity sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q== - dependencies: - "@typescript-eslint/types" "5.48.0" - eslint-visitor-keys "^3.3.0" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -7820,22 +5555,22 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" - integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== -"@webpack-cli/info@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" - integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== dependencies: envinfo "^7.7.3" -"@webpack-cli/serve@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" - integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -7856,9 +5591,9 @@ JSONStream@^1.0.4: through ">=2.2.7 <3" abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== abbrev@1: version "1.1.1" @@ -7891,68 +5626,36 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-node@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0, acorn-walk@^7.1.1, acorn-walk@^7.2.0: +acorn-walk@^7.1.1, acorn-walk@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1: +acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +acorn@^8.0.0, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" - integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= + integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - -address@^1.1.2: version "1.2.2" resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== -adjust-sourcemap-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" - integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -8034,27 +5737,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" - integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^8.6.0: +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -8086,7 +5769,7 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: +ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -8101,18 +5784,13 @@ ansi-html-community@0.0.8, ansi-html-community@^0.0.8: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -8148,9 +5826,9 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -8158,7 +5836,7 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: app-root-dir@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" - integrity sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg= + integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g== aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" @@ -8186,16 +5864,6 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -8208,23 +5876,17 @@ 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@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== +aria-query@^5.0.0, 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: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - -aria-query@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" - integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + deep-equal "^2.0.5" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" @@ -8234,7 +5896,7 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-differ@^3.0.0: version "3.0.0" @@ -8249,9 +5911,9 @@ array-find-index@^1.0.1: array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.0, array-flatten@^2.1.2: +array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== @@ -8259,20 +5921,9 @@ array-flatten@^2.1.0, array-flatten@^2.1.2: array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.0.3, array-includes@^3.1.3, array-includes@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" - integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-includes@^3.1.6: +array-includes@^3.0.3, 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== @@ -8286,7 +5937,7 @@ array-includes@^3.1.6: array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" @@ -8298,32 +5949,24 @@ array-union@^2.1.0: array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== +array.prototype.flat@^1.2.1, 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== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" - integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.19.0" - -array.prototype.flatmap@^1.3.1: +array.prototype.flatmap@^1.2.1, 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== @@ -8333,14 +5976,14 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.map@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.4.tgz#0d97b640cfdd036c1b41cfe706a5e699aa0711f2" - integrity sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA== +array.prototype.map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.5.tgz#6e43c2fee6c0fb5e4806da2dc92eb00970809e55" + integrity sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" @@ -8369,17 +6012,17 @@ array.prototype.tosorted@^1.1.1: arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0, asap@~2.0.6: +asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1.js@^5.2.0: version "5.4.1" @@ -8401,7 +6044,7 @@ asn1@~0.2.3: assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assert@^1.1.1: version "1.5.0" @@ -8414,12 +6057,12 @@ assert@^1.1.1: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== ast-types@^0.14.2: version "0.14.2" @@ -8434,31 +6077,19 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== astring@^1.8.0: - version "1.8.3" - resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.3.tgz#1a0ae738c7cc558f8e5ddc8e3120636f5cebcb85" - integrity sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A== + version "1.8.4" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.4.tgz#6d4c5d8de7be2ead9e4a3cc0e2efb8d759378904" + integrity sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw== async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async@^2.6.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" @@ -8478,19 +6109,7 @@ attr-accept@^2.0.0, attr-accept@^2.2.2: author-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" - integrity sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA= - -autoprefixer@^10.4.12, autoprefixer@^10.4.13: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== - dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" + integrity sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g== autoprefixer@^9.8.6: version "9.8.8" @@ -8513,17 +6132,17 @@ available-typed-arrays@^1.0.5: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@^4.3.5: - version "4.4.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" - integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== +axe-core@^4.6.2: + version "4.6.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" + integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== axios@^0.21.1, axios@^0.21.2: version "0.21.4" @@ -8539,12 +6158,14 @@ axios@^0.26.1: dependencies: follow-redirects "^1.14.8" -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" -babel-jest@^27.4.2, babel-jest@^27.5.1: +babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== @@ -8558,17 +6179,7 @@ babel-jest@^27.4.2, babel-jest@^27.5.1: graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@^8.0.0, babel-loader@^8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" - integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^1.4.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-loader@^8.3.0: +babel-loader@^8.0.0, babel-loader@^8.2.3, babel-loader@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== @@ -8581,7 +6192,7 @@ babel-loader@^8.3.0: babel-plugin-add-react-displayname@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" - integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= + integrity sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw== babel-plugin-apply-mdx-type-prop@1.6.22: version "1.6.22" @@ -8591,29 +6202,6 @@ babel-plugin-apply-mdx-type-prop@1.6.22: "@babel/helper-plugin-utils" "7.10.4" "@mdx-js/util" "1.6.22" -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-emotion@^10.0.27: - version "10.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d" - integrity sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/serialize" "^0.11.16" - babel-plugin-macros "^2.0.0" - babel-plugin-syntax-jsx "^6.18.0" - convert-source-map "^1.5.0" - escape-string-regexp "^1.0.5" - find-root "^1.1.0" - source-map "^0.5.7" - babel-plugin-extract-import-names@1.6.22: version "1.6.22" resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" @@ -8642,15 +6230,6 @@ babel-plugin-jest-hoist@^27.5.1: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -8660,25 +6239,11 @@ babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-named-asset-import@^0.3.8: - version "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-named-exports-order@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz#ae14909521cf9606094a2048239d69847540cb09" integrity sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw== -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" - babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" @@ -8696,14 +6261,6 @@ babel-plugin-polyfill-corejs3@^0.1.0: "@babel/helper-define-polyfill-provider" "^0.1.5" core-js-compat "^3.8.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.21.0" - babel-plugin-polyfill-corejs3@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" @@ -8712,13 +6269,6 @@ babel-plugin-polyfill-corejs3@^0.6.0: "@babel/helper-define-polyfill-provider" "^0.3.3" core-js-compat "^3.25.1" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" @@ -8738,7 +6288,7 @@ babel-plugin-react-docgen@^4.2.1: babel-plugin-root-import@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-root-import/-/babel-plugin-root-import-5.1.0.tgz#80ea1cd5945b463a5e3f7e204a69478c573e328c" - integrity sha1-gOoc1ZRbRjpeP34gSmlHjFc+Mow= + integrity sha512-9VYUlnHtM7zjM9vM3kFClUDH7jjhqnvQwxWYGP18EciPsPZYZD9wGqVGwry6gQv0UdZS0+WmbPSlKSjKv1wZFw== dependencies: slash "^1.0.0" @@ -8749,16 +6299,6 @@ babel-plugin-root-import@^6.6.0: dependencies: slash "^3.0.0" -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - -babel-plugin-transform-react-remove-prop-types@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" - integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== - babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -8785,28 +6325,6 @@ babel-preset-jest@^27.5.1: babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" -babel-preset-react-app@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" - integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== - dependencies: - "@babel/core" "^7.16.0" - "@babel/plugin-proposal-class-properties" "^7.16.0" - "@babel/plugin-proposal-decorators" "^7.16.4" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" - "@babel/plugin-proposal-numeric-separator" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-private-methods" "^7.16.0" - "@babel/plugin-transform-flow-strip-types" "^7.16.0" - "@babel/plugin-transform-react-display-name" "^7.16.0" - "@babel/plugin-transform-runtime" "^7.16.4" - "@babel/preset-env" "^7.16.4" - "@babel/preset-react" "^7.16.0" - "@babel/preset-typescript" "^7.16.0" - "@babel/runtime" "^7.16.3" - babel-plugin-macros "^3.1.0" - babel-plugin-transform-react-remove-prop-types "^0.4.24" - bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -8850,12 +6368,12 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" @@ -8865,9 +6383,9 @@ bech32@^1.1.4: integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== before-after-hook@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" - integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== better-opn@^2.1.1: version "2.1.1" @@ -8876,16 +6394,6 @@ better-opn@^2.1.1: dependencies: open "^7.0.3" -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== - dependencies: - bluebird "^3.5.5" - check-types "^11.1.1" - hoopy "^0.1.4" - tryer "^1.0.1" - big-integer@^1.6.7: version "1.6.51" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" @@ -8937,7 +6445,7 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@^3.3.5, bluebird@^3.5.5: +bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -8947,32 +6455,11 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.8, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -bn.js@^5.2.0: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" - type-is "~1.6.18" - body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -8992,31 +6479,19 @@ body-parser@1.20.1: unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.0.14" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7" - integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.0.tgz#424170268d68af26ff83a5c640b95def01803a13" + integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== dependencies: array-flatten "^2.1.2" dns-equal "^1.0.0" fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== boxen@^5.1.2: version "5.1.2" @@ -9070,7 +6545,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -9080,7 +6555,7 @@ braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-assert@^1.2.1: version "1.2.1" @@ -9158,29 +6633,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.16.6: - version "4.20.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.0.tgz#35951e3541078c125d36df76056e94738a52ebe9" - integrity sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ== - dependencies: - caniuse-lite "^1.0.30001313" - electron-to-chromium "^1.4.76" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" - -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.19.1: - version "4.19.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383" - integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg== - dependencies: - caniuse-lite "^1.0.30001312" - electron-to-chromium "^1.4.71" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" - -browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.21.3, browserslist@^4.21.4: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -9200,7 +6653,7 @@ bs-logger@0.x: bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" @@ -9216,15 +6669,10 @@ buffer-from@^1.0.0, buffer-from@^1.1.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer@^4.3.0: version "4.9.2" @@ -9243,7 +6691,7 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtin-modules@^3.1.0, builtin-modules@^3.3.0: +builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== @@ -9251,17 +6699,17 @@ builtin-modules@^3.1.0, builtin-modules@^3.3.0: builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" - integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== byte-size@^7.0.0: version "7.0.1" @@ -9271,7 +6719,7 @@ byte-size@^7.0.0: bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" @@ -9279,22 +6727,22 @@ bytes@3.1.2: integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== c8@^7.6.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/c8/-/c8-7.11.0.tgz#b3ab4e9e03295a102c47ce11d4ef6d735d9a9ac9" - integrity sha512-XqPyj1uvlHMr+Y1IeRndC2X5P7iJzJlEJwBpCdBbq2JocXOgJfr+JVfJkyNMGROke5LfKrhSFXGFXnwnRJAUJw== + version "7.12.0" + resolved "https://registry.yarnpkg.com/c8/-/c8-7.12.0.tgz#402db1c1af4af5249153535d1c84ad70c5c96b14" + integrity sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@istanbuljs/schema" "^0.1.2" + "@istanbuljs/schema" "^0.1.3" find-up "^5.0.0" foreground-child "^2.0.0" - istanbul-lib-coverage "^3.0.1" + istanbul-lib-coverage "^3.2.0" istanbul-lib-report "^3.0.0" - istanbul-reports "^3.0.2" - rimraf "^3.0.0" + istanbul-reports "^3.1.4" + rimraf "^3.0.2" test-exclude "^6.0.0" - v8-to-istanbul "^8.0.0" + v8-to-istanbul "^9.0.0" yargs "^16.2.0" - yargs-parser "^20.2.7" + yargs-parser "^20.2.9" cacache@^12.0.2: version "12.0.4" @@ -9365,9 +6813,9 @@ call-bind@^1.0.0, call-bind@^1.0.2: get-intrinsic "^1.0.2" call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== callsites@^3.0.0: version "3.1.0" @@ -9382,7 +6830,7 @@ camel-case@^4.1.1, camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1, camelcase-css@^2.0.1: +camelcase-css@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== @@ -9414,7 +6862,7 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.2.1: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -9429,15 +6877,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.30001109, caniuse-lite@^1.0.30001312, caniuse-lite@^1.0.30001313: - version "1.0.30001390" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001390.tgz" - integrity sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g== - -caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: - version "1.0.30001442" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz#40337f1cf3be7c637b061e2f78582dc1daec0614" - integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400: + version "1.0.30001447" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001447.tgz#ef1f39ae38d839d7176713735a8e467a0a2523bd" + integrity sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw== capture-exit@^2.0.0: version "2.0.0" @@ -9446,7 +6889,7 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -case-sensitive-paths-webpack-plugin@^2.3.0, case-sensitive-paths-webpack-plugin@^2.4.0: +case-sensitive-paths-webpack-plugin@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== @@ -9454,7 +6897,7 @@ case-sensitive-paths-webpack-plugin@^2.3.0, case-sensitive-paths-webpack-plugin@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== ccount@^1.0.0: version "1.1.0" @@ -9483,7 +6926,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -9496,11 +6939,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -char-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" - integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== - character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" @@ -9536,21 +6974,11 @@ character-reference-invalid@^2.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== -charcodes@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" - integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -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== - chokidar@3.5.3, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -9606,9 +7034,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" - integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + version "3.7.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" + integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -9633,10 +7061,10 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== +classnames@^2.2.5, classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-css@^4.2.3: version "4.2.4" @@ -9646,9 +7074,9 @@ clean-css@^4.2.3: source-map "~0.6.0" clean-css@^5.2.2: - version "5.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.4.tgz#982b058f8581adb2ae062520808fb2429bd487a4" - integrity sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg== + version "5.3.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== dependencies: source-map "~0.6.0" @@ -9677,13 +7105,13 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-table3@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" - integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" optionalDependencies: - colors "1.4.0" + "@colors/colors" "1.5.0" cli-width@^3.0.0: version "3.0.0" @@ -9707,7 +7135,7 @@ cliui@^7.0.2: clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + integrity sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g== clone-deep@^4.0.1: version "4.0.1" @@ -9721,17 +7149,17 @@ clone-deep@^4.0.1: clone-stats@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + integrity sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag== clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== cloneable-readable@^1.0.0: version "1.1.3" @@ -9747,16 +7175,11 @@ clsx@1.1.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA== -clsx@^1.0.2: +clsx@^1.0.2, clsx@^1.0.4, clsx@^1.1.0, clsx@^1.1.1, 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@^1.0.4, clsx@^1.1.0, clsx@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - cmd-shim@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" @@ -9767,21 +7190,12 @@ cmd-shim@^4.1.0: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collapse-white-space@^1.0.2: version "1.0.6" @@ -9796,7 +7210,7 @@ collect-v8-coverage@^1.0.0: collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -9818,17 +7232,17 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -9838,15 +7252,7 @@ color-support@^1.1.2: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -color@^4.0.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.1.tgz#498aee5fce7fc982606c8875cab080ac0547c884" - integrity sha512-MFJr0uY4RvTQUKvPq7dh9grVOTYSFeXja2mBXioCGjnjJoXrAp9jJ1NQTDR73c9nwBSAQiNKloKl5zq9WB9UPw== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -color@^4.2.3: +color@^4.0.1, color@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== @@ -9855,9 +7261,9 @@ color@^4.2.3: color-string "^1.9.0" colord@^2.9.1: - version "2.9.2" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" - integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^1.2.2: version "1.4.0" @@ -9865,16 +7271,16 @@ colorette@^1.2.2: integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== colorette@^2.0.10, colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== colornames@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" - integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= + integrity sha512-/pyV40IrsdulWv+wFPmERh9k/mjsPZ64yUMDmWrtj/k1nmgrzzIENWKdaVKyBbvFdQWqkcaRxr+polCo3VMe7A== -colors@1.4.0, colors@^1.4.0: +colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -9939,15 +7345,10 @@ common-path-prefix@^3.0.0: resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== compare-func@^2.0.0: version "2.0.0" @@ -9985,7 +7386,7 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.5.0: version "1.6.2" @@ -10015,16 +7416,11 @@ config-chain@^1.1.12: ini "^1.3.4" proto-list "~1.2.1" -confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.11: +confusing-browser-globals@^1.0.10: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" @@ -10038,12 +7434,12 @@ console-browserify@^1.1.0: console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== content-disposition@0.5.4: version "0.5.4" @@ -10140,21 +7536,14 @@ conventional-recommended-bump@^6.1.0: q "^1.5.1" convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.5.0: version "0.5.0" @@ -10176,56 +7565,35 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.8.1: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" - integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== - dependencies: - browserslist "^4.19.1" - semver "7.0.0" - -core-js-compat@^3.25.1: - version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.1.tgz#b5695eb25c602d72b1d30cbfba3cb7e5e4cf0a67" - integrity sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA== +core-js-compat@^3.25.1, core-js-compat@^3.8.1: + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" + integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== dependencies: browserslist "^4.21.4" -core-js-pure@^3.20.2, core-js-pure@^3.8.1: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== +core-js-pure@^3.23.3: + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.2.tgz#47e9cc96c639eefc910da03c3ece26c5067c7553" + integrity sha512-Cf2jqAbXgWH3VVzjyaaFkY1EBazxugUepGymDoeteyYr9ByX51kD2jdHZlsEF/xnJMyN3Prua7mQuzwMg6Zc9A== core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" - integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== - -core-js@^3.19.2: - version "3.27.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.1.tgz#23cc909b315a6bb4e418bf40a52758af2103ba46" - integrity sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww== + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7" + integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w== core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig-typescript-loader@^1.0.0: - version "1.0.9" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" - integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== - dependencies: - cosmiconfig "^7" - ts-node "^10.7.0" - cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -10237,7 +7605,7 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cosmiconfig@^7: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== @@ -10248,17 +7616,6 @@ cosmiconfig@^7: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - cosmjs-types@^0.4.0, cosmjs-types@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.4.1.tgz#3b2a53ba60d33159dd075596ce8267cfa7027063" @@ -10323,11 +7680,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -10365,31 +7717,10 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-blank-pseudo@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" - integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== - dependencies: - postcss-selector-parser "^6.0.9" - -css-declaration-sorter@^6.0.3: - version "6.1.4" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz#b9bfb4ed9a41f8dcca9bf7184d849ea94a8294b4" - integrity sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw== - dependencies: - timsort "^0.3.0" - -css-has-pseudo@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" - integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== - dependencies: - postcss-selector-parser "^6.0.9" +css-declaration-sorter@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" + integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== css-loader@^3.6.0: version "3.6.0" @@ -10426,7 +7757,7 @@ css-loader@^5.0.1: schema-utils "^3.0.0" semver "^7.3.5" -css-loader@^6.5.1, css-loader@^6.7.3: +css-loader@^6.7.3: version "6.7.3" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== @@ -10440,7 +7771,7 @@ css-loader@^6.5.1, css-loader@^6.7.3: postcss-value-parser "^4.2.0" semver "^7.3.8" -css-minimizer-webpack-plugin@^3.0.2, css-minimizer-webpack-plugin@^3.2.0: +css-minimizer-webpack-plugin@^3.0.2: version "3.4.1" resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== @@ -10452,45 +7783,17 @@ css-minimizer-webpack-plugin@^3.0.2, css-minimizer-webpack-plugin@^3.2.0: serialize-javascript "^6.0.0" source-map "^0.6.1" -css-prefers-color-scheme@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" - integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - css-select@^4.1.3: - version "4.2.1" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" - integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" - css-what "^5.1.0" - domhandler "^4.3.0" + css-what "^6.0.1" + domhandler "^4.3.1" domutils "^2.8.0" nth-check "^2.0.1" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -10512,74 +7815,55 @@ css-vendor@^2.0.8: "@babel/runtime" "^7.8.3" is-in-browser "^1.0.2" -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - -css-what@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= - -css@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== - dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" - -cssdb@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.2.0.tgz#f44bd4abc430f0ff7f4c64b8a1fb857a753f77a8" - integrity sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg== + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.0.tgz#2579d38b9217746f2cf9f938954a91e00418ded6" - integrity sha512-3N5Vcptj2pqVKpHVqH6ezOJvqikR2PdLTbTrsrhF61FbLRQuujAqZ2sKN5rvcMsb7hFjrNnjZT8CGEkxoN/Pwg== +cssnano-preset-default@^5.2.13: + version "5.2.13" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz#e7353b0c57975d1bdd97ac96e68e5c1b8c68e990" + integrity sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ== dependencies: - css-declaration-sorter "^6.0.3" + css-declaration-sorter "^6.3.1" cssnano-utils "^3.1.0" postcss-calc "^8.2.3" postcss-colormin "^5.3.0" - postcss-convert-values "^5.1.0" - postcss-discard-comments "^5.1.0" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.0" + postcss-discard-empty "^5.1.1" postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.0" - postcss-merge-rules "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.3" postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.0" - postcss-minify-params "^5.1.0" - postcss-minify-selectors "^5.2.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" postcss-normalize-charset "^5.1.0" postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.0" - postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" postcss-normalize-string "^5.1.0" postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.0" + postcss-normalize-unicode "^5.1.1" postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.0" - postcss-ordered-values "^5.1.0" - postcss-reduce-initial "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.1" postcss-reduce-transforms "^5.1.0" postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.0" + postcss-unique-selectors "^5.1.1" cssnano-utils@^3.1.0: version "3.1.0" @@ -10587,15 +7871,15 @@ cssnano-utils@^3.1.0: integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== cssnano@^5.0.6: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.0.tgz#cf977d660a5824d0d5542639ed1d4045afd84cbe" - integrity sha512-wWxave1wMlThGg4ueK98jFKaNqXnQd1nVZpSkQ9XvR+YymlzP1ofWqES1JkHtI250LksP9z5JH+oDcrKDJezAg== + version "5.1.14" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.14.tgz#07b0af6da73641276fe5a6d45757702ebae2eb05" + integrity sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw== dependencies: - cssnano-preset-default "^5.2.0" + cssnano-preset-default "^5.2.13" lilconfig "^2.0.3" yaml "^1.10.2" -csso@^4.0.2, csso@^4.2.0: +csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== @@ -10619,20 +7903,10 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^2.5.7: - version "2.6.20" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda" - integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA== - -csstype@^3.0.10, csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -csstype@^3.0.11: - version "3.0.11" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" - integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== +csstype@^3.0.2, csstype@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== currently-unhandled@^0.4.1: version "0.4.1" @@ -10644,12 +7918,12 @@ currently-unhandled@^0.4.1: cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== -"d3-array@2 - 3", "d3-array@2.10.0 - 3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.1.1.tgz#7797eb53ead6b9083c75a45a681e93fc41bc468c" - integrity sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ== +"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: + version "3.2.2" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.2.tgz#f8ac4705c5b06914a7e0025bbf8d5f1513f6a86e" + integrity sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ== dependencies: internmap "1 - 2" @@ -10666,9 +7940,9 @@ d3-array@^2.5.0: integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== "d3-color@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.0.1.tgz#03316e595955d1fcd39d9f3610ad41bb90194d0a" - integrity sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== "d3-dispatch@1 - 2": version "2.0.0" @@ -10688,6 +7962,11 @@ d3-drag@2: resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-2.0.0.tgz#fd1762bfca00dae4bacea504b1d628ff290ac563" integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ== +d3-ease@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + "d3-format@1 - 3": version "3.1.0" resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" @@ -10714,10 +7993,10 @@ d3-geo@^2.0.1: dependencies: d3-color "1 - 3" -"d3-path@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" - integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== +d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== d3-scale@^4.0.0, d3-scale@^4.0.2: version "4.0.2" @@ -10736,11 +8015,11 @@ d3-selection@2, d3-selection@^2.0.0: integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA== d3-shape@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" - integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== dependencies: - d3-path "1 - 3" + d3-path "^3.1.0" "d3-time-format@2 - 4": version "4.1.0" @@ -10749,10 +8028,10 @@ d3-shape@^3.1.0: dependencies: d3-time "1 - 3" -"d3-time@1 - 3", "d3-time@2.1.1 - 3": - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" - integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" @@ -10761,6 +8040,11 @@ d3-shape@^3.1.0: resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6" integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA== +d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + d3-transition@2: version "2.0.0" resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-2.0.0.tgz#366ef70c22ef88d1e34105f507516991a291c94c" @@ -10783,7 +8067,7 @@ d3-zoom@^2.0.0: d3-selection "2" d3-transition "2" -damerau-levenshtein@^1.0.7: +damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== @@ -10796,7 +8080,7 @@ dargs@^7.0.0: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" @@ -10810,37 +8094,30 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.24.0, date-fns@^2.28.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, 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== dependencies: ms "2.1.2" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.7: +debug@^3.0.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -10850,12 +8127,12 @@ debug@^3.0.0, debug@^3.1.1, debug@^3.2.7: debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -10863,7 +8140,7 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" @@ -10876,9 +8153,9 @@ decimal.js-light@^2.4.1: integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-named-character-reference@^1.0.0: version "1.0.2" @@ -10902,19 +8179,30 @@ decompress-response@^6.0.0: dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + 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" - regexp.prototype.flags "^1.2.0" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + 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: version "0.6.0" @@ -10926,11 +8214,6 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deep-object-diff@^1.1.0: - version "1.1.9" - resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" - integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== - deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -10953,9 +8236,9 @@ default-gateway@^6.0.3: execa "^5.0.0" defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: clone "^1.0.2" @@ -10964,14 +8247,7 @@ define-lazy-prop@^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.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-properties@^1.1.4: +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== @@ -10982,14 +8258,14 @@ define-properties@^1.1.4: define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" @@ -11001,11 +8277,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -11019,29 +8290,15 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== depd@2.0.0: version "2.0.0" @@ -11051,7 +8308,7 @@ depd@2.0.0: depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" @@ -11076,11 +8333,6 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - detab@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" @@ -11091,7 +8343,7 @@ detab@2.0.4: detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== detect-indent@^6.0.0: version "6.1.0" @@ -11101,7 +8353,7 @@ detect-indent@^6.0.0: detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== detect-libc@^2.0.0, detect-libc@^2.0.1: version "2.0.1" @@ -11125,35 +8377,18 @@ detect-package-manager@^2.0.1: dependencies: execa "^5.1.1" -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" - debug "^2.6.0" - -detective@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" - integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== - dependencies: - acorn-node "^1.8.2" - defined "^1.0.0" - minimist "^1.2.6" + debug "4" dezalgo@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + version "1.0.4" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== dependencies: asap "^2.0.0" wrappy "1" @@ -11161,12 +8396,7 @@ dezalgo@^1.0.0: diacritics@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1" - integrity sha1-PvqHMj67hj5mls67AILUj/PW96E= - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + integrity sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA== diff-sequences@^27.5.1: version "27.5.1" @@ -11178,6 +8408,11 @@ diff-sequences@^28.1.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== + diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -11188,11 +8423,6 @@ diff@^3.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diff@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" @@ -11221,23 +8451,10 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: version "5.4.0" @@ -11246,13 +8463,6 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -11268,9 +8478,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: - version "0.5.13" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.13.tgz#102ee5f25eacce09bdf1cfa5a298f86da473be4b" - integrity sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw== + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-converter@^0.2.0: version "0.2.0" @@ -11294,18 +8504,10 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" @@ -11321,15 +8523,10 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domexception@^2.0.1: version "2.0.1" @@ -11338,21 +8535,13 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -11397,23 +8586,18 @@ dotenv-expand@^5.1.0: integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== dotenv-webpack@^7.0.3: - version "7.1.0" - resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-7.1.0.tgz#211fefac6bf500bf3bb66b286e1b12a23a2a70c0" - integrity sha512-+aUOe+nqgLerA/n611oyC15fY79BIkGm2fOxJAcHDonMZ7AtDpnzv/Oe591eHAenIE0t6w03UyxDnLs/YUxx5Q== + version "7.1.1" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-7.1.1.tgz#ee8a699e1d736fd8eb9363fbc7054cfff1bd9dbf" + integrity sha512-xw/19VqHDkXALtBOJAnnrSU/AZDIQRXczAmJyp0lZv6SH2aBLzUTl96W1MVryJZ7okZ+djZS4Gj4KlZ0xP7deA== dependencies: dotenv-defaults "^2.0.2" -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - dotenv@^8.0.0, dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -duplexer@^0.1.1, duplexer@^0.1.2: +duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -11431,7 +8615,7 @@ duplexify@^3.4.2, duplexify@^3.6.0: ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -11439,30 +8623,13 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -ejs@^3.1.6: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== - dependencies: - jake "^10.8.5" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.251: version "1.4.284" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== -electron-to-chromium@^1.4.71: - version "1.4.75" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz#d1ad9bb46f2f1bf432118c2be21d27ffeae82fdd" - integrity sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q== - -electron-to-chromium@^1.4.76: - version "1.4.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.76.tgz#a0494baedaf51094b1c172999919becd9975a934" - integrity sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA== - elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -11476,11 +8643,6 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -11501,19 +8663,10 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -emotion-theming@^10.0.27: - version "10.3.0" - resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.3.0.tgz#7f84d7099581d7ffe808aab5cd870e30843db72a" - integrity sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/weak-memoize" "0.2.5" - hoist-non-react-statics "^3.3.0" - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encoding@^0.1.12: version "0.1.13" @@ -11547,15 +8700,7 @@ enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.2: - version "5.9.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" - integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enhanced-resolve@^5.10.0: +enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0, enhanced-resolve@^5.7.0: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== @@ -11563,14 +8708,6 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.9.3: - version "5.9.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" - integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -11583,10 +8720,10 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== +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== env-paths@^2.2.0: version "2.2.1" @@ -11618,19 +8755,20 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" error-stack-parser@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.7.tgz#b0c6e2ce27d0495cf78ad98715e0cad1219abb57" - integrity sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA== + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: - stackframe "^1.1.1" + stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.20.4: - version "1.21.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.0.tgz#dd1b69ea5bfc3c27199c9753efd4de015102c252" - integrity sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g== +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== dependencies: + available-typed-arrays "^1.0.5" call-bind "^1.0.2" - es-set-tostringtag "^2.0.0" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function-bind "^1.1.1" function.prototype.name "^1.1.5" @@ -11643,7 +8781,7 @@ es-abstract@^1.17.2, es-abstract@^1.20.4: has-proto "^1.0.1" has-symbols "^1.0.3" internal-slot "^1.0.4" - is-array-buffer "^3.0.0" + is-array-buffer "^3.0.1" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" @@ -11662,57 +8800,32 @@ es-abstract@^1.17.2, es-abstract@^1.20.4: unbox-primitive "^1.0.2" which-typed-array "^1.1.9" -es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - 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.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== +es-get-iterator@^1.0.2, es-get-iterator@^1.1.2: + 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.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + 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.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== -es-set-tostringtag@^2.0.0: +es-set-tostringtag@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== @@ -11738,14 +8851,14 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-shim@^4.5.13: - version "4.6.5" - resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.5.tgz#2124bb073b7cede2ed23b122a1fd87bb7b0bb724" - integrity sha512-vfQ4UAai8szn0sAubCy97xnZ4sJVDD1gt/Grn736hg8D7540wemIb1YPrYZSTqlM2H69EQX1or4HU/tSwRTI3w== + version "4.6.7" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.7.tgz#bc67ae0fc3dd520636e0a1601cc73b450ad3e955" + integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ== es6-shim@^0.35.5: - version "0.35.6" - resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0" - integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA== + version "0.35.7" + resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.7.tgz#db00f1cbb7d4de70b50dcafa45b157e9ba28f5d2" + integrity sha512-baZkUfTDSx7X69+NA8imbvGrsPfqH0MX7ADdIDjqwsI8lkTgLIiD2QWrUCSGsUQ0YMnSCA/4pNgSyXdnLHWf3A== escalade@^3.1.1: version "3.1.1" @@ -11755,7 +8868,7 @@ escalade@^3.1.1: escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" @@ -11765,7 +8878,7 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" @@ -11795,9 +8908,9 @@ eslint-config-airbnb-base@^15.0.0: semver "^6.3.0" eslint-config-airbnb-typescript@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.1.0.tgz#f75a6b4f3bb679eef34c3c930359c2ca9bc3f09c" - integrity sha512-W5Cq20KpEx5ZLC54bnVrC37zq2+WD956Kp/Ma3nYFRjT1v9KM63v+DPkrrmmrVqrlDKaD0ivm/qeYmyHV6qKlw== + version "16.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.2.0.tgz#9193fafd62f1cbf444895f4495eae334baf3265b" + integrity sha512-OUaMPZpTOZGKd5tXOjJ9PRU4iYNW/Z5DoHIynjsVK/FpkWdiY5+nxQW6TiJAlLwVI1l53xUOrnlZWtVBVQzuWA== dependencies: eslint-config-airbnb-base "^15.0.0" @@ -11811,37 +8924,18 @@ eslint-config-airbnb@^19.0.2, eslint-config-airbnb@^19.0.4: object.entries "^1.1.5" eslint-config-prettier@^8.3.0, eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== -eslint-config-react-app@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" - integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== - dependencies: - "@babel/core" "^7.16.0" - "@babel/eslint-parser" "^7.16.3" - "@rushstack/eslint-patch" "^1.1.0" - "@typescript-eslint/eslint-plugin" "^5.5.0" - "@typescript-eslint/parser" "^5.5.0" - babel-preset-react-app "^10.0.1" - confusing-browser-globals "^1.0.11" - eslint-plugin-flowtype "^8.0.3" - eslint-plugin-import "^2.25.3" - eslint-plugin-jest "^25.3.0" - eslint-plugin-jsx-a11y "^6.5.1" - eslint-plugin-react "^7.27.1" - eslint-plugin-react-hooks "^4.3.0" - eslint-plugin-testing-library "^5.0.1" - -eslint-import-resolver-node@^0.3.2, eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.2, 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== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" eslint-import-resolver-root-import@^1.0.4: version "1.0.4" @@ -11851,123 +8945,87 @@ eslint-import-resolver-root-import@^1.0.4: eslint-import-resolver-node "^0.3.2" json5 "^2.1.0" -eslint-module-utils@^2.7.2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-module-utils@^2.7.3: +eslint-module-utils@^2.7.4: version "2.7.4" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" -eslint-plugin-flowtype@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" - integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== +eslint-plugin-import@^2.25.4: + 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== dependencies: - lodash "^4.17.21" - string-natural-compare "^3.0.1" - -eslint-plugin-import@^2.25.3: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + 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.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" -eslint-plugin-import@^2.25.4: - version "2.25.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" - integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.2" - has "^1.0.3" - is-core-module "^2.8.0" - is-glob "^4.0.3" - minimatch "^3.0.4" - object.values "^1.1.5" - resolve "^1.20.0" - tsconfig-paths "^3.12.0" - -eslint-plugin-jest@^25.3.0: - version "25.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" - integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== - dependencies: - "@typescript-eslint/experimental-utils" "^5.0.0" - eslint-plugin-jest@^26.1.1: - version "26.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.1.1.tgz#7176dd745ef8bca3070263f62cdf112f2dfc9aa1" - integrity sha512-HRKOuPi5ADhza4ZBK5ufyNXy28bXXkib87w+pQqdvBhSTsamndh6sIAKPAUl8y0/n9jSWBdTPslrwtKWqkp8dA== + version "26.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz#7931c31000b1c19e57dbfb71bbf71b817d1bf949" + integrity sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng== dependencies: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" - integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== dependencies: - "@babel/runtime" "^7.16.3" - aria-query "^4.2.2" - array-includes "^3.1.4" + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" ast-types-flow "^0.0.7" - axe-core "^4.3.5" - axobject-query "^2.2.0" - damerau-levenshtein "^1.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.2.1" - language-tags "^1.0.5" - minimatch "^3.0.4" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" eslint-plugin-mocha@^10.0.3: - version "10.0.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.0.5.tgz#c3b1e9f59c01063566d8e64b64226533376ffccd" - integrity sha512-H5xuD5NStlpaKLqUWYC5BsMx8fHgrIYsdloFbONUTc2vgVNiJcWdKoX29Tt0BO75QgAltplPLIziByMozGGixA== + version "10.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz#69325414f875be87fb2cb00b2ef33168d4eb7c8d" + integrity sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw== dependencies: eslint-utils "^3.0.0" rambda "^7.1.0" eslint-plugin-prettier@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" - integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" eslint-plugin-react-hooks@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" - integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.27.1: - version "7.31.11" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" - integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== +eslint-plugin-react@^7.29.2: + version "7.32.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.1.tgz#88cdeb4065da8ca0b64e1274404f53a0f9890200" + integrity sha512-vOjdgyd0ZHBXNsmvU+785xY8Bfe57EFbTYYk8XrROzWpr9QBvpjITvAXt9xqcE6+8cjR/g1+mfumPToxsl1www== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" @@ -11981,46 +9039,19 @@ eslint-plugin-react@^7.27.1: object.hasown "^1.1.2" object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" + resolve "^2.0.0-next.4" semver "^6.3.0" string.prototype.matchall "^4.0.8" -eslint-plugin-react@^7.29.2: - version "7.29.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.2.tgz#2d4da69d30d0a736efd30890dc6826f3e91f3f7c" - integrity sha512-ypEBTKOy5liFQXZWMchJ3LN0JX1uPI6n7MN7OPHKacqXAxq5gYC30TdO7wqGYQyxD1OrzpobdHC3hDmlRWDg9w== - dependencies: - array-includes "^3.1.4" - array.prototype.flatmap "^1.2.5" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.0" - object.values "^1.1.5" - prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" - string.prototype.matchall "^4.0.6" - eslint-plugin-storybook@^0.5.12: - version "0.5.12" - resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-0.5.12.tgz#b84d38400b91a9abdf15cd2c81644bff27861a96" - integrity sha512-ojuNKnrZFrQpm5N5Lp8UR0VEn4HtLjlNn6nxQAYlmTsEXNigtId1XPuMbXAsvFcEmv3RTb5l+9tZgkhSURfACg== + version "0.5.13" + resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-0.5.13.tgz#dee4056eaa59c886a9ae78fb7b2ee0ed5fad4366" + integrity sha512-82x3FH1VAi68Awu1VEjn/hLkzFZsOP8ItcC5/uGF9WszIrj6n7Q3MZD57oE26k3aKwuPfFtAPnSjFnaBkBab+g== dependencies: "@storybook/csf" "^0.0.1" "@typescript-eslint/experimental-utils" "^5.3.0" requireindex "^1.1.0" -eslint-plugin-testing-library@^5.0.1: - version "5.9.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.9.1.tgz#12e4bd34c48683ee98af4df2e3318ec9f51dcf8a" - integrity sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ== - dependencies: - "@typescript-eslint/utils" "^5.13.0" - eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -12064,27 +9095,16 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: +eslint-visitor-keys@^2.0.0: version "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.0.0, eslint-visitor-keys@^3.3.0: +eslint-visitor-keys@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint-webpack-plugin@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" - integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== - dependencies: - "@types/eslint" "^7.29.0 || ^8.4.1" - jest-worker "^28.0.2" - micromatch "^4.0.5" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - eslint@^7.18.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -12132,50 +9152,9 @@ eslint@^7.18.0: v8-compile-cache "^2.0.3" eslint@^8.10.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.10.0.tgz#931be395eb60f900c01658b278e05b6dae47199d" - integrity sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw== - dependencies: - "@eslint/eslintrc" "^1.2.0" - "@humanwhocodes/config-array" "^0.9.2" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.6.0" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -eslint@^8.3.0: - version "8.31.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.31.0.tgz#75028e77cbcff102a9feae1d718135931532d524" - integrity sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA== + version "8.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861" + integrity sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ== dependencies: "@eslint/eslintrc" "^1.4.1" "@humanwhocodes/config-array" "^0.11.8" @@ -12226,15 +9205,6 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -espree@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" - integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== - dependencies: - acorn "^8.7.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^3.3.0" - espree@^9.4.0: version "9.4.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" @@ -12283,39 +9253,39 @@ estree-to-babel@^3.1.0: c8 "^7.6.0" estree-util-attach-comments@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.0.tgz#47d69900588bcbc6bf58c3798803ec5f1f3008de" - integrity sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw== + version "2.1.1" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== dependencies: "@types/estree" "^1.0.0" estree-util-build-jsx@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.0.tgz#d4307bbeee28c14eb4d63b75c9aad28fa61d84f5" - integrity sha512-apsfRxF9uLrqosApvHVtYZjISPvTJ+lBiIydpC+9wE6cF6ssbhnjyQLqaIjgzGxvC2Hbmec1M7g91PoBayYoQQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" + integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== dependencies: "@types/estree-jsx" "^1.0.0" estree-util-is-identifier-name "^2.0.0" estree-walker "^3.0.0" estree-util-is-identifier-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz#cf07867f42705892718d9d89eb2d85eaa8f0fcb5" - integrity sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== estree-util-to-js@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.1.0.tgz#3bd9bb86354063537cc3d81259be2f0d4c3af39f" - integrity sha512-490lbfCcpLk+ofK6HCgqDfYs4KAfq6QVvDw3+Bm1YoKRgiOjKiKYGAVQE1uwh7zVxBgWhqp4FDtp5SqunpUk1A== + version "1.1.1" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.1.1.tgz#8d6d5acd8e701acce805800a7276f2f4b9ae4c8b" + integrity sha512-tW/ADSJON4o+T8rSmSX1ZXdat4n6bVOu0iTUFY9ZFF2dD/1/Hug8Lc/HYuJRA4Mop9zDZHQMo1m4lIxxJHkTjQ== dependencies: "@types/estree-jsx" "^1.0.0" astring "^1.8.0" source-map "^0.7.0" estree-util-visit@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.0.tgz#aa0311a9c2f2aa56e9ae5e8b9d87eac14e4ec8f8" - integrity sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== dependencies: "@types/estree-jsx" "^1.0.0" "@types/unist" "^2.0.0" @@ -12331,9 +9301,11 @@ estree-walker@^2.0.2: integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== estree-walker@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.1.tgz#c2a9fb4a30232f5039b7c030b37ead691932debd" - integrity sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g== + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" esutils@^2.0.2: version "2.0.3" @@ -12343,7 +9315,7 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventemitter3@^4.0.0, eventemitter3@^4.0.1, eventemitter3@^4.0.4: version "4.0.7" @@ -12399,12 +9371,12 @@ execa@^5.0.0, execa@^5.1.1: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -12440,43 +9412,18 @@ expect@^28.1.3: jest-message-util "^28.1.3" jest-util "^28.1.3" -express@^4.17.1: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== +expect@^29.0.0: + version "29.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" + integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.19.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.4.2" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.9.7" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" - setprototypeof "1.2.0" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" + "@jest/expect-utils" "^29.3.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" -express@^4.17.3: +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== @@ -12516,14 +9463,14 @@ express@^4.17.3: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -12559,7 +9506,7 @@ extglob@^2.0.4: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: version "1.4.1" @@ -12593,7 +9540,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -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== @@ -12604,23 +9551,12 @@ fast-glob@^3.2.12: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-json-parse@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -12628,27 +9564,20 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-sta fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - favicons-webpack-plugin@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/favicons-webpack-plugin/-/favicons-webpack-plugin-5.0.2.tgz#0837a753ee4485785fa2cec1c3b83472f9ff60ce" @@ -12691,16 +9620,16 @@ faye-websocket@^0.11.3: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" fetch-retry@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.2.tgz#4c55663a7c056cb45f182394e479464f0ff8f3e3" - integrity sha512-57Hmu+1kc6pKFUGVIobT7qw3NeAzY/uNN26bSevERLVvf6VGFR/ooDCOFBHMNDgAxBiU2YJq1D0vFzc6U1DcPw== + version "5.0.3" + resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.3.tgz#edfa3641892995f9afee94f25b168827aa97fe3d" + integrity sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw== figgy-pudding@^3.5.1: version "3.5.2" @@ -12744,35 +9673,22 @@ file-selector@^0.6.0: tslib "^2.4.0" file-system-cache@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" - integrity sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08= + version "1.1.0" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.1.0.tgz#984de17b976b75a77a27e08d6828137c1aa80fa1" + integrity sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw== dependencies: - bluebird "^3.3.5" - fs-extra "^0.30.0" - ramda "^0.21.0" + fs-extra "^10.1.0" + ramda "^0.28.0" file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filelist@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -12804,19 +9720,6 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -12856,10 +9759,10 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" @@ -12892,9 +9795,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flush-write-stream@^1.0.0: version "1.1.1" @@ -12911,15 +9814,10 @@ focus-lock@^0.8.0: dependencies: tslib "^1.9.3" -follow-redirects@^1.0.0, follow-redirects@^1.14.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== - -follow-redirects@^1.14.8: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.8: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" @@ -12931,7 +9829,7 @@ for-each@^0.3.3: for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== foreground-child@^2.0.0: version "2.0.0" @@ -12944,7 +9842,7 @@ foreground-child@^2.0.0: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== fork-ts-checker-webpack-plugin@^4.1.6: version "4.1.6" @@ -12960,25 +9858,6 @@ fork-ts-checker-webpack-plugin@^4.1.6: worker-rpc "^0.1.0" fork-ts-checker-webpack-plugin@^6.0.4: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz#0282b335fa495a97e167f69018f566ea7d2a2b5e" - integrity sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.2" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== @@ -12998,9 +9877,9 @@ fork-ts-checker-webpack-plugin@^6.5.0: tapable "^1.0.0" fork-ts-checker-webpack-plugin@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.1.tgz#c37a538e12730fe11fd725bcf0fce29487950833" - integrity sha512-uOfQdg/iQ8iokQ64qcbu8iZb114rOmaKLQFu7hU14/eJaKgsP91cQ7ts7v2iiDld6TzDe84Meksha8/MkWiCyw== + version "7.3.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz#a9c984a018493962360d7c7e77a67b44a2d5f3aa" + integrity sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA== dependencies: "@babel/code-frame" "^7.16.7" chalk "^4.1.2" @@ -13010,7 +9889,8 @@ fork-ts-checker-webpack-plugin@^7.2.1: fs-extra "^10.0.0" memfs "^3.4.1" minimatch "^3.0.4" - schema-utils "4.0.0" + node-abort-controller "^3.0.1" + schema-utils "^3.1.1" semver "^7.3.5" tapable "^2.2.1" @@ -13032,37 +9912,27 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= - forwarded@0.2.0: version "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== - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -13072,21 +9942,10 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -13116,7 +9975,7 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-monkey@1.0.3: +fs-monkey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== @@ -13124,7 +9983,7 @@ fs-monkey@1.0.3: fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" @@ -13134,7 +9993,7 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^1.2.7: version "1.2.13" @@ -13167,12 +10026,12 @@ function.prototype.name@^1.1.0, function.prototype.name@^1.1.5: functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== functions-have-names@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" - integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== + 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== gauge@^3.0.0: version "3.0.2" @@ -13192,7 +10051,7 @@ gauge@^3.0.0: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -13213,38 +10072,15 @@ 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-intrinsic@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.3" -get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -13293,12 +10129,12 @@ get-symbol-description@^1.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" @@ -13316,7 +10152,7 @@ git-raw-commits@^2.0.8: git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" @@ -13347,24 +10183,24 @@ git-url-parse@^11.4.4: gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== dependencies: ini "^1.3.2" github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== github-slugger@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" - integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -13376,7 +10212,7 @@ glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -13393,14 +10229,14 @@ glob-promise@^3.4.0: glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.2.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -13412,10 +10248,22 @@ glob@7.2.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glo once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + 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" + glob@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -13423,22 +10271,6 @@ glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -13452,35 +10284,21 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0: +globals@^13.19.0, globals@^13.6.0, globals@^13.9.0: version "13.19.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== dependencies: type-fest "^0.20.2" -globals@^13.6.0, globals@^13.9.0: - version "13.12.1" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb" - integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.0, globalthis@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" - integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== - dependencies: - define-properties "^1.1.3" - -globalthis@^1.0.3: +globalthis@^1.0.0, globalthis@^1.0.1, globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: +globby@^11.0.2, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -13495,7 +10313,7 @@ globby@^11.0.1, globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -13524,23 +10342,16 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -13561,7 +10372,7 @@ handlebars@^4.7.7: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" @@ -13576,17 +10387,7 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -harmony-reflect@^1.4.6: - version "1.6.2" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" - integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-bigints@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -13594,7 +10395,7 @@ has-bigints@^1.0.2: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -13604,7 +10405,7 @@ has-flag@^4.0.0: has-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= + integrity sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g== dependencies: is-glob "^3.0.0" @@ -13620,7 +10421,7 @@ has-proto@^1.0.1: resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -13635,12 +10436,12 @@ has-tostringtag@^1.0.0: has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -13649,7 +10450,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -13658,12 +10459,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -13739,9 +10540,9 @@ hast-util-raw@6.0.1: zwitch "^1.0.0" hast-util-to-estree@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.1.0.tgz#aeac70aad0102ae309570907b3f56a08231d5323" - integrity sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g== + version "2.2.1" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.2.1.tgz#e6114e8a2f482e60ca3fba8c27e9d757c6e7d85b" + integrity sha512-kiGD9WIW3gRKK8Gao3n1f+ahUeTMeJUJILnIT2QNrPigDNdH7rJxzhEbh81UajGeAdAHFecT1a+fLVOCTq9B4Q== dependencies: "@types/estree" "^1.0.0" "@types/estree-jsx" "^1.0.0" @@ -13755,7 +10556,7 @@ hast-util-to-estree@^2.0.0: mdast-util-mdxjs-esm "^1.0.0" property-information "^6.0.0" space-separated-tokens "^2.0.0" - style-to-object "^0.3.0" + style-to-object "^0.4.1" unist-util-position "^4.0.0" zwitch "^2.0.0" @@ -13771,9 +10572,9 @@ hast-util-to-parse5@^6.0.0: zwitch "^1.0.0" hast-util-whitespace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c" - integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg== + 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@^6.0.0: version "6.0.0" @@ -13796,18 +10597,6 @@ hex-rgb@^4.1.0: resolved "https://registry.yarnpkg.com/hex-rgb/-/hex-rgb-4.3.0.tgz#af5e974e83bb2fefe44d55182b004ec818c07776" integrity sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw== -highlight.js@^10.4.1, highlight.js@~10.7.0: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -history@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08" - integrity sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg== - dependencies: - "@babel/runtime" "^7.7.6" - history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -13820,17 +10609,10 @@ history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -history@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" - integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== - dependencies: - "@babel/runtime" "^7.7.6" - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -13843,11 +10625,6 @@ hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react- dependencies: react-is "^16.7.0" -hoopy@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -13863,7 +10640,7 @@ hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -13878,9 +10655,9 @@ html-encoding-sniffer@^2.0.1: whatwg-encoding "^1.0.5" html-entities@^2.1.0, html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== html-escaper@^2.0.0: version "2.0.2" @@ -13914,16 +10691,16 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== html-void-elements@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== -html-webpack-plugin@>=5.0.0, html-webpack-plugin@^5.0.0, html-webpack-plugin@^5.3.2, html-webpack-plugin@^5.5.0: +html-webpack-plugin@>=5.0.0, html-webpack-plugin@^5.0.0, html-webpack-plugin@^5.3.2: version "5.5.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== @@ -13967,18 +10744,7 @@ http-cache-semantics@^4.1.0: http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== http-errors@2.0.0: version "2.0.0" @@ -13994,7 +10760,7 @@ http-errors@2.0.0: http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" inherits "2.0.3" @@ -14002,9 +10768,9 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^4.0.1: version "4.0.1" @@ -14015,17 +10781,6 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-middleware@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz#5df04f69a89f530c2284cd71eeaa51ba52243289" - integrity sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" @@ -14049,7 +10804,7 @@ http-proxy@^1.18.1: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -14058,12 +10813,12 @@ http-signature@~1.2.0: https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" @@ -14076,7 +10831,7 @@ human-signals@^2.1.0: humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== dependencies: ms "^2.0.0" @@ -14099,7 +10854,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -14118,18 +10873,6 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -idb@^7.0.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" - integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== - -identity-obj-proxy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== - dependencies: - harmony-reflect "^1.4.6" - ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -14138,7 +10881,7 @@ ieee754@^1.1.13, ieee754@^1.1.4: iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== ignore-walk@^3.0.3: version "3.0.4" @@ -14152,21 +10895,16 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -immer@^9.0.7: - version "9.0.17" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.17.tgz#7cfe8fbb8b461096444e9da7a5ec4a67c6c4adf4" - integrity sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg== - import-fresh@^3.0.0, 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" @@ -14186,7 +10924,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^2.1.0: version "2.1.0" @@ -14208,7 +10946,7 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -14221,14 +10959,14 @@ inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, i inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + 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" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -14270,16 +11008,7 @@ inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -internal-slot@^1.0.4: +internal-slot@^1.0.3, internal-slot@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== @@ -14303,11 +11032,6 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" @@ -14331,7 +11055,7 @@ is-absolute-url@^3.0.0: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" @@ -14368,7 +11092,7 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" -is-arguments@^1.0.4, is-arguments@^1.1.0: +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== @@ -14376,7 +11100,7 @@ is-arguments@^1.0.4, is-arguments@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.0: +is-array-buffer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== @@ -14388,7 +11112,7 @@ is-array-buffer@^3.0.0: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" @@ -14405,7 +11129,7 @@ is-bigint@^1.0.1: is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== dependencies: binary-extensions "^1.0.0" @@ -14441,16 +11165,11 @@ is-builtin-module@^3.2.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -14458,14 +11177,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - -is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== @@ -14475,7 +11187,7 @@ is-core-module@^2.9.0: is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" @@ -14486,7 +11198,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== @@ -14537,7 +11249,7 @@ is-dom@^1.0.0: is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -14549,7 +11261,7 @@ is-extendable@^1.0.1: is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finite@^1.0.0: version "1.1.0" @@ -14559,7 +11271,7 @@ is-finite@^1.0.0: 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" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" @@ -14581,7 +11293,7 @@ is-generator-fn@^2.0.0: is-glob@^3.0.0, is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== dependencies: is-extglob "^2.1.0" @@ -14605,14 +11317,14 @@ is-hexadecimal@^2.0.0: is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.2: +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== @@ -14622,22 +11334,22 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" @@ -14646,11 +11358,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -14661,7 +11368,7 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== -is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: +is-path-cwd@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== @@ -14680,7 +11387,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -14688,7 +11395,7 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: version "2.1.0" @@ -14723,13 +11430,13 @@ is-potential-custom-element-name@^1.0.1: integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-reference@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.0.tgz#b1380c03d96ddf7089709781e3208fceb0c92cd6" - integrity sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q== + 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== dependencies: "@types/estree" "*" -is-regex@^1.0.4, is-regex@^1.1.2, is-regex@^1.1.4: +is-regex@^1.1.2, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -14737,26 +11444,11 @@ is-regex@^1.0.4, is-regex@^1.1.2, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-set@^2.0.2: +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.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - 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" @@ -14774,7 +11466,7 @@ is-ssh@^1.3.0: is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" @@ -14798,7 +11490,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" @@ -14816,7 +11508,7 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" @@ -14828,13 +11520,26 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== -is-weakref@^1.0.1, is-weakref@^1.0.2: +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" 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.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-whitespace-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" @@ -14843,7 +11548,7 @@ is-whitespace-character@^1.0.0: is-window@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" - integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0= + integrity sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg== is-windows@^1.0.2: version "1.0.2" @@ -14858,7 +11563,7 @@ is-word-character@^1.0.0: is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" @@ -14875,7 +11580,7 @@ isarray@0.0.1: isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isarray@^2.0.5: version "2.0.5" @@ -14885,19 +11590,19 @@ isarray@^2.0.5: isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isobject@^4.0.0: version "4.0.0" @@ -14920,17 +11625,17 @@ isomorphic-ws@^4.0.1: isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.1, istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -14956,10 +11661,10 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== +istanbul-reports@^3.1.3, istanbul-reports@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -14977,16 +11682,6 @@ iterate-value@^1.0.2: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" -jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" - javascript-stringify@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" @@ -15094,6 +11789,16 @@ jest-diff@^28.1.3: jest-get-type "^28.0.2" pretty-format "^28.1.3" +jest-diff@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" + integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" + jest-docblock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" @@ -15147,6 +11852,11 @@ jest-get-type@^28.0.2: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== +jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== + jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" @@ -15239,6 +11949,16 @@ jest-matcher-utils@^28.1.3: jest-get-type "^28.0.2" pretty-format "^28.1.3" +jest-matcher-utils@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" + integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" + jest-message-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" @@ -15269,6 +11989,21 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" + integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.3.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.3.1" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.0.6, jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" @@ -15278,9 +12013,9 @@ jest-mock@^27.0.6, jest-mock@^27.5.1: "@types/node" "*" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^26.0.0: version "26.0.0" @@ -15292,11 +12027,6 @@ jest-regex-util@^27.5.1: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== -jest-regex-util@^28.0.0: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - jest-resolve-dependencies@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" @@ -15306,7 +12036,7 @@ jest-resolve-dependencies@^27.5.1: jest-regex-util "^27.5.1" jest-snapshot "^27.5.1" -jest-resolve@^27.4.2, jest-resolve@^27.5.1: +jest-resolve@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== @@ -15457,6 +12187,18 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" @@ -15469,19 +12211,6 @@ jest-validate@^27.5.1: leven "^3.1.0" pretty-format "^27.5.1" -jest-watch-typeahead@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" - integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== - dependencies: - ansi-escapes "^4.3.1" - chalk "^4.0.0" - jest-regex-util "^28.0.0" - jest-watcher "^28.0.0" - slash "^4.0.0" - string-length "^5.0.1" - strip-ansi "^7.0.1" - jest-watcher@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" @@ -15495,21 +12224,7 @@ jest-watcher@^27.5.1: jest-util "^27.5.1" string-length "^4.0.1" -jest-watcher@^28.0.0: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== - dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" - -jest-worker@^26.2.1, jest-worker@^26.5.0, jest-worker@^26.6.2: +jest-worker@^26.5.0, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -15527,16 +12242,7 @@ jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^28.0.2: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.1.0, jest@^27.4.3: +jest@^27.1.0: version "27.5.1" resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== @@ -15546,9 +12252,9 @@ jest@^27.1.0, jest@^27.4.3: jest-cli "^27.5.1" js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== js-sha3@^0.8.0: version "0.8.0" @@ -15558,7 +12264,7 @@ js-sha3@^0.8.0: js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -15583,7 +12289,7 @@ js-yaml@^3.13.1: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== jsdom@^16.6.0: version "16.7.0" @@ -15626,7 +12332,7 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" @@ -15648,7 +12354,7 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0, json-schema@^0.4.0: +json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== @@ -15656,17 +12362,17 @@ json-schema@0.4.0, json-schema@^0.4.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@2.x, json5@^2.1.0, json5@^2.1.2, json5@^2.1.3: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@2.x, json5@^2.1.0, json5@^2.1.2, json5@^2.1.3, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== json5@^1.0.1: version "1.0.2" @@ -15675,22 +12381,10 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.2.0, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonc-parser@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d" - integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^6.0.1: version "6.1.0" @@ -15704,12 +12398,7 @@ jsonfile@^6.0.1: jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsonpointer@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" - integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsprim@^1.2.2: version "1.4.2" @@ -15721,83 +12410,83 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -jss-plugin-camel-case@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7" - integrity sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww== +jss-plugin-camel-case@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.2.tgz#76dddfa32f9e62d17daa4e3504991fd0933b89e1" + integrity sha512-wgBPlL3WS0WDJ1lPJcgjux/SHnDuu7opmgQKSraKs4z8dCCyYMx9IDPFKBXQ8Q5dVYij1FFV0WdxyhuOOAXuTg== dependencies: "@babel/runtime" "^7.3.1" hyphenate-style-name "^1.0.3" - jss "10.9.0" + jss "10.9.2" -jss-plugin-default-unit@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz#bb23a48f075bc0ce852b4b4d3f7582bc002df991" - integrity sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w== +jss-plugin-default-unit@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.2.tgz#3e7f4a1506b18d8fe231554fd982439feb2a9c53" + integrity sha512-pYg0QX3bBEFtTnmeSI3l7ad1vtHU42YEEpgW7pmIh+9pkWNWb5dwS/4onSfAaI0kq+dOZHzz4dWe+8vWnanoSg== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.0" + jss "10.9.2" -jss-plugin-global@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz#fc07a0086ac97aca174e37edb480b69277f3931f" - integrity sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ== +jss-plugin-global@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.2.tgz#e7f2ad4a5e8e674fb703b04b57a570b8c3e5c2c2" + integrity sha512-GcX0aE8Ef6AtlasVrafg1DItlL/tWHoC4cGir4r3gegbWwF5ZOBYhx04gurPvWHC8F873aEGqge7C17xpwmp2g== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.0" + jss "10.9.2" -jss-plugin-nested@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz#cc1c7d63ad542c3ccc6e2c66c8328c6b6b00f4b3" - integrity sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA== +jss-plugin-nested@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.2.tgz#3aa2502816089ecf3981e1a07c49b276d67dca63" + integrity sha512-VgiOWIC6bvgDaAL97XCxGD0BxOKM0K0zeB/ECyNaVF6FqvdGB9KBBWRdy2STYAss4VVA7i5TbxFZN+WSX1kfQA== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.0" + jss "10.9.2" tiny-warning "^1.0.2" -jss-plugin-props-sort@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz#30e9567ef9479043feb6e5e59db09b4de687c47d" - integrity sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw== +jss-plugin-props-sort@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.2.tgz#645f6c8f179309667b3e6212f66b59a32fb3f01f" + integrity sha512-AP1AyUTbi2szylgr+O0OB7gkIxEGzySLITZ2GpsaoX72YMCGI2jYAc+WUhPfvUnZYiauF4zTnN4V4TGuvFjJlw== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.0" + jss "10.9.2" -jss-plugin-rule-value-function@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz#379fd2732c0746fe45168011fe25544c1a295d67" - integrity sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg== +jss-plugin-rule-value-function@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.2.tgz#9afe07596e477123cbf11120776be6a64494541f" + integrity sha512-vf5ms8zvLFMub6swbNxvzsurHfUZ5Shy5aJB2gIpY6WNA3uLinEcxYyraQXItRHi5ivXGqYciFDRM2ZoVoRZ4Q== dependencies: "@babel/runtime" "^7.3.1" - jss "10.9.0" + jss "10.9.2" tiny-warning "^1.0.2" -jss-plugin-vendor-prefixer@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz#aa9df98abfb3f75f7ed59a3ec50a5452461a206a" - integrity sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA== +jss-plugin-vendor-prefixer@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.2.tgz#410a0f3b9f8dbbfba58f4d329134df4849aa1237" + integrity sha512-SxcEoH+Rttf9fEv6KkiPzLdXRmI6waOTcMkbbEFgdZLDYNIP9UKNHFy6thhbRKqv0XMQZdrEsbDyV464zE/dUA== dependencies: "@babel/runtime" "^7.3.1" css-vendor "^2.0.8" - jss "10.9.0" + jss "10.9.2" -jss@10.9.0, jss@^10.8.2: - version "10.9.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.0.tgz#7583ee2cdc904a83c872ba695d1baab4b59c141b" - integrity sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw== +jss@10.9.2, jss@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.2.tgz#9379be1f195ef98011dfd31f9448251bd61b95a9" + integrity sha512-b8G6rWpYLR4teTUbGd4I4EsnWjg7MN0Q5bSsjKhVkJVjhQDy2KzkbD2AW3TuT0RYZVmZZHKIrXDn6kjU14qkUg== dependencies: "@babel/runtime" "^7.3.1" csstype "^3.0.2" is-in-browser "^1.1.3" tiny-warning "^1.0.2" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" - integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== +"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== dependencies: - array-includes "^3.1.3" - object.assign "^4.1.2" + array-includes "^3.1.5" + object.assign "^4.1.3" junk@^3.1.0: version "3.1.0" @@ -15807,14 +12496,14 @@ junk@^3.1.0: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" @@ -15828,13 +12517,6 @@ 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@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -15845,20 +12527,20 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@^2.0.4, klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== +klona@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== language-subtag-registry@~0.3.2: - version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" - integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@^1.0.5: +language-tags@=1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: language-subtag-registry "~0.3.2" @@ -15913,7 +12595,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -15940,16 +12622,16 @@ libnpmpublish@^4.0.0: ssri "^8.0.1" libsodium-wrappers@^0.7.6: - version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" - integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + version "0.7.10" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz#13ced44cacb0fc44d6ac9ce67d725956089ce733" + integrity sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg== dependencies: libsodium "^0.7.0" libsodium@^0.7.0: - version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" - integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + version "0.7.10" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.10.tgz#c2429a7e4c0836f879d701fec2c8a208af024159" + integrity sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ== lie@3.1.1: version "3.1.1" @@ -15959,11 +12641,6 @@ lie@3.1.1: immediate "~3.0.5" lilconfig@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== - -lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== @@ -15987,7 +12664,7 @@ load-json-file@^1.0.0: load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -16010,11 +12687,11 @@ loader-runner@^2.4.0: integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-runner@^4.1.0, loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.2.3: version "1.4.2" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== @@ -16023,20 +12700,15 @@ loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== +loader-utils@^2.0.0, loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - localforage@^1.7.3: version "1.10.0" resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" @@ -16047,7 +12719,7 @@ localforage@^1.7.3: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -16082,12 +12754,12 @@ lodash-es@^4.17.21: lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.defaultsdeep@^4.6.1: version "4.6.1" @@ -16097,12 +12769,12 @@ lodash.defaultsdeep@^4.6.1: lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" @@ -16112,12 +12784,7 @@ lodash.merge@^4.6.2: lodash.padend@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + integrity sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw== lodash.template@^4.5.0: version "4.5.0" @@ -16137,7 +12804,7 @@ lodash.templatesettings@^4.0.0: lodash.trimstart@^4.5.1: version "4.5.1" resolved "https://registry.yarnpkg.com/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz#8ff4dec532d82486af59573c39445914e944a7f1" - integrity sha1-j/TexTLYJIavWVc8OURZFOlEp/E= + integrity sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ== lodash.truncate@^4.4.2: version "4.4.2" @@ -16147,14 +12814,14 @@ lodash.truncate@^4.4.2: lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash.words@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-4.2.0.tgz#5ecfeaf8ecf8acaa8e0c8386295f1993c9cf4036" - integrity sha1-Xs/q+Oz4rKqODIOGKV8Zk8nPQDY= + integrity sha512-mXxqd8Yx9BGPij3lZKFSdOsjOTbL4krbCCp9slEozaN4EMppA2dFmK/f8HeohodprY6W0vOdiQ5WFgPaTI75xQ== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -16199,14 +12866,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lowlight@^1.17.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" - integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== - dependencies: - fault "^1.0.0" - highlight.js "~10.7.0" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -16234,14 +12893,7 @@ luxon@^2.3.0: lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= - -magic-string@^0.25.0, magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== magic-string@^0.27.0: version "0.27.0" @@ -16330,12 +12982,12 @@ map-age-cleaner@^0.1.3: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" @@ -16345,12 +12997,12 @@ map-obj@^4.0.0: map-or-similar@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" - integrity sha1-beJlMXSt+12e3DPGnT6Sobdvrwg= + integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" @@ -16365,9 +13017,9 @@ markdown-extensions@^1.0.0: integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== marked@^4.0.16: - version "4.0.18" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.18.tgz#cd0ac54b2e5610cfb90e8fd46ccaa8292c9ed569" - integrity sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw== + version "4.2.12" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" + integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== md5.js@^1.3.4: version "1.3.5" @@ -16466,6 +13118,14 @@ mdast-util-mdxjs-esm@^1.0.0: mdast-util-from-markdown "^1.0.0" mdast-util-to-markdown "^1.0.0" +mdast-util-phrasing@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.0.tgz#c44fcf6be61a3cb8da54ab2df22320e61d4537ce" + integrity sha512-S+QYsDRLkGi8U7o5JF1agKa/sdP+CNGXXLqC17pdTVL8FHHgQEiwFGa9yE5aYtUxNiFGYoaDy9V1kC85Sz86Gg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + mdast-util-to-hast@10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" @@ -16481,9 +13141,9 @@ mdast-util-to-hast@10.0.1: unist-util-visit "^2.0.0" mdast-util-to-hast@^12.1.0: - version "12.2.4" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz#34c1ef2b6cf01c27b3e3504e2c977c76f722e7e1" - integrity sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg== + version "12.2.6" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.2.6.tgz#fb90830f427de8d2a7518753e560435531b97ee6" + integrity sha512-Kfo1JNUsi6r6CI7ZOJ6yt/IEKMjMK4nNjQ8C+yc8YBbIlDSp9dmj0zY90ryiu6Vy4CVGv0zi1H4ZoIaYVV8cwA== dependencies: "@types/hast" "^2.0.0" "@types/mdast" "^3.0.0" @@ -16496,13 +13156,14 @@ mdast-util-to-hast@^12.1.0: unist-util-visit "^4.0.0" mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz#38b6cdc8dc417de642a469c4fc2abdf8c931bd1e" - integrity sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" mdast-util-to-string "^3.0.0" micromark-util-decode-string "^1.0.0" unist-util-visit "^4.0.0" @@ -16523,20 +13184,15 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== mem@^8.1.1: version "8.1.1" @@ -16546,24 +13202,24 @@ mem@^8.1.1: map-age-cleaner "^0.1.3" mimic-fn "^3.1.0" -memfs@^3.1.2, memfs@^3.2.2, memfs@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" - integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== +memfs@^3.1.2, memfs@^3.2.2, memfs@^3.4.1, memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== dependencies: - fs-monkey "1.0.3" + fs-monkey "^1.0.3" memoizerific@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" - integrity sha1-fIekZGREwy11Q4VwkF8tvRsagFo= + integrity sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog== dependencies: map-or-similar "^1.5.0" memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -16579,7 +13235,7 @@ memory-fs@^0.5.0: memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== meow@^3.1.0: version "3.7.0" @@ -16617,7 +13273,7 @@ meow@^8.0.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" @@ -16632,7 +13288,7 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== microevent.ts@~0.1.1: version "0.1.1" @@ -16662,9 +13318,9 @@ micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: uvu "^0.5.0" micromark-extension-mdx-expression@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz#cd3843573921bf55afcfff4ae0cd2e857a16dcfa" - integrity sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.4.tgz#33fe2c6ee214738255de175a084281c11894ddda" + integrity sha512-TCgLxqW6ReQ3AJgtj1P0P+8ZThBTloLbeb7jNaqr6mCOLDpxUiBFE/9STgooMZttEwOQu5iEcCCa3ZSDhY9FGw== dependencies: micromark-factory-mdx-expression "^1.0.0" micromark-factory-space "^1.0.0" @@ -16744,9 +13400,9 @@ micromark-factory-label@^1.0.0: uvu "^0.5.0" micromark-factory-mdx-expression@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz#917e17d16e6e9c2551f3a862e6a9ebdd22056476" - integrity sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA== + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.7.tgz#e38298dc1f7eaf6ba1d9f210531ceae17155c00f" + integrity sha512-QAdFbkQagTZ/eKb8zDGqmjvgevgJH3+aQpvvKrXWxNJp3o8/l2cAbbrBd0E04r0Gx6nssPpqWIjnbHFvZu5qsQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" @@ -16841,9 +13497,9 @@ micromark-util-encode@^1.0.0: integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== micromark-util-events-to-acorn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz#65785cb77299d791bfefdc6a5213ab57ceead115" - integrity sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.1.tgz#d5b9dfbc589ece7917de24de0a57b909c0d36583" + integrity sha512-mkg3BaWlw6ZTkQORrKVBW4o9ICXPxLtGz51vml5mQpKFdo9vqIX68CAx5JhTOdjQyAHH7JFmm4rh8toSPQZUmg== dependencies: "@types/acorn" "^4.0.0" "@types/estree" "^1.0.0" @@ -16944,14 +13600,6 @@ micromatch@^3.1.10, micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -16967,22 +13615,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -"mime-db@>= 1.43.0 < 2": +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.51.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" @@ -17012,7 +13655,7 @@ mimic-response@^3.1.0: min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== dependencies: dom-walk "^0.1.0" @@ -17021,22 +13664,7 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-create-react-context@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" - integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== - dependencies: - "@babel/runtime" "^7.12.1" - tiny-warning "^1.0.3" - mini-css-extract-plugin@^2.2.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" - integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== - dependencies: - schema-utils "^4.0.0" - -mini-css-extract-plugin@^2.4.5: version "2.7.2" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz#e049d3ea7d3e4e773aad585c6cb329ce0c7b72d7" integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== @@ -17051,7 +13679,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@5.0.1: version "5.0.1" @@ -17060,7 +13688,7 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -17068,9 +13696,9 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: brace-expansion "^1.1.7" minimatch@^5.0.1, minimatch@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" @@ -17144,9 +13772,16 @@ minipass@^2.6.0, minipass@^2.9.0: yallist "^3.0.0" minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" + integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== dependencies: yallist "^4.0.0" @@ -17204,30 +13839,22 @@ mkdirp-infer-owner@^2.0.0: mkdirp "^1.0.3" mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" @@ -17258,7 +13885,7 @@ modify-values@^1.0.0: move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" @@ -17275,7 +13902,7 @@ mri@^1.1.0: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.1: version "2.1.1" @@ -17292,19 +13919,6 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" @@ -17330,9 +13944,9 @@ mute-stream@0.0.8, mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nanoclone@^0.2.1: version "0.2.1" @@ -17344,12 +13958,7 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -nanoid@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - -nanoid@^3.3.4: +nanoid@^3.3.1, nanoid@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== @@ -17384,7 +13993,7 @@ natural-compare-lite@^1.4.0: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3, negotiator@^0.6.2: version "0.6.3" @@ -17397,9 +14006,9 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + version "2.1.1" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" + integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== nice-try@^1.0.4: version "1.0.5" @@ -17415,33 +14024,38 @@ no-case@^3.0.4: tslib "^2.0.3" node-abi@^3.3.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.8.0.tgz#679957dc8e7aa47b0a02589dbfde4f77b29ccb32" - integrity sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw== + version "3.31.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.31.0.tgz#dfb2ea3d01188eb80859f69bb4a4354090c1b355" + integrity sha512-eSKV6s+APenqVh8ubJyiu/YhZgxQpGP66ntzUb3lY1xB9ukSRaGnx0AIxI+IM+1+IVYC1oWobgG5L3Lt9ARykQ== dependencies: semver "^7.3.5" +node-abort-controller@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e" + integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw== + node-addon-api@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== node-addon-api@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" - integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== node-dir@^0.1.10: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" - integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== dependencies: minimatch "^3.0.2" node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + version "2.6.8" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" + integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg== dependencies: whatwg-url "^5.0.0" @@ -17450,11 +14064,6 @@ node-forge@^1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-forge@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.0.tgz#37a874ea723855f37db091e6c186e5b67a01d4b2" - integrity sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA== - node-gyp@^5.0.2: version "5.1.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" @@ -17491,7 +14100,7 @@ node-gyp@^7.1.0: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-libs-browser@^2.2.1: version "2.2.1" @@ -17522,11 +14131,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - node-releases@^2.0.6: version "2.0.8" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" @@ -17570,7 +14174,7 @@ normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" @@ -17582,7 +14186,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@^6.0.1, normalize-url@^6.1.0: version "6.1.0" @@ -17590,9 +14194,9 @@ normalize-url@^6.0.1, normalize-url@^6.1.0: integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== notistack@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/notistack/-/notistack-2.0.3.tgz#9007550e5cbc14df84d1d54e7a55ac0948eb59e8" - integrity sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A== + version "2.0.8" + resolved "https://registry.yarnpkg.com/notistack/-/notistack-2.0.8.tgz#78cdf34c64e311bf1d1d71c2123396bcdea5e95b" + integrity sha512-/IY14wkFp5qjPgKNvAdfL5Jp6q90+MjgKTPh4c81r/lW70KeuX6b9pE/4f8L4FG31cNudbN9siiFS5ql1aSLRw== dependencies: clsx "^1.1.0" hoist-non-react-statics "^3.3.0" @@ -17703,7 +14307,7 @@ npm-run-all@^4.1.5: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" @@ -17714,7 +14318,7 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^4.0.1, npmlog@^4.1.2: +npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -17734,34 +14338,27 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - nth-check@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== oauth-sign@~0.9.0: version "0.9.0" @@ -17771,33 +14368,23 @@ oauth-sign@~0.9.0: object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.11.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1: +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== @@ -17805,7 +14392,7 @@ object-is@^1.0.1: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -17813,21 +14400,11 @@ object-keys@^1.0.12, object-keys@^1.1.1: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - 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" - -object.assign@^4.1.4: +object.assign@^4.1.2, object.assign@^4.1.3, 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== @@ -17837,16 +14414,7 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.entries@^1.1.6: +object.entries@^1.1.0, 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== @@ -17855,16 +14423,7 @@ object.entries@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" -"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.fromentries@^2.0.6: +"object.fromentries@^2.0.0 || ^1.0.0", 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== @@ -17874,15 +14433,6 @@ object.fromentries@^2.0.6: es-abstract "^1.20.4" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.getownpropertydescriptors@^2.1.0: version "2.1.5" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== @@ -17892,14 +14442,6 @@ object.getownpropertydescriptors@^2.1.0: define-properties "^1.1.4" es-abstract "^1.20.4" -object.hasown@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" - integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.19.1" - object.hasown@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" @@ -17911,20 +14453,11 @@ object.hasown@^1.1.2: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.values@^1.1.6: +object.values@^1.1.0, 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== @@ -17950,13 +14483,6 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" @@ -17965,7 +14491,7 @@ on-headers@~1.0.2: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -18020,17 +14546,17 @@ optionator@^0.9.1: os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== osenv@^0.1.4: version "0.1.5" @@ -18050,7 +14576,7 @@ p-all@^2.1.0: p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== p-event@^4.1.0: version "4.2.0" @@ -18069,7 +14595,7 @@ p-filter@^2.1.0: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^1.1.0: version "1.3.0" @@ -18095,7 +14621,7 @@ p-limit@^3.0.2: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -18163,11 +14689,11 @@ p-reduce@^2.0.0, p-reduce@^2.1.0: integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - "@types/retry" "^0.12.0" + "@types/retry" "0.12.0" retry "^0.13.1" p-timeout@^3.1.0, p-timeout@^3.2.0: @@ -18180,7 +14706,7 @@ p-timeout@^3.1.0, p-timeout@^3.2.0: p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" @@ -18220,9 +14746,9 @@ pacote@^11.2.6: tar "^6.1.0" pako@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== pako@~1.0.5: version "1.0.11" @@ -18267,7 +14793,7 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-author@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" - integrity sha1-00YL8d3Q367tQtp1QkLmX7aEqB8= + integrity sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw== dependencies: author-regex "^1.0.0" @@ -18307,7 +14833,7 @@ parse-json@^2.2.0: parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -18363,7 +14889,7 @@ pascal-case@^3.1.2: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== path-browserify@0.0.1: version "0.0.1" @@ -18378,7 +14904,7 @@ path-browserify@^1.0.1: path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== path-exists@^2.0.0: version "2.1.0" @@ -18390,7 +14916,7 @@ path-exists@^2.0.0: path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -18400,24 +14926,24 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -18425,7 +14951,7 @@ path-parse@^1.0.6, path-parse@^1.0.7: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@^1.7.0: version "1.8.0" @@ -18469,7 +14995,7 @@ pbkdf2@^3.0.3, pbkdf2@^3.0.9: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== periscopic@^3.0.0: version "3.0.4" @@ -18502,12 +15028,12 @@ pidtree@^0.3.0: pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" @@ -18522,14 +15048,14 @@ pify@^5.0.0: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: version "4.0.5" @@ -18557,13 +15083,6 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -18571,13 +15090,6 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" -polished@^4.0.5: - version "4.1.4" - resolved "https://registry.yarnpkg.com/polished/-/polished-4.1.4.tgz#640293ba834109614961a700fdacbb6599fb12d0" - integrity sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg== - dependencies: - "@babel/runtime" "^7.16.7" - polished@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" @@ -18585,31 +15097,10 @@ polished@^4.2.2: dependencies: "@babel/runtime" "^7.17.8" -portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" - integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-browser-comments@^4: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" - integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postcss-calc@^8.2.3: version "8.2.4" @@ -18619,34 +15110,6 @@ postcss-calc@^8.2.3: postcss-selector-parser "^6.0.9" postcss-value-parser "^4.2.0" -postcss-clamp@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" - integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-functional-notation@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" - integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-hex-alpha@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" - integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-color-rebeccapurple@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" - integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== - dependencies: - postcss-value-parser "^4.2.0" - postcss-colormin@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" @@ -18657,76 +15120,34 @@ postcss-colormin@^5.3.0: colord "^2.9.1" postcss-value-parser "^4.2.0" -postcss-convert-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz#f8d3abe40b4ce4b1470702a0706343eac17e7c10" - integrity sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g== +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== dependencies: + browserslist "^4.21.4" postcss-value-parser "^4.2.0" -postcss-custom-media@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" - integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-custom-properties@^12.1.10: - version "12.1.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" - integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-custom-selectors@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" - integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-dir-pseudo-class@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" - integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-discard-comments@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.0.tgz#87be4e0953bf599935837b940c701f8d4eca7d0b" - integrity sha512-L0IKF4jAshRyn03SkEO6ar/Ipz2oLywVbg2THf2EqqdNkBwmVMxuTR/RoAltOw4piiaLt3gCAdrbAqmTBInmhg== +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== postcss-discard-duplicates@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== -postcss-discard-empty@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.0.tgz#7f51b16cd1b89f8180bbc7cee34d6cbabf2ef810" - integrity sha512-782T/buGgb3HOuHOJAHpdyKzAAKsv/BxWqsutnZ+QsiHEcDkY7v+6WWdturuBiSal6XMOO1p1aJvwXdqLD5vhA== +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== postcss-discard-overridden@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-double-position-gradients@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" - integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-env-function@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" - integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== - dependencies: - postcss-value-parser "^4.2.0" - postcss-flexbugs-fixes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" @@ -18734,79 +15155,6 @@ postcss-flexbugs-fixes@^4.2.1: dependencies: postcss "^7.0.26" -postcss-flexbugs-fixes@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" - integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== - -postcss-focus-visible@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" - integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-focus-within@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" - integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== - dependencies: - postcss-selector-parser "^6.0.9" - -postcss-font-variant@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" - integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== - -postcss-gap-properties@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" - integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== - -postcss-image-set-function@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" - integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-initial@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" - integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== - -postcss-js@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" - integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== - dependencies: - camelcase-css "^2.0.1" - -postcss-lab-function@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" - integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - postcss-loader@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" @@ -18818,39 +15166,20 @@ postcss-loader@^4.2.0: schema-utils "^3.0.0" semver "^7.3.4" -postcss-loader@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - -postcss-logical@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" - integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== - -postcss-media-minmax@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" - integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== - -postcss-merge-longhand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.0.tgz#f716bffbf0bdfbde6ea78c36088e21559f8a0a95" - integrity sha512-Gr46srN2tsLD8fudKYoHO56RG0BLQ2nsBRnSZGY04eNBPwTeWa9KeHrbL3tOLAHyB2aliikycPH2TMJG1U+W6g== +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^5.1.0" + stylehacks "^5.1.1" -postcss-merge-rules@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.0.tgz#a2d5117eba09c8686a5471d97bd9afcf30d1b41f" - integrity sha512-NecukEJovQ0mG7h7xV8wbYAkXGTO3MPKnXvuiXzOKcxoOodfTTKYjeo8TMhAswlSkjcPIBlnKbSFcTuVSDaPyQ== +postcss-merge-rules@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz#8f97679e67cc8d08677a6519afca41edf2220894" + integrity sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" cssnano-utils "^3.1.0" postcss-selector-parser "^6.0.5" @@ -18862,28 +15191,28 @@ postcss-minify-font-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-minify-gradients@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.0.tgz#de0260a67a13b7b321a8adc3150725f2c6612377" - integrity sha512-J/TMLklkONn3LuL8wCwfwU8zKC1hpS6VcxFkNUNjmVt53uKqrrykR3ov11mdUYyqVMEx67slMce0tE14cE4DTg== +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: colord "^2.9.1" cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.0.tgz#e0b1f4e05cfd396682f612856485907e4064f25e" - integrity sha512-q67dcts4Hct6x8+JmhBgctHkbvUsqGIg2IItenjE63iZXMbhjr7AlVZkNnKtIGt/1Wsv7p/7YzeSII6Q+KPXRg== +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz#17c2be233e12b28ffa8a421a02fc8b839825536c" - integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== dependencies: postcss-selector-parser "^6.0.5" @@ -18948,21 +15277,6 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-nesting@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" - integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== - dependencies: - "@csstools/selector-specificity" "^2.0.0" - postcss-selector-parser "^6.0.10" - postcss-normalize-charset@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" @@ -18975,17 +15289,17 @@ postcss-normalize-display-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" - integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" - integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== dependencies: postcss-value-parser "^4.2.0" @@ -19003,12 +15317,12 @@ postcss-normalize-timing-functions@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" - integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" postcss-value-parser "^4.2.0" postcss-normalize-url@^5.1.0: @@ -19019,122 +15333,27 @@ postcss-normalize-url@^5.1.0: normalize-url "^6.0.1" postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.0.tgz#aed8b4580c9ad6e8eac034177291187ea16a059c" - integrity sha512-7O1FanKaJkpWFyCghFzIkLhehujV/frGkdofGLwhg5upbLyGsSfiTcZAdSzoPsSUgyPCkBkNMeWR8yVgPdQybg== +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" - integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== - dependencies: - "@csstools/normalize.css" "*" - postcss-browser-comments "^4" - sanitize.css "*" - -postcss-opacity-percentage@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" - integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== - -postcss-ordered-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.0.tgz#04ef429e0991b0292bc918b135cd4c038f7b889f" - integrity sha512-wU4Z4D4uOIH+BUKkYid36gGDJNQtkVJT7Twv8qH6UyfttbbJWyw4/xIPuVEkkCtQLAJ0EdsNSh8dlvqkXb49TA== +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== dependencies: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" - integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== +postcss-reduce-initial@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz#c18b7dfb88aee24b1f8e4936541c29adbd35224e" + integrity sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w== dependencies: - postcss-value-parser "^4.2.0" - -postcss-page-break@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" - integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== - -postcss-place@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" - integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-preset-env@^7.0.1: - version "7.8.3" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" - integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== - dependencies: - "@csstools/postcss-cascade-layers" "^1.1.1" - "@csstools/postcss-color-function" "^1.1.1" - "@csstools/postcss-font-format-keywords" "^1.0.1" - "@csstools/postcss-hwb-function" "^1.0.2" - "@csstools/postcss-ic-unit" "^1.0.1" - "@csstools/postcss-is-pseudo-class" "^2.0.7" - "@csstools/postcss-nested-calc" "^1.0.0" - "@csstools/postcss-normalize-display-values" "^1.0.1" - "@csstools/postcss-oklab-function" "^1.1.1" - "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.1" - "@csstools/postcss-text-decoration-shorthand" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.2" - "@csstools/postcss-unset-value" "^1.0.2" - autoprefixer "^10.4.13" browserslist "^4.21.4" - css-blank-pseudo "^3.0.3" - css-has-pseudo "^3.0.4" - css-prefers-color-scheme "^6.0.3" - cssdb "^7.1.0" - postcss-attribute-case-insensitive "^5.0.2" - postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.4" - postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.1" - postcss-custom-media "^8.0.2" - postcss-custom-properties "^12.1.10" - postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.5" - postcss-double-position-gradients "^3.1.2" - postcss-env-function "^4.0.6" - postcss-focus-visible "^6.0.4" - postcss-focus-within "^5.0.4" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.5" - postcss-image-set-function "^4.0.7" - postcss-initial "^4.0.1" - postcss-lab-function "^4.2.1" - postcss-logical "^5.0.4" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.2.0" - postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.4" - postcss-page-break "^3.0.4" - postcss-place "^7.0.5" - postcss-pseudo-class-any-link "^7.1.6" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-pseudo-class-any-link@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" - integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== - dependencies: - postcss-selector-parser "^6.0.10" - -postcss-reduce-initial@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" - integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== - dependencies: - browserslist "^4.16.6" caniuse-api "^3.0.0" postcss-reduce-transforms@^5.1.0: @@ -19144,27 +15363,7 @@ postcss-reduce-transforms@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-replace-overflow-wrap@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" - integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== - -postcss-selector-not@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" - integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== - dependencies: - postcss-selector-parser "^6.0.10" - postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.10: version "6.0.11" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== @@ -19180,10 +15379,10 @@ postcss-svgo@^5.1.0: postcss-value-parser "^4.2.0" svgo "^2.7.0" -postcss-unique-selectors@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.0.tgz#70a945da1b0599d00f617222a44ba1d82a676694" - integrity sha512-LmUhgGobtpeVJJHuogzjLRwJlN7VH+BL5c9GKMVJSS/ejoyePZkXvNsYUtk//F6vKOGK86gfRS0xH7fXQSDtvA== +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: postcss-selector-parser "^6.0.5" @@ -19192,12 +15391,12 @@ postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -19205,25 +15404,7 @@ postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0 picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.15, postcss@^8.3.5: - version "8.4.8" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.8.tgz#dad963a76e82c081a0657d3a2f3602ce10c2e032" - integrity sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ== - dependencies: - nanoid "^3.3.1" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.18, postcss@^8.4.4: - version "8.4.20" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" - integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.19: +postcss@^8.2.15, postcss@^8.3.5, postcss@^8.4.19: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -19232,26 +15413,7 @@ postcss@^8.4.19: picocolors "^1.0.0" source-map-js "^1.0.2" -prebuild-install@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870" - integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - npmlog "^4.0.1" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -prebuild-install@^7.1.1: +prebuild-install@^7.0.0, prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== @@ -19277,7 +15439,7 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -19297,14 +15459,9 @@ prettier@2.3.2: integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== prettier@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" - integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== - -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" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + version "2.8.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" + integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== pretty-bytes@^6.0.0: version "6.0.0" @@ -19346,20 +15503,19 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.0.0, pretty-format@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" + integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== + dependencies: + "@jest/schemas" "^29.0.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= - -prismjs@^1.27.0: - version "1.28.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" - integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== - -prismjs@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" @@ -19369,7 +15525,7 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== progress@^2.0.0: version "2.0.3" @@ -19379,7 +15535,7 @@ progress@^2.0.0: promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== promise-retry@^2.0.1: version "2.0.1" @@ -19390,34 +15546,27 @@ promise-retry@^2.0.1: retry "^0.12.0" promise.allsettled@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.5.tgz#2443f3d4b2aa8dfa560f6ac2aa6c4ea999d75f53" - integrity sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.6.tgz#8dc8ba8edf429feb60f8e81335b920e109c94b6e" + integrity sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg== dependencies: - array.prototype.map "^1.0.4" + array.prototype.map "^1.0.5" call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" iterate-value "^1.0.2" promise.prototype.finally@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz#d3186e58fcf4df1682a150f934ccc27b7893389c" - integrity sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ== + version "3.1.4" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.4.tgz#4e756a154e4db27fae24c6b18703495c31da3927" + integrity sha512-nNc3YbgMfLzqtqvO/q5DP6RR0SiHI9pUPGzyDf1q+usTwCN2kjvAnJkBb7bHe3o+fFSBPpsGMoYtaSi+LTNqng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -promise@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2: +prompts@^2.0.1, prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -19428,7 +15577,7 @@ prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2: promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== dependencies: read "1" @@ -19461,12 +15610,12 @@ property-information@^6.0.0: proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -protobufjs@^6.8.8: - version "6.11.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" - integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== +protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3: + version "6.11.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" + integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -19501,25 +15650,6 @@ protobufjs@~6.10.2: "@types/node" "^13.7.0" long "^4.0.0" -protobufjs@~6.11.2, protobufjs@~6.11.3: - version "6.11.3" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" - integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== - 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.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" @@ -19541,12 +15671,12 @@ proxy-addr@~2.0.7: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== public-encrypt@^4.0.0: version "4.0.3" @@ -19588,27 +15718,27 @@ pumpify@^1.3.3: punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -q@^1.1.2, q@^1.5.1: +q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== qr.js@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" - integrity sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8= + integrity sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ== qrcode.react@^1.0.1: version "1.0.1" @@ -19619,25 +15749,13 @@ qrcode.react@^1.0.1: prop-types "^15.6.0" qr.js "0.0.0" -qs@6.11.0, qs@^6.9.4: +qs@6.11.0, qs@^6.10.0, qs@^6.9.4: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - -qs@^6.10.0: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -19656,17 +15774,17 @@ query-string@^6.13.8: querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" @@ -19678,33 +15796,21 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -raf@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - rambda@^7.1.0: - version "7.1.4" - resolved "https://registry.yarnpkg.com/rambda/-/rambda-7.1.4.tgz#7faa9665a54c5d81773975532a942b3113bb4a56" - integrity sha512-bPK8sSiVHIC7CqdWga8R+hRi5hfc4hK6S01lZW4KrLwSNryQoKaCOJA9GNiF20J7Nbe1vejRfR37/ASQXFL5EA== - -ramda@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" - integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= + version "7.4.0" + resolved "https://registry.yarnpkg.com/rambda/-/rambda-7.4.0.tgz#61ec9de31d3dd6affe804de3bae04a5b818781e5" + integrity sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ== ramda@^0.26.1: version "0.26.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== +ramda@^0.28.0: + version "0.28.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97" + integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -19725,16 +15831,6 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== - dependencies: - bytes "3.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" @@ -19763,57 +15859,15 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-app-polyfill@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" - integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== - dependencies: - core-js "^3.19.2" - object-assign "^4.1.1" - promise "^8.1.0" - raf "^3.4.1" - regenerator-runtime "^0.13.9" - whatwg-fetch "^3.6.2" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - react-docgen-typescript@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c" integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== react-docgen@^5.0.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.4.0.tgz#2cd7236720ec2769252ef0421f23250b39a153a1" - integrity sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ== + version "5.4.3" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.4.3.tgz#7d297f73b977d0c7611402e5fc2a168acf332b26" + integrity sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA== dependencies: "@babel/core" "^7.7.5" "@babel/generator" "^7.12.11" @@ -19868,11 +15922,6 @@ react-error-boundary@^3.1.3, react-error-boundary@^3.1.4: dependencies: "@babel/runtime" "^7.12.5" -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - react-google-charts@^3.0.15: version "3.0.15" resolved "https://registry.yarnpkg.com/react-google-charts/-/react-google-charts-3.0.15.tgz#30759a470f48336e744fd383d054122b039a1ff2" @@ -19881,9 +15930,9 @@ react-google-charts@^3.0.15: react-load-script "^0.0.6" react-hook-form@^7.14.2: - version "7.27.1" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.27.1.tgz#fe5fbcb6bf58751f66d9569e998d671480cc57f6" - integrity sha512-N3a7A6zIQ8DJeThisVZGtOUabTbJw+7DHJidmB9w8m3chckv2ZWKb5MHps9d2pPJqmCDoWe53Bos56bYmJms5w== + version "7.42.1" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.42.1.tgz#c6396ca684716d89abc1c7e64343badfd30c56c6" + integrity sha512-2UIGqwMZksd5HS55crTT1ATLTr0rAI4jS7yVuqTaoRVDhY2Qc4IyjskCmpnmdYqUNOYFy04vW253tb2JRVh+IQ== react-identicons@^1.2.5: version "1.2.5" @@ -19899,7 +15948,7 @@ react-inspector@^5.1.0: is-dom "^1.0.0" prop-types "^15.0.0" -react-is@17.0.2, react-is@^17.0.1, react-is@^17.0.2: +react-is@17.0.2, react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -19909,7 +15958,7 @@ react-is@^16.10.2, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^18.0.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== @@ -19925,9 +15974,9 @@ react-load-script@^0.0.6: integrity sha512-aRGxDGP9VoLxcsaYvKWIW+LRrMOzz2eEcubTS4NvQPPugjk2VvMhow0wWTkSl7RxookomD1MwcP4l5UStg5ShQ== react-markdown@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.4.tgz#b5ff1f0f29ead71a7a6f98815eb1a70bcc2a036e" - integrity sha512-2oxHa6oDxc1apg/Gnc1Goh06t3B617xeywqI/92wmDV9FELI6ayRkwge7w7DoEqM0gRpZGTNU6xQG+YpJISnVg== + version "8.0.5" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.5.tgz#c9a70a33ca9aeeafb769c6582e7e38843b9d70ad" + integrity sha512-jGJolWWmOWAvzf+xMdB9zwStViODyyFQhNB/bwCerbBKmrTmgmA599CGiOlP58OId1IMoIRsA8UdI1Lod4zb5A== dependencies: "@types/hast" "^2.0.0" "@types/prop-types" "^15.0.0" @@ -19940,7 +15989,7 @@ react-markdown@^8.0.4: remark-parse "^10.0.0" remark-rehype "^10.0.0" space-separated-tokens "^2.0.0" - style-to-object "^0.3.0" + style-to-object "^0.4.0" unified "^10.0.0" unist-util-visit "^4.0.0" vfile "^5.0.0" @@ -19960,9 +16009,9 @@ react-mui-dropzone@^4.0.6: react-dropzone "^10.2.1" react-refresh-typescript@^2.0.2, react-refresh-typescript@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/react-refresh-typescript/-/react-refresh-typescript-2.0.3.tgz#73fd93befd2a0a0fd8041c39cc82b8c04aec00c3" - integrity sha512-CnR+UkpCFUIxW3u+KPxc6UhSO3M3aQxd9XCvgdry4a22LFwwITnjbANFUKtPGxA/Skw3PbZJrLiZ08UQnpXprQ== + version "2.0.7" + resolved "https://registry.yarnpkg.com/react-refresh-typescript/-/react-refresh-typescript-2.0.7.tgz#ba91be2da4f1e86bba8629f1df0d4b9ff87b9970" + integrity sha512-KbuW57FauO11e6a9gU836sCm3M3z0b2+J2qPhUudg0QplOfz0eAF3gMeshcUC/ChfNLJCK1SZxvYmUtRxiZE5A== react-refresh@^0.10.0: version "0.10.0" @@ -19982,118 +16031,47 @@ react-resize-detector@^7.1.2: lodash "^4.17.21" react-router-dom@6: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.3.0.tgz#a0216da813454e521905b5fa55e0e5176123f43d" - integrity sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw== + version "6.7.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.7.0.tgz#0249f4ca4eb704562b8b0ff29caeb928c3a6ed38" + integrity sha512-jQtXUJyhso3kFw430+0SPCbmCmY1/kJv8iRffGHwHy3CkoomGxeYzMkmeSPYo6Egzh3FKJZRAL22yg5p2tXtfg== dependencies: - history "^5.2.0" - react-router "6.3.0" + "@remix-run/router" "1.3.0" + react-router "6.7.0" react-router-dom@^5.2.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.3.tgz#8779fc28e6691d07afcaf98406d3812fe6f11199" - integrity sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng== + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.3.3" + react-router "5.3.4" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router-dom@^6.0.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.2.2.tgz#f1a2c88365593c76b9612ae80154a13fcb72e442" - integrity sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ== - dependencies: - history "^5.2.0" - react-router "6.2.2" - -react-router@5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.3.tgz#8e3841f4089e728cf82a429d92cdcaa5e4a3a288" - integrity sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w== +react-router@5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" - mini-create-react-context "^0.4.0" path-to-regexp "^1.7.0" prop-types "^15.6.2" react-is "^16.6.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@6.2.2, react-router@^6.0.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.2.2.tgz#495e683a0c04461eeb3d705fe445d6cf42f0c249" - integrity sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ== +react-router@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.7.0.tgz#db262684c13b5c2970694084ae9e8531718a0681" + integrity sha512-KNWlG622ddq29MAM159uUsNMdbX8USruoKnwMMQcs/QWZgFUayICSn2oB7reHce1zPj6CG18kfkZIunSSRyGHg== dependencies: - history "^5.2.0" - -react-router@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" - integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== - dependencies: - history "^5.2.0" - -react-scripts@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" - integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== - dependencies: - "@babel/core" "^7.16.0" - "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" - "@svgr/webpack" "^5.5.0" - babel-jest "^27.4.2" - babel-loader "^8.2.3" - babel-plugin-named-asset-import "^0.3.8" - babel-preset-react-app "^10.0.1" - bfj "^7.0.2" - browserslist "^4.18.1" - camelcase "^6.2.1" - case-sensitive-paths-webpack-plugin "^2.4.0" - css-loader "^6.5.1" - css-minimizer-webpack-plugin "^3.2.0" - dotenv "^10.0.0" - dotenv-expand "^5.1.0" - eslint "^8.3.0" - eslint-config-react-app "^7.0.1" - eslint-webpack-plugin "^3.1.1" - file-loader "^6.2.0" - fs-extra "^10.0.0" - html-webpack-plugin "^5.5.0" - identity-obj-proxy "^3.0.0" - jest "^27.4.3" - jest-resolve "^27.4.2" - jest-watch-typeahead "^1.0.0" - mini-css-extract-plugin "^2.4.5" - postcss "^8.4.4" - postcss-flexbugs-fixes "^5.0.2" - postcss-loader "^6.2.1" - postcss-normalize "^10.0.1" - postcss-preset-env "^7.0.1" - prompts "^2.4.2" - react-app-polyfill "^3.0.0" - react-dev-utils "^12.0.1" - react-refresh "^0.11.0" - resolve "^1.20.0" - resolve-url-loader "^4.0.0" - sass-loader "^12.3.0" - semver "^7.3.5" - source-map-loader "^3.0.0" - style-loader "^3.3.1" - tailwindcss "^3.0.2" - terser-webpack-plugin "^5.2.5" - webpack "^5.64.4" - webpack-dev-server "^4.6.0" - webpack-manifest-plugin "^4.0.2" - workbox-webpack-plugin "^6.4.1" - optionalDependencies: - fsevents "^2.3.2" + "@remix-run/router" "1.3.0" react-simple-maps@^2.3.0: version "2.3.0" @@ -20113,23 +16091,20 @@ react-smooth@^2.0.1: fast-equals "^2.0.0" react-transition-group "2.9.0" -react-syntax-highlighter@^15.4.5: - version "15.5.0" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" - integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== +react-tooltip@*: + version "5.6.0" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.6.0.tgz#3835fbf20fd09937a7ff7cb3c1b1e97497a306aa" + integrity sha512-/9CDi6l8qO/Pye4WkkwGxrDbhlxag0agjayxIy/R/PNER9QSclofHWnil6DmgZoJNKf2yEDMe1QGUmpY+tmxXg== dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "^10.4.1" - lowlight "^1.17.0" - prismjs "^1.27.0" - refractor "^3.6.0" + "@floating-ui/dom" "^1.0.4" + classnames "^2.3.2" -react-tooltip@*, react-tooltip@^4.2.21: - version "4.2.21" - resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.2.21.tgz#840123ed86cf33d50ddde8ec8813b2960bfded7f" - integrity sha512-zSLprMymBDowknr0KVDiJ05IjZn9mQhhg4PRsqln0OZtURAJ1snt1xi5daZfagsh6vfsziZrc9pErPTDY1ACig== +react-tooltip@^4.2.21: + version "4.5.1" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.5.1.tgz#77eccccdf16adec804132e558ec20ca5783b866a" + integrity sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw== dependencies: - prop-types "^15.7.2" + prop-types "^15.8.1" uuid "^7.0.3" react-transition-group@2.9.0: @@ -20142,10 +16117,10 @@ react-transition-group@2.9.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-transition-group@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" @@ -20159,13 +16134,6 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - read-cmd-shim@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" @@ -20200,9 +16168,9 @@ read-package-json@^3.0.0: npm-normalize-package-bin "^1.0.0" read-package-json@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.1.tgz#153be72fce801578c1c86b8ef2b21188df1b9eea" - integrity sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw== + version "4.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.2.tgz#b444d047de7c75d4a160cb056d00c0693c1df703" + integrity sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ== dependencies: glob "^7.1.1" json-parse-even-better-errors "^2.3.0" @@ -20229,7 +16197,7 @@ read-pkg-up@^1.0.1: read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -20255,7 +16223,7 @@ read-pkg@^1.0.0: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -20274,7 +16242,7 @@ read-pkg@^5.2.0: read@1, read@~1.0.1: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== dependencies: mute-stream "~0.0.4" @@ -20339,14 +16307,11 @@ recharts-scale@^0.4.4: decimal.js-light "^2.4.1" recharts@^2.1.13: - version "2.1.13" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.1.13.tgz#61801acf3e13896b07dc6a8b38cbdd648480d0b7" - integrity sha512-9VWu2nzExmfiMFDHKqRFhYlJVmjzQGVKH5rBetXR4EuyEXuu3Y6cVxQuNEdusHhbm4SoPPrVDCwlBdREL3sQPA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.3.2.tgz#6e9498533dd93314e1d7f08e6496fc422e2e991f" + integrity sha512-2II30fGzKaypHfHNQNUhCfiLMxrOS/gF0WFahDIEFgXtJkVEe2DpZWFfEfAn+RU3B7/h2V/B05Bwmqq3rTXwLw== dependencies: classnames "^2.2.5" - d3-interpolate "^3.0.1" - d3-scale "^4.0.2" - d3-shape "^3.1.0" eventemitter3 "^4.0.1" lodash "^4.17.19" react-is "^16.10.2" @@ -20354,6 +16319,7 @@ recharts@^2.1.13: react-smooth "^2.0.1" recharts-scale "^0.4.4" reduce-css-calc "^2.1.8" + victory-vendor "^36.6.8" rechoir@^0.7.0: version "0.7.1" @@ -20362,13 +16328,6 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -20393,22 +16352,6 @@ reduce-css-calc@^2.1.8: css-unit-converter "^1.1.1" postcss-value-parser "^3.3.0" -refractor@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== - dependencies: - regenerate "^1.4.2" - 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" @@ -20421,28 +16364,11 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.7: 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.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -20458,19 +16384,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regex-parser@^2.2.11: - version "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.2.0, regexp.prototype.flags@^1.3.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -20485,18 +16398,6 @@ regexpp@^3.1.0, regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - regexpu-core@^5.2.1: version "5.2.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" @@ -20509,23 +16410,11 @@ regexpu-core@^5.2.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== - regjsgen@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== - dependencies: - jsesc "~0.5.0" - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -20536,7 +16425,7 @@ regjsparser@^0.9.1: relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== remark-external-links@^8.0.0: version "8.0.0" @@ -20569,9 +16458,9 @@ remark-mdx@1.6.22: unified "9.2.0" remark-mdx@^2.0.0: - version "2.1.5" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.1.5.tgz#69b19ec42d30a289e0663c3fc7656ebdca0a8d8e" - integrity sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.2.1.tgz#0d006436acf039b526c3b6b47ea4a44b3d544db7" + integrity sha512-R9wcN+/THRXTKyRBp6Npo/mcbGA2iT3N4G8qUqLA5pOEg7kBidHv8K2hHidCMYZ6DXmwK18umu0K4cicgA2PPQ== dependencies: mdast-util-mdx "^2.0.0" micromark-extension-mdxjs "^1.0.0" @@ -20636,7 +16525,7 @@ remark-squeeze-paragraphs@4.0.0: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== renderkid@^2.0.4: version "2.0.7" @@ -20668,7 +16557,7 @@ repeat-element@^1.1.2: repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== repeating@^2.0.0: version "2.0.1" @@ -20711,7 +16600,7 @@ request@^2.88.0, request@^2.88.2: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -20726,12 +16615,12 @@ requireindex@^1.1.0: requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6" - integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ== +reselect@^4.1.6: + version "4.1.7" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42" + integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== resolve-cwd@^3.0.0: version "3.0.0" @@ -20755,28 +16644,17 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve-url-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" - integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== - dependencies: - adjust-sourcemap-loader "^4.0.0" - convert-source-map "^1.7.0" - loader-utils "^2.0.0" - postcss "^7.0.35" - source-map "0.6.1" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.1.7, resolve@^1.22.0, resolve@^1.22.1: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.3.2, resolve@^1.9.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -20785,23 +16663,15 @@ resolve@^1.1.7, resolve@^1.22.0, resolve@^1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +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== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -20818,7 +16688,7 @@ ret@~0.1.10: retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== retry@^0.13.1: version "0.13.1" @@ -20835,12 +16705,7 @@ rgb-hex@^3.0.0: resolved "https://registry.yarnpkg.com/rgb-hex/-/rgb-hex-3.0.0.tgz#eab0168cc1279563b18a14605315389142e2e487" integrity sha512-8h7ZcwxCBDKvchSWbWngJuSCqJGQ6nDuLLg+QcRyQDbX9jMWt+PpPeXAhSla0GOooEomk3lCprUpGkMdsLjKyg== -rifm@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.12.1.tgz#8fa77f45b7f1cda2a0068787ac821f0593967ac4" - integrity sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg== - -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -20869,32 +16734,15 @@ rollup-plugin-base64@^1.0.1: dependencies: "@rollup/pluginutils" "^3.1.0" -rollup-plugin-terser@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" - integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== - dependencies: - "@babel/code-frame" "^7.10.4" - jest-worker "^26.2.1" - serialize-javascript "^4.0.0" - terser "^5.0.0" - rollup-plugin-web-worker-loader@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/rollup-plugin-web-worker-loader/-/rollup-plugin-web-worker-loader-1.6.1.tgz#9d7a27575b64b0780fe4e8b3bc87470d217e485f" integrity sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A== -rollup@^2.43.1: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - rollup@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.9.1.tgz#27501d3d026418765fe379d5620d25954ff2a011" - integrity sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w== + version "3.10.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.10.1.tgz#56278901ed11fc2898421e8e3e2c8155bc7b40b4" + integrity sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw== optionalDependencies: fsevents "~2.3.2" @@ -20918,7 +16766,7 @@ run-parallel@^1.1.9: run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== dependencies: aproba "^1.1.1" @@ -20963,7 +16811,7 @@ safe-regex-test@^1.0.0: safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" @@ -20987,20 +16835,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sanitize.css@*: - version "13.0.0" - resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" - integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== - -sass-loader@^12.3.0: - version "12.6.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - -sax@>=0.6.0, sax@~1.2.4: +sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -21028,16 +16863,6 @@ schema-utils@2.7.0: ajv "^6.12.2" ajv-keywords "^3.4.1" -schema-utils@4.0.0, schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -21065,17 +16890,20 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.0.tgz#e927cd5377cbb0a1075302cff8df1042cc2bce5b" - integrity sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ== - dependencies: - node-forge "^1.2.0" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: version "2.1.1" @@ -21089,15 +16917,10 @@ selfsigned@^2.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" @@ -21106,39 +16929,6 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "1.8.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -21158,7 +16948,7 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: +serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== @@ -21179,10 +16969,17 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + serve-favicon@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" - integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= + integrity sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA== dependencies: etag "~1.8.1" fresh "0.5.2" @@ -21193,7 +16990,7 @@ serve-favicon@^2.5.0: serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" batch "0.6.1" @@ -21203,16 +17000,6 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.2" - serve-static@1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" @@ -21226,7 +17013,7 @@ serve-static@1.15.0: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -21241,7 +17028,7 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" @@ -21283,9 +17070,9 @@ sharp@^0.29.1: tunnel-agent "^0.6.0" sharp@^0.31.1: - version "0.31.2" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.31.2.tgz#a8411c80512027f5a452b76d599268760c4e5dfa" - integrity sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q== + version "0.31.3" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.31.3.tgz#60227edc5c2be90e7378a210466c99aefcf32688" + integrity sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg== dependencies: color "^4.2.3" detect-libc "^2.0.1" @@ -21299,7 +17086,7 @@ sharp@^0.31.1: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -21313,7 +17100,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -21321,11 +17108,6 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== - -shell-quote@^1.7.3: version "1.7.4" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== @@ -21370,7 +17152,7 @@ simple-get@^4.0.0, simple-get@^4.0.1: simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" @@ -21382,7 +17164,7 @@ sisteransi@^1.0.5: slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== slash@^2.0.0: version "2.0.0" @@ -21394,11 +17176,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -21411,7 +17188,7 @@ slice-ansi@^4.0.0: slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== smart-buffer@^4.2.0: version "4.2.0" @@ -21453,7 +17230,7 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs@^0.3.21, sockjs@^0.3.24: +sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== @@ -21472,26 +17249,26 @@ socks-proxy-agent@^5.0.0: socks "^2.3.3" socks-proxy-agent@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87" - integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew== + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== dependencies: agent-base "^6.0.2" - debug "^4.3.1" - socks "^2.6.1" + debug "^4.3.3" + socks "^2.6.2" -socks@^2.3.3, socks@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" - integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== +socks@^2.3.3, socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: - ip "^1.1.5" + ip "^2.0.0" smart-buffer "^4.2.0" sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" @@ -21502,25 +17279,16 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -source-list-map@^2.0.0, source-list-map@^2.0.1: +source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.1, source-map-js@^1.0.2: +source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-loader@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" - integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== - dependencies: - abab "^2.0.5" - iconv-lite "^0.6.3" - source-map-js "^1.0.1" - source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -21532,14 +17300,6 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -21553,38 +17313,21 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.7.0: +source-map@^0.7.0, source-map@^0.7.3: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -source-map@^0.7.3, source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -source-map@^0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" @@ -21617,9 +17360,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.12" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== spdy-transport@^3.0.0: version "3.0.0" @@ -21673,7 +17416,7 @@ split@^1.0.0: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.17.0" @@ -21710,16 +17453,16 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" -stackframe@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.1.tgz#1033a3473ee67f08e2f2fc8eba6aef4f845124e1" - integrity sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg== +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== state-toggle@^1.0.0: version "1.0.3" @@ -21729,7 +17472,7 @@ state-toggle@^1.0.0: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -21739,15 +17482,22 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + 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" store2@^2.12.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/store2/-/store2-2.13.1.tgz#fae7b5bb9d35fc53dc61cd262df3abb2f6e59022" - integrity sha512-iJtHSGmNgAUx0b/MCS6ASGxb//hGrHHRgzvN+K5bvkBTN7A9RTpPSf1WSp+nPGvWCJ1jRnvY7MKnuqfoi3OEqg== + version "2.14.2" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068" + integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== stream-browserify@^2.0.1: version "2.0.2" @@ -21794,19 +17544,6 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-length@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" - integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== - dependencies: - char-regex "^2.0.0" - strip-ansi "^7.0.1" - -string-natural-compare@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" - integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== - string-to-color@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/string-to-color/-/string-to-color-2.2.2.tgz#46210bf7777dc9198dcdf997bd18ae6749cc9a73" @@ -21822,7 +17559,7 @@ string-to-color@^2.2.2: string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -21837,21 +17574,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" - integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - -string.prototype.matchall@^4.0.8: +"string.prototype.matchall@^4.0.0 || ^3.0.1", 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== @@ -21866,30 +17589,22 @@ string.prototype.matchall@^4.0.8: side-channel "^1.0.4" string.prototype.padend@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" - integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + version "3.1.4" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" + integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" string.prototype.padstart@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.3.tgz#4551d0117d9501692ec6000b15056ac3f816cfa5" - integrity sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA== + version "3.1.4" + resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.4.tgz#4842d58a09df2addac23cf0b325ce9f087978e90" + integrity sha512-XqOHj8horGsF+zwxraBvMTkBFM28sS/jHBJajh17JtJKA92qazidiQbLosV4UA18azvLOVKYo/E3g3T9Y5826w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.20.4" string.prototype.trimend@^1.0.6: version "1.0.6" @@ -21900,14 +17615,6 @@ string.prototype.trimend@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - 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" @@ -21939,19 +17646,10 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" @@ -21962,13 +17660,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.0, strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -21979,22 +17670,17 @@ strip-bom@^2.0.0: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" - integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" @@ -22023,7 +17709,7 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== strong-log-transformer@^2.1.0: version "2.1.0" @@ -22062,18 +17748,25 @@ style-to-object@0.3.0, style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -stylehacks@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" - integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== +style-to-object@^0.4.0, 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== dependencies: - browserslist "^4.16.6" + inline-style-parser "0.1.1" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" postcss-selector-parser "^6.0.4" -stylis@4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91" - integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== supports-color@8.1.1, supports-color@^8.0.0: version "8.1.1" @@ -22097,9 +17790,9 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -22109,31 +17802,12 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-parser@^2.0.2: +svg-parser@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -svgo@^2.5.0, svgo@^2.7.0: +svgo@^2.7.0, svgo@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== @@ -22167,14 +17841,14 @@ symbol.prototype.description@^1.0.0: object.getownpropertydescriptors "^2.1.2" synchronous-promise@^2.0.15: - version "2.0.15" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e" - integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== + version "2.0.17" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.17.tgz#38901319632f946c982152586f2caf8ddc25c032" + integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -22182,35 +17856,6 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tailwindcss@^3.0.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" - integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== - dependencies: - arg "^5.0.2" - chokidar "^3.5.3" - color-name "^1.1.4" - detective "^5.2.1" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - lilconfig "^2.0.6" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.18" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" - postcss-selector-parser "^6.0.10" - postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" - tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -22256,31 +17901,17 @@ tar@^4.4.12: yallist "^3.1.1" tar@^6.0.2, tar@^6.1.0: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + version "6.1.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^4.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" -telejson@^5.3.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.3.3.tgz#fa8ca84543e336576d8734123876a9f02bf41d2e" - integrity sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA== - dependencies: - "@types/is-function" "^1.0.0" - global "^4.4.0" - is-function "^1.0.2" - is-regex "^1.1.2" - is-symbol "^1.0.3" - isobject "^4.0.0" - lodash "^4.17.21" - memoizerific "^1.11.3" - telejson@^6.0.8: version "6.0.8" resolved "https://registry.yarnpkg.com/telejson/-/telejson-6.0.8.tgz#1c432db7e7a9212c1fbd941c3e5174ec385148f7" @@ -22298,12 +17929,7 @@ telejson@^6.0.8: temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== temp-write@^4.0.0: version "4.0.0" @@ -22316,16 +17942,6 @@ temp-write@^4.0.0: temp-dir "^1.0.0" uuid "^3.3.2" -tempy@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" - integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== - dependencies: - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -22365,17 +17981,6 @@ terser-webpack-plugin@^4.2.3: webpack-sources "^1.4.3" terser-webpack-plugin@^5.0.3, terser-webpack-plugin@^5.1.3: - version "5.3.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" - integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== - dependencies: - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" - -terser-webpack-plugin@^5.2.5: version "5.3.6" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== @@ -22395,7 +18000,7 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.0.0, terser@^5.14.1, terser@^5.15.1: +terser@^5.10.0, terser@^5.14.1, terser@^5.15.1, terser@^5.3.4: version "5.16.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== @@ -22405,16 +18010,6 @@ terser@^5.0.0, terser@^5.14.1, terser@^5.15.1: commander "^2.20.0" source-map-support "~0.5.20" -terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: - version "5.12.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.0.tgz#728c6bff05f7d1dcb687d8eace0644802a9dae8a" - integrity sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A== - dependencies: - acorn "^8.5.0" - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -22432,7 +18027,7 @@ text-extensions@^1.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thread-loader@^3.0.4: version "3.0.4" @@ -22446,9 +18041,9 @@ thread-loader@^3.0.4: schema-utils "^3.0.0" throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== through2@^2.0.0: version "2.0.5" @@ -22468,7 +18063,7 @@ through2@^4.0.0, through2@^4.0.2: through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== thunky@^1.0.2: version "1.1.0" @@ -22482,17 +18077,12 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - tiny-invariant@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== -tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: +tiny-warning@^1.0.0, tiny-warning@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -22512,24 +18102,24 @@ tmpl@1.0.5: to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -22566,16 +18156,17 @@ topojson-client@^3.1.0: toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tough-cookie@~2.5.0: version "2.5.0" @@ -22585,13 +18176,6 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== - dependencies: - punycode "^2.1.0" - tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -22602,7 +18186,7 @@ tr46@^2.1.0: tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-lines@^3.0.0: version "3.0.1" @@ -22612,7 +18196,7 @@ trim-lines@^3.0.0: trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw== trim-newlines@^3.0.0: version "3.0.1" @@ -22627,7 +18211,7 @@ trim-trailing-lines@^1.0.0: trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== trough@^1.0.0: version "1.0.5" @@ -22639,20 +18223,15 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== -tryer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== - ts-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== ts-jest@^27.0.5: - version "27.1.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.3.tgz#1f723e7e74027c4da92c0ffbd73287e8af2b2957" - integrity sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA== + version "27.1.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" + integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" @@ -22696,25 +18275,6 @@ ts-node@7.0.1: source-map-support "^0.5.6" yn "^2.0.0" -ts-node@^10.7.0: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - 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" - ts-pnp@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" @@ -22729,17 +18289,7 @@ tsconfig-paths-webpack-plugin@^3.5.2: enhanced-resolve "^5.7.0" tsconfig-paths "^3.9.0" -tsconfig-paths@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" - integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: +tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0, tsconfig-paths@^3.9.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== @@ -22749,27 +18299,12 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^3.9.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz#f3e9b8f6876698581d94470c03c95b3a48c0e3d7" - integrity sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" 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: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tslib@^2.4.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== @@ -22784,12 +18319,12 @@ tsutils@^3.21.0: tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" @@ -22801,7 +18336,7 @@ tweetnacl-util@^0.15.0: tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== tweetnacl@^1.0.1: version "1.0.3" @@ -22818,7 +18353,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -22827,11 +18362,6 @@ type-detect@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== -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -22889,7 +18419,7 @@ typedarray-to-buffer@^3.1.5: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typedoc@^0.22.13: version "0.22.18" @@ -22902,40 +18432,25 @@ typedoc@^0.22.13: minimatch "^5.1.0" shiki "^0.10.1" -typescript@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" - integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== - -typescript@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@^4.6.2, typescript@^4.8.4: + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== uglify-js@^3.1.4: - version "3.15.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.2.tgz#1ed2c976f448063b1f87adb68c741be79959f951" - integrity sha512-peeoTk3hSwYdoc9nrdiEJk+gx1ALCtTjdYuKSXMTDqq7n1W7dHPqWDdSi+BPL0ni2YMeHD7hKUSdbj3TZauY2A== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== uid-number@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= + integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" + integrity sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA== unbox-primitive@^1.0.2: version "1.0.2" @@ -22973,20 +18488,15 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unified@9.2.0: version "9.2.0" @@ -23037,22 +18547,15 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - unist-builder@2.0.3, unist-builder@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== unist-builder@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04" - integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.1.tgz#258b89dcadd3c973656b2327b347863556907f58" + integrity sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ== dependencies: "@types/unist" "^2.0.0" @@ -23062,9 +18565,9 @@ unist-util-generated@^1.0.0: integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== unist-util-generated@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113" - integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== unist-util-is@^4.0.0: version "4.1.0" @@ -23072,14 +18575,14 @@ unist-util-is@^4.0.0: integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== unist-util-is@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" - integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.0.tgz#37eed0617b76c114fd34d44c201aa96fd928b309" + integrity sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ== unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz#96f4d543dfb0428edc01ebb928570b602d280c4c" - integrity sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" + integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== dependencies: "@types/unist" "^2.0.0" @@ -23089,9 +18592,9 @@ unist-util-position@^3.0.0: integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== unist-util-position@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07" - integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ== + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" @@ -23103,9 +18606,9 @@ unist-util-remove-position@^2.0.0: unist-util-visit "^2.0.0" unist-util-remove-position@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz#d5b46a7304ac114c8d91990ece085ca7c2c135c8" - integrity sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ== + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" + integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== dependencies: "@types/unist" "^2.0.0" unist-util-visit "^4.0.0" @@ -23125,9 +18628,9 @@ unist-util-stringify-position@^2.0.0: "@types/unist" "^2.0.2" unist-util-stringify-position@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz#5c6aa07c90b1deffd9153be170dce628a869a447" - integrity sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" @@ -23170,10 +18673,10 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" @@ -23183,17 +18686,12 @@ universalify@^2.0.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -23201,11 +18699,11 @@ unset-value@^1.0.0: untildify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" - integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= + integrity sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig== dependencies: os-homedir "^1.0.0" -upath@^1.1.1, upath@^1.2.0: +upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== @@ -23233,7 +18731,7 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== url-loader@^4.1.1: version "4.1.1" @@ -23244,10 +18742,18 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== dependencies: punycode "1.3.2" querystring "0.2.0" @@ -23267,12 +18773,12 @@ use@^3.1.0: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util-promisify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" - integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + integrity sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA== dependencies: object.getownpropertydescriptors "^2.0.3" @@ -23284,20 +18790,10 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - 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 sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== dependencies: inherits "2.0.1" @@ -23311,17 +18807,17 @@ util@^0.11.0: utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid-browser@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" - integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= + integrity sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg== uuid@^3.3.2: version "3.4.0" @@ -23348,17 +18844,12 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^8.0.0, v8-to-istanbul@^8.1.0: +v8-to-istanbul@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== @@ -23367,6 +18858,15 @@ v8-to-istanbul@^8.0.0, v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +v8-to-istanbul@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -23378,7 +18878,7 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" @@ -23390,12 +18890,12 @@ value-equal@^1.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -23450,6 +18950,26 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +victory-vendor@^36.6.8: + version "36.6.8" + resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.6.8.tgz#5a1c555ca99a39fdb66a6c959c8426eb834893a2" + integrity sha512-H3kyQ+2zgjMPvbPqAl7Vwm2FD5dU7/4bCTQakFQnpIsfDljeOMDojRsrmJfwh4oAlNnWhpAf+mbAoLh8u7dwyQ== + dependencies: + "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" + "@types/d3-timer" "^3.0.0" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" + vinyl@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" @@ -23468,9 +18988,9 @@ vm-browserify@^1.0.1: integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vscode-oniguruma@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607" - integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@5.2.0: version "5.2.0" @@ -23516,15 +19036,7 @@ watchpack@^1.7.4: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" -watchpack@^2.2.0, watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -watchpack@^2.4.0: +watchpack@^2.2.0, watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -23542,7 +19054,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: wcwidth@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" @@ -23551,20 +19063,10 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== -web-vitals@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" - integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^5.0.0: version "5.0.0" @@ -23577,17 +19079,17 @@ webidl-conversions@^6.1.0: integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-cli@^4.8.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" - integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== dependencies: "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.1.1" - "@webpack-cli/info" "^1.4.1" - "@webpack-cli/serve" "^1.6.1" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" colorette "^2.0.14" commander "^7.0.0" - execa "^5.0.0" + cross-spawn "^7.0.3" fastest-levenshtein "^1.0.12" import-local "^3.0.2" interpret "^2.2.0" @@ -23618,53 +19120,17 @@ webpack-dev-middleware@^4.1.0: schema-utils "^3.0.0" webpack-dev-middleware@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" - integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== dependencies: colorette "^2.0.10" - memfs "^3.4.1" + memfs "^3.4.3" mime-types "^2.1.31" range-parser "^1.2.1" schema-utils "^4.0.0" webpack-dev-server@^4.5.0: - version "4.7.4" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz#d0ef7da78224578384e795ac228d8efb63d5f945" - integrity sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.2.2" - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - default-gateway "^6.0.3" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^4.0.0" - selfsigned "^2.0.0" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - webpack-dev-middleware "^5.3.1" - ws "^8.4.2" - -webpack-dev-server@^4.6.0: version "4.11.1" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== @@ -23712,13 +19178,12 @@ webpack-filter-warnings-plugin@^1.2.1: integrity sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg== webpack-hot-middleware@^2.25.1: - version "2.25.1" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz#581f59edf0781743f4ca4c200fd32c9266c6cf7c" - integrity sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw== + version "2.25.3" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz#be343ce2848022cfd854dd82820cd730998c6794" + integrity sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA== dependencies: ansi-html-community "0.0.8" html-entities "^2.1.0" - querystring "^0.2.0" strip-ansi "^6.0.0" webpack-log@^2.0.0: @@ -23729,14 +19194,6 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-manifest-plugin@^4.0.2: - version "4.1.1" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" - integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== - dependencies: - tapable "^2.0.0" - webpack-sources "^2.2.0" - webpack-merge@^5.7.3, webpack-merge@^5.8.0: version "5.8.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" @@ -23753,14 +19210,6 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" - integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== - dependencies: - source-list-map "^2.0.1" - source-map "^0.6.1" - webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" @@ -23774,9 +19223,9 @@ webpack-virtual-modules@^0.2.2: debug "^3.0.0" webpack-virtual-modules@^0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.3.tgz#cd597c6d51d5a5ecb473eea1983a58fa8a17ded9" - integrity sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw== + version "0.4.6" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" + integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== webpack@4: version "4.46.0" @@ -23807,37 +19256,7 @@ webpack@4: watchpack "^1.7.4" webpack-sources "^1.4.1" -"webpack@>=4.43.0 <6.0.0": - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - -webpack@^5.64.4, webpack@^5.75.0: +"webpack@>=4.43.0 <6.0.0", webpack@^5.75.0, webpack@^5.9.0: version "5.75.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== @@ -23867,36 +19286,6 @@ webpack@^5.64.4, webpack@^5.75.0: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@^5.9.0: - version "5.70.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.70.0.tgz#3461e6287a72b5e6e2f4872700bc8de0d7500e6d" - integrity sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.2" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" @@ -23918,11 +19307,6 @@ whatwg-encoding@^1.0.5: dependencies: 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== - whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" @@ -23931,20 +19315,11 @@ whatwg-mimetype@^2.3.0: whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-url@^8.0.0, whatwg-url@^8.4.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" @@ -23965,6 +19340,16 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +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-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" @@ -24018,176 +19403,7 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -workbox-background-sync@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" - integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== - dependencies: - idb "^7.0.1" - workbox-core "6.5.4" - -workbox-broadcast-update@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" - integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== - dependencies: - workbox-core "6.5.4" - -workbox-build@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" - integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== - dependencies: - "@apideck/better-ajv-errors" "^0.3.1" - "@babel/core" "^7.11.1" - "@babel/preset-env" "^7.11.0" - "@babel/runtime" "^7.11.2" - "@rollup/plugin-babel" "^5.2.0" - "@rollup/plugin-node-resolve" "^11.2.1" - "@rollup/plugin-replace" "^2.4.1" - "@surma/rollup-plugin-off-main-thread" "^2.2.3" - ajv "^8.6.0" - common-tags "^1.8.0" - fast-json-stable-stringify "^2.1.0" - fs-extra "^9.0.1" - glob "^7.1.6" - lodash "^4.17.20" - pretty-bytes "^5.3.0" - rollup "^2.43.1" - rollup-plugin-terser "^7.0.0" - source-map "^0.8.0-beta.0" - stringify-object "^3.3.0" - strip-comments "^2.0.1" - tempy "^0.6.0" - upath "^1.2.0" - workbox-background-sync "6.5.4" - workbox-broadcast-update "6.5.4" - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-google-analytics "6.5.4" - workbox-navigation-preload "6.5.4" - workbox-precaching "6.5.4" - workbox-range-requests "6.5.4" - workbox-recipes "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - workbox-streams "6.5.4" - workbox-sw "6.5.4" - workbox-window "6.5.4" - -workbox-cacheable-response@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" - integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== - dependencies: - workbox-core "6.5.4" - -workbox-core@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" - integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== - -workbox-expiration@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" - integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== - dependencies: - idb "^7.0.1" - workbox-core "6.5.4" - -workbox-google-analytics@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" - integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== - dependencies: - workbox-background-sync "6.5.4" - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - -workbox-navigation-preload@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" - integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== - dependencies: - workbox-core "6.5.4" - -workbox-precaching@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" - integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== - dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - -workbox-range-requests@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" - integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== - dependencies: - workbox-core "6.5.4" - -workbox-recipes@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" - integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== - dependencies: - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-precaching "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - -workbox-routing@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" - integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== - dependencies: - workbox-core "6.5.4" - -workbox-strategies@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" - integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== - dependencies: - workbox-core "6.5.4" - -workbox-streams@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" - integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== - dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" - -workbox-sw@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" - integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== - -workbox-webpack-plugin@^6.4.1: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" - integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== - dependencies: - fast-json-stable-stringify "^2.1.0" - pretty-bytes "^5.4.1" - upath "^1.2.0" - webpack-sources "^1.4.3" - workbox-build "6.5.4" - -workbox-window@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" - integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== - dependencies: - "@types/trusted-types" "^2.0.2" - workbox-core "6.5.4" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== worker-farm@^1.7.0: version "1.7.0" @@ -24220,7 +19436,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^2.4.2: version "2.4.3" @@ -24275,19 +19491,19 @@ write-pkg@^4.0.0: write-json-file "^3.2.0" ws@^7, ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.2.3, ws@^8.4.2: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== x-default-browser@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/x-default-browser/-/x-default-browser-0.4.0.tgz#70cf0da85da7c0ab5cb0f15a897f2322a6bdd481" - integrity sha1-cM8NqF2nwKtcsPFaiX8jIqa91IE= + integrity sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw== optionalDependencies: default-browser-id "^1.0.4" @@ -24322,7 +19538,7 @@ xstream@^11.14.0: globalthis "^1.0.1" symbol-observable "^2.0.3" -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -24362,16 +19578,16 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" - integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.7: +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== @@ -24399,11 +19615,6 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" From 95080c3ecc18b6adf6b8ddc6842952f1bfe64aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 24 Jan 2023 11:04:30 +0100 Subject: [PATCH 230/591] nym-connect: add connection health test (#2883) * nym-connect: add connect health test * nym-connect: redo connection test * nym-connect: strongly typed response * Fix clippy * nym-connect: also send event on connection check success * nym-connect: tidy --- nym-connect/src-tauri/src/error.rs | 34 ++-- nym-connect/src-tauri/src/main.rs | 1 + .../src/operations/connection/connect.rs | 5 +- .../src/operations/connection/disconnect.rs | 1 + .../src/operations/connection/status.rs | 27 ++++ .../src/operations/growth/api_client.rs | 1 + nym-connect/src-tauri/src/operations/http.rs | 37 +++++ nym-connect/src-tauri/src/operations/mod.rs | 1 + nym-connect/src-tauri/src/state.rs | 12 +- nym-connect/src-tauri/src/tasks.rs | 146 +++++++++++++----- 10 files changed, 207 insertions(+), 58 deletions(-) create mode 100644 nym-connect/src-tauri/src/operations/http.rs diff --git a/nym-connect/src-tauri/src/error.rs b/nym-connect/src-tauri/src/error.rs index 53b8c9df44..50a672f8ac 100644 --- a/nym-connect/src-tauri/src/error.rs +++ b/nym-connect/src-tauri/src/error.rs @@ -15,12 +15,12 @@ pub enum BackendError { #[from] source: std::io::Error, }, - #[error("String formatting error: {source}")] + #[error("string formatting error: {source}")] FmtError { #[from] source: std::fmt::Error, }, - #[error("Tauri error: {source}")] + #[error("tauri error: {source}")] TauriError { #[from] source: tauri::Error, @@ -46,30 +46,36 @@ pub enum BackendError { source: crate::operations::growth::api_client::ApiClientError, }, - #[error("Could not send disconnect signal to the SOCKS5 client")] + #[error("could not send disconnect signal to the SOCKS5 client")] CoundNotSendDisconnectSignal, - #[error("No service provider set")] + #[error("no service provider set")] NoServiceProviderSet, - #[error("No gateway provider set")] + #[error("no gateway provider set")] NoGatewaySet, - #[error("Initialization failed with a panic")] + #[error("initialization failed with a panic")] InitializationPanic, - #[error("Could not get config id before gateway is set")] + #[error("could not get config id before gateway is set")] CouldNotGetIdWithoutGateway, - #[error("Could initialize without gateway set")] + #[error("could initialize without gateway set")] CouldNotInitWithoutGateway, - #[error("Could initialize without service provider set")] + #[error("could initialize without service provider set")] CouldNotInitWithoutServiceProvider, - #[error("Could not get file name")] + #[error("could not get file name")] CouldNotGetFilename, - #[error("Could not get config file location")] + #[error("could not get config file location")] CouldNotGetConfigFilename, - #[error("Could not load existing gateway configuration")] + #[error("could not load existing gateway configuration")] CouldNotLoadExistingGatewayConfiguration(std::io::Error), - #[error("Unable to open a new window")] + #[error("unable to open a new window")] NewWindowError, - #[error("Unable to parse the specified gateway")] + #[error("unable to parse the specified gateway")] UnableToParseGateway, + + #[error("HTTP get request failed: {status_code}")] + RequestFail { + url: reqwest::Url, + status_code: reqwest::StatusCode, + }, } impl Serialize for BackendError { diff --git a/nym-connect/src-tauri/src/main.rs b/nym-connect/src-tauri/src/main.rs index 608eca4130..9eccb6151b 100644 --- a/nym-connect/src-tauri/src/main.rs +++ b/nym-connect/src-tauri/src/main.rs @@ -41,6 +41,7 @@ fn main() { crate::config::get_config_file_location, crate::config::get_config_id, crate::operations::connection::status::get_connection_status, + crate::operations::connection::status::run_health_check, crate::operations::connection::connect::get_gateway, crate::operations::connection::connect::get_service_provider, crate::operations::connection::connect::set_gateway, diff --git a/nym-connect/src-tauri/src/operations/connection/connect.rs b/nym-connect/src-tauri/src/operations/connection/connect.rs index 6170fec0b4..1d83748698 100644 --- a/nym-connect/src-tauri/src/operations/connection/connect.rs +++ b/nym-connect/src-tauri/src/operations/connection/connect.rs @@ -11,6 +11,7 @@ pub async fn start_connecting( state: tauri::State<'_, Arc>>, window: tauri::Window, ) -> Result { + log::trace!("Start connecting"); let (msg_receiver, exit_status_receiver) = { let mut state_w = state.write().await; state_w.start_connecting(&window).await? @@ -18,8 +19,8 @@ pub async fn start_connecting( // Setup task for checking status let state = state.inner().clone(); - tasks::start_disconnect_listener(state, window.clone(), exit_status_receiver); - tasks::start_status_listener(window, msg_receiver); + tasks::start_disconnect_listener(state.clone(), window.clone(), exit_status_receiver); + tasks::start_status_listener(state, window.clone(), msg_receiver); Ok(ConnectResult { address: "PLACEHOLDER".to_string(), diff --git a/nym-connect/src-tauri/src/operations/connection/disconnect.rs b/nym-connect/src-tauri/src/operations/connection/disconnect.rs index 2361213e40..b75bf49410 100644 --- a/nym-connect/src-tauri/src/operations/connection/disconnect.rs +++ b/nym-connect/src-tauri/src/operations/connection/disconnect.rs @@ -9,6 +9,7 @@ pub async fn start_disconnecting( state: tauri::State<'_, Arc>>, window: tauri::Window, ) -> Result { + log::trace!("Start disconnecting"); let mut guard = state.write().await; guard.start_disconnecting(&window).await?; diff --git a/nym-connect/src-tauri/src/operations/connection/status.rs b/nym-connect/src-tauri/src/operations/connection/status.rs index ccf02400f3..a5f613a386 100644 --- a/nym-connect/src-tauri/src/operations/connection/status.rs +++ b/nym-connect/src-tauri/src/operations/connection/status.rs @@ -1,11 +1,14 @@ use crate::error::Result; use std::sync::Arc; +use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; use crate::models::ConnectionStatusKind; use crate::state::State; +static HEALTH_CHECK_URL: &str = "https://nymtech.net/.wellknown/connect/healthcheck.json"; + #[tauri::command] pub async fn get_connection_status( state: tauri::State<'_, Arc>>, @@ -13,3 +16,27 @@ pub async fn get_connection_status( let state = state.read().await; Ok(state.get_status()) } + +#[derive(Serialize, Deserialize, Debug)] +struct ConnectionSuccess { + status: String, +} + +#[tauri::command] +pub async fn run_health_check() -> bool { + log::info!("Running network health check"); + match crate::operations::http::socks5_get::<_, ConnectionSuccess>(HEALTH_CHECK_URL).await { + Ok(res) if res.status == "ok" => { + log::info!("Healthcheck success!"); + true + } + Ok(res) => { + log::error!("Healthcheck failed with status: {}", res.status); + false + } + Err(err) => { + log::error!("Healthcheck failed: {err}"); + false + } + } +} diff --git a/nym-connect/src-tauri/src/operations/growth/api_client.rs b/nym-connect/src-tauri/src/operations/growth/api_client.rs index eb13749ad5..c069cb6a9d 100644 --- a/nym-connect/src-tauri/src/operations/growth/api_client.rs +++ b/nym-connect/src-tauri/src/operations/growth/api_client.rs @@ -83,6 +83,7 @@ impl GrowthApiClient { } } + // TODO: use the method in `operations::http` instead pub(crate) async fn post( &self, url: &str, diff --git a/nym-connect/src-tauri/src/operations/http.rs b/nym-connect/src-tauri/src/operations/http.rs new file mode 100644 index 0000000000..5cfe3e1f53 --- /dev/null +++ b/nym-connect/src-tauri/src/operations/http.rs @@ -0,0 +1,37 @@ +use crate::error::{BackendError, Result}; +use serde::de::DeserializeOwned; +use tap::TapFallible; + +pub async fn socks5_get(url: U) -> Result +where + U: reqwest::IntoUrl + std::fmt::Display, + T: DeserializeOwned, +{ + log::info!(">>> GET {url}"); + let proxy = reqwest::Proxy::all("socks5h://127.0.0.1:1080")?; + let client = reqwest::Client::builder() + .proxy(proxy) + .timeout(std::time::Duration::from_secs(20)) + .build()?; + + let resp = client.get(url).send().await.tap_err(|err| { + log::error!("<<< Request send error: {err}"); + })?; + + if resp.status().is_client_error() || resp.status().is_server_error() { + log::error!("<<< {}", resp.status()); + return Err(BackendError::RequestFail { + url: resp.url().clone(), + status_code: resp.status(), + }); + } + + let response_body = resp.text().await.tap_err(|err| { + log::error!("<<< Request error: {err}"); + })?; + log::info!("<<< {response_body}"); + + Ok(serde_json::from_str(&response_body).tap_err(|err| { + log::error!("<<< JSON parsing error: {err}"); + })?) +} diff --git a/nym-connect/src-tauri/src/operations/mod.rs b/nym-connect/src-tauri/src/operations/mod.rs index 1d0fa5b211..9d7d45f236 100644 --- a/nym-connect/src-tauri/src/operations/mod.rs +++ b/nym-connect/src-tauri/src/operations/mod.rs @@ -3,4 +3,5 @@ pub mod directory; pub mod export; pub mod growth; pub mod help; +pub mod http; pub mod window; diff --git a/nym-connect/src-tauri/src/state.rs b/nym-connect/src-tauri/src/state.rs index f0aa869edd..72e16a6748 100644 --- a/nym-connect/src-tauri/src/state.rs +++ b/nym-connect/src-tauri/src/state.rs @@ -43,7 +43,6 @@ impl State { } } - #[allow(unused)] pub fn get_status(&self) -> ConnectionStatusKind { self.status.clone() } @@ -111,9 +110,7 @@ impl State { } // Kick off the main task and get the channel for controlling it - let (msg_receiver, exit_status_receiver) = self.start_nym_socks5_client()?; - self.set_state(ConnectionStatusKind::Connected, window); - Ok((msg_receiver, exit_status_receiver)) + self.start_nym_socks5_client() } /// Create a configuration file @@ -142,9 +139,16 @@ impl State { Ok((msg_rx, exit_status_rx)) } + /// Once the SOCKS5 client is operational, the status listener would call this + pub fn mark_connected(&mut self, window: &tauri::Window) { + log::trace!("state::mark_connected"); + self.set_state(ConnectionStatusKind::Connected, window); + } + /// Disconnect by sending a message to the SOCKS5 client thread. Once it has finished and is /// disconnected, the disconnect handler will mark it as disconnected. pub async fn start_disconnecting(&mut self, window: &tauri::Window) -> Result<()> { + log::trace!("state::start_disconnecting"); self.set_state(ConnectionStatusKind::Disconnecting, window); // Send shutdown message diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index 3201648e6e..7f1e320031 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -1,7 +1,11 @@ -use client_core::config::{ClientCoreConfigTrait, GatewayEndpointConfig}; +use client_core::{ + config::{ClientCoreConfigTrait, GatewayEndpointConfig}, + error::ClientCoreStatusMessage, +}; use futures::{channel::mpsc, StreamExt}; use std::sync::Arc; use tap::TapFallible; +use task::manager::TaskStatus; use tokio::sync::RwLock; use config_common::NymConfig; @@ -9,7 +13,7 @@ use config_common::NymConfig; use nym_socks5::client::NymClient as Socks5NymClient; use nym_socks5::client::{config::Config as Socks5Config, Socks5ControlMessageSender}; -use crate::{error::Result, state::State}; +use crate::{error::Result, models::ConnectionStatusKind, operations::connection, state::State}; pub type ExitStatusReceiver = futures::channel::oneshot::Receiver; @@ -89,8 +93,78 @@ struct Payload { message: String, } +impl Payload { + fn new(title: String, message: String) -> Self { + Self { title, message } + } +} + +fn emit_event(event: &str, title: &str, msg: &str, window: &tauri::Window) { + if let Err(err) = window.emit(event, Payload::new(title.into(), msg.into())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +fn emit_status_event( + event: &str, + msg: Box, + window: &tauri::Window, +) { + if let Err(err) = window.emit(event, Payload::new("SOCKS5 update".into(), msg.to_string())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +pub fn start_connection_check(state: Arc>, window: tauri::Window) { + log::debug!("Starting connection check handler"); + tokio::spawn(async move { + if state.read().await.get_status() != ConnectionStatusKind::Connected { + log::error!("SOCKS5 connection status check failed: not connected"); + return; + } + + log::info!("Running connection health check"); + if connection::status::run_health_check().await { + emit_event( + "socks5-connection-success-event", + "SOCKS5 success", + "SOCKS5 connection health check successful", + &window, + ); + } else { + if state.read().await.get_status() != ConnectionStatusKind::Connected { + log::debug!("SOCKS5 connection status check cancelled: not connected"); + } + log::error!("SOCKS5 connection health check failed"); + emit_event( + "socks5-connection-fail-event", + "SOCKS5 error", + "SOCKS5 connection health check failed", + &window, + ); + } + + log::debug!("Connection check handler exiting"); + }); +} + +async fn handle_connection_ready( + state: &Arc>, + window: &tauri::Window, + msg: Box, +) { + { + let mut state_w = state.write().await; + state_w.mark_connected(window); + } + + emit_status_event("socks5-connected-event", msg, window); + start_connection_check(state.clone(), window.clone()); +} + /// The status listener listens for non-exit status messages from the background socks5 proxy task. pub fn start_status_listener( + state: Arc>, window: tauri::Window, mut msg_receiver: task::StatusReceiver, ) { @@ -98,16 +172,21 @@ pub fn start_status_listener( tokio::spawn(async move { while let Some(msg) = msg_receiver.next().await { log::info!("SOCKS5 proxy sent status message: {}", msg); - window - .emit( - "socks5-status-event", - Payload { - title: "SOCKS5 update".into(), - message: msg.to_string(), - }, - ) - .unwrap(); + + if let Some(TaskStatus::Ready) = msg.downcast_ref::() { + handle_connection_ready(&state, &window, msg).await; + } else if let Some(_gateway_status) = msg.downcast_ref::() { + // TODO: use this instead once we change on the frontend too + //let event_name = match gateway_status { + // ClientCoreStatusMessage::GatewayIsSlow => "socks5-gateway-status", + // ClientCoreStatusMessage::GatewayIsVerySlow => "socks5-gateway-status", + //}; + emit_status_event("socks5-status-event", msg, &window); + } else { + emit_status_event("socks5-status-event", msg, &window); + } } + log::info!("Status listener exiting"); }); } @@ -123,39 +202,30 @@ pub fn start_disconnect_listener( match exit_status_receiver.await { Ok(Socks5ExitStatusMessage::Stopped) => { log::info!("SOCKS5 task reported it has finished"); - window - .emit( - "socks5-event", - Payload { - title: "SOCKS5 finished".into(), - message: "SOCKS5 task reported it has finished".into(), - }, - ) - .unwrap(); + emit_event( + "socks5-event", + "SOCKS5 finished", + "SOCKS5 task reported it has finished", + &window, + ); } Ok(Socks5ExitStatusMessage::Failed(err)) => { log::info!("SOCKS5 task reported error: {err}"); - window - .emit( - "socks5-event", - Payload { - title: "SOCKS5 error".into(), - message: format!("SOCKS5 failed: {err}"), - }, - ) - .unwrap(); + emit_event( + "socks5-event", + "SOCKS5 error", + &format!("SOCKS5 failed: {err}"), + &window, + ); } Err(_) => { log::info!("SOCKS5 task appears to have stopped abruptly"); - window - .emit( - "socks5-event", - Payload { - title: "SOCKS5 error".into(), - message: "SOCKS5 stopped abruptly. Please try reconnecting.".into(), - }, - ) - .unwrap(); + emit_event( + "socks5-event", + "SOCKS5 error", + "SOCKS5 stopped abruptly. Please try reconnecting.", + &window, + ); } } From 4db656d0746e1b5a0d27932a04513cccf123bbb6 Mon Sep 17 00:00:00 2001 From: joeiacono2021 <90098521+joeiacono2021@users.noreply.github.com> Date: Tue, 24 Jan 2023 12:41:59 +0000 Subject: [PATCH 231/591] Version changes for 1.1.7 release , edited versions and changelogs. --- .DS_Store | Bin 0 -> 10244 bytes CHANGELOG.md | 28 ++++++++++++++++++ clients/.DS_Store | Bin 0 -> 6148 bytes clients/client-core/Cargo.toml | 2 +- clients/native/Cargo.toml | 2 +- clients/socks5/Cargo.toml | 2 +- contracts/.DS_Store | Bin 0 -> 6148 bytes contracts/vesting/Cargo.toml | 2 +- explorer-api/Cargo.toml | 2 +- explorer/CHANGELOG.md | 8 +++++ explorer/package.json | 2 +- gateway/Cargo.toml | 2 +- mixnode/.DS_Store | Bin 0 -> 6148 bytes mixnode/Cargo.toml | 2 +- nym-api/Cargo.toml | 2 +- nym-connect/.DS_Store | Bin 0 -> 6148 bytes nym-connect/CHANGELOG.md | 6 +++- nym-connect/package.json | 2 +- nym-connect/src-tauri/Cargo.toml | 2 +- nym-connect/src-tauri/tauri.conf.json | 2 +- nym-wallet/.DS_Store | Bin 0 -> 8196 bytes nym-wallet/CHANGELOG.md | 6 ++++ nym-wallet/package.json | 2 +- nym-wallet/src-tauri/Cargo.toml | 2 +- nym-wallet/src-tauri/tauri.conf.json | 2 +- service-providers/.DS_Store | Bin 0 -> 6148 bytes .../network-requester/Cargo.toml | 2 +- .../network-statistics/Cargo.toml | 2 +- tools/.DS_Store | Bin 0 -> 6148 bytes tools/nym-cli/Cargo.toml | 2 +- 30 files changed, 65 insertions(+), 19 deletions(-) create mode 100644 .DS_Store create mode 100644 clients/.DS_Store create mode 100644 contracts/.DS_Store create mode 100644 mixnode/.DS_Store create mode 100644 nym-connect/.DS_Store create mode 100644 nym-wallet/.DS_Store create mode 100644 service-providers/.DS_Store create mode 100644 tools/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4749f10c60781913949c482a1b22f510496f8aeb GIT binary patch literal 10244 zcmeHMTW=dh6h0d}_BwW}P{9ibu@WylBq2`HIu$Q&E`mrDq`H6*MZvd*Z8p2n+KyXA zk^Ii(C-4^#ukbs7--396@0{6&nb~y;JWwjlSUYDg=bSzB&6#g@#zf@pOa@J&fQWn? zESDRo3JO2xBUcu(J1s~L_C#YE9YjgL7bU%%w!7gFa0oaA90Cpjhrs^<0nFK4{JN5^ zb_h5G90HdJFh2x1Shh1cQ&Ok{l`H`u%eXBC=U4}bO_0fUCTB{DDSWEcgO{0l*%HH3 z=6D{kI%GSOGbNQddCHu;?9E=bLhv<5 z;8^=ZiWo1^F0@lRqJ-8cLfxlhZOzX%-(P7nhRq2@rj7TyWz)cW-ox8Jpm%AX-lq>C z*I+lW?7p(>s)#3|5N(O`t?_=lTKlY%#!(UCo+B!lNSaAza zP{(Gp3qM=BHPPirQ=r<uwGwzNjqn&R08DHH`lBoCeyxaRY98M3HU*1jP zaW{;IsThQVAygiG62^mMx|2-e!ANX7>VaSLYlq9Pou98ZZ#SDO!Pd=N7c0SebGx;% z65QO_ytt_Oue|y8JNFKcqmwvccu>4-W}|EB`m+8OXE`XWPFK$vrUa>!>&C@j;X_Z- zoWA9+A<%37(A8aZLujUl(8G5cJ^K0*TL2CT>QqTBeOq61LVK8UG`=g^;e$ zwqmHGB}@s5C}Lap*Y=ljqV|f?$93Hg)ErhgyeLKD)O|CJP+|kbGw}>k;l2N zU4r%?H$h`k_pWQBHq+AR^2h(2E?-r235INKZ7^N7TDMk$&1TbL%dgQwl(}rlY?`&l z>Z7`h*j@Svm>LC>m> zEPRrg8O`I*@NVd8J@}j^yzT8xOn943neeun+nDff|Co$BF&eOEsUx$y8B!WKVt*;ZNcEjH_qzqFIrwvb1JW>BW zimib{IUQmoY~dF-e^(msk|E+Mhk!%CAutz#l6n&G{{Q~`|NrOOy9W*dhro-EfLGq@ z?Cqc(Pj?{fCh=Z-fa41sTv%_Wq?n+R?RZGpj>iRW$G?Sxb=O&P!FfBAGbM2c<@x*> f;MV{0Urla}T)kXZ7wq`B^}pIPu$BZb-unMft}E;# literal 0 HcmV?d00001 diff --git a/CHANGELOG.md b/CHANGELOG.md index eb2be34ebd..f0e973d88e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,34 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +# [Unreleased] + +# [v1.1.7] (2023-01-24) + +### Added + +- Gateways now shut down gracefully ([#2019]). +- Rust SDK - Initial version for nym-client ([#2669]). +- Introduce vesting contract query for addresses of all vesting accounts (required for the circulating supply calculation) ([#2778]). +- Add threshold value to the contract storage ([#1893]) + +### Changed + +- Refactor vesting account storage (and in particular, ACCOUNTS saving) ([#2795]). +- Move from manual advancing DKG state to an automatic process ([#2670]). + +### Fixed + +- Gateways now shut down gracefully ([#2019]). + +[#2019]: https://github.com/nymtech/nym/issues/2019 +[#2669]: https://github.com/nymtech/nym/issues/2669 +[#2795]: https://github.com/nymtech/nym/issues/2795 +[#2778]: https://github.com/nymtech/nym/issues/2778 +[#2670]: https://github.com/nymtech/nym/issues/2670 +[#1893]: https://github.com/nymtech/nym/issues/1893 + + ## [v1.1.6] (2023-01-17) ### Added diff --git a/clients/.DS_Store b/clients/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..31c7b1aa5dec9d390e033cf8aec647eeee744daa GIT binary patch literal 6148 zcmeHK%TB{E5S%Sl)yJhrE=c(SkT`G;RXK3(573uTL`b9-in!&@$MAieVAi&(#A!Jp zgwSrZ9>>`oJ7X)30m$TebqS0C^y!M70gD5s&(&Mj2`xjSIF15OIL8ttHmzuD_=^hY z+>JP6IWnwKpTG5OUM?4TxnP7Yk8AqHr!&@$X6qgC1uzl8ikyF7aR56!fGJ=K{D1=beWvwC9<4M5OaW71uYi6Z z61rj5y>v zkkGS)6N{6Ri-_fR#tK(CkOR$zX*k@T&@Z0jVH(RR910 literal 0 HcmV?d00001 diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index fee89c52df..da245cf7ab 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "client-core" -version = "1.1.6" +version = "1.1.7" authors = ["Dave Hrycyszyn "] edition = "2021" rust-version = "1.66" diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 1e33012304..914c6aa608 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.6" +version = "1.1.7" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 7567dda43b..09a65bb093 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.5" +version = "1.1.7" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/contracts/.DS_Store b/contracts/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9fd855f537321697398d76124a7492dda2fe67ea GIT binary patch literal 6148 zcmeHKOHRWu6dcnCD%wTaAtXdDKqYPvS`Z*1So8u=f=We5P(OTj*>f1gVK@vcm}gti zxWEztdM|n&$9dz=ShiyTrZY{qfEIu{T`*c^@`=fJ@i|-YB@Lpnb(~=neVigkIv1@4 zs(>o++Z2$syJpwy7(>ji-&?+?nBanIdVq7T>2r*@wkIqvkRN2lSwAcKe(i zV-8qGm$4%<3$)28aD^=3JO-R5Is2^X2z%JYA&!Y{^3p2LtOvXX`<<~@*L?23YRxp7ONVyrU}CQT#E8Y#n3vxH;lv&jkEKI?p&3UdI;!zk4CCl5k9}O? zv2^I@F#hske9Ok)P>gMz^~W|GCUK~#DxeBf6{xw_mYn~)U*G?$Bz;o_RDpk`fQfc` zI~@+mpRIF)le0FapU}l5u5@TAO#E?dGjbHK(yj4ZEE!_rv2@51n*In_88lG^epG=s DgB7Ji literal 0 HcmV?d00001 diff --git a/contracts/vesting/Cargo.toml b/contracts/vesting/Cargo.toml index dd8d2966f0..4eb800599a 100644 --- a/contracts/vesting/Cargo.toml +++ b/contracts/vesting/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vesting-contract" -version = "1.1.2" +version = "1.1.3" authors = ["Drazen Urch "] edition = "2021" diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index eb4b6ac83f..e03370527f 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "explorer-api" -version = "1.1.2" +version = "1.1.7" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/explorer/CHANGELOG.md b/explorer/CHANGELOG.md index fc1cf8a756..b021d3babc 100644 --- a/explorer/CHANGELOG.md +++ b/explorer/CHANGELOG.md @@ -1,5 +1,13 @@ ## UNRELEASED +## [nym-explorer-v1.0.3](https://github.com/nymtech/nym/tree/nym-explorer-v1.0.3) (2023-01-24) + +- Stake Saturation tooltip on node list and node pages updated ([#2877]) +- Sandbox Upgrade : Name change from "Network Explorer" to "Sandbox Explorer", button to mainnet explorer and link to faucet ([#2332)]) + +[#2877]: https://github.com/nymtech/nym/issues/2877 +[#2332]: https://github.com/nymtech/nym/issues/2332 + ## [nym-explorer-v1.0.2](https://github.com/nymtech/nym/tree/nym-explorer-v1.0.2) (2023-01-17) - changing the explorers guru link ([#2820]) diff --git a/explorer/package.json b/explorer/package.json index 68cd1ab62c..3ca03f5b56 100644 --- a/explorer/package.json +++ b/explorer/package.json @@ -1,6 +1,6 @@ { "name": "@nym/network-explorer", - "version": "1.0.2", + "version": "1.0.3", "private": true, "license": "Apache-2.0", "dependencies": { diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index bc76a5ff11..ec12fcb90d 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-gateway" -version = "1.1.6" +version = "1.1.7" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/mixnode/.DS_Store b/mixnode/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c7ae475cadc968fc94261bdf2b60440b9d3c8c21 GIT binary patch literal 6148 zcmeHKJ5B>J5Pd^Z1ZYyyAo&CoMqdMIM4L`xNaVu+=)KY3hs>", "Jędrzej Stuczyński ", diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 9f320ad30e..fc8404fe02 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.5" +version = "1.1.7" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-connect/.DS_Store b/nym-connect/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7bf1d0399970057c418eee2fecee6e6ad6b11b79 GIT binary patch literal 6148 zcmeHK%Sr<=6g_E2@%;c7Zp8Tk2mFIkTU77?_5;*DEY&(wTCLmJi{B!CjQB0$LeEWt zFq!FAq~tLRws(Ow0COyY!2+uilW{2ptJoePD;*<6ga@R!N5A0h zJG=s3f&Zp}e7g%cz%_>G^2`1GevkWUtJzPR92cKGmgrj>Tfh=IN9;YrA?i56IWgjQ z-*$Mf4lh6(J&f>>_fuPr-x3neri~6R8C6=3+*3LjIlSirZ@{&*aL2k!{|L9tmLhR@ zpAK&p17>J4M-Q#MZ>8(_&f|h>-a`$i#FAB4-W^7ja~QgDs|V#?od5O7_y0V} zKY0bb0#l`c3TlnoK9^+A*23cCtPNSNSj5CHGpH%7>~X9caujc}XyaHY4PtCDGsqsA P|0AGf@Re8KPZjt9YVhCG literal 0 HcmV?d00001 diff --git a/nym-connect/CHANGELOG.md b/nym-connect/CHANGELOG.md index 138b2beb0c..cddba036e0 100644 --- a/nym-connect/CHANGELOG.md +++ b/nym-connect/CHANGELOG.md @@ -2,7 +2,11 @@ ## UNRELEASED -- Remove test and earn +## [nym-connect-v1.1.7](https://github.com/nymtech/nym/tree/nym-connect-v1.1.7) (2023-01-24) + +- Remove test and earn ([#2865]) + +[#2865]: https://github.com/nymtech/nym/issue/2865 ## [nym-connect-v1.1.6](https://github.com/nymtech/nym/tree/nym-connect-v1.1.6) (2023-01-17) diff --git a/nym-connect/package.json b/nym-connect/package.json index c2de26db48..5aae6698ed 100644 --- a/nym-connect/package.json +++ b/nym-connect/package.json @@ -1,6 +1,6 @@ { "name": "@nym/nym-connect", - "version": "1.1.6", + "version": "1.1.7", "main": "index.js", "license": "MIT", "scripts": { diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/src-tauri/Cargo.toml index b3cbb83530..dd88c73c49 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.6" +version = "1.1.7" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/src-tauri/tauri.conf.json b/nym-connect/src-tauri/tauri.conf.json index b9942d4537..96cc9f0fa6 100644 --- a/nym-connect/src-tauri/tauri.conf.json +++ b/nym-connect/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.6" + "version": "1.1.7" }, "build": { "distDir": "../dist", diff --git a/nym-wallet/.DS_Store b/nym-wallet/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..23b76277ca0ef242dc50c8ba4547fc9680adee30 GIT binary patch literal 8196 zcmeHMTW%9E6g^JTs(}DSsziSfvw=op2Wgv%BJq&u0w6Dwq$J&OaW8C6fgx$0aM^#P=IT;q@4}xzOS{?6fgz;O9kZnkT45&01C)~l>;znSR4RS?-Gd8M7q%GA(^;R0Ik6LP<-+b|>2%Ofr+wDTlsaT?|Ioy%n3I!vjx^$2 zMw}MgIi;s(c!U!?!E<7pykU{&?nk@^hL~WEJhJ;xVJBw~^T_U7WYQLj`vIqzoV4(Mk|oYCTdcPS>tC~99KZ@U}3<@9h-j;4Mb z@msX&=}AkEBR8UwZ>Z4}S+U*v=ZLpW-U5Az5QCy^<3VKG#0!qpA-Z@nQd2WU4>cbDonKXpXyjL1+J3K z+jRbaow{VPngXW4A1dG)-LviyNxG_6kY$xmm|rnV61$a0rLZXc5a9jQABMb6Xeyje Uz?DZnVX}h&mB9*A;IAt16V1mdK>z>% literal 0 HcmV?d00001 diff --git a/nym-wallet/CHANGELOG.md b/nym-wallet/CHANGELOG.md index d73e728f2a..6ffde9b4de 100644 --- a/nym-wallet/CHANGELOG.md +++ b/nym-wallet/CHANGELOG.md @@ -2,6 +2,12 @@ ## UNRELEASED +## [nym-wallet-v1.1.8](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.8) (2023-01-24) + +- Fix delegations sorting ([#2885]) + +[#2885]: https://github.com/nymtech/nym/issues/2885 + ## [nym-wallet-v1.1.7](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.7) (2023-01-17) - link to the ng mixnet explorer for account info ([#2823]) diff --git a/nym-wallet/package.json b/nym-wallet/package.json index cf77f4364f..9dc201f639 100644 --- a/nym-wallet/package.json +++ b/nym-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@nymproject/nym-wallet-app", - "version": "1.1.7", + "version": "1.1.8", "main": "index.js", "license": "MIT", "scripts": { diff --git a/nym-wallet/src-tauri/Cargo.toml b/nym-wallet/src-tauri/Cargo.toml index 7325f9051e..fe3d203aa9 100644 --- a/nym-wallet/src-tauri/Cargo.toml +++ b/nym-wallet/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym_wallet" -version = "1.1.7" +version = "1.1.8" description = "Nym Native Wallet" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-wallet/src-tauri/tauri.conf.json b/nym-wallet/src-tauri/tauri.conf.json index 297ddcf129..08cc4b3383 100644 --- a/nym-wallet/src-tauri/tauri.conf.json +++ b/nym-wallet/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-wallet", - "version": "1.1.7" + "version": "1.1.8" }, "build": { "distDir": "../dist", diff --git a/service-providers/.DS_Store b/service-providers/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9ffdb3cec473cb67fc585f9e425fa30504a8ea02 GIT binary patch literal 6148 zcmeHKJ5B>J5S<|@BGCjYN?!mZZeXHNQ0D@W5TS_GuGo;!`bHcP-h4pWWQ$Y?!HhJ1 zV|zZ{C#^q3#FNeAHPM)eMo>W(qeo=8ck0BQhd|aG4Yl-4muQzgiGJgdto@8?toN1P zXm|ZDw87{a<4bDqs%9~-nmN3MsvGFlhYGBtGHhpUT{ZO+yulTnAJmje573p?T+xEo zdsW{Nw_Ek79D8+1;Z|NBP-$@Og69Cg?p>MEr^v5ZIkd j06MadT", "Jędrzej Stuczyński "] edition = "2021" rust-version = "1.65" diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index f5a6f48d73..8a618a823f 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-statistics" -version = "1.1.6" +version = "1.1.7" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tools/.DS_Store b/tools/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..001d1187163643b69f621a3ad952e61dec092d4c GIT binary patch literal 6148 zcmeHKOG*Pl5PhWqBW|*E*%wgo25pE7*SUZsf(YXbBr3S;8+k;1^-&Ts>mX7EU9YC= z(=!jIy9LvO3?u`|z%K*3KNJqd8rU3d>!7k0fH>i_32nVJYfcHQfz6Q~ig+r~Qzcpq z@pR6Yh^v9k(bFN(d`PVP)4YhS&ici|A=NQ;GLQ`HGoZaMWv1u<9ei{)a@uZy$w;5+rKEgTOVDjL_+pwQmC1n@!kkxO&Bzo^Z)8rU4Qiq2a)F)so} LNUCJu2n>7!vI;HG literal 0 HcmV?d00001 diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index 9c16634723..b979fc7e16 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.6" +version = "1.1.7" authors = ["Nym Technologies SA"] edition = "2021" From 2bd679c91f3183fd5b6bec64c47a926f4e148eed Mon Sep 17 00:00:00 2001 From: Fran Arbanas Date: Tue, 24 Jan 2023 17:11:01 +0100 Subject: [PATCH 232/591] feat: refactored GH actions (#2894) --- .github/workflows/build.yml | 30 +++++++++++++++++++++---- .github/workflows/connect.yml | 19 ++++++++++++++-- .github/workflows/contracts.yml | 8 ++++--- .github/workflows/wallet.yml | 14 ++++++++---- .github/workflows/wasm_client_build.yml | 9 ++++++-- 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 402d5e2def..7dbe2874f0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,11 +2,33 @@ name: Continuous integration on: push: - paths-ignore: - - 'explorer/**' + paths: + - 'clients/**' + - 'common/**' + - 'explorer-api/**' + - 'gateway/**' + - 'integrations/**' + - 'mixnode/**' + - 'sdk/rust/nym-sdk/**' + - 'service-providers/**' + - 'nym-api/**' + - 'nym-outfox/**' + - 'tools/nym-cli/**' + - 'tools/ts-rs-cli/**' pull_request: - paths-ignore: - - 'explorer/**' + paths: + - 'clients/**' + - 'common/**' + - 'explorer-api/**' + - 'gateway/**' + - 'integrations/**' + - 'mixnode/**' + - 'sdk/rust/nym-sdk/**' + - 'service-providers/**' + - 'nym-api/**' + - 'nym-outfox/**' + - 'tools/nym-cli/**' + - 'tools/ts-rs-cli/**' jobs: build: diff --git a/.github/workflows/connect.yml b/.github/workflows/connect.yml index 1d56e12ad7..29e347586e 100644 --- a/.github/workflows/connect.yml +++ b/.github/workflows/connect.yml @@ -2,8 +2,23 @@ name: Nym Connect (rust) on: push: - paths-ignore: - - 'explorer/**' + paths: + - 'nym-connect/**' + - 'clients/client-core/**' + - 'clients/socks5/**' + - 'common/**' + - 'gateway/gateway-requests/**' + - 'contracts/vesting/**' + - 'nym-api/nym-api-requests/**' + pull_request: + paths: + - 'nym-connect/**' + - 'clients/client-core/**' + - 'clients/socks5/**' + - 'common/**' + - 'gateway/gateway-requests/**' + - 'contracts/vesting/**' + - 'nym-api/nym-api-requests/**' jobs: build: diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml index 6d51356a80..0a5b5bd786 100644 --- a/.github/workflows/contracts.yml +++ b/.github/workflows/contracts.yml @@ -2,11 +2,13 @@ name: Contracts on: push: - paths-ignore: - - 'explorer/**' + paths: + - 'contracts/**' + - 'common/**' pull_request: paths-ignore: - - 'explorer/**' + - 'contracts/**' + - 'common/**' jobs: matrix_prep: diff --git a/.github/workflows/wallet.yml b/.github/workflows/wallet.yml index 6e23f6833a..a2ffef460e 100644 --- a/.github/workflows/wallet.yml +++ b/.github/workflows/wallet.yml @@ -2,11 +2,17 @@ name: Nym Wallet (rust) on: push: - paths-ignore: - - 'explorer/**' + paths: + - 'nym-wallet/**' + - 'common/**' + - 'contracts/vesting/**' + - 'nym-api/nym-api-requests/**' pull_request: - paths-ignore: - - 'explorer/**' + paths: + - 'nym-wallet/**' + - 'common/**' + - 'contracts/vesting/**' + - 'nym-api/nym-api-requests/**' jobs: build: diff --git a/.github/workflows/wasm_client_build.yml b/.github/workflows/wasm_client_build.yml index 4067e81939..d5f2011dd5 100644 --- a/.github/workflows/wasm_client_build.yml +++ b/.github/workflows/wasm_client_build.yml @@ -2,8 +2,13 @@ name: Wasm Client on: pull_request: - paths-ignore: - - 'explorer/**' + paths: + - 'clients/webassembly/**' + - 'clients/client-core/**' + - 'common/**' + - 'contracts/**' + - 'gateway/gateway-requests/**' + - 'nym-api/nym-api-requests/**' jobs: wasm: From da9468c36a5f6ef74ae437f481dc1ae491715e1f Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Tue, 24 Jan 2023 16:26:37 +0000 Subject: [PATCH 233/591] Update package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index bab720c114..d205ce90da 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "build:ci:collect-artifacts": "mkdir -p ts-packages/dist && mv ts-packages/react-components/storybook-static ts-packages/dist/storybook && mv ts-packages/react-webpack-with-theme-example/dist ts-packages/dist/example", "lint": "lerna run lint --stream", "lint:fix": "lerna run lint:fix --stream", + "tsc": "lerna run tsc --stream", "types:lint:fix": "lerna run lint:fix --scope @nymproject/types --scope @nymproject/nym-wallet-app", "audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run" }, From 5d385ba10f94b2b66d5a8b9d87c6713c9da8046a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 25 Jan 2023 10:40:57 +0000 Subject: [PATCH 234/591] don't trigger global shutdown upon finishing sending verloc packets (#2910) --- common/mixnode-common/src/verloc/sender.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/common/mixnode-common/src/verloc/sender.rs b/common/mixnode-common/src/verloc/sender.rs index 91f7ee9974..c0f1cefa15 100644 --- a/common/mixnode-common/src/verloc/sender.rs +++ b/common/mixnode-common/src/verloc/sender.rs @@ -84,6 +84,7 @@ impl PacketSender { tested_node: TestedNode, ) -> Result { let mut shutdown_listener = self.shutdown_listener.clone(); + shutdown_listener.mark_as_success(); let mut conn = match tokio::time::timeout( self.connection_timeout, From 49b8a843a439b781a6f2c616f13154a2d49ecc1b Mon Sep 17 00:00:00 2001 From: Drazen Urch Date: Wed, 25 Jan 2023 12:36:58 +0100 Subject: [PATCH 235/591] Vesting cap (#2903) * Locked coins definition change * Adapt tests to new locked * Typo * More tests * Fix withdraw test * Rollback changes * Cleanup --- .../vesting/src/traits/vesting_account.rs | 2 +- contracts/vesting/src/vesting/mod.rs | 268 +++++++++++++++++- 2 files changed, 268 insertions(+), 2 deletions(-) diff --git a/contracts/vesting/src/traits/vesting_account.rs b/contracts/vesting/src/traits/vesting_account.rs index 9d44780fbe..52af7d426c 100644 --- a/contracts/vesting/src/traits/vesting_account.rs +++ b/contracts/vesting/src/traits/vesting_account.rs @@ -10,7 +10,7 @@ pub trait VestingAccount { ) -> Result; /// Returns the set of coins that are not spendable (can still be delegated tough) (i.e. locked), - /// defined as the vesting coins that are not delegated or pledged. + /// defined as vesting coins that are not delegated or pledged. /// /// To get spendable coins of a vesting account, first the total balance must /// be retrieved and the locked tokens can be subtracted from the total balance. diff --git a/contracts/vesting/src/vesting/mod.rs b/contracts/vesting/src/vesting/mod.rs index 4f9c5efbfa..e2c57a4bc0 100644 --- a/contracts/vesting/src/vesting/mod.rs +++ b/contracts/vesting/src/vesting/mod.rs @@ -48,7 +48,7 @@ mod tests { use crate::traits::{GatewayBondingAccount, MixnodeBondingAccount}; use crate::vesting::{populate_vesting_periods, Account}; use cosmwasm_std::testing::{mock_env, mock_info}; - use cosmwasm_std::{coin, coins, Addr, Coin, Timestamp, Uint128}; + use cosmwasm_std::{coin, coins, Addr, Coin, MessageInfo, Timestamp, Uint128}; use mixnet_contract_common::mixnode::MixNodeCostParams; use mixnet_contract_common::{Gateway, MixNode, Percent}; use vesting_contract_common::messages::{ExecuteMsg, VestingSpecification}; @@ -1156,4 +1156,270 @@ mod tests { // the 50M delegation wasn't a thing here for VESTING tokens either assert_eq!(delegated_vesting.amount, Uint128::zero()); } + + #[test] + fn vesting_cap_escape() { + let mut deps = init_contract(); + let mut env = mock_env(); + + let vesting_period_length_secs = 3600; + let blocks_per_period = 100; + + let account_creation_timestamp = 1650000000; + let vesting_start_timestamp = 1650000000; + + let account_creation_blockheight = 12345; + + env.block.height = account_creation_blockheight; + env.block.time = Timestamp::from_seconds(account_creation_timestamp); + + let periods = populate_vesting_periods( + vesting_start_timestamp, + VestingSpecification::new(None, Some(vesting_period_length_secs), None), + ); + + let vesting_account = Account::new( + Addr::unchecked("owner"), + None, + Coin { + amount: Uint128::new(40_000_000_000_000), + denom: TEST_COIN_DENOM.to_string(), + }, + Timestamp::from_seconds(account_creation_timestamp), + periods, + Some(PledgeCap::Percent( + Percent::from_percentage_value(10).unwrap(), + )), + deps.as_mut().storage, + ) + .unwrap(); + + let mix_id = 42; + + let delegation = Coin { + amount: Uint128::new(5_000_000_000_000), + denom: TEST_COIN_DENOM.to_string(), + }; + + // delegate explicitly at the time the account was created + // (i.e. after 2 vesting periods already elapsed) + env.block.height = account_creation_blockheight; + env.block.time = Timestamp::from_seconds(account_creation_timestamp); + let err = vesting_account.try_delegate_to_mixnode( + mix_id, + delegation.clone(), + &env, + &mut deps.storage, + ); + // Can't delegate due to cap + assert!(err.is_err()); + + let delegated_free = vesting_account + .get_delegated_free(None, &env, &deps.storage) + .unwrap(); + let delegated_vesting = vesting_account + .get_delegated_vesting(None, &env, &deps.storage) + .unwrap(); + + assert_eq!(delegated_free.amount, Uint128::new(0)); + assert_eq!(delegated_vesting.amount, Uint128::new(0)); + + let delegation = Coin { + amount: Uint128::new(4_000_000_000_000), + denom: TEST_COIN_DENOM.to_string(), + }; + + // delegate explicitly at the time the account was created + // (i.e. after 2 vesting periods already elapsed) + env.block.height = account_creation_blockheight; + env.block.time = Timestamp::from_seconds(account_creation_timestamp); + let ok = vesting_account.try_delegate_to_mixnode( + mix_id, + delegation.clone(), + &env, + &mut deps.storage, + ); + + // Max delegation allowed by cap + assert!(ok.is_ok()); + + let delegated_free = vesting_account + .get_delegated_free(None, &env, &deps.storage) + .unwrap(); + let delegated_vesting = vesting_account + .get_delegated_vesting(None, &env, &deps.storage) + .unwrap(); + + assert_eq!(delegated_free.amount, Uint128::new(0)); + assert_eq!(delegated_vesting.amount, Uint128::new(4_000_000_000_000)); + + // Advance vesting period + env.block.height += blocks_per_period * 2; + env.block.time = + Timestamp::from_seconds(env.block.time.seconds() + vesting_period_length_secs * 2); + + let delegated_free = vesting_account + .get_delegated_free(None, &env, &deps.storage) + .unwrap(); + let delegated_vesting = vesting_account + .get_delegated_vesting(None, &env, &deps.storage) + .unwrap(); + + let spendable_coins = vesting_account + .spendable_coins(None, &env, &deps.storage) + .unwrap(); + + // let balance = vesting_account.load_balance(&deps.storage).unwrap(); + // assert_eq!(balance, Uint128::new(6_000_000_000_000)); + + // Entire delegation amount is no free, and more can be delegated from the locked tokens + assert_eq!(delegated_free.amount, Uint128::new(4_000_000_000_000)); + assert_eq!(delegated_vesting.amount, Uint128::new(0)); + assert_eq!(spendable_coins.amount, Uint128::new(6_000_000_000_000)); + + let total_pledged_locked = vesting_account + .total_pledged_locked(&deps.storage, &env) + .unwrap(); + assert_eq!(total_pledged_locked, Uint128::new(0)); + + let delegation = Coin { + amount: Uint128::new(5_000_000_000_000), + denom: TEST_COIN_DENOM.to_string(), + }; + + let err = vesting_account.try_delegate_to_mixnode( + mix_id, + delegation.clone(), + &env, + &mut deps.storage, + ); + + // Can't delegate due to cap + assert!(err.is_err()); + + let delegation = Coin { + amount: Uint128::new(4_000_000_000_000), + denom: TEST_COIN_DENOM.to_string(), + }; + + let ok = vesting_account.try_delegate_to_mixnode( + mix_id, + delegation.clone(), + &env, + &mut deps.storage, + ); + // Delegate max allowed amount + assert!(ok.is_ok()); + + let delegated_free = vesting_account + .get_delegated_free(None, &env, &deps.storage) + .unwrap(); + let delegated_vesting = vesting_account + .get_delegated_vesting(None, &env, &deps.storage) + .unwrap(); + let total_pledged_locked = vesting_account + .total_pledged_locked(&deps.storage, &env) + .unwrap(); + let spendable_coins = vesting_account + .spendable_coins(None, &env, &deps.storage) + .unwrap(); + // There is an additional problem here since the cap calculation does not take vesting periods into account + assert_eq!(total_pledged_locked, Uint128::new(0)); + + // Entire delegation amount is now free, and more can be delegated from the locked tokens + assert_eq!(delegated_free.amount, Uint128::new(8_000_000_000_000)); + assert_eq!(delegated_vesting.amount, Uint128::new(0)); + assert_eq!(spendable_coins.amount, Uint128::new(2_000_000_000_000)); + + // Delegate some more to saturate the cap + env.block.height += 1; + env.block.time = Timestamp::from_seconds(env.block.time.seconds() + 36); + + let delegation = Coin { + amount: Uint128::new(4_000_000_000_000), + denom: TEST_COIN_DENOM.to_string(), + }; + + vesting_account + .try_delegate_to_mixnode(mix_id, delegation.clone(), &env, &mut deps.storage) + .unwrap(); + + let delegated_free = vesting_account + .get_delegated_free(None, &env, &deps.storage) + .unwrap(); + let delegated_vesting = vesting_account + .get_delegated_vesting(None, &env, &deps.storage) + .unwrap(); + let total_pledged_locked = vesting_account + .total_pledged_locked(&deps.storage, &env) + .unwrap(); + + // There is an additional problem here since the cap calculation does not take vesting periods into account + assert_eq!(total_pledged_locked, Uint128::new(4_000_000_000_000)); + + assert_eq!(delegated_free.amount, Uint128::new(8_000_000_000_000)); + assert_eq!(delegated_vesting.amount, Uint128::new(4_000_000_000_000)); + + let spendable_coins = vesting_account + .spendable_coins(None, &env, &deps.storage) + .unwrap(); + + let locked_coins = vesting_account + .locked_coins(None, &env, &deps.storage) + .unwrap(); + + assert_eq!(spendable_coins.amount, Uint128::new(2_000_000_000_000)); + assert_eq!(locked_coins.amount, Uint128::new(26_000_000_000_000)); + + // Check that user can't withdraw free coins if they're delegated + + let info = MessageInfo { + sender: Addr::unchecked("owner"), + funds: vec![], + }; + + let ok = try_withdraw_vested_coins( + Coin::new(1_000_000_000_000, TEST_COIN_DENOM), + env.clone(), + info, + deps.as_mut(), + ); + + assert!(ok.is_ok()); + + let spendable_coins = vesting_account + .spendable_coins(None, &env, &deps.storage) + .unwrap(); + + assert_eq!(spendable_coins.amount, Uint128::new(1_000_000_000_000)); + + let delegated_free = vesting_account + .get_delegated_free(None, &env, &deps.storage) + .unwrap(); + let delegated_vesting = vesting_account + .get_delegated_vesting(None, &env, &deps.storage) + .unwrap(); + let total_pledged_locked = vesting_account + .total_pledged_locked(&deps.storage, &env) + .unwrap(); + + assert_eq!(total_pledged_locked, Uint128::new(4_000_000_000_000)); + + assert_eq!(delegated_free.amount, Uint128::new(8_000_000_000_000)); + assert_eq!(delegated_vesting.amount, Uint128::new(4_000_000_000_000)); + + let delegation = Coin { + amount: Uint128::new(1_000_000_000_000), + denom: TEST_COIN_DENOM.to_string(), + }; + + let err = vesting_account.try_delegate_to_mixnode( + mix_id, + delegation.clone(), + &env, + &mut deps.storage, + ); + + assert!(err.is_err()); + } } From f3b82fa0322f17c6681bc5e34bdfb3d0c3f99631 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 25 Jan 2023 13:08:54 +0100 Subject: [PATCH 236/591] updated changelog for the new version of contracts --- contracts/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/CHANGELOG.md b/contracts/CHANGELOG.md index bf594ae209..5baa36317a 100644 --- a/contracts/CHANGELOG.md +++ b/contracts/CHANGELOG.md @@ -1,5 +1,7 @@ ## Unreleased +## [nym-contracts-v1.1.3](https://github.com/nymtech/nym/tree/nym-contracts-v1.1.3) (2022-01-25) + ### Added - vesting-contract: `GetAccountsPaged` and `GetAccountsVestingCoinsPaged` queries for querying multiple accounts simultaneously ([#2791]) From 9ab3a133d96bf2ebaa08f33f68bddcbf33a3ba53 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 25 Jan 2023 13:25:06 +0100 Subject: [PATCH 237/591] feat: add a workflow for building and publishing binaries to the artifact storage without attaching them to a release --- .../workflows/build-and-upload-binaries.yml | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/build-and-upload-binaries.yml diff --git a/.github/workflows/build-and-upload-binaries.yml b/.github/workflows/build-and-upload-binaries.yml new file mode 100644 index 0000000000..54a3fb51d1 --- /dev/null +++ b/.github/workflows/build-and-upload-binaries.yml @@ -0,0 +1,59 @@ +name: Build and upload binaries to artifact storage + +on: + workflow_dispatch: + inputs: + add_tokio_unstable: + description: 'True to add RUSTFLAGS="--cfg tokio_unstable"' + required: true + default: false + type: boolean + +env: + NETWORK: mainnet + +jobs: + publish-nym: + strategy: + fail-fast: false + matrix: + platform: [ubuntu-20.04] + + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@v3 + + - name: Install Dependencies (Linux) + run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true + + - name: Sets env vars for tokio if set in manual dispatch inputs + run: | + echo 'RUSTFLAGS="--cfg tokio_unstable"' >> $GITHUB_ENV + if: github.event_name == 'workflow_dispatch' && inputs.add_tokio_unstable == true + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Build all binaries + uses: actions-rs/cargo@v1 + with: + command: build + args: --workspace --release + + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: nym-binaries-artifacts + path: | + target/release/nym-client + target/release/nym-gateway + target/release/nym-mixnode + target/release/nym-socks5-client + target/release/nym-api + target/release/nym-network-requester + target/release/nym-network-statistics + target/release/nym-cli + retention-days: 30 From 58b5f113c65ee29a6640e2c404ea20c05891e3bd Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 25 Jan 2023 13:25:06 +0100 Subject: [PATCH 238/591] feat: add a workflow for building and publishing binaries to the artifact storage without attaching them to a release --- .../workflows/build-and-upload-binaries.yml | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/build-and-upload-binaries.yml diff --git a/.github/workflows/build-and-upload-binaries.yml b/.github/workflows/build-and-upload-binaries.yml new file mode 100644 index 0000000000..54a3fb51d1 --- /dev/null +++ b/.github/workflows/build-and-upload-binaries.yml @@ -0,0 +1,59 @@ +name: Build and upload binaries to artifact storage + +on: + workflow_dispatch: + inputs: + add_tokio_unstable: + description: 'True to add RUSTFLAGS="--cfg tokio_unstable"' + required: true + default: false + type: boolean + +env: + NETWORK: mainnet + +jobs: + publish-nym: + strategy: + fail-fast: false + matrix: + platform: [ubuntu-20.04] + + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@v3 + + - name: Install Dependencies (Linux) + run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true + + - name: Sets env vars for tokio if set in manual dispatch inputs + run: | + echo 'RUSTFLAGS="--cfg tokio_unstable"' >> $GITHUB_ENV + if: github.event_name == 'workflow_dispatch' && inputs.add_tokio_unstable == true + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Build all binaries + uses: actions-rs/cargo@v1 + with: + command: build + args: --workspace --release + + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: nym-binaries-artifacts + path: | + target/release/nym-client + target/release/nym-gateway + target/release/nym-mixnode + target/release/nym-socks5-client + target/release/nym-api + target/release/nym-network-requester + target/release/nym-network-statistics + target/release/nym-cli + retention-days: 30 From c2d28740a5e73b8301e6aca39d41de5fca601962 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 25 Jan 2023 14:06:11 +0100 Subject: [PATCH 239/591] bump mixnode version --- mixnode/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index c748964db6..ea5577f64c 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-mixnode" -version = "1.1.7" +version = "1.1.8" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", From 8336d0612ab47ad4bc1d81890d044f822d2f8a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Wed, 25 Jan 2023 15:59:37 +0200 Subject: [PATCH 240/591] Remove coconut feature (#2890) * Remove coconut feature * Remove github workflow remainings * Only run dkg if coconut enabled * Fix typo * Update changelog --- .github/workflows/build.yml | 20 --- .github/workflows/nightly_build.yml | 32 ---- .github/workflows/nightly_build_release.yml | 32 ---- .github/workflows/nightly_build_release2.yml | 32 ---- .github/workflows/wasm_client_build.yml | 5 - CHANGELOG.md | 3 + Cargo.lock | 87 +++++------ Makefile | 16 +- clients/client-core/Cargo.toml | 1 - .../client-core/src/client/base_client/mod.rs | 5 - clients/client-core/src/init/helpers.rs | 1 - clients/credential/Cargo.toml | 3 - clients/credential/src/main.rs | 87 +++++------ clients/native/Cargo.toml | 7 +- clients/native/src/commands/init.rs | 4 - clients/native/src/commands/mod.rs | 36 ++--- clients/native/src/commands/run.rs | 5 - clients/socks5/Cargo.toml | 5 +- clients/socks5/src/commands/init.rs | 5 - clients/socks5/src/commands/mod.rs | 36 ++--- clients/socks5/src/commands/run.rs | 5 - clients/webassembly/Cargo.toml | 7 +- common/client-libs/gateway-client/Cargo.toml | 3 +- .../gateway-client/src/bandwidth.rs | 9 +- .../client-libs/gateway-client/src/client.rs | 33 ++--- .../client-libs/gateway-client/src/error.rs | 1 - .../client-libs/validator-client/Cargo.toml | 2 +- .../contracts-common/Cargo.toml | 5 +- .../contracts-common/src/dealings.rs | 6 +- common/credentials/Cargo.toml | 4 +- common/credentials/src/error.rs | 2 - common/credentials/src/lib.rs | 4 - common/credentials/src/token/bandwidth.rs | 137 ------------------ common/credentials/src/token/mod.rs | 4 - common/network-defaults/src/lib.rs | 2 +- gateway/Cargo.toml | 9 +- gateway/gateway-requests/Cargo.toml | 5 +- gateway/gateway-requests/src/types.rs | 32 +--- gateway/src/commands/init.rs | 6 - gateway/src/commands/mod.rs | 33 ++--- gateway/src/commands/run.rs | 5 - gateway/src/config/mod.rs | 4 - gateway/src/node/client_handling/bandwidth.rs | 13 -- .../connection_handler/authenticated.rs | 72 +-------- .../websocket/connection_handler/fresh.rs | 15 +- .../websocket/connection_handler/mod.rs | 1 - .../client_handling/websocket/listener.rs | 10 +- gateway/src/node/mod.rs | 14 +- nym-api/Cargo.toml | 34 ++--- nym-api/nym-api-requests/Cargo.toml | 3 +- nym-api/nym-api-requests/src/lib.rs | 1 - nym-api/src/main.rs | 35 ++--- .../src/network_monitor/monitor/preparer.rs | 11 +- nym-api/src/network_monitor/monitor/sender.rs | 18 +-- nym-api/src/network_monitor/test_route/mod.rs | 4 - nym-api/src/support/cli/mod.rs | 18 +-- nym-api/src/support/config/mod.rs | 10 -- nym-api/src/support/http/mod.rs | 9 +- nym-api/src/support/nyxd/mod.rs | 44 +++--- nym-api/src/support/storage/manager.rs | 2 - nym-api/src/support/storage/mod.rs | 2 - nym-connect/src-tauri/src/tasks.rs | 1 - 62 files changed, 211 insertions(+), 846 deletions(-) delete mode 100644 common/credentials/src/token/bandwidth.rs delete mode 100644 common/credentials/src/token/mod.rs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7dbe2874f0..f4b8f2c7df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -95,23 +95,3 @@ jobs: with: command: clippy args: --workspace --all-targets --all-features -- -D warnings - - # COCONUT stuff - - - name: Build all binaries with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: build - args: --workspace --features=coconut - - - name: Run all tests with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: test - args: --workspace --features=coconut - - - name: Run clippy with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: clippy - args: --all-targets --features=coconut -- -D warnings diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index 79eeff6e42..f9281eedf8 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -114,38 +114,6 @@ jobs: with: command: clean - # COCONUT stuff - - name: Build all binaries with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: build - args: --workspace --features=coconut - - - name: Reclaim some disk space (because Windows is being annoying) - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: clean - - - name: Run all tests with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: test - args: --workspace --features=coconut - - - name: Reclaim some disk space (because Windows is being annoying) - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: clean - - - name: Run clippy with coconut enabled - uses: actions-rs/cargo@v1 - if: ${{ matrix.rust != 'nightly' }} - with: - command: clippy - args: --workspace --all-targets --features=coconut -- -D warnings - # nym-wallet (the rust part) - name: Build nym-wallet rust code uses: actions-rs/cargo@v1 diff --git a/.github/workflows/nightly_build_release.yml b/.github/workflows/nightly_build_release.yml index 31fb1b1d4c..1ab38963e9 100644 --- a/.github/workflows/nightly_build_release.yml +++ b/.github/workflows/nightly_build_release.yml @@ -117,38 +117,6 @@ jobs: with: command: clean - # COCONUT stuff - - name: Build all binaries with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: build - args: --workspace --features=coconut - - - name: Reclaim some disk space (because Windows is being annoying) - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: clean - - - name: Run all tests with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: test - args: --workspace --features=coconut - - - name: Reclaim some disk space (because Windows is being annoying) - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: clean - - - name: Run clippy with coconut enabled - uses: actions-rs/cargo@v1 - if: ${{ matrix.rust != 'nightly' }} - with: - command: clippy - args: --workspace --all-targets --features=coconut -- -D warnings - # nym-wallet (the rust part) - name: Build nym-wallet rust code uses: actions-rs/cargo@v1 diff --git a/.github/workflows/nightly_build_release2.yml b/.github/workflows/nightly_build_release2.yml index 69e3570980..4e328d39d1 100644 --- a/.github/workflows/nightly_build_release2.yml +++ b/.github/workflows/nightly_build_release2.yml @@ -117,38 +117,6 @@ jobs: with: command: clean - # COCONUT stuff - - name: Build all binaries with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: build - args: --workspace --features=coconut - - - name: Reclaim some disk space (because Windows is being annoying) - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: clean - - - name: Run all tests with coconut enabled - uses: actions-rs/cargo@v1 - with: - command: test - args: --workspace --features=coconut - - - name: Reclaim some disk space (because Windows is being annoying) - uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} - with: - command: clean - - - name: Run clippy with coconut enabled - uses: actions-rs/cargo@v1 - if: ${{ matrix.rust != 'nightly' }} - with: - command: clippy - args: --workspace --all-targets --features=coconut -- -D warnings - # nym-wallet (the rust part) - name: Build nym-wallet rust code uses: actions-rs/cargo@v1 diff --git a/.github/workflows/wasm_client_build.yml b/.github/workflows/wasm_client_build.yml index d5f2011dd5..e71120a346 100644 --- a/.github/workflows/wasm_client_build.yml +++ b/.github/workflows/wasm_client_build.yml @@ -29,11 +29,6 @@ jobs: command: build args: --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown - - uses: actions-rs/cargo@v1 - with: - command: build - args: --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown --features=coconut - - uses: actions-rs/cargo@v1 with: command: fmt diff --git a/CHANGELOG.md b/CHANGELOG.md index f003cb0023..af9cf92aac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,15 +4,18 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// # [Unreleased] + ### Added - dkg rerun from scratch and dkg-specific epochs ([#2839]) - nym-sdk: add support for surb storage ([#2870]) - nym-sdk: enable reply-SURBs by default ([#2874]) +- remove coconut feature and unify builds ([#2890]) [#2839]: https://github.com/nymtech/nym/pull/2839 [#2870]: https://github.com/nymtech/nym/pull/2870 [#2874]: https://github.com/nymtech/nym/pull/2874 +[#2890]: https://github.com/nymtech/nym/pull/2890 # [v1.1.7] (2023-01-24) diff --git a/Cargo.lock b/Cargo.lock index cb5f65ea20..4e3b3f3e44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,7 +30,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cipher 0.3.0", "cpufeatures", "ctr 0.8.0", @@ -43,7 +43,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cipher 0.4.3", "cpufeatures", ] @@ -375,7 +375,7 @@ dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if 1.0.0", + "cfg-if", "constant_time_eq", "digest 0.10.6", ] @@ -500,12 +500,6 @@ dependencies = [ "jobserver", ] -[[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" @@ -528,7 +522,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7fc89c7c5b9e7a02dfe45cd2367bae382f9ed31c61ca8debe5f827c420a2f08" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cipher 0.4.3", "cpufeatures", ] @@ -832,7 +826,7 @@ dependencies = [ name = "config" version = "0.1.0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "handlebars", "log", "network-defaults", @@ -1052,7 +1046,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1060,7 +1054,6 @@ name = "credential" version = "0.1.0" dependencies = [ "bip39", - "cfg-if 0.1.10", "clap 4.1.3", "coconut-interface", "completions", @@ -1181,7 +1174,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", ] @@ -1191,7 +1184,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] @@ -1203,7 +1196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg 1.1.0", - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", "memoffset", "scopeguard", @@ -1215,7 +1208,7 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", ] @@ -1225,7 +1218,7 @@ version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1560,7 +1553,7 @@ version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "num_cpus", ] @@ -1570,7 +1563,7 @@ version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "hashbrown 0.12.3", "lock_api", "once_cell", @@ -1796,7 +1789,7 @@ version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -2258,7 +2251,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", @@ -2271,7 +2264,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -2836,7 +2829,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -2943,7 +2936,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "ecdsa", "elliptic-curve", "sec1", @@ -3011,7 +3004,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45ba81a1f5f24396b37211478aff7fbcd605dd4544df8dbed07b9da3c2057aee" dependencies = [ "byteorder", - "cfg-if 1.0.0", + "cfg-if", "hex", "hidapi", "ledger-transport", @@ -3110,7 +3103,7 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -3127,7 +3120,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "generator", "scoped-tls", "serde", @@ -3336,7 +3329,7 @@ dependencies = [ name = "network-defaults" version = "0.1.0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "dotenv", "hex-literal", "once_cell", @@ -3442,7 +3435,7 @@ dependencies = [ "bip39", "bs58", "build-information", - "cfg-if 1.0.0", + "cfg-if", "clap 4.1.3", "coconut-bandwidth-contract-common", "coconut-dkg-common", @@ -3562,7 +3555,7 @@ dependencies = [ "base64 0.13.1", "bip39", "bs58", - "cfg-if 1.0.0", + "cfg-if", "clap 4.1.3", "coconut-bandwidth-contract-common", "coconut-dkg-common", @@ -4097,7 +4090,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -4200,7 +4193,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "instant", "libc", "redox_syscall", @@ -4214,7 +4207,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "smallvec 1.10.0", @@ -4448,7 +4441,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "opaque-debug 0.3.0", "universal-hash", @@ -5496,7 +5489,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", @@ -5508,7 +5501,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.6", ] @@ -5519,7 +5512,7 @@ version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.6", ] @@ -5531,7 +5524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", @@ -5543,7 +5536,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.6", ] @@ -6067,7 +6060,7 @@ version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54cb4ebf3d49308b99e6e9dc95e989e2fdbdc210e4f67c39db0bb89ba927001c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "core-foundation-sys", "libc", "ntapi", @@ -6100,7 +6093,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "fastrand", "libc", "redox_syscall", @@ -6558,7 +6551,7 @@ version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -6914,7 +6907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cf88d94e969e7956d924ba70741316796177fa0c79a2c9f4ab04998d96e966e" dependencies = [ "anyhow", - "cfg-if 1.0.0", + "cfg-if", "chrono", "enum-iterator 0.8.1", "getset", @@ -6931,7 +6924,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "571b69f690c855821462709b6f41d42ceccc316fbd17b60bd06d06928cfe6a99" dependencies = [ "anyhow", - "cfg-if 1.0.0", + "cfg-if", "enum-iterator 1.2.0", "getset", "git2 0.15.0", @@ -7026,7 +7019,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] @@ -7051,7 +7044,7 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", diff --git a/Makefile b/Makefile index 558290cead..1ebe76de9b 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,10 @@ test: clippy-all cargo-test wasm fmt test-all: test cargo-test-expensive no-clippy: build cargo-test wasm fmt happy: fmt clippy-happy test -clippy-all: clippy-main clippy-coconut clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-wasm-client +clippy-all: clippy-main clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-wasm-client clippy-happy: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect -cargo-test: test-main test-contracts test-wallet test-connect test-coconut -cargo-test-expensive: test-main-expensive test-contracts-expensive test-wallet-expensive test-connect-expensive test-coconut-expensive +cargo-test: test-main test-contracts test-wallet test-connect +cargo-test-expensive: test-main-expensive test-contracts-expensive test-wallet-expensive test-connect-expensive build: build-contracts build-wallet build-main build-connect build-wasm-client fmt: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-wasm-client @@ -24,9 +24,6 @@ clippy-happy-connect: clippy-main: cargo clippy --workspace -- -D warnings -clippy-coconut: - cargo clippy --workspace --features coconut -- -D warnings - clippy-wasm: cargo clippy --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown --workspace -- -D warnings @@ -46,16 +43,9 @@ clippy-all-wasm-client: test-main: cargo test --workspace -test-coconut: - cargo test --workspace --features coconut - - test-main-expensive: cargo test --workspace -- --ignored -test-coconut-expensive: - cargo test --workspace --features coconut -- --ignored - test-contracts: cargo test --manifest-path contracts/Cargo.toml --all-features diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index 438ebd72ee..34ddb0de78 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -82,5 +82,4 @@ sqlx = { version = "0.6.2", features = ["runtime-tokio-rustls", "sqlite", "macro default = [] fs-surb-storage = ["sqlx"] wasm = ["gateway-client/wasm"] -coconut = ["gateway-client/coconut", "gateway-requests/coconut"] diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index 84bc70a985..e30c39affa 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -289,10 +289,6 @@ where if gateway_id.is_empty() { return Err(ClientCoreError::GatewayIdUnknown); } - let gateway_owner = self.gateway_config.gateway_owner.clone(); - if gateway_owner.is_empty() { - return Err(ClientCoreError::GatewayOwnerUnknown); - } let gateway_address = self.gateway_config.gateway_listener.clone(); if gateway_address.is_empty() { return Err(ClientCoreError::GatwayAddressUnknown); @@ -312,7 +308,6 @@ where gateway_address, self.key_manager.identity_keypair(), gateway_identity, - gateway_owner, shared_key, mixnet_message_sender, ack_sender, diff --git a/clients/client-core/src/init/helpers.rs b/clients/client-core/src/init/helpers.rs index cbc25000b6..546c207ac5 100644 --- a/clients/client-core/src/init/helpers.rs +++ b/clients/client-core/src/init/helpers.rs @@ -63,7 +63,6 @@ pub(super) async fn register_with_gateway( let mut gateway_client: GatewayClient = GatewayClient::new_init( gateway.clients_address(), gateway.identity_key, - gateway.owner.clone(), our_identity.clone(), timeout, ); diff --git a/clients/credential/Cargo.toml b/clients/credential/Cargo.toml index edee417191..1f65a6470c 100644 --- a/clients/credential/Cargo.toml +++ b/clients/credential/Cargo.toml @@ -7,7 +7,6 @@ edition = "2021" [dependencies] bip39 = "1.0.1" -cfg-if = "0.1" clap = { version = "4.0", features = ["cargo", "derive"] } rand = "0.7.3" serde = { version = "1.0", features = ["derive"] } @@ -25,5 +24,3 @@ network-defaults = { path = "../../common/network-defaults" } pemstore = { path = "../../common/pemstore" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } -[features] -coconut = ["credentials/coconut"] diff --git a/clients/credential/src/main.rs b/clients/credential/src/main.rs index b27571909d..83dab4fc34 100644 --- a/clients/credential/src/main.rs +++ b/clients/credential/src/main.rs @@ -1,56 +1,47 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -cfg_if::cfg_if! { - if #[cfg(feature = "coconut")] { +mod client; +mod commands; +mod error; +mod state; - mod client; - mod commands; - mod error; - mod state; +use commands::*; +use completions::fig_generate; +use config::{DATA_DIR, DB_FILE_NAME}; +use error::Result; +use network_defaults::setup_env; - use error::Result; - use network_defaults::setup_env; - use completions::fig_generate; - use commands::*; - use config::{DATA_DIR, DB_FILE_NAME}; +use clap::{CommandFactory, Parser}; - use clap::{CommandFactory, Parser}; +#[derive(Parser)] +#[clap(author = "Nymtech", version, about)] +struct Cli { + /// Path pointing to an env file that configures the client. + #[clap(short, long)] + pub(crate) config_env_file: Option, - #[derive(Parser)] - #[clap(author = "Nymtech", version, about)] - struct Cli { - /// Path pointing to an env file that configures the client. - #[clap(short, long)] - pub(crate) config_env_file: Option, - - #[clap(subcommand)] - pub(crate) command: Command, - } - - #[tokio::main] - async fn main() -> Result<()> { - let args = Cli::parse(); - setup_env(args.config_env_file.as_ref()); - let bin_name = "nym-credential-client"; - - match args.command { - Command::Run(r) => { - let db_path = r.client_home_directory.join(DATA_DIR).join(DB_FILE_NAME); - let shared_storage = credential_storage::initialise_storage(db_path).await; - - let state = deposit(&r.nyxd_url, &r.mnemonic, r.amount).await?; - get_credential(&state, shared_storage).await?; - } - Command::Completions(c) => c.generate(&mut crate::Cli::command(), bin_name), - Command::GenerateFigSpec => fig_generate(&mut crate::Cli::command(), bin_name) - } - - Ok(()) - } - } else { - fn main() { - println!("Crate only designed for coconut feature"); - } - } + #[clap(subcommand)] + pub(crate) command: Command, +} + +#[tokio::main] +async fn main() -> Result<()> { + let args = Cli::parse(); + setup_env(args.config_env_file.as_ref()); + let bin_name = "nym-credential-client"; + + match args.command { + Command::Run(r) => { + let db_path = r.client_home_directory.join(DATA_DIR).join(DB_FILE_NAME); + let shared_storage = credential_storage::initialise_storage(db_path).await; + + let state = deposit(&r.nyxd_url, &r.mnemonic, r.amount).await?; + get_credential(&state, shared_storage).await?; + } + Command::Completions(c) => c.generate(&mut crate::Cli::command(), bin_name), + Command::GenerateFigSpec => fig_generate(&mut crate::Cli::command(), bin_name), + } + + Ok(()) } diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 810655a5be..462cabdabf 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -37,11 +37,11 @@ tokio-tungstenite = "0.14" # websocket build-information = { path = "../../common/build-information" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } client-connections = { path = "../../common/client-connections" } -coconut-interface = { path = "../../common/coconut-interface", optional = true } +coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } completions = { path = "../../common/completions" } credential-storage = { path = "../../common/credential-storage" } -credentials = { path = "../../common/credentials", optional = true } +credentials = { path = "../../common/credentials" } crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} gateway-client = { path = "../../common/client-libs/gateway-client" } @@ -55,8 +55,5 @@ validator-client = { path = "../../common/client-libs/validator-client", feature version-checker = { path = "../../common/version-checker" } websocket-requests = { path = "websocket-requests" } -[features] -coconut = ["coconut-interface", "credentials", "credentials/coconut", "gateway-requests/coconut", "gateway-client/coconut", "client-core/coconut"] - [dev-dependencies] serde_json = "1.0" # for the "textsend" example diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index fca65ab8af..e3a0845223 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -30,7 +30,6 @@ pub(crate) struct Init { force_register_gateway: bool, /// Comma separated list of rest endpoints of the nyxd validators - #[cfg(feature = "coconut")] #[clap(long, alias = "nymd_validators", value_delimiter = ',')] nyxd_urls: Option>, @@ -58,7 +57,6 @@ pub(crate) struct Init { /// Set this client to work in a enabled credentials mode that would attempt to use gateway /// with bandwidth credential requirement. - #[cfg(feature = "coconut")] #[clap(long)] enabled_credentials_mode: Option, @@ -76,9 +74,7 @@ impl From for OverrideConfig { fastmode: init_config.fastmode, no_cover: init_config.no_cover, - #[cfg(feature = "coconut")] nyxd_urls: init_config.nyxd_urls, - #[cfg(feature = "coconut")] enabled_credentials_mode: init_config.enabled_credentials_mode, } } diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index f3048c8a22..e11f3eb7f9 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -58,10 +58,7 @@ pub(crate) struct OverrideConfig { port: Option, fastmode: bool, no_cover: bool, - - #[cfg(feature = "coconut")] nyxd_urls: Option>, - #[cfg(feature = "coconut")] enabled_credentials_mode: Option, } @@ -78,8 +75,8 @@ pub(crate) async fn execute(args: &Cli) -> Result<(), Box Config { - config = config +pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { + config .with_optional(Config::with_disabled_socket, args.disable_socket) .with_base(BaseConfig::with_high_default_traffic_volume, args.fastmode) .with_base(BaseConfig::with_disabled_cover_traffic, args.no_cover) @@ -89,24 +86,17 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi args.nym_apis, network_defaults::var_names::NYM_API, config::parse_urls, - ); - - #[cfg(feature = "coconut")] - { - config = config - .with_optional_custom_env_ext( - BaseConfig::with_custom_nyxd, - args.nyxd_urls, - network_defaults::var_names::NYXD, - config::parse_urls, - ) - .with_optional_ext( - BaseConfig::with_disabled_credentials, - args.enabled_credentials_mode.map(|b| !b), - ); - } - - config + ) + .with_optional_custom_env_ext( + BaseConfig::with_custom_nyxd, + args.nyxd_urls, + network_defaults::var_names::NYXD, + config::parse_urls, + ) + .with_optional_ext( + BaseConfig::with_disabled_credentials, + args.enabled_credentials_mode.map(|b| !b), + ) } #[cfg(test)] diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index 47fd3d97e8..f7e73ba6fc 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -22,7 +22,6 @@ pub(crate) struct Run { id: String, /// Comma separated list of rest endpoints of the nyxd validators - #[cfg(feature = "coconut")] #[clap(long, alias = "nymd_validators", value_delimiter = ',')] nyxd_urls: Option>, @@ -55,7 +54,6 @@ pub(crate) struct Run { /// Set this client to work in a enabled credentials mode that would attempt to use gateway /// with bandwidth credential requirement. - #[cfg(feature = "coconut")] #[clap(long)] enabled_credentials_mode: Option, } @@ -68,10 +66,7 @@ impl From for OverrideConfig { port: run_config.port, fastmode: run_config.fastmode, no_cover: run_config.no_cover, - - #[cfg(feature = "coconut")] nyxd_urls: run_config.nyxd_urls, - #[cfg(feature = "coconut")] enabled_credentials_mode: run_config.enabled_credentials_mode, } } diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 6f2fe7149b..46d71c1ab5 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -30,11 +30,11 @@ url = "2.2" build-information = { path = "../../common/build-information" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } client-connections = { path = "../../common/client-connections" } -coconut-interface = { path = "../../common/coconut-interface", optional = true } +coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } completions = { path = "../../common/completions" } credential-storage = { path = "../../common/credential-storage" } -credentials = { path = "../../common/credentials", optional = true } +credentials = { path = "../../common/credentials" } crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} gateway-client = { path = "../../common/client-libs/gateway-client" } @@ -51,5 +51,4 @@ validator-client = { path = "../../common/client-libs/validator-client", feature version-checker = { path = "../../common/version-checker" } [features] -coconut = ["coconut-interface", "credentials", "gateway-requests/coconut", "gateway-client/coconut", "credentials/coconut", "client-core/coconut"] eth = [] diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index ebe01ad24d..0f451c67ae 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -43,7 +43,6 @@ pub(crate) struct Init { force_register_gateway: bool, /// Comma separated list of rest endpoints of the nyxd validators - #[cfg(feature = "coconut")] #[clap(long, alias = "nymd_validators", value_delimiter = ',')] nyxd_urls: Option>, @@ -67,7 +66,6 @@ pub(crate) struct Init { /// Set this client to work in a enabled credentials mode that would attempt to use gateway /// with bandwidth credential requirement. - #[cfg(feature = "coconut")] #[clap(long)] enabled_credentials_mode: Option, @@ -84,10 +82,7 @@ impl From for OverrideConfig { use_anonymous_replies: init_config.use_reply_surbs, fastmode: init_config.fastmode, no_cover: init_config.no_cover, - - #[cfg(feature = "coconut")] nyxd_urls: init_config.nyxd_urls, - #[cfg(feature = "coconut")] enabled_credentials_mode: init_config.enabled_credentials_mode, } } diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index 5674a94196..8f459c25c8 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -60,10 +60,7 @@ pub(crate) struct OverrideConfig { use_anonymous_replies: Option, fastmode: bool, no_cover: bool, - - #[cfg(feature = "coconut")] nyxd_urls: Option>, - #[cfg(feature = "coconut")] enabled_credentials_mode: Option, } @@ -80,8 +77,8 @@ pub(crate) async fn execute(args: &Cli) -> Result<(), Box Config { - config = config +pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { + config .with_base(BaseConfig::with_high_default_traffic_volume, args.fastmode) .with_base(BaseConfig::with_disabled_cover_traffic, args.no_cover) .with_optional(Config::with_anonymous_replies, args.use_anonymous_replies) @@ -91,24 +88,17 @@ pub(crate) fn override_config(mut config: Config, args: OverrideConfig) -> Confi args.nym_apis, network_defaults::var_names::NYM_API, config::parse_urls, - ); - - #[cfg(feature = "coconut")] - { - config = config - .with_optional_custom_env_ext( - BaseConfig::with_custom_nyxd, - args.nyxd_urls, - network_defaults::var_names::NYXD, - config::parse_urls, - ) - .with_optional_ext( - BaseConfig::with_disabled_credentials, - args.enabled_credentials_mode.map(|b| !b), - ); - } - - config + ) + .with_optional_custom_env_ext( + BaseConfig::with_custom_nyxd, + args.nyxd_urls, + network_defaults::var_names::NYXD, + config::parse_urls, + ) + .with_optional_ext( + BaseConfig::with_disabled_credentials, + args.enabled_credentials_mode.map(|b| !b), + ) } #[cfg(test)] diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 2498ac5148..9157f62513 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -43,7 +43,6 @@ pub(crate) struct Run { gateway: Option, /// Comma separated list of rest endpoints of the nyxd validators - #[cfg(feature = "coconut")] #[clap(long, alias = "nymd_validators", value_delimiter = ',')] nyxd_urls: Option>, @@ -66,7 +65,6 @@ pub(crate) struct Run { /// Set this client to work in a enabled credentials mode that would attempt to use gateway /// with bandwidth credential requirement. - #[cfg(feature = "coconut")] #[clap(long)] enabled_credentials_mode: Option, } @@ -79,10 +77,7 @@ impl From for OverrideConfig { use_anonymous_replies: run_config.use_anonymous_replies, fastmode: run_config.fastmode, no_cover: run_config.no_cover, - - #[cfg(feature = "coconut")] nyxd_urls: run_config.nyxd_urls, - #[cfg(feature = "coconut")] enabled_credentials_mode: run_config.enabled_credentials_mode, } } diff --git a/clients/webassembly/Cargo.toml b/clients/webassembly/Cargo.toml index df17dc5e96..2ef2e30e02 100644 --- a/clients/webassembly/Cargo.toml +++ b/clients/webassembly/Cargo.toml @@ -15,7 +15,6 @@ crate-type = ["cdylib", "rlib"] [features] default = ["console_error_panic_hook"] offline-test = [] -coconut = ["coconut-interface", "credentials", "gateway-client/coconut"] [dependencies] futures = "0.3" @@ -33,12 +32,12 @@ wasm-bindgen-futures = "0.4" # internal client-core = { path = "../client-core", default-features = false, features = ["wasm"] } client-connections = { path = "../../common/client-connections" } -coconut-interface = { path = "../../common/coconut-interface", optional = true } -credentials = { path = "../../common/credentials", optional = true } +coconut-interface = { path = "../../common/coconut-interface" } +credentials = { path = "../../common/credentials" } crypto = { path = "../../common/crypto" } nymsphinx = { path = "../../common/nymsphinx" } topology = { path = "../../common/topology" } -gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm", "coconut"] } +gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm"] } validator-client = { path = "../../common/client-libs/validator-client", default-features = false } wasm-utils = { path = "../../common/wasm-utils" } task = { path = "../../common/task" } diff --git a/common/client-libs/gateway-client/Cargo.toml b/common/client-libs/gateway-client/Cargo.toml index ff65280643..86c76ad169 100644 --- a/common/client-libs/gateway-client/Cargo.toml +++ b/common/client-libs/gateway-client/Cargo.toml @@ -18,7 +18,7 @@ async-trait = { version = "0.1.51" } tokio = { version = "1.24.1", features = ["macros"] } # internal -coconut-interface = { path = "../../coconut-interface", optional = true } +coconut-interface = { path = "../../coconut-interface" } credentials = { path = "../../credentials" } crypto = { path = "../../crypto" } gateway-requests = { path = "../../../gateway/gateway-requests" } @@ -79,5 +79,4 @@ features = ["js"] #url = "2.1" [features] -coconut = ["gateway-requests/coconut", "coconut-interface", "credentials/coconut"] wasm = [] diff --git a/common/client-libs/gateway-client/src/bandwidth.rs b/common/client-libs/gateway-client/src/bandwidth.rs index 34fc308a48..9b6e5929eb 100644 --- a/common/client-libs/gateway-client/src/bandwidth.rs +++ b/common/client-libs/gateway-client/src/bandwidth.rs @@ -1,7 +1,6 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -#[cfg(feature = "coconut")] use crate::error::GatewayClientError; #[cfg(target_arch = "wasm32")] @@ -9,19 +8,17 @@ use crate::wasm_mockups::Storage; #[cfg(not(target_arch = "wasm32"))] use credential_storage::storage::Storage; -#[cfg(all(target_arch = "wasm32", feature = "coconut"))] +#[cfg(target_arch = "wasm32")] use crate::wasm_mockups::StorageError; -#[cfg(all(not(target_arch = "wasm32"), feature = "coconut"))] +#[cfg(not(target_arch = "wasm32"))] use credential_storage::error::StorageError; #[cfg(target_arch = "wasm32")] use crate::wasm_mockups::{Client, CosmWasmClient}; -#[cfg(feature = "coconut")] use std::str::FromStr; #[cfg(not(target_arch = "wasm32"))] use validator_client::{nyxd::CosmWasmClient, Client}; -#[cfg(feature = "coconut")] use { coconut_interface::Base58, credentials::coconut::{ @@ -55,7 +52,6 @@ where } } - #[cfg(feature = "coconut")] pub async fn prepare_coconut_credential( &self, ) -> Result<(coconut_interface::Credential, i64), GatewayClientError> { @@ -98,7 +94,6 @@ where )) } - #[cfg(feature = "coconut")] pub async fn consume_credential(&self, id: i64) -> Result<(), GatewayClientError> { Ok(self.storage.consume_coconut_credential(id).await?) } diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index b9e28a3852..e15b886013 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -9,6 +9,7 @@ pub use crate::packet_router::{ }; use crate::socket_state::{PartiallyDelegated, SocketState}; use crate::{cleanup_socket_message, try_decrypt_binary_message}; +use coconut_interface::Credential; use crypto::asymmetric::identity; use futures::{SinkExt, StreamExt}; use gateway_requests::authentication::encrypted_address::EncryptedAddressBytes; @@ -25,9 +26,6 @@ use std::time::Duration; use task::TaskClient; use tungstenite::protocol::Message; -#[cfg(feature = "coconut")] -use coconut_interface::Credential; - #[cfg(not(target_arch = "wasm32"))] use credential_storage::PersistentStorage; #[cfg(not(target_arch = "wasm32"))] @@ -53,7 +51,6 @@ pub struct GatewayClient { bandwidth_remaining: i64, gateway_address: String, gateway_identity: identity::PublicKey, - gateway_owner: String, local_identity: Arc, shared_key: Option>, connection: SocketState, @@ -84,7 +81,6 @@ where gateway_address: String, local_identity: Arc, gateway_identity: identity::PublicKey, - gateway_owner: String, shared_key: Option>, mixnet_message_sender: MixnetMessageSender, ack_sender: AcknowledgementSender, @@ -98,7 +94,6 @@ where bandwidth_remaining: 0, gateway_address, gateway_identity, - gateway_owner, local_identity, shared_key, connection: SocketState::NotConnected, @@ -132,7 +127,6 @@ where pub fn new_init( gateway_address: String, gateway_identity: identity::PublicKey, - gateway_owner: String, local_identity: Arc, response_timeout_duration: Duration, ) -> Self { @@ -151,7 +145,6 @@ where bandwidth_remaining: 0, gateway_address, gateway_identity, - gateway_owner, local_identity, shared_key: None, connection: SocketState::NotConnected, @@ -541,7 +534,6 @@ where } } - #[cfg(feature = "coconut")] async fn claim_coconut_bandwidth( &mut self, credential: Credential, @@ -591,28 +583,21 @@ where return self.try_claim_testnet_bandwidth().await; } - let _gateway_owner = self.gateway_owner.clone(); - - #[cfg(feature = "coconut")] let (credential, credential_id) = self .bandwidth_controller .as_ref() .unwrap() .prepare_coconut_credential() .await?; - #[cfg(not(feature = "coconut"))] - return self.try_claim_testnet_bandwidth().await; - #[cfg(feature = "coconut")] - { - self.claim_coconut_bandwidth(credential).await?; - self.bandwidth_controller - .as_ref() - .unwrap() - .consume_credential(credential_id) - .await?; - Ok(()) - } + self.claim_coconut_bandwidth(credential).await?; + self.bandwidth_controller + .as_ref() + .unwrap() + .consume_credential(credential_id) + .await?; + + Ok(()) } fn estimate_required_bandwidth(&self, packets: &[MixPacket]) -> i64 { diff --git a/common/client-libs/gateway-client/src/error.rs b/common/client-libs/gateway-client/src/error.rs index 61142d64be..82664c8fd8 100644 --- a/common/client-libs/gateway-client/src/error.rs +++ b/common/client-libs/gateway-client/src/error.rs @@ -26,7 +26,6 @@ pub enum GatewayClientError { #[error("There was a credential storage error - {0}")] CredentialStorageError(#[from] StorageError), - #[cfg(feature = "coconut")] #[error("Coconut error - {0}")] CoconutError(#[from] coconut_interface::CoconutError), diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index c6d467a0c4..0ed9f3e17a 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -30,7 +30,7 @@ futures = "0.3" coconut-interface = { path = "../../coconut-interface" } network-defaults = { path = "../../network-defaults" } -nym-api-requests = { path = "../../../nym-api/nym-api-requests", features = ["coconut"] } +nym-api-requests = { path = "../../../nym-api/nym-api-requests" } # required for nyxd-client # at some point it might be possible to make it wasm-compatible diff --git a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml index 351830cfe3..dd655d21d9 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml +++ b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml @@ -15,7 +15,4 @@ serde = { version = "1.0", features = ["derive"] } thiserror = "1" [dev-dependencies] -serde_json = "1.0.0" - -[features] -coconut = ["dkg"] \ No newline at end of file +serde_json = "1.0.0" \ No newline at end of file diff --git a/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs b/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs index 795c59849f..f28ca85ba2 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs +++ b/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs @@ -1,7 +1,7 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -#[cfg(feature = "coconut")] +#[cfg(feature = "dkg")] use dkg::{error::DkgError, Dealing}; use schemars::JsonSchema; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -70,14 +70,14 @@ impl<'de> Deserialize<'de> for ContractSafeBytes { } } -#[cfg(feature = "coconut")] +#[cfg(feature = "dkg")] impl<'a> From<&'a Dealing> for ContractSafeBytes { fn from(dealing: &'a Dealing) -> Self { ContractSafeBytes(dealing.to_bytes()) } } -#[cfg(feature = "coconut")] +#[cfg(feature = "dkg")] impl<'a> TryFrom<&'a ContractSafeBytes> for Dealing { type Error = DkgError; diff --git a/common/credentials/Cargo.toml b/common/credentials/Cargo.toml index 2f754253cc..e1669910f6 100644 --- a/common/credentials/Cargo.toml +++ b/common/credentials/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] bls12_381 = { version = "0.5", default-features = false, features = ["pairings", "alloc", "experimental"] } -cosmrs = { git = "https://github.com/neacsu/cosmos-rust", branch = "neacsu/feegrant_support", optional = true } +cosmrs = { git = "https://github.com/neacsu/cosmos-rust", branch = "neacsu/feegrant_support" } thiserror = "1.0" # I guess temporarily until we get serde support in coconut up and running @@ -19,5 +19,3 @@ validator-client = { path = "../client-libs/validator-client" } [dev-dependencies] rand = "0.7.3" -[features] -coconut = ["cosmrs"] diff --git a/common/credentials/src/error.rs b/common/credentials/src/error.rs index 86b9abc140..f1daaa6142 100644 --- a/common/credentials/src/error.rs +++ b/common/credentials/src/error.rs @@ -1,7 +1,6 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -#[cfg(feature = "coconut")] use coconut_interface::CoconutError; use crypto::asymmetric::encryption::KeyRecoveryError; use validator_client::ValidatorClientError; @@ -16,7 +15,6 @@ pub enum Error { #[error("Could not contact any validator")] NoValidatorsAvailable, - #[cfg(feature = "coconut")] #[error("Ran into a coconut error - {0}")] CoconutError(#[from] CoconutError), diff --git a/common/credentials/src/lib.rs b/common/credentials/src/lib.rs index 5eb08ed817..4f923ae059 100644 --- a/common/credentials/src/lib.rs +++ b/common/credentials/src/lib.rs @@ -1,11 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -#[cfg(feature = "coconut")] pub mod coconut; pub mod error; -#[cfg(not(feature = "coconut"))] -pub mod token; -#[cfg(feature = "coconut")] pub use coconut::utils::{obtain_aggregate_signature, obtain_aggregate_verification_key}; diff --git a/common/credentials/src/token/bandwidth.rs b/common/credentials/src/token/bandwidth.rs deleted file mode 100644 index c3e6124160..0000000000 --- a/common/credentials/src/token/bandwidth.rs +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2021 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crypto::asymmetric::identity::{PublicKey, Signature, PUBLIC_KEY_LENGTH, SIGNATURE_LENGTH}; - -use crate::error::Error; -use std::convert::TryInto; - -pub struct TokenCredential { - verification_key: PublicKey, - gateway_identity: PublicKey, - bandwidth: u64, - signature: Signature, -} - -impl TokenCredential { - pub fn new( - verification_key: PublicKey, - gateway_identity: PublicKey, - bandwidth: u64, - signature: Signature, - ) -> Self { - TokenCredential { - verification_key, - gateway_identity, - bandwidth, - signature, - } - } - - pub fn verification_key(&self) -> PublicKey { - self.verification_key - } - - pub fn gateway_identity(&self) -> PublicKey { - self.gateway_identity - } - - pub fn bandwidth(&self) -> u64 { - self.bandwidth - } - - pub fn signature_bytes(&self) -> [u8; 64] { - self.signature.to_bytes() - } - - pub fn verify_signature(&self) -> bool { - let message: Vec = self - .verification_key - .to_bytes() - .iter() - .chain(self.gateway_identity.to_bytes().iter()) - .copied() - .collect(); - self.verification_key - .verify(&message, &self.signature) - .is_ok() - } - - pub fn to_bytes(&self) -> Vec { - self.verification_key - .to_bytes() - .iter() - .chain(self.gateway_identity.to_bytes().iter()) - .chain(self.bandwidth.to_be_bytes().iter()) - .chain(self.signature.to_bytes().iter()) - .copied() - .collect() - } - - pub fn from_bytes(b: &[u8]) -> Result { - if b.len() != 2 * PUBLIC_KEY_LENGTH + 8 + SIGNATURE_LENGTH { - return Err(Error::BandwidthCredentialError); - } - let verification_key = PublicKey::from_bytes(&b[..PUBLIC_KEY_LENGTH]) - .map_err(|_| Error::BandwidthCredentialError)?; - let gateway_identity = PublicKey::from_bytes(&b[PUBLIC_KEY_LENGTH..2 * PUBLIC_KEY_LENGTH]) - .map_err(|_| Error::BandwidthCredentialError)?; - let bandwidth = u64::from_be_bytes( - b[2 * PUBLIC_KEY_LENGTH..2 * PUBLIC_KEY_LENGTH + 8] - .try_into() - // unwrapping is safe because we know we have 8 bytes - .unwrap(), - ); - let signature = Signature::from_bytes(&b[2 * PUBLIC_KEY_LENGTH + 8..]) - .map_err(|_| Error::BandwidthCredentialError)?; - Ok(TokenCredential { - verification_key, - gateway_identity, - bandwidth, - signature, - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn token_serde() { - // pre-generated, valid values - let verification_key = PublicKey::from_bytes(&[ - 103, 105, 71, 177, 149, 245, 26, 32, 73, 121, 76, 50, 94, 88, 119, 231, 91, 229, 167, - 56, 39, 62, 185, 39, 83, 246, 153, 27, 17, 155, 109, 73, - ]) - .unwrap(); - let gateway_identity = PublicKey::from_bytes(&[ - 37, 113, 137, 189, 157, 82, 35, 2, 187, 136, 61, 119, 98, 5, 245, 82, 46, 124, 67, 45, - 165, 255, 53, 222, 185, 252, 6, 148, 128, 15, 206, 19, - ]) - .unwrap(); - let signature = Signature::from_bytes(&[ - 117, 251, 162, 217, 57, 2, 50, 210, 206, 81, 236, 90, 74, 201, 69, 237, 240, 247, 214, - 158, 220, 89, 235, 222, 85, 134, 73, 73, 8, 60, 25, 39, 183, 28, 83, 193, 31, 174, 25, - 24, 38, 215, 205, 228, 159, 135, 35, 4, 171, 59, 100, 157, 12, 249, 77, 52, 143, 4, 32, - 28, 147, 70, 182, 14, - ]) - .unwrap(); - let credential = TokenCredential::new(verification_key, gateway_identity, 1024, signature); - let serialized_credential = credential.to_bytes(); - let deserialized_credential = TokenCredential::from_bytes(&serialized_credential).unwrap(); - assert_eq!( - credential.verification_key, - deserialized_credential.verification_key - ); - assert_eq!( - credential.gateway_identity, - deserialized_credential.gateway_identity - ); - assert_eq!(credential.bandwidth, deserialized_credential.bandwidth); - assert_eq!( - credential.signature.to_bytes(), - deserialized_credential.signature.to_bytes() - ); - } -} diff --git a/common/credentials/src/token/mod.rs b/common/credentials/src/token/mod.rs deleted file mode 100644 index ac23bbe001..0000000000 --- a/common/credentials/src/token/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -pub mod bandwidth; diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index 857177411e..f0d6ccce16 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -200,7 +200,7 @@ impl NymNetworkDetails { #[must_use] pub fn with_group_contract>(mut self, contract: Option) -> Self { - self.contracts.multisig_contract_address = contract.map(Into::into); + self.contracts.group_contract_address = contract.map(Into::into); self } diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index f40035d9d1..3a6f126b69 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -53,7 +53,7 @@ url = { version = "2.2", features = ["serde"] } # internal build-information = { path = "../common/build-information" } -coconut-interface = { path = "../common/coconut-interface", optional = true } +coconut-interface = { path = "../common/coconut-interface" } credentials = { path = "../common/credentials" } config = { path = "../common/config" } crypto = { path = "../common/crypto" } @@ -76,13 +76,6 @@ nym-types = { path = "../common/types" } serde_json = "1" atty = "0.2" -[features] -coconut = [ - "coconut-interface", - "gateway-requests/coconut", - "credentials/coconut", - "nym-api-requests/coconut", -] [build-dependencies] tokio = { version = "1.24.1", features = ["rt-multi-thread", "macros"] } diff --git a/gateway/gateway-requests/Cargo.toml b/gateway/gateway-requests/Cargo.toml index 68b20112fb..b277e3f2de 100644 --- a/gateway/gateway-requests/Cargo.toml +++ b/gateway/gateway-requests/Cargo.toml @@ -22,12 +22,9 @@ thiserror = "1.0" crypto = { path = "../../common/crypto" } pemstore = { path = "../../common/pemstore" } -coconut-interface = { path = "../../common/coconut-interface", optional = true } +coconut-interface = { path = "../../common/coconut-interface" } credentials = { path = "../../common/credentials" } -[features] -coconut = ["coconut-interface", "credentials/coconut"] - [dependencies.tungstenite] version = "0.13.0" default-features = false diff --git a/gateway/gateway-requests/src/types.rs b/gateway/gateway-requests/src/types.rs index 3d93800c73..3f882bedbd 100644 --- a/gateway/gateway-requests/src/types.rs +++ b/gateway/gateway-requests/src/types.rs @@ -5,6 +5,7 @@ use crate::authentication::encrypted_address::EncryptedAddressBytes; use crate::iv::IV; use crate::registration::handshake::SharedKeys; use crate::{GatewayMacSize, PROTOCOL_VERSION}; +use coconut_interface::Credential; use crypto::generic_array::typenum::Unsigned; use crypto::hmac::recompute_keyed_hmac_and_verify_tag; use crypto::symmetric::stream_cipher; @@ -20,11 +21,6 @@ use std::{ }; use tungstenite::protocol::Message; -#[cfg(feature = "coconut")] -use coconut_interface::Credential; -#[cfg(not(feature = "coconut"))] -use credentials::token::bandwidth::TokenCredential; - #[derive(Serialize, Deserialize, Debug)] #[serde(tag = "type", rename_all = "camelCase")] pub enum RegistrationHandshake { @@ -157,7 +153,6 @@ impl ClientControlRequest { } } - #[cfg(feature = "coconut")] pub fn new_enc_coconut_bandwidth_credential( credential: &Credential, shared_key: &SharedKeys, @@ -172,7 +167,6 @@ impl ClientControlRequest { } } - #[cfg(feature = "coconut")] pub fn try_from_enc_coconut_bandwidth_credential( enc_credential: Vec, shared_key: &SharedKeys, @@ -182,30 +176,6 @@ impl ClientControlRequest { Credential::from_bytes(&credential_bytes) .map_err(|_| GatewayRequestsError::MalformedEncryption) } - - #[cfg(not(feature = "coconut"))] - pub fn new_enc_token_bandwidth_credential( - credential: &TokenCredential, - shared_key: &SharedKeys, - iv: IV, - ) -> Self { - let enc_credential = shared_key.encrypt_and_tag(&credential.to_bytes(), Some(iv.inner())); - ClientControlRequest::BandwidthCredential { - enc_credential, - iv: iv.to_bytes(), - } - } - - #[cfg(not(feature = "coconut"))] - pub fn try_from_enc_token_bandwidth_credential( - enc_credential: Vec, - shared_key: &SharedKeys, - iv: IV, - ) -> Result { - let credential = shared_key.decrypt_tagged(&enc_credential, Some(iv.inner()))?; - TokenCredential::from_bytes(&credential) - .map_err(|_| GatewayRequestsError::MalformedEncryption) - } } impl From for Message { diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index afe180eb65..70f979b844 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -51,7 +51,6 @@ pub struct Init { nym_apis: Option>, /// Comma separated list of endpoints of the validator - #[cfg(feature = "coconut")] #[clap( long, alias = "validators", @@ -67,7 +66,6 @@ pub struct Init { /// Set this gateway to work only with coconut credentials; that would disallow clients to /// bypass bandwidth credential requirement - #[cfg(feature = "coconut")] #[clap(long)] only_coconut_credentials: Option, @@ -95,9 +93,7 @@ impl From for OverrideConfig { enabled_statistics: init_config.enabled_statistics, statistics_service_url: init_config.statistics_service_url, - #[cfg(feature = "coconut")] nyxd_urls: init_config.nyxd_urls, - #[cfg(feature = "coconut")] only_coconut_credentials: init_config.only_coconut_credentials, } } @@ -184,9 +180,7 @@ mod tests { mnemonic: None, statistics_service_url: None, enabled_statistics: None, - #[cfg(feature = "coconut")] nyxd_urls: None, - #[cfg(feature = "coconut")] only_coconut_credentials: None, }; std::env::set_var(BECH32_PREFIX, "n"); diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index 738fb9fdbf..d7cfcd4b9f 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -7,6 +7,7 @@ use clap::CommandFactory; use clap::Subcommand; use completions::{fig_generate, ArgShell}; use config::OptionalSet; +use network_defaults::var_names::NYXD; use network_defaults::var_names::{BECH32_PREFIX, NYM_API, STATISTICS_SERVICE_DOMAIN_ADDRESS}; use std::error::Error; use std::net::IpAddr; @@ -56,10 +57,7 @@ pub(crate) struct OverrideConfig { statistics_service_url: Option, nym_apis: Option>, mnemonic: Option, - - #[cfg(feature = "coconut")] nyxd_urls: Option>, - #[cfg(feature = "coconut")] only_coconut_credentials: Option, } @@ -119,24 +117,17 @@ pub(crate) fn override_config( ensure_correct_bech32_prefix, )? .with_optional(Config::with_custom_persistent_store, args.datastore) - .with_optional(Config::with_cosmos_mnemonic, args.mnemonic); - - #[cfg(feature = "coconut")] - { - use network_defaults::var_names::NYXD; - - config = config - .with_optional_custom_env( - Config::with_custom_validator_nyxd, - args.nyxd_urls, - NYXD, - config::parse_urls, - ) - .with_optional( - Config::with_only_coconut_credentials, - args.only_coconut_credentials, - ); - } + .with_optional(Config::with_cosmos_mnemonic, args.mnemonic) + .with_optional_custom_env( + Config::with_custom_validator_nyxd, + args.nyxd_urls, + NYXD, + config::parse_urls, + ) + .with_optional( + Config::with_only_coconut_credentials, + args.only_coconut_credentials, + ); Ok(config) } diff --git a/gateway/src/commands/run.rs b/gateway/src/commands/run.rs index 585e97a5eb..d7d864193c 100644 --- a/gateway/src/commands/run.rs +++ b/gateway/src/commands/run.rs @@ -49,7 +49,6 @@ pub struct Run { nym_apis: Option>, /// Comma separated list of endpoints of the validator - #[cfg(feature = "coconut")] #[clap( long, alias = "validators", @@ -65,7 +64,6 @@ pub struct Run { /// Set this gateway to work only with coconut credentials; that would disallow clients to /// bypass bandwidth credential requirement - #[cfg(feature = "coconut")] #[clap(long)] only_coconut_credentials: Option, @@ -92,10 +90,7 @@ impl From for OverrideConfig { enabled_statistics: run_config.enabled_statistics, statistics_service_url: run_config.statistics_service_url, - - #[cfg(feature = "coconut")] nyxd_urls: run_config.nyxd_urls, - #[cfg(feature = "coconut")] only_coconut_credentials: run_config.only_coconut_credentials, } } diff --git a/gateway/src/config/mod.rs b/gateway/src/config/mod.rs index 67e4b8d8bf..6f7f937594 100644 --- a/gateway/src/config/mod.rs +++ b/gateway/src/config/mod.rs @@ -128,7 +128,6 @@ impl Config { self } - #[cfg(feature = "coconut")] pub fn with_only_coconut_credentials(mut self, only_coconut_credentials: bool) -> Self { self.gateway.only_coconut_credentials = only_coconut_credentials; self @@ -149,7 +148,6 @@ impl Config { self } - #[cfg(feature = "coconut")] pub fn with_custom_validator_nyxd(mut self, validator_nyxd_urls: Vec) -> Self { self.gateway.nyxd_urls = validator_nyxd_urls; self @@ -237,12 +235,10 @@ impl Config { self.gateway.nym_api_urls.clone() } - #[cfg(feature = "coconut")] pub fn get_nyxd_urls(&self) -> Vec { self.gateway.nyxd_urls.clone() } - #[cfg(feature = "coconut")] pub fn get_cosmos_mnemonic(&self) -> bip39::Mnemonic { self.gateway.cosmos_mnemonic.clone() } diff --git a/gateway/src/node/client_handling/bandwidth.rs b/gateway/src/node/client_handling/bandwidth.rs index e88b531f83..34e46b1b78 100644 --- a/gateway/src/node/client_handling/bandwidth.rs +++ b/gateway/src/node/client_handling/bandwidth.rs @@ -1,10 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -#[cfg(feature = "coconut")] use coconut_interface::Credential; -#[cfg(not(feature = "coconut"))] -use credentials::token::bandwidth::TokenCredential; pub struct Bandwidth { value: u64, @@ -16,7 +13,6 @@ impl Bandwidth { } } -#[cfg(feature = "coconut")] impl From for Bandwidth { fn from(credential: Credential) -> Self { let token_value = credential.voucher_value(); @@ -26,12 +22,3 @@ impl From for Bandwidth { } } } - -#[cfg(not(feature = "coconut"))] -impl From for Bandwidth { - fn from(credential: TokenCredential) -> Self { - Bandwidth { - value: credential.bandwidth(), - } - } -} diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index 948a2187fd..a86e89073a 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -52,23 +52,18 @@ pub(crate) enum RequestHandlingError { #[error("Nyxd Error - {0}")] NyxdError(#[from] validator_client::nyxd::error::NyxdError), - #[cfg(feature = "coconut")] #[error("Validator API error - {0}")] APIError(#[from] validator_client::ValidatorClientError), - #[cfg(feature = "coconut")] #[error("Not enough nym API endpoints provided. Needed {needed}, received {received}")] NotEnoughNymAPIs { received: usize, needed: usize }, - #[cfg(feature = "coconut")] #[error("There was a problem with the proposal id: {reason}")] ProposalIdError { reason: String }, - #[cfg(feature = "coconut")] #[error("Coconut interface error - {0}")] CoconutInterfaceError(#[from] coconut_interface::error::CoconutInterfaceError), - #[cfg(feature = "coconut")] #[error("Credential error - {0}")] CredentialError(#[from] credentials::error::Error), } @@ -192,7 +187,6 @@ where } } - #[cfg(feature = "coconut")] /// Tries to handle the received bandwidth request by checking correctness of the received data /// and if successful, increases client's bandwidth by an appropriate amount. /// @@ -200,7 +194,7 @@ where /// /// * `enc_credential`: raw encrypted bandwidth credential to verify. /// * `iv`: fresh iv used for the credential. - async fn handle_coconut_bandwidth( + async fn handle_bandwidth( &mut self, enc_credential: Vec, iv: Vec, @@ -263,70 +257,6 @@ where Ok(ServerResponse::Bandwidth { available_total }) } - #[cfg(not(feature = "coconut"))] - /// Tries to handle the received bandwidth request by checking correctness of the received data - /// and if successful, increases client's bandwidth by an appropriate amount. - /// - /// # Arguments - /// - /// * `enc_credential`: raw encrypted bandwidth credential to verify. - /// * `iv`: fresh iv used for the credential. - async fn handle_token_bandwidth( - &mut self, - enc_credential: Vec, - iv: Vec, - ) -> Result { - let iv = IV::try_from_bytes(&iv)?; - let credential = ClientControlRequest::try_from_enc_token_bandwidth_credential( - enc_credential, - &self.client.shared_keys, - iv, - )?; - if !self - .inner - .check_local_identity(&credential.gateway_identity()) - { - return Err(RequestHandlingError::InvalidBandwidthCredential( - String::from("gateway"), - )); - } - - if !credential.verify_signature() { - return Err(RequestHandlingError::InvalidBandwidthCredential( - String::from("gateway"), - )); - } - - let bandwidth = Bandwidth::from(credential); - let bandwidth_value = bandwidth.value(); - - if bandwidth_value > i64::MAX as u64 { - // note that this would have represented more than 1 exabyte, - // which is like 125,000 worth of hard drives so I don't think we have - // to worry about it for now... - warn!("Somehow we received bandwidth value higher than 9223372036854775807. We don't really want to deal with this now"); - return Err(RequestHandlingError::UnsupportedBandwidthValue( - bandwidth_value, - )); - } - - self.increase_bandwidth(bandwidth_value as i64).await?; - let available_total = self.get_available_bandwidth().await?; - - Ok(ServerResponse::Bandwidth { available_total }) - } - - async fn handle_bandwidth( - &mut self, - enc_credential: Vec, - iv: Vec, - ) -> Result { - #[cfg(feature = "coconut")] - return self.handle_coconut_bandwidth(enc_credential, iv).await; - #[cfg(not(feature = "coconut"))] - return self.handle_token_bandwidth(enc_credential, iv).await; - } - async fn handle_claim_testnet_bandwidth( &mut self, ) -> Result { diff --git a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs index 3f9079fac0..527d17805a 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 use crate::node::client_handling::active_clients::ActiveClientsStore; -#[cfg(feature = "coconut")] use crate::node::client_handling::websocket::connection_handler::coconut::CoconutVerifier; use crate::node::client_handling::websocket::connection_handler::{ AuthenticatedHandler, ClientDetails, InitialAuthResult, SocketStream, @@ -75,8 +74,6 @@ pub(crate) struct FreshHandler { pub(crate) outbound_mix_sender: MixForwardingSender, pub(crate) socket_connection: SocketStream, pub(crate) storage: St, - - #[cfg(feature = "coconut")] pub(crate) coconut_verifier: Arc, } @@ -98,7 +95,7 @@ where local_identity: Arc, storage: St, active_clients_store: ActiveClientsStore, - #[cfg(feature = "coconut")] coconut_verifier: Arc, + coconut_verifier: Arc, ) -> Self { FreshHandler { rng, @@ -108,20 +105,10 @@ where socket_connection: SocketStream::RawTcp(conn), local_identity, storage, - #[cfg(feature = "coconut")] coconut_verifier, } } - #[cfg(not(feature = "coconut"))] - /// Check that the local identity matches a given identity. - pub(crate) fn check_local_identity( - &self, - identity: &crypto::asymmetric::identity::PublicKey, - ) -> bool { - self.local_identity.public_key().eq(identity) - } - /// Attempts to perform websocket handshake with the remote and upgrades the raw TCP socket /// to the framed WebSocket. pub(crate) async fn perform_websocket_handshake(&mut self) -> Result<(), WsError> diff --git a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs index 6cdfeacb32..7c42fee2b2 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs @@ -15,7 +15,6 @@ pub(crate) use self::authenticated::AuthenticatedHandler; pub(crate) use self::fresh::FreshHandler; mod authenticated; -#[cfg(feature = "coconut")] pub(crate) mod coconut; mod fresh; diff --git a/gateway/src/node/client_handling/websocket/listener.rs b/gateway/src/node/client_handling/websocket/listener.rs index a50f07f1d8..3fba1b389e 100644 --- a/gateway/src/node/client_handling/websocket/listener.rs +++ b/gateway/src/node/client_handling/websocket/listener.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::node::client_handling::active_clients::ActiveClientsStore; +use crate::node::client_handling::websocket::connection_handler::coconut::CoconutVerifier; use crate::node::client_handling::websocket::connection_handler::FreshHandler; use crate::node::storage::Storage; use crypto::asymmetric::identity; @@ -13,15 +14,10 @@ use std::process; use std::sync::Arc; use tokio::task::JoinHandle; -#[cfg(feature = "coconut")] -use crate::node::client_handling::websocket::connection_handler::coconut::CoconutVerifier; - pub(crate) struct Listener { address: SocketAddr, local_identity: Arc, only_coconut_credentials: bool, - - #[cfg(feature = "coconut")] pub(crate) coconut_verifier: Arc, } @@ -30,13 +26,12 @@ impl Listener { address: SocketAddr, local_identity: Arc, only_coconut_credentials: bool, - #[cfg(feature = "coconut")] coconut_verifier: Arc, + coconut_verifier: Arc, ) -> Self { Listener { address, local_identity, only_coconut_credentials, - #[cfg(feature = "coconut")] coconut_verifier, } } @@ -81,7 +76,6 @@ impl Listener { Arc::clone(&self.local_identity), storage.clone(), active_clients_store.clone(), - #[cfg(feature = "coconut")] Arc::clone(&self.coconut_verifier), ); let shutdown = shutdown.clone(); diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index 96309c082a..01b18dada0 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -8,6 +8,7 @@ use crate::config::Config; use crate::error::GatewayError; use crate::node::client_handling::active_clients::ActiveClientsStore; use crate::node::client_handling::websocket; +use crate::node::client_handling::websocket::connection_handler::coconut::CoconutVerifier; use crate::node::mixnet_handling::receiver::connection_handler::ConnectionHandler; use crate::node::statistics::collector::GatewayStatisticsCollector; use crate::node::storage::Storage; @@ -16,6 +17,7 @@ use colored::Colorize; use crypto::asymmetric::{encryption, identity}; use log::*; use mixnet_client::forwarder::{MixForwardingSender, PacketForwarder}; +use network_defaults::NymNetworkDetails; use rand::seq::SliceRandom; use rand::thread_rng; use statistics_common::collector::StatisticsSender; @@ -24,12 +26,6 @@ use std::net::SocketAddr; use std::process; use std::sync::Arc; use task::{TaskClient, TaskManager}; - -#[cfg(feature = "coconut")] -use crate::node::client_handling::websocket::connection_handler::coconut::CoconutVerifier; -#[cfg(feature = "coconut")] -use network_defaults::NymNetworkDetails; -#[cfg(feature = "coconut")] use validator_client::Client; pub(crate) mod client_handling; @@ -190,7 +186,7 @@ where forwarding_channel: MixForwardingSender, active_clients_store: ActiveClientsStore, shutdown: TaskClient, - #[cfg(feature = "coconut")] coconut_verifier: Arc, + coconut_verifier: Arc, ) { info!("Starting client [web]socket listener..."); @@ -203,7 +199,6 @@ where listening_address, Arc::clone(&self.identity_keypair), self.config.get_only_coconut_credentials(), - #[cfg(feature = "coconut")] coconut_verifier, ) .start( @@ -248,7 +243,6 @@ where validator_client::NymApiClient::new(nym_api.clone()) } - #[cfg(feature = "coconut")] fn random_nyxd_client( &self, ) -> validator_client::Client { @@ -316,7 +310,6 @@ where let shutdown = TaskManager::new(10); - #[cfg(feature = "coconut")] let coconut_verifier = { let nyxd_client = self.random_nyxd_client(); CoconutVerifier::new(nyxd_client) @@ -348,7 +341,6 @@ where mix_forwarding_channel, active_clients_store, shutdown.subscribe(), - #[cfg(feature = "coconut")] Arc::new(coconut_verifier), ); diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 5b585b5b05..ea1b70f0e5 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -16,7 +16,7 @@ rust-version = "1.56" [dependencies] async-trait = "0.1.52" -bs58 = {version = "0.4.0", optional = true } +bs58 = {version = "0.4.0" } bip39 = "1" cfg-if = "1.0" clap = { version = "4.0", features = ["cargo", "derive"] } @@ -67,26 +67,26 @@ schemars = { version = "0.8", features = ["preserve_order"] } ## internal build-information = { path = "../common/build-information" } coconut-bandwidth-contract-common = { path = "../common/cosmwasm-smart-contracts/coconut-bandwidth-contract" } -coconut-dkg-common = { path = "../common/cosmwasm-smart-contracts/coconut-dkg", optional = true } -coconut-interface = { path = "../common/coconut-interface", optional = true } +coconut-dkg-common = { path = "../common/cosmwasm-smart-contracts/coconut-dkg" } +coconut-interface = { path = "../common/coconut-interface" } config = { path = "../common/config" } cosmwasm-std = "1.0.0" credential-storage = { path = "../common/credential-storage" } -credentials = { path = "../common/credentials", optional = true } +credentials = { path = "../common/credentials" } crypto = { path = "../common/crypto" } logging = { path = "../common/logging"} -cw3 = { version = "0.13.4", optional = true } -cw4 = { version = "0.13.4", optional = true } -dkg = { path = "../common/crypto/dkg", optional = true } +cw3 = { version = "0.13.4" } +cw4 = { version = "0.13.4" } +dkg = { path = "../common/crypto/dkg" } gateway-client = { path = "../common/client-libs/gateway-client" } inclusion-probability = { path = "../common/inclusion-probability" } mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet-contract" } vesting-contract-common = { path = "../common/cosmwasm-smart-contracts/vesting-contract" } -contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common", features = ["coconut"] } +contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common", features = ["dkg"] } multisig-contract-common = { path = "../common/cosmwasm-smart-contracts/multisig-contract" } -nymcoconut = { path = "../common/nymcoconut", optional = true } +nymcoconut = { path = "../common/nymcoconut" } nymsphinx = { path = "../common/nymsphinx" } -pemstore = { path = "../common/pemstore", optional = true } +pemstore = { path = "../common/pemstore" } task = { path = "../common/task" } topology = { path = "../common/topology" } nym-api-requests = { path = "nym-api-requests" } @@ -96,20 +96,6 @@ validator-client = { path = "../common/client-libs/validator-client", features = version-checker = { path = "../common/version-checker" } [features] -coconut = [ - "coconut-interface", - "credentials", - "cw3", - "cw4", - "gateway-client/coconut", - "credentials/coconut", - "nym-api-requests/coconut", - "nymcoconut", - "coconut-dkg-common", - "dkg", - "bs58", - "pemstore", -] no-reward = [] generate-ts = ["ts-rs"] diff --git a/nym-api/nym-api-requests/Cargo.toml b/nym-api/nym-api-requests/Cargo.toml index 6787dcacfa..1524142960 100644 --- a/nym-api/nym-api-requests/Cargo.toml +++ b/nym-api/nym-api-requests/Cargo.toml @@ -14,10 +14,9 @@ schemars = { version = "0.8", features = ["preserve_order"] } serde = { version = "1.0", features = ["derive"] } ts-rs = { version = "6.1.2", optional = true } -coconut-interface = { path = "../../common/coconut-interface", optional = true } +coconut-interface = { path = "../../common/coconut-interface" } mixnet-contract-common = { path= "../../common/cosmwasm-smart-contracts/mixnet-contract" } [features] default = [] -coconut = ["coconut-interface"] generate-ts = ["ts-rs"] diff --git a/nym-api/nym-api-requests/src/lib.rs b/nym-api/nym-api-requests/src/lib.rs index 7f211067ca..cb0bc32f63 100644 --- a/nym-api/nym-api-requests/src/lib.rs +++ b/nym-api/nym-api-requests/src/lib.rs @@ -4,7 +4,6 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -#[cfg(feature = "coconut")] pub mod coconut; pub mod models; diff --git a/nym-api/src/main.rs b/nym-api/src/main.rs index 8227801da9..4258fe53c1 100644 --- a/nym-api/src/main.rs +++ b/nym-api/src/main.rs @@ -15,31 +15,25 @@ use ::config::defaults::setup_env; use anyhow::Result; use circulating_supply_api::cache::CirculatingSupplyCache; use clap::Parser; +use coconut::dkg::controller::DkgController; use config::NymConfig; use log::info; use logging::setup_logging; use node_status_api::NodeStatusCache; use nym_contract_cache::cache::NymContractCache; +use rand::rngs::OsRng; use std::error::Error; use support::{http, nyxd}; use task::TaskManager; -#[cfg(feature = "coconut")] -use coconut::dkg::controller::DkgController; - -#[cfg(feature = "coconut")] -use rand::rngs::OsRng; - mod circulating_supply_api; +mod coconut; mod epoch_operations; mod network_monitor; pub(crate) mod node_status_api; pub(crate) mod nym_contract_cache; pub(crate) mod support; -#[cfg(feature = "coconut")] -mod coconut; - struct ShutdownHandles { task_manager_handle: TaskManager, rocket_handle: rocket::Shutdown, @@ -68,9 +62,6 @@ async fn start_nym_api_tasks( let nyxd_client = nyxd::Client::new(&config); let mix_denom = nyxd_client.chain_details().await.mix_denom.base; - // TODO: question to @BN: why are we creating a fresh coconut keypair here every time as opposed - // to using some persistent keys? - #[cfg(feature = "coconut")] let coconut_keypair = coconut::keypair::KeyPair::new(); // let's build our rocket! @@ -78,7 +69,6 @@ async fn start_nym_api_tasks( &config, mix_denom, nyxd_client.clone(), - #[cfg(feature = "coconut")] coconut_keypair.clone(), ) .await?; @@ -120,15 +110,16 @@ async fn start_nym_api_tasks( ); // start dkg task - #[cfg(feature = "coconut")] - DkgController::start( - &config, - nyxd_client.clone(), - coconut_keypair, - OsRng, - &shutdown, - ) - .await?; + if config.get_coconut_signer_enabled() { + DkgController::start( + &config, + nyxd_client.clone(), + coconut_keypair, + OsRng, + &shutdown, + ) + .await?; + } // and then only start the uptime updater (and the monitor itself, duh) // if the monitoring if it's enabled diff --git a/nym-api/src/network_monitor/monitor/preparer.rs b/nym-api/src/network_monitor/monitor/preparer.rs index d8ca980635..4cff6f31e6 100644 --- a/nym-api/src/network_monitor/monitor/preparer.rs +++ b/nym-api/src/network_monitor/monitor/preparer.rs @@ -380,7 +380,6 @@ impl PacketPreparer { GatewayPackets::new( route.gateway_clients_address(), route.gateway_identity(), - route.gateway_owner(), mix_packets, ) } @@ -453,7 +452,6 @@ impl PacketPreparer { let recipient = self.create_packet_sender(test_route.gateway()); let gateway_identity = test_route.gateway_identity(); let gateway_address = test_route.gateway_clients_address(); - let gateway_owner = test_route.gateway_owner(); // it's actually going to be a tiny bit more due to gateway testing, but it's a good enough approximation let mut mix_packets = Vec::with_capacity(mixnodes.len() * self.per_node_test_packets); @@ -471,9 +469,7 @@ impl PacketPreparer { let gateway_packets = all_gateway_packets .entry(gateway_identity.to_bytes()) - .or_insert_with(|| { - GatewayPackets::empty(gateway_address, gateway_identity, gateway_owner) - }); + .or_insert_with(|| GatewayPackets::empty(gateway_address, gateway_identity)); gateway_packets.push_packets(mix_packets); // and for each gateway... @@ -482,7 +478,6 @@ impl PacketPreparer { let test_packet = TestPacket::from_gateway(gateway, test_route.id(), test_nonce); let gateway_identity = gateway.identity_key; let gateway_address = gateway.clients_address(); - let gateway_owner = gateway.owner.clone(); let recipient = self.create_packet_sender(gateway); let topology = test_route.substitute_gateway(gateway); // produce n mix packets @@ -495,9 +490,7 @@ impl PacketPreparer { // or create a new one let gateway_packets = all_gateway_packets .entry(gateway_identity.to_bytes()) - .or_insert_with(|| { - GatewayPackets::empty(gateway_address, gateway_identity, gateway_owner) - }); + .or_insert_with(|| GatewayPackets::empty(gateway_address, gateway_identity)); gateway_packets.push_packets(gateway_mix_packets); } } diff --git a/nym-api/src/network_monitor/monitor/sender.rs b/nym-api/src/network_monitor/monitor/sender.rs index bcb099adf4..9fde853c77 100644 --- a/nym-api/src/network_monitor/monitor/sender.rs +++ b/nym-api/src/network_monitor/monitor/sender.rs @@ -39,9 +39,6 @@ pub(crate) struct GatewayPackets { /// Public key of the target gateway. pub(crate) pub_key: identity::PublicKey, - /// The address of the gateway owner. - pub(crate) gateway_owner: String, - /// All the packets that are going to get sent to the gateway. pub(crate) packets: Vec, } @@ -50,26 +47,19 @@ impl GatewayPackets { pub(crate) fn new( clients_address: String, pub_key: identity::PublicKey, - gateway_owner: String, packets: Vec, ) -> Self { GatewayPackets { clients_address, pub_key, - gateway_owner, packets, } } - pub(crate) fn empty( - clients_address: String, - pub_key: identity::PublicKey, - gateway_owner: String, - ) -> Self { + pub(crate) fn empty(clients_address: String, pub_key: identity::PublicKey) -> Self { GatewayPackets { clients_address, pub_key, - gateway_owner, packets: Vec::new(), } } @@ -182,7 +172,6 @@ impl PacketSender { fn new_gateway_client_handle( address: String, identity: identity::PublicKey, - owner: String, fresh_gateway_client_data: &FreshGatewayClientData, ) -> ( GatewayClientHandle, @@ -200,7 +189,6 @@ impl PacketSender { address, Arc::clone(&fresh_gateway_client_data.local_identity), identity, - owner, None, message_sender, ack_sender, @@ -280,7 +268,6 @@ impl PacketSender { async fn create_new_gateway_client_handle_and_authenticate( address: String, identity: identity::PublicKey, - owner: String, fresh_gateway_client_data: &FreshGatewayClientData, gateway_connection_timeout: Duration, ) -> Option<( @@ -288,7 +275,7 @@ impl PacketSender { (MixnetMessageReceiver, AcknowledgementReceiver), )> { let (new_client, (message_receiver, ack_receiver)) = - Self::new_gateway_client_handle(address, identity, owner, fresh_gateway_client_data); + Self::new_gateway_client_handle(address, identity, fresh_gateway_client_data); // Put this in timeout in case the gateway has incorrectly set their ulimit and our connection // gets stuck in their TCP queue and just hangs on our end but does not terminate @@ -365,7 +352,6 @@ impl PacketSender { Self::create_new_gateway_client_handle_and_authenticate( packets.clients_address, packets.pub_key, - packets.gateway_owner, &fresh_gateway_client_data, gateway_connection_timeout, ) diff --git a/nym-api/src/network_monitor/test_route/mod.rs b/nym-api/src/network_monitor/test_route/mod.rs index ddc420e749..3fbf89854f 100644 --- a/nym-api/src/network_monitor/test_route/mod.rs +++ b/nym-api/src/network_monitor/test_route/mod.rs @@ -66,10 +66,6 @@ impl TestRoute { self.gateway().identity_key } - pub(crate) fn gateway_owner(&self) -> String { - self.gateway().owner.clone() - } - pub(crate) fn topology(&self) -> &NymTopology { &self.nodes } diff --git a/nym-api/src/support/cli/mod.rs b/nym-api/src/support/cli/mod.rs index 264e9a66c4..674e29fc1c 100644 --- a/nym-api/src/support/cli/mod.rs +++ b/nym-api/src/support/cli/mod.rs @@ -93,12 +93,10 @@ pub(crate) struct CliArgs { pub(crate) enabled_credentials_mode: Option, /// Announced address where coconut clients will connect. - #[cfg(feature = "coconut")] #[clap(long)] pub(crate) announce_address: Option, /// Flag to indicate whether coconut signer authority is enabled on this API - #[cfg(feature = "coconut")] #[clap(long, requires = "mnemonic", requires = "announce_address")] pub(crate) enable_coconut: Option, } @@ -123,7 +121,6 @@ pub(crate) fn build_config(args: CliArgs) -> Result { let config = override_config(config_from_file, args); - #[cfg(feature = "coconut")] if !_already_initialized { crate::coconut::dkg::controller::init_keypair(&config)?; } @@ -140,7 +137,7 @@ pub(crate) fn override_config(mut config: Config, args: CliArgs) -> Config { config = config.with_id(&id); } - config = config + config .with_optional(Config::with_custom_nyxd_validator, args.nyxd_validator) .with_optional_env( Config::with_custom_mixnet_contract, @@ -170,14 +167,7 @@ pub(crate) fn override_config(mut config: Config, args: CliArgs) -> Config { .with_optional( Config::with_disabled_credentials_mode, args.enabled_credentials_mode.map(|b| !b), - ); - - #[cfg(feature = "coconut")] - { - config = config - .with_optional(Config::with_announce_address, args.announce_address) - .with_optional(Config::with_coconut_signer_enabled, args.enable_coconut); - } - - config + ) + .with_optional(Config::with_announce_address, args.announce_address) + .with_optional(Config::with_coconut_signer_enabled, args.enable_coconut) } diff --git a/nym-api/src/support/config/mod.rs b/nym-api/src/support/config/mod.rs index fae7d281c0..50bdb34826 100644 --- a/nym-api/src/support/config/mod.rs +++ b/nym-api/src/support/config/mod.rs @@ -416,7 +416,6 @@ impl Config { self } - #[cfg(feature = "coconut")] pub fn with_coconut_signer_enabled(mut self, enabled: bool) -> Self { self.coconut_signer.enabled = enabled; self @@ -427,7 +426,6 @@ impl Config { self } - #[cfg(feature = "coconut")] pub fn with_announce_address(mut self, announce_address: Url) -> Self { self.base.announce_address = announce_address; self @@ -471,7 +469,6 @@ impl Config { self.network_monitor.enabled } - #[cfg(feature = "coconut")] pub fn get_coconut_signer_enabled(&self) -> bool { self.coconut_signer.enabled } @@ -492,7 +489,6 @@ impl Config { self.base.local_validator.clone() } - #[cfg(feature = "coconut")] pub fn get_announce_address(&self) -> Url { self.base.announce_address.clone() } @@ -573,32 +569,26 @@ impl Config { self.node_status_api.database_path.clone() } - #[cfg(feature = "coconut")] pub fn persistent_state_path(&self) -> PathBuf { self.coconut_signer.dkg_persistent_state_path.clone() } - #[cfg(feature = "coconut")] pub fn verification_key_path(&self) -> PathBuf { self.coconut_signer.verification_key_path.clone() } - #[cfg(feature = "coconut")] pub fn secret_key_path(&self) -> PathBuf { self.coconut_signer.secret_key_path.clone() } - #[cfg(feature = "coconut")] pub fn decryption_key_path(&self) -> PathBuf { self.coconut_signer.decryption_key_path.clone() } - #[cfg(feature = "coconut")] pub fn public_key_with_proof_path(&self) -> PathBuf { self.coconut_signer.public_key_with_proof_path.clone() } - #[cfg(feature = "coconut")] pub fn get_dkg_contract_polling_rate(&self) -> Duration { self.coconut_signer.dkg_contract_polling_rate } diff --git a/nym-api/src/support/http/mod.rs b/nym-api/src/support/http/mod.rs index 387f0005a9..139b00d8e7 100644 --- a/nym-api/src/support/http/mod.rs +++ b/nym-api/src/support/http/mod.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::circulating_supply_api::cache::CirculatingSupplyCache; +use crate::coconut::{self, comm::QueryCommunicationChannel, InternalSignRequest}; use crate::node_status_api::{self, NodeStatusCache}; use crate::nym_contract_cache::cache::NymContractCache; use crate::support::config::Config; @@ -14,16 +15,13 @@ use rocket_cors::{AllowedHeaders, AllowedOrigins, Cors}; use rocket_okapi::mount_endpoints_and_merged_docs; use rocket_okapi::swagger_ui::make_swagger_ui; -#[cfg(feature = "coconut")] -use crate::coconut::{self, comm::QueryCommunicationChannel, InternalSignRequest}; - pub(crate) mod openapi; pub(crate) async fn setup_rocket( config: &Config, mix_denom: String, _nyxd_client: nyxd::Client, - #[cfg(feature = "coconut")] coconut_keypair: coconut::keypair::KeyPair, + coconut_keypair: coconut::keypair::KeyPair, ) -> anyhow::Result> { let openapi_settings = rocket_okapi::settings::OpenApiSettings::default(); let mut rocket = rocket::build(); @@ -47,13 +45,12 @@ pub(crate) async fn setup_rocket( // This is not a very nice approach. A lazy value would be more suitable, but that's still // a nightly feature: https://github.com/rust-lang/rust/issues/74465 - let storage = if cfg!(feature = "coconut") || config.get_network_monitor_enabled() { + let storage = if config.get_coconut_signer_enabled() || config.get_network_monitor_enabled() { Some(storage::NymApiStorage::init(config.get_node_status_api_database_path()).await?) } else { None }; - #[cfg(feature = "coconut")] let rocket = if config.get_coconut_signer_enabled() { let comm_channel = QueryCommunicationChannel::new(_nyxd_client.clone()); rocket.attach(InternalSignRequest::stage( diff --git a/nym-api/src/support/nyxd/mod.rs b/nym-api/src/support/nyxd/mod.rs index 7c8b8be75d..438d0ac369 100644 --- a/nym-api/src/support/nyxd/mod.rs +++ b/nym-api/src/support/nyxd/mod.rs @@ -1,10 +1,21 @@ // Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::coconut::error::CoconutError; use crate::epoch_operations::MixnodeToReward; use crate::support::config::Config; use anyhow::Result; +use async_trait::async_trait; +use coconut_bandwidth_contract_common::spend_credential::SpendCredentialResponse; +use coconut_dkg_common::{ + dealer::{ContractDealing, DealerDetails, DealerDetailsResponse}, + types::{EncodedBTEPublicKeyWithProof, Epoch, EpochId}, + verification_key::{ContractVKShare, VerificationKeyShare}, +}; use config::defaults::{ChainDetails, NymNetworkDetails, DEFAULT_NYM_API_PORT}; +use contracts_common::dealings::ContractSafeBytes; +use cw3::ProposalResponse; +use cw4::MemberResponse; use mixnet_contract_common::families::{Family, FamilyHead}; use mixnet_contract_common::mixnode::MixNodeDetails; use mixnet_contract_common::reward_params::RewardingParams; @@ -16,32 +27,6 @@ use std::sync::Arc; use tokio::sync::RwLock; use validator_client::nyxd::error::NyxdError; use validator_client::nyxd::traits::{MixnetQueryClient, MixnetSigningClient}; -use validator_client::nyxd::{ - hash::{Hash, SHA256_HASH_SIZE}, - AccountId, Coin, SigningNyxdClient, TendermintTime, VestingQueryClient, -}; -use validator_client::ValidatorClientError; -use vesting_contract_common::AccountVestingCoins; - -#[cfg(feature = "coconut")] -use crate::coconut::error::CoconutError; -#[cfg(feature = "coconut")] -use async_trait::async_trait; -#[cfg(feature = "coconut")] -use coconut_bandwidth_contract_common::spend_credential::SpendCredentialResponse; -#[cfg(feature = "coconut")] -use coconut_dkg_common::{ - dealer::{ContractDealing, DealerDetails, DealerDetailsResponse}, - types::{EncodedBTEPublicKeyWithProof, Epoch, EpochId}, - verification_key::{ContractVKShare, VerificationKeyShare}, -}; -#[cfg(feature = "coconut")] -use contracts_common::dealings::ContractSafeBytes; -#[cfg(feature = "coconut")] -use cw3::ProposalResponse; -#[cfg(feature = "coconut")] -use cw4::MemberResponse; -#[cfg(feature = "coconut")] use validator_client::nyxd::{ cosmwasm_client::types::ExecuteResult, traits::{ @@ -50,6 +35,12 @@ use validator_client::nyxd::{ }, Fee, }; +use validator_client::nyxd::{ + hash::{Hash, SHA256_HASH_SIZE}, + AccountId, Coin, SigningNyxdClient, TendermintTime, VestingQueryClient, +}; +use validator_client::ValidatorClientError; +use vesting_contract_common::AccountVestingCoins; pub(crate) struct Client(pub(crate) Arc>>); @@ -288,7 +279,6 @@ impl Client { } #[async_trait] -#[cfg(feature = "coconut")] impl crate::coconut::client::Client for Client { async fn address(&self) -> AccountId { self.client_address().await diff --git a/nym-api/src/support/storage/manager.rs b/nym-api/src/support/storage/manager.rs index 785aa725f5..252e63e5f6 100644 --- a/nym-api/src/support/storage/manager.rs +++ b/nym-api/src/support/storage/manager.rs @@ -977,7 +977,6 @@ impl StorageManager { /// /// * `tx_hash`: hash of the deposit transaction. /// * `blinded_signature_response`: the encrypted blinded signature response. - #[cfg(feature = "coconut")] pub(crate) async fn insert_blinded_signature_response( &self, tx_hash: &str, @@ -998,7 +997,6 @@ impl StorageManager { /// # Arguments /// /// * `tx_hash`: transaction hash of the deposit. - #[cfg(feature = "coconut")] pub(crate) async fn get_blinded_signature_response( &self, tx_hash: &str, diff --git a/nym-api/src/support/storage/mod.rs b/nym-api/src/support/storage/mod.rs index a5529daaa2..d7bc6fd233 100644 --- a/nym-api/src/support/storage/mod.rs +++ b/nym-api/src/support/storage/mod.rs @@ -737,7 +737,6 @@ impl NymApiStorage { .map_err(|err| err.into()) } - #[cfg(feature = "coconut")] pub(crate) async fn get_blinded_signature_response( &self, tx_hash: &str, @@ -748,7 +747,6 @@ impl NymApiStorage { .map_err(|err| err.into()) } - #[cfg(feature = "coconut")] pub(crate) async fn insert_blinded_signature_response( &self, tx_hash: &str, diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index 7f1e320031..d298c18b7b 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -9,7 +9,6 @@ use task::manager::TaskStatus; use tokio::sync::RwLock; use config_common::NymConfig; -#[cfg(not(feature = "coconut"))] use nym_socks5::client::NymClient as Socks5NymClient; use nym_socks5::client::{config::Config as Socks5Config, Socks5ControlMessageSender}; From c218cba96c35df408d64bd20a7e92417dda2d459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 25 Jan 2023 14:49:28 +0000 Subject: [PATCH 241/591] Feature/default nym api (#2898) * Setting default 'id' if not provided * Modified 'NymConfig' to always require 'id' * moved creation of nym-api directories away from 'override_config' * missing optional id usage in nym-connect * changelog * Removed default value for '--id' argument --- CHANGELOG.md | 5 ++ clients/client-core/src/config/mod.rs | 16 +++---- clients/client-core/src/init/mod.rs | 2 +- clients/native/src/commands/init.rs | 2 +- clients/native/src/commands/run.rs | 2 +- clients/native/src/commands/upgrade.rs | 2 +- clients/socks5/src/commands/init.rs | 2 +- clients/socks5/src/commands/run.rs | 2 +- clients/socks5/src/commands/upgrade.rs | 2 +- common/config/src/lib.rs | 38 +++++---------- gateway/src/commands/init.rs | 2 +- gateway/src/commands/upgrade.rs | 2 +- gateway/src/config/mod.rs | 10 ++-- gateway/src/support/config.rs | 4 +- mixnode/src/commands/describe.rs | 4 +- mixnode/src/commands/init.rs | 2 +- mixnode/src/commands/node_details.rs | 2 +- mixnode/src/commands/run.rs | 2 +- mixnode/src/commands/sign.rs | 2 +- mixnode/src/commands/upgrade.rs | 2 +- mixnode/src/config/mod.rs | 8 ++-- mixnode/src/node/mod.rs | 2 +- nym-api/src/support/cli/mod.rs | 27 ++++++----- nym-api/src/support/config/mod.rs | 62 ++++++++++++------------- nym-connect/src-tauri/src/config/mod.rs | 2 +- nym-connect/src-tauri/src/state.rs | 2 +- nym-connect/src-tauri/src/tasks.rs | 2 +- 27 files changed, 98 insertions(+), 112 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f003cb0023..834a822334 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// # [Unreleased] +### Changed + +- nym-api: an `--id` flag is now always explicitly required ([#2898]) + ### Added - dkg rerun from scratch and dkg-specific epochs ([#2839]) @@ -13,6 +17,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// [#2839]: https://github.com/nymtech/nym/pull/2839 [#2870]: https://github.com/nymtech/nym/pull/2870 [#2874]: https://github.com/nymtech/nym/pull/2874 +[#2898]: https://github.com/nymtech/nym/pull/2898 # [v1.1.7] (2023-01-24) diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index df1e0aa250..22b5e30e1a 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -541,35 +541,35 @@ impl Default for Client { impl Client { fn default_private_identity_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("private_identity.pem") + T::default_data_directory(id).join("private_identity.pem") } fn default_public_identity_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("public_identity.pem") + T::default_data_directory(id).join("public_identity.pem") } fn default_private_encryption_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("private_encryption.pem") + T::default_data_directory(id).join("private_encryption.pem") } fn default_public_encryption_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("public_encryption.pem") + T::default_data_directory(id).join("public_encryption.pem") } fn default_gateway_shared_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("gateway_shared.pem") + T::default_data_directory(id).join("gateway_shared.pem") } fn default_ack_key_file(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("ack_key.pem") + T::default_data_directory(id).join("ack_key.pem") } fn default_reply_surb_database_path(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join("persistent_reply_store.sqlite") + T::default_data_directory(id).join("persistent_reply_store.sqlite") } fn default_database_path(id: &str) -> PathBuf { - T::default_data_directory(Some(id)).join(DB_FILE_NAME) + T::default_data_directory(id).join(DB_FILE_NAME) } } diff --git a/clients/client-core/src/init/mod.rs b/clients/client-core/src/init/mod.rs index 9af8a7c1bc..e236bd588b 100644 --- a/clients/client-core/src/init/mod.rs +++ b/clients/client-core/src/init/mod.rs @@ -149,7 +149,7 @@ pub fn load_existing_gateway_config(id: &str) -> Result Result<(), ClientError> { let id = &args.id; - let already_init = Config::default_config_file_path(Some(id)).exists(); + let already_init = Config::default_config_file_path(id).exists(); if already_init { println!("Client \"{id}\" was already initialised before"); } diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index 47fd3d97e8..70a3f6b929 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -99,7 +99,7 @@ fn version_check(cfg: &Config) -> bool { pub(crate) async fn execute(args: &Run) -> Result<(), Box> { let id = &args.id; - let mut config = match Config::load_from_file(Some(id)) { + let mut config = match Config::load_from_file(id) { Ok(cfg) => cfg, Err(err) => { error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", id); diff --git a/clients/native/src/commands/upgrade.rs b/clients/native/src/commands/upgrade.rs index 2d4a258011..a440054aea 100644 --- a/clients/native/src/commands/upgrade.rs +++ b/clients/native/src/commands/upgrade.rs @@ -131,7 +131,7 @@ pub(crate) fn execute(args: &Upgrade) { let id = &args.id; - let existing_config = Config::load_from_file(Some(id)).unwrap_or_else(|err| { + let existing_config = Config::load_from_file(id).unwrap_or_else(|err| { eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index ebe01ad24d..a4915dde49 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -122,7 +122,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { let id = &args.id; let provider_address = &args.provider; - let already_init = Config::default_config_file_path(Some(id)).exists(); + let already_init = Config::default_config_file_path(id).exists(); if already_init { println!("SOCKS5 client \"{id}\" was already initialised before"); } diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 2498ac5148..7150ddcf3e 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -113,7 +113,7 @@ fn version_check(cfg: &Config) -> bool { pub(crate) async fn execute(args: &Run) -> Result<(), Box> { let id = &args.id; - let mut config = match Config::load_from_file(Some(id)) { + let mut config = match Config::load_from_file(id) { Ok(cfg) => cfg, Err(err) => { error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", id); diff --git a/clients/socks5/src/commands/upgrade.rs b/clients/socks5/src/commands/upgrade.rs index db77167f34..121f045905 100644 --- a/clients/socks5/src/commands/upgrade.rs +++ b/clients/socks5/src/commands/upgrade.rs @@ -144,7 +144,7 @@ pub(crate) fn execute(args: &Upgrade) { let id = &args.id; - let existing_config = Config::load_from_file(Some(id)).unwrap_or_else(|err| { + let existing_config = Config::load_from_file(id).unwrap_or_else(|err| { eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/common/config/src/lib.rs b/common/config/src/lib.rs index d0ebecdca3..f14b94faf2 100644 --- a/common/config/src/lib.rs +++ b/common/config/src/lib.rs @@ -30,23 +30,15 @@ pub trait NymConfig: Default + Serialize + DeserializeOwned { fn default_root_directory() -> PathBuf; // default, most probable, implementations; can be easily overridden where required - fn default_config_directory(id: Option<&str>) -> PathBuf { - if let Some(id) = id { - Self::default_root_directory().join(id).join(CONFIG_DIR) - } else { - Self::default_root_directory().join(CONFIG_DIR) - } + fn default_config_directory(id: &str) -> PathBuf { + Self::default_root_directory().join(id).join(CONFIG_DIR) } - fn default_data_directory(id: Option<&str>) -> PathBuf { - if let Some(id) = id { - Self::default_root_directory().join(id).join(DATA_DIR) - } else { - Self::default_root_directory().join(DATA_DIR) - } + fn default_data_directory(id: &str) -> PathBuf { + Self::default_root_directory().join(id).join(DATA_DIR) } - fn default_config_file_path(id: Option<&str>) -> PathBuf { + fn default_config_file_path(id: &str) -> PathBuf { Self::default_config_directory(id).join(Self::config_file_name()) } @@ -54,23 +46,15 @@ pub trait NymConfig: Default + Serialize + DeserializeOwned { fn try_default_root_directory() -> Option; - fn try_default_config_directory(id: Option<&str>) -> Option { - if let Some(id) = id { - Self::try_default_root_directory().map(|d| d.join(id).join(CONFIG_DIR)) - } else { - Self::try_default_root_directory().map(|d| d.join(CONFIG_DIR)) - } + fn try_default_config_directory(id: &str) -> Option { + Self::try_default_root_directory().map(|d| d.join(id).join(CONFIG_DIR)) } - fn try_default_data_directory(id: Option<&str>) -> Option { - if let Some(id) = id { - Self::try_default_root_directory().map(|d| d.join(id).join(DATA_DIR)) - } else { - Self::try_default_root_directory().map(|d| d.join(DATA_DIR)) - } + fn try_default_data_directory(id: &str) -> Option { + Self::try_default_root_directory().map(|d| d.join(id).join(DATA_DIR)) } - fn try_default_config_file_path(id: Option<&str>) -> Option { + fn try_default_config_file_path(id: &str) -> Option { Self::try_default_config_directory(id).map(|d| d.join(Self::config_file_name())) } @@ -113,7 +97,7 @@ pub trait NymConfig: Default + Serialize + DeserializeOwned { Ok(()) } - fn load_from_file(id: Option<&str>) -> io::Result { + fn load_from_file(id: &str) -> io::Result { let file = Self::default_config_file_path(id); log::trace!("Loading from file: {:#?}", file); let config_contents = fs::read_to_string(file)?; diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index afe180eb65..c31e55663b 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -106,7 +106,7 @@ impl From for OverrideConfig { pub async fn execute(args: Init, output: OutputFormat) -> Result<(), Box> { println!("Initialising gateway {}...", args.id); - let already_init = if Config::default_config_file_path(Some(&args.id)).exists() { + let already_init = if Config::default_config_file_path(&args.id).exists() { eprintln!( "Gateway \"{}\" was already initialised before! Config information will be \ overwritten (but keys will be kept)!", diff --git a/gateway/src/commands/upgrade.rs b/gateway/src/commands/upgrade.rs index b4ea39c493..b3eefd9ed2 100644 --- a/gateway/src/commands/upgrade.rs +++ b/gateway/src/commands/upgrade.rs @@ -139,7 +139,7 @@ fn do_upgrade(mut config: Config, args: &Upgrade, package_version: Version) { pub async fn execute(args: &Upgrade) { let package_version = parse_package_version(); - let existing_config = Config::load_from_file(Some(&args.id)).unwrap_or_else(|err| { + let existing_config = Config::load_from_file(&args.id).unwrap_or_else(|err| { eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/gateway/src/config/mod.rs b/gateway/src/config/mod.rs index 67e4b8d8bf..4cface19d1 100644 --- a/gateway/src/config/mod.rs +++ b/gateway/src/config/mod.rs @@ -378,23 +378,23 @@ pub struct Gateway { impl Gateway { fn default_private_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("private_sphinx.pem") + Config::default_data_directory(id).join("private_sphinx.pem") } fn default_public_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("public_sphinx.pem") + Config::default_data_directory(id).join("public_sphinx.pem") } fn default_private_identity_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("private_identity.pem") + Config::default_data_directory(id).join("private_identity.pem") } fn default_public_identity_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("public_identity.pem") + Config::default_data_directory(id).join("public_identity.pem") } fn default_database_path(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("db.sqlite") + Config::default_data_directory(id).join("db.sqlite") } } diff --git a/gateway/src/support/config.rs b/gateway/src/support/config.rs index ff61d95da8..90576a4d89 100644 --- a/gateway/src/support/config.rs +++ b/gateway/src/support/config.rs @@ -11,14 +11,14 @@ pub(crate) fn build_config>( id: String, override_args: O, ) -> Result { - let config = match Config::load_from_file(Some(&id)) { + let config = match Config::load_from_file(&id) { Ok(cfg) => cfg, Err(err) => { error!( "Failed to load config for {id}. Are you sure you have run `init` before? (Error was: {err})", ); return Err(GatewayError::ConfigLoadFailure { - path: Config::default_config_file_path(Some(&id)), + path: Config::default_config_file_path(&id), id, source: err, }); diff --git a/mixnode/src/commands/describe.rs b/mixnode/src/commands/describe.rs index 5b66eb8d87..d9cecbe410 100644 --- a/mixnode/src/commands/describe.rs +++ b/mixnode/src/commands/describe.rs @@ -41,7 +41,7 @@ fn read_user_input() -> String { pub(crate) fn execute(args: Describe) { // ensure that the mixnode has in fact been initialized - match Config::load_from_file(Some(&args.id)) { + match Config::load_from_file(&args.id) { Ok(cfg) => cfg, Err(err) => { error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", &args.id); @@ -83,7 +83,7 @@ pub(crate) fn execute(args: Describe) { // save the struct NodeDescription::save_to_file( &node_description, - Config::default_config_directory(Some(&args.id)), + Config::default_config_directory(&args.id), ) .unwrap() } diff --git a/mixnode/src/commands/init.rs b/mixnode/src/commands/init.rs index d25b234ab8..fe6b18bc4f 100644 --- a/mixnode/src/commands/init.rs +++ b/mixnode/src/commands/init.rs @@ -68,7 +68,7 @@ pub(crate) fn execute(args: &Init, output: OutputFormat) { let id = &override_config_fields.id; eprintln!("Initialising mixnode {id}..."); - let already_init = if Config::default_config_file_path(Some(id)).exists() { + let already_init = if Config::default_config_file_path(id).exists() { eprintln!("Mixnode \"{id}\" was already initialised before! Config information will be overwritten (but keys will be kept)!"); true } else { diff --git a/mixnode/src/commands/node_details.rs b/mixnode/src/commands/node_details.rs index cdc0d5162a..98298cea74 100644 --- a/mixnode/src/commands/node_details.rs +++ b/mixnode/src/commands/node_details.rs @@ -15,7 +15,7 @@ pub(crate) struct NodeDetails { } pub(crate) fn execute(args: &NodeDetails, output: OutputFormat) { - let config = match Config::load_from_file(Some(&args.id)) { + let config = match Config::load_from_file(&args.id) { Ok(cfg) => cfg, Err(err) => { error!( diff --git a/mixnode/src/commands/run.rs b/mixnode/src/commands/run.rs index 910b9fc869..e578c422c1 100644 --- a/mixnode/src/commands/run.rs +++ b/mixnode/src/commands/run.rs @@ -79,7 +79,7 @@ fn special_addresses() -> Vec<&'static str> { pub(crate) async fn execute(args: &Run, output: OutputFormat) { eprintln!("Starting mixnode {}...", args.id); - let mut config = match Config::load_from_file(Some(&args.id)) { + let mut config = match Config::load_from_file(&args.id) { Ok(cfg) => cfg, Err(err) => { error!( diff --git a/mixnode/src/commands/sign.rs b/mixnode/src/commands/sign.rs index ed84cc6d3b..52360d7a03 100644 --- a/mixnode/src/commands/sign.rs +++ b/mixnode/src/commands/sign.rs @@ -71,7 +71,7 @@ fn print_signed_text(private_key: &identity::PrivateKey, text: &str) { } pub(crate) fn execute(args: &Sign) { - let config = match Config::load_from_file(Some(&args.id)) { + let config = match Config::load_from_file(&args.id) { Ok(cfg) => cfg, Err(err) => { error!( diff --git a/mixnode/src/commands/upgrade.rs b/mixnode/src/commands/upgrade.rs index 3ba4192289..46c8192312 100644 --- a/mixnode/src/commands/upgrade.rs +++ b/mixnode/src/commands/upgrade.rs @@ -125,7 +125,7 @@ fn do_upgrade(mut config: Config, args: &Upgrade, package_version: Version) { pub(crate) fn execute(args: &Upgrade) { let package_version = parse_package_version(); - let existing_config = Config::load_from_file(Some(&args.id)).unwrap_or_else(|err| { + let existing_config = Config::load_from_file(&args.id).unwrap_or_else(|err| { eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); diff --git a/mixnode/src/config/mod.rs b/mixnode/src/config/mod.rs index 2b69e45725..6183ba073e 100644 --- a/mixnode/src/config/mod.rs +++ b/mixnode/src/config/mod.rs @@ -376,19 +376,19 @@ struct MixNode { impl MixNode { fn default_private_identity_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("private_identity.pem") + Config::default_data_directory(id).join("private_identity.pem") } fn default_public_identity_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("public_identity.pem") + Config::default_data_directory(id).join("public_identity.pem") } fn default_private_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("private_sphinx.pem") + Config::default_data_directory(id).join("private_sphinx.pem") } fn default_public_sphinx_key_file(id: &str) -> PathBuf { - Config::default_data_directory(Some(id)).join("public_sphinx.pem") + Config::default_data_directory(id).join("public_sphinx.pem") } } diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index ccf4a9a3db..e581860fbd 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -58,7 +58,7 @@ impl MixNode { } fn load_node_description(config: &Config) -> NodeDescription { - NodeDescription::load_from_file(Config::default_config_directory(Some(&config.get_id()))) + NodeDescription::load_from_file(Config::default_config_directory(&config.get_id())) .unwrap_or_default() } diff --git a/nym-api/src/support/cli/mod.rs b/nym-api/src/support/cli/mod.rs index 264e9a66c4..ad911a0b0e 100644 --- a/nym-api/src/support/cli/mod.rs +++ b/nym-api/src/support/cli/mod.rs @@ -44,7 +44,7 @@ pub(crate) struct CliArgs { /// Id of the nym-api we want to run #[clap(long)] - pub(crate) id: Option, + pub(crate) id: String, /// Specifies whether network monitoring is enabled on this API #[clap(short = 'm', long)] @@ -104,12 +104,13 @@ pub(crate) struct CliArgs { } pub(crate) fn build_config(args: CliArgs) -> Result { + let id = args.id.clone(); + // try to load config from the file, if it doesn't exist, use default values - let id = args.id.as_deref(); - let (config_from_file, _already_initialized) = match Config::load_from_file(id) { + let (config_from_file, already_initialized) = match Config::load_from_file(&id) { Ok(cfg) => (cfg, true), Err(_) => { - let config_path = Config::default_config_file_path(id) + let config_path = Config::default_config_file_path(&id) .into_os_string() .into_string() .unwrap(); @@ -123,8 +124,13 @@ pub(crate) fn build_config(args: CliArgs) -> Result { let config = override_config(config_from_file, args); - #[cfg(feature = "coconut")] - if !_already_initialized { + if already_initialized { + fs::create_dir_all(Config::default_config_directory(&id)) + .expect("Could not create config directory"); + fs::create_dir_all(Config::default_data_directory(&id)) + .expect("Could not create data directory"); + + #[cfg(feature = "coconut")] crate::coconut::dkg::controller::init_keypair(&config)?; } @@ -132,15 +138,8 @@ pub(crate) fn build_config(args: CliArgs) -> Result { } pub(crate) fn override_config(mut config: Config, args: CliArgs) -> Config { - if let Some(id) = args.id { - fs::create_dir_all(Config::default_config_directory(Some(&id))) - .expect("Could not create config directory"); - fs::create_dir_all(Config::default_data_directory(Some(&id))) - .expect("Could not create data directory"); - config = config.with_id(&id); - } - config = config + .with_id(&args.id) .with_optional(Config::with_custom_nyxd_validator, args.nyxd_validator) .with_optional_env( Config::with_custom_mixnet_contract, diff --git a/nym-api/src/support/config/mod.rs b/nym-api/src/support/config/mod.rs index fae7d281c0..825152e79e 100644 --- a/nym-api/src/support/config/mod.rs +++ b/nym-api/src/support/config/mod.rs @@ -201,8 +201,8 @@ pub struct NetworkMonitor { impl NetworkMonitor { pub const DB_FILE: &'static str = "credentials_database.db"; - fn default_credentials_database_path() -> PathBuf { - Config::default_data_directory(None).join(Self::DB_FILE) + fn default_credentials_database_path(id: &str) -> PathBuf { + Config::default_data_directory(id).join(Self::DB_FILE) } } @@ -220,7 +220,7 @@ impl Default for NetworkMonitor { gateway_response_timeout: DEFAULT_GATEWAY_RESPONSE_TIMEOUT, gateway_connection_timeout: DEFAULT_GATEWAY_CONNECTION_TIMEOUT, packet_delivery_timeout: DEFAULT_PACKET_DELIVERY_TIMEOUT, - credentials_database_path: Self::default_credentials_database_path(), + credentials_database_path: Default::default(), test_routes: DEFAULT_TEST_ROUTES, minimum_test_routes: DEFAULT_MINIMUM_TEST_ROUTES, route_test_packets: DEFAULT_ROUTE_TEST_PACKETS, @@ -242,15 +242,15 @@ pub struct NodeStatusAPI { impl NodeStatusAPI { pub const DB_FILE: &'static str = "db.sqlite"; - fn default_database_path() -> PathBuf { - Config::default_data_directory(None).join(Self::DB_FILE) + fn default_database_path(id: &str) -> PathBuf { + Config::default_data_directory(id).join(Self::DB_FILE) } } impl Default for NodeStatusAPI { fn default() -> Self { NodeStatusAPI { - database_path: Self::default_database_path(), + database_path: Default::default(), caching_interval: DEFAULT_NODE_STATUS_CACHE_INTERVAL, } } @@ -342,24 +342,24 @@ impl CoconutSigner { pub const COCONUT_VERIFICATION_KEY_FILE: &'static str = "coconut_verification_key.pem"; pub const COCONUT_SECRET_KEY_FILE: &'static str = "coconut_secret_key.pem"; - fn default_coconut_verification_key_path() -> PathBuf { - Config::default_data_directory(None).join(Self::COCONUT_VERIFICATION_KEY_FILE) + fn default_coconut_verification_key_path(id: &str) -> PathBuf { + Config::default_data_directory(id).join(Self::COCONUT_VERIFICATION_KEY_FILE) } - fn default_coconut_secret_key_path() -> PathBuf { - Config::default_data_directory(None).join(Self::COCONUT_SECRET_KEY_FILE) + fn default_coconut_secret_key_path(id: &str) -> PathBuf { + Config::default_data_directory(id).join(Self::COCONUT_SECRET_KEY_FILE) } - fn default_dkg_persistent_state_path() -> PathBuf { - Config::default_data_directory(None).join(Self::DKG_PERSISTENT_STATE_FILE) + fn default_dkg_persistent_state_path(id: &str) -> PathBuf { + Config::default_data_directory(id).join(Self::DKG_PERSISTENT_STATE_FILE) } - fn default_dkg_decryption_key_path() -> PathBuf { - Config::default_data_directory(None).join(Self::DKG_DECRYPTION_KEY_FILE) + fn default_dkg_decryption_key_path(id: &str) -> PathBuf { + Config::default_data_directory(id).join(Self::DKG_DECRYPTION_KEY_FILE) } - fn default_dkg_public_key_with_proof_path() -> PathBuf { - Config::default_data_directory(None).join(Self::DKG_PUBLIC_KEY_WITH_PROOF_FILE) + fn default_dkg_public_key_with_proof_path(id: &str) -> PathBuf { + Config::default_data_directory(id).join(Self::DKG_PUBLIC_KEY_WITH_PROOF_FILE) } } @@ -367,11 +367,11 @@ impl Default for CoconutSigner { fn default() -> Self { Self { enabled: Default::default(), - dkg_persistent_state_path: CoconutSigner::default_dkg_persistent_state_path(), - verification_key_path: CoconutSigner::default_coconut_verification_key_path(), - secret_key_path: CoconutSigner::default_coconut_secret_key_path(), - decryption_key_path: CoconutSigner::default_dkg_decryption_key_path(), - public_key_with_proof_path: CoconutSigner::default_dkg_public_key_with_proof_path(), + dkg_persistent_state_path: Default::default(), + verification_key_path: Default::default(), + secret_key_path: Default::default(), + decryption_key_path: Default::default(), + public_key_with_proof_path: Default::default(), dkg_contract_polling_rate: DEFAULT_DKG_CONTRACT_POLLING_RATE, } } @@ -384,20 +384,18 @@ impl Config { pub fn with_id(mut self, id: &str) -> Self { self.base.id = id.to_string(); - self.node_status_api.database_path = - Config::default_data_directory(Some(id)).join(NodeStatusAPI::DB_FILE); + self.node_status_api.database_path = NodeStatusAPI::default_database_path(id); self.network_monitor.credentials_database_path = - Config::default_data_directory(Some(id)).join(NetworkMonitor::DB_FILE); + NetworkMonitor::default_credentials_database_path(id); self.coconut_signer.dkg_persistent_state_path = - Config::default_data_directory(Some(id)).join(CoconutSigner::DKG_PERSISTENT_STATE_FILE); - self.coconut_signer.verification_key_path = Config::default_data_directory(Some(id)) - .join(CoconutSigner::COCONUT_VERIFICATION_KEY_FILE); - self.coconut_signer.secret_key_path = - Config::default_data_directory(Some(id)).join(CoconutSigner::COCONUT_SECRET_KEY_FILE); + CoconutSigner::default_dkg_persistent_state_path(id); + self.coconut_signer.verification_key_path = + CoconutSigner::default_coconut_verification_key_path(id); + self.coconut_signer.secret_key_path = CoconutSigner::default_coconut_secret_key_path(id); self.coconut_signer.decryption_key_path = - Config::default_data_directory(Some(id)).join(CoconutSigner::DKG_DECRYPTION_KEY_FILE); - self.coconut_signer.public_key_with_proof_path = Config::default_data_directory(Some(id)) - .join(CoconutSigner::DKG_PUBLIC_KEY_WITH_PROOF_FILE); + CoconutSigner::default_dkg_decryption_key_path(id); + self.coconut_signer.public_key_with_proof_path = + CoconutSigner::default_dkg_public_key_with_proof_path(id); self } diff --git a/nym-connect/src-tauri/src/config/mod.rs b/nym-connect/src-tauri/src/config/mod.rs index b7fa03636b..9c51348b42 100644 --- a/nym-connect/src-tauri/src/config/mod.rs +++ b/nym-connect/src-tauri/src/config/mod.rs @@ -93,7 +93,7 @@ impl Config { } pub fn config_file_location(id: &str) -> Result { - Socks5Config::try_default_config_file_path(Some(id)) + Socks5Config::try_default_config_file_path(id) .ok_or(BackendError::CouldNotGetConfigFilename) } } diff --git a/nym-connect/src-tauri/src/state.rs b/nym-connect/src-tauri/src/state.rs index 72e16a6748..774e787cdc 100644 --- a/nym-connect/src-tauri/src/state.rs +++ b/nym-connect/src-tauri/src/state.rs @@ -85,7 +85,7 @@ impl State { pub fn load_socks5_config(&self) -> Result { let id = self.get_config_id()?; - let config = Socks5Config::load_from_file(Some(&id)) + let config = Socks5Config::load_from_file(&id) .tap_err(|_| log::warn!("Failed to load configuration file"))?; Ok(config) } diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index 7f1e320031..bc632c7ef3 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -36,7 +36,7 @@ pub fn start_nym_socks5_client( GatewayEndpointConfig, )> { log::info!("Loading config from file: {id}"); - let config = Socks5Config::load_from_file(Some(id)) + let config = Socks5Config::load_from_file(id) .tap_err(|_| log::warn!("Failed to load configuration file"))?; let used_gateway = config.get_base().get_gateway_endpoint().clone(); From b8e2997c738fb36ff666b0c0bd60b9c1faff1869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 25 Jan 2023 20:55:55 +0100 Subject: [PATCH 242/591] nym-connect: connectivity status improvements (#2915) * connect: keep track of connectivity state * nym-connect: query connection state * nym-connect: function for kicking of the health check task * rustfmt * nym-connect: extract out into function * nym-connect: extract out events.rs --- Cargo.lock | 2 +- nym-connect/src-tauri/src/events.rs | 71 ++++++++++++++++ nym-connect/src-tauri/src/main.rs | 7 +- nym-connect/src-tauri/src/models/mod.rs | 31 +++++++ .../src/operations/connection/health_check.rs | 26 ++++++ .../src/operations/connection/mod.rs | 1 + .../src/operations/connection/status.rs | 48 ++++++----- nym-connect/src-tauri/src/state.rs | 71 +++++++++++++++- nym-connect/src-tauri/src/tasks.rs | 85 ++++++------------- 9 files changed, 257 insertions(+), 85 deletions(-) create mode 100644 nym-connect/src-tauri/src/events.rs create mode 100644 nym-connect/src-tauri/src/operations/connection/health_check.rs diff --git a/Cargo.lock b/Cargo.lock index 4e3b3f3e44..c4c4b6701a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3676,7 +3676,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.7" +version = "1.1.8" dependencies = [ "anyhow", "atty", diff --git a/nym-connect/src-tauri/src/events.rs b/nym-connect/src-tauri/src/events.rs new file mode 100644 index 0000000000..13e1ca800d --- /dev/null +++ b/nym-connect/src-tauri/src/events.rs @@ -0,0 +1,71 @@ +use std::sync::Arc; + +use client_core::error::ClientCoreStatusMessage; +use task::manager::TaskStatus; +use tauri::async_runtime::RwLock; + +use crate::{ + state::{GatewayConnectivity, State}, + tasks, +}; + +#[derive(Clone, serde::Serialize)] +struct Payload { + title: String, + message: String, +} + +impl Payload { + fn new(title: String, message: String) -> Self { + Self { title, message } + } +} + +pub fn emit_event(event: &str, title: &str, msg: &str, window: &tauri::Window) { + if let Err(err) = window.emit(event, Payload::new(title.into(), msg.into())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +pub fn emit_status_event(event: &str, msg: &T, window: &tauri::Window) { + if let Err(err) = window.emit(event, Payload::new("SOCKS5 update".into(), msg.to_string())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +pub async fn handle_task_status( + task_status: &TaskStatus, + state: &Arc>, + window: &tauri::Window, +) { + match task_status { + TaskStatus::Ready => { + { + let mut state_w = state.write().await; + state_w.mark_connected(window); + } + + emit_status_event("socks5-connected-event", task_status, window); + tasks::start_connection_check(state.clone(), window.clone()); + } + } +} + +pub async fn handle_client_status_message( + client_status_message: &ClientCoreStatusMessage, + state: &Arc>, + window: &tauri::Window, +) { + // TODO: use this instead once we change on the frontend too + let _event_name = match client_status_message { + ClientCoreStatusMessage::GatewayIsSlow | ClientCoreStatusMessage::GatewayIsVerySlow => { + "socks5-gateway-status" + } + }; + + if let Ok(connectivity) = GatewayConnectivity::try_from(client_status_message) { + state.write().await.set_gateway_connectivity(connectivity); + } + + emit_status_event("socks5-status-event", client_status_message, window); +} diff --git a/nym-connect/src-tauri/src/main.rs b/nym-connect/src-tauri/src/main.rs index 9eccb6151b..6540fa94f4 100644 --- a/nym-connect/src-tauri/src/main.rs +++ b/nym-connect/src-tauri/src/main.rs @@ -16,6 +16,7 @@ use crate::window::window_toggle; mod config; mod error; +mod events; mod logging; mod menu; mod models; @@ -40,14 +41,16 @@ fn main() { .invoke_handler(tauri::generate_handler![ crate::config::get_config_file_location, crate::config::get_config_id, - crate::operations::connection::status::get_connection_status, - crate::operations::connection::status::run_health_check, crate::operations::connection::connect::get_gateway, crate::operations::connection::connect::get_service_provider, crate::operations::connection::connect::set_gateway, crate::operations::connection::connect::set_service_provider, crate::operations::connection::connect::start_connecting, crate::operations::connection::disconnect::start_disconnecting, + crate::operations::connection::status::get_connection_health_check_status, + crate::operations::connection::status::get_connection_status, + crate::operations::connection::status::get_gateway_connection_status, + crate::operations::connection::status::start_connection_health_check_task, crate::operations::directory::get_services, crate::operations::export::export_keys, crate::operations::window::hide_window, diff --git a/nym-connect/src-tauri/src/models/mod.rs b/nym-connect/src-tauri/src/models/mod.rs index cde0deed96..fb43877675 100644 --- a/nym-connect/src-tauri/src/models/mod.rs +++ b/nym-connect/src-tauri/src/models/mod.rs @@ -2,6 +2,8 @@ use core::fmt; use serde::{Deserialize, Serialize}; +use crate::state::GatewayConnectivity; + #[cfg_attr(test, derive(ts_rs::TS))] #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] pub struct ConnectResult { @@ -25,6 +27,35 @@ pub enum ConnectionStatusKind { Connecting, } +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(rename_all = "lowercase"))] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "camelCase")] +pub enum GatewayConnectionStatusKind { + Good, + Bad, + VeryBad, +} + +impl From for GatewayConnectionStatusKind { + fn from(conn: GatewayConnectivity) -> Self { + match conn { + GatewayConnectivity::Good => GatewayConnectionStatusKind::Good, + GatewayConnectivity::Bad { .. } => GatewayConnectionStatusKind::Bad, + GatewayConnectivity::VeryBad { .. } => GatewayConnectionStatusKind::VeryBad, + } + } +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(rename_all = "lowercase"))] +#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)] +pub enum ConnectivityTestResult { + NotAvailable, + Success, + Fail, +} + impl fmt::Display for ConnectionStatusKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { diff --git a/nym-connect/src-tauri/src/operations/connection/health_check.rs b/nym-connect/src-tauri/src/operations/connection/health_check.rs new file mode 100644 index 0000000000..3f401933a1 --- /dev/null +++ b/nym-connect/src-tauri/src/operations/connection/health_check.rs @@ -0,0 +1,26 @@ +use serde::{Deserialize, Serialize}; + +static HEALTH_CHECK_URL: &str = "https://nymtech.net/.wellknown/connect/healthcheck.json"; + +#[derive(Serialize, Deserialize, Debug)] +struct ConnectionSuccess { + status: String, +} + +pub async fn run_health_check() -> bool { + log::info!("Running network health check"); + match crate::operations::http::socks5_get::<_, ConnectionSuccess>(HEALTH_CHECK_URL).await { + Ok(res) if res.status == "ok" => { + log::info!("Healthcheck success!"); + true + } + Ok(res) => { + log::error!("Healthcheck failed with status: {}", res.status); + false + } + Err(err) => { + log::error!("Healthcheck failed: {err}"); + false + } + } +} diff --git a/nym-connect/src-tauri/src/operations/connection/mod.rs b/nym-connect/src-tauri/src/operations/connection/mod.rs index 8c3449909e..171d07cd83 100644 --- a/nym-connect/src-tauri/src/operations/connection/mod.rs +++ b/nym-connect/src-tauri/src/operations/connection/mod.rs @@ -1,3 +1,4 @@ pub mod connect; pub mod disconnect; +pub mod health_check; pub mod status; diff --git a/nym-connect/src-tauri/src/operations/connection/status.rs b/nym-connect/src-tauri/src/operations/connection/status.rs index a5f613a386..7710524fb5 100644 --- a/nym-connect/src-tauri/src/operations/connection/status.rs +++ b/nym-connect/src-tauri/src/operations/connection/status.rs @@ -1,14 +1,12 @@ use crate::error::Result; +use crate::tasks; use std::sync::Arc; -use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; -use crate::models::ConnectionStatusKind; +use crate::models::{ConnectionStatusKind, ConnectivityTestResult, GatewayConnectionStatusKind}; use crate::state::State; -static HEALTH_CHECK_URL: &str = "https://nymtech.net/.wellknown/connect/healthcheck.json"; - #[tauri::command] pub async fn get_connection_status( state: tauri::State<'_, Arc>>, @@ -17,26 +15,30 @@ pub async fn get_connection_status( Ok(state.get_status()) } -#[derive(Serialize, Deserialize, Debug)] -struct ConnectionSuccess { - status: String, +#[tauri::command] +pub async fn get_gateway_connection_status( + state: tauri::State<'_, Arc>>, +) -> Result { + let mut state_w = state.write().await; + let gateway_connectivity = state_w.get_gateway_connectivity(); + Ok(gateway_connectivity.into()) } #[tauri::command] -pub async fn run_health_check() -> bool { - log::info!("Running network health check"); - match crate::operations::http::socks5_get::<_, ConnectionSuccess>(HEALTH_CHECK_URL).await { - Ok(res) if res.status == "ok" => { - log::info!("Healthcheck success!"); - true - } - Ok(res) => { - log::error!("Healthcheck failed with status: {}", res.status); - false - } - Err(err) => { - log::error!("Healthcheck failed: {err}"); - false - } - } +pub async fn get_connection_health_check_status( + state: tauri::State<'_, Arc>>, +) -> Result { + let state = state.read().await; + Ok(state.get_connectivity_test_result()) +} + +// Start a connection check task. This should return with an event within one minute, and update +// the state. +// Trying to run multiple concurrent connection checks probably works but is not supported. +#[tauri::command] +pub fn start_connection_health_check_task( + state: tauri::State<'_, Arc>>, + window: tauri::Window, +) { + tasks::start_connection_check(state.inner().clone(), window); } diff --git a/nym-connect/src-tauri/src/state.rs b/nym-connect/src-tauri/src/state.rs index 72e16a6748..84526f1d11 100644 --- a/nym-connect/src-tauri/src/state.rs +++ b/nym-connect/src-tauri/src/state.rs @@ -1,6 +1,7 @@ use std::time::Duration; use ::config_common::NymConfig; +use client_core::error::ClientCoreStatusMessage; use futures::SinkExt; use tap::TapFallible; use tauri::Manager; @@ -8,17 +9,46 @@ use tauri::Manager; use nym_socks5::client::{ config::Config as Socks5Config, Socks5ControlMessage, Socks5ControlMessageSender, }; +use tokio::time::Instant; use crate::{ config::{self, socks5_config_id_appended_with}, error::{BackendError, Result}, models::{ - AppEventConnectionStatusChangedPayload, ConnectionStatusKind, + AppEventConnectionStatusChangedPayload, ConnectionStatusKind, ConnectivityTestResult, APP_EVENT_CONNECTION_STATUS_CHANGED, }, tasks::{self, ExitStatusReceiver}, }; +// The client will emit messages if the connection to the gateway is poor (or the gateway can't +// keep up with the messages we are sendind). If no messages about this has been received for a +// certain duration then we assume it's all good. +const GATEWAY_CONNECTIVITY_TIMEOUT_SECS: u64 = 20; + +#[derive(Clone, Copy)] +pub enum GatewayConnectivity { + Good, + Bad { when: Instant }, + VeryBad { when: Instant }, +} + +impl TryFrom<&ClientCoreStatusMessage> for GatewayConnectivity { + type Error = BackendError; + + fn try_from(value: &ClientCoreStatusMessage) -> Result { + let conn = match value { + ClientCoreStatusMessage::GatewayIsSlow => GatewayConnectivity::Bad { + when: Instant::now(), + }, + ClientCoreStatusMessage::GatewayIsVerySlow => GatewayConnectivity::VeryBad { + when: Instant::now(), + }, + }; + Ok(conn) + } +} + pub struct State { /// The current connection status status: ConnectionStatusKind, @@ -31,6 +61,14 @@ pub struct State { /// Channel that is used to send command messages to the SOCKS5 client, such as to disconnect socks5_client_sender: Option, + + /// The client will periodically report connectivity to the gateway it's connected to. Unless + /// we get a status message from the client we assume it's good. + gateway_connectivity: GatewayConnectivity, + + /// The latest end-to-end connectivity test result. The first test is initiated on connection + /// established. Additional tests can be triggered. + connectivity_test_result: ConnectivityTestResult, } impl State { @@ -40,9 +78,40 @@ impl State { service_provider: None, gateway: None, socks5_client_sender: None, + gateway_connectivity: GatewayConnectivity::Good, + connectivity_test_result: ConnectivityTestResult::NotAvailable, } } + pub fn get_gateway_connectivity(&mut self) -> GatewayConnectivity { + self.gateway_connectivity = match self.gateway_connectivity { + c @ (GatewayConnectivity::Bad { when } | GatewayConnectivity::VeryBad { when }) => { + if Instant::now() > when + Duration::from_secs(GATEWAY_CONNECTIVITY_TIMEOUT_SECS) { + GatewayConnectivity::Good + } else { + c + } + } + current => current, + }; + self.gateway_connectivity + } + + pub fn set_gateway_connectivity(&mut self, gateway_connectivity: GatewayConnectivity) { + self.gateway_connectivity = gateway_connectivity + } + + pub fn get_connectivity_test_result(&self) -> ConnectivityTestResult { + self.connectivity_test_result + } + + pub fn set_connectivity_test_result( + &mut self, + connectivity_test_result: ConnectivityTestResult, + ) { + self.connectivity_test_result = connectivity_test_result; + } + pub fn get_status(&self) -> ConnectionStatusKind { self.status.clone() } diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index d298c18b7b..423097d0ab 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -12,7 +12,13 @@ use config_common::NymConfig; use nym_socks5::client::NymClient as Socks5NymClient; use nym_socks5::client::{config::Config as Socks5Config, Socks5ControlMessageSender}; -use crate::{error::Result, models::ConnectionStatusKind, operations::connection, state::State}; +use crate::{ + error::Result, + events::{self, emit_event, emit_status_event}, + models::{ConnectionStatusKind, ConnectivityTestResult}, + operations, + state::State, +}; pub type ExitStatusReceiver = futures::channel::oneshot::Receiver; @@ -86,34 +92,6 @@ pub fn start_nym_socks5_client( )) } -#[derive(Clone, serde::Serialize)] -struct Payload { - title: String, - message: String, -} - -impl Payload { - fn new(title: String, message: String) -> Self { - Self { title, message } - } -} - -fn emit_event(event: &str, title: &str, msg: &str, window: &tauri::Window) { - if let Err(err) = window.emit(event, Payload::new(title.into(), msg.into())) { - log::error!("Failed to emit tauri event: {err}"); - } -} - -fn emit_status_event( - event: &str, - msg: Box, - window: &tauri::Window, -) { - if let Err(err) = window.emit(event, Payload::new("SOCKS5 update".into(), msg.to_string())) { - log::error!("Failed to emit tauri event: {err}"); - } -} - pub fn start_connection_check(state: Arc>, window: tauri::Window) { log::debug!("Starting connection check handler"); tokio::spawn(async move { @@ -123,17 +101,22 @@ pub fn start_connection_check(state: Arc>, window: tauri::Window>, window: tauri::Window>, - window: &tauri::Window, - msg: Box, -) { - { - let mut state_w = state.write().await; - state_w.mark_connected(window); - } - - emit_status_event("socks5-connected-event", msg, window); - start_connection_check(state.clone(), window.clone()); -} - /// The status listener listens for non-exit status messages from the background socks5 proxy task. pub fn start_status_listener( state: Arc>, @@ -168,21 +139,19 @@ pub fn start_status_listener( mut msg_receiver: task::StatusReceiver, ) { log::info!("Starting status listener"); + tokio::spawn(async move { while let Some(msg) = msg_receiver.next().await { log::info!("SOCKS5 proxy sent status message: {}", msg); - if let Some(TaskStatus::Ready) = msg.downcast_ref::() { - handle_connection_ready(&state, &window, msg).await; - } else if let Some(_gateway_status) = msg.downcast_ref::() { - // TODO: use this instead once we change on the frontend too - //let event_name = match gateway_status { - // ClientCoreStatusMessage::GatewayIsSlow => "socks5-gateway-status", - // ClientCoreStatusMessage::GatewayIsVerySlow => "socks5-gateway-status", - //}; - emit_status_event("socks5-status-event", msg, &window); + if let Some(task_status) = msg.downcast_ref::() { + events::handle_task_status(task_status, &state, &window).await; + } else if let Some(client_status_message) = + msg.downcast_ref::() + { + events::handle_client_status_message(client_status_message, &state, &window).await; } else { - emit_status_event("socks5-status-event", msg, &window); + emit_status_event("socks5-status-event", &msg, &window); } } log::info!("Status listener exiting"); From 0bcdf994754bd04d048f0884e182f8be3a02eae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 26 Jan 2023 09:13:39 +0100 Subject: [PATCH 243/591] ci: update build arguments and some tidy (#2919) * ci: remove --all-targets where it doesn't make sense anymore * ci: add cargo clean step for ubuntu * sdk: add note about the existance of a rust sdk --- .github/workflows/build.yml | 6 +++--- .github/workflows/nightly_build.yml | 6 +++--- sdk/README.md | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f4b8f2c7df..a2e72a1cfc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -74,7 +74,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: --workspace --all-features + args: --workspace - name: Run expensive tests if: github.ref == 'refs/heads/develop' || github.event.pull_request.base.ref == 'develop' || github.event.pull_request.base.ref == 'master' @@ -88,10 +88,10 @@ jobs: continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} - args: --workspace --all-features + args: --workspace - name: Run clippy uses: actions-rs/cargo@v1 with: command: clippy - args: --workspace --all-targets --all-features -- -D warnings + args: --workspace --all-targets -- -D warnings diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index f9281eedf8..2a7384f2d7 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -77,7 +77,7 @@ jobs: - name: Reclaim some disk space (because Windows is being annoying) uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: command: clean @@ -99,14 +99,14 @@ jobs: continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} - args: --all-features + args: --workspace - name: Run clippy uses: actions-rs/cargo@v1 if: ${{ matrix.rust != 'nightly' }} with: command: clippy - args: --workspace --all-targets --all-features -- -D warnings + args: --workspace --all-targets -- -D warnings - name: Reclaim some disk space uses: actions-rs/cargo@v1 diff --git a/sdk/README.md b/sdk/README.md index 62e53144b2..4570ace5cf 100644 --- a/sdk/README.md +++ b/sdk/README.md @@ -5,8 +5,9 @@ Welcome to the Nym SDK. This is a good starting point for finding resources to b The SDK is split into technologies and platforms: - [Typescript](typescript) - packages for the Javascript ecosystem leveraging Nym's Typescript and WASM clients. Use these to build browser apps, web apps and mobile apps that can make use of the Nym mixnet and Coconut credentials +- [Rust](rust) - crates for Nym platform support to Rust application and libraries. Coming soon: - [iOS](ios) - native libraries for iOS, that can be used directly or from React Native using wrappers -- [Android](android) - native libraries for iOS, that can be used via JNI or from React Native using wrappers \ No newline at end of file +- [Android](android) - native libraries for iOS, that can be used via JNI or from React Native using wrappers From 92b220ca4b009f7dc7c39cc1aa61918b6adea149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C8=99u?= Date: Mon, 23 Jan 2023 17:43:30 +0200 Subject: [PATCH 244/591] Fix typo --- common/network-defaults/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index 857177411e..f0d6ccce16 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -200,7 +200,7 @@ impl NymNetworkDetails { #[must_use] pub fn with_group_contract>(mut self, contract: Option) -> Self { - self.contracts.multisig_contract_address = contract.map(Into::into); + self.contracts.group_contract_address = contract.map(Into::into); self } From eb31e47e68eaaa238b9b24b556f068af09ba1d79 Mon Sep 17 00:00:00 2001 From: benedettadavico Date: Thu, 26 Jan 2023 12:22:07 +0100 Subject: [PATCH 245/591] nym-api tests --- Makefile | 3 + nym-api/tests/.eslintignore | 7 + nym-api/tests/.eslintrc.json | 32 + nym-api/tests/.gitignore | 6 + .../tests/.yarn/releases/yarn-stable-temp.cjs | 783 ++ nym-api/tests/README.md | 2 +- .../circulating-supply.test.ts | 25 + .../contract-cache-epochs.test.ts | 40 + .../gateway/contract-cache-gateway.test.ts | 50 + .../mixnode/contract-cache-mixnode.test.ts | 173 + .../status/status-gateway.test.ts | 50 + .../status/status-mixnode.test.ts | 120 + .../status/status-mixnode.test.ts | 123 - nym-api/tests/package-lock.json | 8401 +++++++++++++++++ nym-api/tests/package.json | 4 +- nym-api/tests/src/config/config.yaml | 13 +- nym-api/tests/src/config/configHandler.ts | 5 +- .../tests/src/endpoints/CirculatingSupply.ts | 17 + nym-api/tests/src/endpoints/ContractCache.ts | 96 + nym-api/tests/src/endpoints/Status.ts | 207 +- .../tests/src/interfaces/StatusInterfaces.ts | 72 - .../tests/src/types/CirculatingSupplyTypes.ts | 26 + nym-api/tests/src/types/ContractCacheTypes.ts | 132 + nym-api/tests/src/types/StatusInterfaces.ts | 231 + nym-api/tests/tsconfig.json | 2 +- nym-api/tests/yarn.lock | 4063 ++++---- 26 files changed, 12357 insertions(+), 2326 deletions(-) create mode 100644 nym-api/tests/.eslintignore create mode 100644 nym-api/tests/.eslintrc.json create mode 100644 nym-api/tests/.gitignore create mode 100755 nym-api/tests/.yarn/releases/yarn-stable-temp.cjs create mode 100644 nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts create mode 100644 nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts create mode 100644 nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts create mode 100644 nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts create mode 100644 nym-api/tests/functional_test/status/status-gateway.test.ts create mode 100644 nym-api/tests/functional_test/status/status-mixnode.test.ts delete mode 100644 nym-api/tests/functional_test/validator-api/status/status-mixnode.test.ts create mode 100644 nym-api/tests/package-lock.json create mode 100644 nym-api/tests/src/endpoints/CirculatingSupply.ts create mode 100644 nym-api/tests/src/endpoints/ContractCache.ts delete mode 100644 nym-api/tests/src/interfaces/StatusInterfaces.ts create mode 100644 nym-api/tests/src/types/CirculatingSupplyTypes.ts create mode 100644 nym-api/tests/src/types/ContractCacheTypes.ts create mode 100644 nym-api/tests/src/types/StatusInterfaces.ts diff --git a/Makefile b/Makefile index 1ebe76de9b..a19b0334f0 100644 --- a/Makefile +++ b/Makefile @@ -109,3 +109,6 @@ mixnet-opt: wasm generate-typescript: cd tools/ts-rs-cli && cargo run && cd ../.. yarn types:lint:fix + +run-validator-tests: + cd nym-api/tests/functional_test && yarn test:qa \ No newline at end of file diff --git a/nym-api/tests/.eslintignore b/nym-api/tests/.eslintignore new file mode 100644 index 0000000000..3b3d175248 --- /dev/null +++ b/nym-api/tests/.eslintignore @@ -0,0 +1,7 @@ +.vscode +node_modules +build +coverage +dist +.cache +jest.config.js \ No newline at end of file diff --git a/nym-api/tests/.eslintrc.json b/nym-api/tests/.eslintrc.json new file mode 100644 index 0000000000..a57c206630 --- /dev/null +++ b/nym-api/tests/.eslintrc.json @@ -0,0 +1,32 @@ +{ + "root": true, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "import/extensions": "off", + "no-console": ["warn", { "allow": ["warn", "error"] }], + "import/prefer-default-export": "off", + "prettier/prettier": ["error"] + }, + "overrides": [ + { + "files": ["**/*.ts", "**/*.tsx"], + "rules": { + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "no-shadow": "off", + "@typescript-eslint/no-shadow": ["error"] + } + } + ] + } + \ No newline at end of file diff --git a/nym-api/tests/.gitignore b/nym-api/tests/.gitignore new file mode 100644 index 0000000000..859116926c --- /dev/null +++ b/nym-api/tests/.gitignore @@ -0,0 +1,6 @@ +node_modules +dist +coverage/ +.DS_Store +.idea/ +junit.xml \ No newline at end of file diff --git a/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs b/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs new file mode 100755 index 0000000000..0912bea85e --- /dev/null +++ b/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs @@ -0,0 +1,783 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var nge=Object.create,Mh=Object.defineProperty,sge=Object.defineProperties,oge=Object.getOwnPropertyDescriptor,age=Object.getOwnPropertyDescriptors,Age=Object.getOwnPropertyNames,DE=Object.getOwnPropertySymbols,lge=Object.getPrototypeOf,eQ=Object.prototype.hasOwnProperty,OO=Object.prototype.propertyIsEnumerable;var MO=(r,e,t)=>e in r?Mh(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,N=(r,e)=>{for(var t in e||(e={}))eQ.call(e,t)&&MO(r,t,e[t]);if(DE)for(var t of DE(e))OO.call(e,t)&&MO(r,t,e[t]);return r},te=(r,e)=>sge(r,age(e)),cge=r=>Mh(r,"__esModule",{value:!0});var Or=(r,e)=>{var t={};for(var i in r)eQ.call(r,i)&&e.indexOf(i)<0&&(t[i]=r[i]);if(r!=null&&DE)for(var i of DE(r))e.indexOf(i)<0&&OO.call(r,i)&&(t[i]=r[i]);return t},uge=(r,e)=>()=>(r&&(e=r(r=0)),e),w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ft=(r,e)=>{for(var t in e)Mh(r,t,{get:e[t],enumerable:!0})},gge=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Age(e))!eQ.call(r,i)&&i!=="default"&&Mh(r,i,{get:()=>e[i],enumerable:!(t=oge(e,i))||t.enumerable});return r},ge=r=>gge(cge(Mh(r!=null?nge(lge(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var cM=w((i7e,oM)=>{oM.exports=aM;aM.sync=xge;var AM=require("fs");function kge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{uM.exports=gM;gM.sync=Pge;var fM=require("fs");function gM(r,e,t){fM.stat(r,function(i,n){t(i,i?!1:hM(n,e))})}function Pge(r,e){return hM(fM.statSync(r),e)}function hM(r,e){return r.isFile()&&Dge(r,e)}function Dge(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var CM=w((o7e,dM)=>{var s7e=require("fs"),zE;process.platform==="win32"||global.TESTING_WINDOWS?zE=cM():zE=pM();dM.exports=CQ;CQ.sync=Rge;function CQ(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){CQ(r,e||{},function(s,o){s?n(s):i(o)})})}zE(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function Rge(r,e){try{return zE.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var bM=w((a7e,mM)=>{var Xu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",EM=require("path"),Fge=Xu?";":":",IM=CM(),yM=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),wM=(r,e)=>{let t=e.colon||Fge,i=r.match(/\//)||Xu&&r.match(/\\/)?[""]:[...Xu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=Xu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Xu?n.split(t):[""];return Xu&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},BM=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=wM(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(yM(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=EM.join(h,r),m=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(m,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];IM(c+p,{pathExt:s},(m,y)=>{if(!m&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},Nge=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=wM(r,e),s=[];for(let o=0;o{"use strict";var QM=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};mQ.exports=QM;mQ.exports.default=QM});var PM=w((l7e,vM)=>{"use strict";var xM=require("path"),Lge=bM(),Tge=SM();function kM(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch(a){}let o;try{o=Lge.sync(r.command,{path:t[Tge({env:t})],pathExt:e?xM.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=xM.resolve(n?r.options.cwd:"",o)),o}function Oge(r){return kM(r)||kM(r,!0)}vM.exports=Oge});var DM=w((c7e,EQ)=>{"use strict";var IQ=/([()\][%!^"`<>&|;, *?])/g;function Mge(r){return r=r.replace(IQ,"^$1"),r}function Kge(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(IQ,"^$1"),e&&(r=r.replace(IQ,"^$1")),r}EQ.exports.command=Mge;EQ.exports.argument=Kge});var FM=w((u7e,RM)=>{"use strict";RM.exports=/^#!(.*)/});var LM=w((g7e,NM)=>{"use strict";var Uge=FM();NM.exports=(r="")=>{let e=r.match(Uge);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var OM=w((f7e,TM)=>{"use strict";var yQ=require("fs"),Hge=LM();function jge(r){let e=150,t=Buffer.alloc(e),i;try{i=yQ.openSync(r,"r"),yQ.readSync(i,t,0,e,0),yQ.closeSync(i)}catch(n){}return Hge(t.toString())}TM.exports=jge});var HM=w((h7e,MM)=>{"use strict";var Gge=require("path"),KM=PM(),UM=DM(),Yge=OM(),qge=process.platform==="win32",Jge=/\.(?:com|exe)$/i,Wge=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function zge(r){r.file=KM(r);let e=r.file&&Yge(r.file);return e?(r.args.unshift(r.file),r.command=e,KM(r)):r.file}function _ge(r){if(!qge)return r;let e=zge(r),t=!Jge.test(e);if(r.options.forceShell||t){let i=Wge.test(e);r.command=Gge.normalize(r.command),r.command=UM.command(r.command),r.args=r.args.map(s=>UM.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Vge(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:_ge(i)}MM.exports=Vge});var YM=w((p7e,jM)=>{"use strict";var wQ=process.platform==="win32";function BQ(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Xge(r,e){if(!wQ)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=GM(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function GM(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawn"):null}function Zge(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawnSync"):null}jM.exports={hookChildProcess:Xge,verifyENOENT:GM,verifyENOENTSync:Zge,notFoundError:BQ}});var SQ=w((d7e,Zu)=>{"use strict";var qM=require("child_process"),bQ=HM(),QQ=YM();function JM(r,e,t){let i=bQ(r,e,t),n=qM.spawn(i.command,i.args,i.options);return QQ.hookChildProcess(n,i),n}function $ge(r,e,t){let i=bQ(r,e,t),n=qM.spawnSync(i.command,i.args,i.options);return n.error=n.error||QQ.verifyENOENTSync(n.status,i),n}Zu.exports=JM;Zu.exports.spawn=JM;Zu.exports.sync=$ge;Zu.exports._parse=bQ;Zu.exports._enoent=QQ});var zM=w((C7e,WM)=>{"use strict";function efe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function cc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,cc)}efe(cc,Error);cc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",le=me(">>",!1),fe=">&",gt=me(">&",!1),Ht=">",Mt=me(">",!1),Ei="<<<",jt=me("<<<",!1),Qr="<&",Oi=me("<&",!1),Xs="<",Un=me("<",!1),Hn=function(C){return{type:"argument",segments:[].concat(...C)}},Sr=function(C){return C},jn="$'",fs=me("$'",!1),ba="'",DA=me("'",!1),Nu=function(C){return[{type:"text",text:C}]},hs='""',RA=me('""',!1),Qa=function(){return{type:"text",text:""}},Lu='"',FA=me('"',!1),NA=function(C){return C},vr=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},zl=function(C){return{type:"shell",shell:C,quoted:!0}},Tu=function(C){return te(N({type:"variable"},C),{quoted:!0})},xo=function(C){return{type:"text",text:C}},Ou=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},Sh=function(C){return{type:"shell",shell:C,quoted:!1}},vh=function(C){return te(N({type:"variable"},C),{quoted:!1})},Dr=function(C){return{type:"glob",pattern:C}},Ae=/^[^']/,ko=_e(["'"],!0,!1),Gn=function(C){return C.join("")},Mu=/^[^$"]/,St=_e(["$",'"'],!0,!1),_l=`\\ +`,Yn=me(`\\ +`,!1),ps=function(){return""},ds="\\",pt=me("\\",!1),Po=/^[\\$"`]/,lt=_e(["\\","$",'"',"`"],!1,!1),mn=function(C){return C},S="\\a",Tt=me("\\a",!1),Ku=function(){return"a"},Vl="\\b",xh=me("\\b",!1),kh=function(){return"\b"},Ph=/^[Ee]/,Dh=_e(["E","e"],!1,!1),Rh=function(){return""},j="\\f",wt=me("\\f",!1),LA=function(){return"\f"},$i="\\n",Xl=me("\\n",!1),$e=function(){return` +`},Sa="\\r",Uu=me("\\r",!1),yE=function(){return"\r"},Fh="\\t",wE=me("\\t",!1),gr=function(){return" "},qn="\\v",Zl=me("\\v",!1),Nh=function(){return"\v"},Zs=/^[\\'"?]/,va=_e(["\\","'",'"',"?"],!1,!1),En=function(C){return String.fromCharCode(parseInt(C,16))},Oe="\\x",Hu=me("\\x",!1),$l="\\u",$s=me("\\u",!1),ec="\\U",TA=me("\\U",!1),ju=function(C){return String.fromCodePoint(parseInt(C,16))},Gu=/^[0-7]/,xa=_e([["0","7"]],!1,!1),ka=/^[0-9a-fA-f]/,nt=_e([["0","9"],["a","f"],["A","f"]],!1,!1),Do=ot(),OA="-",tc=me("-",!1),eo="+",rc=me("+",!1),BE=".",Lh=me(".",!1),Yu=function(C,Q,F){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+F.join(""))}},Th=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},bE=function(C){return N({type:"variable"},C)},ic=function(C){return{type:"variable",name:C}},QE=function(C){return C},qu="*",MA=me("*",!1),Tr="/",SE=me("/",!1),to=function(C,Q,F){return{type:Q==="*"?"multiplication":"division",right:F}},ro=function(C,Q){return Q.reduce((F,U)=>N({left:F},U),C)},Ju=function(C,Q,F){return{type:Q==="+"?"addition":"subtraction",right:F}},KA="$((",R=me("$((",!1),G="))",Ce=me("))",!1),He=function(C){return C},Te="$(",Xe=me("$(",!1),Et=function(C){return C},Rt="${",Jn=me("${",!1),Ob=":-",lO=me(":-",!1),cO=function(C,Q){return{name:C,defaultValue:Q}},Mb=":-}",uO=me(":-}",!1),gO=function(C){return{name:C,defaultValue:[]}},Kb=":+",fO=me(":+",!1),hO=function(C,Q){return{name:C,alternativeValue:Q}},Ub=":+}",pO=me(":+}",!1),dO=function(C){return{name:C,alternativeValue:[]}},Hb=function(C){return{name:C}},CO="$",mO=me("$",!1),EO=function(C){return e.isGlobPattern(C)},IO=function(C){return C},jb=/^[a-zA-Z0-9_]/,Gb=_e([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Yb=function(){return M()},qb=/^[$@*?#a-zA-Z0-9_\-]/,Jb=_e(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),yO=/^[(){}<>$|&; \t"']/,Wu=_e(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Wb=/^[<>&; \t"']/,zb=_e(["<",">","&",";"," "," ",'"',"'"],!1,!1),vE=/^[ \t]/,xE=_e([" "," "],!1,!1),B=0,Ue=0,UA=[{line:1,column:1}],d=0,E=[],I=0,D;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function M(){return r.substring(Ue,B)}function z(){return yt(Ue,B)}function ie(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Mi([ut(C)],r.substring(Ue,B),Q)}function we(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Wn(C,Q)}function me(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function _e(C,Q,F){return{type:"class",parts:C,inverted:Q,ignoreCase:F}}function ot(){return{type:"any"}}function Bt(){return{type:"end"}}function ut(C){return{type:"other",description:C}}function st(C){var Q=UA[C],F;if(Q)return Q;for(F=C-1;!UA[F];)F--;for(Q=UA[F],Q={line:Q.line,column:Q.column};Fd&&(d=B,E=[]),E.push(C))}function Wn(C,Q){return new cc(C,null,null,Q)}function Mi(C,Q,F){return new cc(cc.buildMessage(C,Q),C,Q,F)}function HA(){var C,Q;return C=B,Q=Yr(),Q===t&&(Q=null),Q!==t&&(Ue=C,Q=s(Q)),C=Q,C}function Yr(){var C,Q,F,U,ue;if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U!==t?(ue=Cs(),ue===t&&(ue=null),ue!==t?(Ue=C,Q=o(Q,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;if(C===t)if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U===t&&(U=null),U!==t?(Ue=C,Q=a(Q,U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Cs(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yr(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=l(F),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function Pa(){var C;return r.charCodeAt(B)===59?(C=c,B++):(C=t,I===0&&xe(u)),C===t&&(r.charCodeAt(B)===38?(C=g,B++):(C=t,I===0&&xe(f))),C}function qr(){var C,Q,F;return C=B,Q=wO(),Q!==t?(F=Hue(),F===t&&(F=null),F!==t?(Ue=C,Q=h(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Hue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=jue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=qr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=p(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function jue(){var C;return r.substr(B,2)===m?(C=m,B+=2):(C=t,I===0&&xe(y)),C===t&&(r.substr(B,2)===b?(C=b,B+=2):(C=t,I===0&&xe(v))),C}function wO(){var C,Q,F;return C=B,Q=que(),Q!==t?(F=Gue(),F===t&&(F=null),F!==t?(Ue=C,Q=x(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Gue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=wO(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=T(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function Yue(){var C;return r.substr(B,2)===q?(C=q,B+=2):(C=t,I===0&&xe(Y)),C===t&&(r.charCodeAt(B)===124?(C=$,B++):(C=t,I===0&&xe(_))),C}function kE(){var C,Q,F,U,ue,De;if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t)if(U=QO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(Ue=C,Q=A(Q,U),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;else B=C,C=t;if(C===t)if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=oe(Q),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function que(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===40?(F=ce,B++):(F=t,I===0&&xe(Z)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===41?(Ct=O,B++):(Ct=t,I===0&&xe(L)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=de(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===123?(F=Be,B++):(F=t,I===0&&xe(je)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===125?(Ct=re,B++):(Ct=t,I===0&&xe(se)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=be(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){for(F=[],U=kE();U!==t;)F.push(U),U=kE();if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t){if(ue=[],De=bO(),De!==t)for(;De!==t;)ue.push(De),De=bO();else ue=t;if(ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=he(F,ue),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t}else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=kE(),U!==t)for(;U!==t;)F.push(U),U=kE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Fe(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}}}return C}function BO(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=PE(),U!==t)for(;U!==t;)F.push(U),U=PE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Ke(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t;return C}function bO(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t?(F=Oh(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();Q!==t?(F=PE(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t)}return C}function Oh(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(ve.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(pe)),F===t&&(F=null),F!==t?(U=Jue(),U!==t?(ue=PE(),ue!==t?(Ue=C,Q=V(F,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Jue(){var C;return r.substr(B,2)===Qe?(C=Qe,B+=2):(C=t,I===0&&xe(le)),C===t&&(r.substr(B,2)===fe?(C=fe,B+=2):(C=t,I===0&&xe(gt)),C===t&&(r.charCodeAt(B)===62?(C=Ht,B++):(C=t,I===0&&xe(Mt)),C===t&&(r.substr(B,3)===Ei?(C=Ei,B+=3):(C=t,I===0&&xe(jt)),C===t&&(r.substr(B,2)===Qr?(C=Qr,B+=2):(C=t,I===0&&xe(Oi)),C===t&&(r.charCodeAt(B)===60?(C=Xs,B++):(C=t,I===0&&xe(Un))))))),C}function PE(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(F=QO(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C}function QO(){var C,Q,F;if(C=B,Q=[],F=SO(),F!==t)for(;F!==t;)Q.push(F),F=SO();else Q=t;return Q!==t&&(Ue=C,Q=Hn(Q)),C=Q,C}function SO(){var C,Q;return C=B,Q=Wue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=zue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=_ue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=Vue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q))),C}function Wue(){var C,Q,F,U;return C=B,r.substr(B,2)===jn?(Q=jn,B+=2):(Q=t,I===0&&xe(fs)),Q!==t?(F=$ue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function zue(){var C,Q,F,U;return C=B,r.charCodeAt(B)===39?(Q=ba,B++):(Q=t,I===0&&xe(DA)),Q!==t?(F=Xue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function _ue(){var C,Q,F,U;if(C=B,r.substr(B,2)===hs?(Q=hs,B+=2):(Q=t,I===0&&xe(RA)),Q!==t&&(Ue=C,Q=Qa()),C=Q,C===t)if(C=B,r.charCodeAt(B)===34?(Q=Lu,B++):(Q=t,I===0&&xe(FA)),Q!==t){for(F=[],U=vO();U!==t;)F.push(U),U=vO();F!==t?(r.charCodeAt(B)===34?(U=Lu,B++):(U=t,I===0&&xe(FA)),U!==t?(Ue=C,Q=NA(F),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Vue(){var C,Q,F;if(C=B,Q=[],F=xO(),F!==t)for(;F!==t;)Q.push(F),F=xO();else Q=t;return Q!==t&&(Ue=C,Q=NA(Q)),C=Q,C}function vO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=vr(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=zl(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=Tu(Q)),C=Q,C===t&&(C=B,Q=Zue(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q))),C}function xO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=Ou(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=Sh(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=vh(Q)),C=Q,C===t&&(C=B,Q=rge(),Q!==t&&(Ue=C,Q=Dr(Q)),C=Q,C===t&&(C=B,Q=tge(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q)))),C}function Xue(){var C,Q,F;for(C=B,Q=[],Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));F!==t;)Q.push(F),Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Zue(){var C,Q,F;if(C=B,Q=[],F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St))),F!==t)for(;F!==t;)Q.push(F),F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St)));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function kO(){var C,Q,F;return C=B,r.substr(B,2)===_l?(Q=_l,B+=2):(Q=t,I===0&&xe(Yn)),Q!==t&&(Ue=C,Q=ps()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Po.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(lt)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t)),C}function $ue(){var C,Q,F;for(C=B,Q=[],F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));F!==t;)Q.push(F),F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function PO(){var C,Q,F;return C=B,r.substr(B,2)===S?(Q=S,B+=2):(Q=t,I===0&&xe(Tt)),Q!==t&&(Ue=C,Q=Ku()),C=Q,C===t&&(C=B,r.substr(B,2)===Vl?(Q=Vl,B+=2):(Q=t,I===0&&xe(xh)),Q!==t&&(Ue=C,Q=kh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Ph.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Dh)),F!==t?(Ue=C,Q=Rh(),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===j?(Q=j,B+=2):(Q=t,I===0&&xe(wt)),Q!==t&&(Ue=C,Q=LA()),C=Q,C===t&&(C=B,r.substr(B,2)===$i?(Q=$i,B+=2):(Q=t,I===0&&xe(Xl)),Q!==t&&(Ue=C,Q=$e()),C=Q,C===t&&(C=B,r.substr(B,2)===Sa?(Q=Sa,B+=2):(Q=t,I===0&&xe(Uu)),Q!==t&&(Ue=C,Q=yE()),C=Q,C===t&&(C=B,r.substr(B,2)===Fh?(Q=Fh,B+=2):(Q=t,I===0&&xe(wE)),Q!==t&&(Ue=C,Q=gr()),C=Q,C===t&&(C=B,r.substr(B,2)===qn?(Q=qn,B+=2):(Q=t,I===0&&xe(Zl)),Q!==t&&(Ue=C,Q=Nh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Zs.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(va)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=ege()))))))))),C}function ege(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms,$b;return C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(F=_b(),F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Oe?(Q=Oe,B+=2):(Q=t,I===0&&xe(Hu)),Q!==t?(F=B,U=B,ue=_b(),ue!==t?(De=zn(),De!==t?(ue=[ue,De],U=ue):(B=U,U=t)):(B=U,U=t),U===t&&(U=_b()),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===$l?(Q=$l,B+=2):(Q=t,I===0&&xe($s)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?(ue=[ue,De,Ct,bt],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===ec?(Q=ec,B+=2):(Q=t,I===0&&xe(TA)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?($r=zn(),$r!==t?(Ii=zn(),Ii!==t?(ms=zn(),ms!==t?($b=zn(),$b!==t?(ue=[ue,De,Ct,bt,$r,Ii,ms,$b],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=ju(F),C=Q):(B=C,C=t)):(B=C,C=t)))),C}function _b(){var C;return Gu.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(xa)),C}function zn(){var C;return ka.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(nt)),C}function tge(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t)),F!==t)for(;F!==t;)Q.push(F),F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Vb(){var C,Q,F,U,ue,De;if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;if(F!==t)if(r.charCodeAt(B)===46?(U=BE,B++):(U=t,I===0&&xe(Lh)),U!==t){if(ue=[],ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe)),De!==t)for(;De!==t;)ue.push(De),ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe));else ue=t;ue!==t?(Ue=C,Q=Yu(Q,F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;if(C===t){if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;F!==t?(Ue=C,Q=Th(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;if(C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=bE(Q)),C=Q,C===t&&(C=B,Q=nc(),Q!==t&&(Ue=C,Q=ic(Q)),C=Q,C===t)))if(C=B,r.charCodeAt(B)===40?(Q=ce,B++):(Q=t,I===0&&xe(Z)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.charCodeAt(B)===41?(De=O,B++):(De=t,I===0&&xe(L)),De!==t?(Ue=C,Q=QE(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t}return C}function Xb(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Vb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function DO(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Xb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function RO(){var C,Q,F,U,ue,De;if(C=B,r.substr(B,3)===KA?(Q=KA,B+=3):(Q=t,I===0&&xe(R)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.substr(B,2)===G?(De=G,B+=2):(De=t,I===0&&xe(Ce)),De!==t?(Ue=C,Q=He(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;return C}function FO(){var C,Q,F,U;return C=B,r.substr(B,2)===Te?(Q=Te,B+=2):(Q=t,I===0&&xe(Xe)),Q!==t?(F=Yr(),F!==t?(r.charCodeAt(B)===41?(U=O,B++):(U=t,I===0&&xe(L)),U!==t?(Ue=C,Q=Et(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Zb(){var C,Q,F,U,ue,De;return C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Ob?(U=Ob,B+=2):(U=t,I===0&&xe(lO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=cO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Mb?(U=Mb,B+=3):(U=t,I===0&&xe(uO)),U!==t?(Ue=C,Q=gO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Kb?(U=Kb,B+=2):(U=t,I===0&&xe(fO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=hO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Ub?(U=Ub,B+=3):(U=t,I===0&&xe(pO)),U!==t?(Ue=C,Q=dO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.charCodeAt(B)===125?(U=re,B++):(U=t,I===0&&xe(se)),U!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.charCodeAt(B)===36?(Q=CO,B++):(Q=t,I===0&&xe(mO)),Q!==t?(F=nc(),F!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)))))),C}function rge(){var C,Q,F;return C=B,Q=ige(),Q!==t?(Ue=B,F=EO(Q),F?F=void 0:F=t,F!==t?(Ue=C,Q=IO(Q),C=Q):(B=C,C=t)):(B=C,C=t),C}function ige(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F!==t)for(;F!==t;)Q.push(F),F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t);else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function NO(){var C,Q,F;if(C=B,Q=[],jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb)),F!==t)for(;F!==t;)Q.push(F),jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function nc(){var C,Q,F;if(C=B,Q=[],qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb)),F!==t)for(;F!==t;)Q.push(F),qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function LO(){var C;return yO.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(Wu)),C}function TO(){var C;return Wb.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(zb)),C}function Ye(){var C,Q;if(C=[],vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE)),Q!==t)for(;Q!==t;)C.push(Q),vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE));else C=t;return C}if(D=n(),D!==t&&B===r.length)return D;throw D!==t&&B{"use strict";function rfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function gc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,gc)}rfe(gc,Error);gc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gq&&(q=v,Y=[]),Y.push(pe))}function se(pe,V){return new gc(pe,null,null,V)}function be(pe,V,Qe){return new gc(gc.buildMessage(pe,V),pe,V,Qe)}function he(){var pe,V,Qe,le;return pe=v,V=Fe(),V!==t?(r.charCodeAt(v)===47?(Qe=s,v++):(Qe=t,$===0&&re(o)),Qe!==t?(le=Fe(),le!==t?(x=pe,V=a(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Fe(),V!==t&&(x=pe,V=l(V)),pe=V),pe}function Fe(){var pe,V,Qe,le;return pe=v,V=Ke(),V!==t?(r.charCodeAt(v)===64?(Qe=c,v++):(Qe=t,$===0&&re(u)),Qe!==t?(le=ve(),le!==t?(x=pe,V=g(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Ke(),V!==t&&(x=pe,V=f(V)),pe=V),pe}function Ke(){var pe,V,Qe,le,fe;return pe=v,r.charCodeAt(v)===64?(V=c,v++):(V=t,$===0&&re(u)),V!==t?(Qe=ke(),Qe!==t?(r.charCodeAt(v)===47?(le=s,v++):(le=t,$===0&&re(o)),le!==t?(fe=ke(),fe!==t?(x=pe,V=h(),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=ke(),V!==t&&(x=pe,V=h()),pe=V),pe}function ke(){var pe,V,Qe;if(pe=v,V=[],p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m)),Qe!==t)for(;Qe!==t;)V.push(Qe),p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}function ve(){var pe,V,Qe;if(pe=v,V=[],y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b)),Qe!==t)for(;Qe!==t;)V.push(Qe),y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}if(_=n(),_!==t&&v===r.length)return _;throw _!==t&&v{"use strict";function $M(r){return typeof r=="undefined"||r===null}function nfe(r){return typeof r=="object"&&r!==null}function sfe(r){return Array.isArray(r)?r:$M(r)?[]:[r]}function ofe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function ep(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}ep.prototype=Object.create(Error.prototype);ep.prototype.constructor=ep;ep.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};e1.exports=ep});var i1=w((L7e,t1)=>{"use strict";var r1=hc();function RQ(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}RQ.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),r1.repeat(" ",e)+i+a+s+` +`+r1.repeat(" ",e+this.position-n+i.length)+"^"};RQ.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: +`+t)),i};t1.exports=RQ});var ci=w((T7e,n1)=>{"use strict";var s1=tg(),lfe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],cfe=["scalar","sequence","mapping"];function ufe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function gfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(lfe.indexOf(t)===-1)throw new s1('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=ufe(e.styleAliases||null),cfe.indexOf(this.kind)===-1)throw new s1('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}n1.exports=gfe});var pc=w((O7e,o1)=>{"use strict";var a1=hc(),tI=tg(),ffe=ci();function FQ(r,e,t){var i=[];return r.include.forEach(function(n){t=FQ(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function hfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var pfe=ci();A1.exports=new pfe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var u1=w((K7e,c1)=>{"use strict";var dfe=ci();c1.exports=new dfe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var f1=w((U7e,g1)=>{"use strict";var Cfe=ci();g1.exports=new Cfe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var rI=w((H7e,h1)=>{"use strict";var mfe=pc();h1.exports=new mfe({explicit:[l1(),u1(),f1()]})});var d1=w((j7e,p1)=>{"use strict";var Efe=ci();function Ife(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function yfe(){return null}function wfe(r){return r===null}p1.exports=new Efe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Ife,construct:yfe,predicate:wfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var m1=w((G7e,C1)=>{"use strict";var Bfe=ci();function bfe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function Qfe(r){return r==="true"||r==="True"||r==="TRUE"}function Sfe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}C1.exports=new Bfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:bfe,construct:Qfe,predicate:Sfe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var I1=w((Y7e,E1)=>{"use strict";var vfe=hc(),xfe=ci();function kfe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function Pfe(r){return 48<=r&&r<=55}function Dfe(r){return 48<=r&&r<=57}function Rfe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var B1=w((q7e,y1)=>{"use strict";var w1=hc(),Lfe=ci(),Tfe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Ofe(r){return!(r===null||!Tfe.test(r)||r[r.length-1]==="_")}function Mfe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var Kfe=/^[-+]?[0-9]+e/;function Ufe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(w1.isNegativeZero(r))return"-0.0";return t=r.toString(10),Kfe.test(t)?t.replace("e",".e"):t}function Hfe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!=0||w1.isNegativeZero(r))}y1.exports=new Lfe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Ofe,construct:Mfe,predicate:Hfe,represent:Ufe,defaultStyle:"lowercase"})});var NQ=w((J7e,b1)=>{"use strict";var jfe=pc();b1.exports=new jfe({include:[rI()],implicit:[d1(),m1(),I1(),B1()]})});var LQ=w((W7e,Q1)=>{"use strict";var Gfe=pc();Q1.exports=new Gfe({include:[NQ()]})});var k1=w((z7e,S1)=>{"use strict";var Yfe=ci(),v1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),x1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function qfe(r){return r===null?!1:v1.exec(r)!==null||x1.exec(r)!==null}function Jfe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=v1.exec(r),e===null&&(e=x1.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Wfe(r){return r.toISOString()}S1.exports=new Yfe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:qfe,construct:Jfe,instanceOf:Date,represent:Wfe})});var D1=w((_7e,P1)=>{"use strict";var zfe=ci();function _fe(r){return r==="<<"||r===null}P1.exports=new zfe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:_fe})});var N1=w((V7e,R1)=>{"use strict";var dc;try{F1=require,dc=F1("buffer").Buffer}catch(r){}var F1,Vfe=ci(),TQ=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function Xfe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=TQ;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8==0}function Zfe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=TQ,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),dc?dc.from?dc.from(a):new dc(a):a}function $fe(r){var e="",t=0,i,n,s=r.length,o=TQ;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function ehe(r){return dc&&dc.isBuffer(r)}R1.exports=new Vfe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Xfe,construct:Zfe,predicate:ehe,represent:$fe})});var T1=w((X7e,L1)=>{"use strict";var the=ci(),rhe=Object.prototype.hasOwnProperty,ihe=Object.prototype.toString;function nhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var ohe=ci(),ahe=Object.prototype.toString;function Ahe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var che=ci(),uhe=Object.prototype.hasOwnProperty;function ghe(r){if(r===null)return!0;var e,t=r;for(e in t)if(uhe.call(t,e)&&t[e]!==null)return!1;return!0}function fhe(r){return r!==null?r:{}}K1.exports=new che("tag:yaml.org,2002:set",{kind:"mapping",resolve:ghe,construct:fhe})});var ig=w((eXe,H1)=>{"use strict";var hhe=pc();H1.exports=new hhe({include:[LQ()],implicit:[k1(),D1()],explicit:[N1(),T1(),M1(),U1()]})});var G1=w((tXe,j1)=>{"use strict";var phe=ci();function dhe(){return!0}function Che(){}function mhe(){return""}function Ehe(r){return typeof r=="undefined"}j1.exports=new phe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:dhe,construct:Che,predicate:Ehe,represent:mhe})});var q1=w((rXe,Y1)=>{"use strict";var Ihe=ci();function yhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function whe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Bhe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function bhe(r){return Object.prototype.toString.call(r)==="[object RegExp]"}Y1.exports=new Ihe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:yhe,construct:whe,predicate:bhe,represent:Bhe})});var z1=w((iXe,J1)=>{"use strict";var iI;try{W1=require,iI=W1("esprima")}catch(r){typeof window!="undefined"&&(iI=window.esprima)}var W1,Qhe=ci();function She(r){if(r===null)return!1;try{var e="("+r+")",t=iI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function vhe(r){var e="("+r+")",t=iI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function xhe(r){return r.toString()}function khe(r){return Object.prototype.toString.call(r)==="[object Function]"}J1.exports=new Qhe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:She,construct:vhe,predicate:khe,represent:xhe})});var tp=w((nXe,_1)=>{"use strict";var V1=pc();_1.exports=V1.DEFAULT=new V1({include:[ig()],explicit:[G1(),q1(),z1()]})});var pK=w((sXe,rp)=>{"use strict";var Oa=hc(),X1=tg(),Phe=i1(),Z1=ig(),Dhe=tp(),JA=Object.prototype.hasOwnProperty,nI=1,$1=2,eK=3,sI=4,OQ=1,Rhe=2,tK=3,Fhe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Nhe=/[\x85\u2028\u2029]/,Lhe=/[,\[\]\{\}]/,rK=/^(?:!|!!|![a-z\-]+!)$/i,iK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function nK(r){return Object.prototype.toString.call(r)}function Lo(r){return r===10||r===13}function Cc(r){return r===9||r===32}function yn(r){return r===9||r===32||r===10||r===13}function ng(r){return r===44||r===91||r===93||r===123||r===125}function The(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Ohe(r){return r===120?2:r===117?4:r===85?8:0}function Mhe(r){return 48<=r&&r<=57?r-48:-1}function sK(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` +`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function Khe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var oK=new Array(256),aK=new Array(256);for(var sg=0;sg<256;sg++)oK[sg]=sK(sg)?1:0,aK[sg]=sK(sg);function Uhe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||Dhe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function AK(r,e){return new X1(e,new Phe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function dt(r,e){throw AK(r,e)}function oI(r,e){r.onWarning&&r.onWarning.call(null,AK(r,e))}var lK={YAML:function(e,t,i){var n,s,o;e.version!==null&&dt(e,"duplication of %YAML directive"),i.length!==1&&dt(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&dt(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&dt(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&oI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&dt(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],rK.test(n)||dt(e,"ill-formed tag handle (first argument) of the TAG directive"),JA.call(e.tagMap,n)&&dt(e,'there is a previously declared suffix for "'+n+'" tag handle'),iK.test(s)||dt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function WA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Oa.repeat(` +`,e-1))}function Hhe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),yn(h)||ng(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),yn(i))break}else{if(r.position===r.lineStart&&aI(r)||t&&ng(h))break;if(Lo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,ei(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(WA(r,s,o,!1),KQ(r,r.line-l),s=o=r.position,a=!1),Cc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return WA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function jhe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(WA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else Lo(t)?(WA(r,i,n,!0),KQ(r,ei(r,!1,e)),i=n=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);dt(r,"unexpected end of the stream within a single quoted scalar")}function Ghe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return WA(r,t,r.position,!0),r.position++,!0;if(a===92){if(WA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),Lo(a))ei(r,!1,e);else if(a<256&&oK[a])r.result+=aK[a],r.position++;else if((o=Ohe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=The(a))>=0?s=(s<<4)+o:dt(r,"expected hexadecimal character");r.result+=Khe(s),r.position++}else dt(r,"unknown escape sequence");t=i=r.position}else Lo(a)?(WA(r,t,i,!0),KQ(r,ei(r,!1,e)),t=i=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}dt(r,"unexpected end of the stream within a double quoted scalar")}function Yhe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,m,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(ei(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||dt(r,"missed comma between flow collection entries"),p=h=m=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),yn(a)&&(c=u=!0,r.position++,ei(r,!0,e))),i=r.line,ag(r,e,nI,!1,!0),p=r.tag,h=r.result,ei(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),ei(r,!0,e),ag(r,e,nI,!1,!0),m=r.result),g?og(r,s,f,p,h,m):c?s.push(og(r,null,f,p,h,m)):s.push(h),ei(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}dt(r,"unexpected end of the stream within a flow collection")}function qhe(r,e){var t,i,n=OQ,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)OQ===n?n=g===43?tK:Rhe:dt(r,"repeat of a chomping mode identifier");else if((u=Mhe(g))>=0)u===0?dt(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?dt(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Cc(g)){do g=r.input.charCodeAt(++r.position);while(Cc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!Lo(g)&&g!==0)}for(;g!==0;){for(MQ(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),Lo(g)){l++;continue}if(r.lineIndente)&&l!==0)dt(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(ag(r,e,sI,!0,n)&&(p?f=r.result:h=r.result),p||(og(r,c,u,g,f,h,s,o),g=f=h=null),ei(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)dt(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):dt(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):dt(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function Vhe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(ei(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&dt(r,"directive name must not be less than one character in length");o!==0;){for(;Cc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!Lo(o));break}if(Lo(o))break;for(t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&MQ(r),JA.call(lK,i)?lK[i](r,i,n):oI(r,'unknown document directive "'+i+'"')}if(ei(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,ei(r,!0,-1)):s&&dt(r,"directives end mark is expected"),ag(r,r.lineIndent-1,sI,!1,!0),ei(r,!0,-1),r.checkLineBreaks&&Nhe.test(r.input.slice(e,r.position))&&oI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&aI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,ei(r,!0,-1));return}if(r.position{"use strict";var ip=hc(),np=tg(),$he=tp(),epe=ig(),dK=Object.prototype.toString,CK=Object.prototype.hasOwnProperty,tpe=9,sp=10,rpe=13,ipe=32,npe=33,spe=34,mK=35,ope=37,ape=38,Ape=39,lpe=42,EK=44,cpe=45,IK=58,upe=61,gpe=62,fpe=63,hpe=64,yK=91,wK=93,ppe=96,BK=123,dpe=124,bK=125,Ki={};Ki[0]="\\0";Ki[7]="\\a";Ki[8]="\\b";Ki[9]="\\t";Ki[10]="\\n";Ki[11]="\\v";Ki[12]="\\f";Ki[13]="\\r";Ki[27]="\\e";Ki[34]='\\"';Ki[92]="\\\\";Ki[133]="\\N";Ki[160]="\\_";Ki[8232]="\\L";Ki[8233]="\\P";var Cpe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function mpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Ag(o))return AI;a=s>0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?kK:PK:t>9&&xK(r)?AI:c?RK:DK}function Spe(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&Cpe.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Ipe(r,l)}switch(Bpe(e,o,r.indent,s,a)){case kK:return e;case PK:return"'"+e.replace(/'/g,"''")+"'";case DK:return"|"+FK(e,r.indent)+NK(SK(e,n));case RK:return">"+FK(e,r.indent)+NK(SK(bpe(e,s),n));case AI:return'"'+Qpe(e,s)+'"';default:throw new np("impossible error: invalid scalar style")}}()}function FK(r,e){var t=xK(r)?String(e):"",i=r[r.length-1]===` +`,n=i&&(r[r.length-2]===` +`||r===` +`),s=n?"+":i?"":"-";return t+s+` +`}function NK(r){return r[r.length-1]===` +`?r.slice(0,-1):r}function bpe(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` +`);return c=c!==-1?c:r.length,t.lastIndex=c,LK(r.slice(0,c),e)}(),n=r[0]===` +`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` +`:"")+LK(l,e),n=s}return i}function LK(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` +`+r.slice(n,s),n=s+1),o=a;return l+=` +`,r.length-n>e&&o>n?l+=r.slice(n,o)+` +`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Qpe(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=QK((t-55296)*1024+i-56320+65536),s++;continue}n=Ki[t],e+=!n&&Ag(t)?r[s]:n||QK(t)}return e}function vpe(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),!!mc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function Ppe(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new np("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&sp===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=HQ(r,e)),!!mc(r,e+1,u,!0,g)&&(r.dump&&sp===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function TK(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function mc(r,e,t,i,n,s){r.tag=null,r.dump=t,TK(r,t,!1)||TK(r,t,!0);var o=dK.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(Ppe(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(kpe(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(xpe(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(vpe(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&Spe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new np("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function Dpe(r,e){var t=[],i=[],n,s;for(GQ(r,t,i),n=0,s=i.length;n{"use strict";var lI=pK(),KK=MK();function cI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Mr.exports.Type=ci();Mr.exports.Schema=pc();Mr.exports.FAILSAFE_SCHEMA=rI();Mr.exports.JSON_SCHEMA=NQ();Mr.exports.CORE_SCHEMA=LQ();Mr.exports.DEFAULT_SAFE_SCHEMA=ig();Mr.exports.DEFAULT_FULL_SCHEMA=tp();Mr.exports.load=lI.load;Mr.exports.loadAll=lI.loadAll;Mr.exports.safeLoad=lI.safeLoad;Mr.exports.safeLoadAll=lI.safeLoadAll;Mr.exports.dump=KK.dump;Mr.exports.safeDump=KK.safeDump;Mr.exports.YAMLException=tg();Mr.exports.MINIMAL_SCHEMA=rI();Mr.exports.SAFE_SCHEMA=ig();Mr.exports.DEFAULT_SCHEMA=tp();Mr.exports.scan=cI("scan");Mr.exports.parse=cI("parse");Mr.exports.compose=cI("compose");Mr.exports.addConstructor=cI("addConstructor")});var jK=w((AXe,HK)=>{"use strict";var Fpe=UK();HK.exports=Fpe});var YK=w((lXe,GK)=>{"use strict";function Npe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ec(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ec)}Npe(Ec,Error);Ec.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[He]:Ce})))},q=function(R){return R},Y=function(R){return R},$=Zs("correct indentation"),_=" ",ne=gr(" ",!1),ee=function(R){return R.length===KA*Ju},A=function(R){return R.length===(KA+1)*Ju},oe=function(){return KA++,!0},ce=function(){return KA--,!0},Z=function(){return Uu()},O=Zs("pseudostring"),L=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,de=qn(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Be=/^[^\r\n\t ,\][{}:#"']/,je=qn(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),re=function(){return Uu().replace(/^ *| *$/g,"")},se="--",be=gr("--",!1),he=/^[a-zA-Z\/0-9]/,Fe=qn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ke=/^[^\r\n\t :,]/,ke=qn(["\r",` +`," "," ",":",","],!0,!1),ve="null",pe=gr("null",!1),V=function(){return null},Qe="true",le=gr("true",!1),fe=function(){return!0},gt="false",Ht=gr("false",!1),Mt=function(){return!1},Ei=Zs("string"),jt='"',Qr=gr('"',!1),Oi=function(){return""},Xs=function(R){return R},Un=function(R){return R.join("")},Hn=/^[^"\\\0-\x1F\x7F]/,Sr=qn(['"',"\\",["\0",""],"\x7F"],!0,!1),jn='\\"',fs=gr('\\"',!1),ba=function(){return'"'},DA="\\\\",Nu=gr("\\\\",!1),hs=function(){return"\\"},RA="\\/",Qa=gr("\\/",!1),Lu=function(){return"/"},FA="\\b",NA=gr("\\b",!1),vr=function(){return"\b"},zl="\\f",Tu=gr("\\f",!1),xo=function(){return"\f"},Ou="\\n",Sh=gr("\\n",!1),vh=function(){return` +`},Dr="\\r",Ae=gr("\\r",!1),ko=function(){return"\r"},Gn="\\t",Mu=gr("\\t",!1),St=function(){return" "},_l="\\u",Yn=gr("\\u",!1),ps=function(R,G,Ce,He){return String.fromCharCode(parseInt(`0x${R}${G}${Ce}${He}`))},ds=/^[0-9a-fA-F]/,pt=qn([["0","9"],["a","f"],["A","F"]],!1,!1),Po=Zs("blank space"),lt=/^[ \t]/,mn=qn([" "," "],!1,!1),S=Zs("white space"),Tt=/^[ \t\n\r]/,Ku=qn([" "," ",` +`,"\r"],!1,!1),Vl=`\r +`,xh=gr(`\r +`,!1),kh=` +`,Ph=gr(` +`,!1),Dh="\r",Rh=gr("\r",!1),j=0,wt=0,LA=[{line:1,column:1}],$i=0,Xl=[],$e=0,Sa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Uu(){return r.substring(wt,j)}function yE(){return En(wt,j)}function Fh(R,G){throw G=G!==void 0?G:En(wt,j),$l([Zs(R)],r.substring(wt,j),G)}function wE(R,G){throw G=G!==void 0?G:En(wt,j),Hu(R,G)}function gr(R,G){return{type:"literal",text:R,ignoreCase:G}}function qn(R,G,Ce){return{type:"class",parts:R,inverted:G,ignoreCase:Ce}}function Zl(){return{type:"any"}}function Nh(){return{type:"end"}}function Zs(R){return{type:"other",description:R}}function va(R){var G=LA[R],Ce;if(G)return G;for(Ce=R-1;!LA[Ce];)Ce--;for(G=LA[Ce],G={line:G.line,column:G.column};Ce$i&&($i=j,Xl=[]),Xl.push(R))}function Hu(R,G){return new Ec(R,null,null,G)}function $l(R,G,Ce){return new Ec(Ec.buildMessage(R,G),R,G,Ce)}function $s(){var R;return R=ju(),R}function ec(){var R,G,Ce;for(R=j,G=[],Ce=TA();Ce!==t;)G.push(Ce),Ce=TA();return G!==t&&(wt=R,G=s(G)),R=G,R}function TA(){var R,G,Ce,He,Te;return R=j,G=ka(),G!==t?(r.charCodeAt(j)===45?(Ce=o,j++):(Ce=t,$e===0&&Oe(a)),Ce!==t?(He=Tr(),He!==t?(Te=xa(),Te!==t?(wt=R,G=l(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R}function ju(){var R,G,Ce;for(R=j,G=[],Ce=Gu();Ce!==t;)G.push(Ce),Ce=Gu();return G!==t&&(wt=R,G=c(G)),R=G,R}function Gu(){var R,G,Ce,He,Te,Xe,Et,Rt,Jn;if(R=j,G=Tr(),G===t&&(G=null),G!==t){if(Ce=j,r.charCodeAt(j)===35?(He=u,j++):(He=t,$e===0&&Oe(g)),He!==t){if(Te=[],Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t),Xe!==t)for(;Xe!==t;)Te.push(Xe),Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t);else Te=t;Te!==t?(He=[He,Te],Ce=He):(j=Ce,Ce=t)}else j=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(He=[],Te=to(),Te!==t)for(;Te!==t;)He.push(Te),Te=to();else He=t;He!==t?(wt=R,G=h(),R=G):(j=R,R=t)}else j=R,R=t}else j=R,R=t;if(R===t&&(R=j,G=ka(),G!==t?(Ce=tc(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ka(),G!==t?(Ce=eo(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))){if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t)if(He=Tr(),He!==t)if(Te=BE(),Te!==t){if(Xe=[],Et=to(),Et!==t)for(;Et!==t;)Xe.push(Et),Et=to();else Xe=t;Xe!==t?(wt=R,G=y(Ce,Te),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;else j=R,R=t;else j=R,R=t;if(R===t)if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t){if(He=[],Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t),Te!==t)for(;Te!==t;)He.push(Te),Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t);else He=t;He!==t?(Te=Tr(),Te===t&&(Te=null),Te!==t?(r.charCodeAt(j)===58?(Xe=p,j++):(Xe=t,$e===0&&Oe(m)),Xe!==t?(Et=Tr(),Et===t&&(Et=null),Et!==t?(Rt=xa(),Rt!==t?(wt=R,G=T(Ce,He,Rt),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)}else j=R,R=t;else j=R,R=t}return R}function xa(){var R,G,Ce,He,Te,Xe,Et;if(R=j,G=j,$e++,Ce=j,He=ro(),He!==t?(Te=nt(),Te!==t?(r.charCodeAt(j)===45?(Xe=o,j++):(Xe=t,$e===0&&Oe(a)),Xe!==t?(Et=Tr(),Et!==t?(He=[He,Te,Xe,Et],Ce=He):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t),$e--,Ce!==t?(j=G,G=void 0):G=t,G!==t?(Ce=to(),Ce!==t?(He=Do(),He!==t?(Te=ec(),Te!==t?(Xe=OA(),Xe!==t?(wt=R,G=q(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ro(),G!==t?(Ce=Do(),Ce!==t?(He=ju(),He!==t?(Te=OA(),Te!==t?(wt=R,G=q(He),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))if(R=j,G=rc(),G!==t){if(Ce=[],He=to(),He!==t)for(;He!==t;)Ce.push(He),He=to();else Ce=t;Ce!==t?(wt=R,G=Y(G),R=G):(j=R,R=t)}else j=R,R=t;return R}function ka(){var R,G,Ce;for($e++,R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=ee(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),$e--,R===t&&(G=t,$e===0&&Oe($)),R}function nt(){var R,G,Ce;for(R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=A(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),R}function Do(){var R;return wt=j,R=oe(),R?R=void 0:R=t,R}function OA(){var R;return wt=j,R=ce(),R?R=void 0:R=t,R}function tc(){var R;return R=ic(),R===t&&(R=Lh()),R}function eo(){var R,G,Ce;if(R=ic(),R===t){if(R=j,G=[],Ce=Yu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=Yu();else G=t;G!==t&&(wt=R,G=Z()),R=G}return R}function rc(){var R;return R=Th(),R===t&&(R=bE(),R===t&&(R=ic(),R===t&&(R=Lh()))),R}function BE(){var R;return R=Th(),R===t&&(R=ic(),R===t&&(R=Yu())),R}function Lh(){var R,G,Ce,He,Te,Xe;if($e++,R=j,L.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(de)),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;return $e--,R===t&&(G=t,$e===0&&Oe(O)),R}function Yu(){var R,G,Ce,He,Te;if(R=j,r.substr(j,2)===se?(G=se,j+=2):(G=t,$e===0&&Oe(be)),G===t&&(G=null),G!==t)if(he.test(r.charAt(j))?(Ce=r.charAt(j),j++):(Ce=t,$e===0&&Oe(Fe)),Ce!==t){for(He=[],Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));Te!==t;)He.push(Te),Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));He!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;return R}function Th(){var R,G;return R=j,r.substr(j,4)===ve?(G=ve,j+=4):(G=t,$e===0&&Oe(pe)),G!==t&&(wt=R,G=V()),R=G,R}function bE(){var R,G;return R=j,r.substr(j,4)===Qe?(G=Qe,j+=4):(G=t,$e===0&&Oe(le)),G!==t&&(wt=R,G=fe()),R=G,R===t&&(R=j,r.substr(j,5)===gt?(G=gt,j+=5):(G=t,$e===0&&Oe(Ht)),G!==t&&(wt=R,G=Mt()),R=G),R}function ic(){var R,G,Ce,He;return $e++,R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(r.charCodeAt(j)===34?(Ce=jt,j++):(Ce=t,$e===0&&Oe(Qr)),Ce!==t?(wt=R,G=Oi(),R=G):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(Ce=QE(),Ce!==t?(r.charCodeAt(j)===34?(He=jt,j++):(He=t,$e===0&&Oe(Qr)),He!==t?(wt=R,G=Xs(Ce),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)),$e--,R===t&&(G=t,$e===0&&Oe(Ei)),R}function QE(){var R,G,Ce;if(R=j,G=[],Ce=qu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=qu();else G=t;return G!==t&&(wt=R,G=Un(G)),R=G,R}function qu(){var R,G,Ce,He,Te,Xe;return Hn.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(Sr)),R===t&&(R=j,r.substr(j,2)===jn?(G=jn,j+=2):(G=t,$e===0&&Oe(fs)),G!==t&&(wt=R,G=ba()),R=G,R===t&&(R=j,r.substr(j,2)===DA?(G=DA,j+=2):(G=t,$e===0&&Oe(Nu)),G!==t&&(wt=R,G=hs()),R=G,R===t&&(R=j,r.substr(j,2)===RA?(G=RA,j+=2):(G=t,$e===0&&Oe(Qa)),G!==t&&(wt=R,G=Lu()),R=G,R===t&&(R=j,r.substr(j,2)===FA?(G=FA,j+=2):(G=t,$e===0&&Oe(NA)),G!==t&&(wt=R,G=vr()),R=G,R===t&&(R=j,r.substr(j,2)===zl?(G=zl,j+=2):(G=t,$e===0&&Oe(Tu)),G!==t&&(wt=R,G=xo()),R=G,R===t&&(R=j,r.substr(j,2)===Ou?(G=Ou,j+=2):(G=t,$e===0&&Oe(Sh)),G!==t&&(wt=R,G=vh()),R=G,R===t&&(R=j,r.substr(j,2)===Dr?(G=Dr,j+=2):(G=t,$e===0&&Oe(Ae)),G!==t&&(wt=R,G=ko()),R=G,R===t&&(R=j,r.substr(j,2)===Gn?(G=Gn,j+=2):(G=t,$e===0&&Oe(Mu)),G!==t&&(wt=R,G=St()),R=G,R===t&&(R=j,r.substr(j,2)===_l?(G=_l,j+=2):(G=t,$e===0&&Oe(Yn)),G!==t?(Ce=MA(),Ce!==t?(He=MA(),He!==t?(Te=MA(),Te!==t?(Xe=MA(),Xe!==t?(wt=R,G=ps(Ce,He,Te,Xe),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)))))))))),R}function MA(){var R;return ds.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(pt)),R}function Tr(){var R,G;if($e++,R=[],lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn)),G!==t)for(;G!==t;)R.push(G),lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(Po)),R}function SE(){var R,G;if($e++,R=[],Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku)),G!==t)for(;G!==t;)R.push(G),Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(S)),R}function to(){var R,G,Ce,He,Te,Xe;if(R=j,G=ro(),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)}else j=R,R=t;return R}function ro(){var R;return r.substr(j,2)===Vl?(R=Vl,j+=2):(R=t,$e===0&&Oe(xh)),R===t&&(r.charCodeAt(j)===10?(R=kh,j++):(R=t,$e===0&&Oe(Ph)),R===t&&(r.charCodeAt(j)===13?(R=Dh,j++):(R=t,$e===0&&Oe(Rh)))),R}let Ju=2,KA=0;if(Sa=n(),Sa!==t&&j===r.length)return Sa;throw Sa!==t&&j{"use strict";var Upe=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=Upe(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};JQ.exports=_K;JQ.exports.default=_K});var ZK=w((pXe,XK)=>{XK.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Ic=w(Xn=>{"use strict";var $K=ZK(),To=process.env;Object.defineProperty(Xn,"_vendors",{value:$K.map(function(r){return r.constant})});Xn.name=null;Xn.isPR=null;$K.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return eU(i)});if(Xn[r.constant]=t,t)switch(Xn.name=r.name,typeof r.pr){case"string":Xn.isPR=!!To[r.pr];break;case"object":"env"in r.pr?Xn.isPR=r.pr.env in To&&To[r.pr.env]!==r.pr.ne:"any"in r.pr?Xn.isPR=r.pr.any.some(function(i){return!!To[i]}):Xn.isPR=eU(r.pr);break;default:Xn.isPR=null}});Xn.isCI=!!(To.CI||To.CONTINUOUS_INTEGRATION||To.BUILD_NUMBER||To.RUN_ID||Xn.name);function eU(r){return typeof r=="string"?!!To[r]:Object.keys(r).every(function(e){return To[e]===r[e]})}});var cg={};ft(cg,{KeyRelationship:()=>Bc,applyCascade:()=>fp,base64RegExp:()=>sU,colorStringAlphaRegExp:()=>nU,colorStringRegExp:()=>iU,computeKey:()=>zA,getPrintable:()=>ti,hasExactLength:()=>cU,hasForbiddenKeys:()=>mde,hasKeyRelationship:()=>eS,hasMaxLength:()=>tde,hasMinLength:()=>ede,hasMutuallyExclusiveKeys:()=>Ede,hasRequiredKeys:()=>Cde,hasUniqueItems:()=>rde,isArray:()=>Jpe,isAtLeast:()=>sde,isAtMost:()=>ode,isBase64:()=>pde,isBoolean:()=>Gpe,isDate:()=>qpe,isDict:()=>zpe,isEnum:()=>nn,isHexColor:()=>hde,isISO8601:()=>fde,isInExclusiveRange:()=>Ade,isInInclusiveRange:()=>ade,isInstanceOf:()=>Vpe,isInteger:()=>lde,isJSON:()=>dde,isLiteral:()=>Hpe,isLowerCase:()=>cde,isNegative:()=>ide,isNullable:()=>$pe,isNumber:()=>Ype,isObject:()=>_pe,isOneOf:()=>Xpe,isOptional:()=>Zpe,isPositive:()=>nde,isString:()=>gp,isTuple:()=>Wpe,isUUID4:()=>gde,isUnknown:()=>lU,isUpperCase:()=>ude,iso8601RegExp:()=>$Q,makeCoercionFn:()=>wc,makeSetter:()=>AU,makeTrait:()=>aU,makeValidator:()=>vt,matchesRegExp:()=>hp,plural:()=>hI,pushError:()=>mt,simpleKeyRegExp:()=>rU,uuid4RegExp:()=>oU});function vt({test:r}){return aU(r)()}function ti(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function zA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:rU.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function wc(r,e){return t=>{let i=r[e];return r[e]=t,wc(r,e).bind(null,i)}}function AU(r,e){return t=>{r[e]=t}}function hI(r,e,t){return r===1?e:t}function mt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function Hpe(r){return vt({test:(e,t)=>e!==r?mt(t,`Expected a literal (got ${ti(r)})`):!0})}function nn(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return vt({test:(i,n)=>t.has(i)?!0:mt(n,`Expected a valid enumeration value (got ${ti(i)})`)})}var rU,iU,nU,sU,oU,$Q,aU,lU,gp,jpe,Gpe,Ype,qpe,Jpe,Wpe,zpe,_pe,Vpe,Xpe,fp,Zpe,$pe,ede,tde,cU,rde,ide,nde,sde,ode,ade,Ade,lde,hp,cde,ude,gde,fde,hde,pde,dde,Cde,mde,Ede,Bc,Ide,eS,ys=uge(()=>{rU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,iU=/^#[0-9a-f]{6}$/i,nU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,sU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,oU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,$Q=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,aU=r=>()=>r;lU=()=>vt({test:(r,e)=>!0});gp=()=>vt({test:(r,e)=>typeof r!="string"?mt(e,`Expected a string (got ${ti(r)})`):!0});jpe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Gpe=()=>vt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i=jpe.get(r);if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a boolean (got ${ti(r)})`)}return!0}}),Ype=()=>vt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return mt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a number (got ${ti(r)})`)}return!0}}),qpe=()=>vt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"&&$Q.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch(o){}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return mt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a date (got ${ti(r)})`)}return!0}}),Jpe=(r,{delimiter:e}={})=>vt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return mt(i,`Expected an array (got ${ti(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=cU(r.length);return vt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return mt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return mt(n,`Expected a tuple (got ${ti(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;avt({test:(t,i)=>{if(typeof t!="object"||t===null)return mt(i,`Expected an object (got ${ti(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return vt({test:(i,n)=>{if(typeof i!="object"||i===null)return mt(n,`Expected an object (got ${ti(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:zA(n,l),coercion:wc(i,l)}))&&a:e===null?a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),`Extraneous property (got ${ti(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:AU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Vpe=r=>vt({test:(e,t)=>e instanceof r?!0:mt(t,`Expected an instance of ${r.name} (got ${ti(e)})`)}),Xpe=(r,{exclusive:e=!1}={})=>vt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=r.length;c1?mt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),fp=(r,e)=>vt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)!="undefined"?wc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Zpe=r=>vt({test:(e,t)=>typeof e=="undefined"?!0:r(e,t)}),$pe=r=>vt({test:(e,t)=>e===null?!0:r(e,t)}),ede=r=>vt({test:(e,t)=>e.length>=r?!0:mt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),tde=r=>vt({test:(e,t)=>e.length<=r?!0:mt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),cU=r=>vt({test:(e,t)=>e.length!==r?mt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),rde=({map:r}={})=>vt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;svt({test:(r,e)=>r<=0?!0:mt(e,`Expected to be negative (got ${r})`)}),nde=()=>vt({test:(r,e)=>r>=0?!0:mt(e,`Expected to be positive (got ${r})`)}),sde=r=>vt({test:(e,t)=>e>=r?!0:mt(t,`Expected to be at least ${r} (got ${e})`)}),ode=r=>vt({test:(e,t)=>e<=r?!0:mt(t,`Expected to be at most ${r} (got ${e})`)}),ade=(r,e)=>vt({test:(t,i)=>t>=r&&t<=e?!0:mt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Ade=(r,e)=>vt({test:(t,i)=>t>=r&&tvt({test:(e,t)=>e!==Math.round(e)?mt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:mt(t,`Expected to be a safe integer (got ${e})`)}),hp=r=>vt({test:(e,t)=>r.test(e)?!0:mt(t,`Expected to match the pattern ${r.toString()} (got ${ti(e)})`)}),cde=()=>vt({test:(r,e)=>r!==r.toLowerCase()?mt(e,`Expected to be all-lowercase (got ${r})`):!0}),ude=()=>vt({test:(r,e)=>r!==r.toUpperCase()?mt(e,`Expected to be all-uppercase (got ${r})`):!0}),gde=()=>vt({test:(r,e)=>oU.test(r)?!0:mt(e,`Expected to be a valid UUID v4 (got ${ti(r)})`)}),fde=()=>vt({test:(r,e)=>$Q.test(r)?!1:mt(e,`Expected to be a valid ISO 8601 date string (got ${ti(r)})`)}),hde=({alpha:r=!1})=>vt({test:(e,t)=>(r?iU.test(e):nU.test(e))?!0:mt(t,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)}),pde=()=>vt({test:(r,e)=>sU.test(r)?!0:mt(e,`Expected to be a valid base 64 string (got ${ti(r)})`)}),dde=(r=lU())=>vt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch(n){return mt(t,`Expected to be a valid JSON string (got ${ti(e)})`)}return r(i,t)}}),Cde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?mt(i,`Missing required ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},mde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?mt(i,`Forbidden ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Ede=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?mt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(Bc||(Bc={}));Ide={[Bc.Forbids]:{expect:!1,message:"forbids using"},[Bc.Requires]:{expect:!0,message:"requires using"}},eS=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=Ide[e];return vt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?mt(l,`Property "${r}" ${o.message} ${hI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var kU=w((dZe,xU)=>{"use strict";xU.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var gg=w((CZe,aS)=>{"use strict";var Ode=kU(),PU=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Ode(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};aS.exports=PU;aS.exports.default=PU});var mp=w((EZe,DU)=>{var Mde="2.0.0",Kde=256,Ude=Number.MAX_SAFE_INTEGER||9007199254740991,Hde=16;DU.exports={SEMVER_SPEC_VERSION:Mde,MAX_LENGTH:Kde,MAX_SAFE_INTEGER:Ude,MAX_SAFE_COMPONENT_LENGTH:Hde}});var Ep=w((IZe,RU)=>{var jde=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};RU.exports=jde});var bc=w((VA,FU)=>{var{MAX_SAFE_COMPONENT_LENGTH:AS}=mp(),Gde=Ep();VA=FU.exports={};var Yde=VA.re=[],rt=VA.src=[],it=VA.t={},qde=0,xt=(r,e,t)=>{let i=qde++;Gde(i,e),it[r]=i,rt[i]=e,Yde[i]=new RegExp(e,t?"g":void 0)};xt("NUMERICIDENTIFIER","0|[1-9]\\d*");xt("NUMERICIDENTIFIERLOOSE","[0-9]+");xt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");xt("MAINVERSION",`(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})`);xt("MAINVERSIONLOOSE",`(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})`);xt("PRERELEASEIDENTIFIER",`(?:${rt[it.NUMERICIDENTIFIER]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASEIDENTIFIERLOOSE",`(?:${rt[it.NUMERICIDENTIFIERLOOSE]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASE",`(?:-(${rt[it.PRERELEASEIDENTIFIER]}(?:\\.${rt[it.PRERELEASEIDENTIFIER]})*))`);xt("PRERELEASELOOSE",`(?:-?(${rt[it.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${rt[it.PRERELEASEIDENTIFIERLOOSE]})*))`);xt("BUILDIDENTIFIER","[0-9A-Za-z-]+");xt("BUILD",`(?:\\+(${rt[it.BUILDIDENTIFIER]}(?:\\.${rt[it.BUILDIDENTIFIER]})*))`);xt("FULLPLAIN",`v?${rt[it.MAINVERSION]}${rt[it.PRERELEASE]}?${rt[it.BUILD]}?`);xt("FULL",`^${rt[it.FULLPLAIN]}$`);xt("LOOSEPLAIN",`[v=\\s]*${rt[it.MAINVERSIONLOOSE]}${rt[it.PRERELEASELOOSE]}?${rt[it.BUILD]}?`);xt("LOOSE",`^${rt[it.LOOSEPLAIN]}$`);xt("GTLT","((?:<|>)?=?)");xt("XRANGEIDENTIFIERLOOSE",`${rt[it.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);xt("XRANGEIDENTIFIER",`${rt[it.NUMERICIDENTIFIER]}|x|X|\\*`);xt("XRANGEPLAIN",`[v=\\s]*(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:${rt[it.PRERELEASE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGEPLAINLOOSE",`[v=\\s]*(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:${rt[it.PRERELEASELOOSE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAIN]}$`);xt("XRANGELOOSE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAINLOOSE]}$`);xt("COERCE",`(^|[^\\d])(\\d{1,${AS}})(?:\\.(\\d{1,${AS}}))?(?:\\.(\\d{1,${AS}}))?(?:$|[^\\d])`);xt("COERCERTL",rt[it.COERCE],!0);xt("LONETILDE","(?:~>?)");xt("TILDETRIM",`(\\s*)${rt[it.LONETILDE]}\\s+`,!0);VA.tildeTrimReplace="$1~";xt("TILDE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAIN]}$`);xt("TILDELOOSE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("LONECARET","(?:\\^)");xt("CARETTRIM",`(\\s*)${rt[it.LONECARET]}\\s+`,!0);VA.caretTrimReplace="$1^";xt("CARET",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAIN]}$`);xt("CARETLOOSE",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("COMPARATORLOOSE",`^${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]})$|^$`);xt("COMPARATOR",`^${rt[it.GTLT]}\\s*(${rt[it.FULLPLAIN]})$|^$`);xt("COMPARATORTRIM",`(\\s*)${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]}|${rt[it.XRANGEPLAIN]})`,!0);VA.comparatorTrimReplace="$1$2$3";xt("HYPHENRANGE",`^\\s*(${rt[it.XRANGEPLAIN]})\\s+-\\s+(${rt[it.XRANGEPLAIN]})\\s*$`);xt("HYPHENRANGELOOSE",`^\\s*(${rt[it.XRANGEPLAINLOOSE]})\\s+-\\s+(${rt[it.XRANGEPLAINLOOSE]})\\s*$`);xt("STAR","(<|>)?=?\\s*\\*");xt("GTE0","^\\s*>=\\s*0.0.0\\s*$");xt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var Ip=w((yZe,NU)=>{var Jde=["includePrerelease","loose","rtl"],Wde=r=>r?typeof r!="object"?{loose:!0}:Jde.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};NU.exports=Wde});var yI=w((wZe,LU)=>{var TU=/^[0-9]+$/,OU=(r,e)=>{let t=TU.test(r),i=TU.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rOU(e,r);LU.exports={compareIdentifiers:OU,rcompareIdentifiers:zde}});var Hi=w((BZe,MU)=>{var wI=Ep(),{MAX_LENGTH:KU,MAX_SAFE_INTEGER:BI}=mp(),{re:UU,t:HU}=bc(),_de=Ip(),{compareIdentifiers:yp}=yI(),Bs=class{constructor(e,t){if(t=_de(t),e instanceof Bs){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>KU)throw new TypeError(`version is longer than ${KU} characters`);wI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?UU[HU.LOOSE]:UU[HU.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>BI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>BI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>BI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};MU.exports=Bs});var Qc=w((bZe,jU)=>{var{MAX_LENGTH:Vde}=mp(),{re:GU,t:YU}=bc(),qU=Hi(),Xde=Ip(),Zde=(r,e)=>{if(e=Xde(e),r instanceof qU)return r;if(typeof r!="string"||r.length>Vde||!(e.loose?GU[YU.LOOSE]:GU[YU.FULL]).test(r))return null;try{return new qU(r,e)}catch(i){return null}};jU.exports=Zde});var WU=w((QZe,JU)=>{var $de=Qc(),eCe=(r,e)=>{let t=$de(r,e);return t?t.version:null};JU.exports=eCe});var _U=w((SZe,zU)=>{var tCe=Qc(),rCe=(r,e)=>{let t=tCe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};zU.exports=rCe});var XU=w((vZe,VU)=>{var iCe=Hi(),nCe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new iCe(r,t).inc(e,i).version}catch(n){return null}};VU.exports=nCe});var bs=w((xZe,ZU)=>{var $U=Hi(),sCe=(r,e,t)=>new $U(r,t).compare(new $U(e,t));ZU.exports=sCe});var bI=w((kZe,e2)=>{var oCe=bs(),aCe=(r,e,t)=>oCe(r,e,t)===0;e2.exports=aCe});var i2=w((PZe,t2)=>{var r2=Qc(),ACe=bI(),lCe=(r,e)=>{if(ACe(r,e))return null;{let t=r2(r),i=r2(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};t2.exports=lCe});var s2=w((DZe,n2)=>{var cCe=Hi(),uCe=(r,e)=>new cCe(r,e).major;n2.exports=uCe});var a2=w((RZe,o2)=>{var gCe=Hi(),fCe=(r,e)=>new gCe(r,e).minor;o2.exports=fCe});var l2=w((FZe,A2)=>{var hCe=Hi(),pCe=(r,e)=>new hCe(r,e).patch;A2.exports=pCe});var u2=w((NZe,c2)=>{var dCe=Qc(),CCe=(r,e)=>{let t=dCe(r,e);return t&&t.prerelease.length?t.prerelease:null};c2.exports=CCe});var f2=w((LZe,g2)=>{var mCe=bs(),ECe=(r,e,t)=>mCe(e,r,t);g2.exports=ECe});var p2=w((TZe,h2)=>{var ICe=bs(),yCe=(r,e)=>ICe(r,e,!0);h2.exports=yCe});var QI=w((OZe,d2)=>{var C2=Hi(),wCe=(r,e,t)=>{let i=new C2(r,t),n=new C2(e,t);return i.compare(n)||i.compareBuild(n)};d2.exports=wCe});var E2=w((MZe,m2)=>{var BCe=QI(),bCe=(r,e)=>r.sort((t,i)=>BCe(t,i,e));m2.exports=bCe});var y2=w((KZe,I2)=>{var QCe=QI(),SCe=(r,e)=>r.sort((t,i)=>QCe(i,t,e));I2.exports=SCe});var wp=w((UZe,w2)=>{var vCe=bs(),xCe=(r,e,t)=>vCe(r,e,t)>0;w2.exports=xCe});var SI=w((HZe,B2)=>{var kCe=bs(),PCe=(r,e,t)=>kCe(r,e,t)<0;B2.exports=PCe});var lS=w((jZe,b2)=>{var DCe=bs(),RCe=(r,e,t)=>DCe(r,e,t)!==0;b2.exports=RCe});var vI=w((GZe,Q2)=>{var FCe=bs(),NCe=(r,e,t)=>FCe(r,e,t)>=0;Q2.exports=NCe});var xI=w((YZe,S2)=>{var LCe=bs(),TCe=(r,e,t)=>LCe(r,e,t)<=0;S2.exports=TCe});var cS=w((qZe,v2)=>{var OCe=bI(),MCe=lS(),KCe=wp(),UCe=vI(),HCe=SI(),jCe=xI(),GCe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return OCe(r,t,i);case"!=":return MCe(r,t,i);case">":return KCe(r,t,i);case">=":return UCe(r,t,i);case"<":return HCe(r,t,i);case"<=":return jCe(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};v2.exports=GCe});var k2=w((JZe,x2)=>{var YCe=Hi(),qCe=Qc(),{re:kI,t:PI}=bc(),JCe=(r,e)=>{if(r instanceof YCe)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(kI[PI.COERCE]);else{let i;for(;(i=kI[PI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),kI[PI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;kI[PI.COERCERTL].lastIndex=-1}return t===null?null:qCe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};x2.exports=JCe});var D2=w((WZe,P2)=>{"use strict";P2.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Bp=w((zZe,R2)=>{"use strict";R2.exports=Gt;Gt.Node=Sc;Gt.create=Gt;function Gt(r){var e=this;if(e instanceof Gt||(e=new Gt),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Gt.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Gt.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Gt.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Gt.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Gt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Gt.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var VCe=Bp(),vc=Symbol("max"),Ua=Symbol("length"),fg=Symbol("lengthCalculator"),bp=Symbol("allowStale"),xc=Symbol("maxAge"),Ha=Symbol("dispose"),N2=Symbol("noDisposeOnSet"),yi=Symbol("lruList"),oo=Symbol("cache"),L2=Symbol("updateAgeOnGet"),uS=()=>1,T2=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[vc]=e.max||Infinity,i=e.length||uS;if(this[fg]=typeof i!="function"?uS:i,this[bp]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[xc]=e.maxAge||0,this[Ha]=e.dispose,this[N2]=e.noDisposeOnSet||!1,this[L2]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[vc]=e||Infinity,Qp(this)}get max(){return this[vc]}set allowStale(e){this[bp]=!!e}get allowStale(){return this[bp]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[xc]=e,Qp(this)}get maxAge(){return this[xc]}set lengthCalculator(e){typeof e!="function"&&(e=uS),e!==this[fg]&&(this[fg]=e,this[Ua]=0,this[yi].forEach(t=>{t.length=this[fg](t.value,t.key),this[Ua]+=t.length})),Qp(this)}get lengthCalculator(){return this[fg]}get length(){return this[Ua]}get itemCount(){return this[yi].length}rforEach(e,t){t=t||this;for(let i=this[yi].tail;i!==null;){let n=i.prev;M2(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[yi].head;i!==null;){let n=i.next;M2(this,e,i,t),i=n}}keys(){return this[yi].toArray().map(e=>e.key)}values(){return this[yi].toArray().map(e=>e.value)}reset(){this[Ha]&&this[yi]&&this[yi].length&&this[yi].forEach(e=>this[Ha](e.key,e.value)),this[oo]=new Map,this[yi]=new VCe,this[Ua]=0}dump(){return this[yi].map(e=>DI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[yi]}set(e,t,i){if(i=i||this[xc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[fg](t,e);if(this[oo].has(e)){if(s>this[vc])return hg(this,this[oo].get(e)),!1;let l=this[oo].get(e).value;return this[Ha]&&(this[N2]||this[Ha](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Ua]+=s-l.length,l.length=s,this.get(e),Qp(this),!0}let o=new O2(e,t,s,n,i);return o.length>this[vc]?(this[Ha]&&this[Ha](e,t),!1):(this[Ua]+=o.length,this[yi].unshift(o),this[oo].set(e,this[yi].head),Qp(this),!0)}has(e){if(!this[oo].has(e))return!1;let t=this[oo].get(e).value;return!DI(this,t)}get(e){return gS(this,e,!0)}peek(e){return gS(this,e,!1)}pop(){let e=this[yi].tail;return e?(hg(this,e),e.value):null}del(e){hg(this,this[oo].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[oo].forEach((e,t)=>gS(this,t,!1))}},gS=(r,e,t)=>{let i=r[oo].get(e);if(i){let n=i.value;if(DI(r,n)){if(hg(r,i),!r[bp])return}else t&&(r[L2]&&(i.value.now=Date.now()),r[yi].unshiftNode(i));return n.value}},DI=(r,e)=>{if(!e||!e.maxAge&&!r[xc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[xc]&&t>r[xc]},Qp=r=>{if(r[Ua]>r[vc])for(let e=r[yi].tail;r[Ua]>r[vc]&&e!==null;){let t=e.prev;hg(r,e),e=t}},hg=(r,e)=>{if(e){let t=e.value;r[Ha]&&r[Ha](t.key,t.value),r[Ua]-=t.length,r[oo].delete(t.key),r[yi].removeNode(e)}},O2=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},M2=(r,e,t,i)=>{let n=t.value;DI(r,n)&&(hg(r,t),r[bp]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};F2.exports=T2});var Qs=w((VZe,U2)=>{var pg=class{constructor(e,t){if(t=XCe(t),e instanceof pg)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new pg(e.raw,t);if(e instanceof fS)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!j2(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&rme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=H2.get(i);if(n)return n;let s=this.options.loose,o=s?ji[ki.HYPHENRANGELOOSE]:ji[ki.HYPHENRANGE];e=e.replace(o,sme(this.options.includePrerelease)),zr("hyphen replace",e),e=e.replace(ji[ki.COMPARATORTRIM],$Ce),zr("comparator trim",e,ji[ki.COMPARATORTRIM]),e=e.replace(ji[ki.TILDETRIM],eme),e=e.replace(ji[ki.CARETTRIM],tme),e=e.split(/\s+/).join(" ");let a=s?ji[ki.COMPARATORLOOSE]:ji[ki.COMPARATOR],l=e.split(" ").map(f=>ime(f,this.options)).join(" ").split(/\s+/).map(f=>nme(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new fS(f,this.options)),c=l.length,u=new Map;for(let f of l){if(j2(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return H2.set(i,g),g}intersects(e,t){if(!(e instanceof pg))throw new TypeError("a Range is required");return this.set.some(i=>G2(i,t)&&e.set.some(n=>G2(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new ZCe(e,this.options)}catch(t){return!1}for(let t=0;tr.value==="<0.0.0-0",rme=r=>r.value==="",G2=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},ime=(r,e)=>(zr("comp",r,e),r=lme(r,e),zr("caret",r),r=Ame(r,e),zr("tildes",r),r=cme(r,e),zr("xrange",r),r=ume(r,e),zr("stars",r),r),on=r=>!r||r.toLowerCase()==="x"||r==="*",Ame=(r,e)=>r.trim().split(/\s+/).map(t=>gme(t,e)).join(" "),gme=(r,e)=>{let t=e.loose?ji[ki.TILDELOOSE]:ji[ki.TILDE];return r.replace(t,(i,n,s,o,a)=>{zr("tilde",r,i,n,s,o,a);let l;return on(n)?l="":on(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:on(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(zr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,zr("tilde return",l),l})},lme=(r,e)=>r.trim().split(/\s+/).map(t=>fme(t,e)).join(" "),fme=(r,e)=>{zr("caret",r,e);let t=e.loose?ji[ki.CARETLOOSE]:ji[ki.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{zr("caret",r,n,s,o,a,l);let c;return on(s)?c="":on(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:on(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(zr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(zr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),zr("caret return",c),c})},cme=(r,e)=>(zr("replaceXRanges",r,e),r.split(/\s+/).map(t=>hme(t,e)).join(" ")),hme=(r,e)=>{r=r.trim();let t=e.loose?ji[ki.XRANGELOOSE]:ji[ki.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{zr("xRange",r,i,n,s,o,a,l);let c=on(s),u=c||on(o),g=u||on(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),zr("xRange return",i),i})},ume=(r,e)=>(zr("replaceStars",r,e),r.trim().replace(ji[ki.STAR],"")),nme=(r,e)=>(zr("replaceGTE0",r,e),r.trim().replace(ji[e.includePrerelease?ki.GTE0PRE:ki.GTE0],"")),sme=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(on(i)?t="":on(n)?t=`>=${i}.0.0${r?"-0":""}`:on(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,on(c)?l="":on(u)?l=`<${+c+1}.0.0-0`:on(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),ome=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Sp=w((XZe,Y2)=>{var vp=Symbol("SemVer ANY"),xp=class{static get ANY(){return vp}constructor(e,t){if(t=pme(t),e instanceof xp){if(e.loose===!!t.loose)return e;e=e.value}pS("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===vp?this.value="":this.value=this.operator+this.semver.version,pS("comp",this)}parse(e){let t=this.options.loose?q2[J2.COMPARATORLOOSE]:q2[J2.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new W2(i[2],this.options.loose):this.semver=vp}toString(){return this.value}test(e){if(pS("Comparator.test",e,this.options.loose),this.semver===vp||e===vp)return!0;if(typeof e=="string")try{e=new W2(e,this.options)}catch(t){return!1}return hS(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof xp))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new z2(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new z2(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=hS(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=hS(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};Y2.exports=xp;var pme=Ip(),{re:q2,t:J2}=bc(),hS=cS(),pS=Ep(),W2=Hi(),z2=Qs()});var kp=w((ZZe,_2)=>{var dme=Qs(),Cme=(r,e,t)=>{try{e=new dme(e,t)}catch(i){return!1}return e.test(r)};_2.exports=Cme});var X2=w(($Ze,V2)=>{var mme=Qs(),Eme=(r,e)=>new mme(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));V2.exports=Eme});var $2=w((e$e,Z2)=>{var Ime=Hi(),yme=Qs(),wme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new yme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new Ime(i,t))}),i};Z2.exports=wme});var tH=w((t$e,eH)=>{var Bme=Hi(),bme=Qs(),Qme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new bme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Bme(i,t))}),i};eH.exports=Qme});var nH=w((r$e,rH)=>{var dS=Hi(),Sme=Qs(),iH=wp(),vme=(r,e)=>{r=new Sme(r,e);let t=new dS("0.0.0");if(r.test(t)||(t=new dS("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new dS(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||iH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||iH(t,s))&&(t=s)}return t&&r.test(t)?t:null};rH.exports=vme});var oH=w((i$e,sH)=>{var xme=Qs(),kme=(r,e)=>{try{return new xme(r,e).range||"*"}catch(t){return null}};sH.exports=kme});var RI=w((n$e,aH)=>{var Pme=Hi(),AH=Sp(),{ANY:Dme}=AH,Rme=Qs(),Fme=kp(),lH=wp(),cH=SI(),Nme=xI(),Lme=vI(),Tme=(r,e,t,i)=>{r=new Pme(r,i),e=new Rme(e,i);let n,s,o,a,l;switch(t){case">":n=lH,s=Nme,o=cH,a=">",l=">=";break;case"<":n=cH,s=Lme,o=lH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Fme(r,e,i))return!1;for(let c=0;c{h.semver===Dme&&(h=new AH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};aH.exports=Tme});var gH=w((s$e,uH)=>{var Ome=RI(),Mme=(r,e,t)=>Ome(r,e,">",t);uH.exports=Mme});var hH=w((o$e,fH)=>{var Kme=RI(),Ume=(r,e,t)=>Kme(r,e,"<",t);fH.exports=Ume});var CH=w((a$e,pH)=>{var dH=Qs(),Hme=(r,e,t)=>(r=new dH(r,t),e=new dH(e,t),r.intersects(e));pH.exports=Hme});var EH=w((A$e,mH)=>{var jme=kp(),Gme=bs();mH.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>Gme(u,g,t));for(let u of o)jme(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var yH=Qs(),FI=Sp(),{ANY:CS}=FI,Pp=kp(),mS=bs(),qme=(r,e,t={})=>{if(r===e)return!0;r=new yH(r,t),e=new yH(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=Yme(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},Yme=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===CS){if(e.length===1&&e[0].semver===CS)return!0;t.includePrerelease?r=[new FI(">=0.0.0-0")]:r=[new FI(">=0.0.0")]}if(e.length===1&&e[0].semver===CS){if(t.includePrerelease)return!0;e=[new FI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=wH(n,h,t):h.operator==="<"||h.operator==="<="?s=BH(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=mS(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Pp(h,String(n),t)||s&&!Pp(h,String(s),t))return null;for(let p of e)if(!Pp(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=wH(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!Pp(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=BH(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Pp(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},wH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},BH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};IH.exports=qme});var ri=w((c$e,QH)=>{var ES=bc();QH.exports={re:ES.re,src:ES.src,tokens:ES.t,SEMVER_SPEC_VERSION:mp().SEMVER_SPEC_VERSION,SemVer:Hi(),compareIdentifiers:yI().compareIdentifiers,rcompareIdentifiers:yI().rcompareIdentifiers,parse:Qc(),valid:WU(),clean:_U(),inc:XU(),diff:i2(),major:s2(),minor:a2(),patch:l2(),prerelease:u2(),compare:bs(),rcompare:f2(),compareLoose:p2(),compareBuild:QI(),sort:E2(),rsort:y2(),gt:wp(),lt:SI(),eq:bI(),neq:lS(),gte:vI(),lte:xI(),cmp:cS(),coerce:k2(),Comparator:Sp(),Range:Qs(),satisfies:kp(),toComparators:X2(),maxSatisfying:$2(),minSatisfying:tH(),minVersion:nH(),validRange:oH(),outside:RI(),gtr:gH(),ltr:hH(),intersects:CH(),simplifyRange:EH(),subset:bH()}});var IS=w(NI=>{"use strict";Object.defineProperty(NI,"__esModule",{value:!0});NI.VERSION=void 0;NI.VERSION="9.1.0"});var Yt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof LI=="object"&&LI.exports?LI.exports=e():r.regexpToAst=e()})(typeof self!="undefined"?self:SH,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var m=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:m,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],m=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(m)}},r.prototype.alternative=function(){for(var p=[],m=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(m)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var m;switch(this.popChar()){case"=":m="Lookahead";break;case"!":m="NegativeLookahead";break}a(m);var y=this.disjunction();return this.consumeChar(")"),{type:m,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var m,y=this.idx;switch(this.popChar()){case"*":m={atLeast:0,atMost:Infinity};break;case"+":m={atLeast:1,atMost:Infinity};break;case"?":m={atLeast:0,atMost:1};break;case"{":var b=this.integerIncludingZero();switch(this.popChar()){case"}":m={atLeast:b,atMost:b};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),m={atLeast:b,atMost:v}):m={atLeast:b,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&m===void 0)return;a(m);break}if(!(p===!0&&m===void 0))return a(m),this.peekChar(0)==="?"?(this.consumeChar("?"),m.greedy=!1):m.greedy=!0,m.type="Quantifier",m.loc=this.loc(y),m},r.prototype.atom=function(){var p,m=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(m),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` +`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,m=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,m=!0;break;case"s":p=f;break;case"S":p=f,m=!0;break;case"w":p=g;break;case"W":p=g,m=!0;break}return a(p),{type:"Set",value:p,complement:m}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` +`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var m=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:m}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],m=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),m=!0);this.isClassAtom();){var y=this.classAtom(),b=y.type==="Character";if(b&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),x=v.type==="Character";if(x){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,m){p.length!==void 0?p.forEach(function(y){m.push(y)}):m.push(p)}function o(p,m){if(p[m]===!0)throw"duplicate flag "+m;p[m]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` +`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var m in p){var y=p[m];p.hasOwnProperty(m)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(b){this.visit(b)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var MI=w(dg=>{"use strict";Object.defineProperty(dg,"__esModule",{value:!0});dg.clearRegExpParserCache=dg.getRegExpAst=void 0;var Jme=TI(),OI={},Wme=new Jme.RegExpParser;function zme(r){var e=r.toString();if(OI.hasOwnProperty(e))return OI[e];var t=Wme.pattern(e);return OI[e]=t,t}dg.getRegExpAst=zme;function _me(){OI={}}dg.clearRegExpParserCache=_me});var DH=w(Bn=>{"use strict";var Vme=Bn&&Bn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.canMatchCharCode=Bn.firstCharOptimizedIndices=Bn.getOptimizedStartCodesIndices=Bn.failedOptimizationPrefixMsg=void 0;var vH=TI(),Ss=Yt(),xH=MI(),ja=yS(),kH="Complement Sets are not supported for first char optimization";Bn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: +`;function Xme(r,e){e===void 0&&(e=!1);try{var t=(0,xH.getRegExpAst)(r),i=KI(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===kH)e&&(0,Ss.PRINT_WARNING)(""+Bn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > +`)+` Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,Ss.PRINT_ERROR)(Bn.failedOptimizationPrefixMsg+` +`+(" Failed parsing: < "+r.toString()+` > +`)+(" Using the regexp-to-ast library version: "+vH.VERSION+` +`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}Bn.getOptimizedStartCodesIndices=Xme;function KI(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=ja.minOptimizationVal)for(var f=u.from>=ja.minOptimizationVal?u.from:ja.minOptimizationVal,h=u.to,p=(0,ja.charCodeToOptimizedIndex)(f),m=(0,ja.charCodeToOptimizedIndex)(h),y=p;y<=m;y++)e[y]=y}}});break;case"Group":KI(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&wS(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,Ss.values)(e)}Bn.firstCharOptimizedIndices=KI;function UI(r,e,t){var i=(0,ja.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&Zme(r,e)}function Zme(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,ja.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,ja.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function PH(r,e){return(0,Ss.find)(r.value,function(t){if(typeof t=="number")return(0,Ss.contains)(e,t);var i=t;return(0,Ss.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function wS(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,Ss.isArray)(r.value)?(0,Ss.every)(r.value,wS):wS(r.value):!1}var $me=function(r){Vme(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,Ss.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?PH(t,this.targetCharCodes)===void 0&&(this.found=!0):PH(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(vH.BaseRegExpVisitor);function eEe(r,e){if(e instanceof RegExp){var t=(0,xH.getRegExpAst)(e),i=new $me(r);return i.visit(t),i.found}else return(0,Ss.find)(e,function(n){return(0,Ss.contains)(r,n.charCodeAt(0))})!==void 0}Bn.canMatchCharCode=eEe});var yS=w(Ze=>{"use strict";var RH=Ze&&Ze.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ze,"__esModule",{value:!0});Ze.charCodeToOptimizedIndex=Ze.minOptimizationVal=Ze.buildLineBreakIssueMessage=Ze.LineTerminatorOptimizedTester=Ze.isShortPattern=Ze.isCustomPattern=Ze.cloneEmptyGroups=Ze.performWarningRuntimeChecks=Ze.performRuntimeChecks=Ze.addStickyFlag=Ze.addStartOfInput=Ze.findUnreachablePatterns=Ze.findModesThatDoNotExist=Ze.findInvalidGroupType=Ze.findDuplicatePatterns=Ze.findUnsupportedFlags=Ze.findStartOfInputAnchor=Ze.findEmptyMatchRegExps=Ze.findEndOfInputAnchor=Ze.findInvalidPatterns=Ze.findMissingPatterns=Ze.validatePatterns=Ze.analyzeTokenTypes=Ze.enableSticky=Ze.disableSticky=Ze.SUPPORT_STICKY=Ze.MODES=Ze.DEFAULT_MODE=void 0;var FH=TI(),Ar=Dp(),Ne=Yt(),Cg=DH(),NH=MI(),Mo="PATTERN";Ze.DEFAULT_MODE="defaultMode";Ze.MODES="modes";Ze.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function tEe(){Ze.SUPPORT_STICKY=!1}Ze.disableSticky=tEe;function rEe(){Ze.SUPPORT_STICKY=!0}Ze.enableSticky=rEe;function nEe(r,e){e=(0,Ne.defaults)(e,{useSticky:Ze.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:function(v,x){return x()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){iEe()});var i;t("Reject Lexer.NA",function(){i=(0,Ne.reject)(r,function(v){return v[Mo]===Ar.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,Ne.map)(i,function(v){var x=v[Mo];if((0,Ne.isRegExp)(x)){var T=x.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!x.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,Ne.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?bS(x):BS(x)}else{if((0,Ne.isFunction)(x))return n=!0,{exec:x};if((0,Ne.has)(x,"exec"))return n=!0,x;if(typeof x=="string"){if(x.length===1)return x;var q=x.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),Y=new RegExp(q);return e.useSticky?bS(Y):BS(Y)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,Ne.map)(i,function(v){return v.tokenTypeIdx}),a=(0,Ne.map)(i,function(v){var x=v.GROUP;if(x!==Ar.Lexer.SKIPPED){if((0,Ne.isString)(x))return x;if((0,Ne.isUndefined)(x))return!1;throw Error("non exhaustive match")}}),l=(0,Ne.map)(i,function(v){var x=v.LONGER_ALT;if(x){var T=(0,Ne.isArray)(x)?(0,Ne.map)(x,function(q){return(0,Ne.indexOf)(i,q)}):[(0,Ne.indexOf)(i,x)];return T}}),c=(0,Ne.map)(i,function(v){return v.PUSH_MODE}),u=(0,Ne.map)(i,function(v){return(0,Ne.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=OH(e.lineTerminatorCharacters);g=(0,Ne.map)(i,function(x){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ne.map)(i,function(x){if((0,Ne.has)(x,"LINE_BREAKS"))return x.LINE_BREAKS;if(TH(x,v)===!1)return(0,Cg.canMatchCharCode)(v,x.PATTERN)}))});var f,h,p,m;t("Misc Mapping #2",function(){f=(0,Ne.map)(i,QS),h=(0,Ne.map)(s,LH),p=(0,Ne.reduce)(i,function(v,x){var T=x.GROUP;return(0,Ne.isString)(T)&&T!==Ar.Lexer.SKIPPED&&(v[T]=[]),v},{}),m=(0,Ne.map)(s,function(v,x){return{pattern:s[x],longerAlt:l[x],canLineTerminator:g[x],isCustom:f[x],short:h[x],group:a[x],push:c[x],pop:u[x],tokenTypeIdx:o[x],tokenType:i[x]}})});var y=!0,b=[];return e.safeMode||t("First Char Optimization",function(){b=(0,Ne.reduce)(i,function(v,x,T){if(typeof x.PATTERN=="string"){var q=x.PATTERN.charCodeAt(0),Y=vS(q);SS(v,Y,m[T])}else if((0,Ne.isArray)(x.START_CHARS_HINT)){var $;(0,Ne.forEach)(x.START_CHARS_HINT,function(ne){var ee=typeof ne=="string"?ne.charCodeAt(0):ne,A=vS(ee);$!==A&&($=A,SS(v,A,m[T]))})}else if((0,Ne.isRegExp)(x.PATTERN))if(x.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" Unable to analyze < "+x.PATTERN.toString()+` > pattern. +`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var _=(0,Cg.getOptimizedStartCodesIndices)(x.PATTERN,e.ensureOptimizations);(0,Ne.isEmpty)(_)&&(y=!1),(0,Ne.forEach)(_,function(ne){SS(v,ne,m[T])})}else e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" TokenType: <"+x.name+`> is using a custom token pattern without providing parameter. +`)+` This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){b=(0,Ne.packArray)(b)}),{emptyGroups:p,patternIdxToConfig:m,charCodeToPatternIdxToConfig:b,hasCustom:n,canBeOptimized:y}}Ze.analyzeTokenTypes=nEe;function oEe(r,e){var t=[],i=MH(r);t=t.concat(i.errors);var n=KH(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(sEe(s)),t=t.concat(UH(s)),t=t.concat(HH(s,e)),t=t.concat(jH(s)),t}Ze.validatePatterns=oEe;function sEe(r){var e=[],t=(0,Ne.filter)(r,function(i){return(0,Ne.isRegExp)(i[Mo])});return e=e.concat(GH(t)),e=e.concat(qH(t)),e=e.concat(JH(t)),e=e.concat(WH(t)),e=e.concat(YH(t)),e}function MH(r){var e=(0,Ne.filter)(r,function(n){return!(0,Ne.has)(n,Mo)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:Ar.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findMissingPatterns=MH;function KH(r){var e=(0,Ne.filter)(r,function(n){var s=n[Mo];return!(0,Ne.isRegExp)(s)&&!(0,Ne.isFunction)(s)&&!(0,Ne.has)(s,"exec")&&!(0,Ne.isString)(s)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Ar.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findInvalidPatterns=KH;var aEe=/[^\\][\$]/;function GH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return aEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findEndOfInputAnchor=GH;function YH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n.test("")}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:Ar.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ze.findEmptyMatchRegExps=YH;var AEe=/[^\\[][\^]|^\^/;function qH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return AEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findStartOfInputAnchor=qH;function JH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Ar.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ze.findUnsupportedFlags=JH;function WH(r){var e=[],t=(0,Ne.map)(r,function(s){return(0,Ne.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ne.contains)(e,a)&&a.PATTERN!==Ar.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,Ne.compact)(t);var i=(0,Ne.filter)(t,function(s){return s.length>1}),n=(0,Ne.map)(i,function(s){var o=(0,Ne.map)(s,function(l){return l.name}),a=(0,Ne.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:Ar.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ze.findDuplicatePatterns=WH;function UH(r){var e=(0,Ne.filter)(r,function(i){if(!(0,Ne.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==Ar.Lexer.SKIPPED&&n!==Ar.Lexer.NA&&!(0,Ne.isString)(n)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Ar.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ze.findInvalidGroupType=UH;function HH(r,e){var t=(0,Ne.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,Ne.contains)(e,n.PUSH_MODE)}),i=(0,Ne.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:Ar.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ze.findModesThatDoNotExist=HH;function jH(r){var e=[],t=(0,Ne.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===Ar.Lexer.NA||((0,Ne.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ne.isRegExp)(o)&&cEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ne.forEach)(r,function(i,n){(0,Ne.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:Ar.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ze.findUnreachablePatterns=jH;function lEe(r,e){if((0,Ne.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,Ne.isFunction)(e))return e(r,0,[],{});if((0,Ne.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function cEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ne.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function BS(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ze.addStartOfInput=BS;function bS(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ze.addStickyFlag=bS;function uEe(r,e,t){var i=[];return(0,Ne.has)(r,Ze.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.DEFAULT_MODE+`> property in its definition +`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ne.has)(r,Ze.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.MODES+`> property in its definition +`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.has)(r,Ze.DEFAULT_MODE)&&!(0,Ne.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ze.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist +`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.forEach)(r.modes,function(n,s){(0,Ne.forEach)(n,function(o,a){(0,Ne.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> +`),type:Ar.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ze.performRuntimeChecks=uEe;function gEe(r,e,t){var i=[],n=!1,s=(0,Ne.compact)((0,Ne.flatten)((0,Ne.mapValues)(r.modes,function(l){return l}))),o=(0,Ne.reject)(s,function(l){return l[Mo]===Ar.Lexer.NA}),a=OH(t);return e&&(0,Ne.forEach)(o,function(l){var c=TH(l,a);if(c!==!1){var u=zH(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ne.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Cg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:Ar.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ze.performWarningRuntimeChecks=gEe;function fEe(r){var e={},t=(0,Ne.keys)(r);return(0,Ne.forEach)(t,function(i){var n=r[i];if((0,Ne.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ze.cloneEmptyGroups=fEe;function QS(r){var e=r.PATTERN;if((0,Ne.isRegExp)(e))return!1;if((0,Ne.isFunction)(e))return!0;if((0,Ne.has)(e,"exec"))return!0;if((0,Ne.isString)(e))return!1;throw Error("non exhaustive match")}Ze.isCustomPattern=QS;function LH(r){return(0,Ne.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ze.isShortPattern=LH;Ze.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type +`)+(" Root cause: "+e.errMsg+`. +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===Ar.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. +`+(" The problem is in the <"+r.name+`> Token Type +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ze.buildLineBreakIssueMessage=zH;function OH(r){var e=(0,Ne.map)(r,function(t){return(0,Ne.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function SS(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ze.minOptimizationVal=256;var HI=[];function vS(r){return r255?255+~~(r/255):r}}});var mg=w(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});Ft.isTokenType=Ft.hasExtendingTokensTypesMapProperty=Ft.hasExtendingTokensTypesProperty=Ft.hasCategoriesProperty=Ft.hasShortKeyProperty=Ft.singleAssignCategoriesToksMap=Ft.assignCategoriesMapProp=Ft.assignCategoriesTokensProp=Ft.assignTokenDefaultProps=Ft.expandCategories=Ft.augmentTokenTypes=Ft.tokenIdxToClass=Ft.tokenShortNameIdx=Ft.tokenStructuredMatcherNoCategories=Ft.tokenStructuredMatcher=void 0;var ii=Yt();function hEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Ft.tokenStructuredMatcher=hEe;function pEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Ft.tokenStructuredMatcherNoCategories=pEe;Ft.tokenShortNameIdx=1;Ft.tokenIdxToClass={};function dEe(r){var e=_H(r);VH(e),ZH(e),XH(e),(0,ii.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Ft.augmentTokenTypes=dEe;function _H(r){for(var e=(0,ii.cloneArr)(r),t=r,i=!0;i;){t=(0,ii.compact)((0,ii.flatten)((0,ii.map)(t,function(s){return s.CATEGORIES})));var n=(0,ii.difference)(t,e);e=e.concat(n),(0,ii.isEmpty)(n)?i=!1:t=n}return e}Ft.expandCategories=_H;function VH(r){(0,ii.forEach)(r,function(e){$H(e)||(Ft.tokenIdxToClass[Ft.tokenShortNameIdx]=e,e.tokenTypeIdx=Ft.tokenShortNameIdx++),xS(e)&&!(0,ii.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),xS(e)||(e.CATEGORIES=[]),ej(e)||(e.categoryMatches=[]),tj(e)||(e.categoryMatchesMap={})})}Ft.assignTokenDefaultProps=VH;function XH(r){(0,ii.forEach)(r,function(e){e.categoryMatches=[],(0,ii.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Ft.tokenIdxToClass[i].tokenTypeIdx)})})}Ft.assignCategoriesTokensProp=XH;function ZH(r){(0,ii.forEach)(r,function(e){kS([],e)})}Ft.assignCategoriesMapProp=ZH;function kS(r,e){(0,ii.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,ii.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,ii.contains)(i,t)||kS(i,t)})}Ft.singleAssignCategoriesToksMap=kS;function $H(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.hasShortKeyProperty=$H;function xS(r){return(0,ii.has)(r,"CATEGORIES")}Ft.hasCategoriesProperty=xS;function ej(r){return(0,ii.has)(r,"categoryMatches")}Ft.hasExtendingTokensTypesProperty=ej;function tj(r){return(0,ii.has)(r,"categoryMatchesMap")}Ft.hasExtendingTokensTypesMapProperty=tj;function CEe(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.isTokenType=CEe});var PS=w(jI=>{"use strict";Object.defineProperty(jI,"__esModule",{value:!0});jI.defaultLexerErrorProvider=void 0;jI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Dp=w(kc=>{"use strict";Object.defineProperty(kc,"__esModule",{value:!0});kc.Lexer=kc.LexerDefinitionErrorType=void 0;var ao=yS(),lr=Yt(),mEe=mg(),EEe=PS(),IEe=MI(),yEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(yEe=kc.LexerDefinitionErrorType||(kc.LexerDefinitionErrorType={}));var Rp={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:EEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Rp);var wEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=Rp),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=(0,lr.merge)(Rp,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===Rp.lineTerminatorsPattern)i.config.lineTerminatorsPattern=ao.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Rp.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,lr.isArray)(e)?(s={modes:{}},s.modes[ao.DEFAULT_MODE]=(0,lr.cloneArr)(e),s[ao.DEFAULT_MODE]=ao.DEFAULT_MODE):(o=!1,s=(0,lr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,ao.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,lr.forEach)(s.modes,function(u,g){s.modes[g]=(0,lr.reject)(u,function(f){return(0,lr.isUndefined)(f)})});var a=(0,lr.keys)(s.modes);if((0,lr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.validatePatterns)(u,a))}),(0,lr.isEmpty)(i.lexerDefinitionErrors)){(0,mEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,ao.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,lr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,lr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,lr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+c)}(0,lr.forEach)(i.lexerDefinitionWarning,function(u){(0,lr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(ao.SUPPORT_STICKY?(i.chopInput=lr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=lr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=lr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=lr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=lr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,lr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,lr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,IEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,lr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,lr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,lr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,m,y,b,v,x,T=e,q=T.length,Y=0,$=0,_=this.hasCustom?0:Math.floor(e.length/10),ne=new Array(_),ee=[],A=this.trackStartLines?1:void 0,oe=this.trackStartLines?1:void 0,ce=(0,ao.cloneEmptyGroups)(this.emptyGroups),Z=this.trackStartLines,O=this.config.lineTerminatorsPattern,L=0,de=[],Be=[],je=[],re=[];Object.freeze(re);var se=void 0;function be(){return de}function he(Sr){var jn=(0,ao.charCodeToOptimizedIndex)(Sr),fs=Be[jn];return fs===void 0?re:fs}var Fe=function(Sr){if(je.length===1&&Sr.tokenType.PUSH_MODE===void 0){var jn=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(Sr);ee.push({offset:Sr.startOffset,line:Sr.startLine!==void 0?Sr.startLine:void 0,column:Sr.startColumn!==void 0?Sr.startColumn:void 0,length:Sr.image.length,message:jn})}else{je.pop();var fs=(0,lr.last)(je);de=i.patternIdxToConfig[fs],Be=i.charCodeToPatternIdxToConfig[fs],L=de.length;var ba=i.canModeBeOptimized[fs]&&i.config.safeMode===!1;Be&&ba?se=he:se=be}};function Ke(Sr){je.push(Sr),Be=this.charCodeToPatternIdxToConfig[Sr],de=this.patternIdxToConfig[Sr],L=de.length,L=de.length;var jn=this.canModeBeOptimized[Sr]&&this.config.safeMode===!1;Be&&jn?se=he:se=be}Ke.call(this,t);for(var ke;Yc.length){c=a,u=g,ke=gt;break}}}break}}if(c!==null){if(f=c.length,h=ke.group,h!==void 0&&(p=ke.tokenTypeIdx,m=this.createTokenInstance(c,Y,p,ke.tokenType,A,oe,f),this.handlePayload(m,u),h===!1?$=this.addToken(ne,$,m):ce[h].push(m)),e=this.chopInput(e,f),Y=Y+f,oe=this.computeNewColumn(oe,f),Z===!0&&ke.canLineTerminator===!0){var Mt=0,Ei=void 0,jt=void 0;O.lastIndex=0;do Ei=O.test(c),Ei===!0&&(jt=O.lastIndex-1,Mt++);while(Ei===!0);Mt!==0&&(A=A+Mt,oe=f-jt,this.updateTokenEndLineColumnLocation(m,h,jt,Mt,A,oe,f))}this.handleModes(ke,Fe,Ke,m)}else{for(var Qr=Y,Oi=A,Xs=oe,Un=!1;!Un&&Y <"+e+">");var n=(0,lr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();kc.Lexer=wEe});var XA=w(Pi=>{"use strict";Object.defineProperty(Pi,"__esModule",{value:!0});Pi.tokenMatcher=Pi.createTokenInstance=Pi.EOF=Pi.createToken=Pi.hasTokenLabel=Pi.tokenName=Pi.tokenLabel=void 0;var Ao=Yt(),BEe=Dp(),DS=mg();function bEe(r){return rj(r)?r.LABEL:r.name}Pi.tokenLabel=bEe;function QEe(r){return r.name}Pi.tokenName=QEe;function rj(r){return(0,Ao.isString)(r.LABEL)&&r.LABEL!==""}Pi.hasTokenLabel=rj;var SEe="parent",ij="categories",nj="label",sj="group",oj="push_mode",aj="pop_mode",Aj="longer_alt",lj="line_breaks",cj="start_chars_hint";function uj(r){return vEe(r)}Pi.createToken=uj;function vEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,Ao.isUndefined)(e)||(t.PATTERN=e),(0,Ao.has)(r,SEe))throw`The parent property is no longer supported. +See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Ao.has)(r,ij)&&(t.CATEGORIES=r[ij]),(0,DS.augmentTokenTypes)([t]),(0,Ao.has)(r,nj)&&(t.LABEL=r[nj]),(0,Ao.has)(r,sj)&&(t.GROUP=r[sj]),(0,Ao.has)(r,aj)&&(t.POP_MODE=r[aj]),(0,Ao.has)(r,oj)&&(t.PUSH_MODE=r[oj]),(0,Ao.has)(r,Aj)&&(t.LONGER_ALT=r[Aj]),(0,Ao.has)(r,lj)&&(t.LINE_BREAKS=r[lj]),(0,Ao.has)(r,cj)&&(t.START_CHARS_HINT=r[cj]),t}Pi.EOF=uj({name:"EOF",pattern:BEe.Lexer.NA});(0,DS.augmentTokenTypes)([Pi.EOF]);function xEe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Pi.createTokenInstance=xEe;function kEe(r,e){return(0,DS.tokenStructuredMatcher)(r,e)}Pi.tokenMatcher=kEe});var bn=w(Vt=>{"use strict";var Ga=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,"__esModule",{value:!0});Vt.serializeProduction=Vt.serializeGrammar=Vt.Terminal=Vt.Alternation=Vt.RepetitionWithSeparator=Vt.Repetition=Vt.RepetitionMandatoryWithSeparator=Vt.RepetitionMandatory=Vt.Option=Vt.Alternative=Vt.Rule=Vt.NonTerminal=Vt.AbstractProduction=void 0;var fr=Yt(),PEe=XA(),Ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,fr.forEach)(this.definition,function(t){t.accept(e)})},r}();Vt.AbstractProduction=Ko;var gj=function(r){Ga(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(Ko);Vt.NonTerminal=gj;var fj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Rule=fj;var hj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Alternative=hj;var pj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Option=pj;var dj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatory=dj;var Cj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatoryWithSeparator=Cj;var mj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Repetition=mj;var Ej=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionWithSeparator=Ej;var Ij=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(Ko);Vt.Alternation=Ij;var GI=function(){function r(e){this.idx=1,(0,fr.assign)(this,(0,fr.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Vt.Terminal=GI;function DEe(r){return(0,fr.map)(r,Fp)}Vt.serializeGrammar=DEe;function Fp(r){function e(s){return(0,fr.map)(s,Fp)}if(r instanceof gj){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,fr.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof hj)return{type:"Alternative",definition:e(r.definition)};if(r instanceof pj)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof dj)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Cj)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Ej)return{type:"RepetitionWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof mj)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Ij)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof GI){var i={type:"Terminal",name:r.terminalType.name,label:(0,PEe.tokenLabel)(r.terminalType),idx:r.idx};(0,fr.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,fr.isRegExp)(n)?n.source:n),i}else{if(r instanceof fj)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Vt.serializeProduction=Fp});var qI=w(YI=>{"use strict";Object.defineProperty(YI,"__esModule",{value:!0});YI.RestWalker=void 0;var RS=Yt(),Qn=bn(),REe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,RS.forEach)(e.definition,function(n,s){var o=(0,RS.drop)(e.definition,s+1);if(n instanceof Qn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof Qn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof Qn.Alternative)i.walkFlat(n,o,t);else if(n instanceof Qn.Option)i.walkOption(n,o,t);else if(n instanceof Qn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof Qn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof Qn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof Qn.Repetition)i.walkMany(n,o,t);else if(n instanceof Qn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,RS.forEach)(e.definition,function(o){var a=new Qn.Alternative({definition:[o]});n.walk(a,s)})},r}();YI.RestWalker=REe;function yj(r,e,t){var i=[new Qn.Option({definition:[new Qn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Eg=w(JI=>{"use strict";Object.defineProperty(JI,"__esModule",{value:!0});JI.GAstVisitor=void 0;var Uo=bn(),FEe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Uo.NonTerminal:return this.visitNonTerminal(t);case Uo.Alternative:return this.visitAlternative(t);case Uo.Option:return this.visitOption(t);case Uo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Uo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Uo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Uo.Repetition:return this.visitRepetition(t);case Uo.Alternation:return this.visitAlternation(t);case Uo.Terminal:return this.visitTerminal(t);case Uo.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();JI.GAstVisitor=FEe});var Lp=w(Gi=>{"use strict";var NEe=Gi&&Gi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Gi,"__esModule",{value:!0});Gi.collectMethods=Gi.DslMethodsCollectorVisitor=Gi.getProductionDslName=Gi.isBranchingProd=Gi.isOptionalProd=Gi.isSequenceProd=void 0;var Np=Yt(),xr=bn(),LEe=Eg();function TEe(r){return r instanceof xr.Alternative||r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionMandatory||r instanceof xr.RepetitionMandatoryWithSeparator||r instanceof xr.RepetitionWithSeparator||r instanceof xr.Terminal||r instanceof xr.Rule}Gi.isSequenceProd=TEe;function FS(r,e){e===void 0&&(e=[]);var t=r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionWithSeparator;return t?!0:r instanceof xr.Alternation?(0,Np.some)(r.definition,function(i){return FS(i,e)}):r instanceof xr.NonTerminal&&(0,Np.contains)(e,r)?!1:r instanceof xr.AbstractProduction?(r instanceof xr.NonTerminal&&e.push(r),(0,Np.every)(r.definition,function(i){return FS(i,e)})):!1}Gi.isOptionalProd=FS;function OEe(r){return r instanceof xr.Alternation}Gi.isBranchingProd=OEe;function MEe(r){if(r instanceof xr.NonTerminal)return"SUBRULE";if(r instanceof xr.Option)return"OPTION";if(r instanceof xr.Alternation)return"OR";if(r instanceof xr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof xr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof xr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof xr.Repetition)return"MANY";if(r instanceof xr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Gi.getProductionDslName=MEe;var wj=function(r){NEe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(LEe.GAstVisitor);Gi.DslMethodsCollectorVisitor=wj;var WI=new wj;function KEe(r){WI.reset(),r.accept(WI);var e=WI.dslMethods;return WI.reset(),e}Gi.collectMethods=KEe});var LS=w(Ho=>{"use strict";Object.defineProperty(Ho,"__esModule",{value:!0});Ho.firstForTerminal=Ho.firstForBranching=Ho.firstForSequence=Ho.first=void 0;var zI=Yt(),Bj=bn(),NS=Lp();function _I(r){if(r instanceof Bj.NonTerminal)return _I(r.referencedRule);if(r instanceof Bj.Terminal)return Sj(r);if((0,NS.isSequenceProd)(r))return bj(r);if((0,NS.isBranchingProd)(r))return Qj(r);throw Error("non exhaustive match")}Ho.first=_I;function bj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,NS.isOptionalProd)(s),e=e.concat(_I(s)),i=i+1,n=t.length>i;return(0,zI.uniq)(e)}Ho.firstForSequence=bj;function Qj(r){var e=(0,zI.map)(r.definition,function(t){return _I(t)});return(0,zI.uniq)((0,zI.flatten)(e))}Ho.firstForBranching=Qj;function Sj(r){return[r.terminalType]}Ho.firstForTerminal=Sj});var TS=w(VI=>{"use strict";Object.defineProperty(VI,"__esModule",{value:!0});VI.IN=void 0;VI.IN="_~IN~_"});var Dj=w(vs=>{"use strict";var UEe=vs&&vs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(vs,"__esModule",{value:!0});vs.buildInProdFollowPrefix=vs.buildBetweenProdsFollowPrefix=vs.computeAllProdsFollows=vs.ResyncFollowsWalker=void 0;var HEe=qI(),jEe=LS(),vj=Yt(),xj=TS(),GEe=bn(),Pj=function(r){UEe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=kj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new GEe.Alternative({definition:o}),l=(0,jEe.first)(a);this.follows[s]=l},e}(HEe.RestWalker);vs.ResyncFollowsWalker=Pj;function YEe(r){var e={};return(0,vj.forEach)(r,function(t){var i=new Pj(t).startWalking();(0,vj.assign)(e,i)}),e}vs.computeAllProdsFollows=YEe;function kj(r,e){return r.name+e+xj.IN}vs.buildBetweenProdsFollowPrefix=kj;function qEe(r){var e=r.terminalType.name;return e+r.idx+xj.IN}vs.buildInProdFollowPrefix=qEe});var Tp=w(Ya=>{"use strict";Object.defineProperty(Ya,"__esModule",{value:!0});Ya.defaultGrammarValidatorErrorProvider=Ya.defaultGrammarResolverErrorProvider=Ya.defaultParserErrorProvider=void 0;var Ig=XA(),JEe=Yt(),lo=Yt(),OS=bn(),Rj=Lp();Ya.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,Ig.hasTokenLabel)(e),o=s?"--> "+(0,Ig.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,lo.first)(t).image,l=` +but found: '`+a+"'";if(n)return o+n+l;var c=(0,lo.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,lo.map)(c,function(h){return"["+(0,lo.map)(h,function(p){return(0,Ig.tokenLabel)(p)}).join(", ")+"]"}),g=(0,lo.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: +`+g.join(` +`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,lo.first)(t).image,a=` +but found: '`+o+"'";if(i)return s+i+a;var l=(0,lo.map)(e,function(u){return"["+(0,lo.map)(u,function(g){return(0,Ig.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: + `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ya.defaultParserErrorProvider);Ya.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+r.name+"<-";return t}};Ya.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof OS.Terminal?u.terminalType.name:u instanceof OS.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,lo.first)(e),s=n.idx,o=(0,Rj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` + appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` +`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. +`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. +`)+`To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix +`+("in inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,Rj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. +This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. +`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: +`+(" inside <"+r.topLevelRule.name+`> Rule. + has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=JEe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. +`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) +`)+(`without consuming any Tokens. The grammar path that causes this is: + `+i+` +`)+` To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof OS.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Lj=w(ZA=>{"use strict";var WEe=ZA&&ZA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(ZA,"__esModule",{value:!0});ZA.GastRefResolverVisitor=ZA.resolveGrammar=void 0;var zEe=$n(),Fj=Yt(),_Ee=Eg();function VEe(r,e){var t=new Nj(r,e);return t.resolveRefs(),t.errors}ZA.resolveGrammar=VEe;var Nj=function(r){WEe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,Fj.forEach)((0,Fj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:zEe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(_Ee.GAstVisitor);ZA.GastRefResolverVisitor=Nj});var Mp=w(Kr=>{"use strict";var Pc=Kr&&Kr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Kr,"__esModule",{value:!0});Kr.nextPossibleTokensAfter=Kr.possiblePathsFrom=Kr.NextTerminalAfterAtLeastOneSepWalker=Kr.NextTerminalAfterAtLeastOneWalker=Kr.NextTerminalAfterManySepWalker=Kr.NextTerminalAfterManyWalker=Kr.AbstractNextTerminalAfterProductionWalker=Kr.NextAfterTokenWalker=Kr.AbstractNextPossibleTokensWalker=void 0;var Tj=qI(),Kt=Yt(),XEe=LS(),Dt=bn(),Oj=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(Tj.RestWalker);Kr.AbstractNextPossibleTokensWalker=Oj;var ZEe=function(r){Pc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Dt.Alternative({definition:s});this.possibleTokTypes=(0,XEe.first)(o),this.found=!0}},e}(Oj);Kr.NextAfterTokenWalker=ZEe;var Op=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(Tj.RestWalker);Kr.AbstractNextTerminalAfterProductionWalker=Op;var $Ee=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManyWalker=$Ee;var eIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManySepWalker=eIe;var tIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneWalker=tIe;var rIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneSepWalker=rIe;function Mj(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Mj(s(c),e,t);return i.concat(u)}for(;t.length=0;ce--){var Z=b.definition[ce],O={idx:p,def:Z.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y};g.push(O),g.push(o)}else if(b instanceof Dt.Alternative)g.push({idx:p,def:b.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y});else if(b instanceof Dt.Rule)g.push(iIe(b,p,m,y));else throw Error("non exhaustive match")}}return u}Kr.nextPossibleTokensAfter=nIe;function iIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Kp=w(tr=>{"use strict";var Kj=tr&&tr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(tr,"__esModule",{value:!0});tr.areTokenCategoriesNotUsed=tr.isStrictPrefixOfPath=tr.containsPath=tr.getLookaheadPathsForOptionalProd=tr.getLookaheadPathsForOr=tr.lookAheadSequenceFromAlternatives=tr.buildSingleAlternativeLookaheadFunction=tr.buildAlternativesLookAheadFunc=tr.buildLookaheadFuncForOptionalProd=tr.buildLookaheadFuncForOr=tr.getProdType=tr.PROD_TYPE=void 0;var cr=Yt(),Uj=Mp(),sIe=qI(),XI=mg(),$A=bn(),oIe=Eg(),ui;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(ui=tr.PROD_TYPE||(tr.PROD_TYPE={}));function aIe(r){if(r instanceof $A.Option)return ui.OPTION;if(r instanceof $A.Repetition)return ui.REPETITION;if(r instanceof $A.RepetitionMandatory)return ui.REPETITION_MANDATORY;if(r instanceof $A.RepetitionMandatoryWithSeparator)return ui.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof $A.RepetitionWithSeparator)return ui.REPETITION_WITH_SEPARATOR;if(r instanceof $A.Alternation)return ui.ALTERNATION;throw Error("non exhaustive match")}tr.getProdType=aIe;function AIe(r,e,t,i,n,s){var o=Hj(r,e,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o,i,a,n)}tr.buildLookaheadFuncForOr=AIe;function lIe(r,e,t,i,n,s){var o=jj(r,e,n,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o[0],a,i)}tr.buildLookaheadFuncForOptionalProd=lIe;function cIe(r,e,t,i){var n=r.length,s=(0,cr.every)(r,function(l){return(0,cr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,cr.map)(l,function(x){return x.GATE}),u=0;u{"use strict";var HS=Xt&&Xt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Xt,"__esModule",{value:!0});Xt.checkPrefixAlternativesAmbiguities=Xt.validateSomeNonEmptyLookaheadPath=Xt.validateTooManyAlts=Xt.RepetionCollector=Xt.validateAmbiguousAlternationAlternatives=Xt.validateEmptyOrAlternative=Xt.getFirstNoneTerminal=Xt.validateNoLeftRecursion=Xt.validateRuleIsOverridden=Xt.validateRuleDoesNotAlreadyExist=Xt.OccurrenceValidationCollector=Xt.identifyProductionForDuplicates=Xt.validateGrammar=void 0;var nr=Yt(),kr=Yt(),jo=$n(),jS=Lp(),yg=Kp(),pIe=Mp(),co=bn(),GS=Eg();function mIe(r,e,t,i,n){var s=nr.map(r,function(h){return dIe(h,i)}),o=nr.map(r,function(h){return YS(h,h,i)}),a=[],l=[],c=[];(0,kr.every)(o,kr.isEmpty)&&(a=(0,kr.map)(r,function(h){return Wj(h,i)}),l=(0,kr.map)(r,function(h){return zj(h,e,i)}),c=Vj(r,e,i));var u=CIe(r,t,i),g=(0,kr.map)(r,function(h){return _j(h,i)}),f=(0,kr.map)(r,function(h){return Jj(h,r,n,i)});return nr.flatten(s.concat(c,o,a,l,u,g,f))}Xt.validateGrammar=mIe;function dIe(r,e){var t=new $j;r.accept(t);var i=t.allProductions,n=nr.groupBy(i,Xj),s=nr.pick(n,function(a){return a.length>1}),o=nr.map(nr.values(s),function(a){var l=nr.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,jS.getProductionDslName)(l),g={message:c,type:jo.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=Zj(l);return f&&(g.parameter=f),g});return o}function Xj(r){return(0,jS.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+Zj(r)}Xt.identifyProductionForDuplicates=Xj;function Zj(r){return r instanceof co.Terminal?r.terminalType.name:r instanceof co.NonTerminal?r.nonTerminalName:""}var $j=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.OccurrenceValidationCollector=$j;function Jj(r,e,t,i){var n=[],s=(0,kr.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:jo.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Xt.validateRuleDoesNotAlreadyExist=Jj;function EIe(r,e,t){var i=[],n;return nr.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:jo.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Xt.validateRuleIsOverridden=EIe;function YS(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Up(e.definition);if(nr.isEmpty(s))return[];var o=r.name,a=nr.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:jo.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=nr.difference(s,i.concat([r])),c=nr.map(l,function(u){var g=nr.cloneArr(i);return g.push(u),YS(r,u,t,g)});return n.concat(nr.flatten(c))}Xt.validateNoLeftRecursion=YS;function Up(r){var e=[];if(nr.isEmpty(r))return e;var t=nr.first(r);if(t instanceof co.NonTerminal)e.push(t.referencedRule);else if(t instanceof co.Alternative||t instanceof co.Option||t instanceof co.RepetitionMandatory||t instanceof co.RepetitionMandatoryWithSeparator||t instanceof co.RepetitionWithSeparator||t instanceof co.Repetition)e=e.concat(Up(t.definition));else if(t instanceof co.Alternation)e=nr.flatten(nr.map(t.definition,function(o){return Up(o.definition)}));else if(!(t instanceof co.Terminal))throw Error("non exhaustive match");var i=(0,jS.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=nr.drop(r);return e.concat(Up(s))}else return e}Xt.getFirstNoneTerminal=Up;var qS=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(GS.GAstVisitor);function Wj(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){var a=nr.dropRight(o.definition),l=nr.map(a,function(c,u){var g=(0,pIe.nextPossibleTokensAfter)([c],[],null,1);return nr.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:jo.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(nr.compact(l))},[]);return n}Xt.validateEmptyOrAlternative=Wj;function zj(r,e,t){var i=new qS;r.accept(i);var n=i.alternations;n=(0,kr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=nr.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,yg.getLookaheadPathsForOr)(l,r,c,a),g=IIe(u,a,r,t),f=eG(u,a,r,t);return o.concat(g,f)},[]);return s}Xt.validateAmbiguousAlternationAlternatives=zj;var tG=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.RepetionCollector=tG;function _j(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:jo.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Xt.validateTooManyAlts=_j;function Vj(r,e,t){var i=[];return(0,kr.forEach)(r,function(n){var s=new tG;n.accept(s);var o=s.allProductions;(0,kr.forEach)(o,function(a){var l=(0,yg.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,yg.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,kr.isEmpty)((0,kr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:jo.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Xt.validateSomeNonEmptyLookaheadPath=Vj;function IIe(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,kr.forEach)(l,function(u){var g=[c];(0,kr.forEach)(r,function(f,h){c!==h&&(0,yg.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,yg.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=nr.map(s,function(a){var l=(0,kr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:jo.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function eG(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(o,a,l){var c=(0,kr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,kr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,kr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(wg,"__esModule",{value:!0});wg.validateGrammar=wg.resolveGrammar=void 0;var WS=Yt(),yIe=Lj(),wIe=JS(),rG=Tp();function BIe(r){r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarResolverErrorProvider});var e={};return(0,WS.forEach)(r.rules,function(t){e[t.name]=t}),(0,yIe.resolveGrammar)(e,r.errMsgProvider)}wg.resolveGrammar=BIe;function bIe(r){return r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarValidatorErrorProvider}),(0,wIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}wg.validateGrammar=bIe});var Bg=w(Sn=>{"use strict";var Hp=Sn&&Sn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Sn,"__esModule",{value:!0});Sn.EarlyExitException=Sn.NotAllInputParsedException=Sn.NoViableAltException=Sn.MismatchedTokenException=Sn.isRecognitionException=void 0;var QIe=Yt(),nG="MismatchedTokenException",sG="NoViableAltException",oG="EarlyExitException",aG="NotAllInputParsedException",AG=[nG,sG,oG,aG];Object.freeze(AG);function SIe(r){return(0,QIe.contains)(AG,r.name)}Sn.isRecognitionException=SIe;var ZI=function(r){Hp(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),vIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=nG,s}return e}(ZI);Sn.MismatchedTokenException=vIe;var xIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=sG,s}return e}(ZI);Sn.NoViableAltException=xIe;var kIe=function(r){Hp(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=aG,n}return e}(ZI);Sn.NotAllInputParsedException=kIe;var PIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=oG,s}return e}(ZI);Sn.EarlyExitException=PIe});var _S=w(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.attemptInRepetitionRecovery=Yi.Recoverable=Yi.InRuleRecoveryException=Yi.IN_RULE_RECOVERY_EXCEPTION=Yi.EOF_FOLLOW_KEY=void 0;var $I=XA(),xs=Yt(),DIe=Bg(),RIe=TS(),FIe=$n();Yi.EOF_FOLLOW_KEY={};Yi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function zS(r){this.name=Yi.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Yi.InRuleRecoveryException=zS;zS.prototype=Error.prototype;var NIe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,xs.has)(e,"recoveryEnabled")?e.recoveryEnabled:FIe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=lG)},r.prototype.getTokenToInsert=function(e){var t=(0,$I.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),m=new DIe.MismatchedTokenException(p,u,s.LA(0));m.resyncedTokens=(0,xs.dropRight)(l),s.SAVE_ERROR(m)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new zS("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,xs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,xs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,xs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,xs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Yi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,xs.map)(t,function(n,s){return s===0?Yi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,xs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,xs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Yi.EOF_FOLLOW_KEY)return[$I.EOF];var t=e.ruleName+e.idxInCallingRule+RIe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,$I.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,xs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,xs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,xs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Yi.Recoverable=NIe;function lG(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=$I.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Yi.attemptInRepetitionRecovery=lG});var ey=w(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.LooksAhead=void 0;var qa=Kp(),uo=Yt(),cG=$n(),Ja=ey(),Dc=Lp(),TIe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,uo.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:cG.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,uo.has)(e,"maxLookahead")?e.maxLookahead:cG.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,uo.isES2015MapSupported)()?new Map:[],(0,uo.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,uo.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Dc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,uo.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,Dc.getProductionDslName)(g)+f,function(){var h=(0,qa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Ja.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Ja.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,uo.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_IDX,qa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Ja.OPTION_IDX,qa.PROD_TYPE.OPTION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_IDX,qa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_SEP_IDX,qa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_SEP_IDX,qa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,qa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Ja.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,qa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,qa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Ja.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();ty.LooksAhead=TIe});var gG=w(Go=>{"use strict";Object.defineProperty(Go,"__esModule",{value:!0});Go.addNoneTerminalToCst=Go.addTerminalToCst=Go.setNodeLocationFull=Go.setNodeLocationOnlyOffset=void 0;function OIe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(el,"__esModule",{value:!0});el.defineNameProp=el.functionName=el.classNameFromInstance=void 0;var HIe=Yt();function jIe(r){return fG(r.constructor)}el.classNameFromInstance=jIe;var hG="name";function fG(r){var e=r.name;return e||"anonymous"}el.functionName=fG;function GIe(r,e){var t=Object.getOwnPropertyDescriptor(r,hG);return(0,HIe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,hG,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}el.defineNameProp=GIe});var EG=w(Di=>{"use strict";Object.defineProperty(Di,"__esModule",{value:!0});Di.validateRedundantMethods=Di.validateMissingCstMethods=Di.validateVisitor=Di.CstVisitorDefinitionError=Di.createBaseVisitorConstructorWithDefaults=Di.createBaseSemanticVisitorConstructor=Di.defaultVisit=void 0;var ks=Yt(),jp=VS();function pG(r,e){for(var t=(0,ks.keys)(r),i=t.length,n=0;n: + `+(""+s.join(` + +`).replace(/\n/g,` + `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Di.createBaseSemanticVisitorConstructor=YIe;function qIe(r,e,t){var i=function(){};(0,jp.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,ks.forEach)(e,function(s){n[s]=pG}),i.prototype=n,i.prototype.constructor=i,i}Di.createBaseVisitorConstructorWithDefaults=qIe;var XS;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(XS=Di.CstVisitorDefinitionError||(Di.CstVisitorDefinitionError={}));function dG(r,e){var t=CG(r,e),i=mG(r,e);return t.concat(i)}Di.validateVisitor=dG;function CG(r,e){var t=(0,ks.map)(e,function(i){if(!(0,ks.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+" CST Visitor.",type:XS.MISSING_METHOD,methodName:i}});return(0,ks.compact)(t)}Di.validateMissingCstMethods=CG;var JIe=["constructor","visit","validateVisitor"];function mG(r,e){var t=[];for(var i in r)(0,ks.isFunction)(r[i])&&!(0,ks.contains)(JIe,i)&&!(0,ks.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+` CST Visitor +There is no Grammar Rule corresponding to this method's name. +`,type:XS.REDUNDANT_METHOD,methodName:i});return t}Di.validateRedundantMethods=mG});var yG=w(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.TreeBuilder=void 0;var bg=gG(),ni=Yt(),IG=EG(),WIe=$n(),zIe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,ni.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:WIe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ni.NOOP,this.cstFinallyStateUpdate=ni.NOOP,this.cstPostTerminal=ni.NOOP,this.cstPostNonTerminal=ni.NOOP,this.cstPostRule=ni.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationFull,this.setNodeLocationFromNode=bg.setNodeLocationFull,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=bg.setNodeLocationOnlyOffset,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=ni.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,ni.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,IG.createBaseSemanticVisitorConstructor)(this.className,(0,ni.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,ni.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,IG.createBaseVisitorConstructorWithDefaults)(this.className,(0,ni.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();ry.TreeBuilder=zIe});var BG=w(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.LexerAdapter=void 0;var wG=$n(),_Ie=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):wG.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?wG.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();iy.LexerAdapter=_Ie});var QG=w(ny=>{"use strict";Object.defineProperty(ny,"__esModule",{value:!0});ny.RecognizerApi=void 0;var bG=Yt(),VIe=Bg(),ZS=$n(),XIe=Tp(),ZIe=JS(),$Ie=bn(),eye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG),(0,bG.contains)(this.definedRulesNames,e)){var n=XIe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:ZS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,ZIe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,VIe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,$Ie.serializeGrammar)((0,bG.values)(this.gastProductionsCache))},r}();ny.RecognizerApi=eye});var kG=w(sy=>{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.RecognizerEngine=void 0;var Fr=Yt(),es=ey(),oy=Bg(),SG=Kp(),Qg=Mp(),vG=$n(),tye=_S(),xG=XA(),Gp=mg(),rye=VS(),iye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,rye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Gp.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Fr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if((0,Fr.isArray)(e)){if((0,Fr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if((0,Fr.isArray)(e))this.tokensMap=(0,Fr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Fr.has)(e,"modes")&&(0,Fr.every)((0,Fr.flatten)((0,Fr.values)(e.modes)),Gp.isTokenType)){var i=(0,Fr.flatten)((0,Fr.values)(e.modes)),n=(0,Fr.uniq)(i);this.tokensMap=(0,Fr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Fr.isObject)(e))this.tokensMap=(0,Fr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=xG.EOF;var s=(0,Fr.every)((0,Fr.values)(e),function(o){return(0,Fr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Gp.tokenStructuredMatcherNoCategories:Gp.tokenStructuredMatcher,(0,Gp.augmentTokenTypes)((0,Fr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Fr.has)(i,"resyncEnabled")?i.resyncEnabled:vG.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Fr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:vG.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(es.OR_IDX,t),n=(0,Fr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new oy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,oy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new oy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===tye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Fr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),xG.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();sy.RecognizerEngine=iye});var DG=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.ErrorHandler=void 0;var $S=Bg(),ev=Yt(),PG=Kp(),nye=$n(),sye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,ev.has)(e,"errorMessageProvider")?e.errorMessageProvider:nye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,$S.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,ev.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,ev.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,PG.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new $S.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,PG.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new $S.NoViableAltException(c,this.LA(1),l))},r}();ay.ErrorHandler=sye});var NG=w(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.ContentAssist=void 0;var RG=Mp(),FG=Yt(),oye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,FG.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,RG.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,FG.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new RG.NextAfterTokenWalker(n,e).startWalking();return s},r}();Ay.ContentAssist=oye});var jG=w(ly=>{"use strict";Object.defineProperty(ly,"__esModule",{value:!0});ly.GastRecorder=void 0;var vn=Yt(),Yo=bn(),aye=Dp(),LG=mg(),TG=XA(),Aye=$n(),lye=ey(),cy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(cy);var OG=!0,MG=Math.pow(2,lye.BITS_FOR_OCCURRENCE_IDX)-1,KG=(0,TG.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:aye.Lexer.NA});(0,LG.augmentTokenTypes)([KG]);var UG=(0,TG.createTokenInstance)(KG,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(UG);var cye={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},gye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Aye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Yo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Yp.call(this,Yo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatoryWithSeparator,t,e,OG)},r.prototype.manyInternalRecord=function(e,t){Yp.call(this,Yo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionWithSeparator,t,e,OG)},r.prototype.orInternalRecord=function(e,t){return uye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(uy(t),!e||(0,vn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=e.ruleName,a=new Yo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?cye:cy},r.prototype.consumeInternalRecord=function(e,t,i){if(uy(t),!(0,LG.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=new Yo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),UG},r}();ly.GastRecorder=gye;function Yp(r,e,t,i){i===void 0&&(i=!1),uy(t);var n=(0,vn.peek)(this.recordingProdStack),s=(0,vn.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,vn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),cy}function uye(r,e){var t=this;uy(e);var i=(0,vn.peek)(this.recordingProdStack),n=(0,vn.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Yo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,vn.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,vn.some)(s,function(l){return(0,vn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,vn.forEach)(s,function(l){var c=new Yo.Alternative({definition:[]});o.definition.push(c),(0,vn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,vn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),cy}function HG(r){return r===0?"":""+r}function uy(r){if(r<0||r>MG){var e=new Error("Invalid DSL Method idx value: <"+r+`> + `+("Idx value must be a none negative value smaller than "+(MG+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var YG=w(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.PerformanceTracer=void 0;var GG=Yt(),fye=$n(),hye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,GG.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:Infinity,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=fye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,GG.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();gy.PerformanceTracer=hye});var qG=w(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.applyMixins=void 0;function pye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}fy.applyMixins=pye});var $n=w(Er=>{"use strict";var JG=Er&&Er.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Er,"__esModule",{value:!0});Er.EmbeddedActionsParser=Er.CstParser=Er.Parser=Er.EMPTY_ALT=Er.ParserDefinitionErrorType=Er.DEFAULT_RULE_CONFIG=Er.DEFAULT_PARSER_CONFIG=Er.END_OF_FILE=void 0;var an=Yt(),dye=Dj(),WG=XA(),zG=Tp(),_G=iG(),Cye=_S(),mye=uG(),Eye=yG(),Iye=BG(),yye=QG(),wye=kG(),Bye=DG(),bye=NG(),Qye=jG(),Sye=YG(),vye=qG();Er.END_OF_FILE=(0,WG.createTokenInstance)(WG.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Er.END_OF_FILE);Er.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:zG.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});Er.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var xye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(xye=Er.ParserDefinitionErrorType||(Er.ParserDefinitionErrorType={}));function kye(r){return r===void 0&&(r=void 0),function(){return r}}Er.EMPTY_ALT=kye;var hy=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,an.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=(0,an.has)(t,"skipValidations")?t.skipValidations:Er.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,an.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,an.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,_G.resolveGrammar)({rules:(0,an.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,an.isEmpty)(n)&&e.skipValidations===!1){var s=(0,_G.validateGrammar)({rules:(0,an.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,an.values)(e.tokensMap),errMsgProvider:zG.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,an.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,dye.computeAllProdsFollows)((0,an.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,an.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,an.isEmpty)(e.definitionErrors))throw t=(0,an.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: + `+t.join(` +------------------------------- +`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();Er.Parser=hy;(0,vye.applyMixins)(hy,[Cye.Recoverable,mye.LooksAhead,Eye.TreeBuilder,Iye.LexerAdapter,wye.RecognizerEngine,yye.RecognizerApi,Bye.ErrorHandler,bye.ContentAssist,Qye.GastRecorder,Sye.PerformanceTracer]);var Pye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(hy);Er.CstParser=Pye;var Dye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(hy);Er.EmbeddedActionsParser=Dye});var XG=w(py=>{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.createSyntaxDiagramsCode=void 0;var VG=IS();function Rye(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/diagrams.css":s,a=` + + + + + +`,l=` + +`,c=` + + + + +`,u=` +
+`,g=` + +`,f=` + +`;return a+l+c+u+g+f}py.createSyntaxDiagramsCode=Rye});var eY=w(Ve=>{"use strict";Object.defineProperty(Ve,"__esModule",{value:!0});Ve.Parser=Ve.createSyntaxDiagramsCode=Ve.clearCache=Ve.GAstVisitor=Ve.serializeProduction=Ve.serializeGrammar=Ve.Terminal=Ve.Rule=Ve.RepetitionWithSeparator=Ve.RepetitionMandatoryWithSeparator=Ve.RepetitionMandatory=Ve.Repetition=Ve.Option=Ve.NonTerminal=Ve.Alternative=Ve.Alternation=Ve.defaultLexerErrorProvider=Ve.NoViableAltException=Ve.NotAllInputParsedException=Ve.MismatchedTokenException=Ve.isRecognitionException=Ve.EarlyExitException=Ve.defaultParserErrorProvider=Ve.tokenName=Ve.tokenMatcher=Ve.tokenLabel=Ve.EOF=Ve.createTokenInstance=Ve.createToken=Ve.LexerDefinitionErrorType=Ve.Lexer=Ve.EMPTY_ALT=Ve.ParserDefinitionErrorType=Ve.EmbeddedActionsParser=Ve.CstParser=Ve.VERSION=void 0;var Fye=IS();Object.defineProperty(Ve,"VERSION",{enumerable:!0,get:function(){return Fye.VERSION}});var dy=$n();Object.defineProperty(Ve,"CstParser",{enumerable:!0,get:function(){return dy.CstParser}});Object.defineProperty(Ve,"EmbeddedActionsParser",{enumerable:!0,get:function(){return dy.EmbeddedActionsParser}});Object.defineProperty(Ve,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return dy.ParserDefinitionErrorType}});Object.defineProperty(Ve,"EMPTY_ALT",{enumerable:!0,get:function(){return dy.EMPTY_ALT}});var ZG=Dp();Object.defineProperty(Ve,"Lexer",{enumerable:!0,get:function(){return ZG.Lexer}});Object.defineProperty(Ve,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return ZG.LexerDefinitionErrorType}});var Sg=XA();Object.defineProperty(Ve,"createToken",{enumerable:!0,get:function(){return Sg.createToken}});Object.defineProperty(Ve,"createTokenInstance",{enumerable:!0,get:function(){return Sg.createTokenInstance}});Object.defineProperty(Ve,"EOF",{enumerable:!0,get:function(){return Sg.EOF}});Object.defineProperty(Ve,"tokenLabel",{enumerable:!0,get:function(){return Sg.tokenLabel}});Object.defineProperty(Ve,"tokenMatcher",{enumerable:!0,get:function(){return Sg.tokenMatcher}});Object.defineProperty(Ve,"tokenName",{enumerable:!0,get:function(){return Sg.tokenName}});var Nye=Tp();Object.defineProperty(Ve,"defaultParserErrorProvider",{enumerable:!0,get:function(){return Nye.defaultParserErrorProvider}});var qp=Bg();Object.defineProperty(Ve,"EarlyExitException",{enumerable:!0,get:function(){return qp.EarlyExitException}});Object.defineProperty(Ve,"isRecognitionException",{enumerable:!0,get:function(){return qp.isRecognitionException}});Object.defineProperty(Ve,"MismatchedTokenException",{enumerable:!0,get:function(){return qp.MismatchedTokenException}});Object.defineProperty(Ve,"NotAllInputParsedException",{enumerable:!0,get:function(){return qp.NotAllInputParsedException}});Object.defineProperty(Ve,"NoViableAltException",{enumerable:!0,get:function(){return qp.NoViableAltException}});var Lye=PS();Object.defineProperty(Ve,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return Lye.defaultLexerErrorProvider}});var qo=bn();Object.defineProperty(Ve,"Alternation",{enumerable:!0,get:function(){return qo.Alternation}});Object.defineProperty(Ve,"Alternative",{enumerable:!0,get:function(){return qo.Alternative}});Object.defineProperty(Ve,"NonTerminal",{enumerable:!0,get:function(){return qo.NonTerminal}});Object.defineProperty(Ve,"Option",{enumerable:!0,get:function(){return qo.Option}});Object.defineProperty(Ve,"Repetition",{enumerable:!0,get:function(){return qo.Repetition}});Object.defineProperty(Ve,"RepetitionMandatory",{enumerable:!0,get:function(){return qo.RepetitionMandatory}});Object.defineProperty(Ve,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionMandatoryWithSeparator}});Object.defineProperty(Ve,"RepetitionWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionWithSeparator}});Object.defineProperty(Ve,"Rule",{enumerable:!0,get:function(){return qo.Rule}});Object.defineProperty(Ve,"Terminal",{enumerable:!0,get:function(){return qo.Terminal}});var $G=bn();Object.defineProperty(Ve,"serializeGrammar",{enumerable:!0,get:function(){return $G.serializeGrammar}});Object.defineProperty(Ve,"serializeProduction",{enumerable:!0,get:function(){return $G.serializeProduction}});var Tye=Eg();Object.defineProperty(Ve,"GAstVisitor",{enumerable:!0,get:function(){return Tye.GAstVisitor}});function Oye(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. + It performs no action other than printing this message. + Please avoid using it as it will be completely removed in the future`)}Ve.clearCache=Oye;var Mye=XG();Object.defineProperty(Ve,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return Mye.createSyntaxDiagramsCode}});var Kye=function(){function r(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. +See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return r}();Ve.Parser=Kye});var iY=w((Z$e,tY)=>{var Cy=eY(),Wa=Cy.createToken,rY=Cy.tokenMatcher,tv=Cy.Lexer,Uye=Cy.EmbeddedActionsParser;tY.exports=r=>{let e=Wa({name:"LogicalOperator",pattern:tv.NA}),t=Wa({name:"Or",pattern:/\|/,categories:e}),i=Wa({name:"Xor",pattern:/\^/,categories:e}),n=Wa({name:"And",pattern:/&/,categories:e}),s=Wa({name:"Not",pattern:/!/}),o=Wa({name:"LParen",pattern:/\(/}),a=Wa({name:"RParen",pattern:/\)/}),l=Wa({name:"Query",pattern:r}),u=[Wa({name:"WhiteSpace",pattern:/\s+/,group:tv.SKIPPED}),t,i,n,o,a,s,e,l],g=new tv(u);class f extends Uye{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let y=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let b=y,v=this.CONSUME(e),x=this.SUBRULE2(this.atomicExpression);rY(v,t)?y=T=>b(T)||x(T):rY(v,i)?y=T=>!!(b(T)^x(T)):y=T=>b(T)&&x(T)}),y}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:m}=this.CONSUME(l);return y=>y(m)}},{ALT:()=>{this.CONSUME(s);let m=this.SUBRULE(this.atomicExpression);return y=>!m(y)}}])),this.RULE("parenthesisExpression",()=>{let m;return this.CONSUME(o),m=this.SUBRULE(this.expression),this.CONSUME(a),m}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var nY=w(my=>{var Hye=iY();my.makeParser=(r=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:t}=Hye(r),i=new t;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};my.parse=my.makeParser()});var oY=w((eet,sY)=>{"use strict";sY.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var rv=w((tet,aY)=>{var Jp=oY(),AY={};for(let r of Object.keys(Jp))AY[Jp[r]]=r;var at={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};aY.exports=at;for(let r of Object.keys(at)){if(!("channels"in at[r]))throw new Error("missing channels property: "+r);if(!("labels"in at[r]))throw new Error("missing channel labels property: "+r);if(at[r].labels.length!==at[r].channels)throw new Error("channel and label counts mismatch: "+r);let{channels:e,labels:t}=at[r];delete at[r].channels,delete at[r].labels,Object.defineProperty(at[r],"channels",{value:e}),Object.defineProperty(at[r],"labels",{value:t})}at.rgb.hsl=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(e,t,i),s=Math.max(e,t,i),o=s-n,a,l;s===n?a=0:e===s?a=(t-i)/o:t===s?a=2+(i-e)/o:i===s&&(a=4+(e-t)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};at.rgb.hsv=function(r){let e,t,i,n,s,o=r[0]/255,a=r[1]/255,l=r[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),t=g(a),i=g(l),o===c?n=i-t:a===c?n=1/3+e-i:l===c&&(n=2/3+t-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};at.rgb.hwb=function(r){let e=r[0],t=r[1],i=r[2],n=at.rgb.hsl(r)[0],s=1/255*Math.min(e,Math.min(t,i));return i=1-1/255*Math.max(e,Math.max(t,i)),[n,s*100,i*100]};at.rgb.cmyk=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(1-e,1-t,1-i),s=(1-e-n)/(1-n)||0,o=(1-t-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function jye(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}at.rgb.keyword=function(r){let e=AY[r];if(e)return e;let t=Infinity,i;for(let n of Object.keys(Jp)){let s=Jp[n],o=jye(r,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+t*.3576+i*.1805,s=e*.2126+t*.7152+i*.0722,o=e*.0193+t*.1192+i*.9505;return[n*100,s*100,o*100]};at.rgb.lab=function(r){let e=at.rgb.xyz(r),t=e[0],i=e[1],n=e[2];t/=95.047,i/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(t-i),a=200*(i-n);return[s,o,a]};at.hsl.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n,s,o;if(t===0)return o=i*255,[o,o,o];i<.5?n=i*(1+t):n=i+t-i*t;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};at.hsl.hsv=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=t,s=Math.max(i,.01);i*=2,t*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+t)/2,a=i===0?2*n/(s+n):2*t/(i+t);return[e,a*100,o*100]};at.hsv.rgb=function(r){let e=r[0]/60,t=r[1]/100,i=r[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-t),a=255*i*(1-t*s),l=255*i*(1-t*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};at.hsv.hsl=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=Math.max(i,.01),s,o;o=(2-t)*i;let a=(2-t)*n;return s=t*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};at.hwb.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n=t+i,s;n>1&&(t/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=t+s*(a-t),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=t;break;case 1:c=l,u=a,g=t;break;case 2:c=t,u=a,g=l;break;case 3:c=t,u=l,g=a;break;case 4:c=l,u=t,g=a;break;case 5:c=a,u=t,g=l;break}return[c*255,u*255,g*255]};at.cmyk.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n=r[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,t*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};at.xyz.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n,s,o;return n=e*3.2406+t*-1.5372+i*-.4986,s=e*-.9689+t*1.8758+i*.0415,o=e*.0557+t*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};at.xyz.lab=function(r){let e=r[0],t=r[1],i=r[2];e/=95.047,t/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*t-16,s=500*(e-t),o=200*(t-i);return[n,s,o]};at.lab.xyz=function(r){let e=r[0],t=r[1],i=r[2],n,s,o;s=(e+16)/116,n=t/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};at.lab.lch=function(r){let e=r[0],t=r[1],i=r[2],n;n=Math.atan2(i,t)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(t*t+i*i);return[e,o,n]};at.lch.lab=function(r){let e=r[0],t=r[1],n=r[2]/360*2*Math.PI,s=t*Math.cos(n),o=t*Math.sin(n);return[e,s,o]};at.rgb.ansi16=function(r,e=null){let[t,i,n]=r,s=e===null?at.rgb.hsv(r)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(t/255));return s===2&&(o+=60),o};at.hsv.ansi16=function(r){return at.rgb.ansi16(at.hsv.rgb(r),r[2])};at.rgb.ansi256=function(r){let e=r[0],t=r[1],i=r[2];return e===t&&t===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(i/255*5)};at.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let t=(~~(r>50)+1)*.5,i=(e&1)*t*255,n=(e>>1&1)*t*255,s=(e>>2&1)*t*255;return[i,n,s]};at.ansi256.rgb=function(r){if(r>=232){let s=(r-232)*10+8;return[s,s,s]}r-=16;let e,t=Math.floor(r/36)/5*255,i=Math.floor((e=r%36)/6)/5*255,n=e%6/5*255;return[t,i,n]};at.rgb.hex=function(r){let t=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return"000000".substring(t.length)+t};at.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let t=e[0];e[0].length===3&&(t=t.split("").map(a=>a+a).join(""));let i=parseInt(t,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};at.rgb.hcg=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.max(Math.max(e,t),i),s=Math.min(Math.min(e,t),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(t-i)/o%6:n===t?l=2+(i-e)/o:l=4+(e-t)/o,l/=6,l%=1,[l*360,o*100,a*100]};at.hsl.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=t<.5?2*e*t:2*e*(1-t),n=0;return i<1&&(n=(t-.5*i)/(1-i)),[r[0],i*100,n*100]};at.hsv.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=e*t,n=0;return i<1&&(n=(t-i)/(1-i)),[r[0],i*100,n*100]};at.hcg.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100;if(t===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-t)*i,[(t*n[0]+l)*255,(t*n[1]+l)*255,(t*n[2]+l)*255]};at.hcg.hsv=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e),n=0;return i>0&&(n=e/i),[r[0],n*100,i*100]};at.hcg.hsl=function(r){let e=r[1]/100,i=r[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[r[0],n*100,i*100]};at.hcg.hwb=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e);return[r[0],(i-e)*100,(1-i)*100]};at.hwb.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=1-t,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[r[0],n*100,s*100]};at.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]};at.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]};at.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]};at.gray.hsl=function(r){return[0,0,r[0]]};at.gray.hsv=at.gray.hsl;at.gray.hwb=function(r){return[0,100,r[0]]};at.gray.cmyk=function(r){return[0,0,0,r[0]]};at.gray.lab=function(r){return[r[0],0,0]};at.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};at.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var cY=w((ret,lY)=>{var Ey=rv();function Gye(){let r={},e=Object.keys(Ey);for(let t=e.length,i=0;i{var iv=rv(),Wye=cY(),vg={},zye=Object.keys(iv);function _ye(r){let e=function(...t){let i=t[0];return i==null?i:(i.length>1&&(t=i),r(t))};return"conversion"in r&&(e.conversion=r.conversion),e}function Vye(r){let e=function(...t){let i=t[0];if(i==null)return i;i.length>1&&(t=i);let n=r(t);if(typeof n=="object")for(let s=n.length,o=0;o{vg[r]={},Object.defineProperty(vg[r],"channels",{value:iv[r].channels}),Object.defineProperty(vg[r],"labels",{value:iv[r].labels});let e=Wye(r);Object.keys(e).forEach(i=>{let n=e[i];vg[r][i]=Vye(n),vg[r][i].raw=_ye(n)})});uY.exports=vg});var mY=w((net,fY)=>{"use strict";var hY=(r,e)=>(...t)=>`[${r(...t)+e}m`,pY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};5;${i}m`},dY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},Iy=r=>r,CY=(r,e,t)=>[r,e,t],xg=(r,e,t)=>{Object.defineProperty(r,e,{get:()=>{let i=t();return Object.defineProperty(r,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},nv,kg=(r,e,t,i)=>{nv===void 0&&(nv=gY());let n=i?10:0,s={};for(let[o,a]of Object.entries(nv)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=r(t,n):typeof a=="object"&&(s[l]=r(a[e],n))}return s};function Xye(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[t,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],r.set(s[0],s[1]);Object.defineProperty(e,t,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:r,enumerable:!1}),e.color.close="",e.bgColor.close="",xg(e.color,"ansi",()=>kg(hY,"ansi16",Iy,!1)),xg(e.color,"ansi256",()=>kg(pY,"ansi256",Iy,!1)),xg(e.color,"ansi16m",()=>kg(dY,"rgb",CY,!1)),xg(e.bgColor,"ansi",()=>kg(hY,"ansi16",Iy,!0)),xg(e.bgColor,"ansi256",()=>kg(pY,"ansi256",Iy,!0)),xg(e.bgColor,"ansi16m",()=>kg(dY,"rgb",CY,!0)),e}Object.defineProperty(fY,"exports",{enumerable:!0,get:Xye})});var IY=w((set,EY)=>{"use strict";EY.exports=(r,e=process.argv)=>{let t=r.startsWith("-")?"":r.length===1?"-":"--",i=e.indexOf(t+r),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var Zye=require("os"),wY=require("tty"),Ps=IY(),{env:gi}=process,tl;Ps("no-color")||Ps("no-colors")||Ps("color=false")||Ps("color=never")?tl=0:(Ps("color")||Ps("colors")||Ps("color=true")||Ps("color=always"))&&(tl=1);"FORCE_COLOR"in gi&&(gi.FORCE_COLOR==="true"?tl=1:gi.FORCE_COLOR==="false"?tl=0:tl=gi.FORCE_COLOR.length===0?1:Math.min(parseInt(gi.FORCE_COLOR,10),3));function sv(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function ov(r,e){if(tl===0)return 0;if(Ps("color=16m")||Ps("color=full")||Ps("color=truecolor"))return 3;if(Ps("color=256"))return 2;if(r&&!e&&tl===void 0)return 0;let t=tl||0;if(gi.TERM==="dumb")return t;if(process.platform==="win32"){let i=Zye.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in gi)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in gi)||gi.CI_NAME==="codeship"?1:t;if("TEAMCITY_VERSION"in gi)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(gi.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in gi)return 1;if(gi.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in gi){let i=parseInt((gi.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(gi.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(gi.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(gi.TERM)||"COLORTERM"in gi?1:t}function $ye(r){let e=ov(r,r&&r.isTTY);return sv(e)}yY.exports={supportsColor:$ye,stdout:sv(ov(!0,wY.isatty(1))),stderr:sv(ov(!0,wY.isatty(2)))}});var QY=w((aet,bY)=>{"use strict";var ewe=(r,e,t)=>{let i=r.indexOf(e);if(i===-1)return r;let n=e.length,s=0,o="";do o+=r.substr(s,i-s)+e+t,s=i+n,i=r.indexOf(e,s);while(i!==-1);return o+=r.substr(s),o},twe=(r,e,t,i)=>{let n=0,s="";do{let o=r[i-1]==="\r";s+=r.substr(n,(o?i-1:i)-n)+e+(o?`\r +`:` +`)+t,n=i+1,i=r.indexOf(` +`,n)}while(i!==-1);return s+=r.substr(n),s};bY.exports={stringReplaceAll:ewe,stringEncaseCRLFWithFirstIndex:twe}});var PY=w((Aet,SY)=>{"use strict";var rwe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,vY=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,iwe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,nwe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,swe=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function xY(r){let e=r[0]==="u",t=r[1]==="{";return e&&!t&&r.length===5||r[0]==="x"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&t?String.fromCodePoint(parseInt(r.slice(2,-1),16)):swe.get(r)||r}function owe(r,e){let t=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))t.push(o);else if(n=s.match(iwe))t.push(n[2].replace(nwe,(a,l,c)=>l?xY(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${r}')`)}return t}function awe(r){vY.lastIndex=0;let e=[],t;for(;(t=vY.exec(r))!==null;){let i=t[1];if(t[2]){let n=owe(i,t[2]);e.push([i].concat(n))}else e.push([i])}return e}function kY(r,e){let t={};for(let n of e)for(let s of n.styles)t[s[0]]=n.inverse?null:s.slice(1);let i=r;for(let[n,s]of Object.entries(t))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}SY.exports=(r,e)=>{let t=[],i=[],n=[];if(e.replace(rwe,(s,o,a,l,c,u)=>{if(o)n.push(xY(o));else if(l){let g=n.join("");n=[],i.push(t.length===0?g:kY(r,t)(g)),t.push({inverse:a,styles:awe(l)})}else if(c){if(t.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(kY(r,t)(n.join(""))),n=[],t.pop()}else n.push(u)}),i.push(n.join("")),t.length>0){let s=`Chalk template literal is missing ${t.length} closing bracket${t.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var uv=w((cet,DY)=>{"use strict";var Wp=mY(),{stdout:av,stderr:Av}=BY(),{stringReplaceAll:Awe,stringEncaseCRLFWithFirstIndex:lwe}=QY(),RY=["ansi","ansi","ansi256","ansi16m"],Pg=Object.create(null),cwe=(r,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let t=av?av.level:0;r.level=e.level===void 0?t:e.level},FY=class{constructor(e){return NY(e)}},NY=r=>{let e={};return cwe(e,r),e.template=(...t)=>uwe(e.template,...t),Object.setPrototypeOf(e,yy.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=FY,e.template};function yy(r){return NY(r)}for(let[r,e]of Object.entries(Wp))Pg[r]={get(){let t=wy(this,lv(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:t}),t}};Pg.visible={get(){let r=wy(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:r}),r}};var LY=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let r of LY)Pg[r]={get(){let{level:e}=this;return function(...t){let i=lv(Wp.color[RY[e]][r](...t),Wp.color.close,this._styler);return wy(this,i,this._isEmpty)}}};for(let r of LY){let e="bg"+r[0].toUpperCase()+r.slice(1);Pg[e]={get(){let{level:t}=this;return function(...i){let n=lv(Wp.bgColor[RY[t]][r](...i),Wp.bgColor.close,this._styler);return wy(this,n,this._isEmpty)}}}}var gwe=Object.defineProperties(()=>{},te(N({},Pg),{level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}})),lv=(r,e,t)=>{let i,n;return t===void 0?(i=r,n=e):(i=t.openAll+r,n=e+t.closeAll),{open:r,close:e,openAll:i,closeAll:n,parent:t}},wy=(r,e,t)=>{let i=(...n)=>fwe(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=gwe,i._generator=r,i._styler=e,i._isEmpty=t,i},fwe=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?"":e;let t=r._styler;if(t===void 0)return e;let{openAll:i,closeAll:n}=t;if(e.indexOf("")!==-1)for(;t!==void 0;)e=Awe(e,t.close,t.open),t=t.parent;let s=e.indexOf(` +`);return s!==-1&&(e=lwe(e,n,i,s)),i+e+n},cv,uwe=(r,...e)=>{let[t]=e;if(!Array.isArray(t))return e.join(" ");let i=e.slice(1),n=[t.raw[0]];for(let s=1;s{"use strict";Ds.isInteger=r=>typeof r=="number"?Number.isInteger(r):typeof r=="string"&&r.trim()!==""?Number.isInteger(Number(r)):!1;Ds.find=(r,e)=>r.nodes.find(t=>t.type===e);Ds.exceedsLimit=(r,e,t=1,i)=>i===!1||!Ds.isInteger(r)||!Ds.isInteger(e)?!1:(Number(e)-Number(r))/Number(t)>=i;Ds.escapeNode=(r,e=0,t)=>{let i=r.nodes[e];!i||(t&&i.type===t||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};Ds.encloseBrace=r=>r.type!=="brace"?!1:r.commas>>0+r.ranges>>0==0?(r.invalid=!0,!0):!1;Ds.isInvalidBrace=r=>r.type!=="brace"?!1:r.invalid===!0||r.dollar?!0:r.commas>>0+r.ranges>>0==0||r.open!==!0||r.close!==!0?(r.invalid=!0,!0):!1;Ds.isOpenOrClose=r=>r.type==="open"||r.type==="close"?!0:r.open===!0||r.close===!0;Ds.reduce=r=>r.reduce((e,t)=>(t.type==="text"&&e.push(t.value),t.type==="range"&&(t.type="text"),e),[]);Ds.flatten=(...r)=>{let e=[],t=i=>{for(let n=0;n{"use strict";var OY=By();TY.exports=(r,e={})=>{let t=(i,n={})=>{let s=e.escapeInvalid&&OY.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&OY.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=t(l);return a};return t(r)}});var KY=w((fet,MY)=>{"use strict";MY.exports=function(r){return typeof r=="number"?r-r==0:typeof r=="string"&&r.trim()!==""?Number.isFinite?Number.isFinite(+r):isFinite(+r):!1}});var zY=w((het,UY)=>{"use strict";var HY=KY(),Rc=(r,e,t)=>{if(HY(r)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||r===e)return String(r);if(HY(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=N({relaxZeros:!0},t);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=r+":"+e+"="+n+s+o+a;if(Rc.cache.hasOwnProperty(l))return Rc.cache[l].result;let c=Math.min(r,e),u=Math.max(r,e);if(Math.abs(c-u)===1){let m=r+"|"+e;return i.capture?`(${m})`:i.wrap===!1?m:`(?:${m})`}let g=GY(r)||GY(e),f={min:r,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let m=u<0?Math.abs(u):1;p=jY(m,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=jY(c,u,f,i)),f.negatives=p,f.positives=h,f.result=hwe(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Rc.cache[l]=f,f.result};function hwe(r,e,t){let i=gv(r,e,"-",!1,t)||[],n=gv(e,r,"",!1,t)||[],s=gv(r,e,"-?",!0,t)||[];return i.concat(s).concat(n).join("|")}function dwe(r,e){let t=1,i=1,n=YY(r,t),s=new Set([e]);for(;r<=n&&n<=e;)s.add(n),t+=1,n=YY(r,t);for(n=qY(e+1,i)-1;r1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+JY(a.count),o=c+1;continue}t.isPadded&&(g=Iwe(c,t,i)),u.string=g+u.pattern+JY(u.count),s.push(u),o=c+1,a=u}return s}function gv(r,e,t,i,n){let s=[];for(let o of r){let{string:a}=o;!i&&!WY(e,"string",a)&&s.push(t+a),i&&WY(e,"string",a)&&s.push(t+a)}return s}function Cwe(r,e){let t=[];for(let i=0;ie?1:e>r?-1:0}function WY(r,e,t){return r.some(i=>i[e]===t)}function YY(r,e){return Number(String(r).slice(0,-e)+"9".repeat(e))}function qY(r,e){return r-r%Math.pow(10,e)}function JY(r){let[e=0,t=""]=r;return t||e>1?`{${e+(t?","+t:"")}}`:""}function mwe(r,e,t){return`[${r}${e-r==1?"":"-"}${e}]`}function GY(r){return/^-?(0+)\d/.test(r)}function Iwe(r,e,t){if(!e.isPadded)return r;let i=Math.abs(e.maxLen-String(r).length),n=t.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}Rc.cache={};Rc.clearCache=()=>Rc.cache={};UY.exports=Rc});var pv=w((pet,_Y)=>{"use strict";var ywe=require("util"),VY=zY(),XY=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),wwe=r=>e=>r===!0?Number(e):String(e),fv=r=>typeof r=="number"||typeof r=="string"&&r!=="",_p=r=>Number.isInteger(+r),hv=r=>{let e=`${r}`,t=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++t]==="0";);return t>0},Bwe=(r,e,t)=>typeof r=="string"||typeof e=="string"?!0:t.stringify===!0,bwe=(r,e,t)=>{if(e>0){let i=r[0]==="-"?"-":"";i&&(r=r.slice(1)),r=i+r.padStart(i?e-1:e,"0")}return t===!1?String(r):r},ZY=(r,e)=>{let t=r[0]==="-"?"-":"";for(t&&(r=r.slice(1),e--);r.length{r.negatives.sort((o,a)=>oa?1:0),r.positives.sort((o,a)=>oa?1:0);let t=e.capture?"":"?:",i="",n="",s;return r.positives.length&&(i=r.positives.join("|")),r.negatives.length&&(n=`-(${t}${r.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${t}${s})`:s},$Y=(r,e,t,i)=>{if(t)return VY(r,e,N({wrap:!1},i));let n=String.fromCharCode(r);if(r===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},eq=(r,e,t)=>{if(Array.isArray(r)){let i=t.wrap===!0,n=t.capture?"":"?:";return i?`(${n}${r.join("|")})`:r.join("|")}return VY(r,e,t)},tq=(...r)=>new RangeError("Invalid range arguments: "+ywe.inspect(...r)),rq=(r,e,t)=>{if(t.strictRanges===!0)throw tq([r,e]);return[]},Swe=(r,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${r}" to be a number`);return[]},vwe=(r,e,t=1,i={})=>{let n=Number(r),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw tq([r,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(r),l=String(e),c=String(t);t=Math.max(Math.abs(t),1);let u=hv(a)||hv(l)||hv(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Bwe(r,e,i)===!1,h=i.transform||wwe(f);if(i.toRegex&&t===1)return $Y(ZY(r,g),ZY(e,g),!0,i);let p={negatives:[],positives:[]},m=v=>p[v<0?"negatives":"positives"].push(Math.abs(v)),y=[],b=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&t>1?m(n):y.push(bwe(h(n,b),g,f)),n=o?n-t:n+t,b++;return i.toRegex===!0?t>1?Qwe(p,i):eq(y,null,N({wrap:!1},i)):y},xwe=(r,e,t=1,i={})=>{if(!_p(r)&&r.length>1||!_p(e)&&e.length>1)return rq(r,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${r}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&t===1)return $Y(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-t:s+t,g++;return i.toRegex===!0?eq(u,null,{wrap:!1,options:i}):u},Qy=(r,e,t,i={})=>{if(e==null&&fv(r))return[r];if(!fv(r)||!fv(e))return rq(r,e,i);if(typeof t=="function")return Qy(r,e,1,{transform:t});if(XY(t))return Qy(r,e,0,t);let n=N({},i);return n.capture===!0&&(n.wrap=!0),t=t||n.step||1,_p(t)?_p(r)&&_p(e)?vwe(r,e,t,n):xwe(r,e,Math.max(Math.abs(t),1),n):t!=null&&!XY(t)?Swe(t,n):Qy(r,e,1,t)};_Y.exports=Qy});var sq=w((det,iq)=>{"use strict";var kwe=pv(),nq=By(),Pwe=(r,e={})=>{let t=(i,n={})=>{let s=nq.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=nq.reduce(i.nodes),g=kwe(...u,te(N({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=t(u,i);return c};return t(r)};iq.exports=Pwe});var Aq=w((Cet,oq)=>{"use strict";var Dwe=pv(),aq=by(),Dg=By(),Fc=(r="",e="",t=!1)=>{let i=[];if(r=[].concat(r),e=[].concat(e),!e.length)return r;if(!r.length)return t?Dg.flatten(e).map(n=>`{${n}}`):e;for(let n of r)if(Array.isArray(n))for(let s of n)i.push(Fc(s,e,t));else for(let s of e)t===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?Fc(n,s,t):n+s);return Dg.flatten(i)},Rwe=(r,e={})=>{let t=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(Fc(a.pop(),aq(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(Fc(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=Dg.reduce(n.nodes);if(Dg.exceedsLimit(...g,e.step,t))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=Dwe(...g,e);f.length===0&&(f=aq(n,e)),a.push(Fc(a.pop(),f)),n.nodes=[];return}let l=Dg.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";lq.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` +`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var pq=w((Eet,uq)=>{"use strict";var Fwe=by(),{MAX_LENGTH:gq,CHAR_BACKSLASH:dv,CHAR_BACKTICK:Nwe,CHAR_COMMA:Lwe,CHAR_DOT:Twe,CHAR_LEFT_PARENTHESES:Owe,CHAR_RIGHT_PARENTHESES:Mwe,CHAR_LEFT_CURLY_BRACE:Kwe,CHAR_RIGHT_CURLY_BRACE:Uwe,CHAR_LEFT_SQUARE_BRACKET:fq,CHAR_RIGHT_SQUARE_BRACKET:hq,CHAR_DOUBLE_QUOTE:Hwe,CHAR_SINGLE_QUOTE:jwe,CHAR_NO_BREAK_SPACE:Gwe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Ywe}=cq(),qwe=(r,e={})=>{if(typeof r!="string")throw new TypeError("Expected a string");let t=e||{},i=typeof t.maxLength=="number"?Math.min(gq,t.maxLength):gq;if(r.length>i)throw new SyntaxError(`Input length (${r.length}), exceeds max characters (${i})`);let n={type:"root",input:r,nodes:[]},s=[n],o=n,a=n,l=0,c=r.length,u=0,g=0,f,h={},p=()=>r[u++],m=y=>{if(y.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&y.type==="text"){a.value+=y.value;return}return o.nodes.push(y),y.parent=o,y.prev=a,a=y,y};for(m({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:"text",value:Fwe(o)}]}m({type:"comma",value:f}),o.commas++;continue}if(f===Twe&&g>0&&o.commas===0){let y=o.nodes;if(g===0||y.length===0){m({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){y.pop();let b=y[y.length-1];b.value+=a.value+f,a=b,o.ranges--;continue}m({type:"dot",value:f});continue}m({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(v=>{v.nodes||(v.type==="open"&&(v.isOpen=!0),v.type==="close"&&(v.isClose=!0),v.nodes||(v.type="text"),v.invalid=!0)});let y=s[s.length-1],b=y.nodes.indexOf(o);y.nodes.splice(b,1,...o.nodes)}while(s.length>0);return m({type:"eos"}),n};uq.exports=qwe});var mq=w((Iet,dq)=>{"use strict";var Cq=by(),Jwe=sq(),Wwe=Aq(),zwe=pq(),ts=(r,e={})=>{let t=[];if(Array.isArray(r))for(let i of r){let n=ts.create(i,e);Array.isArray(n)?t.push(...n):t.push(n)}else t=[].concat(ts.create(r,e));return e&&e.expand===!0&&e.nodupes===!0&&(t=[...new Set(t)]),t};ts.parse=(r,e={})=>zwe(r,e);ts.stringify=(r,e={})=>typeof r=="string"?Cq(ts.parse(r,e),e):Cq(r,e);ts.compile=(r,e={})=>(typeof r=="string"&&(r=ts.parse(r,e)),Jwe(r,e));ts.expand=(r,e={})=>{typeof r=="string"&&(r=ts.parse(r,e));let t=Wwe(r,e);return e.noempty===!0&&(t=t.filter(Boolean)),e.nodupes===!0&&(t=[...new Set(t)]),t};ts.create=(r,e={})=>r===""||r.length<3?[r]:e.expand!==!0?ts.compile(r,e):ts.expand(r,e);dq.exports=ts});var Vp=w((yet,Eq)=>{"use strict";var _we=require("path"),Jo="\\\\/",Iq=`[^${Jo}]`,za="\\.",Vwe="\\+",Xwe="\\?",Sy="\\/",Zwe="(?=.)",yq="[^/]",Cv=`(?:${Sy}|$)`,wq=`(?:^|${Sy})`,mv=`${za}{1,2}${Cv}`,$we=`(?!${za})`,eBe=`(?!${wq}${mv})`,tBe=`(?!${za}{0,1}${Cv})`,rBe=`(?!${mv})`,iBe=`[^.${Sy}]`,nBe=`${yq}*?`,Bq={DOT_LITERAL:za,PLUS_LITERAL:Vwe,QMARK_LITERAL:Xwe,SLASH_LITERAL:Sy,ONE_CHAR:Zwe,QMARK:yq,END_ANCHOR:Cv,DOTS_SLASH:mv,NO_DOT:$we,NO_DOTS:eBe,NO_DOT_SLASH:tBe,NO_DOTS_SLASH:rBe,QMARK_NO_DOT:iBe,STAR:nBe,START_ANCHOR:wq},sBe=te(N({},Bq),{SLASH_LITERAL:`[${Jo}]`,QMARK:Iq,STAR:`${Iq}*?`,DOTS_SLASH:`${za}{1,2}(?:[${Jo}]|$)`,NO_DOT:`(?!${za})`,NO_DOTS:`(?!(?:^|[${Jo}])${za}{1,2}(?:[${Jo}]|$))`,NO_DOT_SLASH:`(?!${za}{0,1}(?:[${Jo}]|$))`,NO_DOTS_SLASH:`(?!${za}{1,2}(?:[${Jo}]|$))`,QMARK_NO_DOT:`[^.${Jo}]`,START_ANCHOR:`(?:^|[${Jo}])`,END_ANCHOR:`(?:[${Jo}]|$)`}),oBe={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};Eq.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:oBe,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:_we.sep,extglobChars(r){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${r.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(r){return r===!0?sBe:Bq}}});var Xp=w(xn=>{"use strict";var aBe=require("path"),ABe=process.platform==="win32",{REGEX_BACKSLASH:lBe,REGEX_REMOVE_BACKSLASH:cBe,REGEX_SPECIAL_CHARS:uBe,REGEX_SPECIAL_CHARS_GLOBAL:gBe}=Vp();xn.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);xn.hasRegexChars=r=>uBe.test(r);xn.isRegexChar=r=>r.length===1&&xn.hasRegexChars(r);xn.escapeRegex=r=>r.replace(gBe,"\\$1");xn.toPosixSlashes=r=>r.replace(lBe,"/");xn.removeBackslashes=r=>r.replace(cBe,e=>e==="\\"?"":e);xn.supportsLookbehinds=()=>{let r=process.version.slice(1).split(".").map(Number);return r.length===3&&r[0]>=9||r[0]===8&&r[1]>=10};xn.isWindows=r=>r&&typeof r.windows=="boolean"?r.windows:ABe===!0||aBe.sep==="\\";xn.escapeLast=(r,e,t)=>{let i=r.lastIndexOf(e,t);return i===-1?r:r[i-1]==="\\"?xn.escapeLast(r,e,i-1):`${r.slice(0,i)}\\${r.slice(i)}`};xn.removePrefix=(r,e={})=>{let t=r;return t.startsWith("./")&&(t=t.slice(2),e.prefix="./"),t};xn.wrapOutput=(r,e={},t={})=>{let i=t.contains?"":"^",n=t.contains?"":"$",s=`${i}(?:${r})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var Dq=w((Bet,bq)=>{"use strict";var Qq=Xp(),{CHAR_ASTERISK:Ev,CHAR_AT:fBe,CHAR_BACKWARD_SLASH:Zp,CHAR_COMMA:hBe,CHAR_DOT:Iv,CHAR_EXCLAMATION_MARK:yv,CHAR_FORWARD_SLASH:Sq,CHAR_LEFT_CURLY_BRACE:wv,CHAR_LEFT_PARENTHESES:Bv,CHAR_LEFT_SQUARE_BRACKET:pBe,CHAR_PLUS:dBe,CHAR_QUESTION_MARK:vq,CHAR_RIGHT_CURLY_BRACE:CBe,CHAR_RIGHT_PARENTHESES:xq,CHAR_RIGHT_SQUARE_BRACKET:mBe}=Vp(),kq=r=>r===Sq||r===Zp,Pq=r=>{r.isPrefix!==!0&&(r.depth=r.isGlobstar?Infinity:1)},EBe=(r,e)=>{let t=e||{},i=r.length-1,n=t.parts===!0||t.scanToEnd===!0,s=[],o=[],a=[],l=r,c=-1,u=0,g=0,f=!1,h=!1,p=!1,m=!1,y=!1,b=!1,v=!1,x=!1,T=!1,q=!1,Y=0,$,_,ne={value:"",depth:0,isGlob:!1},ee=()=>c>=i,A=()=>l.charCodeAt(c+1),oe=()=>($=_,l.charCodeAt(++c));for(;c0&&(Z=l.slice(0,u),l=l.slice(u),g-=u),ce&&p===!0&&g>0?(ce=l.slice(0,g),O=l.slice(g)):p===!0?(ce="",O=l):ce=l,ce&&ce!==""&&ce!=="/"&&ce!==l&&kq(ce.charCodeAt(ce.length-1))&&(ce=ce.slice(0,-1)),t.unescape===!0&&(O&&(O=Qq.removeBackslashes(O)),ce&&v===!0&&(ce=Qq.removeBackslashes(ce)));let L={prefix:Z,input:r,start:u,base:ce,glob:O,isBrace:f,isBracket:h,isGlob:p,isExtglob:m,isGlobstar:y,negated:x,negatedExtglob:T};if(t.tokens===!0&&(L.maxDepth=0,kq(_)||o.push(ne),L.tokens=o),t.parts===!0||t.tokens===!0){let de;for(let Be=0;Be{"use strict";var vy=Vp(),rs=Xp(),{MAX_LENGTH:xy,POSIX_REGEX_SOURCE:IBe,REGEX_NON_SPECIAL_CHARS:yBe,REGEX_SPECIAL_CHARS_BACKREF:wBe,REPLACEMENTS:Fq}=vy,BBe=(r,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...r,e);r.sort();let t=`[${r.join("-")}]`;try{new RegExp(t)}catch(i){return r.map(n=>rs.escapeRegex(n)).join("..")}return t},Rg=(r,e)=>`Missing ${r}: "${e}" - use "\\\\${e}" to match literal characters`,Nq=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");r=Fq[r]||r;let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:t.prepend||""},o=[s],a=t.capture?"":"?:",l=rs.isWindows(e),c=vy.globChars(l),u=vy.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:m,NO_DOT:y,NO_DOT_SLASH:b,NO_DOTS_SLASH:v,QMARK:x,QMARK_NO_DOT:T,STAR:q,START_ANCHOR:Y}=c,$=V=>`(${a}(?:(?!${Y}${V.dot?m:g}).)*?)`,_=t.dot?"":y,ne=t.dot?x:T,ee=t.bash===!0?$(t):q;t.capture&&(ee=`(${ee})`),typeof t.noext=="boolean"&&(t.noextglob=t.noext);let A={input:r,index:-1,start:0,dot:t.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};r=rs.removePrefix(r,A),n=r.length;let oe=[],ce=[],Z=[],O=s,L,de=()=>A.index===n-1,Be=A.peek=(V=1)=>r[A.index+V],je=A.advance=()=>r[++A.index]||"",re=()=>r.slice(A.index+1),se=(V="",Qe=0)=>{A.consumed+=V,A.index+=Qe},be=V=>{A.output+=V.output!=null?V.output:V.value,se(V.value)},he=()=>{let V=1;for(;Be()==="!"&&(Be(2)!=="("||Be(3)==="?");)je(),A.start++,V++;return V%2==0?!1:(A.negated=!0,A.start++,!0)},Fe=V=>{A[V]++,Z.push(V)},Ke=V=>{A[V]--,Z.pop()},ke=V=>{if(O.type==="globstar"){let Qe=A.braces>0&&(V.type==="comma"||V.type==="brace"),le=V.extglob===!0||oe.length&&(V.type==="pipe"||V.type==="paren");V.type!=="slash"&&V.type!=="paren"&&!Qe&&!le&&(A.output=A.output.slice(0,-O.output.length),O.type="star",O.value="*",O.output=ee,A.output+=O.output)}if(oe.length&&V.type!=="paren"&&(oe[oe.length-1].inner+=V.value),(V.value||V.output)&&be(V),O&&O.type==="text"&&V.type==="text"){O.value+=V.value,O.output=(O.output||"")+V.value;return}V.prev=O,o.push(V),O=V},ve=(V,Qe)=>{let le=te(N({},u[Qe]),{conditions:1,inner:""});le.prev=O,le.parens=A.parens,le.output=A.output;let fe=(t.capture?"(":"")+le.open;Fe("parens"),ke({type:V,value:Qe,output:A.output?"":p}),ke({type:"paren",extglob:!0,value:je(),output:fe}),oe.push(le)},pe=V=>{let Qe=V.close+(t.capture?")":""),le;if(V.type==="negate"){let fe=ee;V.inner&&V.inner.length>1&&V.inner.includes("/")&&(fe=$(t)),(fe!==ee||de()||/^\)+$/.test(re()))&&(Qe=V.close=`)$))${fe}`),V.inner.includes("*")&&(le=re())&&/^\.[^\\/.]+$/.test(le)&&(Qe=V.close=`)${le})${fe})`),V.prev.type==="bos"&&(A.negatedExtglob=!0)}ke({type:"paren",extglob:!0,value:L,output:Qe}),Ke("parens")};if(t.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(r)){let V=!1,Qe=r.replace(wBe,(le,fe,gt,Ht,Mt,Ei)=>Ht==="\\"?(V=!0,le):Ht==="?"?fe?fe+Ht+(Mt?x.repeat(Mt.length):""):Ei===0?ne+(Mt?x.repeat(Mt.length):""):x.repeat(gt.length):Ht==="."?g.repeat(gt.length):Ht==="*"?fe?fe+Ht+(Mt?ee:""):ee:fe?le:`\\${le}`);return V===!0&&(t.unescape===!0?Qe=Qe.replace(/\\/g,""):Qe=Qe.replace(/\\+/g,le=>le.length%2==0?"\\\\":le?"\\":"")),Qe===r&&t.contains===!0?(A.output=r,A):(A.output=rs.wrapOutput(Qe,A,e),A)}for(;!de();){if(L=je(),L==="\0")continue;if(L==="\\"){let le=Be();if(le==="/"&&t.bash!==!0||le==="."||le===";")continue;if(!le){L+="\\",ke({type:"text",value:L});continue}let fe=/^\\+/.exec(re()),gt=0;if(fe&&fe[0].length>2&&(gt=fe[0].length,A.index+=gt,gt%2!=0&&(L+="\\")),t.unescape===!0?L=je():L+=je(),A.brackets===0){ke({type:"text",value:L});continue}}if(A.brackets>0&&(L!=="]"||O.value==="["||O.value==="[^")){if(t.posix!==!1&&L===":"){let le=O.value.slice(1);if(le.includes("[")&&(O.posix=!0,le.includes(":"))){let fe=O.value.lastIndexOf("["),gt=O.value.slice(0,fe),Ht=O.value.slice(fe+2),Mt=IBe[Ht];if(Mt){O.value=gt+Mt,A.backtrack=!0,je(),!s.output&&o.indexOf(O)===1&&(s.output=p);continue}}}(L==="["&&Be()!==":"||L==="-"&&Be()==="]")&&(L=`\\${L}`),L==="]"&&(O.value==="["||O.value==="[^")&&(L=`\\${L}`),t.posix===!0&&L==="!"&&O.value==="["&&(L="^"),O.value+=L,be({value:L});continue}if(A.quotes===1&&L!=='"'){L=rs.escapeRegex(L),O.value+=L,be({value:L});continue}if(L==='"'){A.quotes=A.quotes===1?0:1,t.keepQuotes===!0&&ke({type:"text",value:L});continue}if(L==="("){Fe("parens"),ke({type:"paren",value:L});continue}if(L===")"){if(A.parens===0&&t.strictBrackets===!0)throw new SyntaxError(Rg("opening","("));let le=oe[oe.length-1];if(le&&A.parens===le.parens+1){pe(oe.pop());continue}ke({type:"paren",value:L,output:A.parens?")":"\\)"}),Ke("parens");continue}if(L==="["){if(t.nobracket===!0||!re().includes("]")){if(t.nobracket!==!0&&t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));L=`\\${L}`}else Fe("brackets");ke({type:"bracket",value:L});continue}if(L==="]"){if(t.nobracket===!0||O&&O.type==="bracket"&&O.value.length===1){ke({type:"text",value:L,output:`\\${L}`});continue}if(A.brackets===0){if(t.strictBrackets===!0)throw new SyntaxError(Rg("opening","["));ke({type:"text",value:L,output:`\\${L}`});continue}Ke("brackets");let le=O.value.slice(1);if(O.posix!==!0&&le[0]==="^"&&!le.includes("/")&&(L=`/${L}`),O.value+=L,be({value:L}),t.literalBrackets===!1||rs.hasRegexChars(le))continue;let fe=rs.escapeRegex(O.value);if(A.output=A.output.slice(0,-O.value.length),t.literalBrackets===!0){A.output+=fe,O.value=fe;continue}O.value=`(${a}${fe}|${O.value})`,A.output+=O.value;continue}if(L==="{"&&t.nobrace!==!0){Fe("braces");let le={type:"brace",value:L,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};ce.push(le),ke(le);continue}if(L==="}"){let le=ce[ce.length-1];if(t.nobrace===!0||!le){ke({type:"text",value:L,output:L});continue}let fe=")";if(le.dots===!0){let gt=o.slice(),Ht=[];for(let Mt=gt.length-1;Mt>=0&&(o.pop(),gt[Mt].type!=="brace");Mt--)gt[Mt].type!=="dots"&&Ht.unshift(gt[Mt].value);fe=BBe(Ht,t),A.backtrack=!0}if(le.comma!==!0&&le.dots!==!0){let gt=A.output.slice(0,le.outputIndex),Ht=A.tokens.slice(le.tokensIndex);le.value=le.output="\\{",L=fe="\\}",A.output=gt;for(let Mt of Ht)A.output+=Mt.output||Mt.value}ke({type:"brace",value:L,output:fe}),Ke("braces"),ce.pop();continue}if(L==="|"){oe.length>0&&oe[oe.length-1].conditions++,ke({type:"text",value:L});continue}if(L===","){let le=L,fe=ce[ce.length-1];fe&&Z[Z.length-1]==="braces"&&(fe.comma=!0,le="|"),ke({type:"comma",value:L,output:le});continue}if(L==="/"){if(O.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),O=s;continue}ke({type:"slash",value:L,output:h});continue}if(L==="."){if(A.braces>0&&O.type==="dot"){O.value==="."&&(O.output=g);let le=ce[ce.length-1];O.type="dots",O.output+=L,O.value+=L,le.dots=!0;continue}if(A.braces+A.parens===0&&O.type!=="bos"&&O.type!=="slash"){ke({type:"text",value:L,output:g});continue}ke({type:"dot",value:L,output:g});continue}if(L==="?"){if(!(O&&O.value==="(")&&t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("qmark",L);continue}if(O&&O.type==="paren"){let fe=Be(),gt=L;if(fe==="<"&&!rs.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(O.value==="("&&!/[!=<:]/.test(fe)||fe==="<"&&!/<([!=]|\w+>)/.test(re()))&&(gt=`\\${L}`),ke({type:"text",value:L,output:gt});continue}if(t.dot!==!0&&(O.type==="slash"||O.type==="bos")){ke({type:"qmark",value:L,output:T});continue}ke({type:"qmark",value:L,output:x});continue}if(L==="!"){if(t.noextglob!==!0&&Be()==="("&&(Be(2)!=="?"||!/[!=<:]/.test(Be(3)))){ve("negate",L);continue}if(t.nonegate!==!0&&A.index===0){he();continue}}if(L==="+"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("plus",L);continue}if(O&&O.value==="("||t.regex===!1){ke({type:"plus",value:L,output:f});continue}if(O&&(O.type==="bracket"||O.type==="paren"||O.type==="brace")||A.parens>0){ke({type:"plus",value:L});continue}ke({type:"plus",value:f});continue}if(L==="@"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ke({type:"at",extglob:!0,value:L,output:""});continue}ke({type:"text",value:L});continue}if(L!=="*"){(L==="$"||L==="^")&&(L=`\\${L}`);let le=yBe.exec(re());le&&(L+=le[0],A.index+=le[0].length),ke({type:"text",value:L});continue}if(O&&(O.type==="globstar"||O.star===!0)){O.type="star",O.star=!0,O.value+=L,O.output=ee,A.backtrack=!0,A.globstar=!0,se(L);continue}let V=re();if(t.noextglob!==!0&&/^\([^?]/.test(V)){ve("star",L);continue}if(O.type==="star"){if(t.noglobstar===!0){se(L);continue}let le=O.prev,fe=le.prev,gt=le.type==="slash"||le.type==="bos",Ht=fe&&(fe.type==="star"||fe.type==="globstar");if(t.bash===!0&&(!gt||V[0]&&V[0]!=="/")){ke({type:"star",value:L,output:""});continue}let Mt=A.braces>0&&(le.type==="comma"||le.type==="brace"),Ei=oe.length&&(le.type==="pipe"||le.type==="paren");if(!gt&&le.type!=="paren"&&!Mt&&!Ei){ke({type:"star",value:L,output:""});continue}for(;V.slice(0,3)==="/**";){let jt=r[A.index+4];if(jt&&jt!=="/")break;V=V.slice(3),se("/**",3)}if(le.type==="bos"&&de()){O.type="globstar",O.value+=L,O.output=$(t),A.output=O.output,A.globstar=!0,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&!Ht&&de()){A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=$(t)+(t.strictSlashes?")":"|$)"),O.value+=L,A.globstar=!0,A.output+=le.output+O.output,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&V[0]==="/"){let jt=V[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=`${$(t)}${h}|${h}${jt})`,O.value+=L,A.output+=le.output+O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}if(le.type==="bos"&&V[0]==="/"){O.type="globstar",O.value+=L,O.output=`(?:^|${h}|${$(t)}${h})`,A.output=O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-O.output.length),O.type="globstar",O.output=$(t),O.value+=L,A.output+=O.output,A.globstar=!0,se(L);continue}let Qe={type:"star",value:L,output:ee};if(t.bash===!0){Qe.output=".*?",(O.type==="bos"||O.type==="slash")&&(Qe.output=_+Qe.output),ke(Qe);continue}if(O&&(O.type==="bracket"||O.type==="paren")&&t.regex===!0){Qe.output=L,ke(Qe);continue}(A.index===A.start||O.type==="slash"||O.type==="dot")&&(O.type==="dot"?(A.output+=b,O.output+=b):t.dot===!0?(A.output+=v,O.output+=v):(A.output+=_,O.output+=_),Be()!=="*"&&(A.output+=p,O.output+=p)),ke(Qe)}for(;A.brackets>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));A.output=rs.escapeLast(A.output,"["),Ke("brackets")}for(;A.parens>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing",")"));A.output=rs.escapeLast(A.output,"("),Ke("parens")}for(;A.braces>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","}"));A.output=rs.escapeLast(A.output,"{"),Ke("braces")}if(t.strictSlashes!==!0&&(O.type==="star"||O.type==="bracket")&&ke({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let V of A.tokens)A.output+=V.output!=null?V.output:V.value,V.suffix&&(A.output+=V.suffix)}return A};Nq.fastpaths=(r,e)=>{let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);r=Fq[r]||r;let s=rs.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=vy.globChars(s),m=t.dot?g:u,y=t.dot?f:u,b=t.capture?"":"?:",v={negated:!1,prefix:""},x=t.bash===!0?".*?":h;t.capture&&(x=`(${x})`);let T=_=>_.noglobstar===!0?x:`(${b}(?:(?!${p}${_.dot?c:o}).)*?)`,q=_=>{switch(_){case"*":return`${m}${l}${x}`;case".*":return`${o}${l}${x}`;case"*.*":return`${m}${x}${o}${l}${x}`;case"*/*":return`${m}${x}${a}${l}${y}${x}`;case"**":return m+T(t);case"**/*":return`(?:${m}${T(t)}${a})?${y}${l}${x}`;case"**/*.*":return`(?:${m}${T(t)}${a})?${y}${x}${o}${l}${x}`;case"**/.*":return`(?:${m}${T(t)}${a})?${o}${l}${x}`;default:{let ne=/^(.*?)\.(\w+)$/.exec(_);if(!ne)return;let ee=q(ne[1]);return ee?ee+o+ne[2]:void 0}}},Y=rs.removePrefix(r,v),$=q(Y);return $&&t.strictSlashes!==!0&&($+=`${a}?`),$};Rq.exports=Nq});var Oq=w((Qet,Tq)=>{"use strict";var bBe=require("path"),QBe=Dq(),bv=Lq(),Qv=Xp(),SBe=Vp(),vBe=r=>r&&typeof r=="object"&&!Array.isArray(r),_r=(r,e,t=!1)=>{if(Array.isArray(r)){let u=r.map(f=>_r(f,e,t));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=vBe(r)&&r.tokens&&r.input;if(r===""||typeof r!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=Qv.isWindows(e),o=i?_r.compileRe(r,e):_r.makeRe(r,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=te(N({},e),{ignore:null,onMatch:null,onResult:null});l=_r(n.ignore,u,t)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=_r.test(u,o,e,{glob:r,posix:s}),m={glob:r,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(m),f===!1?(m.isMatch=!1,g?m:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(m),m.isMatch=!1,g?m:!1):(typeof n.onMatch=="function"&&n.onMatch(m),g?m:!0)};return t&&(c.state=a),c};_r.test=(r,e,t,{glob:i,posix:n}={})=>{if(typeof r!="string")throw new TypeError("Expected input to be a string");if(r==="")return{isMatch:!1,output:""};let s=t||{},o=s.format||(n?Qv.toPosixSlashes:null),a=r===i,l=a&&o?o(r):r;return a===!1&&(l=o?o(r):r,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=_r.matchBase(r,e,t,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};_r.matchBase=(r,e,t,i=Qv.isWindows(t))=>(e instanceof RegExp?e:_r.makeRe(e,t)).test(bBe.basename(r));_r.isMatch=(r,e,t)=>_r(e,t)(r);_r.parse=(r,e)=>Array.isArray(r)?r.map(t=>_r.parse(t,e)):bv(r,te(N({},e),{fastpaths:!1}));_r.scan=(r,e)=>QBe(r,e);_r.compileRe=(r,e,t=!1,i=!1)=>{if(t===!0)return r.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${r.output})${o}`;r&&r.negated===!0&&(a=`^(?!${a}).*$`);let l=_r.toRegex(a,e);return i===!0&&(l.state=r),l};_r.makeRe=(r,e={},t=!1,i=!1)=>{if(!r||typeof r!="string")throw new TypeError("Expected a non-empty string");let n={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(r[0]==="."||r[0]==="*")&&(n.output=bv.fastpaths(r,e)),n.output||(n=bv(r,e)),_r.compileRe(n,e,t,i)};_r.toRegex=(r,e)=>{try{let t=e||{};return new RegExp(r,t.flags||(t.nocase?"i":""))}catch(t){if(e&&e.debug===!0)throw t;return/$^/}};_r.constants=SBe;Tq.exports=_r});var Sv=w((vet,Mq)=>{"use strict";Mq.exports=Oq()});var is=w((xet,Kq)=>{"use strict";var Uq=require("util"),Hq=mq(),Wo=Sv(),vv=Xp(),jq=r=>r===""||r==="./",Pr=(r,e,t)=>{e=[].concat(e),r=[].concat(r);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),t&&t.onResult&&t.onResult(u)};for(let u=0;u!i.has(u));if(t&&c.length===0){if(t.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(t.nonull===!0||t.nullglob===!0)return t.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};Pr.match=Pr;Pr.matcher=(r,e)=>Wo(r,e);Pr.isMatch=(r,e,t)=>Wo(e,t)(r);Pr.any=Pr.isMatch;Pr.not=(r,e,t={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{t.onResult&&t.onResult(a),n.push(a.output)},o=Pr(r,e,te(N({},t),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};Pr.contains=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);if(Array.isArray(e))return e.some(i=>Pr.contains(r,i,t));if(typeof e=="string"){if(jq(r)||jq(e))return!1;if(r.includes(e)||r.startsWith("./")&&r.slice(2).includes(e))return!0}return Pr.isMatch(r,e,te(N({},t),{contains:!0}))};Pr.matchKeys=(r,e,t)=>{if(!vv.isObject(r))throw new TypeError("Expected the first argument to be an object");let i=Pr(Object.keys(r),e,t),n={};for(let s of i)n[s]=r[s];return n};Pr.some=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(i.some(o=>s(o)))return!0}return!1};Pr.every=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(!i.every(o=>s(o)))return!1}return!0};Pr.all=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);return[].concat(e).every(i=>Wo(i,t)(r))};Pr.capture=(r,e,t)=>{let i=vv.isWindows(t),s=Wo.makeRe(String(r),te(N({},t),{capture:!0})).exec(i?vv.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};Pr.makeRe=(...r)=>Wo.makeRe(...r);Pr.scan=(...r)=>Wo.scan(...r);Pr.parse=(r,e)=>{let t=[];for(let i of[].concat(r||[]))for(let n of Hq(String(i),e))t.push(Wo.parse(n,e));return t};Pr.braces=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(r)?[r]:Hq(r,e)};Pr.braceExpand=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return Pr.braces(r,te(N({},e),{expand:!0}))};Kq.exports=Pr});var Yq=w((ket,Gq)=>{"use strict";Gq.exports=({onlyFirst:r=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,r?void 0:"g")}});var Jq=w((Pet,qq)=>{"use strict";var xBe=Yq();qq.exports=r=>typeof r=="string"?r.replace(xBe(),""):r});var AJ=w((zet,aJ)=>{"use strict";aJ.exports=(...r)=>[...new Set([].concat(...r))]});var jv=w((_et,lJ)=>{"use strict";var UBe=require("stream"),cJ=UBe.PassThrough,HBe=Array.prototype.slice;lJ.exports=jBe;function jBe(){let r=[],e=!1,t=HBe.call(arguments),i=t[t.length-1];i&&!Array.isArray(i)&&i.pipe==null?t.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=cJ(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(Fy,"__esModule",{value:!0});function GBe(r){return r.reduce((e,t)=>[].concat(e,t),[])}Fy.flatten=GBe;function YBe(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i].push(n);return t}Fy.splitWhen=YBe});var fJ=w(Gv=>{"use strict";Object.defineProperty(Gv,"__esModule",{value:!0});function qBe(r){return r.code==="ENOENT"}Gv.isEnoentCodeError=qBe});var pJ=w(Yv=>{"use strict";Object.defineProperty(Yv,"__esModule",{value:!0});var hJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function JBe(r,e){return new hJ(r,e)}Yv.createDirentFromStats=JBe});var dJ=w(Kg=>{"use strict";Object.defineProperty(Kg,"__esModule",{value:!0});var WBe=require("path"),zBe=2,_Be=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function VBe(r){return r.replace(/\\/g,"/")}Kg.unixify=VBe;function XBe(r,e){return WBe.resolve(r,e)}Kg.makeAbsolute=XBe;function ZBe(r){return r.replace(_Be,"\\$2")}Kg.escape=ZBe;function $Be(r){if(r.charAt(0)==="."){let e=r.charAt(1);if(e==="/"||e==="\\")return r.slice(zBe)}return r}Kg.removeLeadingDotSegment=$Be});var mJ=w((ett,CJ)=>{CJ.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var t;t=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}});var yJ=w((ttt,EJ)=>{var e0e=mJ(),IJ={"{":"}","(":")","[":"]"},t0e=function(r){if(r[0]==="!")return!0;for(var e=0,t=-2,i=-2,n=-2,s=-2,o=-2;ee&&(o===-1||o>i||(o=r.indexOf("\\",e),o===-1||o>i)))||n!==-1&&r[e]==="{"&&r[e+1]!=="}"&&(n=r.indexOf("}",e),n>e&&(o=r.indexOf("\\",e),o===-1||o>n))||s!==-1&&r[e]==="("&&r[e+1]==="?"&&/[:!=]/.test(r[e+2])&&r[e+3]!==")"&&(s=r.indexOf(")",e),s>e&&(o=r.indexOf("\\",e),o===-1||o>s))||t!==-1&&r[e]==="("&&r[e+1]!=="|"&&(tt&&(o=r.indexOf("\\",t),o===-1||o>s))))return!0;if(r[e]==="\\"){var a=r[e+1];e+=2;var l=IJ[a];if(l){var c=r.indexOf(l,e);c!==-1&&(e=c+1)}if(r[e]==="!")return!0}else e++}return!1},r0e=function(r){if(r[0]==="!")return!0;for(var e=0;e{"use strict";var i0e=yJ(),n0e=require("path").posix.dirname,s0e=require("os").platform()==="win32",qv="/",o0e=/\\/g,a0e=/[\{\[].*[\}\]]$/,A0e=/(^|[^\\])([\{\[]|\([^\)]+$)/,l0e=/\\([\!\*\?\|\[\]\(\)\{\}])/g;wJ.exports=function(e,t){var i=Object.assign({flipBackslashes:!0},t);i.flipBackslashes&&s0e&&e.indexOf(qv)<0&&(e=e.replace(o0e,qv)),a0e.test(e)&&(e+=qv),e+="a";do e=n0e(e);while(i0e(e)||A0e.test(e));return e.replace(l0e,"$1")}});var RJ=w(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});var c0e=require("path"),u0e=BJ(),bJ=is(),g0e=Sv(),QJ="**",f0e="\\",h0e=/[*?]|^!/,p0e=/\[.*]/,d0e=/(?:^|[^!*+?@])\(.*\|.*\)/,C0e=/[!*+?@]\(.*\)/,m0e=/{.*(?:,|\.\.).*}/;function vJ(r,e={}){return!SJ(r,e)}si.isStaticPattern=vJ;function SJ(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(f0e)||h0e.test(r)||p0e.test(r)||d0e.test(r)||e.extglob!==!1&&C0e.test(r)||e.braceExpansion!==!1&&m0e.test(r))}si.isDynamicPattern=SJ;function E0e(r){return Ny(r)?r.slice(1):r}si.convertToPositivePattern=E0e;function I0e(r){return"!"+r}si.convertToNegativePattern=I0e;function Ny(r){return r.startsWith("!")&&r[1]!=="("}si.isNegativePattern=Ny;function xJ(r){return!Ny(r)}si.isPositivePattern=xJ;function y0e(r){return r.filter(Ny)}si.getNegativePatterns=y0e;function w0e(r){return r.filter(xJ)}si.getPositivePatterns=w0e;function B0e(r){return u0e(r,{flipBackslashes:!1})}si.getBaseDirectory=B0e;function b0e(r){return r.includes(QJ)}si.hasGlobStar=b0e;function kJ(r){return r.endsWith("/"+QJ)}si.endsWithSlashGlobStar=kJ;function Q0e(r){let e=c0e.basename(r);return kJ(r)||vJ(e)}si.isAffectDepthOfReadingPattern=Q0e;function S0e(r){return r.reduce((e,t)=>e.concat(PJ(t)),[])}si.expandPatternsWithBraceExpansion=S0e;function PJ(r){return bJ.braces(r,{expand:!0,nodupes:!0})}si.expandBraceExpansion=PJ;function v0e(r,e){let t=g0e.scan(r,Object.assign(Object.assign({},e),{parts:!0}));return t.parts.length===0?[r]:t.parts}si.getPatternParts=v0e;function DJ(r,e){return bJ.makeRe(r,e)}si.makeRe=DJ;function x0e(r,e){return r.map(t=>DJ(t,e))}si.convertPatternsToRe=x0e;function k0e(r,e){return e.some(t=>t.test(r))}si.matchAny=k0e});var NJ=w(Jv=>{"use strict";Object.defineProperty(Jv,"__esModule",{value:!0});var P0e=jv();function D0e(r){let e=P0e(r);return r.forEach(t=>{t.once("error",i=>e.emit("error",i))}),e.once("close",()=>FJ(r)),e.once("end",()=>FJ(r)),e}Jv.merge=D0e;function FJ(r){r.forEach(e=>e.emit("close"))}});var LJ=w(Ly=>{"use strict";Object.defineProperty(Ly,"__esModule",{value:!0});function R0e(r){return typeof r=="string"}Ly.isString=R0e;function F0e(r){return r===""}Ly.isEmpty=F0e});var Xa=w(Va=>{"use strict";Object.defineProperty(Va,"__esModule",{value:!0});var N0e=gJ();Va.array=N0e;var L0e=fJ();Va.errno=L0e;var T0e=pJ();Va.fs=T0e;var O0e=dJ();Va.path=O0e;var M0e=RJ();Va.pattern=M0e;var K0e=NJ();Va.stream=K0e;var U0e=LJ();Va.string=U0e});var UJ=w(Za=>{"use strict";Object.defineProperty(Za,"__esModule",{value:!0});var Mc=Xa();function H0e(r,e){let t=TJ(r),i=OJ(r,e.ignore),n=t.filter(l=>Mc.pattern.isStaticPattern(l,e)),s=t.filter(l=>Mc.pattern.isDynamicPattern(l,e)),o=Wv(n,i,!1),a=Wv(s,i,!0);return o.concat(a)}Za.generate=H0e;function Wv(r,e,t){let i=MJ(r);return"."in i?[zv(".",r,e,t)]:KJ(i,e,t)}Za.convertPatternsToTasks=Wv;function TJ(r){return Mc.pattern.getPositivePatterns(r)}Za.getPositivePatterns=TJ;function OJ(r,e){return Mc.pattern.getNegativePatterns(r).concat(e).map(Mc.pattern.convertToPositivePattern)}Za.getNegativePatternsAsPositive=OJ;function MJ(r){let e={};return r.reduce((t,i)=>{let n=Mc.pattern.getBaseDirectory(i);return n in t?t[n].push(i):t[n]=[i],t},e)}Za.groupPatternsByBaseDirectory=MJ;function KJ(r,e,t){return Object.keys(r).map(i=>zv(i,r[i],e,t))}Za.convertPatternGroupsToTasks=KJ;function zv(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patterns:[].concat(e,t.map(Mc.pattern.convertToNegativePattern))}}Za.convertPatternGroupToTask=zv});var jJ=w(Ty=>{"use strict";Object.defineProperty(Ty,"__esModule",{value:!0});Ty.read=void 0;function j0e(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){HJ(t,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){_v(t,n);return}e.fs.stat(r,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){HJ(t,s);return}_v(t,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),_v(t,o)})})}Ty.read=j0e;function HJ(r,e){r(e)}function _v(r,e){r(null,e)}});var GJ=w(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});Oy.read=void 0;function G0e(r,e){let t=e.fs.lstatSync(r);if(!t.isSymbolicLink()||!e.followSymbolicLink)return t;try{let i=e.fs.statSync(r);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return t;throw i}}Oy.read=G0e});var YJ=w(rl=>{"use strict";Object.defineProperty(rl,"__esModule",{value:!0});rl.createFileSystemAdapter=rl.FILE_SYSTEM_ADAPTER=void 0;var My=require("fs");rl.FILE_SYSTEM_ADAPTER={lstat:My.lstat,stat:My.stat,lstatSync:My.lstatSync,statSync:My.statSync};function Y0e(r){return r===void 0?rl.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},rl.FILE_SYSTEM_ADAPTER),r)}rl.createFileSystemAdapter=Y0e});var JJ=w(Vv=>{"use strict";Object.defineProperty(Vv,"__esModule",{value:!0});var q0e=YJ(),qJ=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=q0e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return e!=null?e:t}};Vv.default=qJ});var Kc=w(il=>{"use strict";Object.defineProperty(il,"__esModule",{value:!0});il.statSync=il.stat=il.Settings=void 0;var WJ=jJ(),J0e=GJ(),Xv=JJ();il.Settings=Xv.default;function W0e(r,e,t){if(typeof e=="function"){WJ.read(r,Zv(),e);return}WJ.read(r,Zv(e),t)}il.stat=W0e;function z0e(r,e){let t=Zv(e);return J0e.read(r,t)}il.statSync=z0e;function Zv(r={}){return r instanceof Xv.default?r:new Xv.default(r)}});var _J=w((ftt,zJ)=>{zJ.exports=_0e;function _0e(r,e){var t,i,n,s=!0;Array.isArray(r)?(t=[],i=r.length):(n=Object.keys(r),t={},i=n.length);function o(l){function c(){e&&e(l,t),e=null}s?process.nextTick(c):c()}function a(l,c,u){t[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){r[l](function(c,u){a(l,c,u)})}):r.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var $v=w(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var Uy=process.versions.node.split(".");if(Uy[0]===void 0||Uy[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var VJ=Number.parseInt(Uy[0],10),V0e=Number.parseInt(Uy[1],10),XJ=10,X0e=10,Z0e=VJ>XJ,$0e=VJ===XJ&&V0e>=X0e;Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=Z0e||$0e});var $J=w(Hy=>{"use strict";Object.defineProperty(Hy,"__esModule",{value:!0});Hy.createDirentFromStats=void 0;var ZJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function ebe(r,e){return new ZJ(r,e)}Hy.createDirentFromStats=ebe});var ex=w(jy=>{"use strict";Object.defineProperty(jy,"__esModule",{value:!0});jy.fs=void 0;var tbe=$J();jy.fs=tbe});var tx=w(Gy=>{"use strict";Object.defineProperty(Gy,"__esModule",{value:!0});Gy.joinPathSegments=void 0;function rbe(r,e,t){return r.endsWith(t)?r+e:r+t+e}Gy.joinPathSegments=rbe});var s3=w(nl=>{"use strict";Object.defineProperty(nl,"__esModule",{value:!0});nl.readdir=nl.readdirWithFileTypes=nl.read=void 0;var ibe=Kc(),e3=_J(),nbe=$v(),t3=ex(),r3=tx();function sbe(r,e,t){if(!e.stats&&nbe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){i3(r,e,t);return}n3(r,e,t)}nl.read=sbe;function i3(r,e,t){e.fs.readdir(r,{withFileTypes:!0},(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:r3.joinPathSegments(r,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){rx(t,s);return}let o=s.map(a=>obe(a,e));e3(o,(a,l)=>{if(a!==null){Yy(t,a);return}rx(t,l)})})}nl.readdirWithFileTypes=i3;function obe(r,e){return t=>{if(!r.dirent.isSymbolicLink()){t(null,r);return}e.fs.stat(r.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){t(i);return}t(null,r);return}r.dirent=t3.fs.createDirentFromStats(r.name,n),t(null,r)})}}function n3(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(o=>{let a=r3.joinPathSegments(r,o,e.pathSegmentSeparator);return l=>{ibe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:t3.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});e3(s,(o,a)=>{if(o!==null){Yy(t,o);return}rx(t,a)})})}nl.readdir=n3;function Yy(r,e){r(e)}function rx(r,e){r(null,e)}});var c3=w(sl=>{"use strict";Object.defineProperty(sl,"__esModule",{value:!0});sl.readdir=sl.readdirWithFileTypes=sl.read=void 0;var abe=Kc(),Abe=$v(),o3=ex(),a3=tx();function lbe(r,e){return!e.stats&&Abe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?A3(r,e):l3(r,e)}sl.read=lbe;function A3(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:a3.joinPathSegments(r,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=o3.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}sl.readdirWithFileTypes=A3;function l3(r,e){return e.fs.readdirSync(r).map(i=>{let n=a3.joinPathSegments(r,i,e.pathSegmentSeparator),s=abe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:o3.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}sl.readdir=l3});var u3=w(ol=>{"use strict";Object.defineProperty(ol,"__esModule",{value:!0});ol.createFileSystemAdapter=ol.FILE_SYSTEM_ADAPTER=void 0;var Ug=require("fs");ol.FILE_SYSTEM_ADAPTER={lstat:Ug.lstat,stat:Ug.stat,lstatSync:Ug.lstatSync,statSync:Ug.statSync,readdir:Ug.readdir,readdirSync:Ug.readdirSync};function cbe(r){return r===void 0?ol.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},ol.FILE_SYSTEM_ADAPTER),r)}ol.createFileSystemAdapter=cbe});var f3=w(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var ube=require("path"),gbe=Kc(),fbe=u3(),g3=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=fbe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,ube.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new gbe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};ix.default=g3});var qy=w(al=>{"use strict";Object.defineProperty(al,"__esModule",{value:!0});al.Settings=al.scandirSync=al.scandir=void 0;var h3=s3(),hbe=c3(),nx=f3();al.Settings=nx.default;function pbe(r,e,t){if(typeof e=="function"){h3.read(r,sx(),e);return}h3.read(r,sx(e),t)}al.scandir=pbe;function dbe(r,e){let t=sx(e);return hbe.read(r,t)}al.scandirSync=dbe;function sx(r={}){return r instanceof nx.default?r:new nx.default(r)}});var d3=w((Btt,p3)=>{"use strict";function Cbe(r){var e=new r,t=e;function i(){var s=e;return s.next?e=s.next:(e=new r,t=e),s.next=null,s}function n(s){t.next=s,t=s}return{get:i,release:n}}p3.exports=Cbe});var m3=w((btt,ox)=>{"use strict";var mbe=d3();function C3(r,e,t){if(typeof r=="function"&&(t=e,e=r,r=null),t<1)throw new Error("fastqueue concurrency must be greater than 1");var i=mbe(Ebe),n=null,s=null,o=0,a=null,l={push:m,drain:Vo,saturated:Vo,pause:u,paused:!1,concurrency:t,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:y,empty:Vo,kill:v,killAndDrain:x,error:T};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var q=n,Y=0;q;)q=q.next,Y++;return Y}function f(){for(var q=n,Y=[];q;)Y.push(q.value),q=q.next;return Y}function h(){if(!!l.paused){l.paused=!1;for(var q=0;q{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});Xo.joinPathSegments=Xo.replacePathSegmentSeparator=Xo.isAppliedFilter=Xo.isFatalError=void 0;function ybe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}Xo.isFatalError=ybe;function wbe(r,e){return r===null||r(e)}Xo.isAppliedFilter=wbe;function Bbe(r,e){return r.split(/[/\\]/).join(e)}Xo.replacePathSegmentSeparator=Bbe;function bbe(r,e,t){return r===""?e:r.endsWith(t)?r+e:r+t+e}Xo.joinPathSegments=bbe});var Ax=w(ax=>{"use strict";Object.defineProperty(ax,"__esModule",{value:!0});var Qbe=Jy(),E3=class{constructor(e,t){this._root=e,this._settings=t,this._root=Qbe.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}};ax.default=E3});var cx=w(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var Sbe=require("events"),vbe=qy(),xbe=m3(),Wy=Jy(),kbe=Ax(),I3=class extends kbe.default{constructor(e,t){super(e,t);this._settings=t,this._scandir=vbe.scandir,this._emitter=new Sbe.EventEmitter,this._queue=xbe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,t){let i={directory:e,base:t};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){t(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);t(null,void 0)})}_handleError(e){this._isDestroyed||!Wy.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;let i=e.path;t!==void 0&&(e.path=Wy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),Wy.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&Wy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};lx.default=I3});var w3=w(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var Pbe=cx(),y3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Pbe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{Dbe(e,t)}),this._reader.onEntry(t=>{this._storage.add(t)}),this._reader.onEnd(()=>{Rbe(e,[...this._storage])}),this._reader.read()}};ux.default=y3;function Dbe(r,e){r(e)}function Rbe(r,e){r(null,e)}});var b3=w(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var Fbe=require("stream"),Nbe=cx(),B3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Nbe.default(this._root,this._settings),this._stream=new Fbe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};gx.default=B3});var S3=w(fx=>{"use strict";Object.defineProperty(fx,"__esModule",{value:!0});var Lbe=qy(),zy=Jy(),Tbe=Ax(),Q3=class extends Tbe.default{constructor(){super(...arguments);this._scandir=Lbe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,t)}catch(i){this._handleError(i)}}_handleError(e){if(!!zy.isFatalError(this._settings,e))throw e}_handleEntry(e,t){let i=e.path;t!==void 0&&(e.path=zy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),zy.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&zy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};fx.default=Q3});var x3=w(hx=>{"use strict";Object.defineProperty(hx,"__esModule",{value:!0});var Obe=S3(),v3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Obe.default(this._root,this._settings)}read(){return this._reader.read()}};hx.default=v3});var P3=w(px=>{"use strict";Object.defineProperty(px,"__esModule",{value:!0});var Mbe=require("path"),Kbe=qy(),k3=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Mbe.sep),this.fsScandirSettings=new Kbe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};px.default=k3});var Cx=w(Zo=>{"use strict";Object.defineProperty(Zo,"__esModule",{value:!0});Zo.Settings=Zo.walkStream=Zo.walkSync=Zo.walk=void 0;var D3=w3(),Ube=b3(),Hbe=x3(),dx=P3();Zo.Settings=dx.default;function jbe(r,e,t){if(typeof e=="function"){new D3.default(r,_y()).read(e);return}new D3.default(r,_y(e)).read(t)}Zo.walk=jbe;function Gbe(r,e){let t=_y(e);return new Hbe.default(r,t).read()}Zo.walkSync=Gbe;function Ybe(r,e){let t=_y(e);return new Ube.default(r,t).read()}Zo.walkStream=Ybe;function _y(r={}){return r instanceof dx.default?r:new dx.default(r)}});var Ex=w(mx=>{"use strict";Object.defineProperty(mx,"__esModule",{value:!0});var qbe=require("path"),Jbe=Kc(),R3=Xa(),F3=class{constructor(e){this._settings=e,this._fsStatSettings=new Jbe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return qbe.resolve(this._settings.cwd,e)}_makeEntry(e,t){let i={name:t,path:t,dirent:R3.fs.createDirentFromStats(t,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!R3.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};mx.default=F3});var yx=w(Ix=>{"use strict";Object.defineProperty(Ix,"__esModule",{value:!0});var Wbe=require("stream"),zbe=Kc(),_be=Cx(),Vbe=Ex(),N3=class extends Vbe.default{constructor(){super(...arguments);this._walkStream=_be.walkStream,this._stat=zbe.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){let i=e.map(this._getFullEntryPath,this),n=new Wbe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],t).then(l=>{l!==null&&t.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,t)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((t,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?t(s):i(n))})}};Ix.default=N3});var T3=w(wx=>{"use strict";Object.defineProperty(wx,"__esModule",{value:!0});var Hg=Xa(),L3=class{constructor(e,t,i){this._patterns=e,this._settings=t,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Hg.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let t of e){let i=this._getPatternSegments(t),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:t,segments:i,sections:n})}}_getPatternSegments(e){return Hg.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Hg.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Hg.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Hg.array.splitWhen(e,t=>t.dynamic&&Hg.pattern.hasGlobStar(t.pattern))}};wx.default=L3});var M3=w(Bx=>{"use strict";Object.defineProperty(Bx,"__esModule",{value:!0});var Xbe=T3(),O3=class extends Xbe.default{match(e){let t=e.split("/"),i=t.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||t.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};Bx.default=O3});var U3=w(bx=>{"use strict";Object.defineProperty(bx,"__esModule",{value:!0});var Vy=Xa(),Zbe=M3(),K3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,i){let n=this._getMatcher(t),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new Zbe.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let t=e.filter(Vy.pattern.isAffectDepthOfReadingPattern);return Vy.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,i,n){let s=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(t))return!1;let o=Vy.path.removeLeadingDotSegment(t.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){let i=e.split("/").length;return t.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!Vy.pattern.matchAny(e,t)}};bx.default=K3});var j3=w(Qx=>{"use strict";Object.defineProperty(Qx,"__esModule",{value:!0});var sd=Xa(),H3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){let i=sd.pattern.convertPatternsToRe(e,this._micromatchOptions),n=sd.pattern.convertPatternsToRe(t,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,t,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,t)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;let i=sd.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,t)}_isMatchToPatterns(e,t){let i=sd.path.removeLeadingDotSegment(e);return sd.pattern.matchAny(i,t)}};Qx.default=H3});var Y3=w(Sx=>{"use strict";Object.defineProperty(Sx,"__esModule",{value:!0});var $be=Xa(),G3=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return $be.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};Sx.default=G3});var W3=w(vx=>{"use strict";Object.defineProperty(vx,"__esModule",{value:!0});var q3=Xa(),J3=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=q3.path.makeAbsolute(this._settings.cwd,t),t=q3.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}};vx.default=J3});var Xy=w(xx=>{"use strict";Object.defineProperty(xx,"__esModule",{value:!0});var eQe=require("path"),tQe=U3(),rQe=j3(),iQe=Y3(),nQe=W3(),z3=class{constructor(e){this._settings=e,this.errorFilter=new iQe.default(this._settings),this.entryFilter=new rQe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new tQe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new nQe.default(this._settings)}_getRootDirectory(e){return eQe.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let t=e.base==="."?"":e.base;return{basePath:t,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};xx.default=z3});var V3=w(kx=>{"use strict";Object.defineProperty(kx,"__esModule",{value:!0});var sQe=yx(),oQe=Xy(),_3=class extends oQe.default{constructor(){super(...arguments);this._reader=new sQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(t,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};kx.default=_3});var Z3=w(Px=>{"use strict";Object.defineProperty(Px,"__esModule",{value:!0});var aQe=require("stream"),AQe=yx(),lQe=Xy(),X3=class extends lQe.default{constructor(){super(...arguments);this._reader=new AQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(t,e,i),s=new aQe.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Px.default=X3});var eW=w(Dx=>{"use strict";Object.defineProperty(Dx,"__esModule",{value:!0});var cQe=Kc(),uQe=Cx(),gQe=Ex(),$3=class extends gQe.default{constructor(){super(...arguments);this._walkSync=uQe.walkSync,this._statSync=cQe.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,t);o===null||!t.entryFilter(o)||i.push(o)}return i}_getEntry(e,t,i){try{let n=this._getStat(e);return this._makeEntry(n,t)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};Dx.default=$3});var rW=w(Rx=>{"use strict";Object.defineProperty(Rx,"__esModule",{value:!0});var fQe=eW(),hQe=Xy(),tW=class extends hQe.default{constructor(){super(...arguments);this._reader=new fQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(t,e,i).map(i.transform)}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Rx.default=tW});var nW=w(od=>{"use strict";Object.defineProperty(od,"__esModule",{value:!0});var jg=require("fs"),pQe=require("os"),dQe=pQe.cpus().length;od.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:jg.lstat,lstatSync:jg.lstatSync,stat:jg.stat,statSync:jg.statSync,readdir:jg.readdir,readdirSync:jg.readdirSync};var iW=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,dQe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return e===void 0?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},od.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};od.default=iW});var Zy=w((ztt,sW)=>{"use strict";var oW=UJ(),CQe=V3(),mQe=Z3(),EQe=rW(),Fx=nW(),Uc=Xa();async function Lx(r,e){Gg(r);let t=Nx(r,CQe.default,e),i=await Promise.all(t);return Uc.array.flatten(i)}(function(r){function e(o,a){Gg(o);let l=Nx(o,EQe.default,a);return Uc.array.flatten(l)}r.sync=e;function t(o,a){Gg(o);let l=Nx(o,mQe.default,a);return Uc.stream.merge(l)}r.stream=t;function i(o,a){Gg(o);let l=[].concat(o),c=new Fx.default(a);return oW.generate(l,c)}r.generateTasks=i;function n(o,a){Gg(o);let l=new Fx.default(a);return Uc.pattern.isDynamicPattern(o,l)}r.isDynamicPattern=n;function s(o){return Gg(o),Uc.path.escape(o)}r.escapePath=s})(Lx||(Lx={}));function Nx(r,e,t){let i=[].concat(r),n=new Fx.default(t),s=oW.generate(i,n),o=new e(n);return s.map(o.read,o)}function Gg(r){if(![].concat(r).every(i=>Uc.string.isString(i)&&!Uc.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}sW.exports=Lx});var AW=w(Hc=>{"use strict";var{promisify:IQe}=require("util"),aW=require("fs");async function Tx(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return(await IQe(aW[r])(t))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Ox(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return aW[r](t)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Hc.isFile=Tx.bind(null,"stat","isFile");Hc.isDirectory=Tx.bind(null,"stat","isDirectory");Hc.isSymlink=Tx.bind(null,"lstat","isSymbolicLink");Hc.isFileSync=Ox.bind(null,"statSync","isFile");Hc.isDirectorySync=Ox.bind(null,"statSync","isDirectory");Hc.isSymlinkSync=Ox.bind(null,"lstatSync","isSymbolicLink")});var fW=w((Vtt,Mx)=>{"use strict";var jc=require("path"),lW=AW(),cW=r=>r.length>1?`{${r.join(",")}}`:r[0],uW=(r,e)=>{let t=r[0]==="!"?r.slice(1):r;return jc.isAbsolute(t)?t:jc.join(e,t)},yQe=(r,e)=>jc.extname(r)?`**/${r}`:`**/${r}.${cW(e)}`,gW=(r,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(t=>jc.posix.join(r,yQe(t,e.extensions))):e.files?e.files.map(t=>jc.posix.join(r,`**/${t}`)):e.extensions?[jc.posix.join(r,`**/*.${cW(e.extensions)}`)]:[jc.posix.join(r,"**")]};Mx.exports=async(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=await Promise.all([].concat(r).map(async i=>await lW.isDirectory(uW(i,e.cwd))?gW(i,e):i));return[].concat.apply([],t)};Mx.exports.sync=(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=[].concat(r).map(i=>lW.isDirectorySync(uW(i,e.cwd))?gW(i,e):i);return[].concat.apply([],t)}});var BW=w((Xtt,hW)=>{function pW(r){return Array.isArray(r)?r:[r]}var dW="",CW=" ",Kx="\\",wQe=/^\s+$/,BQe=/^\\!/,bQe=/^\\#/,QQe=/\r?\n/g,SQe=/^\.*\/|^\.+$/,Ux="/",mW=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",vQe=(r,e,t)=>Object.defineProperty(r,e,{value:t}),xQe=/([0-z])-([0-z])/g,kQe=r=>r.replace(xQe,(e,t,i)=>t.charCodeAt(0)<=i.charCodeAt(0)?e:dW),PQe=r=>{let{length:e}=r;return r.slice(0,e-e%2)},DQe=[[/\\?\s+$/,r=>r.indexOf("\\")===0?CW:dW],[/\\\s/g,()=>CW],[/[\\$.|*+(){^]/g,r=>`\\${r}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(r,e,t)=>e+6`${e}[^\\/]*`],[/\\\\\\(?=[$.|*+(){^])/g,()=>Kx],[/\\\\/g,()=>Kx],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(r,e,t,i,n)=>e===Kx?`\\[${t}${PQe(i)}${n}`:n==="]"&&i.length%2==0?`[${kQe(t)}${i}]`:"[]"],[/(?:[^*])$/,r=>/\/$/.test(r)?`${r}$`:`${r}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(r,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],EW=Object.create(null),RQe=(r,e)=>{let t=EW[r];return t||(t=DQe.reduce((i,n)=>i.replace(n[0],n[1].bind(r)),r),EW[r]=t),e?new RegExp(t,"i"):new RegExp(t)},Hx=r=>typeof r=="string",FQe=r=>r&&Hx(r)&&!wQe.test(r)&&r.indexOf("#")!==0,NQe=r=>r.split(QQe),IW=class{constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.regex=n}},LQe=(r,e)=>{let t=r,i=!1;r.indexOf("!")===0&&(i=!0,r=r.substr(1)),r=r.replace(BQe,"!").replace(bQe,"#");let n=RQe(r,e);return new IW(t,r,i,n)},TQe=(r,e)=>{throw new e(r)},$a=(r,e,t)=>Hx(r)?r?$a.isNotRelative(r)?t(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:t("path must not be empty",TypeError):t(`path must be a string, but got \`${e}\``,TypeError),yW=r=>SQe.test(r);$a.isNotRelative=yW;$a.convert=r=>r;var wW=class{constructor({ignorecase:e=!0}={}){vQe(this,mW,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[mW]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(FQe(e)){let t=LQe(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,pW(Hx(e)?NQe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!t)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,t,i,n){let s=e&&$a.convert(e);return $a(s,e,TQe),this._t(s,t,i,n)}_t(e,t,i,n){if(e in t)return t[e];if(n||(n=e.split(Ux)),n.pop(),!n.length)return t[e]=this._testOne(e,i);let s=this._t(n.join(Ux)+Ux,t,i,n);return t[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return pW(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},$y=r=>new wW(r),OQe=()=>!1,MQe=r=>$a(r&&$a.convert(r),r,OQe);$y.isPathValid=MQe;$y.default=$y;hW.exports=$y;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let r=t=>/^\\\\\?\\/.test(t)||/["<>|\u0000-\u001F]+/u.test(t)?t:t.replace(/\\/g,"/");$a.convert=r;let e=/^[a-z]:\//i;$a.isNotRelative=t=>e.test(t)||yW(t)}});var QW=w((Ztt,bW)=>{"use strict";bW.exports=r=>{let e=/^\\\\\?\\/.test(r),t=/[^\u0000-\u0080]+/.test(r);return e||t?r:r.replace(/\\/g,"/")}});var RW=w(($tt,jx)=>{"use strict";var{promisify:KQe}=require("util"),SW=require("fs"),eA=require("path"),vW=Zy(),UQe=BW(),ad=QW(),xW=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],HQe=KQe(SW.readFile),jQe=r=>e=>e.startsWith("!")?"!"+eA.posix.join(r,e.slice(1)):eA.posix.join(r,e),GQe=(r,e)=>{let t=ad(eA.relative(e.cwd,eA.dirname(e.fileName)));return r.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(jQe(t))},kW=r=>{let e=UQe();for(let t of r)e.add(GQe(t.content,{cwd:t.cwd,fileName:t.filePath}));return e},YQe=(r,e)=>{if(r=ad(r),eA.isAbsolute(e)){if(ad(e).startsWith(r))return e;throw new Error(`Path ${e} is not in cwd ${r}`)}return eA.join(r,e)},PW=(r,e)=>t=>r.ignores(ad(eA.relative(e,YQe(e,t.path||t)))),qQe=async(r,e)=>{let t=eA.join(e,r),i=await HQe(t,"utf8");return{cwd:e,filePath:t,content:i}},JQe=(r,e)=>{let t=eA.join(e,r),i=SW.readFileSync(t,"utf8");return{cwd:e,filePath:t,content:i}},DW=({ignore:r=[],cwd:e=ad(process.cwd())}={})=>({ignore:r,cwd:e});jx.exports=async r=>{r=DW(r);let e=await vW("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}),t=await Promise.all(e.map(n=>qQe(n,r.cwd))),i=kW(t);return PW(i,r.cwd)};jx.exports.sync=r=>{r=DW(r);let t=vW.sync("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}).map(n=>JQe(n,r.cwd)),i=kW(t);return PW(i,r.cwd)}});var TW=w((ert,FW)=>{"use strict";var{Transform:WQe}=require("stream"),Gx=class extends WQe{constructor(){super({objectMode:!0})}},NW=class extends Gx{constructor(e){super();this._filter=e}_transform(e,t,i){this._filter(e)&&this.push(e),i()}},LW=class extends Gx{constructor(){super();this._pushed=new Set}_transform(e,t,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};FW.exports={FilterStream:NW,UniqueStream:LW}});var Wx=w((trt,Gc)=>{"use strict";var OW=require("fs"),ew=AJ(),zQe=jv(),tw=Zy(),rw=fW(),Yx=RW(),{FilterStream:_Qe,UniqueStream:VQe}=TW(),MW=()=>!1,KW=r=>r[0]==="!",XQe=r=>{if(!r.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},ZQe=(r={})=>{if(!r.cwd)return;let e;try{e=OW.statSync(r.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},$Qe=r=>r.stats instanceof OW.Stats?r.path:r,iw=(r,e)=>{r=ew([].concat(r)),XQe(r),ZQe(e);let t=[];e=N({ignore:[],expandDirectories:!0},e);for(let[i,n]of r.entries()){if(KW(n))continue;let s=r.slice(i).filter(a=>KW(a)).map(a=>a.slice(1)),o=te(N({},e),{ignore:e.ignore.concat(s)});t.push({pattern:n,options:o})}return t},eSe=(r,e)=>{let t={};return r.options.cwd&&(t.cwd=r.options.cwd),Array.isArray(r.options.expandDirectories)?t=te(N({},t),{files:r.options.expandDirectories}):typeof r.options.expandDirectories=="object"&&(t=N(N({},t),r.options.expandDirectories)),e(r.pattern,t)},qx=(r,e)=>r.options.expandDirectories?eSe(r,e):[r.pattern],UW=r=>r&&r.gitignore?Yx.sync({cwd:r.cwd,ignore:r.ignore}):MW,Jx=r=>e=>{let{options:t}=r;return t.ignore&&Array.isArray(t.ignore)&&t.expandDirectories&&(t.ignore=rw.sync(t.ignore)),{pattern:e,options:t}};Gc.exports=async(r,e)=>{let t=iw(r,e),i=async()=>e&&e.gitignore?Yx({cwd:e.cwd,ignore:e.ignore}):MW,n=async()=>{let l=await Promise.all(t.map(async c=>{let u=await qx(c,rw);return Promise.all(u.map(Jx(c)))}));return ew(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>tw(l.pattern,l.options)));return ew(...a).filter(l=>!s($Qe(l)))};Gc.exports.sync=(r,e)=>{let t=iw(r,e),i=[];for(let o of t){let a=qx(o,rw.sync).map(Jx(o));i.push(...a)}let n=UW(e),s=[];for(let o of i)s=ew(s,tw.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Gc.exports.stream=(r,e)=>{let t=iw(r,e),i=[];for(let a of t){let l=qx(a,rw.sync).map(Jx(a));i.push(...l)}let n=UW(e),s=new _Qe(a=>!n(a)),o=new VQe;return zQe(i.map(a=>tw.stream(a.pattern,a.options))).pipe(s).pipe(o)};Gc.exports.generateGlobTasks=iw;Gc.exports.hasMagic=(r,e)=>[].concat(r).some(t=>tw.isDynamicPattern(t,e));Gc.exports.gitignore=Yx});var Rn=w((xrt,t4)=>{function fSe(r){var e=typeof r;return r!=null&&(e=="object"||e=="function")}t4.exports=fSe});var rk=w((krt,r4)=>{var hSe=typeof global=="object"&&global&&global.Object===Object&&global;r4.exports=hSe});var Ns=w((Prt,i4)=>{var pSe=rk(),dSe=typeof self=="object"&&self&&self.Object===Object&&self,CSe=pSe||dSe||Function("return this")();i4.exports=CSe});var s4=w((Drt,n4)=>{var mSe=Ns(),ESe=function(){return mSe.Date.now()};n4.exports=ESe});var a4=w((Rrt,o4)=>{var ISe=/\s/;function ySe(r){for(var e=r.length;e--&&ISe.test(r.charAt(e)););return e}o4.exports=ySe});var l4=w((Frt,A4)=>{var wSe=a4(),BSe=/^\s+/;function bSe(r){return r&&r.slice(0,wSe(r)+1).replace(BSe,"")}A4.exports=bSe});var Jc=w((Nrt,c4)=>{var QSe=Ns(),SSe=QSe.Symbol;c4.exports=SSe});var h4=w((Lrt,u4)=>{var g4=Jc(),f4=Object.prototype,vSe=f4.hasOwnProperty,xSe=f4.toString,Ed=g4?g4.toStringTag:void 0;function kSe(r){var e=vSe.call(r,Ed),t=r[Ed];try{r[Ed]=void 0;var i=!0}catch(s){}var n=xSe.call(r);return i&&(e?r[Ed]=t:delete r[Ed]),n}u4.exports=kSe});var d4=w((Trt,p4)=>{var PSe=Object.prototype,DSe=PSe.toString;function RSe(r){return DSe.call(r)}p4.exports=RSe});var Wc=w((Ort,C4)=>{var m4=Jc(),FSe=h4(),NSe=d4(),LSe="[object Null]",TSe="[object Undefined]",E4=m4?m4.toStringTag:void 0;function OSe(r){return r==null?r===void 0?TSe:LSe:E4&&E4 in Object(r)?FSe(r):NSe(r)}C4.exports=OSe});var ta=w((Mrt,I4)=>{function MSe(r){return r!=null&&typeof r=="object"}I4.exports=MSe});var Id=w((Krt,y4)=>{var KSe=Wc(),USe=ta(),HSe="[object Symbol]";function jSe(r){return typeof r=="symbol"||USe(r)&&KSe(r)==HSe}y4.exports=jSe});var Q4=w((Urt,w4)=>{var GSe=l4(),B4=Rn(),YSe=Id(),b4=0/0,qSe=/^[-+]0x[0-9a-f]+$/i,JSe=/^0b[01]+$/i,WSe=/^0o[0-7]+$/i,zSe=parseInt;function _Se(r){if(typeof r=="number")return r;if(YSe(r))return b4;if(B4(r)){var e=typeof r.valueOf=="function"?r.valueOf():r;r=B4(e)?e+"":e}if(typeof r!="string")return r===0?r:+r;r=GSe(r);var t=JSe.test(r);return t||WSe.test(r)?zSe(r.slice(2),t?2:8):qSe.test(r)?b4:+r}w4.exports=_Se});var x4=w((Hrt,S4)=>{var VSe=Rn(),ik=s4(),v4=Q4(),XSe="Expected a function",ZSe=Math.max,$Se=Math.min;function eve(r,e,t){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof r!="function")throw new TypeError(XSe);e=v4(e)||0,VSe(t)&&(u=!!t.leading,g="maxWait"in t,s=g?ZSe(v4(t.maxWait)||0,e):s,f="trailing"in t?!!t.trailing:f);function h(Y){var $=i,_=n;return i=n=void 0,c=Y,o=r.apply(_,$),o}function p(Y){return c=Y,a=setTimeout(b,e),u?h(Y):o}function m(Y){var $=Y-l,_=Y-c,ne=e-$;return g?$Se(ne,s-_):ne}function y(Y){var $=Y-l,_=Y-c;return l===void 0||$>=e||$<0||g&&_>=s}function b(){var Y=ik();if(y(Y))return v(Y);a=setTimeout(b,m(Y))}function v(Y){return a=void 0,f&&i?h(Y):(i=n=void 0,o)}function x(){a!==void 0&&clearTimeout(a),c=0,i=l=n=a=void 0}function T(){return a===void 0?o:v(ik())}function q(){var Y=ik(),$=y(Y);if(i=arguments,n=this,l=Y,$){if(a===void 0)return p(l);if(g)return clearTimeout(a),a=setTimeout(b,e),h(l)}return a===void 0&&(a=setTimeout(b,e)),o}return q.cancel=x,q.flush=T,q}S4.exports=eve});var P4=w((jrt,k4)=>{var tve=x4(),rve=Rn(),ive="Expected a function";function nve(r,e,t){var i=!0,n=!0;if(typeof r!="function")throw new TypeError(ive);return rve(t)&&(i="leading"in t?!!t.leading:i,n="trailing"in t?!!t.trailing:n),tve(r,e,{leading:i,maxWait:e,trailing:n})}k4.exports=nve});var iA=w((rA,Bw)=>{"use strict";Object.defineProperty(rA,"__esModule",{value:!0});var M4=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Cve(r){return M4.includes(r)}var mve=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...M4];function Eve(r){return mve.includes(r)}var Ive=["null","undefined","string","number","bigint","boolean","symbol"];function yve(r){return Ive.includes(r)}function Xg(r){return e=>typeof e===r}var{toString:K4}=Object.prototype,vd=r=>{let e=K4.call(r).slice(8,-1);if(/HTML\w+Element/.test(e)&&W.domElement(r))return"HTMLElement";if(Eve(e))return e},hr=r=>e=>vd(e)===r;function W(r){if(r===null)return"null";switch(typeof r){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(W.observable(r))return"Observable";if(W.array(r))return"Array";if(W.buffer(r))return"Buffer";let e=vd(r);if(e)return e;if(r instanceof String||r instanceof Boolean||r instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}W.undefined=Xg("undefined");W.string=Xg("string");var wve=Xg("number");W.number=r=>wve(r)&&!W.nan(r);W.bigint=Xg("bigint");W.function_=Xg("function");W.null_=r=>r===null;W.class_=r=>W.function_(r)&&r.toString().startsWith("class ");W.boolean=r=>r===!0||r===!1;W.symbol=Xg("symbol");W.numericString=r=>W.string(r)&&!W.emptyStringOrWhitespace(r)&&!Number.isNaN(Number(r));W.array=(r,e)=>Array.isArray(r)?W.function_(e)?r.every(e):!0:!1;W.buffer=r=>{var e,t,i,n;return(n=(i=(t=(e=r)===null||e===void 0?void 0:e.constructor)===null||t===void 0?void 0:t.isBuffer)===null||i===void 0?void 0:i.call(t,r))!==null&&n!==void 0?n:!1};W.nullOrUndefined=r=>W.null_(r)||W.undefined(r);W.object=r=>!W.null_(r)&&(typeof r=="object"||W.function_(r));W.iterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.iterator])};W.asyncIterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.asyncIterator])};W.generator=r=>W.iterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.asyncGenerator=r=>W.asyncIterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.nativePromise=r=>hr("Promise")(r);var Bve=r=>{var e,t;return W.function_((e=r)===null||e===void 0?void 0:e.then)&&W.function_((t=r)===null||t===void 0?void 0:t.catch)};W.promise=r=>W.nativePromise(r)||Bve(r);W.generatorFunction=hr("GeneratorFunction");W.asyncGeneratorFunction=r=>vd(r)==="AsyncGeneratorFunction";W.asyncFunction=r=>vd(r)==="AsyncFunction";W.boundFunction=r=>W.function_(r)&&!r.hasOwnProperty("prototype");W.regExp=hr("RegExp");W.date=hr("Date");W.error=hr("Error");W.map=r=>hr("Map")(r);W.set=r=>hr("Set")(r);W.weakMap=r=>hr("WeakMap")(r);W.weakSet=r=>hr("WeakSet")(r);W.int8Array=hr("Int8Array");W.uint8Array=hr("Uint8Array");W.uint8ClampedArray=hr("Uint8ClampedArray");W.int16Array=hr("Int16Array");W.uint16Array=hr("Uint16Array");W.int32Array=hr("Int32Array");W.uint32Array=hr("Uint32Array");W.float32Array=hr("Float32Array");W.float64Array=hr("Float64Array");W.bigInt64Array=hr("BigInt64Array");W.bigUint64Array=hr("BigUint64Array");W.arrayBuffer=hr("ArrayBuffer");W.sharedArrayBuffer=hr("SharedArrayBuffer");W.dataView=hr("DataView");W.directInstanceOf=(r,e)=>Object.getPrototypeOf(r)===e.prototype;W.urlInstance=r=>hr("URL")(r);W.urlString=r=>{if(!W.string(r))return!1;try{return new URL(r),!0}catch(e){return!1}};W.truthy=r=>Boolean(r);W.falsy=r=>!r;W.nan=r=>Number.isNaN(r);W.primitive=r=>W.null_(r)||yve(typeof r);W.integer=r=>Number.isInteger(r);W.safeInteger=r=>Number.isSafeInteger(r);W.plainObject=r=>{if(K4.call(r)!=="[object Object]")return!1;let e=Object.getPrototypeOf(r);return e===null||e===Object.getPrototypeOf({})};W.typedArray=r=>Cve(vd(r));var bve=r=>W.safeInteger(r)&&r>=0;W.arrayLike=r=>!W.nullOrUndefined(r)&&!W.function_(r)&&bve(r.length);W.inRange=(r,e)=>{if(W.number(e))return r>=Math.min(0,e)&&r<=Math.max(e,0);if(W.array(e)&&e.length===2)return r>=Math.min(...e)&&r<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Qve=1,Sve=["innerHTML","ownerDocument","style","attributes","nodeValue"];W.domElement=r=>W.object(r)&&r.nodeType===Qve&&W.string(r.nodeName)&&!W.plainObject(r)&&Sve.every(e=>e in r);W.observable=r=>{var e,t,i,n;return r?r===((t=(e=r)[Symbol.observable])===null||t===void 0?void 0:t.call(e))||r===((n=(i=r)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};W.nodeStream=r=>W.object(r)&&W.function_(r.pipe)&&!W.observable(r);W.infinite=r=>r===Infinity||r===-Infinity;var U4=r=>e=>W.integer(e)&&Math.abs(e%2)===r;W.evenInteger=U4(0);W.oddInteger=U4(1);W.emptyArray=r=>W.array(r)&&r.length===0;W.nonEmptyArray=r=>W.array(r)&&r.length>0;W.emptyString=r=>W.string(r)&&r.length===0;W.nonEmptyString=r=>W.string(r)&&r.length>0;var vve=r=>W.string(r)&&!/\S/.test(r);W.emptyStringOrWhitespace=r=>W.emptyString(r)||vve(r);W.emptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length===0;W.nonEmptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length>0;W.emptySet=r=>W.set(r)&&r.size===0;W.nonEmptySet=r=>W.set(r)&&r.size>0;W.emptyMap=r=>W.map(r)&&r.size===0;W.nonEmptyMap=r=>W.map(r)&&r.size>0;W.propertyKey=r=>W.any([W.string,W.number,W.symbol],r);W.formData=r=>hr("FormData")(r);W.urlSearchParams=r=>hr("URLSearchParams")(r);var H4=(r,e,t)=>{if(!W.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(t.length===0)throw new TypeError("Invalid number of values");return r.call(t,e)};W.any=(r,...e)=>(W.array(r)?r:[r]).some(i=>H4(Array.prototype.some,i,e));W.all=(r,...e)=>H4(Array.prototype.every,r,e);var We=(r,e,t,i={})=>{if(!r){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(t.map(o=>`\`${W(o)}\``))].join(", ")}`:`received value of type \`${W(t)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};rA.assert={undefined:r=>We(W.undefined(r),"undefined",r),string:r=>We(W.string(r),"string",r),number:r=>We(W.number(r),"number",r),bigint:r=>We(W.bigint(r),"bigint",r),function_:r=>We(W.function_(r),"Function",r),null_:r=>We(W.null_(r),"null",r),class_:r=>We(W.class_(r),"Class",r),boolean:r=>We(W.boolean(r),"boolean",r),symbol:r=>We(W.symbol(r),"symbol",r),numericString:r=>We(W.numericString(r),"string with a number",r),array:(r,e)=>{We(W.array(r),"Array",r),e&&r.forEach(e)},buffer:r=>We(W.buffer(r),"Buffer",r),nullOrUndefined:r=>We(W.nullOrUndefined(r),"null or undefined",r),object:r=>We(W.object(r),"Object",r),iterable:r=>We(W.iterable(r),"Iterable",r),asyncIterable:r=>We(W.asyncIterable(r),"AsyncIterable",r),generator:r=>We(W.generator(r),"Generator",r),asyncGenerator:r=>We(W.asyncGenerator(r),"AsyncGenerator",r),nativePromise:r=>We(W.nativePromise(r),"native Promise",r),promise:r=>We(W.promise(r),"Promise",r),generatorFunction:r=>We(W.generatorFunction(r),"GeneratorFunction",r),asyncGeneratorFunction:r=>We(W.asyncGeneratorFunction(r),"AsyncGeneratorFunction",r),asyncFunction:r=>We(W.asyncFunction(r),"AsyncFunction",r),boundFunction:r=>We(W.boundFunction(r),"Function",r),regExp:r=>We(W.regExp(r),"RegExp",r),date:r=>We(W.date(r),"Date",r),error:r=>We(W.error(r),"Error",r),map:r=>We(W.map(r),"Map",r),set:r=>We(W.set(r),"Set",r),weakMap:r=>We(W.weakMap(r),"WeakMap",r),weakSet:r=>We(W.weakSet(r),"WeakSet",r),int8Array:r=>We(W.int8Array(r),"Int8Array",r),uint8Array:r=>We(W.uint8Array(r),"Uint8Array",r),uint8ClampedArray:r=>We(W.uint8ClampedArray(r),"Uint8ClampedArray",r),int16Array:r=>We(W.int16Array(r),"Int16Array",r),uint16Array:r=>We(W.uint16Array(r),"Uint16Array",r),int32Array:r=>We(W.int32Array(r),"Int32Array",r),uint32Array:r=>We(W.uint32Array(r),"Uint32Array",r),float32Array:r=>We(W.float32Array(r),"Float32Array",r),float64Array:r=>We(W.float64Array(r),"Float64Array",r),bigInt64Array:r=>We(W.bigInt64Array(r),"BigInt64Array",r),bigUint64Array:r=>We(W.bigUint64Array(r),"BigUint64Array",r),arrayBuffer:r=>We(W.arrayBuffer(r),"ArrayBuffer",r),sharedArrayBuffer:r=>We(W.sharedArrayBuffer(r),"SharedArrayBuffer",r),dataView:r=>We(W.dataView(r),"DataView",r),urlInstance:r=>We(W.urlInstance(r),"URL",r),urlString:r=>We(W.urlString(r),"string with a URL",r),truthy:r=>We(W.truthy(r),"truthy",r),falsy:r=>We(W.falsy(r),"falsy",r),nan:r=>We(W.nan(r),"NaN",r),primitive:r=>We(W.primitive(r),"primitive",r),integer:r=>We(W.integer(r),"integer",r),safeInteger:r=>We(W.safeInteger(r),"integer",r),plainObject:r=>We(W.plainObject(r),"plain object",r),typedArray:r=>We(W.typedArray(r),"TypedArray",r),arrayLike:r=>We(W.arrayLike(r),"array-like",r),domElement:r=>We(W.domElement(r),"HTMLElement",r),observable:r=>We(W.observable(r),"Observable",r),nodeStream:r=>We(W.nodeStream(r),"Node.js Stream",r),infinite:r=>We(W.infinite(r),"infinite number",r),emptyArray:r=>We(W.emptyArray(r),"empty array",r),nonEmptyArray:r=>We(W.nonEmptyArray(r),"non-empty array",r),emptyString:r=>We(W.emptyString(r),"empty string",r),nonEmptyString:r=>We(W.nonEmptyString(r),"non-empty string",r),emptyStringOrWhitespace:r=>We(W.emptyStringOrWhitespace(r),"empty string or whitespace",r),emptyObject:r=>We(W.emptyObject(r),"empty object",r),nonEmptyObject:r=>We(W.nonEmptyObject(r),"non-empty object",r),emptySet:r=>We(W.emptySet(r),"empty set",r),nonEmptySet:r=>We(W.nonEmptySet(r),"non-empty set",r),emptyMap:r=>We(W.emptyMap(r),"empty map",r),nonEmptyMap:r=>We(W.nonEmptyMap(r),"non-empty map",r),propertyKey:r=>We(W.propertyKey(r),"PropertyKey",r),formData:r=>We(W.formData(r),"FormData",r),urlSearchParams:r=>We(W.urlSearchParams(r),"URLSearchParams",r),evenInteger:r=>We(W.evenInteger(r),"even integer",r),oddInteger:r=>We(W.oddInteger(r),"odd integer",r),directInstanceOf:(r,e)=>We(W.directInstanceOf(r,e),"T",r),inRange:(r,e)=>We(W.inRange(r,e),"in range",r),any:(r,...e)=>We(W.any(r,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(r,...e)=>We(W.all(r,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(W,{class:{value:W.class_},function:{value:W.function_},null:{value:W.null_}});Object.defineProperties(rA.assert,{class:{value:rA.assert.class_},function:{value:rA.assert.function_},null:{value:rA.assert.null_}});rA.default=W;Bw.exports=W;Bw.exports.default=W;Bw.exports.assert=rA.assert});var j4=w((Wit,Bk)=>{"use strict";var bk=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},xd=class{static fn(e){return(...t)=>new xd((i,n,s)=>{t.push(s),e(...t).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,i)=>{this._reject=i;let n=a=>{this._isPending=!1,t(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let t of this._cancelHandlers)t()}catch(t){this._reject(t)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new bk(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(xd.prototype,Promise.prototype);Bk.exports=xd;Bk.exports.CancelError=bk});var G4=w((Qk,Sk)=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});var xve=require("tls"),vk=(r,e)=>{let t;typeof e=="function"?t={connect:e}:t=e;let i=typeof t.connect=="function",n=typeof t.secureConnect=="function",s=typeof t.close=="function",o=()=>{i&&t.connect(),r instanceof xve.TLSSocket&&n&&(r.authorized?t.secureConnect():r.authorizationError||r.once("secureConnect",t.secureConnect)),s&&r.once("close",t.close)};r.writable&&!r.connecting?o():r.connecting?r.once("connect",o):r.destroyed&&s&&t.close(r._hadError)};Qk.default=vk;Sk.exports=vk;Sk.exports.default=vk});var Y4=w((xk,kk)=>{"use strict";Object.defineProperty(xk,"__esModule",{value:!0});var kve=G4(),Pve=Number(process.versions.node.split(".")[0]),Pk=r=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};r.timings=e;let t=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};t(r),r.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||Pve>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),kve.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};r.socket?i(r.socket):r.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof r.writableFinished=="boolean"?r.writableFinished:r.finished&&r.outputSize===0&&(!r.socket||r.socket.writableLength===0))()?n():r.prependOnceListener("finish",n),r.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,t(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};xk.default=Pk;kk.exports=Pk;kk.exports.default=Pk});var X4=w((zit,Dk)=>{"use strict";var{V4MAPPED:Dve,ADDRCONFIG:Rve,ALL:q4,promises:{Resolver:J4},lookup:Fve}=require("dns"),{promisify:Rk}=require("util"),Nve=require("os"),Zg=Symbol("cacheableLookupCreateConnection"),Fk=Symbol("cacheableLookupInstance"),W4=Symbol("expires"),Lve=typeof q4=="number",z4=r=>{if(!(r&&typeof r.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Tve=r=>{for(let e of r)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},_4=()=>{let r=!1,e=!1;for(let t of Object.values(Nve.networkInterfaces()))for(let i of t)if(!i.internal&&(i.family==="IPv6"?e=!0:r=!0,r&&e))return{has4:r,has6:e};return{has4:r,has6:e}},Ove=r=>Symbol.iterator in r,V4={ttl:!0},Mve={all:!0},Nk=class{constructor({cache:e=new Map,maxTtl:t=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new J4,lookup:o=Fve}={}){if(this.maxTtl=t,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Rk(o),this._resolver instanceof J4?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Rk(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Rk(this._resolver.resolve6.bind(this._resolver))),this._iface=_4(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,i){if(typeof t=="function"?(i=t,t={}):typeof t=="number"&&(t={family:t}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,t).then(n=>{t.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,t={}){typeof t=="number"&&(t={family:t});let i=await this.query(e);if(t.family===6){let n=i.filter(s=>s.family===6);t.hints&Dve&&(Lve&&t.hints&q4||n.length===0)?Tve(i):i=n}else t.family===4&&(i=i.filter(n=>n.family===4));if(t.hints&Rve){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return t.all?i:i[0]}async query(e){let t=await this._cache.get(e);if(!t){let i=this._pending[e];if(i)t=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,t=await n}}return t=t.map(i=>N({},i)),t}async _resolve(e){let t=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,V4),this._resolve6(e,V4)].map(c=>t(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(t){return{entries:[],cacheTtl:0}}}async _set(e,t,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,t[W4]=Date.now()+i;try{await this._cache.set(e,t,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Ove(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Mve);try{let t=await this._resolve(e);t.entries.length===0&&this._fallback&&(t=await this._lookup(e),t.entries.length!==0&&this._hostnamesToFallback.add(e));let i=t.entries.length===0?this.errorTtl:t.cacheTtl;return await this._set(e,t.entries,i),delete this._pending[e],t.entries}catch(t){throw delete this._pending[e],t}}_tick(e){let t=this._nextRemovalTime;(!t||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[W4];n>=a?this._cache.delete(s):a("lookup"in t||(t.lookup=this.lookup),e[Zg](t,i))}uninstall(e){if(z4(e),e[Zg]){if(e[Fk]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Zg],delete e[Zg],delete e[Fk]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=_4(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};Dk.exports=Nk;Dk.exports.default=Nk});var e8=w((_it,Lk)=>{"use strict";var Kve=typeof URL=="undefined"?require("url").URL:URL,Uve="text/plain",Hve="us-ascii",Z4=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),jve=(r,{stripHash:e})=>{let t=r.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!t)throw new Error(`Invalid URL: ${r}`);let i=t[1].split(";"),n=t[2],s=e?"":t[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Hve)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==Uve)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},$4=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(r=r.trim(),/^data:/i.test(r))return jve(r,e);let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new Kve(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];Z4(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])Z4(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),r=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};Lk.exports=$4;Lk.exports.default=$4});var i8=w((Vit,t8)=>{t8.exports=r8;function r8(r,e){if(r&&e)return r8(r)(e);if(typeof r!="function")throw new TypeError("need wrapper function");return Object.keys(r).forEach(function(i){t[i]=r[i]}),t;function t(){for(var i=new Array(arguments.length),n=0;n{var n8=i8();Tk.exports=n8(bw);Tk.exports.strict=n8(s8);bw.proto=bw(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return bw(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return s8(this)},configurable:!0})});function bw(r){var e=function(){return e.called?e.value:(e.called=!0,e.value=r.apply(this,arguments))};return e.called=!1,e}function s8(r){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=r.apply(this,arguments)},t=r.name||"Function wrapped with `once`";return e.onceError=t+" shouldn't be called more than once",e.called=!1,e}});var Mk=w((Zit,o8)=>{var Gve=Ok(),Yve=function(){},qve=function(r){return r.setHeader&&typeof r.abort=="function"},Jve=function(r){return r.stdio&&Array.isArray(r.stdio)&&r.stdio.length===3},a8=function(r,e,t){if(typeof e=="function")return a8(r,null,e);e||(e={}),t=Gve(t||Yve);var i=r._writableState,n=r._readableState,s=e.readable||e.readable!==!1&&r.readable,o=e.writable||e.writable!==!1&&r.writable,a=function(){r.writable||l()},l=function(){o=!1,s||t.call(r)},c=function(){s=!1,o||t.call(r)},u=function(p){t.call(r,p?new Error("exited with error code: "+p):null)},g=function(p){t.call(r,p)},f=function(){if(s&&!(n&&n.ended))return t.call(r,new Error("premature close"));if(o&&!(i&&i.ended))return t.call(r,new Error("premature close"))},h=function(){r.req.on("finish",l)};return qve(r)?(r.on("complete",l),r.on("abort",f),r.req?h():r.on("request",h)):o&&!i&&(r.on("end",a),r.on("close",a)),Jve(r)&&r.on("exit",u),r.on("end",c),r.on("finish",l),e.error!==!1&&r.on("error",g),r.on("close",f),function(){r.removeListener("complete",l),r.removeListener("abort",f),r.removeListener("request",h),r.req&&r.req.removeListener("finish",l),r.removeListener("end",a),r.removeListener("close",a),r.removeListener("finish",l),r.removeListener("exit",u),r.removeListener("end",c),r.removeListener("error",g),r.removeListener("close",f)}};o8.exports=a8});var c8=w(($it,A8)=>{var Wve=Ok(),zve=Mk(),Kk=require("fs"),kd=function(){},_ve=/^v?\.0/.test(process.version),Qw=function(r){return typeof r=="function"},Vve=function(r){return!_ve||!Kk?!1:(r instanceof(Kk.ReadStream||kd)||r instanceof(Kk.WriteStream||kd))&&Qw(r.close)},Xve=function(r){return r.setHeader&&Qw(r.abort)},Zve=function(r,e,t,i){i=Wve(i);var n=!1;r.on("close",function(){n=!0}),zve(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Vve(r))return r.close(kd);if(Xve(r))return r.abort();if(Qw(r.destroy))return r.destroy();i(o||new Error("stream was destroyed"))}}},l8=function(r){r()},$ve=function(r,e){return r.pipe(e)},exe=function(){var r=Array.prototype.slice.call(arguments),e=Qw(r[r.length-1]||kd)&&r.pop()||kd;if(Array.isArray(r[0])&&(r=r[0]),r.length<2)throw new Error("pump requires two streams per minimum");var t,i=r.map(function(n,s){var o=s0;return Zve(n,o,a,function(l){t||(t=l),l&&i.forEach(l8),!o&&(i.forEach(l8),e(t))})});return r.reduce($ve)};A8.exports=exe});var g8=w((ent,u8)=>{"use strict";var{PassThrough:txe}=require("stream");u8.exports=r=>{r=N({},r);let{array:e}=r,{encoding:t}=r,i=t==="buffer",n=!1;e?n=!(t||i):t=t||"utf8",i&&(t=null);let s=new txe({objectMode:n});t&&s.setEncoding(t);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var f8=w((tnt,$g)=>{"use strict";var rxe=c8(),ixe=g8(),Uk=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Sw(r,e){if(!r)return Promise.reject(new Error("Expected a stream"));e=N({maxBuffer:Infinity},e);let{maxBuffer:t}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=rxe(r,ixe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>t&&o(new Uk)})}),i.getBufferedValue()}$g.exports=Sw;$g.exports.default=Sw;$g.exports.buffer=(r,e)=>Sw(r,te(N({},e),{encoding:"buffer"}));$g.exports.array=(r,e)=>Sw(r,te(N({},e),{array:!0}));$g.exports.MaxBufferError=Uk});var p8=w((int,h8)=>{"use strict";var nxe=[200,203,204,206,300,301,404,405,410,414,501],sxe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],oxe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},axe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Hk(r){let e={};if(!r)return e;let t=r.trim().split(/\s*,\s*/);for(let i of t){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function Axe(r){let e=[];for(let t in r){let i=r[t];e.push(i===!0?t:t+"="+i)}if(!!e.length)return e.join(", ")}h8.exports=class{constructor(e,t,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!t||!t.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in t?t.status:200,this._resHeaders=t.headers,this._rescc=Hk(t.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=Hk(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Axe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!t.headers["cache-control"]&&/no-cache/.test(t.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&sxe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||nxe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let t=Hk(e.headers["cache-control"]);return t["no-cache"]||/no-cache/.test(e.headers.pragma)||t["max-age"]&&this.age()>t["max-age"]||t["min-fresh"]&&this.timeToLive()<1e3*t["min-fresh"]||this.stale()&&!(t["max-stale"]&&!this._rescc["must-revalidate"]&&(t["max-stale"]===!0||t["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let t=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of t)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let t={};for(let i in e)oxe[i]||(t[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete t[n]}if(t.warning){let i=t.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?t.warning=i.join(",").trim():delete t.warning}return t}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(t)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let t=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let t=(this.now()-this._responseTime)/1e3;return e+t}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,t=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(t-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete t["if-none-match"],delete t["if-modified-since"],t;if(this._resHeaders.etag&&(t["if-none-match"]=t["if-none-match"]?`${t["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),t["accept-ranges"]||t["if-match"]||t["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete t["if-modified-since"],t["if-none-match"]){let n=t["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?t["if-none-match"]=n.join(",").trim():delete t["if-none-match"]}}else this._resHeaders["last-modified"]&&!t["if-modified-since"]&&(t["if-modified-since"]=this._resHeaders["last-modified"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),!t||!t.headers)throw Error("Response headers missing");let i=!1;if(t.status!==void 0&&t.status!=304?i=!1:t.headers.etag&&!/^\s*W\//.test(t.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===t.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!t.headers.etag&&!t.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,t),modified:t.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in t.headers&&!axe[o]?t.headers[o]:this._resHeaders[o];let s=Object.assign({},t,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var vw=w((nnt,d8)=>{"use strict";d8.exports=r=>{let e={};for(let[t,i]of Object.entries(r))e[t.toLowerCase()]=i;return e}});var E8=w((snt,C8)=>{"use strict";var lxe=require("stream").Readable,cxe=vw(),m8=class extends lxe{constructor(e,t,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof t!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=cxe(t),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};C8.exports=m8});var y8=w((ont,I8)=>{"use strict";var uxe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];I8.exports=(r,e)=>{let t=new Set(Object.keys(r).concat(uxe));for(let i of t)i in e||(e[i]=typeof r[i]=="function"?r[i].bind(r):r[i])}});var B8=w((ant,w8)=>{"use strict";var gxe=require("stream").PassThrough,fxe=y8(),hxe=r=>{if(!(r&&r.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new gxe;return fxe(r,e),r.pipe(e)};w8.exports=hxe});var b8=w(jk=>{jk.stringify=function r(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var t="",i=Array.isArray(e);t=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(t+=","),n=!1,i?e[s]==null?t+="null":t+=r(e[s]):e[s]!==void 0&&(t+=r(s)+":"+r(e[s])))}return t+=i?"]":"}",t}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};jk.parse=function(r){return JSON.parse(r,function(e,t){return typeof t=="string"?/^:base64:/.test(t)?Buffer.from(t.substring(8),"base64"):/^:/.test(t)?t.substring(1):t:t})}});var x8=w((lnt,Q8)=>{"use strict";var pxe=require("events"),S8=b8(),dxe=r=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(r.adapter||r.uri){let t=r.adapter||/^[^:]*/.exec(r.uri)[0];return new(require(e[t]))(r)}return new Map},v8=class extends pxe{constructor(e,t){super();if(this.opts=Object.assign({namespace:"keyv",serialize:S8.stringify,deserialize:S8.parse},typeof e=="string"?{uri:e}:e,t),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=dxe(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return t&&t.raw?n:n.value}})}set(e,t,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return t={value:t,expires:s},this.opts.serialize(t)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};Q8.exports=v8});var D8=w((cnt,k8)=>{"use strict";var Cxe=require("events"),xw=require("url"),mxe=e8(),Exe=f8(),Gk=p8(),P8=E8(),Ixe=vw(),yxe=B8(),wxe=x8(),ia=class{constructor(e,t){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new wxe({uri:typeof t=="string"&&t,store:typeof t!="string"&&t,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,i)=>{let n;if(typeof t=="string")n=Yk(xw.parse(t)),t={};else if(t instanceof xw.URL)n=Yk(xw.parse(t.toString())),t={};else{let[g,...f]=(t.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=Yk(te(N({},t),{pathname:g,search:h}))}t=N(N({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},t),Bxe(n)),t.headers=Ixe(t.headers);let s=new Cxe,o=mxe(xw.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${t.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(y=>{h=()=>{f||(f=!0,y())}}),m=y=>{if(l&&!g.forceRefresh){y.status=y.statusCode;let v=Gk.fromObject(l.cachePolicy).revalidatedPolicy(g,y);if(!v.modified){let x=v.policy.responseHeaders();y=new P8(l.statusCode,x,l.body,l.url),y.cachePolicy=v.policy,y.fromCache=!0}}y.fromCache||(y.cachePolicy=new Gk(g,y,g),y.fromCache=!1);let b;g.cache&&y.cachePolicy.storable()?(b=yxe(y),(async()=>{try{let v=Exe.buffer(y);if(await Promise.race([p,new Promise(Y=>y.once("end",Y))]),f)return;let x=await v,T={cachePolicy:y.cachePolicy.toObject(),url:y.url,statusCode:y.fromCache?l.statusCode:y.statusCode,body:x},q=g.strictTtl?y.cachePolicy.timeToLive():void 0;g.maxTtl&&(q=q?Math.min(q,g.maxTtl):g.maxTtl),await this.cache.set(a,T,q)}catch(v){s.emit("error",new ia.CacheError(v))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(v){s.emit("error",new ia.CacheError(v))}})(),s.emit("response",b||y),typeof i=="function"&&i(b||y)};try{let y=e(g,m);y.once("error",h),y.once("abort",h),s.emit("request",y)}catch(y){s.emit("error",new ia.RequestError(y))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let m=Gk.fromObject(p.cachePolicy);if(m.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let y=m.responseHeaders(),b=new P8(p.statusCode,y,p.body,p.url);b.cachePolicy=m,b.fromCache=!0,s.emit("response",b),typeof i=="function"&&i(b)}else l=p,h.headers=m.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new ia.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(t)}catch(h){t.automaticFailover&&!c&&u(t),s.emit("error",new ia.CacheError(h))}})(),s}}};function Bxe(r){let e=N({},r);return e.path=`${r.pathname||"/"}${r.search||""}`,delete e.pathname,delete e.search,e}function Yk(r){return{protocol:r.protocol,auth:r.auth,hostname:r.hostname||r.host||"localhost",port:r.port,pathname:r.pathname,search:r.search}}ia.RequestError=class extends Error{constructor(r){super(r.message);this.name="RequestError",Object.assign(this,r)}};ia.CacheError=class extends Error{constructor(r){super(r.message);this.name="CacheError",Object.assign(this,r)}};k8.exports=ia});var F8=w((unt,R8)=>{"use strict";var bxe=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];R8.exports=(r,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let t=new Set(Object.keys(r).concat(bxe)),i={};for(let n of t)n in e||(i[n]={get(){let s=r[n];return typeof s=="function"?s.bind(r):s},set(s){r[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),r.once("aborted",()=>{e.destroy(),e.emit("aborted")}),r.once("close",()=>{r.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var L8=w((gnt,N8)=>{"use strict";var{Transform:Qxe,PassThrough:Sxe}=require("stream"),qk=require("zlib"),vxe=F8();N8.exports=r=>{let e=(r.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return r;let t=e==="br";if(t&&typeof qk.createBrotliDecompress!="function")return r.destroy(new Error("Brotli is not supported on Node.js < 12")),r;let i=!0,n=new Qxe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new Sxe({autoDestroy:!1,destroy(a,l){r.destroy(),l(a)}}),o=t?qk.createBrotliDecompress():qk.createUnzip();return o.once("error",a=>{if(i&&!r.readable){s.end();return}s.destroy(a)}),vxe(r,s),r.pipe(n).pipe(o).pipe(s),s}});var Jk=w((fnt,T8)=>{"use strict";var O8=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};T8.exports=O8});var zk=w((hnt,M8)=>{"use strict";var xxe=require("events"),kxe=require("tls"),Pxe=require("http2"),Dxe=Jk(),gn=Symbol("currentStreamsCount"),K8=Symbol("request"),Ls=Symbol("cachedOriginSet"),ef=Symbol("gracefullyClosing"),Rxe=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Fxe=(r,e,t)=>{let i=0,n=r.length;for(;i>>1;t(r[s],e)?i=s+1:n=s}return i},Nxe=(r,e)=>r.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,Wk=(r,e)=>{for(let t of r)t[Ls].lengthe[Ls].includes(i))&&t[gn]+e[gn]<=e.remoteSettings.maxConcurrentStreams&&U8(t)},Lxe=(r,e)=>{for(let t of r)e[Ls].lengtht[Ls].includes(i))&&e[gn]+t[gn]<=t.remoteSettings.maxConcurrentStreams&&U8(e)},H8=({agent:r,isFree:e})=>{let t={};for(let i in r.sessions){let s=r.sessions[i].filter(o=>{let a=o[nA.kCurrentStreamsCount]{r[ef]=!0,r[gn]===0&&r.close()},nA=class extends xxe{constructor({timeout:e=6e4,maxSessions:t=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Dxe({maxSize:n})}static normalizeOrigin(e,t){return typeof e=="string"&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t="";if(e)for(let i of Rxe)e[i]&&(t+=`:${e[i]}`);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;let i=this.queue[e][t];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(t),a=nA.normalizeOrigin(e,t&&t.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let m=p.remoteSettings.maxConcurrentStreams;if(m=m||p[ef]||p.destroyed)continue;h||(g=m),y>f&&(h=p,f=y)}}if(h){if(i.length!==1){for(let{reject:p}of i){let m=new Error(`Expected the length of listeners to be 1, got ${i.length}. +Please report this to https://github.com/szmarczak/http2-wrapper/`);p(m)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=Pxe.connect(e,N({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},t));f[gn]=0,f[ef]=!1;let h=()=>f[gn]{this.tlsSessionCache.set(u,y)}),f.once("error",y=>{for(let{reject:b}of i)b(y);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let y=this.sessions[o];y.splice(y.indexOf(f),1),y.length===0&&delete this.sessions[o]}else{let y=new Error("Session closed without receiving a SETTINGS frame");y.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:b}of i)b(y);l()}this._tryToCreateNewSession(o,a)});let m=()=>{if(!(!(o in this.queue)||!h())){for(let y of f[Ls])if(y in this.queue[o]){let{listeners:b}=this.queue[o][y];for(;b.length!==0&&h();)b.shift().resolve(f);let v=this.queue[o];if(v[y].listeners.length===0&&(delete v[y],Object.keys(v).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[Ls]=f.originSet,!!h()&&(m(),Wk(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let y=new Error("Agent has been destroyed");for(let b of i)b.reject(y);f.destroy();return}f[Ls]=f.originSet;{let y=this.sessions;if(o in y){let b=y[o];b.splice(Fxe(b,f,Nxe),0,f)}else y[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),m(),l(),f[gn]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,t,i),i.length=0),f.on("remoteSettings",()=>{m(),Wk(this.sessions[o],f)})}),f[K8]=f.request,f.request=(y,b)=>{if(f[ef])throw new Error("The session is gracefully closing. No new streams are allowed.");let v=f[K8](y,b);return f.ref(),++f[gn],f[gn]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,v.once("close",()=>{if(p=h(),--f[gn],!f.destroyed&&!f.closed&&(Lxe(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let x=f[gn]===0;x&&f.unref(),x&&(this._freeSessionsCount>this.maxFreeSessions||f[ef])?f.close():(Wk(this.sessions[o],f),m())}}),v}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,t,i,n){return new Promise((s,o)=>{this.getSession(e,t,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,t){return nA.connect(e,t)}static connect(e,t){t.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof t.servername=="undefined"&&(t.servername=n),kxe.connect(i,n,t)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let t of e)t[gn]===0&&t.close()}destroy(e){for(let t of Object.values(this.sessions))for(let i of t)i.destroy(e);for(let t of Object.values(this.queue))for(let i of Object.values(t))i.destroyed=!0;this.queue={}}get freeSessions(){return H8({agent:this,isFree:!0})}get busySessions(){return H8({agent:this,isFree:!1})}};nA.kCurrentStreamsCount=gn;nA.kGracefullyClosing=ef;M8.exports={Agent:nA,globalAgent:new nA}});var _k=w((pnt,j8)=>{"use strict";var{Readable:Txe}=require("stream"),G8=class extends Txe{constructor(e,t){super({highWaterMark:t,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};j8.exports=G8});var Vk=w((dnt,Y8)=>{"use strict";Y8.exports=r=>{let e={protocol:r.protocol,hostname:typeof r.hostname=="string"&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return typeof r.port=="string"&&r.port.length!==0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var J8=w((Cnt,q8)=>{"use strict";q8.exports=(r,e,t)=>{for(let i of t)r.on(i,(...n)=>e.emit(i,...n))}});var z8=w((mnt,W8)=>{"use strict";W8.exports=r=>{switch(r){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var V8=w((Int,_8)=>{"use strict";var tf=(r,e,t)=>{_8.exports[e]=class extends r{constructor(...n){super(typeof t=="string"?t:t(n));this.name=`${super.name} [${e}]`,this.code=e}}};tf(TypeError,"ERR_INVALID_ARG_TYPE",r=>{let e=r[0].includes(".")?"property":"argument",t=r[1],i=Array.isArray(t);return i&&(t=`${t.slice(0,-1).join(", ")} or ${t.slice(-1)}`),`The "${r[0]}" ${e} must be ${i?"one of":"of"} type ${t}. Received ${typeof r[2]}`});tf(TypeError,"ERR_INVALID_PROTOCOL",r=>`Protocol "${r[0]}" not supported. Expected "${r[1]}"`);tf(Error,"ERR_HTTP_HEADERS_SENT",r=>`Cannot ${r[0]} headers after they are sent to the client`);tf(TypeError,"ERR_INVALID_HTTP_TOKEN",r=>`${r[0]} must be a valid HTTP token [${r[1]}]`);tf(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",r=>`Invalid value "${r[0]} for header "${r[1]}"`);tf(TypeError,"ERR_INVALID_CHAR",r=>`Invalid character in ${r[0]} [${r[1]}]`)});var eP=w((ynt,X8)=>{"use strict";var Oxe=require("http2"),{Writable:Mxe}=require("stream"),{Agent:Z8,globalAgent:Kxe}=zk(),Uxe=_k(),Hxe=Vk(),jxe=J8(),Gxe=z8(),{ERR_INVALID_ARG_TYPE:Xk,ERR_INVALID_PROTOCOL:Yxe,ERR_HTTP_HEADERS_SENT:$8,ERR_INVALID_HTTP_TOKEN:qxe,ERR_HTTP_INVALID_HEADER_VALUE:Jxe,ERR_INVALID_CHAR:Wxe}=V8(),{HTTP2_HEADER_STATUS:ez,HTTP2_HEADER_METHOD:tz,HTTP2_HEADER_PATH:rz,HTTP2_METHOD_CONNECT:zxe}=Oxe.constants,Wi=Symbol("headers"),Zk=Symbol("origin"),$k=Symbol("session"),iz=Symbol("options"),kw=Symbol("flushedHeaders"),Pd=Symbol("jobs"),_xe=/^[\^`\-\w!#$%&*+.|~]+$/,Vxe=/[^\t\u0020-\u007E\u0080-\u00FF]/,nz=class extends Mxe{constructor(e,t,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Hxe(e instanceof URL?e:new URL(e))),typeof t=="function"||t===void 0?(i=t,t=n?e:N({},e)):t=N(N({},e),t),t.h2session)this[$k]=t.h2session;else if(t.agent===!1)this.agent=new Z8({maxFreeSessions:0});else if(typeof t.agent=="undefined"||t.agent===null)typeof t.createConnection=="function"?(this.agent=new Z8({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=Kxe;else if(typeof t.agent.request=="function")this.agent=t.agent;else throw new Xk("options.agent",["Agent-like Object","undefined","false"],t.agent);if(t.protocol&&t.protocol!=="https:")throw new Yxe(t.protocol,"https:");let s=t.port||t.defaultPort||this.agent&&this.agent.defaultPort||443,o=t.hostname||t.host||"localhost";delete t.hostname,delete t.host,delete t.port;let{timeout:a}=t;if(t.timeout=void 0,this[Wi]=Object.create(null),this[Pd]=[],this.socket=null,this.connection=null,this.method=t.method||"GET",this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(let[l,c]of Object.entries(t.headers))this.setHeader(l,c);t.auth&&!("authorization"in this[Wi])&&(this[Wi].authorization="Basic "+Buffer.from(t.auth).toString("base64")),t.session=t.tlsSession,t.path=t.socketPath,this[iz]=t,s===443?(this[Zk]=`https://${o}`,":authority"in this[Wi]||(this[Wi][":authority"]=o)):(this[Zk]=`https://${o}:${s}`,":authority"in this[Wi]||(this[Wi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[kw]=!1}get method(){return this[Wi][tz]}set method(e){e&&(this[Wi][tz]=e.toUpperCase())}get path(){return this[Wi][rz]}set path(e){e&&(this[Wi][rz]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,t,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,t,i);this._request?n():this[Pd].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let t=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?t():this[Pd].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[kw]||this.destroyed)return;this[kw]=!0;let e=this.method===zxe,t=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||jxe(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new Uxe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[ez],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[ez]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[Pd])o();this.emit("socket",this.socket)};if(this[$k])try{t(this[$k].request(this[Wi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[Zk],this[iz],this[Wi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new Xk("name","string",e);return this[Wi][e.toLowerCase()]}get headersSent(){return this[kw]}removeHeader(e){if(typeof e!="string")throw new Xk("name","string",e);if(this.headersSent)throw new $8("remove");delete this[Wi][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new $8("set");if(typeof e!="string"||!_xe.test(e)&&!Gxe(e))throw new qxe("Header name",e);if(typeof t=="undefined")throw new Jxe(t,e);if(Vxe.test(t))throw new Wxe("header content",e);this[Wi][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){let i=()=>this._request.setTimeout(e,t);return this._request?i():this[Pd].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};X8.exports=nz});var oz=w((wnt,sz)=>{"use strict";var Xxe=require("tls");sz.exports=(r={})=>new Promise((e,t)=>{let i=Xxe.connect(r,()=>{r.resolveSocket?(i.off("error",t),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",t)})});var Az=w((Bnt,az)=>{"use strict";var Zxe=require("net");az.exports=r=>{let e=r.host,t=r.headers&&r.headers.host;return t&&(t.startsWith("[")?t.indexOf("]")===-1?e=t:e=t.slice(1,-1):e=t.split(":",1)[0]),Zxe.isIP(e)?"":e}});var uz=w((bnt,tP)=>{"use strict";var lz=require("http"),rP=require("https"),$xe=oz(),eke=Jk(),tke=eP(),rke=Az(),ike=Vk(),Pw=new eke({maxSize:100}),Dd=new Map,cz=(r,e,t)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{r.emit("free",e,t)};e.on("free",i);let n=()=>{r.removeSocket(e,t)};e.on("close",n);let s=()=>{r.removeSocket(e,t),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),r.emit("free",e,t)},nke=async r=>{let e=`${r.host}:${r.port}:${r.ALPNProtocols.sort()}`;if(!Pw.has(e)){if(Dd.has(e))return(await Dd.get(e)).alpnProtocol;let{path:t,agent:i}=r;r.path=r.socketPath;let n=$xe(r);Dd.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Pw.set(e,o),r.path=t,o==="h2")s.destroy();else{let{globalAgent:a}=rP,l=rP.Agent.prototype.createConnection;i?i.createConnection===l?cz(i,s,r):s.destroy():a.createConnection===l?cz(a,s,r):s.destroy()}return Dd.delete(e),o}catch(s){throw Dd.delete(e),s}}return Pw.get(e)};tP.exports=async(r,e,t)=>{if((typeof r=="string"||r instanceof URL)&&(r=ike(new URL(r))),typeof e=="function"&&(t=e,e=void 0),e=te(N(N({ALPNProtocols:["h2","http/1.1"]},r),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||rke(e),e.port=e.port||(i?443:80),e._defaultAgent=i?rP.globalAgent:lz.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await nke(e)==="h2"?(n&&(e.agent=n.http2),new tke(e,t)):lz.request(e,t)};tP.exports.protocolCache=Pw});var fz=w((Qnt,gz)=>{"use strict";var ske=require("http2"),oke=zk(),iP=eP(),ake=_k(),Ake=uz(),lke=(r,e,t)=>new iP(r,e,t),cke=(r,e,t)=>{let i=new iP(r,e,t);return i.end(),i};gz.exports=te(N(te(N({},ske),{ClientRequest:iP,IncomingMessage:ake}),oke),{request:lke,get:cke,auto:Ake})});var sP=w(nP=>{"use strict";Object.defineProperty(nP,"__esModule",{value:!0});var hz=iA();nP.default=r=>hz.default.nodeStream(r)&&hz.default.function_(r.getBoundary)});var mz=w(oP=>{"use strict";Object.defineProperty(oP,"__esModule",{value:!0});var pz=require("fs"),dz=require("util"),Cz=iA(),uke=sP(),gke=dz.promisify(pz.stat);oP.default=async(r,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!r)return 0;if(Cz.default.string(r))return Buffer.byteLength(r);if(Cz.default.buffer(r))return r.length;if(uke.default(r))return dz.promisify(r.getLength.bind(r))();if(r instanceof pz.ReadStream){let{size:t}=await gke(r.path);return t===0?void 0:t}}});var AP=w(aP=>{"use strict";Object.defineProperty(aP,"__esModule",{value:!0});function fke(r,e,t){let i={};for(let n of t)i[n]=(...s)=>{e.emit(n,...s)},r.on(n,i[n]);return()=>{for(let n of t)r.off(n,i[n])}}aP.default=fke});var Ez=w(lP=>{"use strict";Object.defineProperty(lP,"__esModule",{value:!0});lP.default=()=>{let r=[];return{once(e,t,i){e.once(t,i),r.push({origin:e,event:t,fn:i})},unhandleAll(){for(let e of r){let{origin:t,event:i,fn:n}=e;t.removeListener(i,n)}r.length=0}}}});var yz=w(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});Rd.TimeoutError=void 0;var hke=require("net"),pke=Ez(),Iz=Symbol("reentry"),dke=()=>{},cP=class extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`);this.event=t,this.name="TimeoutError",this.code="ETIMEDOUT"}};Rd.TimeoutError=cP;Rd.default=(r,e,t)=>{if(Iz in r)return dke;r[Iz]=!0;let i=[],{once:n,unhandleAll:s}=pke.default(),o=(g,f,h)=>{var p;let m=setTimeout(f,g,g,h);(p=m.unref)===null||p===void 0||p.call(m);let y=()=>{clearTimeout(m)};return i.push(y),y},{host:a,hostname:l}=t,c=(g,f)=>{r.destroy(new cP(g,f))},u=()=>{for(let g of i)g();s()};if(r.once("error",g=>{if(u(),r.listenerCount("error")===0)throw g}),r.once("close",u),n(r,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};r.setTimeout(e.socket,g),i.push(()=>{r.removeListener("timeout",g)})}return n(r,"socket",g=>{var f;let{socketPath:h}=r;if(g.connecting){let p=Boolean(h!=null?h:hke.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let m=o(e.lookup,c,"lookup");n(g,"lookup",m)}if(typeof e.connect!="undefined"){let m=()=>o(e.connect,c,"connect");p?n(g,"connect",m()):n(g,"lookup",y=>{y===null&&n(g,"connect",m())})}typeof e.secureConnect!="undefined"&&t.protocol==="https:"&&n(g,"connect",()=>{let m=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",m)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(r,"upload-complete",p())}):n(r,"upload-complete",p())}}),typeof e.response!="undefined"&&n(r,"upload-complete",()=>{let g=o(e.response,c,"response");n(r,"response",g)}),u}});var Bz=w(uP=>{"use strict";Object.defineProperty(uP,"__esModule",{value:!0});var wz=iA();uP.default=r=>{r=r;let e={protocol:r.protocol,hostname:wz.default.string(r.hostname)&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return wz.default.string(r.port)&&r.port.length>0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var bz=w(gP=>{"use strict";Object.defineProperty(gP,"__esModule",{value:!0});var Cke=require("url"),mke=["protocol","host","hostname","port","pathname","search"];gP.default=(r,e)=>{var t,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!r){if(!e.protocol)throw new TypeError("No URL protocol specified");r=`${e.protocol}//${(i=(t=e.hostname)!==null&&t!==void 0?t:e.host)!==null&&i!==void 0?i:""}`}let n=new Cke.URL(r);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of mke)e[s]&&(n[s]=e[s].toString());return n}});var Sz=w(fP=>{"use strict";Object.defineProperty(fP,"__esModule",{value:!0});var Qz=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){typeof e=="object"?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};fP.default=Qz});var pP=w(hP=>{"use strict";Object.defineProperty(hP,"__esModule",{value:!0});var Eke=async r=>{let e=[],t=0;for await(let i of r)e.push(i),t+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,t):Buffer.from(e.join(""))};hP.default=Eke});var xz=w(Vc=>{"use strict";Object.defineProperty(Vc,"__esModule",{value:!0});Vc.dnsLookupIpVersionToFamily=Vc.isDnsLookupIpVersion=void 0;var vz={auto:0,ipv4:4,ipv6:6};Vc.isDnsLookupIpVersion=r=>r in vz;Vc.dnsLookupIpVersionToFamily=r=>{if(Vc.isDnsLookupIpVersion(r))return vz[r];throw new Error("Invalid DNS lookup IP version")}});var dP=w(Dw=>{"use strict";Object.defineProperty(Dw,"__esModule",{value:!0});Dw.isResponseOk=void 0;Dw.isResponseOk=r=>{let{statusCode:e}=r,t=r.request.options.followRedirect?299:399;return e>=200&&e<=t||e===304}});var Pz=w(CP=>{"use strict";Object.defineProperty(CP,"__esModule",{value:!0});var kz=new Set;CP.default=r=>{kz.has(r)||(kz.add(r),process.emitWarning(`Got: ${r}`,{type:"DeprecationWarning"}))}});var Dz=w(mP=>{"use strict";Object.defineProperty(mP,"__esModule",{value:!0});var Ir=iA(),Ike=(r,e)=>{if(Ir.default.null_(r.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Ir.assert.any([Ir.default.string,Ir.default.undefined],r.encoding),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.resolveBodyOnly),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.methodRewriting),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.isStream),Ir.assert.any([Ir.default.string,Ir.default.undefined],r.responseType),r.responseType===void 0&&(r.responseType="text");let{retry:t}=r;if(e?r.retry=N({},e.retry):r.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ir.default.object(t)?(r.retry=N(N({},r.retry),t),r.retry.methods=[...new Set(r.retry.methods.map(i=>i.toUpperCase()))],r.retry.statusCodes=[...new Set(r.retry.statusCodes)],r.retry.errorCodes=[...new Set(r.retry.errorCodes)]):Ir.default.number(t)&&(r.retry.limit=t),Ir.default.undefined(r.retry.maxRetryAfter)&&(r.retry.maxRetryAfter=Math.min(...[r.timeout.request,r.timeout.connect].filter(Ir.default.number))),Ir.default.object(r.pagination)){e&&(r.pagination=N(N({},e.pagination),r.pagination));let{pagination:i}=r;if(!Ir.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Ir.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Ir.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Ir.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return r.responseType==="json"&&r.headers.accept===void 0&&(r.headers.accept="application/json"),r};mP.default=Ike});var Rz=w(Fd=>{"use strict";Object.defineProperty(Fd,"__esModule",{value:!0});Fd.retryAfterStatusCodes=void 0;Fd.retryAfterStatusCodes=new Set([413,429,503]);var yke=({attemptCount:r,retryOptions:e,error:t,retryAfter:i})=>{if(r>e.limit)return 0;let n=e.methods.includes(t.options.method),s=e.errorCodes.includes(t.code),o=t.response&&e.statusCodes.includes(t.response.statusCode);if(!n||!s&&!o)return 0;if(t.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(t.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(r-1)*1e3+a};Fd.default=yke});var Ld=w(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.UnsupportedProtocolError=qt.ReadError=qt.TimeoutError=qt.UploadError=qt.CacheError=qt.HTTPError=qt.MaxRedirectsError=qt.RequestError=qt.setNonEnumerableProperties=qt.knownHookEvents=qt.withoutBody=qt.kIsNormalizedAlready=void 0;var Fz=require("util"),Nz=require("stream"),wke=require("fs"),gl=require("url"),Lz=require("http"),EP=require("http"),Bke=require("https"),bke=Y4(),Qke=X4(),Tz=D8(),Ske=L8(),vke=fz(),xke=vw(),Ee=iA(),kke=mz(),Oz=sP(),Pke=AP(),Mz=yz(),Dke=Bz(),Kz=bz(),Rke=Sz(),Fke=pP(),Uz=xz(),Nke=dP(),fl=Pz(),Lke=Dz(),Tke=Rz(),IP,Fi=Symbol("request"),Rw=Symbol("response"),rf=Symbol("responseSize"),nf=Symbol("downloadedSize"),sf=Symbol("bodySize"),of=Symbol("uploadedSize"),Fw=Symbol("serverResponsesPiped"),Hz=Symbol("unproxyEvents"),jz=Symbol("isFromCache"),yP=Symbol("cancelTimeouts"),Gz=Symbol("startedReading"),af=Symbol("stopReading"),Nw=Symbol("triggerRead"),hl=Symbol("body"),Nd=Symbol("jobs"),Yz=Symbol("originalResponse"),qz=Symbol("retryTimeout");qt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Oke=Ee.default.string(process.versions.brotli);qt.withoutBody=new Set(["GET","HEAD"]);qt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function Mke(r){for(let e in r){let t=r[e];if(!Ee.default.string(t)&&!Ee.default.number(t)&&!Ee.default.boolean(t)&&!Ee.default.null_(t)&&!Ee.default.undefined(t))throw new TypeError(`The \`searchParams\` value '${String(t)}' must be a string, number, boolean or null`)}}function Kke(r){return Ee.default.object(r)&&!("statusCode"in r)}var wP=new Rke.default,Uke=async r=>new Promise((e,t)=>{let i=n=>{t(n)};r.pending||e(),r.once("error",i),r.once("ready",()=>{r.off("error",i),e()})}),Hke=new Set([300,301,302,303,304,307,308]),jke=["context","body","json","form"];qt.setNonEnumerableProperties=(r,e)=>{let t={};for(let i of r)if(!!i)for(let n of jke)n in i&&(t[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,t)};var hi=class extends Error{constructor(e,t,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=t.code,i instanceof BP?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Rw]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,Ee.default.string(t.stack)&&Ee.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` +`).reverse(),a=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split(` +`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` +`)}${a.reverse().join(` +`)}`}}};qt.RequestError=hi;var bP=class extends hi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};qt.MaxRedirectsError=bP;var QP=class extends hi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};qt.HTTPError=QP;var SP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="CacheError"}};qt.CacheError=SP;var vP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="UploadError"}};qt.UploadError=vP;var xP=class extends hi{constructor(e,t,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=t}};qt.TimeoutError=xP;var Lw=class extends hi{constructor(e,t){super(e.message,e,t);this.name="ReadError"}};qt.ReadError=Lw;var kP=class extends hi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};qt.UnsupportedProtocolError=kP;var Gke=["socket","connect","continue","information","upgrade","timeout"],BP=class extends Nz.Duplex{constructor(e,t={},i){super({autoDestroy:!1,highWaterMark:0});this[nf]=0,this[of]=0,this.requestInitialized=!1,this[Fw]=new Set,this.redirects=[],this[af]=!1,this[Nw]=!1,this[Nd]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof EP.IncomingMessage&&(this.options.headers=N(N({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=t;if((o||a||l)&&this._lockWrite(),qt.kIsNormalizedAlready in t)this.options=t;else try{this.options=this.constructor.normalizeArguments(e,t,i)}catch(c){Ee.default.nodeStream(t.body)&&t.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof wke.ReadStream&&await Uke(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Fi])===null||c===void 0||c.destroy();return}for(let g of this[Nd])g();this[Nd].length=0,this.requestInitialized=!0}catch(u){if(u instanceof hi){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,t,i){var n,s,o,a,l;let c=t;if(Ee.default.object(e)&&!Ee.default.urlInstance(e))t=N(N(N({},i),e),t);else{if(e&&t&&t.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");t=N(N({},i),t),e!==void 0&&(t.url=e),Ee.default.urlInstance(t.url)&&(t.url=new gl.URL(t.url.toString()))}if(t.cache===!1&&(t.cache=void 0),t.dnsCache===!1&&(t.dnsCache=void 0),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.method),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.headers),Ee.assert.any([Ee.default.string,Ee.default.urlInstance,Ee.default.undefined],t.prefixUrl),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cookieJar),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.searchParams),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.cache),Ee.assert.any([Ee.default.object,Ee.default.number,Ee.default.undefined],t.timeout),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.context),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.hooks),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.decompress),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.ignoreInvalidCookies),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.followRedirect),Ee.assert.any([Ee.default.number,Ee.default.undefined],t.maxRedirects),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.throwHttpErrors),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.http2),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.allowGetBody),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.localAddress),Ee.assert.any([Uz.isDnsLookupIpVersion,Ee.default.undefined],t.dnsLookupIpVersion),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.https),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.rejectUnauthorized),t.https&&(Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.https.rejectUnauthorized),Ee.assert.any([Ee.default.function_,Ee.default.undefined],t.https.checkServerIdentity),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificateAuthority),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.key),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificate),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.https.passphrase),Ee.assert.any([Ee.default.string,Ee.default.buffer,Ee.default.array,Ee.default.undefined],t.https.pfx)),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cacheOptions),Ee.default.string(t.method)?t.method=t.method.toUpperCase():t.method="GET",t.headers===(i==null?void 0:i.headers)?t.headers=N({},t.headers):t.headers=xke(N(N({},i==null?void 0:i.headers),t.headers)),"slashes"in t)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in t)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in t&&t.searchParams&&t.searchParams!==(i==null?void 0:i.searchParams)){let h;if(Ee.default.string(t.searchParams)||t.searchParams instanceof gl.URLSearchParams)h=new gl.URLSearchParams(t.searchParams);else{Mke(t.searchParams),h=new gl.URLSearchParams;for(let p in t.searchParams){let m=t.searchParams[p];m===null?h.append(p,""):m!==void 0&&h.append(p,m)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,m)=>{h.has(m)||h.append(m,p)}),t.searchParams=h}if(t.username=(s=t.username)!==null&&s!==void 0?s:"",t.password=(o=t.password)!==null&&o!==void 0?o:"",Ee.default.undefined(t.prefixUrl)?t.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(t.prefixUrl=t.prefixUrl.toString(),t.prefixUrl!==""&&!t.prefixUrl.endsWith("/")&&(t.prefixUrl+="/")),Ee.default.string(t.url)){if(t.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");t.url=Kz.default(t.prefixUrl+t.url,t)}else(Ee.default.undefined(t.url)&&t.prefixUrl!==""||t.protocol)&&(t.url=Kz.default(t.prefixUrl,t));if(t.url){"port"in t&&delete t.port;let{prefixUrl:h}=t;Object.defineProperty(t,"prefixUrl",{set:m=>{let y=t.url;if(!y.href.startsWith(m))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${m}: ${y.href}`);t.url=new gl.URL(m+y.href.slice(h.length)),h=m},get:()=>h});let{protocol:p}=t.url;if(p==="unix:"&&(p="http:",t.url=new gl.URL(`http://unix${t.url.pathname}${t.url.search}`)),t.searchParams&&(t.url.search=t.searchParams.toString()),p!=="http:"&&p!=="https:")throw new kP(t);t.username===""?t.username=t.url.username:t.url.username=t.username,t.password===""?t.password=t.url.password:t.url.password=t.password}let{cookieJar:u}=t;if(u){let{setCookie:h,getCookieString:p}=u;Ee.assert.function_(h),Ee.assert.function_(p),h.length===4&&p.length===0&&(h=Fz.promisify(h.bind(t.cookieJar)),p=Fz.promisify(p.bind(t.cookieJar)),t.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=t;if(g&&(wP.has(g)||wP.set(g,new Tz((h,p)=>{let m=h[Fi](h,p);return Ee.default.promise(m)&&(m.once=(y,b)=>{if(y==="error")m.catch(b);else if(y==="abort")(async()=>{try{(await m).once("abort",b)}catch(v){}})();else throw new Error(`Unknown HTTP2 promise event: ${y}`);return m}),m},g))),t.cacheOptions=N({},t.cacheOptions),t.dnsCache===!0)IP||(IP=new Qke.default),t.dnsCache=IP;else if(!Ee.default.undefined(t.dnsCache)&&!t.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${Ee.default(t.dnsCache)}`);Ee.default.number(t.timeout)?t.timeout={request:t.timeout}:i&&t.timeout!==i.timeout?t.timeout=N(N({},i.timeout),t.timeout):t.timeout=N({},t.timeout),t.context||(t.context={});let f=t.hooks===(i==null?void 0:i.hooks);t.hooks=N({},t.hooks);for(let h of qt.knownHookEvents)if(h in t.hooks)if(Ee.default.array(t.hooks[h]))t.hooks[h]=[...t.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${Ee.default(t.hooks[h])}`);else t.hooks[h]=[];if(i&&!f)for(let h of qt.knownHookEvents)i.hooks[h].length>0&&(t.hooks[h]=[...i.hooks[h],...t.hooks[h]]);if("family"in t&&fl.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(t.https=N(N({},i.https),t.https)),"rejectUnauthorized"in t&&fl.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in t&&fl.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in t&&fl.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in t&&fl.default('"options.key" was never documented, please use "options.https.key"'),"cert"in t&&fl.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in t&&fl.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in t&&fl.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in t)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(t.agent){for(let h in t.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return t.maxRedirects=(l=t.maxRedirects)!==null&&l!==void 0?l:0,qt.setNonEnumerableProperties([i,c],t),Lke.default(t,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:t}=e,i=!Ee.default.undefined(e.form),n=!Ee.default.undefined(e.json),s=!Ee.default.undefined(e.body),o=i||n||s,a=qt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof Nz.Readable)&&!Ee.default.string(e.body)&&!Ee.default.buffer(e.body)&&!Oz.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!Ee.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!Ee.default.string(t["content-type"]);s?(Oz.default(e.body)&&l&&(t["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[hl]=e.body):i?(l&&(t["content-type"]="application/x-www-form-urlencoded"),this[hl]=new gl.URLSearchParams(e.form).toString()):(l&&(t["content-type"]="application/json"),this[hl]=e.stringifyJson(e.json));let c=await kke.default(this[hl],e.headers);Ee.default.undefined(t["content-length"])&&Ee.default.undefined(t["transfer-encoding"])&&!a&&!Ee.default.undefined(c)&&(t["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[sf]=Number(t["content-length"])||void 0}async _onResponseBase(e){let{options:t}=this,{url:i}=t;this[Yz]=e,t.decompress&&(e=Ske(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:Lz.STATUS_CODES[n],s.url=t.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[jz]=s.isFromCache,this[rf]=Number(e.headers["content-length"])||void 0,this[Rw]=e,e.once("end",()=>{this[rf]=this[nf],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new Lw(a,this))}),e.once("aborted",()=>{this._beforeError(new Lw({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(Ee.default.object(t.cookieJar)&&o){let a=o.map(async l=>t.cookieJar.setCookie(l,i.toString()));t.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(t.followRedirect&&e.headers.location&&Hke.has(n)){if(e.resume(),this[Fi]&&(this[yP](),delete this[Fi],this[Hz]()),(n===303&&t.method!=="GET"&&t.method!=="HEAD"||!t.methodRewriting)&&(t.method="GET","body"in t&&delete t.body,"json"in t&&delete t.json,"form"in t&&delete t.form,this[hl]=void 0,delete t.headers["content-length"]),this.redirects.length>=t.maxRedirects){this._beforeError(new bP(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new gl.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in t.headers&&delete t.headers.host,"cookie"in t.headers&&delete t.headers.cookie,"authorization"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(t.username="",t.password="")):(c.username=t.username,c.password=t.password),this.redirects.push(u),t.url=c;for(let g of t.hooks.beforeRedirect)await g(t,s);this.emit("redirect",s,t),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(t.isStream&&t.throwHttpErrors&&!Nke.isResponseOk(s)){this._beforeError(new QP(s));return}e.on("readable",()=>{this[Nw]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Fw])if(!a.headersSent){for(let l in e.headers){let c=t.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(t){this._beforeError(t)}}_onRequest(e){let{options:t}=this,{timeout:i,url:n}=t;bke.default(e),this[yP]=Mz.default(e,i,n);let s=t.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof Mz.TimeoutError?new xP(l,this.timings,this):new hi(l.message,l,this),this._beforeError(l)}),this[Hz]=Pke.default(e,this,Gke),this[Fi]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[hl],a=this.redirects.length===0?this:e;Ee.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new vP(l,this))})):(this._unlockWrite(),Ee.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,t){return new Promise((i,n)=>{Object.assign(t,Dke.default(e)),delete t.url;let s,o=wP.get(t.cache)(t,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});t.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,t,i,n,s;let{options:o}=this,{headers:a}=o;for(let b in a)if(Ee.default.undefined(a[b]))delete a[b];else if(Ee.default.null_(a[b]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${b}\` header`);if(o.decompress&&Ee.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=Oke?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let b=await o.cookieJar.getCookieString(o.url.toString());Ee.default.nonEmptyString(b)&&(o.headers.cookie=b)}for(let b of o.hooks.beforeRequest){let v=await b(o);if(!Ee.default.undefined(v)){o.request=()=>v;break}}o.body&&this[hl]!==o.body&&(this[hl]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let b=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(b==null?void 0:b.groups){let{socketPath:v,path:x}=b.groups;Object.assign(o,{socketPath:v,path:x,host:""})}}let f=g.protocol==="https:",h;o.http2?h=vke.auto:h=f?Bke.request:Lz.request;let p=(e=o.request)!==null&&e!==void 0?e:h,m=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Fi]=p,delete o.request,delete o.timeout;let y=o;if(y.shared=(t=o.cacheOptions)===null||t===void 0?void 0:t.shared,y.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,y.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,y.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{y.family=Uz.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(b){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(y.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(y.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(y.ca=o.https.certificateAuthority),o.https.certificate&&(y.cert=o.https.certificate),o.https.key&&(y.key=o.https.key),o.https.passphrase&&(y.passphrase=o.https.passphrase),o.https.pfx&&(y.pfx=o.https.pfx));try{let b=await m(g,y);Ee.default.undefined(b)&&(b=h(g,y)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete y.rejectUnauthorized,o.https.checkServerIdentity&&delete y.checkServerIdentity,o.https.certificateAuthority&&delete y.ca,o.https.certificate&&delete y.cert,o.https.key&&delete y.key,o.https.passphrase&&delete y.passphrase,o.https.pfx&&delete y.pfx),Kke(b)?this._onRequest(b):this.writable?(this.once("finish",()=>{this._onResponse(b)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(b)}catch(b){throw b instanceof Tz.CacheError?new SP(b,this):new hi(b.message,b,this)}}async _error(e){try{for(let t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new hi(t.message,t,this)}this.destroy(e)}_beforeError(e){if(this[af])return;let{options:t}=this,i=this.retryCount+1;this[af]=!0,e instanceof hi||(e=new hi(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await Fke.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await t.retry.calculateDelay({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:Tke.default({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new hi(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new hi(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[qz]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Nw]=!0;let e=this[Rw];if(e&&!this[af]){e.readableLength&&(this[Nw]=!1);let t;for(;(t=e.read())!==null;){this[nf]+=t.length,this[Gz]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(t)}}}_write(e,t,i){let n=()=>{this._writeRequest(e,t,i)};this.requestInitialized?n():this[Nd].push(n)}_writeRequest(e,t,i){this[Fi].destroyed||(this._progressCallbacks.push(()=>{this[of]+=Buffer.byteLength(e,t);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Fi].write(e,t,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let t=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Fi in this)){e();return}if(this[Fi].destroyed){e();return}this[Fi].end(i=>{i||(this[sf]=this[of],this.emit("uploadProgress",this.uploadProgress),this[Fi].emit("upload-complete")),e(i)})};this.requestInitialized?t():this[Nd].push(t)}_destroy(e,t){var i;this[af]=!0,clearTimeout(this[qz]),Fi in this&&(this[yP](),((i=this[Rw])===null||i===void 0?void 0:i.complete)||this[Fi].destroy()),e!==null&&!Ee.default.undefined(e)&&!(e instanceof hi)&&(e=new hi(e.message,e,this)),t(e)}get _isAboutToError(){return this[af]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,t,i;return((t=(e=this[Fi])===null||e===void 0?void 0:e.destroyed)!==null&&t!==void 0?t:this.destroyed)&&!((i=this[Yz])===null||i===void 0?void 0:i.complete)}get socket(){var e,t;return(t=(e=this[Fi])===null||e===void 0?void 0:e.socket)!==null&&t!==void 0?t:void 0}get downloadProgress(){let e;return this[rf]?e=this[nf]/this[rf]:this[rf]===this[nf]?e=1:e=0,{percent:e,transferred:this[nf],total:this[rf]}}get uploadProgress(){let e;return this[sf]?e=this[of]/this[sf]:this[sf]===this[of]?e=1:e=0,{percent:e,transferred:this[of],total:this[sf]}}get timings(){var e;return(e=this[Fi])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[jz]}pipe(e,t){if(this[Gz])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof EP.ServerResponse&&this[Fw].add(e),super.pipe(e,t)}unpipe(e){return e instanceof EP.ServerResponse&&this[Fw].delete(e),super.unpipe(e),this}};qt.default=BP});var Td=w(Co=>{"use strict";var Yke=Co&&Co.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),qke=Co&&Co.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Yke(e,r,t)};Object.defineProperty(Co,"__esModule",{value:!0});Co.CancelError=Co.ParseError=void 0;var Jz=Ld(),Wz=class extends Jz.RequestError{constructor(e,t){let{options:i}=t.request;super(`${e.message} in "${i.url.toString()}"`,e,t.request);this.name="ParseError"}};Co.ParseError=Wz;var zz=class extends Jz.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Co.CancelError=zz;qke(Ld(),Co)});var Vz=w(PP=>{"use strict";Object.defineProperty(PP,"__esModule",{value:!0});var _z=Td(),Jke=(r,e,t,i)=>{let{rawBody:n}=r;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":t(n.toString());if(e==="buffer")return n;throw new _z.ParseError({message:`Unknown body type '${e}'`,name:"Error"},r)}catch(s){throw new _z.ParseError(s,r)}};PP.default=Jke});var DP=w(pl=>{"use strict";var Wke=pl&&pl.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),zke=pl&&pl.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Wke(e,r,t)};Object.defineProperty(pl,"__esModule",{value:!0});var _ke=require("events"),Vke=iA(),Xke=j4(),Tw=Td(),Xz=Vz(),Zz=Ld(),Zke=AP(),$ke=pP(),$z=dP(),ePe=["request","response","redirect","uploadProgress","downloadProgress"];function e5(r){let e,t,i=new _ke.EventEmitter,n=new Xke((o,a,l)=>{let c=u=>{let g=new Zz.default(void 0,r);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Tw.CancelError(g))),e=g,g.once("response",async p=>{var m;if(p.retryCount=u,p.request.aborted)return;let y;try{y=await $ke.default(g),p.rawBody=y}catch(T){return}if(g._isAboutToError)return;let b=((m=p.headers["content-encoding"])!==null&&m!==void 0?m:"").toLowerCase(),v=["gzip","deflate","br"].includes(b),{options:x}=g;if(v&&!x.decompress)p.body=y;else try{p.body=Xz.default(p,x.responseType,x.parseJson,x.encoding)}catch(T){if(p.body=y.toString(),$z.isResponseOk(p)){g._beforeError(T);return}}try{for(let[T,q]of x.hooks.afterResponse.entries())p=await q(p,async Y=>{let $=Zz.default.normalizeArguments(void 0,te(N({},Y),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),x);$.hooks.afterResponse=$.hooks.afterResponse.slice(0,T);for(let ne of $.hooks.beforeRetry)await ne($);let _=e5($);return l(()=>{_.catch(()=>{}),_.cancel()}),_})}catch(T){g._beforeError(new Tw.RequestError(T.message,T,g));return}if(!$z.isResponseOk(p)){g._beforeError(new Tw.HTTPError(p));return}t=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:m}=g;if(p instanceof Tw.HTTPError&&!m.throwHttpErrors){let{response:y}=p;o(g.options.resolveBodyOnly?y.body:y);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,m)=>{var y,b;if(h===((y=m.request)===null||y===void 0?void 0:y.options.body)&&Vke.default.nodeStream((b=m.request)===null||b===void 0?void 0:b.options.body)){f(m);return}c(p)}),Zke.default(g,i,ePe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=t.request;return Xz.default(t,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}pl.default=e5;zke(Td(),pl)});var t5=w(RP=>{"use strict";Object.defineProperty(RP,"__esModule",{value:!0});var tPe=Td();function rPe(r,...e){let t=(async()=>{if(r instanceof tPe.RequestError)try{for(let n of e)if(n)for(let s of n)r=await s(r)}catch(n){r=n}throw r})(),i=()=>t;return t.json=i,t.text=i,t.buffer=i,t.on=i,t}RP.default=rPe});var n5=w(FP=>{"use strict";Object.defineProperty(FP,"__esModule",{value:!0});var r5=iA();function i5(r){for(let e of Object.values(r))(r5.default.plainObject(e)||r5.default.array(e))&&i5(e);return Object.freeze(r)}FP.default=i5});var o5=w(s5=>{"use strict";Object.defineProperty(s5,"__esModule",{value:!0})});var NP=w(Ts=>{"use strict";var iPe=Ts&&Ts.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),nPe=Ts&&Ts.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&iPe(e,r,t)};Object.defineProperty(Ts,"__esModule",{value:!0});Ts.defaultHandler=void 0;var a5=iA(),Os=DP(),sPe=t5(),Ow=Ld(),oPe=n5(),aPe={RequestError:Os.RequestError,CacheError:Os.CacheError,ReadError:Os.ReadError,HTTPError:Os.HTTPError,MaxRedirectsError:Os.MaxRedirectsError,TimeoutError:Os.TimeoutError,ParseError:Os.ParseError,CancelError:Os.CancelError,UnsupportedProtocolError:Os.UnsupportedProtocolError,UploadError:Os.UploadError},APe=async r=>new Promise(e=>{setTimeout(e,r)}),{normalizeArguments:Mw}=Ow.default,A5=(...r)=>{let e;for(let t of r)e=Mw(void 0,t,e);return e},lPe=r=>r.isStream?new Ow.default(void 0,r):Os.default(r),cPe=r=>"defaults"in r&&"options"in r.defaults,uPe=["get","post","put","patch","head","delete"];Ts.defaultHandler=(r,e)=>e(r);var l5=(r,e)=>{if(r)for(let t of r)t(e)},c5=r=>{r._rawHandlers=r.handlers,r.handlers=r.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>r.handlers[l++](u,l===r.handlers.length?lPe:c);if(a5.default.plainObject(i)){let u=N(N({},i),n);Ow.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{l5(r.options.hooks.init,n),l5((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Mw(i,n,s!=null?s:r.options);if(g[Ow.kIsNormalizedAlready]=!0,u)throw new Os.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return sPe.default(u,r.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[r.options],s=[...r._rawHandlers],o;for(let a of i)cPe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==Ts.defaultHandler),s.length===0&&s.push(Ts.defaultHandler),c5({options:A5(...n),handlers:s,mutableDefaults:Boolean(o)})};let t=async function*(i,n){let s=Mw(i,n,r.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!a5.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of t(i,n))s.push(o);return s},e.paginate.each=t,e.stream=(i,n)=>e(i,te(N({},n),{isStream:!0}));for(let i of uPe)e[i]=(n,s)=>e(n,te(N({},s),{method:i})),e.stream[i]=(n,s)=>e(n,te(N({},s),{method:i,isStream:!0}));return Object.assign(e,aPe),Object.defineProperty(e,"defaults",{value:r.mutableDefaults?r:oPe.default(r),writable:r.mutableDefaults,configurable:r.mutableDefaults,enumerable:!0}),e.mergeOptions=A5,e};Ts.default=c5;nPe(o5(),Ts)});var Uw=w((sA,Kw)=>{"use strict";var gPe=sA&&sA.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),u5=sA&&sA.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&gPe(e,r,t)};Object.defineProperty(sA,"__esModule",{value:!0});var fPe=require("url"),g5=NP(),hPe={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:r})=>r},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:r=>r.request.options.responseType==="json"?r.body:JSON.parse(r.body),paginate:r=>{if(!Reflect.has(r.headers,"link"))return!1;let e=r.headers.link.split(","),t;for(let i of e){let n=i.split(";");if(n[1].includes("next")){t=n[0].trimStart().trim(),t=t.slice(1,-1);break}}return t?{url:new fPe.URL(t)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:r=>JSON.parse(r),stringifyJson:r=>JSON.stringify(r),cacheOptions:{}},handlers:[g5.defaultHandler],mutableDefaults:!1},LP=g5.default(hPe);sA.default=LP;Kw.exports=LP;Kw.exports.default=LP;Kw.exports.__esModule=!0;u5(NP(),sA);u5(DP(),sA)});var d5=w(Af=>{"use strict";var znt=require("net"),pPe=require("tls"),TP=require("http"),f5=require("https"),dPe=require("events"),_nt=require("assert"),CPe=require("util");Af.httpOverHttp=mPe;Af.httpsOverHttp=EPe;Af.httpOverHttps=IPe;Af.httpsOverHttps=yPe;function mPe(r){var e=new oA(r);return e.request=TP.request,e}function EPe(r){var e=new oA(r);return e.request=TP.request,e.createSocket=h5,e.defaultPort=443,e}function IPe(r){var e=new oA(r);return e.request=f5.request,e}function yPe(r){var e=new oA(r);return e.request=f5.request,e.createSocket=h5,e.defaultPort=443,e}function oA(r){var e=this;e.options=r||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||TP.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=p5(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};oA.prototype.createSocket=function(e,t){var i=this,n={};i.sockets.push(n);var s=OP({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),dl("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){dl("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){dl("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return dl("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,t(f)}function u(g){o.removeAllListeners(),dl(`tunneling socket could not be established, cause=%s +`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};oA.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(t!==-1){this.sockets.splice(t,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function h5(r,e){var t=this;oA.prototype.createSocket.call(t,r,function(i){var n=r.request.getHeader("host"),s=OP({},t.options,{socket:i,servername:n?n.replace(/:.*$/,""):r.host}),o=pPe.connect(0,s);t.sockets[t.sockets.indexOf(i)]=o,e(o)})}function p5(r,e,t){return typeof r=="string"?{host:r,port:e,localAddress:t}:r}function OP(r){for(var e=1,t=arguments.length;e{C5.exports=d5()});var x5=w((Gw,jP)=>{var v5=Object.assign({},require("fs")),GP=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(e){e=e||{};var t=typeof e!="undefined"?e:{},i,n;t.ready=new Promise(function(d,E){i=d,n=E});var s={},o;for(o in t)t.hasOwnProperty(o)&&(s[o]=t[o]);var a=[],l="./this.program",c=function(d,E){throw E},u=!1,g=!0,f="";function h(d){return t.locateFile?t.locateFile(d,f):f+d}var p,m,y,b;g&&(u?f=require("path").dirname(f)+"/":f=__dirname+"/",p=function(E,I){var D=xa(E);return D?I?D:D.toString():(y||(y=v5),b||(b=require("path")),E=b.normalize(E),y.readFileSync(E,I?null:"utf8"))},m=function(E){var I=p(E,!0);return I.buffer||(I=new Uint8Array(I)),Z(I.buffer),I},process.argv.length>1&&(l=process.argv[1].replace(/\\/g,"/")),a=process.argv.slice(2),c=function(d){process.exit(d)},t.inspect=function(){return"[Emscripten Module object]"});var v=t.print||console.log.bind(console),x=t.printErr||console.warn.bind(console);for(o in s)s.hasOwnProperty(o)&&(t[o]=s[o]);s=null,t.arguments&&(a=t.arguments),t.thisProgram&&(l=t.thisProgram),t.quit&&(c=t.quit);var T=16;function q(d,E){return E||(E=T),Math.ceil(d/E)*E}var Y=0,$=function(d){Y=d},_;t.wasmBinary&&(_=t.wasmBinary);var ne=t.noExitRuntime||!0;typeof WebAssembly!="object"&&vr("no native wasm support detected");function ee(d,E,I){switch(E=E||"i8",E.charAt(E.length-1)==="*"&&(E="i32"),E){case"i1":return pe[d>>0];case"i8":return pe[d>>0];case"i16":return Qe[d>>1];case"i32":return fe[d>>2];case"i64":return fe[d>>2];case"float":return Ht[d>>2];case"double":return Mt[d>>3];default:vr("invalid type for getValue: "+E)}return null}var A,oe=!1,ce;function Z(d,E){d||vr("Assertion failed: "+E)}function O(d){var E=t["_"+d];return Z(E,"Cannot call unknown function "+d+", make sure it is exported"),E}function L(d,E,I,D,M){var z={string:function(st){var yt=0;if(st!=null&&st!==0){var xe=(st.length<<2)+1;yt=B(xe),be(st,yt,xe)}return yt},array:function(st){var yt=B(st.length);return Ke(st,yt),yt}};function ie(st){return E==="string"?re(st):E==="boolean"?Boolean(st):st}var we=O(d),me=[],_e=0;if(D)for(var ot=0;ot=D);)++M;if(M-E>16&&d.subarray&&Be)return Be.decode(d.subarray(E,M));for(var z="";E>10,56320|_e&1023)}}return z}function re(d,E){return d?je(V,d,E):""}function se(d,E,I,D){if(!(D>0))return 0;for(var M=I,z=I+D-1,ie=0;ie=55296&&we<=57343){var me=d.charCodeAt(++ie);we=65536+((we&1023)<<10)|me&1023}if(we<=127){if(I>=z)break;E[I++]=we}else if(we<=2047){if(I+1>=z)break;E[I++]=192|we>>6,E[I++]=128|we&63}else if(we<=65535){if(I+2>=z)break;E[I++]=224|we>>12,E[I++]=128|we>>6&63,E[I++]=128|we&63}else{if(I+3>=z)break;E[I++]=240|we>>18,E[I++]=128|we>>12&63,E[I++]=128|we>>6&63,E[I++]=128|we&63}}return E[I]=0,I-M}function be(d,E,I){return se(d,V,E,I)}function he(d){for(var E=0,I=0;I=55296&&D<=57343&&(D=65536+((D&1023)<<10)|d.charCodeAt(++I)&1023),D<=127?++E:D<=2047?E+=2:D<=65535?E+=3:E+=4}return E}function Fe(d){var E=he(d)+1,I=Et(E);return I&&se(d,pe,I,E),I}function Ke(d,E){pe.set(d,E)}function ke(d,E){return d%E>0&&(d+=E-d%E),d}var ve,pe,V,Qe,le,fe,gt,Ht,Mt;function Ei(d){ve=d,t.HEAP8=pe=new Int8Array(d),t.HEAP16=Qe=new Int16Array(d),t.HEAP32=fe=new Int32Array(d),t.HEAPU8=V=new Uint8Array(d),t.HEAPU16=le=new Uint16Array(d),t.HEAPU32=gt=new Uint32Array(d),t.HEAPF32=Ht=new Float32Array(d),t.HEAPF64=Mt=new Float64Array(d)}var jt=t.INITIAL_MEMORY||16777216,Qr,Oi=[],Xs=[],Un=[],Hn=!1;function Sr(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)ba(t.preRun.shift());ko(Oi)}function jn(){Hn=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ps.init(),ko(Xs)}function fs(){if(t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;)Nu(t.postRun.shift());ko(Un)}function ba(d){Oi.unshift(d)}function DA(d){Xs.unshift(d)}function Nu(d){Un.unshift(d)}var hs=0,RA=null,Qa=null;function Lu(d){return d}function FA(d){hs++,t.monitorRunDependencies&&t.monitorRunDependencies(hs)}function NA(d){if(hs--,t.monitorRunDependencies&&t.monitorRunDependencies(hs),hs==0&&(RA!==null&&(clearInterval(RA),RA=null),Qa)){var E=Qa;Qa=null,E()}}t.preloadedImages={},t.preloadedAudios={};function vr(d){t.onAbort&&t.onAbort(d),d+="",x(d),oe=!0,ce=1,d="abort("+d+"). Build with -s ASSERTIONS=1 for more info.";var E=new WebAssembly.RuntimeError(d);throw n(E),E}var zl="data:application/octet-stream;base64,";function Tu(d){return d.startsWith(zl)}var xo="data:application/octet-stream;base64,AGFzbQEAAAABlAInYAF/AX9gA39/fwF/YAF/AGACf38Bf2ACf38AYAV/f39/fwF/YAR/f39/AX9gA39/fwBgBH9+f38Bf2AAAX9gBX9/f35/AX5gA39+fwF/YAF/AX5gAn9+AX9gBH9/fn8BfmADf35/AX5gA39/fgF/YAR/f35/AX9gBn9/f39/fwF/YAR/f39/AGADf39+AX5gAn5/AX9gA398fwBgBH9/f38BfmADf39/AX5gBn98f39/fwF/YAV/f35/fwF/YAV/fn9/fwF/YAV/f39/fwBgAn9+AGACf38BfmACf3wAYAh/fn5/f39+fwF/YAV/f39+fwBgAABgBX5+f35/AX5gBX9/f39/AX5gAnx/AXxgAn9+AX4CeRQBYQFhAAIBYQFiAAABYQFjAAMBYQFkAAYBYQFlAAEBYQFmAAABYQFnAAYBYQFoAAABYQFpAAMBYQFqAAMBYQFrAAMBYQFsAAEBYQFtAAABYQFuAAUBYQFvAAEBYQFwAAMBYQFxAAEBYQFyAAABYQFzAAMBYQF0AAADggKAAgcCAgQAAQECAgANBA4EBwICAhwLEw0AFA0dAAAMDAIHHgwQAgIDAwICAQAIAAcIFBUEBgAADAAECAgDAQYAAgIBBgAfFwEBAwITAiAPBgIFEQMFAxgBCAIBAAAHBQEYABoSAQIABwQDIREIAyIGAAEBAwMAIwUbASQHAQsVAQMABQMEAA0bFw0BBAALCwMDDAwAAwAHJQMBAAgaAQECBQMBAgMDAAcHBwICAgImEQsICAsECQoJAgAAAAAAAAkFAAUFBQEGAwYGBgUSBgYBARIBAAIJBgABDgABAQ8ACQEEGQkJCQAAAAMECgoBAQIQAAAAAgEDAwAEAQoFAA4ACQAEBQFwAR8fBQcBAYACgIACBgkBfwFB0KDBAgsHvgI8AXUCAAF2AIABAXcAkwIBeADjAQF5APEBAXoA0QEBQQDQAQFCAM8BAUMAzgEBRADMAQFFAMsBAUYAyQEBRwCSAgFIAJECAUkAjwIBSgCKAgFLAOkBAUwA4gEBTQDhAQFOADwBTwD8AQFQAPkBAVEA+AEBUgDwAQFTAPoBAVQA4AEBVQAVAVYAGAFXAMcBAVgAzQEBWQDfAQFaAN4BAV8A3QEBJADkAQJhYQDcAQJiYQDbAQJjYQDaAQJkYQDZAQJlYQDYAQJmYQDXAQJnYQDqAQJoYQCcAQJpYQDWAQJqYQDVAQJrYQDUAQJsYQAvAm1hABsCbmEAygECb2EASAJwYQEAAnFhAGcCcmEA0wECc2EA6AECdGEA0gECdWEA9wECdmEA9gECd2EA9QECeGEA5wECeWEA5gECemEA5QEJQQEAQQELHsgBkAKNAo4CjAKLArcBiQKIAocChgKFAoQCgwKCAoECgAL/Af4B/QH7AVv0AfMB8gHvAe4B7QHsAesBCu+QCYACQAEBfyMAQRBrIgMgADYCDCADIAE2AgggAyACNgIEIAMoAgwEQCADKAIMIAMoAgg2AgAgAygCDCADKAIENgIECwvMDAEHfwJAIABFDQAgAEEIayIDIABBBGsoAgAiAUF4cSIAaiEFAkAgAUEBcQ0AIAFBA3FFDQEgAyADKAIAIgFrIgNB9JsBKAIASQ0BIAAgAWohACADQfibASgCAEcEQCABQf8BTQRAIAMoAggiAiABQQN2IgRBA3RBjJwBakYaIAIgAygCDCIBRgRAQeSbAUHkmwEoAgBBfiAEd3E2AgAMAwsgAiABNgIMIAEgAjYCCAwCCyADKAIYIQYCQCADIAMoAgwiAUcEQCADKAIIIgIgATYCDCABIAI2AggMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAQJAIAMgAygCHCICQQJ0QZSeAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQeibAUHomwEoAgBBfiACd3E2AgAMAwsgBkEQQRQgBigCECADRhtqIAE2AgAgAUUNAgsgASAGNgIYIAMoAhAiAgRAIAEgAjYCECACIAE2AhgLIAMoAhQiAkUNASABIAI2AhQgAiABNgIYDAELIAUoAgQiAUEDcUEDRw0AQeybASAANgIAIAUgAUF+cTYCBCADIABBAXI2AgQgACADaiAANgIADwsgAyAFTw0AIAUoAgQiAUEBcUUNAAJAIAFBAnFFBEAgBUH8mwEoAgBGBEBB/JsBIAM2AgBB8JsBQfCbASgCACAAaiIANgIAIAMgAEEBcjYCBCADQfibASgCAEcNA0HsmwFBADYCAEH4mwFBADYCAA8LIAVB+JsBKAIARgRAQfibASADNgIAQeybAUHsmwEoAgAgAGoiADYCACADIABBAXI2AgQgACADaiAANgIADwsgAUF4cSAAaiEAAkAgAUH/AU0EQCAFKAIIIgIgAUEDdiIEQQN0QYycAWpGGiACIAUoAgwiAUYEQEHkmwFB5JsBKAIAQX4gBHdxNgIADAILIAIgATYCDCABIAI2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgFHBEAgBSgCCCICQfSbASgCAEkaIAIgATYCDCABIAI2AggMAQsCQCAFQRRqIgIoAgAiBA0AIAVBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCICQQJ0QZSeAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQeibAUHomwEoAgBBfiACd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAE2AgAgAUUNAQsgASAGNgIYIAUoAhAiAgRAIAEgAjYCECACIAE2AhgLIAUoAhQiAkUNACABIAI2AhQgAiABNgIYCyADIABBAXI2AgQgACADaiAANgIAIANB+JsBKAIARw0BQeybASAANgIADwsgBSABQX5xNgIEIAMgAEEBcjYCBCAAIANqIAA2AgALIABB/wFNBEAgAEEDdiIBQQN0QYycAWohAAJ/QeSbASgCACICQQEgAXQiAXFFBEBB5JsBIAEgAnI2AgAgAAwBCyAAKAIICyECIAAgAzYCCCACIAM2AgwgAyAANgIMIAMgAjYCCA8LQR8hAiADQgA3AhAgAEH///8HTQRAIABBCHYiASABQYD+P2pBEHZBCHEiAXQiAiACQYDgH2pBEHZBBHEiAnQiBCAEQYCAD2pBEHZBAnEiBHRBD3YgASACciAEcmsiAUEBdCAAIAFBFWp2QQFxckEcaiECCyADIAI2AhwgAkECdEGUngFqIQECQAJAAkBB6JsBKAIAIgRBASACdCIHcUUEQEHomwEgBCAHcjYCACABIAM2AgAgAyABNgIYDAELIABBAEEZIAJBAXZrIAJBH0YbdCECIAEoAgAhAQNAIAEiBCgCBEF4cSAARg0CIAJBHXYhASACQQF0IQIgBCABQQRxaiIHQRBqKAIAIgENAAsgByADNgIQIAMgBDYCGAsgAyADNgIMIAMgAzYCCAwBCyAEKAIIIgAgAzYCDCAEIAM2AgggA0EANgIYIAMgBDYCDCADIAA2AggLQYScAUGEnAEoAgBBAWsiAEF/IAAbNgIACwtCAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDC0AAUEBcQRAIAEoAgwoAgQQFQsgASgCDBAVCyABQRBqJAALQwEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAIoAgwCfyMAQRBrIgAgAigCCDYCDCAAKAIMQQxqCxBFIAJBEGokAAuiLgEMfyMAQRBrIgwkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQfQBTQRAQeSbASgCACIFQRAgAEELakF4cSAAQQtJGyIIQQN2IgJ2IgFBA3EEQCABQX9zQQFxIAJqIgNBA3QiAUGUnAFqKAIAIgRBCGohAAJAIAQoAggiAiABQYycAWoiAUYEQEHkmwEgBUF+IAN3cTYCAAwBCyACIAE2AgwgASACNgIICyAEIANBA3QiAUEDcjYCBCABIARqIgEgASgCBEEBcjYCBAwNCyAIQeybASgCACIKTQ0BIAEEQAJAQQIgAnQiAEEAIABrciABIAJ0cSIAQQAgAGtxQQFrIgAgAEEMdkEQcSICdiIBQQV2QQhxIgAgAnIgASAAdiIBQQJ2QQRxIgByIAEgAHYiAUEBdkECcSIAciABIAB2IgFBAXZBAXEiAHIgASAAdmoiA0EDdCIAQZScAWooAgAiBCgCCCIBIABBjJwBaiIARgRAQeSbASAFQX4gA3dxIgU2AgAMAQsgASAANgIMIAAgATYCCAsgBEEIaiEAIAQgCEEDcjYCBCAEIAhqIgIgA0EDdCIBIAhrIgNBAXI2AgQgASAEaiADNgIAIAoEQCAKQQN2IgFBA3RBjJwBaiEHQfibASgCACEEAn8gBUEBIAF0IgFxRQRAQeSbASABIAVyNgIAIAcMAQsgBygCCAshASAHIAQ2AgggASAENgIMIAQgBzYCDCAEIAE2AggLQfibASACNgIAQeybASADNgIADA0LQeibASgCACIGRQ0BIAZBACAGa3FBAWsiACAAQQx2QRBxIgJ2IgFBBXZBCHEiACACciABIAB2IgFBAnZBBHEiAHIgASAAdiIBQQF2QQJxIgByIAEgAHYiAUEBdkEBcSIAciABIAB2akECdEGUngFqKAIAIgEoAgRBeHEgCGshAyABIQIDQAJAIAIoAhAiAEUEQCACKAIUIgBFDQELIAAoAgRBeHEgCGsiAiADIAIgA0kiAhshAyAAIAEgAhshASAAIQIMAQsLIAEgCGoiCSABTQ0CIAEoAhghCyABIAEoAgwiBEcEQCABKAIIIgBB9JsBKAIASRogACAENgIMIAQgADYCCAwMCyABQRRqIgIoAgAiAEUEQCABKAIQIgBFDQQgAUEQaiECCwNAIAIhByAAIgRBFGoiAigCACIADQAgBEEQaiECIAQoAhAiAA0ACyAHQQA2AgAMCwtBfyEIIABBv39LDQAgAEELaiIAQXhxIQhB6JsBKAIAIglFDQBBACAIayEDAkACQAJAAn9BACAIQYACSQ0AGkEfIAhB////B0sNABogAEEIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAggAEEVanZBAXFyQRxqCyIFQQJ0QZSeAWooAgAiAkUEQEEAIQAMAQtBACEAIAhBAEEZIAVBAXZrIAVBH0YbdCEBA0ACQCACKAIEQXhxIAhrIgcgA08NACACIQQgByIDDQBBACEDIAIhAAwDCyAAIAIoAhQiByAHIAIgAUEddkEEcWooAhAiAkYbIAAgBxshACABQQF0IQEgAg0ACwsgACAEckUEQEECIAV0IgBBACAAa3IgCXEiAEUNAyAAQQAgAGtxQQFrIgAgAEEMdkEQcSICdiIBQQV2QQhxIgAgAnIgASAAdiIBQQJ2QQRxIgByIAEgAHYiAUEBdkECcSIAciABIAB2IgFBAXZBAXEiAHIgASAAdmpBAnRBlJ4BaigCACEACyAARQ0BCwNAIAAoAgRBeHEgCGsiASADSSECIAEgAyACGyEDIAAgBCACGyEEIAAoAhAiAQR/IAEFIAAoAhQLIgANAAsLIARFDQAgA0HsmwEoAgAgCGtPDQAgBCAIaiIGIARNDQEgBCgCGCEFIAQgBCgCDCIBRwRAIAQoAggiAEH0mwEoAgBJGiAAIAE2AgwgASAANgIIDAoLIARBFGoiAigCACIARQRAIAQoAhAiAEUNBCAEQRBqIQILA0AgAiEHIAAiAUEUaiICKAIAIgANACABQRBqIQIgASgCECIADQALIAdBADYCAAwJCyAIQeybASgCACICTQRAQfibASgCACEDAkAgAiAIayIBQRBPBEBB7JsBIAE2AgBB+JsBIAMgCGoiADYCACAAIAFBAXI2AgQgAiADaiABNgIAIAMgCEEDcjYCBAwBC0H4mwFBADYCAEHsmwFBADYCACADIAJBA3I2AgQgAiADaiIAIAAoAgRBAXI2AgQLIANBCGohAAwLCyAIQfCbASgCACIGSQRAQfCbASAGIAhrIgE2AgBB/JsBQfybASgCACICIAhqIgA2AgAgACABQQFyNgIEIAIgCEEDcjYCBCACQQhqIQAMCwtBACEAIAhBL2oiCQJ/QbyfASgCAARAQcSfASgCAAwBC0HInwFCfzcCAEHAnwFCgKCAgICABDcCAEG8nwEgDEEMakFwcUHYqtWqBXM2AgBB0J8BQQA2AgBBoJ8BQQA2AgBBgCALIgFqIgVBACABayIHcSICIAhNDQpBnJ8BKAIAIgQEQEGUnwEoAgAiAyACaiIBIANNDQsgASAESw0LC0GgnwEtAABBBHENBQJAAkBB/JsBKAIAIgMEQEGknwEhAANAIAMgACgCACIBTwRAIAEgACgCBGogA0sNAwsgACgCCCIADQALC0EAED4iAUF/Rg0GIAIhBUHAnwEoAgAiA0EBayIAIAFxBEAgAiABayAAIAFqQQAgA2txaiEFCyAFIAhNDQYgBUH+////B0sNBkGcnwEoAgAiBARAQZSfASgCACIDIAVqIgAgA00NByAAIARLDQcLIAUQPiIAIAFHDQEMCAsgBSAGayAHcSIFQf7///8HSw0FIAUQPiIBIAAoAgAgACgCBGpGDQQgASEACwJAIABBf0YNACAIQTBqIAVNDQBBxJ8BKAIAIgEgCSAFa2pBACABa3EiAUH+////B0sEQCAAIQEMCAsgARA+QX9HBEAgASAFaiEFIAAhAQwIC0EAIAVrED4aDAULIAAiAUF/Rw0GDAQLAAtBACEEDAcLQQAhAQwFCyABQX9HDQILQaCfAUGgnwEoAgBBBHI2AgALIAJB/v///wdLDQEgAhA+IQFBABA+IQAgAUF/Rg0BIABBf0YNASAAIAFNDQEgACABayIFIAhBKGpNDQELQZSfAUGUnwEoAgAgBWoiADYCAEGYnwEoAgAgAEkEQEGYnwEgADYCAAsCQAJAAkBB/JsBKAIAIgcEQEGknwEhAANAIAEgACgCACIDIAAoAgQiAmpGDQIgACgCCCIADQALDAILQfSbASgCACIAQQAgACABTRtFBEBB9JsBIAE2AgALQQAhAEGonwEgBTYCAEGknwEgATYCAEGEnAFBfzYCAEGInAFBvJ8BKAIANgIAQbCfAUEANgIAA0AgAEEDdCIDQZScAWogA0GMnAFqIgI2AgAgA0GYnAFqIAI2AgAgAEEBaiIAQSBHDQALQfCbASAFQShrIgNBeCABa0EHcUEAIAFBCGpBB3EbIgBrIgI2AgBB/JsBIAAgAWoiADYCACAAIAJBAXI2AgQgASADakEoNgIEQYCcAUHMnwEoAgA2AgAMAgsgAC0ADEEIcQ0AIAMgB0sNACABIAdNDQAgACACIAVqNgIEQfybASAHQXggB2tBB3FBACAHQQhqQQdxGyIAaiICNgIAQfCbAUHwmwEoAgAgBWoiASAAayIANgIAIAIgAEEBcjYCBCABIAdqQSg2AgRBgJwBQcyfASgCADYCAAwBC0H0mwEoAgAgAUsEQEH0mwEgATYCAAsgASAFaiECQaSfASEAAkACQAJAAkACQAJAA0AgAiAAKAIARwRAIAAoAggiAA0BDAILCyAALQAMQQhxRQ0BC0GknwEhAANAIAcgACgCACICTwRAIAIgACgCBGoiBCAHSw0DCyAAKAIIIQAMAAsACyAAIAE2AgAgACAAKAIEIAVqNgIEIAFBeCABa0EHcUEAIAFBCGpBB3EbaiIJIAhBA3I2AgQgAkF4IAJrQQdxQQAgAkEIakEHcRtqIgUgCCAJaiIGayECIAUgB0YEQEH8mwEgBjYCAEHwmwFB8JsBKAIAIAJqIgA2AgAgBiAAQQFyNgIEDAMLIAVB+JsBKAIARgRAQfibASAGNgIAQeybAUHsmwEoAgAgAmoiADYCACAGIABBAXI2AgQgACAGaiAANgIADAMLIAUoAgQiAEEDcUEBRgRAIABBeHEhBwJAIABB/wFNBEAgBSgCCCIDIABBA3YiAEEDdEGMnAFqRhogAyAFKAIMIgFGBEBB5JsBQeSbASgCAEF+IAB3cTYCAAwCCyADIAE2AgwgASADNgIIDAELIAUoAhghCAJAIAUgBSgCDCIBRwRAIAUoAggiACABNgIMIAEgADYCCAwBCwJAIAVBFGoiACgCACIDDQAgBUEQaiIAKAIAIgMNAEEAIQEMAQsDQCAAIQQgAyIBQRRqIgAoAgAiAw0AIAFBEGohACABKAIQIgMNAAsgBEEANgIACyAIRQ0AAkAgBSAFKAIcIgNBAnRBlJ4BaiIAKAIARgRAIAAgATYCACABDQFB6JsBQeibASgCAEF+IAN3cTYCAAwCCyAIQRBBFCAIKAIQIAVGG2ogATYCACABRQ0BCyABIAg2AhggBSgCECIABEAgASAANgIQIAAgATYCGAsgBSgCFCIARQ0AIAEgADYCFCAAIAE2AhgLIAUgB2ohBSACIAdqIQILIAUgBSgCBEF+cTYCBCAGIAJBAXI2AgQgAiAGaiACNgIAIAJB/wFNBEAgAkEDdiIAQQN0QYycAWohAgJ/QeSbASgCACIBQQEgAHQiAHFFBEBB5JsBIAAgAXI2AgAgAgwBCyACKAIICyEAIAIgBjYCCCAAIAY2AgwgBiACNgIMIAYgADYCCAwDC0EfIQAgAkH///8HTQRAIAJBCHYiACAAQYD+P2pBEHZBCHEiA3QiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASADciAAcmsiAEEBdCACIABBFWp2QQFxckEcaiEACyAGIAA2AhwgBkIANwIQIABBAnRBlJ4BaiEEAkBB6JsBKAIAIgNBASAAdCIBcUUEQEHomwEgASADcjYCACAEIAY2AgAgBiAENgIYDAELIAJBAEEZIABBAXZrIABBH0YbdCEAIAQoAgAhAQNAIAEiAygCBEF4cSACRg0DIABBHXYhASAAQQF0IQAgAyABQQRxaiIEKAIQIgENAAsgBCAGNgIQIAYgAzYCGAsgBiAGNgIMIAYgBjYCCAwCC0HwmwEgBUEoayIDQXggAWtBB3FBACABQQhqQQdxGyIAayICNgIAQfybASAAIAFqIgA2AgAgACACQQFyNgIEIAEgA2pBKDYCBEGAnAFBzJ8BKAIANgIAIAcgBEEnIARrQQdxQQAgBEEna0EHcRtqQS9rIgAgACAHQRBqSRsiAkEbNgIEIAJBrJ8BKQIANwIQIAJBpJ8BKQIANwIIQayfASACQQhqNgIAQaifASAFNgIAQaSfASABNgIAQbCfAUEANgIAIAJBGGohAANAIABBBzYCBCAAQQhqIQEgAEEEaiEAIAEgBEkNAAsgAiAHRg0DIAIgAigCBEF+cTYCBCAHIAIgB2siBEEBcjYCBCACIAQ2AgAgBEH/AU0EQCAEQQN2IgBBA3RBjJwBaiECAn9B5JsBKAIAIgFBASAAdCIAcUUEQEHkmwEgACABcjYCACACDAELIAIoAggLIQAgAiAHNgIIIAAgBzYCDCAHIAI2AgwgByAANgIIDAQLQR8hACAHQgA3AhAgBEH///8HTQRAIARBCHYiACAAQYD+P2pBEHZBCHEiAnQiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASACciAAcmsiAEEBdCAEIABBFWp2QQFxckEcaiEACyAHIAA2AhwgAEECdEGUngFqIQMCQEHomwEoAgAiAkEBIAB0IgFxRQRAQeibASABIAJyNgIAIAMgBzYCACAHIAM2AhgMAQsgBEEAQRkgAEEBdmsgAEEfRht0IQAgAygCACEBA0AgASICKAIEQXhxIARGDQQgAEEddiEBIABBAXQhACACIAFBBHFqIgMoAhAiAQ0ACyADIAc2AhAgByACNgIYCyAHIAc2AgwgByAHNgIIDAMLIAMoAggiACAGNgIMIAMgBjYCCCAGQQA2AhggBiADNgIMIAYgADYCCAsgCUEIaiEADAULIAIoAggiACAHNgIMIAIgBzYCCCAHQQA2AhggByACNgIMIAcgADYCCAtB8JsBKAIAIgAgCE0NAEHwmwEgACAIayIBNgIAQfybAUH8mwEoAgAiAiAIaiIANgIAIAAgAUEBcjYCBCACIAhBA3I2AgQgAkEIaiEADAMLQbSbAUEwNgIAQQAhAAwCCwJAIAVFDQACQCAEKAIcIgJBAnRBlJ4BaiIAKAIAIARGBEAgACABNgIAIAENAUHomwEgCUF+IAJ3cSIJNgIADAILIAVBEEEUIAUoAhAgBEYbaiABNgIAIAFFDQELIAEgBTYCGCAEKAIQIgAEQCABIAA2AhAgACABNgIYCyAEKAIUIgBFDQAgASAANgIUIAAgATYCGAsCQCADQQ9NBEAgBCADIAhqIgBBA3I2AgQgACAEaiIAIAAoAgRBAXI2AgQMAQsgBCAIQQNyNgIEIAYgA0EBcjYCBCADIAZqIAM2AgAgA0H/AU0EQCADQQN2IgBBA3RBjJwBaiECAn9B5JsBKAIAIgFBASAAdCIAcUUEQEHkmwEgACABcjYCACACDAELIAIoAggLIQAgAiAGNgIIIAAgBjYCDCAGIAI2AgwgBiAANgIIDAELQR8hACADQf///wdNBEAgA0EIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAMgAEEVanZBAXFyQRxqIQALIAYgADYCHCAGQgA3AhAgAEECdEGUngFqIQICQAJAIAlBASAAdCIBcUUEQEHomwEgASAJcjYCACACIAY2AgAgBiACNgIYDAELIANBAEEZIABBAXZrIABBH0YbdCEAIAIoAgAhCANAIAgiASgCBEF4cSADRg0CIABBHXYhAiAAQQF0IQAgASACQQRxaiICKAIQIggNAAsgAiAGNgIQIAYgATYCGAsgBiAGNgIMIAYgBjYCCAwBCyABKAIIIgAgBjYCDCABIAY2AgggBkEANgIYIAYgATYCDCAGIAA2AggLIARBCGohAAwBCwJAIAtFDQACQCABKAIcIgJBAnRBlJ4BaiIAKAIAIAFGBEAgACAENgIAIAQNAUHomwEgBkF+IAJ3cTYCAAwCCyALQRBBFCALKAIQIAFGG2ogBDYCACAERQ0BCyAEIAs2AhggASgCECIABEAgBCAANgIQIAAgBDYCGAsgASgCFCIARQ0AIAQgADYCFCAAIAQ2AhgLAkAgA0EPTQRAIAEgAyAIaiIAQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIEDAELIAEgCEEDcjYCBCAJIANBAXI2AgQgAyAJaiADNgIAIAoEQCAKQQN2IgBBA3RBjJwBaiEEQfibASgCACECAn9BASAAdCIAIAVxRQRAQeSbASAAIAVyNgIAIAQMAQsgBCgCCAshACAEIAI2AgggACACNgIMIAIgBDYCDCACIAA2AggLQfibASAJNgIAQeybASADNgIACyABQQhqIQALIAxBEGokACAAC4MEAQN/IAJBgARPBEAgACABIAIQCxogAA8LIAAgAmohAwJAIAAgAXNBA3FFBEACQCAAQQNxRQRAIAAhAgwBCyACQQFIBEAgACECDAELIAAhAgNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICQQNxRQ0BIAIgA0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAvBGAECfyMAQRBrIgQkACAEIAA2AgwgBCABNgIIIAQgAjYCBCAEKAIMIQAgBCgCCCECIAQoAgQhAyMAQSBrIgEkACABIAA2AhggASACNgIUIAEgAzYCEAJAIAEoAhRFBEAgAUEANgIcDAELIAFBATYCDCABLQAMBEAgASgCFCECIAEoAhAhAyMAQSBrIgAgASgCGDYCHCAAIAI2AhggACADNgIUIAAgACgCHDYCECAAIAAoAhBBf3M2AhADQCAAKAIUBH8gACgCGEEDcUEARwVBAAtBAXEEQCAAKAIQIQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQf8BcUECdEGgGWooAgAgACgCEEEIdnM2AhAgACAAKAIUQQFrNgIUDAELCyAAIAAoAhg2AgwDQCAAKAIUQSBPBEAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIUQSBrNgIUDAELCwNAIAAoAhRBBE8EQCAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QaAZaigCACAAKAIQQRB2Qf8BcUECdEGgIWooAgAgACgCEEH/AXFBAnRBoDFqKAIAIAAoAhBBCHZB/wFxQQJ0QaApaigCAHNzczYCECAAIAAoAhRBBGs2AhQMAQsLIAAgACgCDDYCGCAAKAIUBEADQCAAKAIQIQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQf8BcUECdEGgGWooAgAgACgCEEEIdnM2AhAgACAAKAIUQQFrIgI2AhQgAg0ACwsgACAAKAIQQX9zNgIQIAEgACgCEDYCHAwBCyABKAIUIQIgASgCECEDIwBBIGsiACABKAIYNgIcIAAgAjYCGCAAIAM2AhQgACAAKAIcQQh2QYD+A3EgACgCHEEYdmogACgCHEGA/gNxQQh0aiAAKAIcQf8BcUEYdGo2AhAgACAAKAIQQX9zNgIQA0AgACgCFAR/IAAoAhhBA3FBAEcFQQALQQFxBEAgACgCEEEYdiECIAAgACgCGCIDQQFqNgIYIAAgAy0AACACc0ECdEGgOWooAgAgACgCEEEIdHM2AhAgACAAKAIUQQFrNgIUDAELCyAAIAAoAhg2AgwDQCAAKAIUQSBPBEAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIUQSBrNgIUDAELCwNAIAAoAhRBBE8EQCAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QaDRAGooAgAgACgCEEEQdkH/AXFBAnRBoMkAaigCACAAKAIQQf8BcUECdEGgOWooAgAgACgCEEEIdkH/AXFBAnRBoMEAaigCAHNzczYCECAAIAAoAhRBBGs2AhQMAQsLIAAgACgCDDYCGCAAKAIUBEADQCAAKAIQQRh2IQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQQJ0QaA5aigCACAAKAIQQQh0czYCECAAIAAoAhRBAWsiAjYCFCACDQALCyAAIAAoAhBBf3M2AhAgASAAKAIQQQh2QYD+A3EgACgCEEEYdmogACgCEEGA/gNxQQh0aiAAKAIQQf8BcUEYdGo2AhwLIAEoAhwhACABQSBqJAAgBEEQaiQAIAAL7AIBAn8jAEEQayIBJAAgASAANgIMAkAgASgCDEUNACABKAIMKAIwBEAgASgCDCIAIAAoAjBBAWs2AjALIAEoAgwoAjANACABKAIMKAIgBEAgASgCDEEBNgIgIAEoAgwQLxoLIAEoAgwoAiRBAUYEQCABKAIMEGILAkAgASgCDCgCLEUNACABKAIMLQAoQQFxDQAgASgCDCECIwBBEGsiACABKAIMKAIsNgIMIAAgAjYCCCAAQQA2AgQDQCAAKAIEIAAoAgwoAkRJBEAgACgCDCgCTCAAKAIEQQJ0aigCACAAKAIIRgRAIAAoAgwoAkwgACgCBEECdGogACgCDCgCTCAAKAIMKAJEQQFrQQJ0aigCADYCACAAKAIMIgAgACgCREEBazYCRAUgACAAKAIEQQFqNgIEDAILCwsLIAEoAgxBAEIAQQUQIBogASgCDCgCAARAIAEoAgwoAgAQGwsgASgCDBAVCyABQRBqJAALnwIBAn8jAEEQayIBJAAgASAANgIMIAEgASgCDCgCHDYCBCABKAIEIQIjAEEQayIAJAAgACACNgIMIAAoAgwQvAEgAEEQaiQAIAEgASgCBCgCFDYCCCABKAIIIAEoAgwoAhBLBEAgASABKAIMKAIQNgIICwJAIAEoAghFDQAgASgCDCgCDCABKAIEKAIQIAEoAggQGRogASgCDCIAIAEoAgggACgCDGo2AgwgASgCBCIAIAEoAgggACgCEGo2AhAgASgCDCIAIAEoAgggACgCFGo2AhQgASgCDCIAIAAoAhAgASgCCGs2AhAgASgCBCIAIAAoAhQgASgCCGs2AhQgASgCBCgCFA0AIAEoAgQgASgCBCgCCDYCEAsgAUEQaiQAC2ABAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEICEB42AgQCQCABKAIERQRAIAFBADsBDgwBCyABIAEoAgQtAAAgASgCBC0AAUEIdGo7AQ4LIAEvAQ4hACABQRBqJAAgAAvpAQEBfyMAQSBrIgIkACACIAA2AhwgAiABNwMQIAIpAxAhASMAQSBrIgAgAigCHDYCGCAAIAE3AxACQAJAAkAgACgCGC0AAEEBcUUNACAAKQMQIAAoAhgpAxAgACkDEHxWDQAgACgCGCkDCCAAKAIYKQMQIAApAxB8Wg0BCyAAKAIYQQA6AAAgAEEANgIcDAELIAAgACgCGCgCBCAAKAIYKQMQp2o2AgwgACAAKAIMNgIcCyACIAAoAhw2AgwgAigCDARAIAIoAhwiACACKQMQIAApAxB8NwMQCyACKAIMIQAgAkEgaiQAIAALbwEBfyMAQRBrIgIkACACIAA2AgggAiABOwEGIAIgAigCCEICEB42AgACQCACKAIARQRAIAJBfzYCDAwBCyACKAIAIAIvAQY6AAAgAigCACACLwEGQQh2OgABIAJBADYCDAsgAigCDBogAkEQaiQAC7YCAQF/IwBBMGsiBCQAIAQgADYCJCAEIAE2AiAgBCACNwMYIAQgAzYCFAJAIAQoAiQpAxhCASAEKAIUrYaDUARAIAQoAiRBDGpBHEEAEBQgBEJ/NwMoDAELAkAgBCgCJCgCAEUEQCAEIAQoAiQoAgggBCgCICAEKQMYIAQoAhQgBCgCJCgCBBEOADcDCAwBCyAEIAQoAiQoAgAgBCgCJCgCCCAEKAIgIAQpAxggBCgCFCAEKAIkKAIEEQoANwMICyAEKQMIQgBTBEACQCAEKAIUQQRGDQAgBCgCFEEORg0AAkAgBCgCJCAEQghBBBAgQgBTBEAgBCgCJEEMakEUQQAQFAwBCyAEKAIkQQxqIAQoAgAgBCgCBBAUCwsLIAQgBCkDCDcDKAsgBCkDKCECIARBMGokACACC48BAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQgAiACKAIIQgQQHjYCAAJAIAIoAgBFBEAgAkF/NgIMDAELIAIoAgAgAigCBDoAACACKAIAIAIoAgRBCHY6AAEgAigCACACKAIEQRB2OgACIAIoAgAgAigCBEEYdjoAAyACQQA2AgwLIAIoAgwaIAJBEGokAAsXACAALQAAQSBxRQRAIAEgAiAAEHEaCwtQAQF/IwBBEGsiASQAIAEgADYCDANAIAEoAgwEQCABIAEoAgwoAgA2AgggASgCDCgCDBAVIAEoAgwQFSABIAEoAgg2AgwMAQsLIAFBEGokAAs+AQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCABAVIAEoAgwoAgwQFSABKAIMEBULIAFBEGokAAt9AQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgAUIANwMAA0AgASkDACABKAIMKQMIWkUEQCABKAIMKAIAIAEpAwCnQQR0ahB3IAEgASkDAEIBfDcDAAwBCwsgASgCDCgCABAVIAEoAgwoAigQJCABKAIMEBULIAFBEGokAAtuAQF/IwBBgAJrIgUkAAJAIARBgMAEcQ0AIAIgA0wNACAFIAFB/wFxIAIgA2siAkGAAiACQYACSSIBGxAzIAFFBEADQCAAIAVBgAIQIiACQYACayICQf8BSw0ACwsgACAFIAIQIgsgBUGAAmokAAvRAQEBfyMAQTBrIgMkACADIAA2AiggAyABNwMgIAMgAjYCHAJAIAMoAigtAChBAXEEQCADQX82AiwMAQsCQCADKAIoKAIgBEAgAygCHEUNASADKAIcQQFGDQEgAygCHEECRg0BCyADKAIoQQxqQRJBABAUIANBfzYCLAwBCyADIAMpAyA3AwggAyADKAIcNgIQIAMoAiggA0EIakIQQQYQIEIAUwRAIANBfzYCLAwBCyADKAIoQQA6ADQgA0EANgIsCyADKAIsIQAgA0EwaiQAIAALmBcBAn8jAEEwayIEJAAgBCAANgIsIAQgATYCKCAEIAI2AiQgBCADNgIgIARBADYCFAJAIAQoAiwoAoQBQQBKBEAgBCgCLCgCACgCLEECRgRAIwBBEGsiACAEKAIsNgIIIABB/4D/n382AgQgAEEANgIAAkADQCAAKAIAQR9MBEACQCAAKAIEQQFxRQ0AIAAoAghBlAFqIAAoAgBBAnRqLwEARQ0AIABBADYCDAwDCyAAIAAoAgBBAWo2AgAgACAAKAIEQQF2NgIEDAELCwJAAkAgACgCCC8BuAENACAAKAIILwG8AQ0AIAAoAggvAcgBRQ0BCyAAQQE2AgwMAQsgAEEgNgIAA0AgACgCAEGAAkgEQCAAKAIIQZQBaiAAKAIAQQJ0ai8BAARAIABBATYCDAwDBSAAIAAoAgBBAWo2AgAMAgsACwsgAEEANgIMCyAAKAIMIQAgBCgCLCgCACAANgIsCyAEKAIsIAQoAixBmBZqEHogBCgCLCAEKAIsQaQWahB6IAQoAiwhASMAQRBrIgAkACAAIAE2AgwgACgCDCAAKAIMQZQBaiAAKAIMKAKcFhC6ASAAKAIMIAAoAgxBiBNqIAAoAgwoAqgWELoBIAAoAgwgACgCDEGwFmoQeiAAQRI2AggDQAJAIAAoAghBA0gNACAAKAIMQfwUaiAAKAIILQDgbEECdGovAQINACAAIAAoAghBAWs2AggMAQsLIAAoAgwiASABKAKoLSAAKAIIQQNsQRFqajYCqC0gACgCCCEBIABBEGokACAEIAE2AhQgBCAEKAIsKAKoLUEKakEDdjYCHCAEIAQoAiwoAqwtQQpqQQN2NgIYIAQoAhggBCgCHE0EQCAEIAQoAhg2AhwLDAELIAQgBCgCJEEFaiIANgIYIAQgADYCHAsCQAJAIAQoAhwgBCgCJEEEakkNACAEKAIoRQ0AIAQoAiwgBCgCKCAEKAIkIAQoAiAQXQwBCwJAAkAgBCgCLCgCiAFBBEcEQCAEKAIYIAQoAhxHDQELIARBAzYCEAJAIAQoAiwoArwtQRAgBCgCEGtKBEAgBCAEKAIgQQJqNgIMIAQoAiwiACAALwG4LSAEKAIMQf//A3EgBCgCLCgCvC10cjsBuC0gBCgCLC8BuC1B/wFxIQEgBCgCLCgCCCECIAQoAiwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCLC8BuC1BCHYhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsIAQoAgxB//8DcUEQIAQoAiwoArwta3U7AbgtIAQoAiwiACAAKAK8LSAEKAIQQRBrajYCvC0MAQsgBCgCLCIAIAAvAbgtIAQoAiBBAmpB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsIgAgBCgCECAAKAK8LWo2ArwtCyAEKAIsQZDgAEGQ6QAQuwEMAQsgBEEDNgIIAkAgBCgCLCgCvC1BECAEKAIIa0oEQCAEIAQoAiBBBGo2AgQgBCgCLCIAIAAvAbgtIAQoAgRB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsLwG4LUH/AXEhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsLwG4LUEIdiEBIAQoAiwoAgghAiAEKAIsIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAiwgBCgCBEH//wNxQRAgBCgCLCgCvC1rdTsBuC0gBCgCLCIAIAAoArwtIAQoAghBEGtqNgK8LQwBCyAEKAIsIgAgAC8BuC0gBCgCIEEEakH//wNxIAQoAiwoArwtdHI7AbgtIAQoAiwiACAEKAIIIAAoArwtajYCvC0LIAQoAiwhASAEKAIsKAKcFkEBaiECIAQoAiwoAqgWQQFqIQMgBCgCFEEBaiEFIwBBQGoiACQAIAAgATYCPCAAIAI2AjggACADNgI0IAAgBTYCMCAAQQU2AigCQCAAKAI8KAK8LUEQIAAoAihrSgRAIAAgACgCOEGBAms2AiQgACgCPCIBIAEvAbgtIAAoAiRB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8LwG4LUH/AXEhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8LwG4LUEIdiECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwgACgCJEH//wNxQRAgACgCPCgCvC1rdTsBuC0gACgCPCIBIAEoArwtIAAoAihBEGtqNgK8LQwBCyAAKAI8IgEgAS8BuC0gACgCOEGBAmtB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8IgEgACgCKCABKAK8LWo2ArwtCyAAQQU2AiACQCAAKAI8KAK8LUEQIAAoAiBrSgRAIAAgACgCNEEBazYCHCAAKAI8IgEgAS8BuC0gACgCHEH//wNxIAAoAjwoArwtdHI7AbgtIAAoAjwvAbgtQf8BcSECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwvAbgtQQh2IQIgACgCPCgCCCEDIAAoAjwiBSgCFCEBIAUgAUEBajYCFCABIANqIAI6AAAgACgCPCAAKAIcQf//A3FBECAAKAI8KAK8LWt1OwG4LSAAKAI8IgEgASgCvC0gACgCIEEQa2o2ArwtDAELIAAoAjwiASABLwG4LSAAKAI0QQFrQf//A3EgACgCPCgCvC10cjsBuC0gACgCPCIBIAAoAiAgASgCvC1qNgK8LQsgAEEENgIYAkAgACgCPCgCvC1BECAAKAIYa0oEQCAAIAAoAjBBBGs2AhQgACgCPCIBIAEvAbgtIAAoAhRB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8LwG4LUH/AXEhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8LwG4LUEIdiECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwgACgCFEH//wNxQRAgACgCPCgCvC1rdTsBuC0gACgCPCIBIAEoArwtIAAoAhhBEGtqNgK8LQwBCyAAKAI8IgEgAS8BuC0gACgCMEEEa0H//wNxIAAoAjwoArwtdHI7AbgtIAAoAjwiASAAKAIYIAEoArwtajYCvC0LIABBADYCLANAIAAoAiwgACgCMEgEQCAAQQM2AhACQCAAKAI8KAK8LUEQIAAoAhBrSgRAIAAgACgCPEH8FGogACgCLC0A4GxBAnRqLwECNgIMIAAoAjwiASABLwG4LSAAKAIMQf//A3EgACgCPCgCvC10cjsBuC0gACgCPC8BuC1B/wFxIQIgACgCPCgCCCEDIAAoAjwiBSgCFCEBIAUgAUEBajYCFCABIANqIAI6AAAgACgCPC8BuC1BCHYhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8IAAoAgxB//8DcUEQIAAoAjwoArwta3U7AbgtIAAoAjwiASABKAK8LSAAKAIQQRBrajYCvC0MAQsgACgCPCIBIAEvAbgtIAAoAjxB/BRqIAAoAiwtAOBsQQJ0ai8BAiAAKAI8KAK8LXRyOwG4LSAAKAI8IgEgACgCECABKAK8LWo2ArwtCyAAIAAoAixBAWo2AiwMAQsLIAAoAjwgACgCPEGUAWogACgCOEEBaxC5ASAAKAI8IAAoAjxBiBNqIAAoAjRBAWsQuQEgAEFAayQAIAQoAiwgBCgCLEGUAWogBCgCLEGIE2oQuwELCyAEKAIsEL4BIAQoAiAEQCAEKAIsEL0BCyAEQTBqJAAL1AEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhFOgAPAkAgAigCGEUEQCACIAIpAxCnEBgiADYCGCAARQRAIAJBADYCHAwCCwsgAkEYEBgiADYCCCAARQRAIAItAA9BAXEEQCACKAIYEBULIAJBADYCHAwBCyACKAIIQQE6AAAgAigCCCACKAIYNgIEIAIoAgggAikDEDcDCCACKAIIQgA3AxAgAigCCCACLQAPQQFxOgABIAIgAigCCDYCHAsgAigCHCEAIAJBIGokACAAC3gBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIEEB42AgQCQCABKAIERQRAIAFBADYCDAwBCyABIAEoAgQtAAAgASgCBC0AASABKAIELQACIAEoAgQtAANBCHRqQQh0akEIdGo2AgwLIAEoAgwhACABQRBqJAAgAAuHAwEBfyMAQTBrIgMkACADIAA2AiQgAyABNgIgIAMgAjcDGAJAIAMoAiQtAChBAXEEQCADQn83AygMAQsCQAJAIAMoAiQoAiBFDQAgAykDGEL///////////8AVg0AIAMpAxhQDQEgAygCIA0BCyADKAIkQQxqQRJBABAUIANCfzcDKAwBCyADKAIkLQA1QQFxBEAgA0J/NwMoDAELAn8jAEEQayIAIAMoAiQ2AgwgACgCDC0ANEEBcQsEQCADQgA3AygMAQsgAykDGFAEQCADQgA3AygMAQsgA0IANwMQA0AgAykDECADKQMYVARAIAMgAygCJCADKAIgIAMpAxCnaiADKQMYIAMpAxB9QQEQICICNwMIIAJCAFMEQCADKAIkQQE6ADUgAykDEFAEQCADQn83AygMBAsgAyADKQMQNwMoDAMLIAMpAwhQBEAgAygCJEEBOgA0BSADIAMpAwggAykDEHw3AxAMAgsLCyADIAMpAxA3AygLIAMpAyghAiADQTBqJAAgAgthAQF/IwBBEGsiAiAANgIIIAIgATcDAAJAIAIpAwAgAigCCCkDCFYEQCACKAIIQQA6AAAgAkF/NgIMDAELIAIoAghBAToAACACKAIIIAIpAwA3AxAgAkEANgIMCyACKAIMC+8BAQF/IwBBIGsiAiQAIAIgADYCGCACIAE3AxAgAiACKAIYQggQHjYCDAJAIAIoAgxFBEAgAkF/NgIcDAELIAIoAgwgAikDEEL/AYM8AAAgAigCDCACKQMQQgiIQv8BgzwAASACKAIMIAIpAxBCEIhC/wGDPAACIAIoAgwgAikDEEIYiEL/AYM8AAMgAigCDCACKQMQQiCIQv8BgzwABCACKAIMIAIpAxBCKIhC/wGDPAAFIAIoAgwgAikDEEIwiEL/AYM8AAYgAigCDCACKQMQQjiIQv8BgzwAByACQQA2AhwLIAIoAhwaIAJBIGokAAt/AQN/IAAhAQJAIABBA3EEQANAIAEtAABFDQIgAUEBaiIBQQNxDQALCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC6YBAQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggoAiBFBEAgASgCCEEMakESQQAQFCABQX82AgwMAQsgASgCCCIAIAAoAiBBAWs2AiAgASgCCCgCIEUEQCABKAIIQQBCAEECECAaIAEoAggoAgAEQCABKAIIKAIAEC9BAEgEQCABKAIIQQxqQRRBABAUCwsLIAFBADYCDAsgASgCDCEAIAFBEGokACAACzYBAX8jAEEQayIBIAA2AgwCfiABKAIMLQAAQQFxBEAgASgCDCkDCCABKAIMKQMQfQwBC0IACwuyAQIBfwF+IwBBEGsiASQAIAEgADYCBCABIAEoAgRCCBAeNgIAAkAgASgCAEUEQCABQgA3AwgMAQsgASABKAIALQAArSABKAIALQAHrUI4hiABKAIALQAGrUIwhnwgASgCAC0ABa1CKIZ8IAEoAgAtAAStQiCGfCABKAIALQADrUIYhnwgASgCAC0AAq1CEIZ8IAEoAgAtAAGtQgiGfHw3AwgLIAEpAwghAiABQRBqJAAgAgvcAQEBfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAigEQCABKAIMKAIoQQA2AiggASgCDCgCKEIANwMgIAEoAgwCfiABKAIMKQMYIAEoAgwpAyBWBEAgASgCDCkDGAwBCyABKAIMKQMgCzcDGAsgASABKAIMKQMYNwMAA0AgASkDACABKAIMKQMIWkUEQCABKAIMKAIAIAEpAwCnQQR0aigCABAVIAEgASkDAEIBfDcDAAwBCwsgASgCDCgCABAVIAEoAgwoAgQQFSABKAIMEBULIAFBEGokAAvwAgICfwF+AkAgAkUNACAAIAJqIgNBAWsgAToAACAAIAE6AAAgAkEDSQ0AIANBAmsgAToAACAAIAE6AAEgA0EDayABOgAAIAAgAToAAiACQQdJDQAgA0EEayABOgAAIAAgAToAAyACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiADYCACADIAIgBGtBfHEiAmoiAUEEayAANgIAIAJBCUkNACADIAA2AgggAyAANgIEIAFBCGsgADYCACABQQxrIAA2AgAgAkEZSQ0AIAMgADYCGCADIAA2AhQgAyAANgIQIAMgADYCDCABQRBrIAA2AgAgAUEUayAANgIAIAFBGGsgADYCACABQRxrIAA2AgAgAiADQQRxQRhyIgFrIgJBIEkNACAArUKBgICAEH4hBSABIANqIQEDQCABIAU3AxggASAFNwMQIAEgBTcDCCABIAU3AwAgAUEgaiEBIAJBIGsiAkEfSw0ACwsLawEBfyMAQSBrIgIgADYCHCACQgEgAigCHK2GNwMQIAJBDGogATYCAANAIAIgAigCDCIAQQRqNgIMIAIgACgCADYCCCACKAIIQQBIRQRAIAIgAikDEEIBIAIoAgithoQ3AxAMAQsLIAIpAxALYAIBfwF+IwBBEGsiASQAIAEgADYCBAJAIAEoAgQoAiRBAUcEQCABKAIEQQxqQRJBABAUIAFCfzcDCAwBCyABIAEoAgRBAEIAQQ0QIDcDCAsgASkDCCECIAFBEGokACACC6UCAQJ/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNwMIIAMoAhgoAgAhASADKAIUIQQgAykDCCECIwBBIGsiACQAIAAgATYCFCAAIAQ2AhAgACACNwMIAkACQCAAKAIUKAIkQQFGBEAgACkDCEL///////////8AWA0BCyAAKAIUQQxqQRJBABAUIABCfzcDGAwBCyAAIAAoAhQgACgCECAAKQMIQQsQIDcDGAsgACkDGCECIABBIGokACADIAI3AwACQCACQgBTBEAgAygCGEEIaiADKAIYKAIAEBcgA0F/NgIcDAELIAMpAwAgAykDCFIEQCADKAIYQQhqQQZBGxAUIANBfzYCHAwBCyADQQA2AhwLIAMoAhwhACADQSBqJAAgAAsxAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDBBSIAEoAgwQFQsgAUEQaiQACy8BAX8jAEEQayIBJAAgASAANgIMIAEoAgwoAggQFSABKAIMQQA2AgggAUEQaiQAC80BAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQCQCACKAIILQAoQQFxBEAgAkF/NgIMDAELIAIoAgRFBEAgAigCCEEMakESQQAQFCACQX82AgwMAQsgAigCBBA7IAIoAggoAgAEQCACKAIIKAIAIAIoAgQQOUEASARAIAIoAghBDGogAigCCCgCABAXIAJBfzYCDAwCCwsgAigCCCACKAIEQjhBAxAgQgBTBEAgAkF/NgIMDAELIAJBADYCDAsgAigCDCEAIAJBEGokACAAC98EAQF/IwBBIGsiAiAANgIYIAIgATYCFAJAIAIoAhhFBEAgAkEBNgIcDAELIAIgAigCGCgCADYCDAJAIAIoAhgoAggEQCACIAIoAhgoAgg2AhAMAQsgAkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSwRAIAIoAgwgAigCCGotAABBgAFJDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIYLwEEIAIoAgggAigCAGpNBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILjQUBA38jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMKAIABEAgASgCDCgCABAvGiABKAIMKAIAEBsLIAEoAgwoAhwQFSABKAIMKAIgECQgASgCDCgCJBAkIAEoAgwoAlAhAiMAQRBrIgAkACAAIAI2AgwgACgCDARAIAAoAgwoAhAEQCAAQQA2AggDQCAAKAIIIAAoAgwoAgBJBEAgACgCDCgCECAAKAIIQQJ0aigCAARAIAAoAgwoAhAgACgCCEECdGooAgAhAyMAQRBrIgIkACACIAM2AgwDQCACKAIMBEAgAiACKAIMKAIYNgIIIAIoAgwQFSACIAIoAgg2AgwMAQsLIAJBEGokAAsgACAAKAIIQQFqNgIIDAELCyAAKAIMKAIQEBULIAAoAgwQFQsgAEEQaiQAIAEoAgwoAkAEQCABQgA3AwADQCABKQMAIAEoAgwpAzBUBEAgASgCDCgCQCABKQMAp0EEdGoQdyABIAEpAwBCAXw3AwAMAQsLIAEoAgwoAkAQFQsgAUIANwMAA0AgASkDACABKAIMKAJErVQEQCABKAIMKAJMIAEpAwCnQQJ0aigCACECIwBBEGsiACQAIAAgAjYCDCAAKAIMQQE6ACgCfyMAQRBrIgIgACgCDEEMajYCDCACKAIMKAIARQsEQCAAKAIMQQxqQQhBABAUCyAAQRBqJAAgASABKQMAQgF8NwMADAELCyABKAIMKAJMEBUgASgCDCgCVCECIwBBEGsiACQAIAAgAjYCDCAAKAIMBEAgACgCDCgCCARAIAAoAgwoAgwgACgCDCgCCBECAAsgACgCDBAVCyAAQRBqJAAgASgCDEEIahA4IAEoAgwQFQsgAUEQaiQAC48OAQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgghASADKAIEIQIjAEEgayIAIAMoAgw2AhggACABNgIUIAAgAjYCECAAIAAoAhhBEHY2AgwgACAAKAIYQf//A3E2AhgCQCAAKAIQQQFGBEAgACAAKAIULQAAIAAoAhhqNgIYIAAoAhhB8f8DTwRAIAAgACgCGEHx/wNrNgIYCyAAIAAoAhggACgCDGo2AgwgACgCDEHx/wNPBEAgACAAKAIMQfH/A2s2AgwLIAAgACgCGCAAKAIMQRB0cjYCHAwBCyAAKAIURQRAIABBATYCHAwBCyAAKAIQQRBJBEADQCAAIAAoAhAiAUEBazYCECABBEAgACAAKAIUIgFBAWo2AhQgACABLQAAIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDAwBCwsgACgCGEHx/wNPBEAgACAAKAIYQfH/A2s2AhgLIAAgACgCDEHx/wNwNgIMIAAgACgCGCAAKAIMQRB0cjYCHAwBCwNAIAAoAhBBsCtPBEAgACAAKAIQQbArazYCECAAQdsCNgIIA0AgACAAKAIULQAAIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAEgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYC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NgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIc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DQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCGCABKAIUSQtBAXENAAsgASgCKEGCAiABKAIUIAEoAhhrazYCYCABKAIoKAJgIAEoAigoAnRLBEAgASgCKCABKAIoKAJ0NgJgCwsLAkAgASgCKCgCYEEDTwRAIAEgASgCKCgCYEEDazoAEyABQQE7ARAgASgCKCICKAKkLSACKAKgLUEBdGogAS8BEDsBACABLQATIQMgASgCKCICKAKYLSEEIAIgAigCoC0iAkEBajYCoC0gAiAEaiADOgAAIAEgAS8BEEEBazsBECABKAIoIAEtABNB0N0Aai0AAEECdGpBmAlqIgIgAi8BAEEBajsBACABKAIoQYgTagJ/IAEvARBBgAJJBEAgAS8BEC0A0FkMAQsgAS8BEEEHdkGAAmotANBZC0ECdGoiAiACLwEAQQFqOwEAIAEgASgCKCgCoC0gASgCKCgCnC1BAWtGNgIgIAEoAigiAiACKAJ0IAEoAigoAmBrNgJ0IAEoAigiAiABKAIoKAJgIAIoAmxqNgJsIAEoAihBADYCYAwBCyABIAEoAigiAigCOCACKAJsai0AADoADyABKAIoIgIoAqQtIAIoAqAtQQF0akEAOwEAIAEtAA8hAyABKAIoIgIoApgtIQQgAiACKAKgLSICQQFqNgKgLSACIARqIAM6AAAgASgCKCABLQAPQQJ0aiICIAIvAZQBQQFqOwGUASABIAEoAigoAqAtIAEoAigoApwtQQFrRjYCICABKAIoIgIgAigCdEEBazYCdCABKAIoIgIgAigCbEEBajYCbAsgASgCIARAIAEoAigCfyABKAIoKAJcQQBOBEAgASgCKCgCOCABKAIoKAJcagwBC0EACyABKAIoKAJsIAEoAigoAlxrQQAQKCABKAIoIAEoAigoAmw2AlwgASgCKCgCABAcIAEoAigoAgAoAhBFBEAgAUEANgIsDAQLCwwBCwsgASgCKEEANgK0LSABKAIkQQRGBEAgASgCKAJ/IAEoAigoAlxBAE4EQCABKAIoKAI4IAEoAigoAlxqDAELQQALIAEoAigoAmwgASgCKCgCXGtBARAoIAEoAiggASgCKCgCbDYCXCABKAIoKAIAEBwgASgCKCgCACgCEEUEQCABQQI2AiwMAgsgAUEDNgIsDAELIAEoAigoAqAtBEAgASgCKAJ/IAEoAigoAlxBAE4EQCABKAIoKAI4IAEoAigoAlxqDAELQQALIAEoAigoAmwgASgCKCgCXGtBABAoIAEoAiggASgCKCgCbDYCXCABKAIoKAIAEBwgASgCKCgCACgCEEUEQCABQQA2AiwMAgsLIAFBATYCLAsgASgCLCECIAFBMGokACACDAELIAAoAiwgACgCNCAAKAIsKAKEAUEMbEGA7wBqKAIIEQMACwsLNgIEAkAgACgCBEECRwRAIAAoAgRBA0cNAQsgACgCLEGaBTYCBAsCQCAAKAIEBEAgACgCBEECRw0BCyAAKAI4KAIQRQRAIAAoAixBfzYCKAsgAEEANgI8DAILIAAoAgRBAUYEQAJAIAAoAjRBAUYEQCAAKAIsIQIjAEEgayIBJAAgASACNgIcIAFBAzYCGAJAIAEoAhwoArwtQRAgASgCGGtKBEAgAUECNgIUIAEoAhwiAiACLwG4LSABKAIUQf//A3EgASgCHCgCvC10cjsBuC0gASgCHC8BuC1B/wFxIQMgASgCHCgCCCEEIAEoAhwiBigCFCECIAYgAkEBajYCFCACIARqIAM6AAAgASgCHC8BuC1BCHYhAyABKAIcKAIIIQQgASgCHCIGKAIUIQIgBiACQQFqNgIUIAIgBGogAzoAACABKAIcIAEoAhRB//8DcUEQIAEoAhwoArwta3U7AbgtIAEoAhwiAiACKAK8LSABKAIYQRBrajYCvC0MAQsgASgCHCICIAIvAbgtQQIgASgCHCgCvC10cjsBuC0gASgCHCICIAEoAhggAigCvC1qNgK8LQsgAUGS6AAvAQA2AhACQCABKAIcKAK8LUEQIAEoAhBrSgRAIAFBkOgALwEANgIMIAEoAhwiAiACLwG4LSABKAIMQf//A3EgASgCHCgCvC10cjsBuC0gASgCHC8BuC1B/wFxIQMgASgCHCgCCCEEIAEoAhwiBigCFCECIAYgAkEBajYCFCACIARqIAM6AAAgASgCHC8BuC1BCHYhAyABKAIcKAIIIQQgASgCHCIGKAIUIQIgBiACQQFqNgIUIAIgBGogAzoAACABKAIcIAEoAgxB//8DcUEQIAEoAhwoArwta3U7AbgtIAEoAhwiAiACKAK8LSABKAIQQRBrajYCvC0MAQsgASgCHCICIAIvAbgtQZDoAC8BACABKAIcKAK8LXRyOwG4LSABKAIcIgIgASgCECACKAK8LWo2ArwtCyABKAIcELwBIAFBIGokAAwBCyAAKAI0QQVHBEAgACgCLEEAQQBBABBdIAAoAjRBA0YEQCAAKAIsKAJEIAAoAiwoAkxBAWtBAXRqQQA7AQAgACgCLCgCREEAIAAoAiwoAkxBAWtBAXQQMyAAKAIsKAJ0RQRAIAAoAixBADYCbCAAKAIsQQA2AlwgACgCLEEANgK0LQsLCwsgACgCOBAcIAAoAjgoAhBFBEAgACgCLEF/NgIoIABBADYCPAwDCwsLIAAoAjRBBEcEQCAAQQA2AjwMAQsgACgCLCgCGEEATARAIABBATYCPAwBCwJAIAAoAiwoAhhBAkYEQCAAKAI4KAIwQf8BcSECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAAIAAoAjgoAjBBCHZB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCOCgCMEEQdkH/AXEhAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAACAAKAI4KAIwQRh2IQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCOCgCCEH/AXEhAiAAKAIsKAIIIQMgACgCLCIEKAIUIQEgBCABQQFqNgIUIAEgA2ogAjoAACAAKAI4KAIIQQh2Qf8BcSECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAAIAAoAjgoAghBEHZB/wFxIQIgACgCLCgCCCEDIAAoAiwiBCgCFCEBIAQgAUEBajYCFCABIANqIAI6AAAgACgCOCgCCEEYdiECIAAoAiwoAgghAyAAKAIsIgQoAhQhASAEIAFBAWo2AhQgASADaiACOgAADAELIAAoAiwgACgCOCgCMEEQdhBLIAAoAiwgACgCOCgCMEH//wNxEEsLIAAoAjgQHCAAKAIsKAIYQQBKBEAgACgCLEEAIAAoAiwoAhhrNgIYCyAAIAAoAiwoAhRFNgI8CyAAKAI8IQEgAEFAayQAIAUgATYCCAwBCyAFKAIMQRBqIQEjAEHgAGsiACQAIAAgATYCWCAAQQI2AlQCQAJAAkAgACgCWBBKDQAgACgCWCgCDEUNACAAKAJYKAIADQEgACgCWCgCBEUNAQsgAEF+NgJcDAELIAAgACgCWCgCHDYCUCAAKAJQKAIEQb/+AEYEQCAAKAJQQcD+ADYCBAsgACAAKAJYKAIMNgJIIAAgACgCWCgCEDYCQCAAIAAoAlgoAgA2AkwgACAAKAJYKAIENgJEIAAgACgCUCgCPDYCPCAAIAAoAlAoAkA2AjggACAAKAJENgI0IAAgACgCQDYCMCAAQQA2AhADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAJQKAIEQbT+AGsOHwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fCyAAKAJQKAIMRQRAIAAoAlBBwP4ANgIEDCELA0AgACgCOEEQSQRAIAAoAkRFDSEgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLAkAgACgCUCgCDEECcUUNACAAKAI8QZ+WAkcNACAAKAJQKAIoRQRAIAAoAlBBDzYCKAtBAEEAQQAQGiEBIAAoAlAgATYCHCAAIAAoAjw6AAwgACAAKAI8QQh2OgANIAAoAlAoAhwgAEEMakECEBohASAAKAJQIAE2AhwgAEEANgI8IABBADYCOCAAKAJQQbX+ADYCBAwhCyAAKAJQQQA2AhQgACgCUCgCJARAIAAoAlAoAiRBfzYCMAsCQCAAKAJQKAIMQQFxBEAgACgCPEH/AXFBCHQgACgCPEEIdmpBH3BFDQELIAAoAlhBmgw2AhggACgCUEHR/gA2AgQMIQsgACgCPEEPcUEIRwRAIAAoAlhBmw82AhggACgCUEHR/gA2AgQMIQsgACAAKAI8QQR2NgI8IAAgACgCOEEEazYCOCAAIAAoAjxBD3FBCGo2AhQgACgCUCgCKEUEQCAAKAJQIAAoAhQ2AigLAkAgACgCFEEPTQRAIAAoAhQgACgCUCgCKE0NAQsgACgCWEGTDTYCGCAAKAJQQdH+ADYCBAwhCyAAKAJQQQEgACgCFHQ2AhhBAEEAQQAQPSEBIAAoAlAgATYCHCAAKAJYIAE2AjAgACgCUEG9/gBBv/4AIAAoAjxBgARxGzYCBCAAQQA2AjwgAEEANgI4DCALA0AgACgCOEEQSQRAIAAoAkRFDSAgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAgACgCPDYCFCAAKAJQKAIUQf8BcUEIRwRAIAAoAlhBmw82AhggACgCUEHR/gA2AgQMIAsgACgCUCgCFEGAwANxBEAgACgCWEGgCTYCGCAAKAJQQdH+ADYCBAwgCyAAKAJQKAIkBEAgACgCUCgCJCAAKAI8QQh2QQFxNgIACwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACAAKAI8OgAMIAAgACgCPEEIdjoADSAAKAJQKAIcIABBDGpBAhAaIQEgACgCUCABNgIcCyAAQQA2AjwgAEEANgI4IAAoAlBBtv4ANgIECwNAIAAoAjhBIEkEQCAAKAJERQ0fIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAKAJQKAIkBEAgACgCUCgCJCAAKAI8NgIECwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACAAKAI8OgAMIAAgACgCPEEIdjoADSAAIAAoAjxBEHY6AA4gACAAKAI8QRh2OgAPIAAoAlAoAhwgAEEMakEEEBohASAAKAJQIAE2AhwLIABBADYCPCAAQQA2AjggACgCUEG3/gA2AgQLA0AgACgCOEEQSQRAIAAoAkRFDR4gACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAoAiQEQCAAKAJQKAIkIAAoAjxB/wFxNgIIIAAoAlAoAiQgACgCPEEIdjYCDAsCQCAAKAJQKAIUQYAEcUUNACAAKAJQKAIMQQRxRQ0AIAAgACgCPDoADCAAIAAoAjxBCHY6AA0gACgCUCgCHCAAQQxqQQIQGiEBIAAoAlAgATYCHAsgAEEANgI8IABBADYCOCAAKAJQQbj+ADYCBAsCQCAAKAJQKAIUQYAIcQRAA0AgACgCOEEQSQRAIAAoAkRFDR8gACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAgACgCPDYCRCAAKAJQKAIkBEAgACgCUCgCJCAAKAI8NgIUCwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACAAKAI8OgAMIAAgACgCPEEIdjoADSAAKAJQKAIcIABBDGpBAhAaIQEgACgCUCABNgIcCyAAQQA2AjwgAEEANgI4DAELIAAoAlAoAiQEQCAAKAJQKAIkQQA2AhALCyAAKAJQQbn+ADYCBAsgACgCUCgCFEGACHEEQCAAIAAoAlAoAkQ2AiwgACgCLCAAKAJESwRAIAAgACgCRDYCLAsgACgCLARAAkAgACgCUCgCJEUNACAAKAJQKAIkKAIQRQ0AIAAgACgCUCgCJCgCFCAAKAJQKAJEazYCFCAAKAJQKAIkKAIQIAAoAhRqIAAoAkwCfyAAKAJQKAIkKAIYIAAoAhQgACgCLGpJBEAgACgCUCgCJCgCGCAAKAIUawwBCyAAKAIsCxAZGgsCQCAAKAJQKAIUQYAEcUUNACAAKAJQKAIMQQRxRQ0AIAAoAlAoAhwgACgCTCAAKAIsEBohASAAKAJQIAE2AhwLIAAgACgCRCAAKAIsazYCRCAAIAAoAiwgACgCTGo2AkwgACgCUCIBIAEoAkQgACgCLGs2AkQLIAAoAlAoAkQNGwsgACgCUEEANgJEIAAoAlBBuv4ANgIECwJAIAAoAlAoAhRBgBBxBEAgACgCREUNGyAAQQA2AiwDQCAAKAJMIQEgACAAKAIsIgJBAWo2AiwgACABIAJqLQAANgIUAkAgACgCUCgCJEUNACAAKAJQKAIkKAIcRQ0AIAAoAlAoAkQgACgCUCgCJCgCIE8NACAAKAIUIQIgACgCUCgCJCgCHCEDIAAoAlAiBCgCRCEBIAQgAUEBajYCRCABIANqIAI6AAALIAAoAhQEfyAAKAIsIAAoAkRJBUEAC0EBcQ0ACwJAIAAoAlAoAhRBgARxRQ0AIAAoAlAoAgxBBHFFDQAgACgCUCgCHCAAKAJMIAAoAiwQGiEBIAAoAlAgATYCHAsgACAAKAJEIAAoAixrNgJEIAAgACgCLCAAKAJMajYCTCAAKAIUDRsMAQsgACgCUCgCJARAIAAoAlAoAiRBADYCHAsLIAAoAlBBADYCRCAAKAJQQbv+ADYCBAsCQCAAKAJQKAIUQYAgcQRAIAAoAkRFDRogAEEANgIsA0AgACgCTCEBIAAgACgCLCICQQFqNgIsIAAgASACai0AADYCFAJAIAAoAlAoAiRFDQAgACgCUCgCJCgCJEUNACAAKAJQKAJEIAAoAlAoAiQoAihPDQAgACgCFCECIAAoAlAoAiQoAiQhAyAAKAJQIgQoAkQhASAEIAFBAWo2AkQgASADaiACOgAACyAAKAIUBH8gACgCLCAAKAJESQVBAAtBAXENAAsCQCAAKAJQKAIUQYAEcUUNACAAKAJQKAIMQQRxRQ0AIAAoAlAoAhwgACgCTCAAKAIsEBohASAAKAJQIAE2AhwLIAAgACgCRCAAKAIsazYCRCAAIAAoAiwgACgCTGo2AkwgACgCFA0aDAELIAAoAlAoAiQEQCAAKAJQKAIkQQA2AiQLCyAAKAJQQbz+ADYCBAsgACgCUCgCFEGABHEEQANAIAAoAjhBEEkEQCAAKAJERQ0aIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCwJAIAAoAlAoAgxBBHFFDQAgACgCPCAAKAJQKAIcQf//A3FGDQAgACgCWEH7DDYCGCAAKAJQQdH+ADYCBAwaCyAAQQA2AjwgAEEANgI4CyAAKAJQKAIkBEAgACgCUCgCJCAAKAJQKAIUQQl1QQFxNgIsIAAoAlAoAiRBATYCMAtBAEEAQQAQGiEBIAAoAlAgATYCHCAAKAJYIAE2AjAgACgCUEG//gA2AgQMGAsDQCAAKAI4QSBJBEAgACgCREUNGCAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACgCUCAAKAI8QQh2QYD+A3EgACgCPEEYdmogACgCPEGA/gNxQQh0aiAAKAI8Qf8BcUEYdGoiATYCHCAAKAJYIAE2AjAgAEEANgI8IABBADYCOCAAKAJQQb7+ADYCBAsgACgCUCgCEEUEQCAAKAJYIAAoAkg2AgwgACgCWCAAKAJANgIQIAAoAlggACgCTDYCACAAKAJYIAAoAkQ2AgQgACgCUCAAKAI8NgI8IAAoAlAgACgCODYCQCAAQQI2AlwMGAtBAEEAQQAQPSEBIAAoAlAgATYCHCAAKAJYIAE2AjAgACgCUEG//gA2AgQLIAAoAlRBBUYNFCAAKAJUQQZGDRQLIAAoAlAoAggEQCAAIAAoAjwgACgCOEEHcXY2AjwgACAAKAI4IAAoAjhBB3FrNgI4IAAoAlBBzv4ANgIEDBULA0AgACgCOEEDSQRAIAAoAkRFDRUgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAlAgACgCPEEBcTYCCCAAIAAoAjxBAXY2AjwgACAAKAI4QQFrNgI4AkACQAJAAkACQCAAKAI8QQNxDgQAAQIDBAsgACgCUEHB/gA2AgQMAwsjAEEQayIBIAAoAlA2AgwgASgCDEGw8gA2AlAgASgCDEEJNgJYIAEoAgxBsIIBNgJUIAEoAgxBBTYCXCAAKAJQQcf+ADYCBCAAKAJUQQZGBEAgACAAKAI8QQJ2NgI8IAAgACgCOEECazYCOAwXCwwCCyAAKAJQQcT+ADYCBAwBCyAAKAJYQfANNgIYIAAoAlBB0f4ANgIECyAAIAAoAjxBAnY2AjwgACAAKAI4QQJrNgI4DBQLIAAgACgCPCAAKAI4QQdxdjYCPCAAIAAoAjggACgCOEEHcWs2AjgDQCAAKAI4QSBJBEAgACgCREUNFCAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACgCPEH//wNxIAAoAjxBEHZB//8Dc0cEQCAAKAJYQaEKNgIYIAAoAlBB0f4ANgIEDBQLIAAoAlAgACgCPEH//wNxNgJEIABBADYCPCAAQQA2AjggACgCUEHC/gA2AgQgACgCVEEGRg0SCyAAKAJQQcP+ADYCBAsgACAAKAJQKAJENgIsIAAoAiwEQCAAKAIsIAAoAkRLBEAgACAAKAJENgIsCyAAKAIsIAAoAkBLBEAgACAAKAJANgIsCyAAKAIsRQ0RIAAoAkggACgCTCAAKAIsEBkaIAAgACgCRCAAKAIsazYCRCAAIAAoAiwgACgCTGo2AkwgACAAKAJAIAAoAixrNgJAIAAgACgCLCAAKAJIajYCSCAAKAJQIgEgASgCRCAAKAIsazYCRAwSCyAAKAJQQb/+ADYCBAwRCwNAIAAoAjhBDkkEQCAAKAJERQ0RIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAKAJQIAAoAjxBH3FBgQJqNgJkIAAgACgCPEEFdjYCPCAAIAAoAjhBBWs2AjggACgCUCAAKAI8QR9xQQFqNgJoIAAgACgCPEEFdjYCPCAAIAAoAjhBBWs2AjggACgCUCAAKAI8QQ9xQQRqNgJgIAAgACgCPEEEdjYCPCAAIAAoAjhBBGs2AjgCQCAAKAJQKAJkQZ4CTQRAIAAoAlAoAmhBHk0NAQsgACgCWEH9CTYCGCAAKAJQQdH+ADYCBAwRCyAAKAJQQQA2AmwgACgCUEHF/gA2AgQLA0AgACgCUCgCbCAAKAJQKAJgSQRAA0AgACgCOEEDSQRAIAAoAkRFDRIgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLIAAoAjxBB3EhAiAAKAJQQfQAaiEDIAAoAlAiBCgCbCEBIAQgAUEBajYCbCABQQF0QYDyAGovAQBBAXQgA2ogAjsBACAAIAAoAjxBA3Y2AjwgACAAKAI4QQNrNgI4DAELCwNAIAAoAlAoAmxBE0kEQCAAKAJQQfQAaiECIAAoAlAiAygCbCEBIAMgAUEBajYCbCABQQF0QYDyAGovAQBBAXQgAmpBADsBAAwBCwsgACgCUCAAKAJQQbQKajYCcCAAKAJQIAAoAlAoAnA2AlAgACgCUEEHNgJYIABBACAAKAJQQfQAakETIAAoAlBB8ABqIAAoAlBB2ABqIAAoAlBB9AVqEHU2AhAgACgCEARAIAAoAlhBhwk2AhggACgCUEHR/gA2AgQMEAsgACgCUEEANgJsIAAoAlBBxv4ANgIECwNAAkAgACgCUCgCbCAAKAJQKAJkIAAoAlAoAmhqTw0AA0ACQCAAIAAoAlAoAlAgACgCPEEBIAAoAlAoAlh0QQFrcUECdGooAQA2ASAgAC0AISAAKAI4TQ0AIAAoAkRFDREgACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLAkAgAC8BIkEQSQRAIAAgACgCPCAALQAhdjYCPCAAIAAoAjggAC0AIWs2AjggAC8BIiECIAAoAlBB9ABqIQMgACgCUCIEKAJsIQEgBCABQQFqNgJsIAFBAXQgA2ogAjsBAAwBCwJAIAAvASJBEEYEQANAIAAoAjggAC0AIUECakkEQCAAKAJERQ0UIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAIAAoAjwgAC0AIXY2AjwgACAAKAI4IAAtACFrNgI4IAAoAlAoAmxFBEAgACgCWEHPCTYCGCAAKAJQQdH+ADYCBAwECyAAIAAoAlAgACgCUCgCbEEBdGovAXI2AhQgACAAKAI8QQNxQQNqNgIsIAAgACgCPEECdjYCPCAAIAAoAjhBAms2AjgMAQsCQCAALwEiQRFGBEADQCAAKAI4IAAtACFBA2pJBEAgACgCREUNFSAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACAAKAI8IAAtACF2NgI8IAAgACgCOCAALQAhazYCOCAAQQA2AhQgACAAKAI8QQdxQQNqNgIsIAAgACgCPEEDdjYCPCAAIAAoAjhBA2s2AjgMAQsDQCAAKAI4IAAtACFBB2pJBEAgACgCREUNFCAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACAAKAI8IAAtACF2NgI8IAAgACgCOCAALQAhazYCOCAAQQA2AhQgACAAKAI8Qf8AcUELajYCLCAAIAAoAjxBB3Y2AjwgACAAKAI4QQdrNgI4CwsgACgCUCgCbCAAKAIsaiAAKAJQKAJkIAAoAlAoAmhqSwRAIAAoAlhBzwk2AhggACgCUEHR/gA2AgQMAgsDQCAAIAAoAiwiAUEBazYCLCABBEAgACgCFCECIAAoAlBB9ABqIQMgACgCUCIEKAJsIQEgBCABQQFqNgJsIAFBAXQgA2ogAjsBAAwBCwsLDAELCyAAKAJQKAIEQdH+AEYNDiAAKAJQLwH0BEUEQCAAKAJYQfULNgIYIAAoAlBB0f4ANgIEDA8LIAAoAlAgACgCUEG0Cmo2AnAgACgCUCAAKAJQKAJwNgJQIAAoAlBBCTYCWCAAQQEgACgCUEH0AGogACgCUCgCZCAAKAJQQfAAaiAAKAJQQdgAaiAAKAJQQfQFahB1NgIQIAAoAhAEQCAAKAJYQesINgIYIAAoAlBB0f4ANgIEDA8LIAAoAlAgACgCUCgCcDYCVCAAKAJQQQY2AlwgAEECIAAoAlBB9ABqIAAoAlAoAmRBAXRqIAAoAlAoAmggACgCUEHwAGogACgCUEHcAGogACgCUEH0BWoQdTYCECAAKAIQBEAgACgCWEG5CTYCGCAAKAJQQdH+ADYCBAwPCyAAKAJQQcf+ADYCBCAAKAJUQQZGDQ0LIAAoAlBByP4ANgIECwJAIAAoAkRBBkkNACAAKAJAQYICSQ0AIAAoAlggACgCSDYCDCAAKAJYIAAoAkA2AhAgACgCWCAAKAJMNgIAIAAoAlggACgCRDYCBCAAKAJQIAAoAjw2AjwgACgCUCAAKAI4NgJAIAAoAjAhAiMAQeAAayIBIAAoAlg2AlwgASACNgJYIAEgASgCXCgCHDYCVCABIAEoAlwoAgA2AlAgASABKAJQIAEoAlwoAgRBBWtqNgJMIAEgASgCXCgCDDYCSCABIAEoAkggASgCWCABKAJcKAIQa2s2AkQgASABKAJIIAEoAlwoAhBBgQJrajYCQCABIAEoAlQoAiw2AjwgASABKAJUKAIwNgI4IAEgASgCVCgCNDYCNCABIAEoAlQoAjg2AjAgASABKAJUKAI8NgIsIAEgASgCVCgCQDYCKCABIAEoAlQoAlA2AiQgASABKAJUKAJUNgIgIAFBASABKAJUKAJYdEEBazYCHCABQQEgASgCVCgCXHRBAWs2AhgDQCABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiQgASgCLCABKAIccUECdGooAQA2ARACQAJAA0AgASABLQARNgIMIAEgASgCLCABKAIMdjYCLCABIAEoAiggASgCDGs2AiggASABLQAQNgIMIAEoAgxFBEAgAS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyAB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AG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";Tu(xo)||(xo=h(xo));function Ou(d){try{if(d==xo&&_)return new Uint8Array(_);var E=xa(d);if(E)return E;if(m)return m(d);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(I){vr(I)}}function Sh(d,E){var I,D,M;try{M=Ou(d),D=new WebAssembly.Module(M),I=new WebAssembly.Instance(D,E)}catch(ie){var z=ie.toString();throw x("failed to compile wasm module: "+z),(z.includes("imported Memory")||z.includes("memory import"))&&x("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),ie}return[I,D]}function vh(){var d={a:ka};function E(M,z){var ie=M.exports;t.asm=ie,A=t.asm.u,Ei(A.buffer),Qr=t.asm.pa,DA(t.asm.v),NA("wasm-instantiate")}if(FA("wasm-instantiate"),t.instantiateWasm)try{var I=t.instantiateWasm(d,E);return I}catch(M){return x("Module.instantiateWasm callback failed with error: "+M),!1}var D=Sh(xo,d);return E(D[0]),t.asm}var Dr,Ae;function ko(d){for(;d.length>0;){var E=d.shift();if(typeof E=="function"){E(t);continue}var I=E.func;typeof I=="number"?E.arg===void 0?Qr.get(I)():Qr.get(I)(E.arg):I(E.arg===void 0?null:E.arg)}}function Gn(d,E){var I=new Date(fe[d>>2]*1e3);fe[E>>2]=I.getUTCSeconds(),fe[E+4>>2]=I.getUTCMinutes(),fe[E+8>>2]=I.getUTCHours(),fe[E+12>>2]=I.getUTCDate(),fe[E+16>>2]=I.getUTCMonth(),fe[E+20>>2]=I.getUTCFullYear()-1900,fe[E+24>>2]=I.getUTCDay(),fe[E+36>>2]=0,fe[E+32>>2]=0;var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[E+28>>2]=M,Gn.GMTString||(Gn.GMTString=Fe("GMT")),fe[E+40>>2]=Gn.GMTString,E}function Mu(d,E){return Gn(d,E)}var St={splitPath:function(d){var E=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return E.exec(d).slice(1)},normalizeArray:function(d,E){for(var I=0,D=d.length-1;D>=0;D--){var M=d[D];M==="."?d.splice(D,1):M===".."?(d.splice(D,1),I++):I&&(d.splice(D,1),I--)}if(E)for(;I;I--)d.unshift("..");return d},normalize:function(d){var E=d.charAt(0)==="/",I=d.substr(-1)==="/";return d=St.normalizeArray(d.split("/").filter(function(D){return!!D}),!E).join("/"),!d&&!E&&(d="."),d&&I&&(d+="/"),(E?"/":"")+d},dirname:function(d){var E=St.splitPath(d),I=E[0],D=E[1];return!I&&!D?".":(D&&(D=D.substr(0,D.length-1)),I+D)},basename:function(d){if(d==="/")return"/";d=St.normalize(d),d=d.replace(/\/$/,"");var E=d.lastIndexOf("/");return E===-1?d:d.substr(E+1)},extname:function(d){return St.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return St.normalize(d.join("/"))},join2:function(d,E){return St.normalize(d+"/"+E)}};function _l(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var d=new Uint8Array(1);return function(){return crypto.getRandomValues(d),d[0]}}else if(g)try{var E=require("crypto");return function(){return E.randomBytes(1)[0]}}catch(I){}return function(){vr("randomDevice")}}var Yn={resolve:function(){for(var d="",E=!1,I=arguments.length-1;I>=-1&&!E;I--){var D=I>=0?arguments[I]:S.cwd();if(typeof D!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!D)return"";d=D+"/"+d,E=D.charAt(0)==="/"}return d=St.normalizeArray(d.split("/").filter(function(M){return!!M}),!E).join("/"),(E?"/":"")+d||"."},relative:function(d,E){d=Yn.resolve(d).substr(1),E=Yn.resolve(E).substr(1);function I(_e){for(var ot=0;ot<_e.length&&_e[ot]==="";ot++);for(var Bt=_e.length-1;Bt>=0&&_e[Bt]==="";Bt--);return ot>Bt?[]:_e.slice(ot,Bt-ot+1)}for(var D=I(d.split("/")),M=I(E.split("/")),z=Math.min(D.length,M.length),ie=z,we=0;we0?E=D.slice(0,M).toString("utf-8"):E=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(E=window.prompt("Input: "),E!==null&&(E+=` +`)):typeof readline=="function"&&(E=readline(),E!==null&&(E+=` +`));if(!E)return null;d.input=TA(E,!0)}return d.input.shift()},put_char:function(d,E){E===null||E===10?(v(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(v(je(d.output,0)),d.output=[])}},default_tty1_ops:{put_char:function(d,E){E===null||E===10?(x(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(x(je(d.output,0)),d.output=[])}}};function ds(d){for(var E=q(d,65536),I=Et(E);d=E)){var D=1024*1024;E=Math.max(E,I*(I>>0),I!=0&&(E=Math.max(E,256));var M=d.contents;d.contents=new Uint8Array(E),d.usedBytes>0&&d.contents.set(M.subarray(0,d.usedBytes),0)}},resizeFileStorage:function(d,E){if(d.usedBytes!=E)if(E==0)d.contents=null,d.usedBytes=0;else{var I=d.contents;d.contents=new Uint8Array(E),I&&d.contents.set(I.subarray(0,Math.min(E,d.usedBytes))),d.usedBytes=E}},node_ops:{getattr:function(d){var E={};return E.dev=S.isChrdev(d.mode)?d.id:1,E.ino=d.id,E.mode=d.mode,E.nlink=1,E.uid=0,E.gid=0,E.rdev=d.rdev,S.isDir(d.mode)?E.size=4096:S.isFile(d.mode)?E.size=d.usedBytes:S.isLink(d.mode)?E.size=d.link.length:E.size=0,E.atime=new Date(d.timestamp),E.mtime=new Date(d.timestamp),E.ctime=new Date(d.timestamp),E.blksize=4096,E.blocks=Math.ceil(E.size/E.blksize),E},setattr:function(d,E){E.mode!==void 0&&(d.mode=E.mode),E.timestamp!==void 0&&(d.timestamp=E.timestamp),E.size!==void 0&&pt.resizeFileStorage(d,E.size)},lookup:function(d,E){throw S.genericErrors[44]},mknod:function(d,E,I,D){return pt.createNode(d,E,I,D)},rename:function(d,E,I){if(S.isDir(d.mode)){var D;try{D=S.lookupNode(E,I)}catch(z){}if(D)for(var M in D.contents)throw new S.ErrnoError(55)}delete d.parent.contents[d.name],d.parent.timestamp=Date.now(),d.name=I,E.contents[I]=d,E.timestamp=d.parent.timestamp,d.parent=E},unlink:function(d,E){delete d.contents[E],d.timestamp=Date.now()},rmdir:function(d,E){var I=S.lookupNode(d,E);for(var D in I.contents)throw new S.ErrnoError(55);delete d.contents[E],d.timestamp=Date.now()},readdir:function(d){var E=[".",".."];for(var I in d.contents)!d.contents.hasOwnProperty(I)||E.push(I);return E},symlink:function(d,E,I){var D=pt.createNode(d,E,511|40960,0);return D.link=I,D},readlink:function(d){if(!S.isLink(d.mode))throw new S.ErrnoError(28);return d.link}},stream_ops:{read:function(d,E,I,D,M){var z=d.node.contents;if(M>=d.node.usedBytes)return 0;var ie=Math.min(d.node.usedBytes-M,D);if(ie>8&&z.subarray)E.set(z.subarray(M,M+ie),I);else for(var we=0;we0||D+I>2)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}return E.mode},realPath:function(d){for(var E=[];d.parent!==d;)E.push(d.name),d=d.parent;return E.push(d.mount.opts.root),E.reverse(),St.join.apply(null,E)},flagsForNode:function(d){d&=~2097152,d&=~2048,d&=~32768,d&=~524288;var E=0;for(var I in lt.flagsForNodeMap)d&I&&(E|=lt.flagsForNodeMap[I],d^=I);if(d)throw new S.ErrnoError(28);return E},node_ops:{getattr:function(d){var E=lt.realPath(d),I;try{I=Oe.lstatSync(E)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}return lt.isWindows&&!I.blksize&&(I.blksize=4096),lt.isWindows&&!I.blocks&&(I.blocks=(I.size+I.blksize-1)/I.blksize|0),{dev:I.dev,ino:I.ino,mode:I.mode,nlink:I.nlink,uid:I.uid,gid:I.gid,rdev:I.rdev,size:I.size,atime:I.atime,mtime:I.mtime,ctime:I.ctime,blksize:I.blksize,blocks:I.blocks}},setattr:function(d,E){var I=lt.realPath(d);try{if(E.mode!==void 0&&(Oe.chmodSync(I,E.mode),d.mode=E.mode),E.timestamp!==void 0){var D=new Date(E.timestamp);Oe.utimesSync(I,D,D)}E.size!==void 0&&Oe.truncateSync(I,E.size)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},lookup:function(d,E){var I=St.join2(lt.realPath(d),E),D=lt.getMode(I);return lt.createNode(d,E,D)},mknod:function(d,E,I,D){var M=lt.createNode(d,E,I,D),z=lt.realPath(M);try{S.isDir(M.mode)?Oe.mkdirSync(z,M.mode):Oe.writeFileSync(z,"",{mode:M.mode})}catch(ie){throw ie.code?new S.ErrnoError(lt.convertNodeCode(ie)):ie}return M},rename:function(d,E,I){var D=lt.realPath(d),M=St.join2(lt.realPath(E),I);try{Oe.renameSync(D,M)}catch(z){throw z.code?new S.ErrnoError(lt.convertNodeCode(z)):z}d.name=I},unlink:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.unlinkSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},rmdir:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.rmdirSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},readdir:function(d){var E=lt.realPath(d);try{return Oe.readdirSync(E)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},symlink:function(d,E,I){var D=St.join2(lt.realPath(d),E);try{Oe.symlinkSync(I,D)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},readlink:function(d){var E=lt.realPath(d);try{return E=Oe.readlinkSync(E),E=Hu.relative(Hu.resolve(d.mount.opts.root),E),E}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}}},stream_ops:{open:function(d){var E=lt.realPath(d.node);try{S.isFile(d.node.mode)&&(d.nfd=Oe.openSync(E,lt.flagsForNode(d.flags)))}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},close:function(d){try{S.isFile(d.node.mode)&&d.nfd&&Oe.closeSync(d.nfd)}catch(E){throw E.code?new S.ErrnoError(lt.convertNodeCode(E)):E}},read:function(d,E,I,D,M){if(D===0)return 0;try{return Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},write:function(d,E,I,D,M){try{return Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},llseek:function(d,E,I){var D=E;if(I===1)D+=d.position;else if(I===2&&S.isFile(d.node.mode))try{var M=Oe.fstatSync(d.nfd);D+=M.size}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}if(D<0)throw new S.ErrnoError(28);return D},mmap:function(d,E,I,D,M,z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var ie=ds(I);return lt.stream_ops.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(M&2)return 0;var z=lt.stream_ops.write(d,E,0,D,I,!1);return 0}}},mn={lookupPath:function(d){return{path:d,node:{mode:lt.getMode(d)}}},createStandardStreams:function(){S.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var d=1;d<3;d++)S.streams[d]={fd:d,nfd:d,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(d,E){S.isDir(d)?Oe.mkdirSync(d,E):Oe.writeFileSync(d,"",{mode:E})},mkdir:function(){Oe.mkdirSync.apply(void 0,arguments)},symlink:function(){Oe.symlinkSync.apply(void 0,arguments)},rename:function(){Oe.renameSync.apply(void 0,arguments)},rmdir:function(){Oe.rmdirSync.apply(void 0,arguments)},readdir:function(){Oe.readdirSync.apply(void 0,arguments)},unlink:function(){Oe.unlinkSync.apply(void 0,arguments)},readlink:function(){return Oe.readlinkSync.apply(void 0,arguments)},stat:function(){return Oe.statSync.apply(void 0,arguments)},lstat:function(){return Oe.lstatSync.apply(void 0,arguments)},chmod:function(){Oe.chmodSync.apply(void 0,arguments)},fchmod:function(){Oe.fchmodSync.apply(void 0,arguments)},chown:function(){Oe.chownSync.apply(void 0,arguments)},fchown:function(){Oe.fchownSync.apply(void 0,arguments)},truncate:function(){Oe.truncateSync.apply(void 0,arguments)},ftruncate:function(d,E){if(E<0)throw new S.ErrnoError(28);Oe.ftruncateSync.apply(void 0,arguments)},utime:function(){Oe.utimesSync.apply(void 0,arguments)},open:function(d,E,I,D){typeof E=="string"&&(E=$s.modeStringToFlags(E));var M=Oe.openSync(d,lt.flagsForNode(E),I),z=D!=null?D:S.nextfd(M),ie={fd:z,nfd:M,position:0,path:d,flags:E,seekable:!0};return S.streams[z]=ie,ie},close:function(d){d.stream_ops||Oe.closeSync(d.nfd),S.closeStream(d.fd)},llseek:function(d,E,I){if(d.stream_ops)return $s.llseek(d,E,I);var D=E;if(I===1)D+=d.position;else if(I===2)D+=Oe.fstatSync(d.nfd).size;else if(I!==0)throw new S.ErrnoError(Po.EINVAL);if(D<0)throw new S.ErrnoError(Po.EINVAL);return d.position=D,D},read:function(d,E,I,D,M){if(d.stream_ops)return $s.read(d,E,I,D,M);var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},write:function(d,E,I,D,M){if(d.stream_ops)return $s.write(d,E,I,D,M);d.flags&+"1024"&&S.llseek(d,0,+"2");var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},allocate:function(){throw new S.ErrnoError(Po.EOPNOTSUPP)},mmap:function(d,E,I,D,M,z){if(d.stream_ops)return $s.mmap(d,E,I,D,M,z);if(E!==0)throw new S.ErrnoError(28);var ie=ds(I);return S.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){return d.stream_ops?$s.msync(d,E,I,D,M):(M&2||S.write(d,E,0,D,I),0)},munmap:function(){return 0},ioctl:function(){throw new S.ErrnoError(Po.ENOTTY)}},S={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(d,E){if(d=Yn.resolve(S.cwd(),d),E=E||{},!d)return{path:"",node:null};var I={follow_mount:!0,recurse_count:0};for(var D in I)E[D]===void 0&&(E[D]=I[D]);if(E.recurse_count>8)throw new S.ErrnoError(32);for(var M=St.normalizeArray(d.split("/").filter(function(ut){return!!ut}),!1),z=S.root,ie="/",we=0;we40)throw new S.ErrnoError(32)}}return{path:ie,node:z}},getPath:function(d){for(var E;;){if(S.isRoot(d)){var I=d.mount.mountpoint;return E?I[I.length-1]!=="/"?I+"/"+E:I+E:I}E=E?d.name+"/"+E:d.name,d=d.parent}},hashName:function(d,E){for(var I=0,D=0;D>>0)%S.nameTable.length},hashAddNode:function(d){var E=S.hashName(d.parent.id,d.name);d.name_next=S.nameTable[E],S.nameTable[E]=d},hashRemoveNode:function(d){var E=S.hashName(d.parent.id,d.name);if(S.nameTable[E]===d)S.nameTable[E]=d.name_next;else for(var I=S.nameTable[E];I;){if(I.name_next===d){I.name_next=d.name_next;break}I=I.name_next}},lookupNode:function(d,E){var I=S.mayLookup(d);if(I)throw new S.ErrnoError(I,d);for(var D=S.hashName(d.id,E),M=S.nameTable[D];M;M=M.name_next){var z=M.name;if(M.parent.id===d.id&&z===E)return M}return S.lookup(d,E)},createNode:function(d,E,I,D){var M=new S.FSNode(d,E,I,D);return S.hashAddNode(M),M},destroyNode:function(d){S.hashRemoveNode(d)},isRoot:function(d){return d===d.parent},isMountpoint:function(d){return!!d.mounted},isFile:function(d){return(d&61440)==32768},isDir:function(d){return(d&61440)==16384},isLink:function(d){return(d&61440)==40960},isChrdev:function(d){return(d&61440)==8192},isBlkdev:function(d){return(d&61440)==24576},isFIFO:function(d){return(d&61440)==4096},isSocket:function(d){return(d&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(d){var E=S.flagModes[d];if(typeof E=="undefined")throw new Error("Unknown file open mode: "+d);return E},flagsToPermissionString:function(d){var E=["r","w","rw"][d&3];return d&512&&(E+="w"),E},nodePermissions:function(d,E){return S.ignorePermissions?0:E.includes("r")&&!(d.mode&292)||E.includes("w")&&!(d.mode&146)||E.includes("x")&&!(d.mode&73)?2:0},mayLookup:function(d){var E=S.nodePermissions(d,"x");return E||(d.node_ops.lookup?0:2)},mayCreate:function(d,E){try{var I=S.lookupNode(d,E);return 20}catch(D){}return S.nodePermissions(d,"wx")},mayDelete:function(d,E,I){var D;try{D=S.lookupNode(d,E)}catch(z){return z.errno}var M=S.nodePermissions(d,"wx");if(M)return M;if(I){if(!S.isDir(D.mode))return 54;if(S.isRoot(D)||S.getPath(D)===S.cwd())return 10}else if(S.isDir(D.mode))return 31;return 0},mayOpen:function(d,E){return d?S.isLink(d.mode)?32:S.isDir(d.mode)&&(S.flagsToPermissionString(E)!=="r"||E&512)?31:S.nodePermissions(d,S.flagsToPermissionString(E)):44},MAX_OPEN_FDS:4096,nextfd:function(d,E){d=d||0,E=E||S.MAX_OPEN_FDS;for(var I=d;I<=E;I++)if(!S.streams[I])return I;throw new S.ErrnoError(33)},getStream:function(d){return S.streams[d]},createStream:function(d,E,I){S.FSStream||(S.FSStream=function(){},S.FSStream.prototype={object:{get:function(){return this.node},set:function(ie){this.node=ie}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var D=new S.FSStream;for(var M in d)D[M]=d[M];d=D;var z=S.nextfd(E,I);return d.fd=z,S.streams[z]=d,d},closeStream:function(d){S.streams[d]=null},chrdev_stream_ops:{open:function(d){var E=S.getDevice(d.node.rdev);d.stream_ops=E.stream_ops,d.stream_ops.open&&d.stream_ops.open(d)},llseek:function(){throw new S.ErrnoError(70)}},major:function(d){return d>>8},minor:function(d){return d&255},makedev:function(d,E){return d<<8|E},registerDevice:function(d,E){S.devices[d]={stream_ops:E}},getDevice:function(d){return S.devices[d]},getMounts:function(d){for(var E=[],I=[d];I.length;){var D=I.pop();E.push(D),I.push.apply(I,D.mounts)}return E},syncfs:function(d,E){typeof d=="function"&&(E=d,d=!1),S.syncFSRequests++,S.syncFSRequests>1&&x("warning: "+S.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var I=S.getMounts(S.root.mount),D=0;function M(ie){return S.syncFSRequests--,E(ie)}function z(ie){if(ie)return z.errored?void 0:(z.errored=!0,M(ie));++D>=I.length&&M(null)}I.forEach(function(ie){if(!ie.type.syncfs)return z(null);ie.type.syncfs(ie,d,z)})},mount:function(d,E,I){var D=I==="/",M=!I,z;if(D&&S.root)throw new S.ErrnoError(10);if(!D&&!M){var ie=S.lookupPath(I,{follow_mount:!1});if(I=ie.path,z=ie.node,S.isMountpoint(z))throw new S.ErrnoError(10);if(!S.isDir(z.mode))throw new S.ErrnoError(54)}var we={type:d,opts:E,mountpoint:I,mounts:[]},me=d.mount(we);return me.mount=we,we.root=me,D?S.root=me:z&&(z.mounted=we,z.mount&&z.mount.mounts.push(we)),me},unmount:function(d){var E=S.lookupPath(d,{follow_mount:!1});if(!S.isMountpoint(E.node))throw new S.ErrnoError(28);var I=E.node,D=I.mounted,M=S.getMounts(D);Object.keys(S.nameTable).forEach(function(ie){for(var we=S.nameTable[ie];we;){var me=we.name_next;M.includes(we.mount)&&S.destroyNode(we),we=me}}),I.mounted=null;var z=I.mount.mounts.indexOf(D);I.mount.mounts.splice(z,1)},lookup:function(d,E){return d.node_ops.lookup(d,E)},mknod:function(d,E,I){var D=S.lookupPath(d,{parent:!0}),M=D.node,z=St.basename(d);if(!z||z==="."||z==="..")throw new S.ErrnoError(28);var ie=S.mayCreate(M,z);if(ie)throw new S.ErrnoError(ie);if(!M.node_ops.mknod)throw new S.ErrnoError(63);return M.node_ops.mknod(M,z,E,I)},create:function(d,E){return E=E!==void 0?E:438,E&=4095,E|=32768,S.mknod(d,E,0)},mkdir:function(d,E){return E=E!==void 0?E:511,E&=511|512,E|=16384,S.mknod(d,E,0)},mkdirTree:function(d,E){for(var I=d.split("/"),D="",M=0;Mthis.length-1||ut<0)){var st=ut%this.chunkSize,yt=ut/this.chunkSize|0;return this.getter(yt)[st]}},z.prototype.setDataGetter=function(ut){this.getter=ut},z.prototype.cacheLength=function(){var ut=new XMLHttpRequest;if(ut.open("HEAD",I,!1),ut.send(null),!(ut.status>=200&&ut.status<300||ut.status===304))throw new Error("Couldn't load "+I+". Status: "+ut.status);var st=Number(ut.getResponseHeader("Content-length")),yt,xe=(yt=ut.getResponseHeader("Accept-Ranges"))&&yt==="bytes",Wn=(yt=ut.getResponseHeader("Content-Encoding"))&&yt==="gzip",Mi=1024*1024;xe||(Mi=st);var HA=function(Cs,Pa){if(Cs>Pa)throw new Error("invalid range ("+Cs+", "+Pa+") or no bytes requested!");if(Pa>st-1)throw new Error("only "+st+" bytes available! programmer error!");var qr=new XMLHttpRequest;if(qr.open("GET",I,!1),st!==Mi&&qr.setRequestHeader("Range","bytes="+Cs+"-"+Pa),typeof Uint8Array!="undefined"&&(qr.responseType="arraybuffer"),qr.overrideMimeType&&qr.overrideMimeType("text/plain; charset=x-user-defined"),qr.send(null),!(qr.status>=200&&qr.status<300||qr.status===304))throw new Error("Couldn't load "+I+". Status: "+qr.status);return qr.response!==void 0?new Uint8Array(qr.response||[]):TA(qr.responseText||"",!0)},Yr=this;Yr.setDataGetter(function(Cs){var Pa=Cs*Mi,qr=(Cs+1)*Mi-1;if(qr=Math.min(qr,st-1),typeof Yr.chunks[Cs]=="undefined"&&(Yr.chunks[Cs]=HA(Pa,qr)),typeof Yr.chunks[Cs]=="undefined")throw new Error("doXHR failed!");return Yr.chunks[Cs]}),(Wn||!st)&&(Mi=st=1,st=this.getter(0).length,Mi=st,v("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=st,this._chunkSize=Mi,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!u)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var ie=new z;Object.defineProperties(ie,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var we={isDevice:!1,contents:ie}}else var we={isDevice:!1,url:I};var me=S.createFile(d,E,we,D,M);we.contents?me.contents=we.contents:we.url&&(me.contents=null,me.url=we.url),Object.defineProperties(me,{usedBytes:{get:function(){return this.contents.length}}});var _e={},ot=Object.keys(me.stream_ops);return ot.forEach(function(Bt){var ut=me.stream_ops[Bt];_e[Bt]=function(){return S.forceLoadFile(me),ut.apply(null,arguments)}}),_e.read=function(ut,st,yt,xe,Wn){S.forceLoadFile(me);var Mi=ut.node.contents;if(Wn>=Mi.length)return 0;var HA=Math.min(Mi.length-Wn,xe);if(Mi.slice)for(var Yr=0;Yr>2]=D.dev,fe[I+4>>2]=0,fe[I+8>>2]=D.ino,fe[I+12>>2]=D.mode,fe[I+16>>2]=D.nlink,fe[I+20>>2]=D.uid,fe[I+24>>2]=D.gid,fe[I+28>>2]=D.rdev,fe[I+32>>2]=0,Ae=[D.size>>>0,(Dr=D.size,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+40>>2]=Ae[0],fe[I+44>>2]=Ae[1],fe[I+48>>2]=4096,fe[I+52>>2]=D.blocks,fe[I+56>>2]=D.atime.getTime()/1e3|0,fe[I+60>>2]=0,fe[I+64>>2]=D.mtime.getTime()/1e3|0,fe[I+68>>2]=0,fe[I+72>>2]=D.ctime.getTime()/1e3|0,fe[I+76>>2]=0,Ae=[D.ino>>>0,(Dr=D.ino,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+80>>2]=Ae[0],fe[I+84>>2]=Ae[1],0},doMsync:function(d,E,I,D,M){var z=V.slice(d,d+I);S.msync(E,z,M,I,D)},doMkdir:function(d,E){return d=St.normalize(d),d[d.length-1]==="/"&&(d=d.substr(0,d.length-1)),S.mkdir(d,E,0),0},doMknod:function(d,E,I){switch(E&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return S.mknod(d,E,I),0},doReadlink:function(d,E,I){if(I<=0)return-28;var D=S.readlink(d),M=Math.min(I,he(D)),z=pe[E+M];return be(D,E,I+1),pe[E+M]=z,M},doAccess:function(d,E){if(E&~7)return-28;var I,D=S.lookupPath(d,{follow:!0});if(I=D.node,!I)return-44;var M="";return E&4&&(M+="r"),E&2&&(M+="w"),E&1&&(M+="x"),M&&S.nodePermissions(I,M)?-2:0},doDup:function(d,E,I){var D=S.getStream(I);return D&&S.close(D),S.open(d,E,0,I,I).fd},doReadv:function(d,E,I,D){for(var M=0,z=0;z>2],we=fe[E+(z*8+4)>>2],me=S.read(d,pe,ie,we,D);if(me<0)return-1;if(M+=me,me>2],we=fe[E+(z*8+4)>>2],me=S.write(d,pe,ie,we,D);if(me<0)return-1;M+=me}return M},varargs:void 0,get:function(){Tt.varargs+=4;var d=fe[Tt.varargs-4>>2];return d},getStr:function(d){var E=re(d);return E},getStreamFromFD:function(d){var E=S.getStream(d);if(!E)throw new S.ErrnoError(8);return E},get64:function(d,E){return d}};function Ku(d,E){try{return d=Tt.getStr(d),S.chmod(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function Vl(d){return fe[Rt()>>2]=d,d}function xh(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 0:{var M=Tt.get();if(M<0)return-28;var z;return z=S.open(D.path,D.flags,0,M),z.fd}case 1:case 2:return 0;case 3:return D.flags;case 4:{var M=Tt.get();return D.flags|=M,0}case 12:{var M=Tt.get(),ie=0;return Qe[M+ie>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Vl(28),-1;default:return-28}}catch(we){return(typeof S=="undefined"||!(we instanceof S.ErrnoError))&&vr(we),-we.errno}}function kh(d,E){try{var I=Tt.getStreamFromFD(d);return Tt.doStat(S.stat,I.path,E)}catch(D){return(typeof S=="undefined"||!(D instanceof S.ErrnoError))&&vr(D),-D.errno}}function Ph(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 21509:case 21505:return D.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return D.tty?0:-59;case 21519:{if(!D.tty)return-59;var M=Tt.get();return fe[M>>2]=0,0}case 21520:return D.tty?-28:-59;case 21531:{var M=Tt.get();return S.ioctl(D,E,M)}case 21523:return D.tty?0:-59;case 21524:return D.tty?0:-59;default:vr("bad ioctl syscall "+E)}}catch(z){return(typeof S=="undefined"||!(z instanceof S.ErrnoError))&&vr(z),-z.errno}}function Dh(d,E,I){Tt.varargs=I;try{var D=Tt.getStr(d),M=I?Tt.get():0,z=S.open(D,E,M);return z.fd}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),-ie.errno}}function Rh(d,E){try{return d=Tt.getStr(d),E=Tt.getStr(E),S.rename(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function j(d){try{return d=Tt.getStr(d),S.rmdir(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function wt(d,E){try{return d=Tt.getStr(d),Tt.doStat(S.stat,d,E)}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function LA(d){try{return d=Tt.getStr(d),S.unlink(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function $i(d,E,I){V.copyWithin(d,E,E+I)}function Xl(d){try{return A.grow(d-ve.byteLength+65535>>>16),Ei(A.buffer),1}catch(E){}}function $e(d){var E=V.length;d=d>>>0;var I=2147483648;if(d>I)return!1;for(var D=1;D<=4;D*=2){var M=E*(1+.2/D);M=Math.min(M,d+100663296);var z=Math.min(I,ke(Math.max(d,M),65536)),ie=Xl(z);if(ie)return!0}return!1}function Sa(d){try{var E=Tt.getStreamFromFD(d);return S.close(E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),I.errno}}function Uu(d,E){try{var I=Tt.getStreamFromFD(d),D=I.tty?2:S.isDir(I.mode)?3:S.isLink(I.mode)?7:4;return pe[E>>0]=D,0}catch(M){return(typeof S=="undefined"||!(M instanceof S.ErrnoError))&&vr(M),M.errno}}function yE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doReadv(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function Fh(d,E,I,D,M){try{var z=Tt.getStreamFromFD(d),ie=4294967296,we=I*ie+(E>>>0),me=9007199254740992;return we<=-me||we>=me?-61:(S.llseek(z,we,D),Ae=[z.position>>>0,(Dr=z.position,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[M>>2]=Ae[0],fe[M+4>>2]=Ae[1],z.getdents&&we===0&&D===0&&(z.getdents=null),0)}catch(_e){return(typeof S=="undefined"||!(_e instanceof S.ErrnoError))&&vr(_e),_e.errno}}function wE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doWritev(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function gr(d){$(d)}function qn(d){var E=Date.now()/1e3|0;return d&&(fe[d>>2]=E),E}function Zl(){if(Zl.called)return;Zl.called=!0;var d=new Date().getFullYear(),E=new Date(d,0,1),I=new Date(d,6,1),D=E.getTimezoneOffset(),M=I.getTimezoneOffset(),z=Math.max(D,M);fe[zb()>>2]=z*60,fe[Wb()>>2]=Number(D!=M);function ie(Bt){var ut=Bt.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ut?ut[1]:"GMT"}var we=ie(E),me=ie(I),_e=Fe(we),ot=Fe(me);M>2]=_e,fe[Wu()+4>>2]=ot):(fe[Wu()>>2]=ot,fe[Wu()+4>>2]=_e)}function Nh(d){Zl();var E=Date.UTC(fe[d+20>>2]+1900,fe[d+16>>2],fe[d+12>>2],fe[d+8>>2],fe[d+4>>2],fe[d>>2],0),I=new Date(E);fe[d+24>>2]=I.getUTCDay();var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[d+28>>2]=M,I.getTime()/1e3|0}var Zs=function(d,E,I,D){d||(d=this),this.parent=d,this.mount=d.mount,this.mounted=null,this.id=S.nextInode++,this.name=E,this.mode=I,this.node_ops={},this.stream_ops={},this.rdev=D},va=292|73,En=146;if(Object.defineProperties(Zs.prototype,{read:{get:function(){return(this.mode&va)===va},set:function(d){d?this.mode|=va:this.mode&=~va}},write:{get:function(){return(this.mode&En)===En},set:function(d){d?this.mode|=En:this.mode&=~En}},isFolder:{get:function(){return S.isDir(this.mode)}},isDevice:{get:function(){return S.isChrdev(this.mode)}}}),S.FSNode=Zs,S.staticInit(),g){var Oe=v5,Hu=require("path");lt.staticInit()}if(g){var $l=function(d){return function(){try{return d.apply(this,arguments)}catch(E){throw E.code?new S.ErrnoError(Po[E.code]):E}}},$s=Object.assign({},S);for(var ec in mn)S[ec]=$l(mn[ec])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");function TA(d,E,I){var D=I>0?I:he(d)+1,M=new Array(D),z=se(d,M,0,M.length);return E&&(M.length=z),M}var ju=typeof atob=="function"?atob:function(d){var E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",I="",D,M,z,ie,we,me,_e,ot=0;d=d.replace(/[^A-Za-z0-9\+\/\=]/g,"");do ie=E.indexOf(d.charAt(ot++)),we=E.indexOf(d.charAt(ot++)),me=E.indexOf(d.charAt(ot++)),_e=E.indexOf(d.charAt(ot++)),D=ie<<2|we>>4,M=(we&15)<<4|me>>2,z=(me&3)<<6|_e,I=I+String.fromCharCode(D),me!==64&&(I=I+String.fromCharCode(M)),_e!==64&&(I=I+String.fromCharCode(z));while(ot0||(Sr(),hs>0))return;function E(){Ue||(Ue=!0,t.calledRun=!0,!oe&&(jn(),i(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),fs()))}t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),E()},1)):E()}if(t.run=UA,t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return UA(),e}}();typeof Gw=="object"&&typeof jP=="object"?jP.exports=GP:typeof define=="function"&&define.amd?define([],function(){return GP}):typeof Gw=="object"&&(Gw.createModule=GP)});var $5=w((Nst,Z5)=>{function KPe(r,e){for(var t=-1,i=r==null?0:r.length,n=Array(i);++t{var UPe=Array.isArray;e9.exports=UPe});var o9=w((Tst,t9)=>{var r9=Jc(),HPe=$5(),jPe=Ks(),GPe=Id(),YPe=1/0,i9=r9?r9.prototype:void 0,n9=i9?i9.toString:void 0;function s9(r){if(typeof r=="string")return r;if(jPe(r))return HPe(r,s9)+"";if(GPe(r))return n9?n9.call(r):"";var e=r+"";return e=="0"&&1/r==-YPe?"-0":e}t9.exports=s9});var lf=w((Ost,a9)=>{var qPe=o9();function JPe(r){return r==null?"":qPe(r)}a9.exports=JPe});var VP=w((Mst,A9)=>{function WPe(r,e,t){var i=-1,n=r.length;e<0&&(e=-e>n?0:n+e),t=t>n?n:t,t<0&&(t+=n),n=e>t?0:t-e>>>0,e>>>=0;for(var s=Array(n);++i{var zPe=VP();function _Pe(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:zPe(r,e,t)}l9.exports=_Pe});var XP=w((Ust,u9)=>{var VPe="\\ud800-\\udfff",XPe="\\u0300-\\u036f",ZPe="\\ufe20-\\ufe2f",$Pe="\\u20d0-\\u20ff",eDe=XPe+ZPe+$Pe,tDe="\\ufe0e\\ufe0f",rDe="\\u200d",iDe=RegExp("["+rDe+VPe+eDe+tDe+"]");function nDe(r){return iDe.test(r)}u9.exports=nDe});var f9=w((Hst,g9)=>{function sDe(r){return r.split("")}g9.exports=sDe});var y9=w((jst,h9)=>{var p9="\\ud800-\\udfff",oDe="\\u0300-\\u036f",aDe="\\ufe20-\\ufe2f",ADe="\\u20d0-\\u20ff",lDe=oDe+aDe+ADe,cDe="\\ufe0e\\ufe0f",uDe="["+p9+"]",ZP="["+lDe+"]",$P="\\ud83c[\\udffb-\\udfff]",gDe="(?:"+ZP+"|"+$P+")",d9="[^"+p9+"]",C9="(?:\\ud83c[\\udde6-\\uddff]){2}",m9="[\\ud800-\\udbff][\\udc00-\\udfff]",fDe="\\u200d",E9=gDe+"?",I9="["+cDe+"]?",hDe="(?:"+fDe+"(?:"+[d9,C9,m9].join("|")+")"+I9+E9+")*",pDe=I9+E9+hDe,dDe="(?:"+[d9+ZP+"?",ZP,C9,m9,uDe].join("|")+")",CDe=RegExp($P+"(?="+$P+")|"+dDe+pDe,"g");function mDe(r){return r.match(CDe)||[]}h9.exports=mDe});var B9=w((Gst,w9)=>{var EDe=f9(),IDe=XP(),yDe=y9();function wDe(r){return IDe(r)?yDe(r):EDe(r)}w9.exports=wDe});var Q9=w((Yst,b9)=>{var BDe=c9(),bDe=XP(),QDe=B9(),SDe=lf();function vDe(r){return function(e){e=SDe(e);var t=bDe(e)?QDe(e):void 0,i=t?t[0]:e.charAt(0),n=t?BDe(t,1).join(""):e.slice(1);return i[r]()+n}}b9.exports=vDe});var v9=w((qst,S9)=>{var xDe=Q9(),kDe=xDe("toUpperCase");S9.exports=kDe});var Zw=w((Jst,x9)=>{var PDe=lf(),DDe=v9();function RDe(r){return DDe(PDe(r).toLowerCase())}x9.exports=RDe});var k9=w((Wst,$w)=>{function FDe(){var r=0,e=1,t=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,m=15,y=16,b=17,v=0,x=1,T=2,q=3,Y=4;function $(A,oe){return 55296<=A.charCodeAt(oe)&&A.charCodeAt(oe)<=56319&&56320<=A.charCodeAt(oe+1)&&A.charCodeAt(oe+1)<=57343}function _(A,oe){oe===void 0&&(oe=0);var ce=A.charCodeAt(oe);if(55296<=ce&&ce<=56319&&oe=1){var Z=A.charCodeAt(oe-1),O=ce;return 55296<=Z&&Z<=56319?(Z-55296)*1024+(O-56320)+65536:O}return ce}function ne(A,oe,ce){var Z=[A].concat(oe).concat([ce]),O=Z[Z.length-2],L=ce,de=Z.lastIndexOf(p);if(de>1&&Z.slice(1,de).every(function(re){return re==i})&&[i,h,b].indexOf(A)==-1)return T;var Be=Z.lastIndexOf(n);if(Be>0&&Z.slice(1,Be).every(function(re){return re==n})&&[f,n].indexOf(O)==-1)return Z.filter(function(re){return re==n}).length%2==1?q:Y;if(O==r&&L==e)return v;if(O==t||O==r||O==e)return L==p&&oe.every(function(re){return re==i})?T:x;if(L==t||L==r||L==e)return x;if(O==o&&(L==o||L==a||L==c||L==u))return v;if((O==c||O==a)&&(L==a||L==l))return v;if((O==u||O==l)&&L==l)return v;if(L==i||L==m)return v;if(L==s)return v;if(O==f)return v;var je=Z.indexOf(i)!=-1?Z.lastIndexOf(i)-1:Z.length-2;return[h,b].indexOf(Z[je])!=-1&&Z.slice(je+1,-1).every(function(re){return re==i})&&L==p||O==m&&[y,b].indexOf(L)!=-1?v:oe.indexOf(n)!=-1?T:O==n&&L==n?v:x}this.nextBreak=function(A,oe){if(oe===void 0&&(oe=0),oe<0)return 0;if(oe>=A.length-1)return A.length;for(var ce=ee(_(A,oe)),Z=[],O=oe+1;O{var NDe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,eB;function LDe(){if(eB)return eB;if(typeof Intl.Segmenter!="undefined"){let r=new Intl.Segmenter("en",{granularity:"grapheme"});return eB=e=>Array.from(r.segment(e),({segment:t})=>t)}else{let r=k9(),e=new r;return eB=t=>e.splitGraphemes(t)}}P9.exports=(r,e=0,t=r.length)=>{if(e<0||t<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=t-e,n="",s=0,o=0;for(;r.length>0;){let a=r.match(NDe)||[r,r,void 0],l=LDe()(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),r=r.slice(a[0].length)}return n}});var cf=w((Bot,q9)=>{"use strict";var J9=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),wot=q9.exports=r=>r?Object.keys(r).map(e=>[J9.has(e)?J9.get(e):e,r[e]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}});var uf=w((bot,W9)=>{"use strict";var zDe=require("events"),z9=require("stream"),qd=Bp(),_9=require("string_decoder").StringDecoder,lA=Symbol("EOF"),Jd=Symbol("maybeEmitEnd"),Il=Symbol("emittedEnd"),oB=Symbol("emittingEnd"),aB=Symbol("closed"),V9=Symbol("read"),iD=Symbol("flush"),X9=Symbol("flushChunk"),Nn=Symbol("encoding"),cA=Symbol("decoder"),AB=Symbol("flowing"),Wd=Symbol("paused"),zd=Symbol("resume"),pn=Symbol("bufferLength"),Z9=Symbol("bufferPush"),nD=Symbol("bufferShift"),_i=Symbol("objectMode"),Vi=Symbol("destroyed"),$9=global._MP_NO_ITERATOR_SYMBOLS_!=="1",_De=$9&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),VDe=$9&&Symbol.iterator||Symbol("iterator not implemented"),e_=r=>r==="end"||r==="finish"||r==="prefinish",XDe=r=>r instanceof ArrayBuffer||typeof r=="object"&&r.constructor&&r.constructor.name==="ArrayBuffer"&&r.byteLength>=0,ZDe=r=>!Buffer.isBuffer(r)&&ArrayBuffer.isView(r);W9.exports=class t_ extends z9{constructor(e){super();this[AB]=!1,this[Wd]=!1,this.pipes=new qd,this.buffer=new qd,this[_i]=e&&e.objectMode||!1,this[_i]?this[Nn]=null:this[Nn]=e&&e.encoding||null,this[Nn]==="buffer"&&(this[Nn]=null),this[cA]=this[Nn]?new _9(this[Nn]):null,this[lA]=!1,this[Il]=!1,this[oB]=!1,this[aB]=!1,this.writable=!0,this.readable=!0,this[pn]=0,this[Vi]=!1}get bufferLength(){return this[pn]}get encoding(){return this[Nn]}set encoding(e){if(this[_i])throw new Error("cannot set encoding in objectMode");if(this[Nn]&&e!==this[Nn]&&(this[cA]&&this[cA].lastNeed||this[pn]))throw new Error("cannot change encoding");this[Nn]!==e&&(this[cA]=e?new _9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(t=>this[cA].write(t)))),this[Nn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[_i]}set objectMode(e){this[_i]=this[_i]||!!e}write(e,t,i){if(this[lA])throw new Error("write after end");return this[Vi]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8"),!this[_i]&&!Buffer.isBuffer(e)&&(ZDe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):XDe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[_i]&&!(t===this[Nn]&&!this[cA].lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[Nn]&&(e=this[cA].write(e)),this.flowing?(this[pn]!==0&&this[iD](!0),this.emit("data",e)):this[Z9](e),this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Vi])return null;try{return this[pn]===0||e===0||e>this[pn]?null:(this[_i]&&(e=null),this.buffer.length>1&&!this[_i]&&(this.encoding?this.buffer=new qd([Array.from(this.buffer).join("")]):this.buffer=new qd([Buffer.concat(Array.from(this.buffer),this[pn])])),this[V9](e||null,this.buffer.head.value))}finally{this[Jd]()}}[V9](e,t){return e===t.length||e===null?this[nD]():(this.buffer.head.value=t.slice(e),t=t.slice(0,e),this[pn]-=e),this.emit("data",t),!this.buffer.length&&!this[lA]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=null),typeof t=="function"&&(i=t,t="utf8"),e&&this.write(e,t),i&&this.once("end",i),this[lA]=!0,this.writable=!1,(this.flowing||!this[Wd])&&this[Jd](),this}[zd](){this[Vi]||(this[Wd]=!1,this[AB]=!0,this.emit("resume"),this.buffer.length?this[iD]():this[lA]?this[Jd]():this.emit("drain"))}resume(){return this[zd]()}pause(){this[AB]=!1,this[Wd]=!0}get destroyed(){return this[Vi]}get flowing(){return this[AB]}get paused(){return this[Wd]}[Z9](e){return this[_i]?this[pn]+=1:this[pn]+=e.length,this.buffer.push(e)}[nD](){return this.buffer.length&&(this[_i]?this[pn]-=1:this[pn]-=this.buffer.head.value.length),this.buffer.shift()}[iD](e){do;while(this[X9](this[nD]()));!e&&!this.buffer.length&&!this[lA]&&this.emit("drain")}[X9](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,t){if(this[Vi])return;let i=this[Il];t=t||{},e===process.stdout||e===process.stderr?t.end=!1:t.end=t.end!==!1;let n={dest:e,opts:t,ondrain:s=>this[zd]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[zd](),i&&n.opts.end&&n.dest.end(),e}addListener(e,t){return this.on(e,t)}on(e,t){try{return super.on(e,t)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[zd]():e_(e)&&this[Il]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[Il]}[Jd](){!this[oB]&&!this[Il]&&!this[Vi]&&this.buffer.length===0&&this[lA]&&(this[oB]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[aB]&&this.emit("close"),this[oB]=!1)}emit(e,t){if(e!=="error"&&e!=="close"&&e!==Vi&&this[Vi])return;if(e==="data"){if(!t)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(t)===!1&&this.pause())}else if(e==="end"){if(this[Il]===!0)return;this[Il]=!0,this.readable=!1,this[cA]&&(t=this[cA].end(),t&&(this.pipes.forEach(n=>n.dest.write(t)),super.emit("data",t))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[aB]=!0,!this[Il]&&!this[Vi]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=t,arguments.length>2)for(let n=2;n{e.push(i),this[_i]||(e.dataLength+=i.length)}),t.then(()=>e)}concat(){return this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this[Nn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,t)=>{this.on(Vi,()=>t(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>t(i))})}[_De](){return{next:()=>{let t=this.read();if(t!==null)return Promise.resolve({done:!1,value:t});if(this[lA])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[lA]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Vi,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[VDe](){return{next:()=>{let t=this.read();return{value:t,done:t===null}}}}destroy(e){return this[Vi]?(e?this.emit("error",e):this.emit(Vi),this):(this[Vi]=!0,this.buffer=new qd,this[pn]=0,typeof this.close=="function"&&!this[aB]&&this.close(),e?this.emit("error",e):this.emit(Vi),this)}static isStream(e){return!!e&&(e instanceof t_||e instanceof z9||e instanceof zDe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var i_=w((Qot,r_)=>{var $De=require("zlib").constants||{ZLIB_VERNUM:4736};r_.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},$De))});var fD=w(as=>{"use strict";var sD=require("assert"),yl=require("buffer").Buffer,n_=require("zlib"),Zc=as.constants=i_(),eRe=uf(),s_=yl.concat,$c=Symbol("_superWrite"),_d=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},tRe=Symbol("opts"),Vd=Symbol("flushFlag"),o_=Symbol("finishFlushFlag"),oD=Symbol("fullFlushFlag"),pr=Symbol("handle"),lB=Symbol("onError"),gf=Symbol("sawError"),aD=Symbol("level"),AD=Symbol("strategy"),lD=Symbol("ended"),Sot=Symbol("_defaultFullFlush"),cD=class extends eRe{constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[gf]=!1,this[lD]=!1,this[tRe]=e,this[Vd]=e.flush,this[o_]=e.finishFlush;try{this[pr]=new n_[t](e)}catch(i){throw new _d(i)}this[lB]=i=>{this[gf]||(this[gf]=!0,this.close(),this.emit("error",i))},this[pr].on("error",i=>this[lB](new _d(i))),this.once("end",()=>this.close)}close(){this[pr]&&(this[pr].close(),this[pr]=null,this.emit("close"))}reset(){if(!this[gf])return sD(this[pr],"zlib binding closed"),this[pr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[oD]),this.write(Object.assign(yl.alloc(0),{[Vd]:e})))}end(e,t,i){return e&&this.write(e,t),this.flush(this[o_]),this[lD]=!0,super.end(null,null,i)}get ended(){return this[lD]}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=yl.from(e,t)),this[gf])return;sD(this[pr],"zlib binding closed");let n=this[pr]._handle,s=n.close;n.close=()=>{};let o=this[pr].close;this[pr].close=()=>{},yl.concat=c=>c;let a;try{let c=typeof e[Vd]=="number"?e[Vd]:this[Vd];a=this[pr]._processChunk(e,c),yl.concat=s_}catch(c){yl.concat=s_,this[lB](new _d(c))}finally{this[pr]&&(this[pr]._handle=n,n.close=s,this[pr].close=o,this[pr].removeAllListeners("error"))}this[pr]&&this[pr].on("error",c=>this[lB](new _d(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[$c](yl.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[pr].params(e,t)}finally{this[pr].flush=i}this[pr]&&(this[aD]=e,this[AD]=t)}}}},a_=class extends wl{constructor(e){super(e,"Deflate")}},A_=class extends wl{constructor(e){super(e,"Inflate")}},uD=Symbol("_portable"),l_=class extends wl{constructor(e){super(e,"Gzip");this[uD]=e&&!!e.portable}[$c](e){return this[uD]?(this[uD]=!1,e[9]=255,super[$c](e)):super[$c](e)}},c_=class extends wl{constructor(e){super(e,"Gunzip")}},u_=class extends wl{constructor(e){super(e,"DeflateRaw")}},g_=class extends wl{constructor(e){super(e,"InflateRaw")}},f_=class extends wl{constructor(e){super(e,"Unzip")}},gD=class extends cD{constructor(e,t){e=e||{},e.flush=e.flush||Zc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Zc.BROTLI_OPERATION_FINISH,super(e,t),this[oD]=Zc.BROTLI_OPERATION_FLUSH}},h_=class extends gD{constructor(e){super(e,"BrotliCompress")}},p_=class extends gD{constructor(e){super(e,"BrotliDecompress")}};as.Deflate=a_;as.Inflate=A_;as.Gzip=l_;as.Gunzip=c_;as.DeflateRaw=u_;as.InflateRaw=g_;as.Unzip=f_;typeof n_.BrotliCompress=="function"?(as.BrotliCompress=h_,as.BrotliDecompress=p_):as.BrotliCompress=as.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var Xd=w(cB=>{"use strict";cB.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);cB.code=new Map(Array.from(cB.name).map(r=>[r[1],r[0]]))});var Zd=w((Dot,d_)=>{"use strict";var kot=Xd(),rRe=uf(),hD=Symbol("slurp");d_.exports=class extends rRe{constructor(e,t,i){super();switch(this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,t&&this[hD](t),i&&this[hD](i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,n-t),this.ignore?!0:i>=t?super.write(e):super.write(e.slice(0,i))}[hD](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i==="path")&&(this[i]=e[i])}}});var E_=w(pD=>{"use strict";var Rot=pD.encode=(r,e)=>{if(Number.isSafeInteger(r))r<0?nRe(r,e):iRe(r,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},iRe=(r,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=r&255,r=Math.floor(r/256)},nRe=(r,e)=>{e[0]=255;var t=!1;r=r*-1;for(var i=e.length;i>1;i--){var n=r&255;r=Math.floor(r/256),t?e[i-1]=C_(n):n===0?e[i-1]=0:(t=!0,e[i-1]=m_(n))}},Fot=pD.parse=r=>{var e=r[r.length-1],t=r[0],i;if(t===128)i=oRe(r.slice(1,r.length));else if(t===255)i=sRe(r);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},sRe=r=>{for(var e=r.length,t=0,i=!1,n=e-1;n>-1;n--){var s=r[n],o;i?o=C_(s):s===0?o=s:(i=!0,o=m_(s)),o!==0&&(t-=o*Math.pow(256,e-n-1))}return t},oRe=r=>{for(var e=r.length,t=0,i=e-1;i>-1;i--){var n=r[i];n!==0&&(t+=n*Math.pow(256,e-i-1))}return t},C_=r=>(255^r)&255,m_=r=>(255^r)+1&255});var hf=w((Lot,I_)=>{"use strict";var dD=Xd(),ff=require("path").posix,y_=E_(),CD=Symbol("slurp"),As=Symbol("type"),w_=class{constructor(e,t,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[As]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,t||0,i,n):e&&this.set(e)}decode(e,t,i,n){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");if(this.path=eu(e,t,100),this.mode=Bl(e,t+100,8),this.uid=Bl(e,t+108,8),this.gid=Bl(e,t+116,8),this.size=Bl(e,t+124,12),this.mtime=mD(e,t+136,12),this.cksum=Bl(e,t+148,12),this[CD](i),this[CD](n,!0),this[As]=eu(e,t+156,1),this[As]===""&&(this[As]="0"),this[As]==="0"&&this.path.substr(-1)==="/"&&(this[As]="5"),this[As]==="5"&&(this.size=0),this.linkpath=eu(e,t+157,100),e.slice(t+257,t+265).toString()==="ustar\x0000")if(this.uname=eu(e,t+265,32),this.gname=eu(e,t+297,32),this.devmaj=Bl(e,t+329,8),this.devmin=Bl(e,t+337,8),e[t+475]!==0){let o=eu(e,t+345,155);this.path=o+"/"+this.path}else{let o=eu(e,t+345,130);o&&(this.path=o+"/"+this.path),this.atime=mD(e,t+476,12),this.ctime=mD(e,t+488,12)}let s=8*32;for(let o=t;o=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=aRe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=tu(e,t,100,s)||this.needPax,this.needPax=bl(e,t+100,8,this.mode)||this.needPax,this.needPax=bl(e,t+108,8,this.uid)||this.needPax,this.needPax=bl(e,t+116,8,this.gid)||this.needPax,this.needPax=bl(e,t+124,12,this.size)||this.needPax,this.needPax=ED(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this[As].charCodeAt(0),this.needPax=tu(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=tu(e,t+265,32,this.uname)||this.needPax,this.needPax=tu(e,t+297,32,this.gname)||this.needPax,this.needPax=bl(e,t+329,8,this.devmaj)||this.needPax,this.needPax=bl(e,t+337,8,this.devmin)||this.needPax,this.needPax=tu(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=tu(e,t+345,155,o)||this.needPax:(this.needPax=tu(e,t+345,130,o)||this.needPax,this.needPax=ED(e,t+476,12,this.atime)||this.needPax,this.needPax=ED(e,t+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=t;l{let t=100,i=r,n="",s,o=ff.parse(r).root||".";if(Buffer.byteLength(i)t&&Buffer.byteLength(n)<=e?s=[i.substr(0,t-1),n,!0]:(i=ff.join(ff.basename(n),i),n=ff.dirname(n));while(n!==o&&!s);s||(s=[r.substr(0,t-1),"",!0])}return s},eu=(r,e,t)=>r.slice(e,e+t).toString("utf8").replace(/\0.*/,""),mD=(r,e,t)=>ARe(Bl(r,e,t)),ARe=r=>r===null?null:new Date(r*1e3),Bl=(r,e,t)=>r[e]&128?y_.parse(r.slice(e,e+t)):lRe(r,e,t),cRe=r=>isNaN(r)?null:r,lRe=(r,e,t)=>cRe(parseInt(r.slice(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),uRe={12:8589934591,8:2097151},bl=(r,e,t,i)=>i===null?!1:i>uRe[t]||i<0?(y_.encode(i,r.slice(e,e+t)),!0):(gRe(r,e,t,i),!1),gRe=(r,e,t,i)=>r.write(fRe(i,t),e,t,"ascii"),fRe=(r,e)=>hRe(Math.floor(r).toString(8),e),hRe=(r,e)=>(r.length===e-1?r:new Array(e-r.length-1).join("0")+r+" ")+"\0",ED=(r,e,t,i)=>i===null?!1:bl(r,e,t,i.getTime()/1e3),pRe=new Array(156).join("\0"),tu=(r,e,t,i)=>i===null?!1:(r.write(i+pRe,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t);I_.exports=w_});var gB=w((Tot,B_)=>{"use strict";var dRe=hf(),CRe=require("path"),uB=class{constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=t||!1}encode(){let e=this.encodeBody();if(e==="")return null;let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new dRe({path:("PaxHeader/"+CRe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:t,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,t,"utf8");for(let s=t+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};uB.parse=(r,e,t)=>new uB(mRe(ERe(r),e),t);var mRe=(r,e)=>e?Object.keys(r).reduce((t,i)=>(t[i]=r[i],t),e):r,ERe=r=>r.replace(/\n$/,"").split(` +`).reduce(IRe,Object.create(null)),IRe=(r,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return r;e=e.substr((t+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return r;let s=i.join("=");return r[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,r};B_.exports=uB});var fB=w((Oot,b_)=>{"use strict";b_.exports=r=>class extends r{warn(e,t,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),this.emit("warn",i.tarCode,t,i)):t instanceof Error?this.emit("error",Object.assign(t,i)):this.emit("error",Object.assign(new Error(`${e}: ${t}`),i))}}});var yD=w((Mot,Q_)=>{"use strict";var hB=["|","<",">","?",":"],ID=hB.map(r=>String.fromCharCode(61440+r.charCodeAt(0))),yRe=new Map(hB.map((r,e)=>[r,ID[e]])),wRe=new Map(ID.map((r,e)=>[r,hB[e]]));Q_.exports={encode:r=>hB.reduce((e,t)=>e.split(t).join(yRe.get(t)),r),decode:r=>ID.reduce((e,t)=>e.split(t).join(wRe.get(t)),r)}});var v_=w((Kot,S_)=>{"use strict";S_.exports=(r,e,t)=>(r&=4095,t&&(r=(r|384)&~18),e&&(r&256&&(r|=64),r&32&&(r|=8),r&4&&(r|=1)),r)});var xD=w((Yot,x_)=>{"use strict";var k_=uf(),P_=gB(),D_=hf(),Uot=Zd(),sa=require("fs"),pf=require("path"),Hot=Xd(),BRe=16*1024*1024,R_=Symbol("process"),F_=Symbol("file"),N_=Symbol("directory"),wD=Symbol("symlink"),L_=Symbol("hardlink"),$d=Symbol("header"),pB=Symbol("read"),BD=Symbol("lstat"),dB=Symbol("onlstat"),bD=Symbol("onread"),QD=Symbol("onreadlink"),SD=Symbol("openfile"),vD=Symbol("onopenfile"),ru=Symbol("close"),CB=Symbol("mode"),T_=fB(),bRe=yD(),O_=v_(),mB=T_(class extends k_{constructor(e,t){if(t=t||{},super(t),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!t.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=t.maxReadSize||BRe,this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.preservePaths=!!t.preservePaths,this.cwd=t.cwd||process.cwd(),this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.mtime=t.mtime||null,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(!this.preservePaths&&pf.win32.isAbsolute(e)){let n=pf.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!t.win32||process.platform==="win32",this.win32&&(this.path=bRe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=t.absolute||pf.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[dB](this.statCache.get(this.absolute)):this[BD]()}[BD](){sa.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[dB](t)})}[dB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=QRe(e),this.emit("stat",e),this[R_]()}[R_](){switch(this.type){case"File":return this[F_]();case"Directory":return this[N_]();case"SymbolicLink":return this[wD]();default:return this.end()}}[CB](e){return O_(e,this.type==="Directory",this.portable)}[$d](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this[CB](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new P_({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[N_](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[$d](),this.end()}[wD](){sa.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[QD](t)})}[QD](e){this.linkpath=e.replace(/\\/g,"/"),this[$d](),this.end()}[L_](e){this.type="Link",this.linkpath=pf.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[$d](),this.end()}[F_](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let t=this.linkCache.get(e);if(t.indexOf(this.cwd)===0)return this[L_](t)}this.linkCache.set(e,this.absolute)}if(this[$d](),this.stat.size===0)return this.end();this[SD]()}[SD](){sa.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[vD](t)})}[vD](e){let t=512*Math.ceil(this.stat.size/512),i=Math.min(t,this.maxReadSize),n=Buffer.allocUnsafe(i);this[pB](e,n,0,n.length,0,this.stat.size,t)}[pB](e,t,i,n,s,o,a){sa.read(e,t,i,n,s,(l,c)=>{if(l)return this[ru](e,()=>this.emit("error",l));this[bD](e,t,i,n,s,o,a,c)})}[ru](e,t){sa.close(e,t)}[bD](e,t,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(t=Buffer.allocUnsafe(n),i=0),n=t.length-i,this[pB](e,t,i,n,s,o,a)}}),M_=class extends mB{constructor(e,t){super(e,t)}[BD](){this[dB](sa.lstatSync(this.absolute))}[wD](){this[QD](sa.readlinkSync(this.absolute))}[SD](){this[vD](sa.openSync(this.absolute,"r"))}[pB](e,t,i,n,s,o,a){let l=!0;try{let c=sa.readSync(e,t,i,n,s);this[bD](e,t,i,n,s,o,a,c),l=!1}finally{if(l)try{this[ru](e,()=>{})}catch(c){}}}[ru](e,t){sa.closeSync(e),t()}},SRe=T_(class extends k_{constructor(e,t){t=t||{},super(t),this.preservePaths=!!t.preservePaths,this.portable=!!t.portable,this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[CB](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:t.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(pf.isAbsolute(this.path)&&!this.preservePaths){let n=pf.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new P_({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[CB](e){return O_(e,this.type==="Directory",this.portable)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=t,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});mB.Sync=M_;mB.Tar=SRe;var QRe=r=>r.isFile()?"File":r.isDirectory()?"Directory":r.isSymbolicLink()?"SymbolicLink":"Unsupported";x_.exports=mB});var SB=w((Jot,K_)=>{"use strict";var kD=class{constructor(e,t){this.path=e||"./",this.absolute=t,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},vRe=uf(),xRe=fD(),kRe=Zd(),PD=xD(),PRe=PD.Sync,DRe=PD.Tar,RRe=Bp(),U_=Buffer.alloc(1024),EB=Symbol("onStat"),IB=Symbol("ended"),oa=Symbol("queue"),df=Symbol("current"),iu=Symbol("process"),yB=Symbol("processing"),H_=Symbol("processJob"),aa=Symbol("jobs"),DD=Symbol("jobDone"),wB=Symbol("addFSEntry"),j_=Symbol("addTarEntry"),RD=Symbol("stat"),FD=Symbol("readdir"),BB=Symbol("onreaddir"),bB=Symbol("pipe"),G_=Symbol("entry"),ND=Symbol("entryOpt"),LD=Symbol("writeEntryClass"),Y_=Symbol("write"),TD=Symbol("ondrain"),QB=require("fs"),q_=require("path"),FRe=fB(),OD=FRe(class extends vRe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[LD]=PD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new xRe.Gzip(e.gzip),this.zip.on("data",t=>super.write(t)),this.zip.on("end",t=>super.end()),this.zip.on("drain",t=>this[TD]()),this.on("resume",t=>this.zip.resume())):this.on("drain",this[TD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:t=>!0,this[oa]=new RRe,this[aa]=0,this.jobs=+e.jobs||4,this[yB]=!1,this[IB]=!1}[Y_](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[IB]=!0,this[iu](),this}write(e){if(this[IB])throw new Error("write after end");return e instanceof kRe?this[j_](e):this[wB](e),this.flowing}[j_](e){let t=q_.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new kD(e.path,t,!1);i.entry=new DRe(e,this[ND](i)),i.entry.on("end",n=>this[DD](i)),this[aa]+=1,this[oa].push(i)}this[iu]()}[wB](e){let t=q_.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[oa].push(new kD(e,t)),this[iu]()}[RD](e){e.pending=!0,this[aa]+=1;let t=this.follow?"stat":"lstat";QB[t](e.absolute,(i,n)=>{e.pending=!1,this[aa]-=1,i?this.emit("error",i):this[EB](e,n)})}[EB](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)||(e.ignore=!0),this[iu]()}[FD](e){e.pending=!0,this[aa]+=1,QB.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[aa]-=1,t)return this.emit("error",t);this[BB](e,i)})}[BB](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[iu]()}[iu](){if(!this[yB]){this[yB]=!0;for(let e=this[oa].head;e!==null&&this[aa]this.warn(t,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[G_](e){this[aa]+=1;try{return new this[LD](e.path,this[ND](e)).on("end",()=>this[DD](e)).on("error",t=>this.emit("error",t))}catch(t){this.emit("error",t)}}[TD](){this[df]&&this[df].entry&&this[df].entry.resume()}[bB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)});let t=e.entry,i=this.zip;i?t.on("data",n=>{i.write(n)||t.pause()}):t.on("data",n=>{super.write(n)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),J_=class extends OD{constructor(e){super(e);this[LD]=PRe}pause(){}resume(){}[RD](e){let t=this.follow?"statSync":"lstatSync";this[EB](e,QB[t](e.absolute))}[FD](e,t){this[BB](e,QB.readdirSync(e.absolute))}[bB](e){let t=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)}),i?t.on("data",n=>{i.write(n)}):t.on("data",n=>{super[Y_](n)})}};OD.Sync=J_;K_.exports=OD});var wf=w(eC=>{"use strict";var NRe=uf(),LRe=require("events").EventEmitter,Us=require("fs"),vB=process.binding("fs"),Wot=vB.writeBuffers,TRe=vB.FSReqWrap||vB.FSReqCallback,Cf=Symbol("_autoClose"),Aa=Symbol("_close"),tC=Symbol("_ended"),or=Symbol("_fd"),W_=Symbol("_finished"),nu=Symbol("_flags"),MD=Symbol("_flush"),KD=Symbol("_handleChunk"),UD=Symbol("_makeBuf"),HD=Symbol("_mode"),xB=Symbol("_needDrain"),mf=Symbol("_onerror"),Ef=Symbol("_onopen"),jD=Symbol("_onread"),su=Symbol("_onwrite"),Ql=Symbol("_open"),Sl=Symbol("_path"),ou=Symbol("_pos"),la=Symbol("_queue"),If=Symbol("_read"),z_=Symbol("_readSize"),vl=Symbol("_reading"),kB=Symbol("_remain"),__=Symbol("_size"),PB=Symbol("_write"),yf=Symbol("_writing"),DB=Symbol("_defaultFlag"),GD=class extends NRe{constructor(e,t){if(t=t||{},super(t),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[or]=typeof t.fd=="number"?t.fd:null,this[Sl]=e,this[z_]=t.readSize||16*1024*1024,this[vl]=!1,this[__]=typeof t.size=="number"?t.size:Infinity,this[kB]=this[__],this[Cf]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[or]=="number"?this[If]():this[Ql]()}get fd(){return this[or]}get path(){return this[Sl]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ql](){Us.open(this[Sl],"r",(e,t)=>this[Ef](e,t))}[Ef](e,t){e?this[mf](e):(this[or]=t,this.emit("open",t),this[If]())}[UD](){return Buffer.allocUnsafe(Math.min(this[z_],this[kB]))}[If](){if(!this[vl]){this[vl]=!0;let e=this[UD]();if(e.length===0)return process.nextTick(()=>this[jD](null,0,e));Us.read(this[or],e,0,e.length,null,(t,i,n)=>this[jD](t,i,n))}}[jD](e,t,i){this[vl]=!1,e?this[mf](e):this[KD](t,i)&&this[If]()}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}[mf](e){this[vl]=!0,this[Aa](),this.emit("error",e)}[KD](e,t){let i=!1;return this[kB]-=e,e>0&&(i=super.write(ethis[Ef](e,t))}[Ef](e,t){this[DB]&&this[nu]==="r+"&&e&&e.code==="ENOENT"?(this[nu]="w",this[Ql]()):e?this[mf](e):(this[or]=t,this.emit("open",t),this[MD]())}end(e,t){e&&this.write(e,t),this[tC]=!0,!this[yf]&&!this[la].length&&typeof this[or]=="number"&&this[su](null,0)}write(e,t){return typeof e=="string"&&(e=new Buffer(e,t)),this[tC]?(this.emit("error",new Error("write() after end()")),!1):this[or]===null||this[yf]||this[la].length?(this[la].push(e),this[xB]=!0,!1):(this[yf]=!0,this[PB](e),!0)}[PB](e){Us.write(this[or],e,0,e.length,this[ou],(t,i)=>this[su](t,i))}[su](e,t){e?this[mf](e):(this[ou]!==null&&(this[ou]+=t),this[la].length?this[MD]():(this[yf]=!1,this[tC]&&!this[W_]?(this[W_]=!0,this[Aa](),this.emit("finish")):this[xB]&&(this[xB]=!1,this.emit("drain"))))}[MD](){if(this[la].length===0)this[tC]&&this[su](null,0);else if(this[la].length===1)this[PB](this[la].pop());else{let e=this[la];this[la]=[],ORe(this[or],e,this[ou],(t,i)=>this[su](t,i))}}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}},X_=class extends YD{[Ql](){let e;try{e=Us.openSync(this[Sl],this[nu],this[HD])}catch(t){if(this[DB]&&this[nu]==="r+"&&t&&t.code==="ENOENT")return this[nu]="w",this[Ql]();throw t}this[Ef](null,e)}[Aa](){if(this[Cf]&&typeof this[or]=="number"){try{Us.closeSync(this[or])}catch(e){}this[or]=null,this.emit("close")}}[PB](e){try{this[su](null,Us.writeSync(this[or],e,0,e.length,this[ou]))}catch(t){this[su](t,0)}}},ORe=(r,e,t,i)=>{let n=(o,a)=>i(o,a,e),s=new TRe;s.oncomplete=n,vB.writeBuffers(r,e,t,s)};eC.ReadStream=GD;eC.ReadStreamSync=V_;eC.WriteStream=YD;eC.WriteStreamSync=X_});var nC=w((Xot,Z_)=>{"use strict";var MRe=fB(),_ot=require("path"),KRe=hf(),URe=require("events"),HRe=Bp(),jRe=1024*1024,GRe=Zd(),$_=gB(),YRe=fD(),qD=Buffer.from([31,139]),Hs=Symbol("state"),au=Symbol("writeEntry"),uA=Symbol("readEntry"),JD=Symbol("nextEntry"),eV=Symbol("processEntry"),js=Symbol("extendedHeader"),rC=Symbol("globalExtendedHeader"),xl=Symbol("meta"),tV=Symbol("emitMeta"),yr=Symbol("buffer"),gA=Symbol("queue"),Au=Symbol("ended"),rV=Symbol("emittedEnd"),lu=Symbol("emit"),Ln=Symbol("unzip"),RB=Symbol("consumeChunk"),FB=Symbol("consumeChunkSub"),WD=Symbol("consumeBody"),iV=Symbol("consumeMeta"),nV=Symbol("consumeHeader"),NB=Symbol("consuming"),zD=Symbol("bufferConcat"),_D=Symbol("maybeEnd"),iC=Symbol("writing"),kl=Symbol("aborted"),LB=Symbol("onDone"),cu=Symbol("sawValidEntry"),TB=Symbol("sawNullBlock"),OB=Symbol("sawEOF"),qRe=r=>!0;Z_.exports=MRe(class extends URe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[cu]=null,this.on(LB,t=>{(this[Hs]==="begin"||this[cu]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(LB,e.ondone):this.on(LB,t=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||jRe,this.filter=typeof e.filter=="function"?e.filter:qRe,this.writable=!0,this.readable=!1,this[gA]=new HRe,this[yr]=null,this[uA]=null,this[au]=null,this[Hs]="begin",this[xl]="",this[js]=null,this[rC]=null,this[Au]=!1,this[Ln]=null,this[kl]=!1,this[TB]=!1,this[OB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[nV](e,t){this[cu]===null&&(this[cu]=!1);let i;try{i=new KRe(e,t,this[js],this[rC])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[TB]?(this[OB]=!0,this[Hs]==="begin"&&(this[Hs]="header"),this[lu]("eof")):(this[TB]=!0,this[lu]("nullBlock"));else if(this[TB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[au]=new GRe(i,this[js],this[rC]);if(!this[cu])if(s.remain){let o=()=>{s.invalid||(this[cu]=!0)};s.on("end",o)}else this[cu]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[lu]("ignoredEntry",s),this[Hs]="ignore",s.resume()):s.size>0&&(this[xl]="",s.on("data",o=>this[xl]+=o),this[Hs]="meta"):(this[js]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[lu]("ignoredEntry",s),this[Hs]=s.remain?"ignore":"header",s.resume()):(s.remain?this[Hs]="body":(this[Hs]="header",s.end()),this[uA]?this[gA].push(s):(this[gA].push(s),this[JD]())))}}}[eV](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[uA]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[JD]()),t=!1)):(this[uA]=null,t=!1),t}[JD](){do;while(this[eV](this[gA].shift()));if(!this[gA].length){let e=this[uA];!e||e.flowing||e.size===e.remain?this[iC]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[WD](e,t){let i=this[au],n=i.blockRemain,s=n>=e.length&&t===0?e:e.slice(t,t+n);return i.write(s),i.blockRemain||(this[Hs]="header",this[au]=null,i.end()),s.length}[iV](e,t){let i=this[au],n=this[WD](e,t);return this[au]||this[tV](i),n}[lu](e,t,i){!this[gA].length&&!this[uA]?this.emit(e,t,i):this[gA].push([e,t,i])}[tV](e){switch(this[lu]("meta",this[xl]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[js]=$_.parse(this[xl],this[js],!1);break;case"GlobalExtendedHeader":this[rC]=$_.parse(this[xl],this[rC],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[js]=this[js]||Object.create(null),this[js].path=this[xl].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[js]=this[js]||Object.create(null),this[js].linkpath=this[xl].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[kl]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[kl])return;if(this[Ln]===null&&e){if(this[yr]&&(e=Buffer.concat([this[yr],e]),this[yr]=null),e.lengththis[RB](s)),this[Ln].on("error",s=>this.abort(s)),this[Ln].on("end",s=>{this[Au]=!0,this[RB]()}),this[iC]=!0;let n=this[Ln][i?"end":"write"](e);return this[iC]=!1,n}}this[iC]=!0,this[Ln]?this[Ln].write(e):this[RB](e),this[iC]=!1;let t=this[gA].length?!1:this[uA]?this[uA].flowing:!0;return!t&&!this[gA].length&&this[uA].once("drain",i=>this.emit("drain")),t}[zD](e){e&&!this[kl]&&(this[yr]=this[yr]?Buffer.concat([this[yr],e]):e)}[_D](){if(this[Au]&&!this[rV]&&!this[kl]&&!this[NB]){this[rV]=!0;let e=this[au];if(e&&e.blockRemain){let t=this[yr]?this[yr].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[yr]&&e.write(this[yr]),e.end()}this[lu](LB)}}[RB](e){if(this[NB])this[zD](e);else if(!e&&!this[yr])this[_D]();else{if(this[NB]=!0,this[yr]){this[zD](e);let t=this[yr];this[yr]=null,this[FB](t)}else this[FB](e);for(;this[yr]&&this[yr].length>=512&&!this[kl]&&!this[OB];){let t=this[yr];this[yr]=null,this[FB](t)}this[NB]=!1}(!this[yr]||this[Au])&&this[_D]()}[FB](e){let t=0,i=e.length;for(;t+512<=i&&!this[kl]&&!this[OB];)switch(this[Hs]){case"begin":case"header":this[nV](e,t),t+=512;break;case"ignore":case"body":t+=this[WD](e,t);break;case"meta":t+=this[iV](e,t);break;default:throw new Error("invalid state: "+this[Hs])}t{"use strict";var JRe=cf(),oV=nC(),Bf=require("fs"),WRe=wf(),aV=require("path"),Zot=sV.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=JRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&_Re(i,e),i.noResume||zRe(i),i.file&&i.sync?VRe(i):i.file?XRe(i,t):AV(i)},zRe=r=>{let e=r.onentry;r.onentry=e?t=>{e(t),t.resume()}:t=>t.resume()},_Re=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||aV.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(aV.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},VRe=r=>{let e=AV(r),t=r.file,i=!0,n;try{let s=Bf.statSync(t),o=r.maxReadSize||16*1024*1024;if(s.size{let t=new oV(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("end",o),Bf.stat(n,(l,c)=>{if(l)a(l);else{let u=new WRe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},AV=r=>new oV(r)});var hV=w((rat,lV)=>{"use strict";var ZRe=cf(),KB=SB(),eat=require("fs"),cV=wf(),uV=MB(),gV=require("path"),tat=lV.exports=(r,e,t)=>{if(typeof e=="function"&&(t=e),Array.isArray(r)&&(e=r,r={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=ZRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?$Re(i,e):i.file?eFe(i,e,t):i.sync?tFe(i,e):rFe(i,e)},$Re=(r,e)=>{let t=new KB.Sync(r),i=new cV.WriteStreamSync(r.file,{mode:r.mode||438});t.pipe(i),fV(t,e)},eFe=(r,e,t)=>{let i=new KB(r),n=new cV.WriteStream(r.file,{mode:r.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return VD(i,e),t?s.then(t,t):s},fV=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?uV({file:gV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},VD=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return uV({file:gV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>VD(r,e));r.add(t)}r.end()},tFe=(r,e)=>{let t=new KB.Sync(r);return fV(t,e),t},rFe=(r,e)=>{let t=new KB(r);return VD(t,e),t}});var XD=w((sat,pV)=>{"use strict";var iFe=cf(),dV=SB(),iat=nC(),Gs=require("fs"),CV=wf(),mV=MB(),EV=require("path"),IV=hf(),nat=pV.exports=(r,e,t)=>{let i=iFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?nFe(i,e):sFe(i,e,t)},nFe=(r,e)=>{let t=new dV.Sync(r),i=!0,n,s;try{try{n=Gs.openSync(r.file,"r+")}catch(l){if(l.code==="ENOENT")n=Gs.openSync(r.file,"w+");else throw l}let o=Gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,r.mtimeCache&&r.mtimeCache.set(l.path,l.mtime)}i=!1,oFe(r,t,s,n,e)}finally{if(i)try{Gs.closeSync(n)}catch(o){}}},oFe=(r,e,t,i,n)=>{let s=new CV.WriteStreamSync(r.file,{fd:i,start:t});e.pipe(s),aFe(e,n)},sFe=(r,e,t)=>{e=Array.from(e);let i=new dV(r),n=(o,a,l)=>{let c=(p,m)=>{p?Gs.close(o,y=>l(p)):l(null,m)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,m)=>{if(p)return c(p);if(g+=m,g<512&&m)return Gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let y=new IV(f);if(!y.cksumValid)return c(null,u);let b=512*Math.ceil(y.size/512);if(u+b+512>a||(u+=b+512,u>=a))return c(null,u);r.mtimeCache&&r.mtimeCache.set(y.path,y.mtime),g=0,Gs.read(o,f,0,512,u,h)};Gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",Gs.open(r.file,l,c);if(u)return a(u);Gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,m)=>{if(p)return a(p);let y=new CV.WriteStream(r.file,{fd:g,start:m});i.pipe(y),y.on("error",a),y.on("close",o),yV(i,e)})})};Gs.open(r.file,l,c)});return t?s.then(t,t):s},aFe=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?mV({file:EV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},yV=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return mV({file:EV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>yV(r,e));r.add(t)}r.end()}});var BV=w((aat,wV)=>{"use strict";var AFe=cf(),lFe=XD(),oat=wV.exports=(r,e,t)=>{let i=AFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),cFe(i),lFe(i,e,t)},cFe=r=>{let e=r.filter;r.mtimeCache||(r.mtimeCache=new Map),r.filter=e?(t,i)=>e(t,i)&&!(r.mtimeCache.get(t)>i.mtime):(t,i)=>!(r.mtimeCache.get(t)>i.mtime)}});var SV=w((Aat,bV)=>{var{promisify:QV}=require("util"),Pl=require("fs"),uFe=r=>{if(!r)r={mode:511,fs:Pl};else if(typeof r=="object")r=N({mode:511,fs:Pl},r);else if(typeof r=="number")r={mode:r,fs:Pl};else if(typeof r=="string")r={mode:parseInt(r,8),fs:Pl};else throw new TypeError("invalid options argument");return r.mkdir=r.mkdir||r.fs.mkdir||Pl.mkdir,r.mkdirAsync=QV(r.mkdir),r.stat=r.stat||r.fs.stat||Pl.stat,r.statAsync=QV(r.stat),r.statSync=r.statSync||r.fs.statSync||Pl.statSync,r.mkdirSync=r.mkdirSync||r.fs.mkdirSync||Pl.mkdirSync,r};bV.exports=uFe});var xV=w((lat,vV)=>{var gFe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:fFe,parse:hFe}=require("path"),pFe=r=>{if(/\0/.test(r))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:r,code:"ERR_INVALID_ARG_VALUE"});if(r=fFe(r),gFe==="win32"){let e=/[*|"<>?:]/,{root:t}=hFe(r);if(e.test(r.substr(t.length)))throw Object.assign(new Error("Illegal characters in path."),{path:r,code:"EINVAL"})}return r};vV.exports=pFe});var FV=w((cat,kV)=>{var{dirname:PV}=require("path"),DV=(r,e,t=void 0)=>t===e?Promise.resolve():r.statAsync(e).then(i=>i.isDirectory()?t:void 0,i=>i.code==="ENOENT"?DV(r,PV(e),e):void 0),RV=(r,e,t=void 0)=>{if(t!==e)try{return r.statSync(e).isDirectory()?t:void 0}catch(i){return i.code==="ENOENT"?RV(r,PV(e),e):void 0}};kV.exports={findMade:DV,findMadeSync:RV}});var eR=w((uat,NV)=>{var{dirname:LV}=require("path"),ZD=(r,e,t)=>{e.recursive=!1;let i=LV(r);return i===r?e.mkdirAsync(r,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(r,e).then(()=>t||r,n=>{if(n.code==="ENOENT")return ZD(i,e).then(s=>ZD(r,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(r).then(s=>{if(s.isDirectory())return t;throw n},()=>{throw n})})},$D=(r,e,t)=>{let i=LV(r);if(e.recursive=!1,i===r)try{return e.mkdirSync(r,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(r,e),t||r}catch(n){if(n.code==="ENOENT")return $D(r,e,$D(i,e,t));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(r).isDirectory())throw n}catch(s){throw n}}};NV.exports={mkdirpManual:ZD,mkdirpManualSync:$D}});var MV=w((gat,TV)=>{var{dirname:OV}=require("path"),{findMade:dFe,findMadeSync:CFe}=FV(),{mkdirpManual:mFe,mkdirpManualSync:EFe}=eR(),IFe=(r,e)=>(e.recursive=!0,OV(r)===r?e.mkdirAsync(r,e):dFe(e,r).then(i=>e.mkdirAsync(r,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return mFe(r,e);throw n}))),yFe=(r,e)=>{if(e.recursive=!0,OV(r)===r)return e.mkdirSync(r,e);let i=CFe(e,r);try{return e.mkdirSync(r,e),i}catch(n){if(n.code==="ENOENT")return EFe(r,e);throw n}};TV.exports={mkdirpNative:IFe,mkdirpNativeSync:yFe}});var jV=w((fat,KV)=>{var UV=require("fs"),wFe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,tR=wFe.replace(/^v/,"").split("."),HV=+tR[0]>10||+tR[0]==10&&+tR[1]>=12,BFe=HV?r=>r.mkdir===UV.mkdir:()=>!1,bFe=HV?r=>r.mkdirSync===UV.mkdirSync:()=>!1;KV.exports={useNative:BFe,useNativeSync:bFe}});var zV=w((hat,GV)=>{var bf=SV(),Qf=xV(),{mkdirpNative:YV,mkdirpNativeSync:qV}=MV(),{mkdirpManual:JV,mkdirpManualSync:WV}=eR(),{useNative:QFe,useNativeSync:SFe}=jV(),Sf=(r,e)=>(r=Qf(r),e=bf(e),QFe(e)?YV(r,e):JV(r,e)),vFe=(r,e)=>(r=Qf(r),e=bf(e),SFe(e)?qV(r,e):WV(r,e));Sf.sync=vFe;Sf.native=(r,e)=>YV(Qf(r),bf(e));Sf.manual=(r,e)=>JV(Qf(r),bf(e));Sf.nativeSync=(r,e)=>qV(Qf(r),bf(e));Sf.manualSync=(r,e)=>WV(Qf(r),bf(e));GV.exports=Sf});var t6=w((pat,_V)=>{"use strict";var Ys=require("fs"),uu=require("path"),xFe=Ys.lchown?"lchown":"chown",kFe=Ys.lchownSync?"lchownSync":"chownSync",VV=Ys.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),XV=(r,e,t)=>{try{return Ys[kFe](r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},PFe=(r,e,t)=>{try{return Ys.chownSync(r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},DFe=VV?(r,e,t,i)=>n=>{!n||n.code!=="EISDIR"?i(n):Ys.chown(r,e,t,i)}:(r,e,t,i)=>i,rR=VV?(r,e,t)=>{try{return XV(r,e,t)}catch(i){if(i.code!=="EISDIR")throw i;PFe(r,e,t)}}:(r,e,t)=>XV(r,e,t),RFe=process.version,ZV=(r,e,t)=>Ys.readdir(r,e,t),FFe=(r,e)=>Ys.readdirSync(r,e);/^v4\./.test(RFe)&&(ZV=(r,e,t)=>Ys.readdir(r,t));var UB=(r,e,t,i)=>{Ys[xFe](r,e,t,DFe(r,e,t,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},$V=(r,e,t,i,n)=>{if(typeof e=="string")return Ys.lstat(uu.resolve(r,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,$V(r,o,t,i,n)});if(e.isDirectory())iR(uu.resolve(r,e.name),t,i,s=>{if(s)return n(s);let o=uu.resolve(r,e.name);UB(o,t,i,n)});else{let s=uu.resolve(r,e.name);UB(s,t,i,n)}},iR=(r,e,t,i)=>{ZV(r,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return UB(r,e,t,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return UB(r,e,t,i)}};s.forEach(c=>$V(r,c,e,t,l))})},NFe=(r,e,t,i)=>{if(typeof e=="string")try{let n=Ys.lstatSync(uu.resolve(r,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&e6(uu.resolve(r,e.name),t,i),rR(uu.resolve(r,e.name),t,i)},e6=(r,e,t)=>{let i;try{i=FFe(r,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return rR(r,e,t);throw n}return i&&i.length&&i.forEach(n=>NFe(r,n,e,t)),rR(r,e,t)};_V.exports=iR;iR.sync=e6});var s6=w((mat,nR)=>{"use strict";var r6=zV(),qs=require("fs"),HB=require("path"),i6=t6(),sR=class extends Error{constructor(e,t){super("Cannot extract through symbolic link");this.path=t,this.symlink=e}get name(){return"SylinkError"}},sC=class extends Error{constructor(e,t){super(t+": Cannot cd into '"+e+"'");this.path=e,this.code=t}get name(){return"CwdError"}},dat=nR.exports=(r,e,t)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(y,b)=>{y?t(y):(g.set(r,!0),b&&l?i6(b,o,a,v=>h(v)):s?qs.chmod(r,n,t):t())};if(g&&g.get(r)===!0)return h();if(r===f)return qs.stat(r,(y,b)=>{(y||!b.isDirectory())&&(y=new sC(r,y&&y.code||"ENOTDIR")),h(y)});if(c)return r6(r,{mode:n}).then(y=>h(null,y),h);let m=HB.relative(f,r).split(/\/|\\/);jB(f,m,n,g,u,f,null,h)},jB=(r,e,t,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=r+"/"+l;if(i.get(c))return jB(c,e,t,i,n,s,o,a);qs.mkdir(c,t,n6(c,e,t,i,n,s,o,a))},n6=(r,e,t,i,n,s,o,a)=>l=>{if(l){if(l.path&&HB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new sC(s,l.code));qs.lstat(r,(c,u)=>{if(c)a(c);else if(u.isDirectory())jB(r,e,t,i,n,s,o,a);else if(n)qs.unlink(r,g=>{if(g)return a(g);qs.mkdir(r,t,n6(r,e,t,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new sR(r,r+"/"+e.join("/")));a(l)}})}else o=o||r,jB(r,e,t,i,n,s,o,a)},Cat=nR.exports.sync=(r,e)=>{let t=e.umask,i=e.mode|448,n=(i&t)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=y=>{u.set(r,!0),y&&a&&i6.sync(y,s,o),n&&qs.chmodSync(r,i)};if(u&&u.get(r)===!0)return f();if(r===g){let y=!1,b="ENOTDIR";try{y=qs.statSync(r).isDirectory()}catch(v){b=v.code}finally{if(!y)throw new sC(r,b)}f();return}if(l)return f(r6.sync(r,i));let p=HB.relative(g,r).split(/\/|\\/),m=null;for(let y=p.shift(),b=g;y&&(b+="/"+y);y=p.shift())if(!u.get(b))try{qs.mkdirSync(b,i),m=m||b,u.set(b,!0)}catch(v){if(v.path&&HB.dirname(v.path)===g&&(v.code==="ENOTDIR"||v.code==="ENOENT"))return new sC(g,v.code);let x=qs.lstatSync(b);if(x.isDirectory()){u.set(b,!0);continue}else if(c){qs.unlinkSync(b),qs.mkdirSync(b,i),m=m||b,u.set(b,!0);continue}else if(x.isSymbolicLink())return new sR(b,b+"/"+p.join("/"))}return f(m)}});var A6=w((Eat,o6)=>{var a6=require("assert");o6.exports=()=>{let r=new Map,e=new Map,{join:t}=require("path"),i=u=>t(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(t(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>r.get(f)),dirs:[...g.dirs].map(f=>r.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let m=r.get(p);a6.equal(m[0],u),m.length===1?r.delete(p):(m.shift(),typeof m[0]=="function"?h.add(m[0]):m[0].forEach(y=>h.add(y)))}),f.forEach(p=>{let m=r.get(p);a6(m[0]instanceof Set),m[0].size===1&&m.length===1?r.delete(p):m[0].size===1?(m.shift(),h.add(m[0])):m[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=r.get(h);p?p.push(g):r.set(h,[g])}),f.forEach(h=>{let p=r.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):r.set(h,[new Set([g])])}),a(g)}}}});var u6=w((Iat,l6)=>{var LFe=process.env.__FAKE_PLATFORM__||process.platform,TFe=LFe==="win32",OFe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:MFe,O_TRUNC:KFe,O_WRONLY:UFe,UV_FS_O_FILEMAP:c6=0}=OFe.constants,HFe=TFe&&!!c6,jFe=512*1024,GFe=c6|KFe|MFe|UFe;l6.exports=HFe?r=>r"w"});var hR=w((bat,g6)=>{"use strict";var YFe=require("assert"),yat=require("events").EventEmitter,qFe=nC(),$t=require("fs"),JFe=wf(),fA=require("path"),oR=s6(),wat=oR.sync,f6=yD(),WFe=A6(),h6=Symbol("onEntry"),aR=Symbol("checkFs"),p6=Symbol("checkFs2"),AR=Symbol("isReusable"),hA=Symbol("makeFs"),lR=Symbol("file"),cR=Symbol("directory"),GB=Symbol("link"),d6=Symbol("symlink"),C6=Symbol("hardlink"),m6=Symbol("unsupported"),Bat=Symbol("unknown"),E6=Symbol("checkPath"),vf=Symbol("mkdir"),dn=Symbol("onError"),YB=Symbol("pending"),I6=Symbol("pend"),xf=Symbol("unpend"),uR=Symbol("ended"),gR=Symbol("maybeClose"),fR=Symbol("skip"),oC=Symbol("doChown"),aC=Symbol("uid"),AC=Symbol("gid"),y6=require("crypto"),w6=u6(),qB=()=>{throw new Error("sync function called cb somehow?!?")},zFe=(r,e)=>{if(process.platform!=="win32")return $t.unlink(r,e);let t=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.rename(r,t,i=>{if(i)return e(i);$t.unlink(t,e)})},_Fe=r=>{if(process.platform!=="win32")return $t.unlinkSync(r);let e=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.renameSync(r,e),$t.unlinkSync(e)},B6=(r,e,t)=>r===r>>>0?r:e===e>>>0?e:t,JB=class extends qFe{constructor(e){if(e||(e={}),e.ondone=t=>{this[uR]=!0,this[gR]()},super(e),this.reservations=WFe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[YB]=0,this[uR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=fA.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[h6](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[gR](){this[uR]&&this[YB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[E6](e){if(this.strip){let t=e.path.split(/\/|\\/);if(t.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let t=e.path;if(t.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:t}),!1;if(fA.win32.isAbsolute(t)){let i=fA.win32.parse(t);e.path=t.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:t})}}if(this.win32){let t=fA.win32.parse(e.path);e.path=t.root===""?f6.encode(e.path):t.root+f6.encode(e.path.substr(t.root.length))}return fA.isAbsolute(e.path)?e.absolute=e.path:e.absolute=fA.resolve(this.cwd,e.path),!0}[h6](e){if(!this[E6](e))return e.resume();switch(YFe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[aR](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[m6](e)}}[dn](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[xf](),t.resume())}[vf](e,t,i){oR(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t},i)}[oC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[aC](e){return B6(this.uid,e.uid,this.processUid)}[AC](e){return B6(this.gid,e.gid,this.processGid)}[lR](e,t){let i=e.mode&4095||this.fmode,n=new JFe.WriteStream(e.absolute,{flags:w6(e.size),mode:i,autoClose:!1});n.on("error",l=>this[dn](l,e));let s=1,o=l=>{if(l)return this[dn](l,e);--s==0&&$t.close(n.fd,c=>{t(),c?this[dn](c,e):this[xf]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;$t.futimes(u,g,f,h=>h?$t.utimes(c,g,f,p=>o(p&&h)):o())}if(this[oC](e)){s++;let g=this[aC](e),f=this[AC](e);$t.fchown(u,g,f,h=>h?$t.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.pipe(n)}[cR](e,t){let i=e.mode&4095||this.dmode;this[vf](e.absolute,i,n=>{if(n)return t(),this[dn](n,e);let s=1,o=a=>{--s==0&&(t(),this[xf](),e.resume())};e.mtime&&!this.noMtime&&(s++,$t.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[oC](e)&&(s++,$t.chown(e.absolute,this[aC](e),this[AC](e),o)),o()})}[m6](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[d6](e,t){this[GB](e,e.linkpath,"symlink",t)}[C6](e,t){this[GB](e,fA.resolve(this.cwd,e.linkpath),"link",t)}[I6](){this[YB]++}[xf](){this[YB]--,this[gR]()}[fR](e){this[xf](),e.resume()}[AR](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&process.platform!=="win32"}[aR](e){this[I6]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[p6](e,i))}[p6](e,t){this[vf](fA.dirname(e.absolute),this.dmode,i=>{if(i)return t(),this[dn](i,e);$t.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[fR](e),t()):n||this[AR](e,s)?this[hA](null,e,t):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[hA](null,e,t):$t.chmod(e.absolute,e.mode,o=>this[hA](o,e,t)):$t.rmdir(e.absolute,o=>this[hA](o,e,t)):zFe(e.absolute,o=>this[hA](o,e,t))})})}[hA](e,t,i){if(e)return this[dn](e,t);switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[lR](t,i);case"Link":return this[C6](t,i);case"SymbolicLink":return this[d6](t,i);case"Directory":case"GNUDumpDir":return this[cR](t,i)}}[GB](e,t,i,n){$t[i](t,e.absolute,s=>{if(s)return this[dn](s,e);n(),this[xf](),e.resume()})}},b6=class extends JB{constructor(e){super(e)}[aR](e){let t=this[vf](fA.dirname(e.absolute),this.dmode,qB);if(t)return this[dn](t,e);try{let i=$t.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[fR](e);if(this[AR](e,i))return this[hA](null,e,qB);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&$t.chmodSync(e.absolute,e.mode):$t.rmdirSync(e.absolute):_Fe(e.absolute),this[hA](null,e,qB)}catch(n){return this[dn](n,e)}}catch(i){return this[hA](null,e,qB)}}[lR](e,t){let i=e.mode&4095||this.fmode,n=l=>{let c;try{$t.closeSync(o)}catch(u){c=u}(l||c)&&this[dn](l||c,e)},s,o;try{o=$t.openSync(e.absolute,w6(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.on("data",l=>{try{$t.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{$t.futimesSync(o,u,g)}catch(f){try{$t.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[oC](e)){let u=this[aC](e),g=this[AC](e);try{$t.fchownSync(o,u,g)}catch(f){try{$t.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[cR](e,t){let i=e.mode&4095||this.dmode,n=this[vf](e.absolute,i);if(n)return this[dn](n,e);if(e.mtime&&!this.noMtime)try{$t.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[oC](e))try{$t.chownSync(e.absolute,this[aC](e),this[AC](e))}catch(s){}e.resume()}[vf](e,t){try{return oR.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t})}catch(i){return i}}[GB](e,t,i,n){try{$t[i+"Sync"](t,e.absolute),e.resume()}catch(s){return this[dn](s,e)}}};JB.Sync=b6;g6.exports=JB});var k6=w((Sat,Q6)=>{"use strict";var VFe=cf(),WB=hR(),S6=require("fs"),v6=wf(),x6=require("path"),Qat=Q6.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=VFe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&XFe(i,e),i.file&&i.sync?ZFe(i):i.file?$Fe(i,t):i.sync?eNe(i):tNe(i)},XFe=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||x6.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(x6.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},ZFe=r=>{let e=new WB.Sync(r),t=r.file,i=!0,n,s=S6.statSync(t),o=r.maxReadSize||16*1024*1024;new v6.ReadStreamSync(t,{readSize:o,size:s.size}).pipe(e)},$Fe=(r,e)=>{let t=new WB(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("close",o),S6.stat(n,(l,c)=>{if(l)a(l);else{let u=new v6.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},eNe=r=>new WB.Sync(r),tNe=r=>new WB(r)});var P6=w(pi=>{"use strict";pi.c=pi.create=hV();pi.r=pi.replace=XD();pi.t=pi.list=MB();pi.u=pi.update=BV();pi.x=pi.extract=k6();pi.Pack=SB();pi.Unpack=hR();pi.Parse=nC();pi.ReadEntry=Zd();pi.WriteEntry=xD();pi.Header=hf();pi.Pax=gB();pi.types=Xd()});var L6=w((kat,N6)=>{var dR;N6.exports.getContent=()=>(typeof dR=="undefined"&&(dR=require("zlib").brotliDecompressSync(Buffer.from("W1YWV8M2Bm73erNK/X8Ao59vhTJuj9A5ts0kuKSIx2QXjDzsGUs8PbdVZG5L6XYdVdXEZDLGumN1mwNUlCz73iKPJZC1igLZRK2zc13JaeOOPfeI2pEQlNZxCCqfcByDjjBMiKtBg7utoxYaTXZNuOE10KOQ8BnumEiaeYZZ1yOG2/yN3T9Q6UbzsAqJzf62LV/qfysaEstGqsaGu18PWSv9ilJB+HenKQgyx5MHJk6bcH05DqofPku3C5V3rL8N/hZQYNx6JTAkU5btGjpyS8/xyie/f75Ov36pjkul8GI6pmLhjLV9Q4a6yM+q9EAONZuZ5uu75Hg4UCXZgJzjYjowVu5wb6e97Ti9aFQ7qZlDPY1de830PV3T4NfglBN12SWPCeLe7jdBQJmIbojYfPmS/FfRvt5S639/voyaC70MjgvNQ3TI0EYiVdY83TB992jFNvsxWXaziwaK0ngRXD97W/b1a1qWUx0Xzr1H9Txa5lwyp4A9vcjx4p5JzxEj2mRFsE01s6r1CQYtQ5eGlDYULOTFHrBF/fGiPoeBf1padjprg5Y/vGbuEl8U9qi22qHbIVM43DYHsb9+5enaSelrwkdWlJHM+KmmBJaKKLDwVamvp6s+y4LQwmOy88wfbKHoxLN9o6iQqJAc4rL9pa9V9a48W6XLXYiJ5aNnTgENiA2+ai86rTkjEI7264UiqX+ZQ4c5o6P+PRd7pdU0fX0DpeOEqu7YKoRAsaicay2Q9A2kBF8f27QhzGmSEnqj7ZexnzXjUViEw19mfh2vvayvygcsIZuKQA6gfKe7Z+T7qmscWxkdqgz97hKkTV8y5eHQGjy+lavj1V3p9fjlMkSdYlHo/QbMQ1bMHgbHOWzN/+Phb5q8jWMmkgkulKVkRm4or2hhaPv0iwDPU+J1PDjoUiuO789Mkkk7bX81JW4EvwSxYg38+MbW8dDBX1mLxzfDAKNCDUhFN8L8Gm2ouPsli/K3+OPhfUCXddljdU/PZPKlM4QQb4AyxIiI6Ma4mKn1fOylOumxTwAEJdqSE4hhE+fXehoQomyldWZk2o8SZ/+/XLz3fgRwZ5zlOdUluYQsUzIi4+wc51Kt+GcEyEmL+FLifDoedne/C/kt//ik0dia2AY5mRBzS02RjSmhdYqh82u//peL+z5gMWdcQqlJyR0wMd39ZiDF0ZMfwoF1Ua1cmyBEwM8BtP7/92ba94cRMAlK5Sh9Y8yo3ZojAZCq+t5M5ohj7iaeiRDDACICyBQTmVQrMymWkpRYhlV1z733Rb54EUgFgJQ+Ekmpkknpy7VhiW30jZWqqr2dDdp/N/zDQUrtWG3c6A+GPexh//++qdVGe+77v1AogBIboBy1zTbGxgWQ7Wy0zgShFd679z/hv/d+CVW/CkQ5SFWF4ggoEqfLANtkgf1/Ad1TBVGzRVI6A7LNgGrNHmos1aM9h73rCYDcESm1lTSGWmNcbIzNrQuiidYE2YbJnk0SmySbBJtmxvr/35ta/fTe915EAAJJUSpKWenU1g6GEQGIsm2sHRffPefulXj3vtcJhOkmIgJdJMwq0a0lEmIZKfPeFwHyvQBSGYCYVQGI6gYoZRWlNItSO7Xxabq/cXYyLTfq9cd/9WT4B0N9r8r+3g2G35fWem1BuFpRx079myT7CgDGV01w7rjAmoX6wtutq//vfquIn06khW3/NhbDt4dLpELS6lKaWMiEnIicEU8//Z8Ne8Sbe9QvCoTjG5VBIXUe9YYaUKjqEA5XmhAaIw3XbFEF2zQ2suJjMIidpxdaJh9kP4BuFf8XlehQ5JXdtVE1lNaTUCTUFpCm0KVEpVl25jVQynv/DzCn33+TYPJrGu92m2Ya3QyNY4E4QNSIE8QBuEAUBy402W3fvqHf1ne4suXL0AaxiVIExEDM2NB9UR9f9x05AzPDNaRjIZcOP3jxooOKiIgoObMuvr+dJ3DwYGGqLjAQCAQCgUBDIFV/CBrkr64+3s0s/UfZ9cCAAQEBBgEBkWpVAQYGVuVWBgEGBgaROu0Nz5vr/+F9u0eY92l7KVesWEoogaYQEWjEiBRGhBJoRAoREREjpjBixIiI0/793OL/wbf3Ctm2X1yxYpMiEAgEaRAIBII0CAQCQZoViBUIxIgRR4xYi2zzZ4+Y6OH7YrAhR9S70EE605KKgXdb/5A4H8hV00qNkGpBRtQQF8QC2JqYcvXxC7p4Mfy7Wf83WCl65b2Z7kwCwSwBLxA8QAVCBW0JUqyCtUVGVj5+jlRc1+SfEt2s8Vmm+TAPi1+qxLn+PXGSNjp7HQChKNGoFvjYOwFFFr52fMXI9tgoJXozQG0OilPul5dsgikHOYWK6PNUrDqGdpTfxvcyvOX/Lj7XH7FZqT3QTRbWgLVz8HcqltO+berFSnrpNubwPvbYnm5s+IC9Q7UBfrbMwROJlnYfG3N2B60DL/o4V3hZ2A4JRrqlIzUP/pCIJ778GKjnM0ETp793edX4ZATp+1gz2ZeoCH9NNHhBF8VBBtp6KlpNMvJ9UpYMTdMUe6rb8QzJEmS6DSh7FtRcPyEPAyqtYh754XUkEnN9xC7L4vP785fVmWkQxo7SrurZ0tgtB9/oAxUUAI45CcOiKJh4HYRdz5d/rMZRnlH2NpRQyYNnO+7yPmMeg9oTXD9DrP+8pkoHdRmfnZwro/kMVXwtPJX8kwIWCGL3H+nOMCV7Dq2n6lgMe7w3e9rab3lvSdPcGnZe+PFVfEPrGPjHOx+bOH3+kd0em3M7/31Q45WivLl6zv5VfFTlF5eOah0yCWQhyP9yfvpUBKwE2jtP6KO8M1j16vpVWTQizteBynkHPHB+ebqSURn+/aexQd+AuRLCVQ9BVz2S624kRHGLzRiI45ZXtjy/3xWtzTlVnFMKV2KRjapziO5C3d1zzXZnQLdfr+Nz+X25c1V+NrgJxdaoFTASsOhRYIqV9L9hq+9POrnHzJ/nDoeUeytC+ADCyzewtuLJ0bHMB9j3RY1dAZGS2fAw0dwx+MkSKevMHwBJwwnrTyMZnmRS4VHBLHhWkNpC35Stx8VlbOFsC2dbPNvw7Mn3bEiFh5tkeLqmmj4/ZWnlKLu0Zq8dYwDsT+BYUAnaG1tyQnVkHM/S1avUkXIvLV2d99OlrT0zY5aIQ5ZSXx4gIMyiZAU99pwxCy32z0GdNVqTNkSw4Pb5Q/LMEL2ml5eAwDa9gUDTlIHz9hi+Pu2d/5Ir9pCXicf2NqhgdlSheTSr+EBXyrxFDQHc+tkVnFQN0dTm5HBjB4ivxpVhBOlOzaDjWeUa27YZX7GiI2P8zG3J2C0M66ynEqar4mx19VXd5wehI3GweV/jTdnSH1yKOPQSfrxdHE55UgpRiDDtLoQLHzy0XZEjuHEOLzQDVqRE2HU2lxN5G2DTuYSZ5E2Io86yZrIcmvuIhV6GMj+IookKUR/U2hAVpAIzmbAGUsPFMMeFiiInrTgmQJRDYriITHfCjLgI1y9R40CFKMxzyoqkIKed+1DEpAXL8YxInKx/+yV410/NTbtUQORAvoZsdD25ZzgAQoudlEkKlyWKw5cwS/jUY0690vf27fqKAMOsd9b39XyJS8kVsDTX9oUszCHVKfoYg+7L3pcBXPIrHQF4RC2Pcrz2zq50vqnirPBlNrPnxss9r7qoXkixr8/zu43ttZyXDFvOLRn7WB5b72YYetj992bElhxEMaEmfawj55rQX0DNvbNutjX0cavTr5sZv6/RPtfuI7pWElzcPfGnhXua7DtAeZ+fpNp/RtFmq1xE79dHuxBs7er6Ci0zCGKP18LpQMvRPQoP4q3Ehj1r4jsRo9lc/xUgkhM5kPAuTXIviCAO5GTLGy3e2XzEZKt9OtFkPco5b8xWXw3k/dsAbs1JHBwJTT4YUamEGejooimdEiTUs5QRvFiww0BqTOEKHCGiL7ZAB3ctJzsZ39BMS7O9dq/o03e8npWHPqdEoe+u/R8UwWeMz9b+L+xTCU6T8ubBZVbDtxUvHsWJJ0bH7rkzwtajoNOcjH9hAf7cyy+E3BOnBTGpn+4If97hVxV+uezshKgeb+35j6+wz1XZd6jpgt8fDctNSwu/GWYgUTL5cLXBlbNwBODU8+3FhYscf6Sqq1ckBve+CQGgX/uYpl5YPU+o/Eni/RsDyRo1Qv58niyyKAQP4ML+LckND0SxQjKbKN3JCxevKi4u6iWgIeqK2LxOi5KxO4w+peT08PMZxBgN7lZiuIcY/iO477N3s03zi4TATaF6g4sRYmgfHsMFmj22NTscveBLH/NEpSQmPVYQoAbc6YYI9xGrW7FDB17jG45jzDnCTv1C73Lpd3FWu3H9CWJLxLQSYVlGQFGjxeOwnnWO6gVtbBni89rNxvQaL6LkvvFLSR5xKFox18nHu/4XWfdAvexgt/eQcFskU5lK9XWDsCDtj7YWhxB2hK9PWg8s/I5jvEY+PdzOkT2i/waXE/IarTJEVLKRnnmEdQYhC9G9tczVmm16I6D4WPf5+hRKSo8dsY/uB20yFwbvx5C4n4dG9rR2h2Ru5lUMb8JB5VtQe+TvVJlQDX5+kmkJVle0+UD+l1qYvLKceGduGEd5F0TAo2ESO8GIofXQ5ewytv32OWZtRisntPmkvHMcUn+pvdsDoUBPUN6a5CFOLQ8vx7lkM3HsTtDigICO4JCMn5oTgrtucpG/0qlvFwqkOxQ8gd1f0rK2z1SYOSBZXScRwbpE9dudyyMOll3R64cIzQAXlAa31Cx3QaXpgkTwwn2dwHDCrM9dT5banqepsDqu5+SXIZRnU6xEl6HRQuaEp4cYUbogaeulGBh3Tzq4k/QByLzkebCVdWuaOdQwMMPhnVzUUDP52+E7Ti41SF0BYp2hbbchtsoENe/BDcZUjceTA1fZE6sNHNmkE4KFwFererZNtxCSzp6aXMmwXK+fPvtVHrqq+COuXr369qd+Z1I0I4WVo1YdhmbglaUe80GOaLuzj+82+jbrS38sI2gOYh87VV1xLctVC32YgmzV8qwdrnigNpkupw2mdTPza+SHdqbWwr/yIThnHiCxVYME9E5tZ0zePosxrFq0g+ovLS8oOAbJi8fEz47LVotO+0DctM3qPqkKg0DidKXJrhix5DoSRu/0wExQeJt6xHHyYiPl+XxitTSerXqaG0UPzBFmT3vzo1rR71CXiDbfU2IuffcAKMKDqoBRjnh+RFGSi+7XDGA41hLfwopMLxGz5XFmi5ydJPrgEvPd5xIiIMO+AQtBnXdiWGLEOGip+JClbQr6x99AAbMmGsIYOWYoCjebWtSPqRIvJ/pBM9r4fdlZpY3Z8Ja7ylURGS7palZJ0DvW+kt0VpBId5ZKNpOzRJg5+Rltcbs0KM7fF9UnwfvMtJu2jii0vKfQuMb/ybGv3af80gMdAWAeh3WRXz+PIa+SF7pLi83QL4uwdF+doOL1eZ20Bt1CODxDDnMjpIXnrddkTVc8nWEmGsNkaCw8UkWe7JTcp4yd0gddffQQwOuJgPURfJofkxVAsSXFUHTUKPoJOCZJIQQHFI8xlXV7BNZOaCIVwOmQ8xArV5f4MXsIb1aehRst1A/Zs0f9AyEvBXR5nktvoMsrzmAJ0VJcocFcvFp/06XTnZZrf0WuvsS0DQA5+/7rAH1EhOLkdP3KcWVHIjwpcZ87/A7TZz2NngqDszgaGv1ElMeuPBTER+3oKTs70j3QbcUm/YRZ5r5PJQz3MxSCpLAz+7igOAwn6h/PQhdmDb5X9poTxphOOOm+DVMPBSOMwewPTvRhNHiMRlI80560FEsKJyrLIgLlPBteg1+cW1zAgxgoe0qcbdkjnJ3hV2hn3O3fqk7c3w+bHDDii1smoUe2PL7zIkb3zm1cS/c2ujMr3j2SYDltgAsqEXzf4QxFRoLXER6IL+PcLrH4R3ed9059MFRpaifDSLA2wBdxL6Z8xJYdNfo1Mbu9XRcJEJn4vAlobJK7Hd3fm9YFgbhXFm0T8eMvgtOCgFph05unaIvoPs90NDzTkU6MwSPapcOWxliCQe52CMdUVU5EHjV2/EU865kMbNnpCEw2lBYnqCoxHccaPy5bwjHsdHq86muWsY0hHF5H/TTPMMFBR+PdVqOZFI3xa1BfnlH/p87GwVt7Vw2BU5dpxnbHrfKiD6VkdF712uc/vIWiY/D5khmpI4WNXwtICaUOUU4WGOKqUDcpj+8qyQDJSO7Tp4rwZdLLo4kHeArAIElgCvx1bKHLJMk+BL9JFI7Q0K7xx8vx9sWcaKpvS1mCIOak2B6+fva7TcqX+ktKh+uN246dKmqP5BBSlE/L61GLjgF5w+afnVbK1X+lNHWEIdWsxa4XEGpI0KEZoQAo+bqkDjBfrWOMwtXEDRaCDuuwDzfr4BqfGWwIH0F0HtDKgarBLYIqMJsJRsSokNggDZC3BxpM0pITcTsy8ZreNNUWdYhLVbBoUNrWsXFLkt57tW+a2tEvIK0xie1qKGnk/Hh2Ea42N2alQeqpDB2wnGLViBbMnaJJLM+o/uk2ZGF55xv4ppq6vY/ZWqkZoEYAyd3RMm48UxdAJX4OLB2/voiiOU+4/uaDDToZ9tjT2B02eognvwkVP+vZLoCLIHXWgSrPXbC5mwPphY1ChHMinJVRU0qMt6SuNVmLAzPi4QNolZFFmcckuYdH2SjXwAGGnF56+37ujl5B3KV2azlPeSnO8EUPat/WfHt/ZjxYYQCq1Z4Nqt7j+AKd1Czjc3SVeFtWtPtyRS2pOxPXEJ70QRMzdXVSIlNU/9ZSHDr2XOVTFWkTkKmrUXlxNuLKRlHhRhMK9Vq4W+Sjq44MiTdEAgJfmu/+mIw7Qcf81KBKsvqhylMqw08HibrktGD6epm5zAU6JcXVhM82Z4BorUG9K3UdQU5Opm6mAWAIOvxE0DtK5U7ADwO38A9F5OvnTAwKrys64ScP1LMhMiiwC2EBI9V0Yl/AGffdM+951wfi+g3weqBny7qcO6qZb1Bar/71COgBjoAVmsF3hFOThCtQnfpUYQV2c9QuujW7aUpIWnScaKTLFVcVvRbKruoVoxWGXcrmInUkGPcObrLFyQCtdI2hqPXdGbqSkhKtOm96pdJyIwAPe9fuuA29UQaj77/3nHlZQi2elDOPFAS5OfMzRq0kpT4yXRwmngXhpme00oJgX2W2TII72AtZ9vVYINCXVvf5jELb9Rq9iYOlarpmBpL4AkI0pnfA+ss+7QPe3/fSntiT0Enn/+sEk+NcLQ6GsTnvIm3P1IURyibKgDQ5DffJpru3C7iWjk+JNVmqhac9gh0/IF51I28tCRE0cStHcS+h1f42Eeh86rgzqVdiRGXih3rVyKWa5BDCKcVuaZUrI56RR1NOZICNzkX4krHY47b+XfC//n/v3GtzfNUFbWzSb53njnOETw8NyN3DjJfWejCI8Emvm7NASuyzScCjosd+co/Ycm5af6CvgFShiiqo32WHdiWoPx+mSR5kun4hJTVBCPdy04I5TeGINM5bI4KRCEt7pOrkVEsHiYYpHl9QJM4VpBE1Z4/NM4Wiv3MEbzWEKhBkFA0Ogp4Wud4yvnl8I+GtPAwIhJrF5cgVWOi37j8TYbbd//KIhqtE9ljkLEirv+gIsR/Im70HGryvsULUVmvbECelyrtCCICQcObbmWn3E0x5izqBUT3Jo8WFzeRIwNPSl6qQVHM4lHc5aeNRQGaCTAPNwWaxk7q7Q2NLzau89ibBpWNzGafIopk68YqIQaFYK43KJhR7CJIfFj2cyJmtksT/SMnqmsakSmDiCgEBC7f7m7GDa1/W5vdmf2NYIHaOGwJdkznoFVD+FkXiwg36A/zrPkeDMyg/4PnzzuuUz5i3DIKTvxzUMmkmj/0FAAP1qJq71Vq42IdVWUJCH6+f7S9ECB9Ubz5XVgpu4Fbg0zqkV6hsVPrkzLKtNqIPO/98q2p5qZgb3179cfdKh2hHBrWt5mmam6hsX7h+/Ncz69PK7eoH83Xrb1ntYIeKRH/wivRMklkFXvHjE21Gwe4XvW2gBqVErsqteJbAky8OBHTki2gC+phz5BoiIsP3rFpT2OByvPjDPiFntSTJUerND94Y+NWLtylAueHT9LhRcyj0IcJZWnF29++tOOCMMSYzOJVeoVFfVSgtc7VbfiqvyQ/2/z0aOZvNWaRYrYpQg23eASBz+dFyJlWodhVzluql6Di3Ec+llWkhxUMDMtA+/qWAqzw9yPAuXg1MlaNoJIE9nAW6mSRiFWNEjhvtxYnEgj2mH2Hc9JXKu1Hdwm9G/0ys61lPZVKDGR3yo5Rphvp2DCZfQnr9x325eQrP91+3hr7S5q5k519X1uzxtUx+KvTqFbncem6V3wZupe9KvAJ1e8jR5fLBcCoOn1/C1QtalFmwpN2VfD4C2cToOF78+beNxo9NuBiuzoJlDBwKURO/Q2bmodAn4lto0tN0rhg5z1LXSXIqTEQbgmw+r/09dW9ED/ymqFZMt2lFMGo9wcKqWWXZUa/vGoIjq7rkdUW6qhatGjiL1VKkSEHcg8EFgZlNE3uoaiCoEnEanHSbgDEikiXIDEFzgfHfeAN76V6ZOCmPUc3pxg8SQyqfUDhWkOm+hyPISD+HCkRxIycSPakJDxskLUQjmoyGLOMPNg1bY4zCtd2IkCA5ZWECE6lMQKyLnGJgLhC7s8i+AWKIAp5G2OXHXcdEDd+tTATekPXKO7fayRvPUHpp+Wu1gcDEjOFYuPAJ2rOrWAd70kI20DKTVCftb6QgIRawNqkRHCQfPPSBCHm6KW4kEO9cuLRrLxABPAlnioali5qG0EpJGfB2YtOccBqSPWEBbM9oj/GY06aoyXpOGQVIFAQ+DoXiHwUAdR8b8glO/tHmjPMCNOwT7AvPNQOzT2SBU4Ht6TRaVnzc8pgRKPJOgA/tiX6L4OQPJw2C6TuzwgeP8TBiWgnzpPMoWSd0sPvoKRcfrElvOvLpRmcvDlFCzebKKtC5Z3W1R3FSInz/FNaihsmI5kbRqVHSNDCD6u88qDBKmms7fZ1g5gx2iAoS8LA3wPUC7A50wUUYK7u+BLQjzxdjIP2w+4gevpHKgRqw6ztgzw3YVwMwWD6i6GAwOIxElm3GizzLnoRx6BEfjSjVkgGnw8SBis8XbEKzi6AMMtFZxtQ5ypvAix+STAwmaorc3l65iyHH06+zVx4AZCrGMOiWR23yCqzy0GQyXaDDrILohWIMVjqqUK/7zcZM1ggZE7spkWB4V0k3uzB8NK+FYstwGsYqbPefIVc5PPiAf9p2CFu6KfmPoh4hyH7SntKfYH1enwBdfQpbwyf0iQxoMzGM4Gm41cqeo41tWMsawK8cVDMxnEEmPlMmx4eiWskRv1pk43bnNvF3JyUuA36iYvQ6zOoqA21NOXn27odcwbgX/aM/6Mo9um1i74yz3jC59z4g+4SDBo0NSoCciyzszyPCpbHRcrCjGAdCMIS1o7O4AbbSBihej2mLEJSBBkCqN5D7OFbOl19RNg5IYhjmwhE2pPFTWBt1iimWo0pTQRIy6fmxjk89mTWBicah+JdpFiibswgaHh5IA5SZoUhaWf0r4+T7J3AvMsSh039cGgAPuxr5CSrMFJcr0n97S/OZXNPTNTY/aNseq7rUEXO4O1RDaD0tKVoE8JWfqdv32oEtUaj36FJpNIGkLKqIUREklXHjuEIBE/08tAtdvCk1wGPcgJPjVpcj7ioSDUxwhlT001ncrK1mzYe+iRyQ5MRm+Vg4Nq97PZ1osc4O4pwag6LcEQUHRymQ7/5Vj32DOoynh8KYgjih/E0WdVQgSM+jPZ4HkX9yGf738D30BVag9n5+F9loRyy8ha2pVzyi/FemmQHIBW9fZujcNsS6sgsDYpRbegW+UCOmuXBAcv/PuCMArMlGbhbXH3amvOIAZ6Tf3ATav7ULfuH/PegIAEOSc9F2oyd7J3VLd03cceSLd1v/mlb1vRpMrdO2/ZhCycas9sLPtPouZnVFrZvgXSxzw+8Jp7daeRvBnUZJAi83JRFkF81j54JGnqtvKuuy6xQmeUhULI5KmrqRO96Y8hVJQNwY8oOW/NzwUPMh9WhZvlIGSkPtKQ5BOEHUqqvgCwvby7TCxtfpTll+tC/jOD40zWKR9pVFZdpzNbzYPjigyEmkXZerJ2pUIgxhKnSFxkG3TohaqkUSMYl/Vspzi6cFD0n7l3lvo2Fr8+gsoXe8yPH9JJ2nad40g6eIuhdI2Cekxl4y2q644FufadchmJZlGwbaZZrbPZKR0fPfEqmZ3D4Fqr0AKXOajYZ+0jpnHeEBiaQ9uaEU7uJldkHdNTyt7s9tW68u68GNaeUl2qYnDyz7LpR5heb6VsjH2crvMk+TWFoU5RJ/JfkpRpWiTzJjGbG490vwlT9bsi+GOIeCLb9Sh1MI4wW5Mf//VKDQgpdxkPSBUVUNOTXGj/Wr5L0BUcbAy8o549Fup1314PDoK/o8WJJT05Th6E4anLq1n1WFpDYXrwdhfC2/mbAQW4hFGWKqKzrPEom4YjOhDqgnT2ZVpfJbJJ8xFxRx0meXF3S25X2UPXbiXu+euNzfxVlhc5tmcWZW0APk1PJWjjrU7F7mCk4n4Y4nZTAztHjFNzwdBCbVRfWs3kJsjprI3vwVESeIqctODxQu0fZPdkbRk9q1rJytIJPxEOpulEhBdbNrkcVD13LPw5fAkrt8dZ/hD8nXpfDumFSGi64G28VyMC9iEIzwODfmB7K6hGdBrcPMNrDErgp3AJtN1NSdYIxr1H628CziQ4BE45NknJxxq6hofIbYGFtF1KiFwi2x5X8kplx/3zH4UQ/q60L4tJU37I9NAYim/M04dXrv+IilrC/+9tMaZ1kDlicw5ygB6s3Zfy7HeyrUrS19vnZX3tJGZjUj6xoz5/JZ4+hAXQr03AZN0iZH2rT0j8A8OIGT3gjtD99cMJ4knP4YzxG7c6zAF+oXb49OQx2VYfu0/q7PXuvqt6H2ia6aHLhBY7AFQfBmbb6IGZt682UTuRXHVZdckrlCcTFvM2+NoC/eRA1KLrbFa+V6Mt4FL5b2v/NJltNG+bvAYQBnzOmC0hyddOryueIm6hmjoyY9yt1FpWZagbH0uAg0wwUdUKRyvRy6sEd8XuJqbuDE8wBPA/Rd+eCPFS0uc2m60dFJPYvJhj7SyAptiFeiPUyb91NzmPVxwsunqo57P3EUbA0VVZsnfYd1/cd56A8o27hb/HzfPNvaHBksoqgEMP2bu/crFSS/2Zj+bLWTN6AqqYg86DSNGytiLHytitwt7h9Vcs+QAzVp96Pd4qn9XF6Ecm9NmSyZaMDk4Yh+VIZMm3HQeFBqhLh7YuYt67cUG/xy6o9f71cJXizpyd9pgxz6scqmkIOpvOT3C/xNjVB9Lw/xen2tfESlmLbpI5BQP2ByqSSdqLB6UM6dzwVHC2eEAnN4k/WvfbuL+3mONCtMO075bDDNgkMyXQAxBrFmDa+NtCdodAHtsqpKsSjonBLgZPl7SMvYkfRXKaJlXGSaOazr7yl7n0pZMy8Fr/ZuYzGWD+3T0xdrWx42bmiOiSgsDKUL8aQLoUhuAKzGSYv6U3FDMJhOITwiqv0ntQ/UFK2KDbLPX8iBdGMZP04nrg5CIWaoq9haG1w8HPbP9AffjYhHcxYIUYUuvxkX3l7bBd5yRIuRdE2ltraUnmiycXCEisisXahptVGNgbmQJiRKUzbkilgXT7bv7cCRWOE94rp0J/Z7yh06ADCwXo3CjETDYsfqiTYYBCuymJ5wJf3ZppLv36b5y36QY9K3TX7qp9H2bsl34AvQyed8bGWco55f0deEqdsaUIuTNLQxJVyqk5FUMwjGysD0GN7YUpR+MAxrRu6BY1XNQW64S4WI0zZwD4RGKiFrqOqbhSI5yJoq3PdPE7mcckPU2P7/gY87rNpfUngiVRMMpNtCyANC/78IQMc/NF/v/H+z1KBK1WaJuRwc6yFbX5L3YiMnKF/C4eHyOxTTcyKw854grh/CjBh4+k7R0/SI7c022jOn2otynu/4bI9j+/3uDvmtQb8iyteyxrTA7tPEirQUsYL4Iefb0iGBEYvbRYvo5Ha5piUtbMmBLiZehj3FyLNN838vYkohD3vb197vBMrRUBl+vqNrQaTQT+ybhnejq1ul2d8V/3plk2l8SvFtmfEpLRzk24ocETClAwKeNBCE1oqu9z3dL23vpC5CNmvrjWTUhbKeakKgTNPOKNbaXpdIZ1NnB2oBGw8+qXUKhJFP9UCgoe4RCHCJhjeIMxzveXpqIhTqCp+C2T19Qn+8oVx1ij9m2jELWuFaWJIUoomTg9T4GJa5uXGRsTyBwn7EfXL1sT4K2qIrpbI83pBnGA1WEIRkKk7gR4iNZFBwOrtZONnOkkmhYC6wvHLlBuTLpm4wFKwsIa3qYzpUaqGUJSKCMEJbusKzDCwVvF+RoGCG/iTTT3Jt/hlFh107IjLnPAlMoEIQbY7b2HKdXbsrB4bNROZWTZwsH1Zdj09Zx3VMsKdVuA8+tu5ZjWS8PcYVIK1jgwG9Squfjinb+qmfnMtpYU+nJeow/OjI7GHOspjPHbWbyPLjtuTalO5KignmftabHPKanlqKOKd1iZyGkqszNifBcIhBCBGA8eyizvd/DlPPIE/ar6oGb1XcaYO50C2ASxlnb3AYwm8co+FqavH2p8f9iqjXJ88PP43J8hMOEByhxzQ6rb67vLLZnma9VUL4rKA4QZgQeGiWQB3gyMokZrcj2bXNYf390cqWHnIqTDwcQQvn6RN10ZVyd+4GIbinGD8NY9cBJNgRhfg4tOmJVg6l/Y6e7q9MIco8Ojp/olTCszl3JQDADq2B5uKbrlkrk5I+vOhiJvk+W5eJXcQLIZKweh1yMydBelpZDkUySzbnEFrnnUw8XWn9zRmWse3w7HkoPW1a40Ana7BmuncffjhHtFq2MEMjjcLjlD4AdekEP3GpUAQ4Y5AHNaiZNDiT9Gm4QAVdqGW995w+d3hnlcITsGUofoJn5HPsVPKe8M6HK6mLFHSe/lxL+xzPZ4Pg0Ds7rlwIXUM4Eqphnpxc7XQL2lAWIhLmOFrEITLjsNVekN6i2PDKc20pfHbkFwJF1RpxiFAEP8qyBz/x8om52qxJSWCP3OJWtBpaTEujhsCMhrk3EJ6K81Kwy8A8GMF5MTLteMdf+utLevLh/UMmT6A8CZ+CMNE884dOTtNDUNtfTfkXBJUyy0Uh2Q1eFhKo6kqRDB0vxQ+cYMS66c/CtwDiEuuzDM6s65xBIEEnRjSnqIPmc3ayzaIJ4l08EMcXBq8SIzZpbMC4S38QhovQfV/D5zHETGMw4PESBDjlcXUBPPBYjWQtGwDDNrzsba8g4dOZ5A0IKK5e7J/v5+39fIgn4ZLNY/lhC76hA6SeKur/WKzZ1nyrNr2LQN3Vyyb84MzfgKkGvEfeAU33wP+tGzp7r9wDx74HZt0DsAEN3RA1mOirbJhF0/zWD8upN3svlOa7rG+8NzSZG0/6MwZ+EVrriDnrMBT6JK4XGU4shZkvMX8Qmo8rdig6i4LW6iU5V4bSbQGTVsM/EQBTvV5VDfANjGcmDhc2dx3W03fHjaTlJRjibmGOu4bptHvV6abtnQcLTad5TbXZmStt9dvi2eQ+a78PpUs/HTXtp8J47v2+qD8HxdHKZZj4d0/6GBmfwStMpSa+MOt9XbL6ciT1x/PyULQ4dUtWvk3mdEJ/mLws3CVMRTK3G7UnqF9JWW55fWZu12fX144qpyFHm3SpMHD99ZaZd3rSnL78OdfLTl5x5mpAw51yaPWd6pQuFZf5cFWUy6zekbjGE85vKChnsr56kh0K5Wmh3Nhv3u/UNRIIpK7hEpS4GXLcwZ2Ibu606SKCCfJZRlynoY2IBi3qAzV+HBgG5sHD2DRYxs329p12C9enu26tV0zIe7LjnbIsykQu9X6MPvHIMCoM7lEGvO95FaXVMozLbzwLtm/rj+s/XR/kR7GGkjwuoRINw1GofnmUP6cfUYLojvdP6E76pkE/nyftoSIKIgVDcC/a5y3BYTuXYRHrMjBzsS5JGIQjbS9/fSSaniC3WNDvLMB7UIUZYCc8yuZnBhQccimS5ncvEFaeUL2raYyBRU0gYOCxzZkoCwdFF+PPtCKjgomEC0FATNUYDRoOw1V7C/Y6At1EZ9PKTsJhS9GKCEtjmA739eGmsttgxkRiE2ce1F+cfcZUwJrMJUojiKYY7Nh1QoIHbAqrSz1UHjkFhg+76Qvb1VTbpIrswAHnkExYt5q/BvGuaRFKo5MVOZgR9+ZJ3Il4yxAFSqII3myUQ9k5dz4cYbWmFbd4s4na0zCkIwY0PbGtMq+EAcqilbirjq2wRDpgpC9CrWfeZxu7PobsOMB4K5UG03xBzK8a/A57E3KYEIqXhtQoTBdqp5dvFiUIj+hLX+qt3il7FAWUxCmW2a0i1sDJxFL98oKIJaXsCWgNNR2tIYJOKomwuQ+u8shlKwqtIifi92TdLYkRf3naV33/Lba//CZREZO2kOH+B1n0Xug9CYTZTks845TYvs/esrIg92RpVdznMg5teApj+Sxc+YXR64VBneTsXNF2GMEPdZJmEYWRlNGunXo4xUMxjCfSfIzDlkzteaX8gIwBjFu1u8ZqPWjjj3xhu4ZiS1Ytap+lKQCl5Ry3+88Y/feSL4TJKSk2NaNRSqwJQo35wE0Db3/5SN/CK79DWCNZdhcV+VTNResWUVPwsjTomqgxBEM1lsf6DmJn+Zuvf7nnEhkCG4w05T7/hxm2DHhbCNJdiiZqpXDjBszkPYGc+orb4pdcpvU/QK+E724tEQrmk9QKAQbc9p8m3iGJ7WzR1GoqkGRB5eFUCmpi0STydjD5o2MHu+QyVvmZNoHXMj7klhIkzkPlestEc1er8uzPZHdmqoynnD5tQOr9jUQvVj5BpWkPUln+GeKBCdUGxiNAacTJOWdMk2Obf8h/8LZgHvhCWHZ5zz9W215svZC8zFszyCxTrfRkHgO0q5WLPD0rlP2dx/jMR1bvUmzzA6/k4vXuigJlzpF224oE64WPBqLlmRhf2Yyjl1VGpfuwqL+Xa+QUH9pKUb2R4fm5OTGnlSottB3bsFp7hkYb2wFYEUB8CUpoNm1YxuDgrsCSoFU98gax7JVKUh/sxDP1deALHmMMmsATDODcTJu0iWrllaehDL75+sjioiO5t+Njb3vTZbtKH8q7tz0+jiKyhj6sb9JetVp9BrFsiVXXv6icH7/ucrldceFxgRyaGzy2UHhlRbJ0beDxjTID16r5lD7vtmsZ8LaSpRCPpXFpfyp+NWvNcpm+8tV392or6VxFqiBPkGSrTE1PJBA5bSGE7cYJr5kzzDKqMKa+9iYqyyzdT1aMopG5W+EO+QVzJdrQabTvxbx/px19yUUnpEtpt6VCRRUdeoJaa/11r0fXl9cHjjcF0MS9s3uAM6BiT6BL1rl3hOZVgD5tYCvu9hoTDgkSAKZnUuEappY2SfWK07kAeKp/cy92jPvdf2WKmqzCmm7Q+tWScph8fdL+LNKYRX5ysobhxVNusoiX77Tga4fsfoSSrnXQQ8HxHEfAydIB7eKywTNS1Aj8LhThJ8zKHtQgj/7w78pRNNWH3+gotD0Ury2j+qCEJV+w+7KLmWb1DikYv1tobpv1HtUBYlnYQF/hxLYn9fCCu3up5Ozeg5XdX3si75ie2y0qzvS/7qdPHIfsfr9oDZIRnW9Tq2ylBvg+e2ftMi23e9QkRu1ZMy1eqv+ShDavrQT4c/peKrpJMR1p/10N61F8f2cmbICrFowGEwKN6/D+cnOsRRvm7KW5p4WyctlRcZxM6CRxRJDqhxT0ZXef83zJy5DHVCIev1h9KrdUA1ISJJqddFsTKAoiBOcTWknii7UfjuElHKL7NjGXKpXT4jiI8c0FF5U+b6Akn+ajHBWKecuURBAxAtNr+nmLXCkisqwxOw9eroRC8RA0bMXgAgY/JDzKrGZRON4emNGAe/oO+IzcA2j2ppi9a1JMRKjkTEhB+xL2Dx/rnXt4W+q4XyjrbIz00S7JrWAdpYamb5tBzVVfRoHY1k3fVEKRTr9MHzRXRMU0k5Cih13pYMFaTvppCsLie3XJGy5SSYRdTuAUTix9CKfxiiE7uFuWTQ97HycKFt0GKqlj2joX2H6QSVxcCe/yZ4UqJBTDgAGyPWB4I7oypNdrAAvTPUJFMxqk0hbSdLaxbzA4tskcaytumYCVVjRnYB4iuTo+8EvD6IEevarDhp75PSGZsoiU0AyYJhW5pi4lAoRm7YrgEh8San//ZdmVg0gb1azckeyfHnrm0MVKRK1uElv+mzPuHIbq7Fmy//FipYGlR9XwzzTO+M0QzNf0f1GTyJR22tldu2e/q+LT5hxEfdOpd0uXxBnaT0gK7Q1EamtbEy8+eRNyC/FWIR6qcwpTU+WtQnCtkrsUqHhoKvkM+6n9oBNs00yspXL3p/F7J3dvYoSFVz2fhqa+T7zPw3JjyKxol2/1ZWaQDWy9HrpYberY/1WeKk0LQHiXDICTZLgXucpML+tyFhjRHlB/WQ6FqnCh9xp2EdfSFyWFrxyD6tyKS8oru16unI/4SluQUbqz68FMyN+4jxZxyH1FtWAXGNscuovjg4F08rn7Wdeq0JAjw11qq6c/5Enyl8diOJCSc3K5HvRATaQErj5Ma8MWF0vdYx90a6i6FZ0Xo3o8DU2QwK+KHknh1YK+U9EQjf0kopqwq6LqGxex+6C1cPUMODoSocISRcZGKjIoJNhNi3RPf7onZsfCiG7M3sL++XJFhIt6wXu2I953WGgnyvV2rnvdl1gheWs3EvvgXKrmnOJx9gW90HMyhdfloE13bl9k+3xPlyQ4gaUkeEtoSRss4Y5o9amk3F9plSUcTgxsgbWT5LmKho/hmZHqSODexFWyJb3Udc2ezxLb+vhYhf3PnIJMEUVt0eOlZvZf12V5hHvnvbSUy6/lGmVWtyETfxgqvPjLtj+qZyz17Hbb3ZDMRDC2a+WOFvBA2TkednlB4LsYMy3KpDBlC5klflaPTE9EdPiYruXLSkn5EWjZnRKgTbGJEN6uTF620JTVGe9PdSzi36faFfhJqdWp/CpuWe/YaxwZtnZ1Y/DHO+n6bPA8BmcV4ew8ntda/51pNUwLK/o7o512wqQbz874vP/RL21wHh63VN5C47QTo0LbslSdjL62TBY+hyp7AkaLRJXoedb/kNQ9NbZ2984WdSt00YvpJVoevutT+cA+BIuHFd3cD751rSoR2Xp5iUWtP9eaF1zMAXXQ0o87fR06/GCZ8l2qDFbLVHn1zAO38regOur4RtkPmk32XK4XrwhurZ6bOedQf6yNAOBRxR856YclX05l6qHBq1XtTFRE6KOCdRb8Khky9u5O/zJWrNw84SdmXSQs9Ie9FPx4lbiFIdfsvDQd/ujyD1rU+YTbf7uA9ryeBEsf3dK+Xtai0PbDtIf2f41VAZTv/S5w2N8uKHad91HXEKh9JpiP+hhST8mcPSG6Lobt+RlpYwZ9lEyA6BT60b+LCnqiNrw3MyldKIjmUUimns/NxYVzG+VX8y1CvL24O2NaVJDoQRcP2lPdS0nyVRdfrylfMyFH39QTl0rFrDY5v8ijaDGTmRsHCnlE6UfBKjMsCXSHDZOMJ9VpXgLXsyUudqb51elo2zka+uTTzz6ijmzTdM6xwJI2NyHrJq4FsFPMF2sMdt9eLAcZuRK5NfCs9JMhc7brlTC+MGD2oHeQ2l3f/hAGRcitMS7Dq8XTBbp5NBAP3/s3VeU4n735e/+KL7nnA3f8k2+5401FRXqwFdMn7eJVufxrJZU6KgzxKK/7bc3sUJRxySxP0+c1oHnHYSvwU5lyNdV5albyoUmKTweWr71j8nb869xNt/l5Esc8q3x2V+cebi2fKzr6kOhuet6arE+30Gud1NBbnF90ruH2xzU5YrsWSyAwTp5pkwOTnhoyrmvQpdB3jx2UVW5N52vo2ycXoQoLa5BI7tSsLSXN9Kf30l/0nPMXVHEnUTJpVk4koFQ6OTmQ8bTPkrS8nk7znnGWVXgRi4annYOuxW2uPYnBfPjnq8B6V5piEXhQe79hiOpQbsI9L/PHb5BWE2+WksLnmpi1bbeeSSKmkuubB/4JiDGdCMlxpIy9UcoMKiBxoPKbxCfH5Mqp4n93COX42lvUNAdFKMu9oMWEWzLBZ0qUMBKOfEqUc52UMBa5lSrfQY2MzN5W0UVxIlpYswGnjmT7+K7JKqf5a1xLSk3y1D0wKmw2mZp2cZaKDZN7ARTc1w8nCpnAzTOfM66vBB2mbZh1iquX57kvgqecquXXjDWlcnJ/2XEkfnfy+KKgHHMcTNpImphgZid1qYktNEkJ7eV3XWsv75Z863fXLRU273k/jaUT9MLPNUsciQdNBPo+SkjFsjJxlJNLjSsT0HXw/aVXBq4G0Prt66tlxji1IcuNL9kfgP3eZeCJb+K7Z/sgx7fffs+N+Ybul3wI2Dg4+U2GGfDaZCbIKX++b56bzMGP9NP87e6fDEy/jj5af899BJvhvqgC3Zf/sn6tfYwR76RVJMqs70Y/1jU93t/8KnEqinuhH0aT7/5rTbf76SOhWf/iK0t9M7QtvG8gev8x5L1Pev/dGtozWE7PM/eTX3xBwPk8b1wLlc45qi5x6xBjYILrMed3gqrstmB6UmLz9l75k3j+aT0Od3hOgLz0RqH78gzfqWiHQWS4g9ydyZhAZ90KGtOcIvXocQ5WO03X4ukB+Ua13dwQ7xuBeeFF6j0WNOyRz/jX9PmpdTR82j7XqDpv/GFYCav7PzI8PXgaGf1+bbXvit/412bwdw/7Bw2Wv3caAOQF/9ZRHsMXxq+L47tgj0/I17GIezyN5PHk94V07I8dQW2/gVMLmdQXRweXbUiup74+JOvMHKnxBW9isXoSW+EVRkalN7HYDzF562zfi/hHfbS8M59IwZejthZcExepvV5+u3HDIOEpM1ivLMAhhr9p0cE+moRi12cYQgkii6m3b8x3+KXn7mGr0ml5APEXnizg2UowWB28WAFeLczbBqOFeT+Yf2vgAyYrwKcF/Lda87VMXub7BT8W5nfB7D8QxptlYD1jChocRinMg+TIHHIe8gwls3tA8sS6tqxYNOTIKBH6aKUNYsBDcJhHO7BIYhzLHIgc1zyxEos2aCr5NnJEAWrR0CHjJRqRrD5uQ+QnOghCTsTc7glao9MeTYimALO7Ms9IYOly8p4MMkmjScBuQYMTTYIlD30tOTIWz0GnyEyBdWwwAABDCW0pGipyV4m1QawTtlEgNmKQNwgtcBpCpUPjFCAFZyOiUQGwYMgIOpYwxylBtMzUxaNoL3Q4i3BiAz1mK7OFF2xKvswvuW4dlCdEhOueIXt6wDyj5RmbIFyPzDWIqle0dKRCaBO/JrTFJ7QsSZPQdvxokG12l1gZaYKjHXjJni7NLbByyXoQ2szCAu3UH9Byjc+yy75AS2UzCPvAEbG05jNa7tiMwl6ZE2Sv7Nl3VJTXpF7YGz8a5Er9I1reUs6FfcGpBmnwA9ocOvU92jx16u/Q5rlTf4s2Q6f+Bm1eOvUd2rx26q/R5q1T/w9txk5djzbvnfortPnXqd+jzUenvkWbqVO+OP/ZQ5O7exX8mPDdiXBJkzsN8FYecL3rXwWzHLg/Ef4S3H0VmFng+6vARQ58/yq4sMD3J8KFBvdQBc5y4IerwJkFfngVnGloVAOqYVlPRgPZinHOz2RLPnp60kVk7PlgWcmoznLmGAMb+TFvczq2+pz91wyPSQqrv3ie07nWE88Tuf9H6jqcEuTxp0C38hFjMkznvMNHwglmERO8siiRNBKzqMMviOnZzu5hRCZj/7hB/neKy1+FJ9SPOSUipVcMP2ICAIuehjkFEaXjjMJIcX4+eJyieMxQJKHO51BEwnWdxCaOCreCQr3+MO1p0Y7MoNiZowKO56GCEGw33SB6gQwqDLLdhhsr4fqsJgw0K+7MB8L1QF/tyF077hQ04LemUukH2OfVHqnqfxZdUNJugh/v9AqOAesSMLDwNijEMR2ZsQp7tvdqDRsjWKFk0pCsUdVN8ZQXyNLyDjYeGq0sT6aW5b97BQUULUk5BOYCVglGBBaKITUKOKx0CjuQJJ9CaQWFupdgkJV0MlFH9CKsEgy14pEIDQNLcBj3sCUUjUcNSVjZbOn8vfrkeQhhL5BejCEKuYJDIY72GTdI1ZBmDD0jDipWmmfvIoxQ7q9viqul3MKXQERZeDskimUUdUDKsjD4kB+jE8C5r9kly4yeP3aIJxJkpv8sTRK6kUMZKtjn+IYItN5AkR0p3vSvHRMjKIhw1Cu4RxBCG0DrDUJYAhV+EypogWqpBRJGeF1BAmdTRQk+xpEQzbiWR3MHJ0XtSN0JwhYGTqEu0LyEhbofIahtPYrt+LPUdWalmn9X4KZTHOgGO4eJx3mEwlsorxEZs1Bg4Z9P5oPNWYjAFaoZVaHGiEi/3iRhOymbFc6b6YznY+MOUB5WSr2YNFKo6cHxGHubB5Ptavr2obUC+9WCwYtjKTFDGazQLNQJCfZWZmXbHRI9vPmk0M1+4r/Ghx8LKrt+4z/j+/hxjL0jOS7vhx8gTzg2KFpshVCxJQmnngFkbw+F12PQ/Py1ngxwBUevIJplV5LAwZDicMVQAWmmnx+RcWtxvNiBlyQhIVAizj/buh5YyRNgC1WelBRw3I7MDG6vqQQqYMgDzXXcdFZGGYYzjzuMUHA1Oz4ukkt4IRFnDYtXa+Kbzd0rpXonzmTymTHIbvRbi+C8VxhyCyPE8PprXZKS4vujRwR3Ezz8XCaS0FYARaTk9XjrllzPFz2eolAFXgbKUy5KW23r16ivJsKGBMykxxLiqrbegbfiq25MYgJpXsmo8gOATHPBoTH+WieCyIMiEY7vZ4NEmTt+fBdhhZxRZEgBhUzCXkimUO58JfL1vjV7RLBZ4szUySCz8noK7aykk19K922oaUiu5I/RTKY3AjZgLaxocU4dqxIzxB9iT6OgiB2E7MPCdp02VYdUyisY+vWF+3GC4ywafO+jAYerwJJZnEhSjhPRoBCL4SjLDQnYrhh2MAyoBbC9zKhrYmOlRjjwJINHaYHaghnlrIA6G8RVKSgU1CXVZijMhQdYqDe7vsk3/3DMBXWxBvgTS9ShlSsXrP8ZgeyXDQzYzo0myNDeaCVqLHXbVmwzu7RusmA67e29eU24ViPKvi3+0Pi0DNLJtCdc+4FU1q/wJ+JSnHJ6CAqzJuI3KP5rqLKJN9G09+enjr85nojsieCJC+x0pSUIAwi6lCp2j0TSiLXnCUE8OO/37u3GHBUihgQzdZy9hwUKOp8nUJHc+eBhBkd7WV2TsykULM32otIdPG8nRbOXO7f9agrF2RQReLAlK1OcqEl1Db8TnZFGjyaMK4/vhKNMdIDH+TkHjYateNh7hQhVpFhjvImGORsKVpmNiKqM4S5vOmoABU8CA1hPE3NlET1FAYV5EXwgbATD/jIpRiuWUh+NkIhrOhdhbGnoqq13NkpnIc+MRfC6CTZCiujM6+9BB08SeoLpQeEwbcdYMiIqhTGcj5AJs+bJt5YLrWWApcEsDSg6+4y1d5Vl+wOBUbarmvXLEWB2vfWSrjSn6U3UZxJ4IfNaerqFWbLf5RjsPomY5Pb3zYIO9LkWFzdmVKCaBkOCQs9kGJzFGLyCZnXa2KRWoJmbMNk3OprLRAahnPiHxaQpVre7v1DcEHmBNubkuzVHlgkoqvQkuwYl2sUddF45OGiBFJxw2a4LDUkOZhSxBvNIYloaDT3KIydIoCuxKIALGpkxwvnPHgrwhM4MV3AMHK48fmhQEP2/+9zFJiU3zPD8/Wqy15r//2szWwY9DXWSS71+vn/v1oArcyh7fTMYOfvWi1t60AAd0serKoj84+LTba+yvWhg3cjjlj08MR6kWwzuGDXhUfluK5FjJwOaTsNAeX+h4QGWQ/v4lXBMJq+vbzKZtz1EyspTEIEaGtiFYIFiVO/AIXpw6beNiFGCRbD7FM6BZtODwWrmOZmz1h2DQkfAmngCdXXey4TuhzKSPE7kY6x8lePeAM7vJYNAU2Im22oFDkuAIMPgN2HFwZnzvx2B08pctjLBucUnRHodr8TrQN/tgm24gAU8ATpzJLMTVxDLVSXctXUFpZM6BZz8YYxYRqSc+RJvR3mujj3Am+58RFezn8riLo+kjzB0StsERVmcvFdao8I82RFAkHoscOXMPpam3aBAC3sDzksHpvzOACSRWEtG9kdwp4yH/WIcnGptFQrcX0L0X2fADIURTsPQSnomIfpj3GLDspvzPBovexIQF22zkFelms7HSnb71ciulZsUUs81JKHLEnwuV7T2kVq7Kbt3squsmPgo2cHBbNanu8moRw0jRhb0tFl6VKMjbMbZfTcOW+Z3c2RdzvTj4wXYhA7WHT44MaavP4J3f84uyiX8A8ONQPE9VkZfl2oSadpWj+exa07XL1du/cCIa6OU4Yof5r2g1g3wLPSZwKB2WNcdPCvG3tiRb+1SnFkX0xRSew2jgtpQVLRFbBFfr+xC1bFr/L9FPwBElElLtisGZ+4OxPpKBrR+QhHCFG3oVnKbp3RwiDe1LsUwcVdlp5Awn0hxtvVVo47ZpsKwZKMzGkERr5RvQEGSOgkGNtz3VXiCn+k2XsW7EX2V+uZwubICvNPCEKxDg6KpeoL+muvWsXWdR7bng4IiZrFJw1iCAWU70HUHH2339/6bq0JV1zUSaDA3dWyUWIkCdpbPkHbVsQBDbUMng0MRG9F1jXZVCYjt9LrappVOzGhRYUCHtGHE/+jbYrtDkojzr0eBERKMnEJxOKubn2bkWgG0EBpi2BogtFEChk6txdG5CNwiNq2tzUekxfcsqNEdDumr+/pvdpzbzpg4Mv4V84RAv0zD10twqtotJKRHFPJ1SszS413VKyQSfQVlK4iilM13DTyr3Ix6k7OKgr7xzlHRYZGS95zW6FXqDsXQ2gsZNv4GAm3KizdILCSmgSrL5TBkiGvs9BWf15RXeNr9sdT8X1UYqvuBVMl3GoXDKIgPhj/vaJp8L6VMUfOb3QxAjoWsp7WiLDbU0toTrbrOnj4zqE1adSNDEYnTI+lev5vyA4q40GuHJByXWBxtuqxka7hDqvIVpFdqAzkEEXXphxvP+eKE8o+9wecyTxyCAr1+VPbmg/dX0n1NYFRm+zfX7dpMBqdQg0/uxGdZQZJwJAKn4TrjFDvvefPgZ8VAvh2pnVwzoZGq52A1pEVFqbhWBgszWbJWAuvLNkZlip2toeYI/uJBwRha8wSoDY3Zfh3UkR190UGz+KJaCmHIwkvuSVheBQvI4Ekx4ukJys9MERe+0Cl0qxg1WF/qhSGdEf/2dYWjaDg17brh8810VGGkNrRth5IiO+dHMamin0WVL0eGVOFnqSliaxpJfc9nD3xGAY1H3n85eBqvHCz70Lh3m10C88ZFPtcycmzhAaXXRfeYuj62/K2ytGw4zY7qgT3nAKXjcMUzRIlJvLMChQDcTNLRhmwtkrsp2thOU/b6YGg2qWCCo42Yhiu3K2H6TPwxyf2weVTbWBHoNVq5YjFya+mdJxsVwcWBJ4TOHPw3DN29AWcUlnJ8wLFgUGwJPaKJjzHtscFKooSh3ctwSNO7GcDpxz254LcYAxFIFSSwVU86cymWCrN8rINsc8KAa97SeT9XBrDi0V4d9NMkwQXKuDRqtBbxh/TEdhkLY9Um1o3pAAMvtg4QwHPV+QKw+33sIa8noCGx0ydjMOSHI+mjE8DuPjoB8AKMizhYsMFm4HGJAbQ2/kA5GLTBREGEnKKwI7Z6hnjCTiwgdv8jsYcH0gBFCTDWnkNlDClKEbwAjqqZ/IjmGSVd0A/cVH+3Bo/xNO+2wSvWyfl6mNPRc/A8lqIDPtBcQtYfx28ijs0rszgrJXQf9ysUsJQirwadiMXNP6VS87B4N6jw3m2Hepwo+hOeTXSGaVuJ3+KO2WCt6nBriLHJNr51/FhX65JxcEghTQc9JYlcGpDGXmkSB4s4wQVxyoy4AqNb5Vx1GH9QXUid98skSgbWRkNCop8WPziGLvmYxANl0XoAdn8LgTRTdaye0ei8YRj6cQ0niIOQRW/ax9oiza2EaixPsLveNefx+EAk2p0ELpAjZ+SBzldUkDcdiIGkGgQ2oDFjBG0UgZV9jEj+XH459zScrjzlQ+CMfmRHVN3tlFdnefw+FbwdR9vvxIpIlCUn06ieFwddwpAcgZ2RPkzzhiWsDpXuNZqMlF4j0L2lGYbHiHPoqW+QBveLp5BIBWr/DFY3T6CBoetiMe0OFSl6iAxuB0ETyLsM7xeAYYS4DhhM67BpOQO3aNb2cdgjyQpsNYyAVQygPYkNbAxR8vgtxz9HArcIBqaNuimVEAIpJ1MHn+L3lgOJSA629yml/3AnNvpi2igm7RaWwNESedTHqxXYM0PZdYkTkpYtjKvHCC6kQBSvRxDvQjRuYahZIU3RZw1OEboPp8CYNdL4MIavWhu+1MpqX5WVYLuNSxbxoW/ccPNmwwQ1E+sZoxRZnjSEKjPd1YuuK6me62ihbagPCYTXogw1qbfHIjiiMJ4Om/cJITdCLCVI9iLMUAiiSrVse8RFmHd6YW+BVI2R1GyOg2fBlT6qwzhHUxHB4VKPp5FP0DSi3kJbxkyeudPVmjiqlDRP2PG8FZ1dJqUkTnI6KQLer0bFtoH1LDj7zNwBxaHUIbIKnyZIpGcILDQ0ghvQNOEMxdZn9hzoj7D9dAjg+U5gxSyaRB7jszjbFGp8nT1tEnuzVrG2MHlV5H5pktCdsmJGVYHR7itmicKUyAOfuv/9ozU6IAx4XzSmkaLoK8HSjiGO007rbV1H54MX6wA7c6DLUSJOob4KlV8IGiO6d47IJiP5oxdV1kQHJlGJZd89OuujB5ZEs5ixe4LN0cKywRXr0c7W6MrKaBGbYvdzsBv4Votk6Zh4vKims2mqKdAghsWbHlZMZkC00dLiiqJb+jmU1DKSWYWjZiqgilh5fnBDvhwOfosLQL4C8glrAz85qMr+3vfnEKu4nScQLGcRDAggQ1CtNUHiXB42XBni2AXhnQ6ScCzxAQRJPXaTC+YR4YWz8A085Vl4N4FziFVZyohk44O1DQK3iiCBjORgC+0AfUTkR5KnwCDzlYJloakbXfjUjiKA1s6bCQGgiTIQAGA+k3Z3NpqHMzmVM2VRVTuns4AuPJN/hiPVlP0xBT+lXr1HKfuusjZAkX79uGE36u+Qb9rBsTeIiD7+23ujgkdGPpLPzvA0zg3scljRKhKIwtXkLVE6OCCMqc4s/SNw2fnp++1lyDG2vWxncKKbTUO2J4jwVuo79OZbrjES559jtr+dZz/k+HNG+S9HGMiFGJDmjaF/lYFIbhRvOS2THtHOAV06UFdA2Q0lDRr7+p4l9ZpEgwIdZz6Ds/divz+iKn7PfxT0ooEoHY3nTwh2jXk7Svq3VhDUA8YHyERGTk+/LVQSEa7WwO7pyvlFUkJyammCrA6OAD1NQefjOVwNK9ea+AZd3ERT6Z/zZ9sS/1j67bqvTtGgWef02+YyQY68CQUqFt0MLXcf29YEGWo11GYBXioRJgd3ybEGU0YTBbTXCmBwV2Ecd/9v4FbfZ1ZOhI2VhzWnKMk80NdzZkLJ2L/8YeQPPb3TN9Rr3UFnnA3Qf0in4+7DTZBvRMXLoZ+05skq1vtsTutV/ZiOq8nXaXYDoe1LmCKxo5bjZT8yjvml2+RQRglUPLXIpWOGZ4b6D5TwuvkBFmuH4RLI/dOYTylzklscVTatoOtZhShKTpwFt9PoTysnTWgN+owIjdHqJs+v85WzLR04qHlISq1HbGYv+ZDS2nA2iEzSSkb4YBPsTiynBYxFNjLu6xqhFmZ/SG0A+8y6wlcNLmo0faCWKo0kyXG699LGAckkJiIhG0LDtoF9f8C1CLXHI5fI7mIjp8Nac1gQXXklRGFWm9KA5STgKPRjAUnDA/wpS9+sEHIxmhBWRU0bDKSHJQTL/B/YQRNCGDEb4YSOy2fmFMh1mM0FDu2EvlyvOQGN4FWsvCzclUNacUfsaG3iOR5ZcvoRTWVLvAOoPsvpeCXoivcun5xGAZZ3ca4qCJYDw8+3ge9AOC4QDfUsykJzQhlbhJ65LRLCSONNn/oKn4CBeBq7pj42ly+weaeQd8ic+0jZAnh/hZzFxqsGxtGw01d9wxUZMa6ChHbDIbnGR+ZGtl5xgJyRBcUFy824OexyCuqTVNcvxhqFPrFMqT4Rj3D5xVdHykJv5kZ72D06gA/3QtPHW2tncJtGRSbQCFPOcK/hYtDh0XKZIHA/n89bjjutoqhK8sQ+TnZ2VJ5WbROH0IoWGEegUtaZilFI8TV9hzRTUTLzvA7aSr+0d2BrGEEvE5I0DLNklv8cT4UsHxa2zVuem/R0OigXYdc94eYlx7l2s3dcs2AXb1t/H3dzg+762rcUp0cmIhAyT0mzVdhdZoiQY2SW0mHHCFCwxdjgGbK1Xs6NbLQTyS1ClxhDsBmAavbXWTcYiEDLXh06P0BFbGAfdp6nnpqa5zrK4JRmszKNDc0Lidx2vsLobSDmM4nghR4iib+QJjNYcgR151Nkn8HAChGykLPmSfFI3CW1fFTmv/Md5ZEJ+OQNT5+W2QpMR0RwsNgKx5t3zb6OjAOXr3Tvo6WeWYO0KTBDUYJIEtE8yRlNgyJ0kiyp9FKbW4T6ESuAREQgeF85HUC3X/4BA7UBVlHsEtcfYYBUcsrj1U+tmE47rzi6SVH7NvDQrCl6Ft1WVbHTycy8OOb+/s+BVoLjQHCsbRSqoR/45XMyKXEauUuhT3hy+mbv+9FWcIlryxtWeXMt3anyl0FazaK0S4cUlk9gGfpTNveUo7/aPLZn07FQ0tSR30ES6heroykQVbR5cW/eLBOlwVn8ScBVpZRecTOIieGuVBzII5jWeL7GLdJU8Qmhz0BNfQk2JfBzboD3QSfWxtrZITa5Xb14dlfZYLeZWb2C9tGmMdhbdItpbSMvSBJnW4TqJsando+3GVyTNDbJCZe6wBZntcHrJYF+x4RoI+utnKI5ouIO6zABEz4HB4k040/61EzMGlNR5HUARPYcwVcEO4Kby0Mturi10bX4lwfTYqvFu8hwUZYdwAoENDnZkwXQczpCEPRl+sxiZEYrUU3mD4PKEfQPMF4jtguhnWg2N7M3vREMpb3TmDcNwF/spCmNkwdoMtumzFf400eknbVrNypUNCmJTn9Uwz005JBAfWewTAKmsII54j+4rS7TOjRLdB+J3zhGClwFMxEBn2E7OcWVkBKYQwU0Z+9GG0jDtmtfCXSDI/v3pMo5IiDliMkdumU4lcg9LG4xrrPywDMfT9oNVXyu8J21beXDgmhRdrmxgM530+SP98Hx2zUrbLv6JA/Y3XDwspW9lKfd0fo7vkg9yIVlaylDfZ7tOQArk4lDSZEWPYIienTesitjk9YW+2/7pfwO0ZpsZe7HVyaJbtsLkc5thyWgr7di9Do57f3CSeYri/QP5eWYSGx0wiQApUa2bVbN5SANgs87ulxdj2+uBUF02eEnkoPSXexb1KJnGjcxufMOJmSygw+2vFI9LKd26bmpnLfqKhEzmW3gvQV5s0CKJRVzPZ7OziDOUH/dZnOZjgK6nMb+6BqQl/LCNLbn3XV5oo/qatJuc2gWXQVZbPHTDK39O/2Tu+r8Y+FXnt9HIv5D6XdJ9RCzMFTVOC/f/LAWEjxliKShF7AaZ80eA/RyLjFaXJWenQsVsFVNymUu7HgaAGYFNDs7LoJ9j+H4IqfV+A3f4zr7eVtsI9e44SNz/2UuAOo/Dwq8N2tC+PnaQWMFZNNbOe0RFhZT9E7PxP/nIxymn8wfYw8u7dFh/7rmr+K4cQZmoPcp8zbrKc3ma8QvnoAPfXA6jBSLu7W7+tko6CXMF01wCXtNI8MqeKX99IaJXJblk8y5+ORgQiTPj8zpt9c4iu/fnyiUs8W6WLbMlPLy1seHZWcalWvMgqKm8jxiR4iQj/J96wm900N0mK4isQmBiqxK0i+EicmVyXeBqLhen6OWDgk7snjPicrgs9VM0lk+YlZnJlenullT0M2wpL4f4oCd2lhJSfi5aJ7fWlespBAyAOFqJtHsRqLxxtidSppDTSxG3h+hCJGbcJKovxEkUJlMrfTMx3I6ItbFRyJCRAJikqhPJZqsvNlcBJoZ+tdUEYuDb/dXRGiStMcR37zWQmgUW3q4O8h4UCcRSgWaTHxXyyr/+nk8IAbMqndmvOvMEiqtSXIrQ+/jIHRBsg2UmxRqSSMHahIch79ebnCKaP/NvsGLWDshJdVS/31E0LqZFI6TNSXRsPJJEGgbPeaOArI7KQcPmEnSY20v2xHBNau7T+Dqf8Hz17Nun4WcFd/HSySXk322+mm5nP1fX6PFmmUHi4kPzMJFAnMb5JdXUkW1M//0nB02zXVrwDHHaDteQ5qxobvLD8rdJYUve7WwwWRma9kUcfJLUmxaC1Kellm84oHGLXQ/J4HuTxCmD9TiTnckQCvuK2vcu5VAqwf5DTCNkttFTdHrD9q/TBwccRpuGSaH0aekcjXbmNebQ0X7ORtV2PiOubxvm8Axcguxj8xtsk0fXjSOdEkYc24W6srxKB0w414lof9uljdFP+G8pb/VSG2UbMZi0UNtkI/oBfCf33CZI3Q5si0PoLNm4n0N1+kNCMaJldaShC4xN34ijzt8lNaGu92OnljrAzcP+voUy2hPk/cHfR/x4QDlx7bhGHrX2FQbuNLQEmflKU7mmoYgOeADGikfI8CfNVanFLEbvd12Tm4ce62fzR0+I1ArXLBj0oXqJTmpZ7+YL3DwVZX7cM8d07SHXxpvBh45p0xWDnWKLylTV+PKg7HNGUL7H9/8Dbeib8N3e+DI0yR4qMZF2goVxA2effYF3ZtcnXo07ZMq8naKGt6O5l83MWUNAuCPS4yYi/HUmnxFqOEnRyBNEoYJmLaJqWYNLa7Zfd22qQg9ORpWCE8dsGQV6F0c4Evn5NR1GkJU3SfGsfwIh16zmyWOo4EcefENKxPlPnESjYkvhlXduZ+5lbBKEGQrURyQRX184+/H00iKTSzQ2zEYj1njjrrwvVTqGcc8koAxMeoa5ieV/xv6PwWw+0Ip/Skgi44yy2ieAYbNan8AjtM855DfC3LcarwYt47Tv9vX5MSDgTGSbfUvnw42PsY3zppePObR4vTwUkpiU3y/OndNiqxES0IiNqzRlz0/+HrWz3DWpLxHfj+PLfyYyY+1TWJDrWi1TyKuOdrxEdasF4CMOOeUT6ZKG2UXgI8RneXhSCEgw4jTKiTiRAbNwciOOQa5bNuxkmZVKBM2UlOYtYwGV1YzYoiwME5d04rKlbZQCC8I8TsKCUoZoxxBO2EBX3vIs9PJv0f502lkVo5TSmHhRgrGWUZW85flzkeyM3D4NSBKu1L/B9c+YlDTwEz44Z0RajBbCC2ykjYY+vD7s7w6j2GTpxsrK2v+t4C2YwdqP8hKH6K+K+IDsLt4n91OWiyM6WP4NVagjMWJy8ldRQRir7eilbHf51D4tTRCCO8x+cVJ5jFInfnommJXKhOBm9iQC6Cgxf0Rr6hslzBOu1Stefk5p+NfoP2pj1Mm4tOnLFA9EPWQVvdeoEZkiMXxtXMCL1wz96Oj8uAbKyjqDm0TYdyfINBk2uGjNErbBJltWxNc1pdifUa+6QUrF8s2psPVdBeR0jAujo2chlfkV1Wnu/C4lYnTHCS4fHlwiOu5t5FhDwaa3+f0jXE+86/vNTEx8moabRBg9+iePHVsQoF2MUkewHvGpHGl0ObEb8Xr/cffOlBuSWVsI36PO/L2p7UXMsO+yYuEGLtNvsZHBCJi8rFUnOsu8VOtI4yf0VCBlaJvh3Jmt+sZiXMsBtZqn/nVXQOeSxSnL14UZEw6WaYwK09HRCAGxiRFT0VOSiIV1Ka3PJtNgFGq8pn2DaQkBW48L4sO64jZ2dFmKTJKrsC54akWXjYzCwv2IsyPI8OWtsBqePmokHlxB6vjhUk6wu0yIziBQm7STsCGRmCZxry3dTY454g8MZ0sV90bLdY7FJsiLpA5Oc68wXI1GxFYDsh2o0RKDHFqjpAxOKuIoYJTaqA5aK+yReoCjRGRQfI6NzimWPCVShEeeaf0GnMrmWMcaZM1VsMPDmBZM4FVoio9KFqm9bymTWEQYS3UoAkPwBccVdnHGTbWGeMIqQcfL8ebcTSysG8nwreSGkSV6fFK16cs2KG7mcxnDCfRZ8dEiXaut09vFvvKxEc244/Nz5R4f1bl4GKjNu3vcg7eXAg+qWjNtNFJEjBsYiiJqe4tZoSwECSVce+B0QLz5r55HZT3oXpE5sV6igSI8DQuU5pfKx3eAEQefhn6hjyvxHVfwLQZtXkzrPhl4PCu06n0QIlwOAT+veaIVz8AG6qu35rvIlxBVP/8JJ6Dm/pj5a9Sa2J4lwk7DggJFMYA5fFd1iLj34ih9dA+oe0NfQApKC01EEGE7HwHtHwWtjOg48fd5WeyM4CmJQVi9Q4iXRoVFaEjNeGRy+xN/mZ2McquDoT5vOj1ZlZksU0MiGoiU5fm2uRHxsWvFxEqfYV1kjYeKbN+e7yOD3I/C8i3TTLICGYlm8Wmtnr7A1VKVLgortNVmfUoBbAuPj6y+PFv+Ia91l/eEK6F6FtmXoY19d70zyNCY5cDc5ZF16YrWVOk2Vx9xxkZllHUaRE59mYGW+JdjZo+UxlJTX0YVQ3nEaTr/AQ0bc5kGevF2IedXhTUXMOXl7dV0zsHCKC0PwFgxoy7AGVFDFSTBRtrGW6VVcuxLQ7c2KyjK1/zrVJ5bC729AHcCC+QcQwQHokO6h4ph/v9IsnvZz2VciBmu2mQ0vQ3UDxQvoK9pLa0Vqw/VQXeLehsVGkqo5nTfYwNG87EmRfM18vRjBUDzwEkn8tmnEdOiUmZ0PLokfCayO8jAJtfWk8V9+ZxcL7Zm0NQt/W3nNkwSKT6gdMzLecUQ1GCJklBNNpTNdm07eNK3NRmmZlVsml2awPQMZNha8uXTXpRGuJ7Oamun0L6UXPM0s/16UNV/4T5c9tuO0MtWQfUz6slufMPI6RR3c5SL34gnOhXGxlerpsUeoWUaNoB9TqF2IGm+kOISNrL9BgypdafHAOTzSjQB5l1Hp2rrkijfII7Zh/4M6MF2y5/i8kJijnzjycsbf8ESMU4Q2RjghWt1t7G9lh2wFTRQa50+ro0BhhwJo8qYIkb5DEDE/CMm4ANrpAXDqC75kAywucpPc5bskwJijFJpbuoZ42l+xjPHwQdUBwRLbHRzeRvDAkO8rA7IK+Da+QRHzCOAfa4Cai4WR4fgDVulRcq4C3opiFiJZXw8ttqHVdpSGOCJUSjoUPsGB5uSQK3NvT6mX17qFhVCV1gCW2TrWVZO1kuKu78UnxLCoeLEG4uA0UYF1u0SxCtshckkniSv8tb1P1HIBMCPkWumhQt86oExUWCFuZ1DNykYqQEmKkbFMlARxR04cs6+oB9qvkSllSznyaBlIr9FX1CvYSNjowBXZZlyspCd3EHX3y0/um0en8YJARekFxKft9NGjjf8fkFOy45wZUdVCyHVZ6gT7LdkrLy9ACVuW2xNpmy5Pw+0z2Ykjg60h1gKetjkTFDd62MYdZ5stM5c8vQYyfbBpj60wyZVQXXemtxxOt4vepA2A8gOddKTXwXXH5DkuW56E0ogYhbtPOAH5y3XQNcjj2GlMkm63CRw0UOZuA4OzT9Evtzvh5ckZcKI8Jtk3A/rfhh5Ma9lbgiJuIveJFvhKjPkIZsIsJ9PSQ6CNwawew8K1ZRKrc4ZLxqcIzKHDMCNGf11YFZ7M8jLWJ1cvoR7CBnjesDvow0TQeyZEyueSGWO6O+zbYG83GHD+Ji4BqtYr/maQ0b3g68hRtBoskSrTqW1NDAeooKAsy/Ifgz889/Pr9Wup6Jt6T93x3KR4/mOzl3yKtBYtTC3e2EDqzi6iWhlesfTx1Fdx+TOrPjcgpTm57p9hFFdLMA8hCpn5lcnsonweB9/aWTV+QxWB65Zg/0nBemW47P1FbTE6M/7k2iGAu2ofCIn4VBz3tEypdkpobc6iAfRrtZ3b+MrYs/hfC18QUwKNeJlMCRfEBDW14Z0X4tzevlHhtda9KFKp7i6hpsUpmsuy1TP6n1QndBSybX1GyTTYLWtOhvhQqInI0DpXQmfU3aOBmYP0HWtyER3BJgwCSlQqFWY6EUJmds9f4g4KV9kWQhom69YyFEW1+1BlSRbtU93jVr+nyFQTL3QDWP0U6FJ+PmzhERcDJe+8IBU0X1DK821NMSWdJ6+WAkFh54jNFrMr9JHco4JnkLuB7HkgbZcH8gBEvTnprkHSS35+761gHRFyTE/yz/Pdpe9O08dsBRvwKdef1msXoHaoLTO9AYJWzes5RwjCmUivNT1ivP9Eol+Yvp5ys939cZzERP+qnW/+mrNhEpxnVBec6l3VaF0xu74B6Wws8w+rVA2l2DU8DPzwOF35hJuL+8UXF0p37BzGzWBuQu0TYzjwGw2kGsqbUFdOfUIOjSeymFpQEzb6BUmrDAF219i5o6YDRogZuIG6HITTVqT+9d/rOk8l5x3gzOHOLp4SSqk1XNJpZ9a/WfYqNQ002vZHbYilDXFM+y+0P7vCx8emy+F7QSt2KOsrk+Mv3zl2QjwG9Qhzf/a2Jd6uNLY8LoVLIP10lDrEaZdNwDYJ4EmcJIESz5QUiDbNw6muhrCAN7btbNNXSNx3DOsIm9JoHAC4a4ThVkKPl4PIl9wVsnSXziOKRwhfjlT7WXTJk8iW7MA1ngYngoGQQ6IA1nWuCeTCpu9lPYkKQUPaw2SNJBU12oiBqh7+HyuMDOnjPuk9irCI/jzi3gvfIcBCtI32hwiCBioYQIqxmhUkMWEFbjCC5lnwlfKTlqbB7aVb6aWWWzgT//aPwfrOkk4JbvG57j1rAbvbU6HqZXplQKwh+MY4PJ2Bhozp5n4UhTxB3+BquMG63phCytjNClgp2oNaYL5CO8MWMZ2PtxjVk8P6d3vlFJiJjQq3mGGT08vyop4RAwV2l6OQwGq29UuBS6YEQ38lHUxQkUM7LQ8K2cTR9qggEFzQ/zjj0zRxjgMXjOMSRf2plshiJkj5jqRauFoNXl4E1NsQ7EOSyF8kXEyd39WVa05r4OS4R46c1zYJKz41PlQ7FMF19d4mCFyKaVBjgRy4sZNROuftBRNfO16IhCdd58d30EFSD83ZICX21d3y4GVD35LYjUYFIpFrrvNa0MZ9xVjAF3RojAqhsEJSf0LYn6Z1EYcDRhaBFI4Z9KjvHVL5Tb0VKFz0J4rfaR9QhJqijagMnZTY7rlj4UA7t8CpjDiN58w8Xm0EkFdKU7Du1MSziSRUGElGoQa5yOk4jKdNKZi2xe0lRc3QzOoQHmS49xdhL2PqwGuUweYbDi4awTxsnU0vTwK9UlitW2C9KJsts8L5Oq1KFVSlrGLBxLK64GD5PrUjNye3aeNxhOPaIGTX8H9ddcY9dg8HvnBiNBjSTrrs8jh6rHhFe8EEdxvrWEV9vAXaubC3VFqDO9ijGOtmliDVSVQcopYBtwnvRiopwcomuuaCtzspaJ3IwQwlqvXtG96UZHiotcFKQSDZPIXO+Gu9tR4YG6VY+080BgYTOMxEWNXbU7uDKbaQJGBFch1mC2vCYVR4MR11PATj2Ul5Q+27k6YFYp6Uqlo93m4GyTknEJcGQ4gOY9cAazbxDizJ7s+uYJXSQfwLRLzHgaqWwfRu3HXcIDHFXNQZGbslwRtiyizzUvHOHBdrfMYbCnMeE5GLDt71swxt0g810yRSrbbxDZJ4w6foj3AR8zxOtASAxqLonz2DcmMWwVTRBk3uetB5TdRanOENUDdb8piYQnezvXFFb924NiFWHumL8AXfI8vUScDpc8AYX8JE0WEzE9AWxz5XMGzMpzaXUt4Vq/e/OfaxuHqrtntk6veE0PgFDt1EuCFTNeYQjtUlwAmGSneoQ/OxIti0V+RaXVGRFtU4bn+zO5Hep4guN5SbBkRfyx+oaueej/GN875eyYsQBWm0wmwVHek8RYO3MJlb6Al8TTgIq5W6svXBrTakcUNw5226qbkQjJlLZ79IQheGJmhU9FFHB01SEZ4THAuGMcTRW5MogwtS9OvgkSLRoyYqXUQZ+fVuXdjOhI9NJGg278gDBL+GZGj7fWp1l96Qc8rPCUAVH5FLDmbam3WKs7smWJrNfZd7vqg5EZl4tI0k+1sPyPWex/fYczSX2iC4cVwzRmRYQ7Uxv5OacgzDTpZ5VjCRlXoRzz/A4W4wpUY+Z36Eku4H1Sk6Jh+nBDbeZ5tA3hT3G5uwPBf9KL80yfZoUU1h+zx3g4rhcRttcEBh+Wr0DvXF7O5Gshh/xEwxfYcMaqA63bI3EnjU71DhxwvoUu61M6e9dSQoG9z3fct1tH6h9Mw7iyL/e9byWyJ9DB/QdkOKkO95EXvB8E++wHcCCK5cyqcw8X4j5Z/OUkCNQD98UdER1qBh7J1il7SvBNAr/kto9n1ReRMEx4C7ZkDLXhFZ4wdy/31BpkIWGgeERqtK7iAWW1ZYqU+FjOMhEGZ7mn8LvwDpZ01elgDUxAQYsKpSMB1JXlytlRYbqnGw1HR/hRWlr8F8yKvyqUdRUNG8IQXrDgPtvwq9CgEeuhD/AoDbjzeSaTGWRUb9fQ5Hz6il915dfaBnsJ3WB+6rBcYWSxwzN/kzuDe0S4yEHabizq2BK3eANyqC5BqESs58DOUKyvNUJrwFG/wTgfSo4Z4JK097Gx+HQhBw5be6QS/FOTx/t21U3WylHzZlJLEpKSgEQFYSih22DykCXo+IqwNyTY6R3fl+RL69j9AVxETZdaPsCBHaXlURLCWyeI22QWXEL3jsuJuB5lAJt+FpvRGmN2qXhsr6LGYN5DmbQAW+iT573O9LfH12AGob3AyKGUOHqES8q0ZL3pDRWyFt55SYjQcJzL5H/EITn68lpArjXi2JUa/Z7lw2Y8KFavlfQTydhxjL73SQS5pJ+Q6ZEFCOnMmBWG+BcVKuw6dP2lXdS6BJvBYNAR6WsDSVQYzMF3p9iUGuPB+7K39QfDKl7vpRAhQJibV95xy0WAP4+Etq1R+5qMONjLpuEvcOoVwn2+3tLZBJPAqRk7qapbJ7i1cWKZRI6v3eihbdYJ97cYRcRwqEieXH0YLonIt4oIC0WfF8qFznqnmy8I5WUPte949r3IK6TDFaN1zrI8KdvqvxmZdShe1ID23BSdvSwnB9CODdrzJm7Apkb5H0a3hvIo+R7vpthgLoGvyH4Ya6muWrb3OvH/I8Cr/nQ1s+qe1ZJZXvO6lfTqTCtXE3/TOmhgh5Y4bJUisijuf6r0Qhm22b9hGwx4akCKaxI80dC1C0ImU6Pxn/UFxFOCdOG7mwktitJjJC+y9znb+KUI7SrvfxcT+k//hxNZPHVraA4Y8XSEdajeb0wiXNd87/X4Z6OsBGEcNh3uX8dArTHmO5nP0v1Vu5hwLPm2OAtWPuwrRgPybEhy4F/X0TRj5rjCAPJEevIFDaU9PXZ7Qw6reep7F+iqPlndtYfMVdzuowZDiblZk4BMWBxi2gdm09RVRabPV9zkoIPRd1h40yiuBRGshj/fc0QjPAHfVlzVkD3/QhfSjA0Sn0x5rsUJxQOThMMAo8PLDu5ioYzIf/8Klsk9hnycBBisD0G66Z0SsTC8aLS8wjx6vmKTvlFbFZJYXzg/ZL/k4QYJpGFaqFmiAHkV4gLXCuIEh+KhQNrILN08CIh5teoyaSqLiRKIXXrTgt0NSULT84H59AFQ2NhamWl87ye3BHELJ6CST5glT0uy4bQKa4vLwdebgOfl/y5usAvREyPdoeqrKREDIxCotWEIBYlt3Ns8JiRogWlFiWeo8R5aUOTB7FamqYgpwdE7ITo8zmwiQf+v+TLQSZAAunxWJYB0Eu52eeykV4ED2d9VQDVB0RQTtY66ySe+iyQoSGmJikzD0MRMJQ6rGC9H2HQWbmaU5ItBz3RkI4FMsKhqnl/QeslKKhyJGze9t3uZfoXxWixk+dmli1PnB5ixPNKOCFjhdzPyN6IQiOtJABb+/NQTTLSXLekcK6DbllTelJyMwC8vTTIbpFdRJv6F1kQM0v3jKe+wjQz6G1cK/niBesq1sk9iUTPhuLOL86M3afFjiXehR8NOy7/z4gM6BNMIdsNJ6Q334A7/MNTrD+PuIqO6+R1VTnO8bo7zPCTmR6Lh7TWEedeNya2Sr1wU0JvRDPBNQZv3Za8TDz+lf8HfWt4k0ST095l7zXjdsMHHbbTdpyarqszYwELT83beJj3pnOTM9+pa9jUt9N6yMn7we1FeO1jZ4HtZhLpBojpBYXofImPfNaEbeQenHTVElDcdUbGmnspYG1yXsX2k2fuyMeKPhPkKgonYdl6Wk4KQG2zwQ7qR1mK7tXS1FqNPaBFuW5VSDkb0QDiK6LEeSWhHdCclfpViisgyMwHt5Hozz2ekuYTnw3XLjGO3MWlL9LZM1D6fHFWrai2zMVIFumYULezeXCwaYbHP97JAuMIhS4iirpYMPELx061ArfLOb8xFaoj2AzopK1pfNKkLBpV+BEQfbBAY+ZkhNjEw5lL8EXNF7efzwYcn5Ul62yZnJq+TdzeZ8CRxoiBWqJVRVAWqed/F8kGloRwPer6oferLr1rJC4/ZCz1R4tx6YBSsYLJocslflBAGupD0IE540nOQpTKKxCxlMrLFcavJWqsxvHnWO0IDaPCC0CVJmclKsqhKA07svNcgcdw9lYuQOn28UTzb4DD+aGVDFgPXOAFDXeAIQsMCgHURqj1xmAG+Nx3dHdaAuqT+Wp4+3/9cVBZDNo5/Li/5v082G6W3OTKnDhlUPfwOvB7hOHxfIkStqUwQpWwahSUDV31Rk6q1f4IiSeZBqGz83D7xRTjKpo5JsyWYt2VmCU/xrJWp+un7YrVj4OZQxRI2YhkFlGlnzQ2TFCr0Cj05/pmTWtx5RaSKpq7PMIqLNsZEAy+Fek3CYqZOpFLcaLMKpLhCVnyp1yIOErQ8S1cMXY2Ogz/wnLLtuNAYX8AouNZwJV2kVWs53AyCi6aK5nibe4bIKK0BYhkH58nXCRFQrh8JLdTSsnIBiYGnR5Do9DRcerEkC4jNEdpu0T2a0bgvgXSmFWybNiS1vsEBOw3GGCbe/Qh0bOLmEBX/Y15Bbf89sAnvzB+CYmngZIu2G0+1E9HoWT0PH7/Lp1UF6zxs0Y47YZ/hXcPt9Pq438mkUDnM5m7x+kOuVZuOmscwETDnt5D09hfXw6eiL1x18zkwXzg15f8IAeBdKW1hzYtTzk5xAwlLyvNZZ+hE81PrKoTVfhlE9ccEadavhxm5YTOW1/fZLmzqaVWRBo0jS8KsYkvpy6Z0SMyBL+rNEndK0kUbJKTCiTxX7CurR76LhtfNhx+24d6dxK10NEi8H8vfMMkFVPVRTE3AQqHYzHJUOortvUhPINL4BNwuv50C7D/TxOGTCcMins6xk4f9pWxd93okik30w6dy/lPukK4MPrLgiNZDw1UoQvaf3R1XUXmQYCLpdTFX57vdbU/ShIdaifixGxindSUJshDYLeG50Gbl7wJRqKJDFDR0qcyW3onyFFBzE9CO0aWS+VWssyi8WOpEqGai9SVKnwGtKRRgSYA79ds/m6Tk4GPdU+85NikXyvtsbVPMF337gMBqsesoo1qwxR3wOX2ro8x/72Ylc9mMypSHFHCxRl19rLJKThC5pvR01OKuWaPMgZ+P5PEvOuK8scdbn4WnLyH/eErcWIDZ7qBsyE8Sx7TalgPc1US0xR244COVk6BYgLzJ3fthzIS413od08OfvlEU60T46+pORBqkEDsTdjSWhv5ZMvD8mFBQWcZSjrByMUsH0yVHIyHspK6ZrVoRjx3UQpMsWqH5cjkrWyw9PVXS2RlK+TYy8TwF11nKJslU1I+UJoOXmy7JZgbxOUqxBpsvmUh4PRTwdC3kGBAvtLG3HSC0LdBW3caw1u5OBn5by7hiJc76zey2lgsvCj2m+RT6uMSHj1cAZUSPgir7ovhxoejUkxCQnGwvvosDXcpKCKh66HG2wTiJxCcQgvThufFmG9yOPZKBeXPHoB6bBGjMNVBPR1D1OVaWj0SeW8fGylCOU24S26Fi+mrXKOAyEnYL21XxfrE9IuQ6yhCVz3rlb3cYf5IYUtJ/SMe2ba2Awl+DC32qtNVMyjkKvvOVurYwH1yRLvTb4joyMoIXe++wOq8jPK+t9ize2qUQqxxGqEii9JXP5y9cBtML9Vbt39R536Y2/N0rI6aeixsWD6YXAsigQID5kczfINmLLMcZmkSShhaz7rCDMY1XwZVsNZsL+Q9FxbhvKc4LnXJQcPvkBlbChVAYSlGTLItUhH7MQXKTaxy0B7RlRP2K6jVbosuQz9LhiXmrgwbbgDBELP32aDb0ppH0nsVLf1KoyBRPjr25GgSGjtCW7ezlevkCFFlyyM7FEuk5PC+B6GlEKnIVMkItdFaC4JzHQbdOwxdVuE8BC3JF9NHWTBBe9z/PXlLG3GdYB60GJQAJk1I7i4MNNxP4eCKP8A27xnoLFDs4teyJhKdLkOEv0Bhg+WFhHiCH0i3PXpkrf6HPVh+ZMFAbvrsm1+ZhJbrkQMa7RWrF4uHIBR0XzkTErIlJfu1TmtiSoeyJeKYwRyqNi3k6cvRekn6B3cxmeWD/py2R56jQrWbMHRq/N7N76BnMIpAZSjjmjaHLN2HAkEanVNjaPfd2TP4aL5MLuONysd4wkuBC5UodS1MIrW432zf9cWOGFsEfC7GyMSYun9PD54v2fBcqULT91hDfVbzWrQ0nu0fsGzBj9V0Tx0Zo5e82QiSs7BoJ7Af6YtT02ZBgHxGyltAzGZoA42sM9xzjfX/Tk7W9E0V8yyd01sYdY+3YPHkwgEQZkO0JotusiPzNxBxWYxZHPOkSBofKnQ6AA0dCMkOb8xlzVb5czM17L+6w4u7O3KbdJC5KfwipDE78pXiSBGkJoO0Ugud6jGI2CtWhXmP5LtxGwqQASSTGd3oVu/x++NnopSy39vxgFgWkfiU9SEHI8qmtlMiRWSFGkPPc5hLDFBkgvUxX+jAAdrbjo1whDS9IEiL/BJzNFOrALTZb06UK0VL1BV9RGqqp0pvfEwMl4rVh2fTFbE9wmGeT7smr04PN3U7g5lHxlnnSiXqNfU7J/Y7QTBEFRAftWMPZN2ZgiRZXUGop6FF5gt6p4CnO7NxqwOR+A5ZA7R69SvTgvqKJwtc39UU8NjzypE87V2ZzmqpWsDOkkQgOofK0aqxebqS8xe1UVocbRQFpFDU5jA6Yf7fjiMyI66BxQJu8PeAnaTIihb3iG1+FiFIHfFK/2I5Ie6h3l0dd4GshsDyUd+ElSYbkqvhW7B0HygKaoIsB0jw5BFVZJFU+oGGI5rgY+/OwZlsKWT5eYXnGmDRARZC4A1YLRSm3TeGxFimoQOBo28S84Ev3RiO3Zc3Yylz3H47ubMQgMt7GVvafs3LkLD28CKx4NtpkCh48AqfapTJWE3uxhc7bnr+Frigw6lgnPbiAuUC90Ia+2/Mtw4mdPX0Vz+oBW6ji4EARXLVhm4zkvxusCIP0LrxXO/TOLVPIcXnqOxmg+R0XXzDuFh+bR6bIy0Khl+i5gk86TS4k9jRlCnL734mt5f7lOrQwgSbc5v2fb0l+yh2+5NStR/uG1c2TQ6VM79yuGHJKu/bkFy3UDLZ0BFzmXAIIY1LwFTZB5V7QMUMC5K34C/wO28IIElUu17APsJCoxbWXeGoh+Tk8AXO3FIOELA5IkPpWUgfdVSiMbs1yLUgMpgeBrUN0SjGJLWyfl4IFfZoPPc1rQ7WUPIL0xLnZvgzxt76i8rK69LrF8oH3jDtE4MCSORz74i6k9CKAifgXcl9sESNZgoyNk8QM46QL2iOC2yLQLyNCAy/nNlZPRZ94UhbOXBZ+bhSaalJDDQUlJ+4u7EppNuE1qTCeiJfua1uG3Nr+5603Yefv1ncy+6NHy+St8M5k/txYHaaHb3pEsWoLPTySAA8o8f4Gha1vYXPC372rh0oCbmFUnEnCaTzSXC7Iw2fVXDcUQ0MRaEQibFLBQpBWSJpAjGRPEjpU+glpiySeP9hhx4i0qKqcnOgxUaech1VtZcQ2UABDsxHZtOtu9LRjHinAvQisk7oUUQ2plDmfMVmdPj6wYxGORESlMbDBnj7Hnlbuhs3si08CUCMQUuV7Nx6RspVhqBTV9EBlQ+2dWKjq08tW0nfkKehC8NCr5b0qOY2mB3F6CrWufSOLkVjzJ67xgeogWc+MphIGlCSIqqo3wl9mn24uIkn896Jrx37vfosKcvyQrKRNJronLHd+wgj69A5at+YIyBZUscDD4z4kjrtIUpp3hyKlne6aZ/+zXYIIDAjyBAFWXho3GVC24KW9LQCXJwEHApZT/oW2GTTRnYuRAlCiEkM67Cbc/XChpp960iKoteOpdY8H+YSp6+2NCW9oEi95QVUhyaIvlAFLoJGSjeRBRZIVMJoM7VXJMYfoVOh1Ef+FnjkMs8Bo/IOvFVLz3YV43QhxUMxrr0o01m2tKQmBBmM7twgwjzXxpCEqzMo7KUMW3C52ZrfQ5SQCDConZ0DNBqJQaV7L5Xg/sWo7EeQ6Anq8lx/g0uMZadUxk22DHanvIOIbMWeFtJBGA29hr479os4CEzSdP3L5ZnqUdGmIKSSBy5A4WL8+knLYllkGGu6Ky1sLtk3BKu8FJTRzKQwVD1tC5E6/C4bp8BZwCu/SytGVdEDU1iLYHyhwFtcVUINWZkSmvhrYXhYrEcVNVxMvxzLM6hLLW2mCP/3c5ECTwyloh2UzWRksyD24JAEiiVLWJHxZdN7WGjmUquJ+4FE4z8B8zA6X59IcygNgRkSIFlTkyYeHXI3ZRXaB7DhB6yaGBbZkhtpPYHwVU/yUUrKilxTIUogaBPYyZz1MP5zFEOVa0cEQy4vU7JTKAX5GLDHfleTshye2qbfN9s3G3Acbv4jRPurjtkiNYIcCtmvMFyaKL+8LUUmoVW7SjavuPnQvcjic2qGmuf49X7NWanKepaLIfEJKDyISlCTTG+3cCqZfx4UvZUTtgZb1cDxp2hpKbNGqlyy2EuAaVhUsoqYZB7RPQy4AHVNPUBNPg87E2AJ7una7MSBqdx4CI6Y8AWNzWbjjd3A+U8oCiJSnF3K/6fEJXBvYqjKLLfeIAZBlPQ19NJNRI8isOCXY2r4gGxr2Fkx1s4x0TOb/xuzVxgAUppQksS0JOyEUcDJILUUrgaoRwoSNadMJnrBrSTwGk5RtYx8T47ywUwqfuLBZ30LPhsK8LwSHYrF6pqP0OV8mdBpFoOalgCYA6msvkzb1ambifPNehiZ1Xk4NIqa9GKPzWOEBUXoZSfwphpd3IyUVoZ4Bo71BKKHypZr576skkV9DlHitI4XlGHHjanP9ACRaTrY8rQHiSxm6kx+AbdJt4S0gh2u3Fs9H7MU7STuCtrvU1dw+z0TFmRlGTQK1wQGdAvZ5YCUPjv6kJdakW8BeL2Nrb4uH2BICY9sO3SlGxh0wTCXU4Ckd6Bd40l1H76+EeE+HbFmTuleLokvteIHWfU5mS6pjQ4LiXF7rl7oeH42hstypA9IRPJVZaSuQU9sC9xfy15GhAbMC2kqH0Bpym4Q6EwsFuf5kJC1NAMqigEE20rOUDmObhkkhS1j/YmX1f85gaPknfLDeWzRVjnKw96I+CeBVDCNjX+r3WvDVY5ZLSEUoL6zykkaiGDf/PgW1xicWUvRei3751rzzz71RGwlgLc2Ss+u+NYZa8UBSHAtMtKW5RvEfIRs1hij+I2/JHDoXEJ5wjZyF36MV0mhPqpTrGLnclKWtVCXZ+tbxcxLS6Uc8VJ5zK0SgM6c8gZ4pP2idGs5B5hkOt8xBQe3Cd2hOE0TNt3D/rrTyaV83x4bcJjNWfIua3u7VEUGy6WejRZpOQCX9blrTHeic+sIyWvzLJR/EN03s7/fix8cbR/joZLQtaNr90MXjRApO5xTPe/bl4Ll+YAmkagPpC7Yw8AS/sgLalXSE7gjYfdEZI1+VsX+CWwYIvpMYxjZZdMvKaKVsMWoE2Dw0KUXVc0wMKYerRZ3XT+YaGhn39PNY/AWgEQ+OE71jZozYmF9K8UKW5ZtJ30tDYSjZLoDskFJ+Ao6enefB0CdlzVmyPUDqkQPxCSakt0rvurHFWGoq8rr+/dgrQKnk+Pa4T4xs/uC1M5/QcSKwNUGLT7Srj05m6ld/pyPym8mCmEofo0mTRgT+bY2DlqYuyFH1Y2U/vaZoRsOc7P0NHEuIUtVEsbHADuoSYIrHd0WOMOxuqGjMong7sU+ddzdnFUY0D60TN52YLqkIoYxzaPnQQCqRF3P+k4zs8oNHgkp1Ghb0d05KsJKl4gltXWJOd1spLpScxQzwzvJ1jKiDGcbk21u3Y7+EBOTMWfDkyby4NF5scceGxPUo2TYOHvLd9DvBSLId6V2VFtlbYzppUGwyexDKAsyBEQYzb7v1rVCswk4x2XNuQFlWSuFGEkuC4bwiZyjHc+GeTR1ImK7mcWa2j+ribV8fQdhgEzd8r40JQ3etta4++DXUZK7Ysd4GQ3I+s3i/P1XFSEqHKoykEOf9HKRFDudeI6E/vOnJxtTPPTti0SOd84mK0drovF2yNQUbwOvtEqHJ9+GgiKtDJNJR9hPDrxK636i6PZxgW2tioMpteWBHiCaxRRDA6scDRf6NBi49W0Xal8hRut6jffRYK3AHXLv1zrZ7tS5SX9oY2r3uWIokZ6brOEVpCeGhGbOHZz2HBNzuaJxmN0RmbBUeMsw3pqrCsH4bEu4Ui/sJsA0cEap4IG8gw4qTAVHOaBT/EoSfBnBOeBDWWCbB7Fv7AgroewTC9Tz26DSTElvZJkvMMHKMf4HUYQm7gzqz5GzQTntlZidRVB2U9blG3ZS9IHGmdX5LRuiEGFywPs2vQc4Z7q2niXbYDHUsvDai1a5Z1tiedvF4fjuTSwWBTR1oDVrXmGaCEZajJOp96yAvjcdnNGsxaNiaKTSu5tXdRNxMMu20IIkv0XCGeKi8jFnuWIaTZH2aQM56pF3jjiI8gdmF4MjErlcqdHZ7YUFcvXTgUGxB8inID9/71ZgW9s9LXO4k6VdSRN4fLiusEOx3Nlu5OfSwAslr+cjwRY9b1ePDZmte9H/OCU5ihiIuzRr6wtzM4rsEf9ZkZMjN5+QERLq6ZTLmz5jwnVGnBCPEU+UN4YPCJSQ4ArxwT8N0WTmg9YKwkEkJDOkmNYlHHp9LwOvQGOhXxpBC3BNpCy+7Mh7UhD5fkN9D8wCzyERu50RFs5hormmz9wVB9JEUSiYPLCmLUZEQ0urMaEbbHX2ziGz3bc5t5XcExDG5ZBMNc2Jdfj8oHkjl7q5fXo73TGqOdMCSgT4U8VOW4j0869oBJQ4l6ewhlhP9SGsGgmNahsYiWUXjA9ITVgckAk94+ifF+jJ/LOoyfwqz3xSGy4e2n50SFUXr8PT2NJcSWQY8IoBlHIK89uSbhFvEukA8lM32JA8jMtro9qA4yZK7wwd+FhEFZL13JG923ZIviXaA3jk/kDph6HCxHgx03KD4C3j8Q/84GEc6yENvnn8gSJ5qwRilwKQsd5XLViqtonkjbp5fkEhDq0IPvRmmGncgQnRYouHciQKu3Av4p3DBM5Puw9ovnoV3sAv5nXI3KkR5Ic0DGrofeJhI6OVmS+kvrAOUJn3GCZ/UmWyx+NfaZ5GQYw+LqWWxlUH1FAgi+aDzWzBKd+u5jw8Co0WgNzExnGbXJKmMUBHVGjMcdvI1DVsgDDwzSjP5itgHIfr1Dmy50HvyPRnURXOZ+7bdBn6EE6EhFFTpEHVDxWW2C4uDiFSdbW6L4AoGMKjGSIPLgV+0solX7wFSxgngzE2oyuruS+oKhUR14IABGTCwGqzEB3pREKICknx1ICiE3GAFcOtb9ICTyWFR7X07D7rPJzzL8ZVgKbW7pPql+0H26I3Jowa9swEXRTmyQHkMcO4Klnp0i2zTa2U5EubhMBJTtmVvQBSoST52n5GQteHds2ie5/lJj1O8A9E4++aiU/0e3pIEtXPe8JobEaNN/wN5RhkwnjZBCT33hqztMJ0h5kU4gZLQi38QCdNtstIPRbXkvCfInzggcwGEfcV3J+EcHtFItgq8MYkbrrA6G6yJA9xenC+t+7U2M41w8XxJs/5RAnT4WIVCGJ+c4jlwI4CEurvHRT687pxB4qU1psAeXaY/Myapn8DccU1u3et85mzRM/tSpIbwu6qWpKU0HrSrqV96HZFEaSsWtCIFfwLvDcvnmMyiAO7kbp2fjjPPFpUpUfqqLZw/Hcb6UIPJMpwiJRa1MLL1NMvaXFitDboPbaDXhSdq1CTqmH02pJdE1Vtn533nNNi0TvnL58BXRN/AG/K4FAPvWEgyvxfEWt8MzNLjVu/w09vo7fs+PnhYAf2YrzpcH4+/qg4TvorLXuDT0Tr3mmbHO9DpAYLWK7iLJZBIthp+0uxdqnz83bqR8HlMJo7NHX6Oc9lBmR2gZQJ3CIydnxIffh0O3jnm5/5MFVi9sve5a920IjLeuZPSt6tmmFhF7P0g5NRiLUoJZSOtjqLETNRPZjSDG6JXNLXusqoxZnReV4NSu+u+tmA+z5XIsvzFN5LErtJhLGS1sUpuVAzbOokGTumjVA1FHFRz442Ofgo9obfeSu2RHAOJu0vswtyhK7gnPH4KB+W0as2hu1aVjUHm0XTtc1cFEneKvd9pJO3O98mBAOe+hoBJwNU+tnHEFDIopijPwbBK+QtIgedBqSga+DSoJlJRLFwmN9y4cb1vfB2/wrTuPUrlj61hBW7slY89LVq3pjuvtezyNLY2oUCy6JBOj+yMYsJPqlDn4dbWix+dKqhjH/TX703Uo3sicjTd41E50yKLVIQIvXzt8TMNHce5jDtjBPm3aznOIirmNyeyvhaHH+4oyGdM4Uizb21VCVIR15jmQmw/ZOHLZ3UHLZhZjYkFRcJyAA99B/lzD+TRF/R7NOTZ41vrk/1Cx3+Ck7mLK0SNsAfzUlNyBl6+4u61UmjmTPSymKXIYXUiHHrBdGB+hPwUFauOjsn2Gon828SO4u6wq5PrfaslpC+wCzp0u8D77A+l+fX0+3CyXX3ePguz6gmrOIZNltaj6lsGfypfdnyfJ8nJ5ObmbHmZO6gR8cvrc9k/nOFxxVOi3PSB5UesUMyX8bxr28b6PNvk+u4/IVUXCD9qD//zv829H8JVq1MW13XTOxd8P1V8S155L3upRz7MWoP3xZivH3S6U6vYREuQZOzFomKHqSE3iI499ovvJ3GRb7fbEZdwIW8mJrfcGCOnhTsjydd4ybBbQMS73aysff6Sd75CgNSfuTyMnC1XqJ0mWM7pylXYTjidOx7crjtrnfJqgnjG20Wf1JHKStlsMrG25waRSNQzaz7wwvyMNnBaHvFOcoLpYqcrDviuxfeVnqBxxVgRL2qGK4YCfkZzmrFk5oU9E65RVISodK2Yev20+GlARhKFCmswz1zBrUtIBSevs8VA7+QnWXHFgICBE+PLXJDO9E2XB9S2EuEKnUmTlYf2S2EzXyuSoy92BCy5AqlQHVWgu0eoKtCp8HHsR6rerdUYnGBJzXNbw2IwQRbDwg716FytsdtdEn8V1Fgz9oozjy3lkmdGEmgB1uJHQ6+iBfBB3ihQL89xR/RQQO2oQ+0gX/RiNn39ciyb6t8tmGexNnnRizTE2LtgcfCRtIGA+qE3Z1MUBRrxtrOr2OcVeOnM3zwX3nrp3MiI0VEXE87eyT6STj1NQsx5G2/wiCOApGM9UUHE8u4z9gfUWKlsvjVULgR9sxXhJSlsEGDytjsbzptKycbEkM6v7xA9kcCHHb+6N4V6NTqtIqW0aTvndlVyDDha2wzlyEx0kMQtiasC0W93SCskVZ8Ze79MzPfTm54cix8SRbOz/4xDUwZCuPbVkUsn7m16iUtMFCawZG6QeGbzuzfNnbh46WLUu/KLv2Dzdwhg5imxOkjSnnuPmTkmq1Baf7HpRPuwIIUAA4xDenL/7qozK3Dhrk83LbcHLgr0SiJ36Bxs3PURnEg6O2xQ0lMkSTjsE8tWI+65CYzk0HYGxbM0VkHJP6zQ5SkCNaNf1SmewPvY+oTOfhYAF//1O9vLErYElJkWL2RqforZS5m9yqRtTzfw6BpP6XgB20939q3BYOoXABwz6XEx3c7yDPA2jvtZB1zWIHF2zQ/StVisVMS1QFFIJXAX9AVtvFmBEW5YhfZ2Zq0TEvWHZwZsbLNSGMc5sFRR+w0rpzFXGdavxlKs+758oYJ4o5Kjh8xDyzN4nT1ylhuW/DyOEQv40TOfK9VD5orhoTgpcnBHMbta/mhCb6RxhJaS9HCxSFXaYVMdLCW4R0ICK9+Z3+HWq2Y5zy44cKmdbGsIPc+RVyFIT/IHgVOoOQ+tDurWHqQsdAtuKugOC1tQV5tQuBHDWMgpj5rSo9QAEDxFbdpnaKdq22CIDhfOc3jtmUdVoJVhORH6o5WsPrIFqh2NAVgJONERksC5xxKYB6dxaEPMbO3Q3H8NxZhIT3tIIAvXg7FWpkzQgO1jGCn7Dcs+pRMhbWuh3pJIjpafM/Gxuz+WNuZB+rXAajq3gKNs5YeyuxczkJIQFwlCO9xr8oRmeswkY7ZQ+t0VZRPAu8T7XoRS7dUlWj5xj4+I6QniI0nkQWpzwyEox5lKAkU8c7zaTtG5W0dHgxDRIi6zLB96kjnoLFjQk5RhK7Pk95uyPv5Yns2KfAEMLjwU4/4GE5ngnamFSFbWt9tZwJKhX3kIjqWUEXPVS3mz7ZurWNo/fIXkpkvbMCE9J6YbASJ+h5N3r3reA76POJCu6MmR0uMPicF7f200SxAqaeCja+5A+UrHLt8EiRHLrWHnx6HV9ejaSkYc9apjmvLY6qkmwV618bl/PCf2MWCOj/yjNA8qwJ6PAUvmswNvKD8ho5wvxFCcYKeGBGdKnGl7w3ZDa7YtehC5dnihze3512In5UQnFnmUqaXtBfn0N8h2GMjIe9fq2xreUaN6AUmhBawoBZCcgvlef1FHnbzH9VZ1qMPTqrUl04vAk/sAHCzf+bs/FR7eqjus6KOkfUCvxEz7PQgpgwcObfz+gQk1r3YXgvb3KgUFw3Z8MSgvL5O6Yxu2O16W5A3k4LuuCdBrNObT5vBNJiMhf0bdYr88a+igcA4y5BmsnN0eNVYg34wAr9mzfNxKMVZfYcidZN5N0P+4Uj9pNsZy7kmfYEBR4JgBH5dzncrAEVA21zW3js/wmj0yg6+YcRr0yYlWCIW2rCxmt61P/gIew8rpTZ4IvcnBGGH6G1ImfLhAjYS7bH4pOBu0bvoNbh1LbS2k+4xCtAu2XiOpR3zhYimi6po3PrC3g+r/6cD+lhpC/WAKMXPwTbnKQEU2j8ZgsCEkdlGYc9GVrhdUF3xV3dPQ/Aqh2LaoYqNmiO0HI+HhFHgb0zt47gUdZNOkW9AkfWN8Hns5Dz1f/rWwg1waLz+SEeCVIfuAcr4vc8Q8HlmApYpuhWyBvtA5+NT1xd94UhNMfqjWvSuPXRJZVJrNRh0xTJ6ex5j+FXm/gG+rwvyVvhqOExJMWEulymU1VHVNV/8K/4NUF3WNxOnVuJRUwdRVL3iW5GK+teik9DauBNlSsit1UO4kU+bajSADAodsAnIrV30lkf/qvJ0OCd1fkRqKxmszIwLhBLTjEZuAlbIjOxSxiuYWNcq4ccYd1IBFjvl91/iLDyTs5jLvPij12T0bgZ9jkLZRBIJAnZeALkNktRDlqL9DtSNDTVvrcbGH1QAmNNvQp4IG9/F0PggSjV+/RgTH1FQjOOHkt6OBCh747h4oekFXu4vL4aYuzKK4t3KucFmQ7cN5w3kwkhRH/kIg6TndHDAhec8B20cDy86on9dv6PT94vDkGPtpCP1dOYwV0om5o1ABK14VQ/TVq9GQ0skxWVpjItG0uF2LN4xQlJqoQVJ7R/27sXngx8iGhie3MWIkONdYEuP+QOPYaILRp8zU6AUckedgYM4lyDXgRS+10dJn3AgyPqgv1/e8YGR6cDpPn5egXEvZ/opy3aXUK0jZaBZZAGPu4s1/jA+ket6Ga/gAkNSU6BJ6icBadqp81fUmzRjZ7xeyxG/oBu1UjAfamps8cYZd/5NGn3zLsD6q3D6EpndEH36rHwlBkp7NdAMZa6xIBAtY6rElrTeVMc007tNrWw8yqMLJuHbDYv4ztB+iBO6ljtHtrldwik+8X3yb+TGIYkSG+uqjK2VPjr8MDpT1+ndVhtuL+7087Ah0O21W2RNrgxXj7RmbR5wGkqI1WJ9u1q0ivObAUHARasU2dLobXO2gkBQLkgHI4NDnTya6ZocCttNou2P4Q/oBy1gRKEtZfRTZt1B1bXjUXWHsYnHrlyjZfP7ZBYYyvD9JcucfTa7Uk9CNXcGrhk3kM2Isbm8XXUkqgW/YY+WsNXAhXPYdtILA/06bkfnhQQ138W8VaSq7tnxtyMkrIBZai6BkU5lpS9OVvKYz8bYHsU2dpCExgQj7/dciaXvZKgw1v70OejEvhmK81Lqe1afzk53jje+ID+T7w8rsD/8Wm3O1xn+yV9wS/I9ETyiXzlU2edDSBOoaDRW/qTuAywX9sV/vrVKSNB/X1dPVpCnPlp2PYu+1X9UevV8UMXFwQpf0R/p4tjyiULKJsEBHXbZ0KtBZ0ZeMxjX3N3aIZLWFlw3hQ9A7VeNp2QGxwzPv7b0Cmp2jXKj/XCIkaIb5EscoBj85SCTts+yQ07ANQyruxIkKVzoASIKkqhEbWEzF0MqJfdIchSMvGVvAQbYffgE1p92V1tFZZSo17hd18ihZXvFgCG6dLNaxiNOr27FpyoexI66xTlEp4+4b8Kswv4+M9qN0aCFKkoS0a3FJwOT+XsPM4smOgwDHi8hYa1km2fD47lBYmaSFhnW6BuG3IfWVk7ntS/z6krGw+gyf7DYKap3iR2wfGZFaS1fQ1FytEQkqFdj/ZZqtT/Q1qrDObjMG3KLtUXgfemzJQ6rdGW4I9YtTgD+4NeqWmRyfc9U5kcLzEJ0HFMS8jJ4czGHB9PXQIXed7svLFiw8FWA3SW5rkU/5hitKZiDA9J6QQ281DYPsPuh+z1Eq4nVemkns8gwFhOoMA8s91zyozQV41hbRIctxl0pGNBObnRMkGDn5Nxx+aenqscRTEZOhGgkapnq7bbRGAQFm9yUSZGQPOusVCMgGnHGOMEfbOzNGj1Xt952jg4H0LLf5adN6XQgH7Vl5pwefPc4oaF2Fg4Db4nRFhTRGJTflSAdg9xLCR4cPokw1AzyUv82Amd6jBslNB0+sjkD35aGPNft7zEQeK+f3BRtb3Apc4PEPlzAG/hVgekx17KuVh/DIjc9V2rdQvQbicKFVWJzJgFomzlEOAISp1I4zLmqJv/p5hi4YUGt9MCxxaYv/58Oya1tDY7Tk8Uog+rslOEbb3+cd45LIbdaKOVDlkADNJYouqFDI9x5WF6V+MkIsQ1XQAitu6aKkKQqXuGuXhVSBV/fgBglaju0t2gdkFMHigOCEYY+QchPH6/rXF4z4tYwA65rMKN5A0Frca1hkQdYhCxO7eq+lTnrdCoTvMt3g3X+DmTa9HFwynhcSni8Ha3J+WpUTEZgo1abg9j4fyqNN+up2S4KsCz/A4rLvQIYyXTzQUBfeITYAKdIbyml0MWXsJQr2yRIaVGMOVgWwLslB2umIQ4k3fZQWA2XO/EKanq71osVLFrLplJA84kzBLbIiP+/RGDDe3Cx+FhU501jXkHXa+rhf9WUysefwN4THxBZi9i1KcoDKNGu4IGoW19ez78pBdJKk9/HnPEOub5FZ+O9jkXobICR9UWFrc4TklkZxpbB3w/Odfvw3MdIdvDVGmWj81TwAzGDlYeNZZ5F4zizN4aWyYOZ6Cg3QTXo9Xe1tPaV0k+wegaB9a9Dxq9E6eR7sui8q+sSWcYCIGp+LGX4hPS6tFx/bJFHL2P6pN7U567KNhNe8EC4WNyWkYhRH3ry+oAtWxU92yXNnLOqxvh9Bay72oi9wWeOjpqIav4Rrn9GTPpbGPc65DMuyvRdVa5eEFg0Za6ajJiN92eupbBDZ9aocHwSq7MRN3VnDAlEGYzHdfArtmkvvK/Kd2tcEPfn4SlVETbPsS67h+vMIFQHw4k+vQt2OOUvknUTFpOJMl4RQWCm60gTmiX2D8WvZDMuqjI0J+7HUTpZgHIU6sQYOHjjOiqM9my+6ypfzUXQfbURvppxQoSLNSzUJbfkRPSGO8oMs9W0wncqeczO6rgCljTGZfySkg8KqQKOUeUtbUesQvgTlmHA4tfFfsuWITHh6iv2QGu8+Wka4XPugUJE4NUaT++qysYR3nc3onqv+DzK4Cn3WQkl87VR50StFtFoudGK0pLJ3/AWo6uDZ1smS2cs8urUn8UPjmmMM3HqM4DcYxhb0o2x8L5aMijwUdIFPD3PI5lqh/gJM3cn5BvzvctCH9s1cWhObKM9jiUUDUE3qe9Qutuez3kON6byrLWRXnHd2NQCOWkyUXsnMKlZPr5ACRzvnP8eJ4a5yOTEgMb28liNyoXGSvHNIhT8s6UFLh80kevrkN+ybE7Z+8shrPjm5Wg7X3/HU9j+thd5kr89UTwQBG1qqO+O9U7SYc89h1vObTqi/uM7qiCkZTsVzsmReivfrmkfNVPKZsRrg/Ja+LIjIKz3rWjhJX5ODrq7DuRBN/K/TrJfTueRAHg7cUhC9qBsXeOG/5PoAlZhevOYMm8i/KO5t5RYT4jIzyO4FUZjgoPU6mhJls5efN2F9jDY8eE+NdzwYx2JjzUoBmGUBHZ0x7chhE15du3H/HpPNfDlTrgHhWZIWPCJhB/fZa3nYpaPRDmDJOiTY02pj7/qZRcJ0vZGbgo996ZkdMHcfsVfYwHE6hkn4XF2Z83AOp2jmr+CthxYG3ZLxh/WFOCdjxTQSbSk9N38mJ1VMw59Y7YzucXs6Biq4VI9rcED8dvwtkQWAfJAgwL1E0txstIlzLwwF4UUwuwW14EYGgkDbciEfNvzcq854FgJwr7MAasTTc1/I7YYyWh3A5EezoDutVbP8sz0GB+y+/OrJAQedv+BbP123QPqND7hgvn5PxjvKBXBD6czcchd08LoWq5gx8tgyZTN8iQOTOuD0SLkMObDWzsFPOSf3yHAq/GadXm5VKHJSJKY32HrVrQ7D4+yMsHvNqt//mPgcNnOvhBPbvl2NbKTrg8JPEGGfQSNWyIz6Jcw5Z2UZUrbe7ATWc+nhzjZhjrrrDZBkh2fpSBfNF1kEVTxahsMoaJrESTeUi8mylHBC4k8pOhwk6iUz2OsM4mQ3XcmI+ZFvjunXscGhkRvtoC6GNBNnev24033y/AACMogQtSEXL3Y3EyrQrF3Dw7pPuhQjUQrzG2soCQIo/9KlT3lpKNzj9loOqe6UpwLvinBdGhPGiAl0YLk/X9PdHqzOOfHRnlF3/Il1aaLqCF6gysS+PzLgnBFf1Tr+Yv7cEyLaM2EXV4+cKYqro0g+A2M9cWj+Qa5yQEfbs8yGhxkwqrxWI8YLQNeyZl/iqpNaeNMLsMv8/V1Q/APZk7Mmh12IdfkLWIK6nLmwUdDSlqR1VltPLgrD0hLZjWmzNN95oLddGsoijXAiX9ARWtwRGEbYTIjh9COviGDEYz+FNJbR9MSxqO5EWEI5gAlTEywcKO25UTYPRXZR/vv9HrOHZHqG+YxUWrQYD6xneTD3upjGjDD0JWJ7Erp7IAIezQ10/e2IdtZqtAlO1NRiX/OZL0vrW9lKCwf1cDUUDyTYyeqR+XKfucgaoyp1kW1TjZFpjmnP5J0npbHgMFNdln39d9zMq9WOMZ1mrcmVtoAgGTkFkxe2VeTgZm4z1MwcxG7qt1+uppOQ7HkjSgqKtA0kukzG8Wqg5DrIMLsHB4F/CO1/dIHeJwe2x/E25V4X2eJ040XYwO4JFhWn6kX2IlQjtqrLkubsoLK01Tt75nfHDLaUKdO2DgdbKNs0bPqkpwMC02fMuKws1oUZyFvhFNQCLKRtG2888WJcrHYtKQ2lV5jUjogoUH5kNEjWOBFU9EM0balyhx2eixGddL/33SIz8Jkx5gQmO6i6kXTI4XjXEKzokGhBbKZsjRIsNUQeisvpCKQxC5uLRwBcE6AsBkbpDmpUleMIEM8t2GUr9r3TeaFhnnO17lbxzdexFhZ7rEFf8CV//OZX1/PDyBIFT7RSqcIcOXljIHx2rBM2O6znKNVd5uu5L3D29DVsNL65nwMojhNR712gRp15omm8Zp7rIGz/3TDG9ZCl32yavnIMSTwLjjrCHr8xvJsnzAZkkM6gnQFSKeJa4HQDetN9OBrey66hJ/LV3WxFsB1Ard+fSBrQIWRUk/aKGAs9iOXANgwUUG3kAQS29CNjotUL8FCrhJl7+yFdGWrSF+GC7Sn3qzqiAd9BombZvLS5jzhGd9f24MGmGN/LYPMi9dwtQHRQFBCLwxYXINb/IUBE8sJ5JI6bRu1py0MJdVicFzUqABwocwMxC9Yk9qccw0uYEhIImC+I0+bkKhY+fTB5DRIXX6IzJnkOKm0wRvX0lgAZgfALLE6EiUA3LBCBiROhu9wv+oCSOW2/ploYUHspKVyJFjF1sm+Hi/1zu3zQgzvOFlxvt/YOx0GZStbXrvO0IRyaHMvMiqD7qO0xI+7At8Gwm9+dc3ChI4W7RjB3Km0KsFojObgdRkuSN4ilNCkwtu4+cbhbtJsLBenlOhsTA3gOx131ydTLGgfLcczqRCzqqnwi16cYJqCLlqku+ZnmWDBMmn+BBSwLLaVx8etMgZ1jLGzUxn/IalO5qPXF+jPBQtl+K4GzrwbB3TIY9vqJFB96aKW/I/sUrC79XI/jJ9avfyncSQH7BNjmWlt9ab8gr7DuPCjiVrZImhJ6ORcrnX1xQLKRlueY/UVtQfb4l8cdCtK8HQ7ATf98Hhh9sriGcVLQnfNZKcMgnkOSQkFLan/bQmFmk3TtnBSuuFEXESDb4DITx+HKDPPiUZH0Cn+Oa5Ko0GDZyoME2SWputzkA78xQMfNyquBtnn7mrAbh4fQd6zIdlQe02JqU6YLaxGTkQw2WO61vhuZ32Hoz5HW9LZhLzibDOpUj06rVhdnj+ifNr72pnqrXt7BHXQxoTgcGiRGeoyfU9mrbrdNzfwlX7LY4MT9ABJZhvHLCsRGipr87OlrWXViZc7Y/CaCX04cRkZzudiYJytlJWT8rBqnXY5hCyqkIp/VvpWXb/KxuydlH1azKe68tOfHPQ590Iersko4RnuHoNJiXzhqkoefo9+yeMcWPGTwSa1qe/Knt9soFO5YZUTROgXdcqDis7FO2JlkfnO6UYQtEynXmLQ1988uItYM0mia9DAV/WBDpLrNY8Qlr20/QQGNQgaF5gMSzkEPanOJj/hb1IZMSQ0qdrFbB+aSQeebl6yHI72/OYWvP32+wxe81Aqz/ddmMzftzCo/kSCVl0W1MBB6/SfyaYans3oQiRQ/43MOohA8m5oezC//NxXZLTFa9rhbq1A7C1Ef8oKDhbz/jfiFiKjn8TLl8DUNksfooaVLAyX9cUwgqwlnXyTvYWl7DKZIyS5LVWmyfTIvU5kzxi3jOfdLJmCZgSBQR28k+FeUFYNaHKbgrTeBjlCnSGeKEIKP/eRluoolLI0YqSTlaYfA4o8ly/lqv26ScyM/Hgmrn9q/rx/qKeAgx83UGnXkHIWZ2ewMt8wzTccONXHFVy/YFOCIuwiBgp02M/G2KYGr7wdOs12Lzq6SE3g5EjogdV9yVr6RunU0Tn4h5Sg2r2uskK7ZJ+WjpfsXx7OJuSx892tP/1jtNg5YtroaFyqWBH6/CGS//bmUPOrb4afJukutSQf0xr30Vng6H4CajhVL36YUD33dmZuPhLUFBIlNeX/8KPxJbjps/o1mgMi17a9C6GaZKkWZ2gzrgCKrC0VVT0fgROorkvqSEBsMf9PzAwDbSvv36bSWpI/zs3ca/sIVMKczUZahKyZN0GbLkhwz2cNJ1JlXdj1E/IQ4159ERJlQW678G7zFT/QtVaguX4wipu+U3aKU0DTPF00n8Ft2Ymr7+9mljvf1GPF4jnIXeD3DY/GjpRRsEXeubH6sKEIulJTsi5IRFsjs3aKbFwEdhF58y2+Oq6sh7RGIipS0VVjUyFudx2Wr3+tuWaoqRPxZOIN5N4FLeQT7pbhsnn0FOBRiI8D40nmvrngyPaYEruUKclPYcrDbRYKdcWF6P6JfEc8qzntjR6w+blK88yEhgZ9MPPd2XZE/vIMDpLLv10sZxo9D9VyRC3CLBgo094GeCiwVQK+wfNOlAilMOGnZGTCXfqS6igGtfjZcdh2osdUBnhGTmI2u6/WHLh8LTvBNPBPhx2kPulP+/hZk4O++c2y7PfJMmlBgynfQkRiHvH7gkLFwFhNpFNtqA54n6W0A/G2YUZRz5PQVHMC9SmJtj5QXSjmQ+AWJgAD0zkGu8VnRJBY2V8N4+c0HIO7Z/mLPHuzfrbyZm9khmqwjyVnMozm5Ec5pTG6juXucfsO9//O2G5dfUAAYJr+4XJ9uHG6b1908+9r5aFvJLGo+B8FpuUVa4eVR6f+czF9qadGCXrlfYSH6x5sT2tY0c27t2LDTqHYycRgOqaV4ISqcvGmeHL3SXTpcRo+9Cccz5BdGRIkRdjSX4NGR6ZJpT50cj8y079cF1NU+62Y7LrqoU9sFerZj37o1fWq3zyjhhej9S3tPTLm1Csl2z0MbNniqX3LwXqWgW9qCU/FqEyWv070v8RIIvzA+VolQYZjsHAlBROeUqj7sZXBRN04NPzXXc0nRhSRZfn+ajylBWcyEheYjMJLECrZX5Dn4N0Ui9+mb37qO4L4uaL/vq5u6mM2A43CxKpW8n8I0VbHF0fcvO29Gc8UBeetjb9QEUh+FALRa5AHveyl5AQo2niWe1xRii4wMnJ68qkQo6loSELn1AsTtvAEUeML76K+L5if8+aVEH2aN+6KRKBSUoAy1m7U+hX86u34Z1dGBvKvCdSz66KdQxE1PrivDBipdaLkQ2X6X+1qc/BTPaXDQa1kdAL2hSn/pHenrdSpiINuhRCGChL8Rdair388r+zaTtrQOTjcp0z6qrzjP0FIAMnCtd7m5GQ2r+2fIspoY7XXZsBhmq6JluskQl//emzkIThG98GTnqh63mS9oeAKi3LRhTRvWYvb2RNEUX2aPv59pIft9uxwFwSU/UhmY43x9whHSpC+uCVoCmWTIuZA9iDIHlKIDWDKz2QMFQpvzEQUDu9ROz0LhHax5iLyhYYdazFgJzy1Z8m8v590WsyGDJqLP9iAjbdvTik3SzLjdQ9qw0Ky9VDXHxsQ46+H3pH+CbiAxbwShFYsURkudPKalpUYga45yZUjnunL7tClz2gpsTU452Ou5lDXiHCtSpJt9D9u3zXco+dO4SX0zSYpzj7kdvkzyVPS7k5eccI9je0IutqrqFCBmonmHf4VyIAHSJmtsbyYEWKCJkEATEndgD82W0z4TIhbhYdcBtuaIrauP470GqTadzHHTPNe4O025CaGujsMBFNZcRV/x/q4WutniKy2GNgYwHRbD9ADgc5R608vuF6V2BBpSobXRegUQoWGxbP61uSXBgsgOWvh6lReJAl9mpvJtkE2e19YPklTC1GrYqhmasGSd3qiPdLyGXbHXUcOsB8JLkxlKoIxuUlk/dT9tK6lrpLCZPBZhu6i0l+Xxe1pR3+ytwcRKHtMsuhc9bz/3IKh/YuoBMVxj7SVA6gKInMWVM8QLLgXSop7w1liIjaH0ypCa0x5gtgTEOHvUoX7QRKNZM7dtXe1nfeUubRTYZwTQcZ0s3OqdtmfWyGW628QI2vdvBIhz2/TTc1v5aEPh9IoWaElymdVMaXf2ZXPUZHzQMorjJrH6SYnkwaLMg5W8TCppzdVHhT+2fk03zy+SyyGOHhOLAbfh3xg3feWtUVUx94SROst/Y40pD9YA5wVvc/+oACg5zGm5mkTzkKDqpL2EG+FHucR8oQ3DDecSlFxaUl9kRNVk/kq3Z8mcr52iq/36lVnhEHzevLw7/whbkJ6UykuU89HfbkUDJu8rpNg2fWxZEL99XtAzbwgAdyEKGmTsXmf7Ym0A2Be025WLlmf09w5zmSlstKariKjifYzktq4uNeeMRrDL+9IqW0DRtZhWF3Y50egExVkgfMVyM6tMHsHUxpyDtonBtvSVx4j+0NUN8BYJS8eKo9qyk1ke6KU7J6wClRYUMtEjEFDRbvv6+XWmHmRl3/Z7u1UidOeg+d/wBdgXAKdJMi55yPa3V2P302YW/O76hyJ52AZIpmaO2IDEqLoL8soResD63AbIwLv89cR7SIjWj6R82twj0cA4OH0GTed0jfiT1GyklJEQsxxBNuRu43/o/CLFZgSZVcxlyLyjXeEDDoNKd6KlBROpWFrYhZG5+tRt9QG7x8i6u8Z911IOT9z2M8uaHn4lrJbcX+LH+3aeISMx2q9uR8JcckPpzxgNCpRoPJPlvoMytTQnA+3/f7IiCOHKY/mdoUqhPnNIM3qQSfmjBq4ByFapNKI2NRAIAf6E7N23Qn5CK7JToHI+YWno8Ncg0uoqPenRr2h7MsDV2c6g2/dUBJeJDpBqDx4SjeQ26HvnYAYjVrIGOvnwg7IzeR/sug6tyiYFax8mL0by8JOporhum+MvkCVQGvBaI2bafi6TvfuCNWv0aYcJiuNl0u3tF4HLzWkOVzygJZR3T86bet7K4QkOoTitwrsqqfwGV/KVD3cnuKzUBq4yt/n5fPo584ksqoMNz+ckz1lFHlKh9YLJSARJv27ItAgsqqg7gVV02P2Rx26b1saWexiIW5Y+FEQNBEjpKZiixFLlX1BXMEjYG9tcVu+Y/LxdTL9Ne6mFjLX/Xyjf7Q7s5JwGhEziyRbYJlFT5E5pkRpD/yJdkze9pYmUnOQvcvsA0BK8A8HteE8PI8m60mJ6KxCeB9pBAQKnwwbgIHYcTtOwHDtoIbe3Da4F5B7SoSp2BMNomCDPfwLzjKKolnuwGor0uVcrPnENzgcaE1m+sZE2/icpFkG9ZsRe36ZSqLy/C7S7NFop/bd/+Wckz4OlcIxiNo3sQrrqm1kp522K/wquCamaZZPfz4McXUbIJWVptGanKifHjvF5gRcdHxEyCuwTxXV3LBwjWJ3kfA4RIKIC65HgLVtGRWqxWdXtptzn4QIgejLHybUVhnUAS1DAUdqPASgOZ+xw4kE0bCoRpylmt/a3ZAiJEAc2968b4IKP5F1YE7Qzqf7KkNp+/wAIY3VL/mxkw0JZ1gUkxweIm8/Qk30AXdpPnRepuDSZ797bPsg+GT5IpeP+5qoPEIjIJ++ejXZP0a48iBk4XD89l31Vgd5NNFZMmyfOcrSatj/VLWWBNPpMUnDRqH3ezkd2cF9qfjDHyMfFNBClaxx6cYOtQ1RD3tr3c1dL3HmB+TNv9z2x4/wj/jnszQ8BlYdF0JElR+gQfR66Wfn8iUEZm7BJaX9dzihm+KVU4qnRWrtlKn2VugfP6PUEgp04lxVIuuBHB7blY8BMG8JiVl2wfyZo/MNuWUJ+h1Ber/URmWJxFpk7gKJnlNsLI3M5Etan5ka0hkEpr9bcbGelJqTWjdXLyuWd72zuzORM+nUbuyGCH66FkS77sqg+E2yV0Ad5X5CabxLzGTaO2SFj8TC0F8W7zSn1RRmJtuiXUPoCE28kmYRrj+4HDuvFSc04ZMpalfAYCINCFXrZlvxs/rtIQFGbTQjdh3F17rcj8hqHg1KXzlLFUr8d/QxDtPBq4FzAgADLo/rkxA96eIyuBC4nxuG40sOQOW5GT03/opSI/3iNLGfvCUrGDm1ZMhB720k/tN1/VBlj8zfi6HxFZTvnosVorLH0GJyOK1BSeNJobc7Iqn1p3NOj3e3hQBoidsN0qpL8p8hhtKh0CO0axMLUtzmkm6CFb+R6A5HprzDACxrrFaCZhsOjUESazz5l6GPBlUDnkbmdXvLnvAfv+RtB5isjrvsHO4MxkpzL+NFrfI0wB8efq1G0Yf99onnc4V84DM1omAuf2s5hwTR1hd/Ui2T7E1Raz57O4vI4Ui02kOcc/MKLOQzJj2AJaXzvt5NuEMHpWU2zekXLv7RY0lBU10u8+bEE0XcER0k6ZfB1g34WFS/+rCnyGyCk+bofBgeagCftHhD3A+dNCJisSOS0vO0JkeQHeIJHFFrPSH7l0I0tAOQSJdwblHgwR27/UygMYaPHAWVcNBxQAEVl/MNxJqJnRH6NDd7jPbyFxMU3bEwdpgLSLs3S0SGlgrSTIq9jfetMPESFrZBW5+0kPjOuQ/3gRtlZxaNjhQiFBj/Lqv7xPgujC1fiKF8hJkuAe0Yo4dAri2RyEkYvZl2BiOTwLCWUR+cFkmSGwLKq9Kvg9tJ3XK+ceY49X7rce7MHpvl8+B5aVEErJ2THNBHSaZP2U53YXFjCxIIgFU9Mt4l1BRBMrLe1CbD0FQe+B66xXjhHEdo9TOIf5cvJI2exyJl+YbDtZFWWXkc9PE9eUIepi9Yz/cBynLVFUypio6kU1GBqyV7hZwunNSghJ7krlccKe+ezkydLXrFWh9CuwMMdWU6JwpusdAB8rjP1hToRjEADSG6oRBOMWCEBBl818B1Lt0AoDhHZ4kdkgTcoDa8HhPJwZjPHAxyOyMnGemOgXNrN56hlEdssrzN/fT/PFD+holOAIs7MvtYobzGTAx42i68GfwFKzRjSpWTfSdHhe1yUgaAWtS4B0ValGiGfh2Rz3r2bb7ZE+XAJcNovgCR67f50uYctTc0OUo1AOo49lDwqnYIUzHDrlYXWdS0FAVDZVGy4ByOEX7zw3uWHmbgOgUxiGBfEziVVZucloSDQjHnVnEmmxaJyTlVDBcpTA7KVBzJAQU2Oqf4nePTbklAHIjqmBbb/KHmREpRC4LTTg+yif5BgLAz01syBd5IYhHPtTX20KxRVP7AMQeskqNi5KtsR1voGAf6+8UYK+Kg+8Jb2PTPZPttnsIuso61WpxvEq1qcNStow9eqcY8AieCtY+fwyYRI3RiCSvwOK6YUyYbQUJW8AeIduD1ljjyaje6OaL8iDTj620VjyOth7THYpmrlq9Zi/RU/fuKq+OoEGOrnubEZPHhiI3K/uaerrbeTk50yrXbdMYgxdRM/k0rOW3zbHnPD8YF/sWbnr1zV5JRBfT7qWUgvLLRHrH/OqqlA7lRkDyLmHXTGA7FM8pp9JEyzqroDsRjmPOMKvqXU30a5ofC8gIeyq8fqrG+IiytvD82QrFSL488i/vKu3e+MOwDdvO0WvzLGZOKYgEo/Etz8FQQHLVdz/mT+6ICrgIBlbpRI1hLyKoPmsCjfGO46V5y/Uxfy0kTaM5OSysLws0FiAjU5xRQ+giYfXa+YQXauERt3yY9uYQzGvFQ+X32wnuS27Fe/Xkub7Zz3aImviIlUNrs2romHfyHdX5bc+uR4UehNJ9MkfFIYrHD0psz8gp3iyUrn66dWSEwlXzHbHra855me/7hdFxMTIU6oFeiVuD8q/MeH8abR0wwaJIcrwvgI1lFTkDjAQIXUxKTdDd4vIBxqLS+/ohImxM5QO1hIxkZBj+yDcx1MeMisR91UhswIPV18nb1ii5tqkT+gzVFmlBXz/RzKtEWGYffJHBkrNJzYXmVVnrEdt22CrN0EcBCM/CMkfxcdzo7xTdL1al7ZiO41MHCgazPnUp0U7+LmL3xVjGGgQzK2XmWfb6JQPfIOlMcB7z5MHk7jDXbgKVrmKhhnxfDmXMoUP6+cZ9TKHEupDcnihOyIjje8U6a58QhupO+307wUi7SbRZUKIUVhF0wWLo6+wD9nSKyfXt4pW1f9oWsNuRJBJK5pfMmxB2bXajA0y1U4ZTpxoirKryJRJZdj3cvNDktgt3K8fl4UavXUyR+6dlTBH6yz0lEAFzoFtb23H76Si4RYW6dV3016dsh5xNqAw25HsRzIsbrVSrk69KBBWbfY7mxCiC6qrSibjcUUzhcJyvdreXDSr4SCoOE7OFnV5fbidDAiWtT8f8SuxAsy1dO1bTZEURvX0idGWk0v7zjKwtaMlAwCWOp0Sqt+iKXRC9g37ITOmO2Z0FwbnmIlYbBJvBURp1wyuPFLIS0LoXternPZbVmvhY4QMZnKsy1Cz0kVvlGFYWZrClIVCWItE+YtsbzpRaOMcrFP4E98wQqZVyK8phXQMXkwa/gPYVWtcoKJQ6DwbLLOtRrb1B565w0WkaB+ka6k17GJU632MUIFdmBBadiS9Ex2TrUjQ/VtWf19Ja6XGfjCtDeSbYZ7Hn6NadZSYl04+Ui20H2aUZWiyHHYHq6V49FFpedNqcnTrq1oN2PDoj3gosLhEZMVzth+2WJbIhlWO0Cc62gncngEVn5XauKvKQIbfRG9PH3owXnXeerCok7MiV2V6HSWFYz/2TufwvzIXgGBOTY3WpHQTnMweuvdMclUdz4PpO/SC1x/do53u0cA1rWEBEbss7910IHEmEeDVRoOm8Bee4EUjFW2MWzPqzNGUYXGqG0uEI+vkGAXKmW7g4G0SHbeNdjOvhQvzj35fQtokmLuJxQ8ta/rT9nDky8LSxqKyc8kwMHdK8hLXnmEQsX+glsin3gaBxD81cQoSRxTeSygmCYP7yXlROYa40knz1m2Ul1L4yltCk3PrYt7k7hNdvxIS2FK/0SeHmZP7MyardvQNcJV5kELTJcWtX5VeDkW1EhziomDa6XjP9cq1esKA77sbi7tBxKk7ODkUFnOgqnkxPdoLo10+DUdOydInM0n056cQ1cco5zYa3W4xXzTLRZ8SMe1mI2WcsDQAq/youz2K1DMU8Fg5/g2XQumXY3qGjHWSm/ffK723Gt0NnPe3CiVNrXtR3U5wI94T+qS6gQPRbNxx1uySlUSCxHlpmJ/Om7+gw/X5TIuyjNdiKDUjLE4ZuxJgYxw+sbktPl9BEF4mqElNDzBE9nLCEUiHQSoToOYvuDDAL5yUryngyfmWUx+wXeOe6r+SI2dMS2awaXWZSamsdXo1pD0+NF+vOZxeC5L62EVt52dNX1Ek7UnoZILPgvj+yZQ72N3CS9JxYlM1CTY6PDaCLlzR6E4X1j6arBZFmnfh/UKDY1bvdOQWqVf5EctjF6fFPqmEG1Tj1aTQIlM6BpXM+iOkru+0LjdEOlHCHyX8GeAPVRjXaXy4kN2npNscqKLjLXC5BRQjTtfHUrOLSQCLCdm+vRwXvYxvzqm7zarGHhysidhfrU346/7fVerCahd7XZy3HwabpNnQSo8HFyLtBuZtufPauSUpr8ofoObiVdZJiIIxal+VH922oHRvfC2IEhkYdnL2uCiuiTJzaqZoSpUNt9pzSAxKCQGFRb9wYhm8fBofxjGR62f4vd4CXU1gwNDOmaASXbaZnzLGtrGYsueHEd3KCe9DNulVNeKp0ikp0tbdwBWbGtGMFR6YgSB5hPPRy7TE3ApfWx9jG4gArvzUEDVJ1N+T5jj4LN/0IGDTVM/FigwwzGDWtmzYlRkGHxYq+wzfNhjzkFn96DQ8g/RNJxGDdOz+pW9lRNZDMEv5YTFcOj+L+tjwVCnYq1FB6V+zisM6TQndEpSFHMiO/bNoLDH3JRB3mzrkLCL+wC6ugHA/I3WkL2o9fvbG6l3cKB0WFW0vBwCu2KUU9Iq++6Uv+zGPzzffMjQ9IbtgYw6cpij5qg9EUsuqinKhJ9tV2sseX6hG5v/lAvRKPmvlU+fNK7lLnne1V38SddVa0nh7Vnlm1c2zHSYUMmOsNRGmgGjqF1hl1VMCs/+4GdA/qSZFedSsgEwJzPVWt3RNrtw3OUntOVdlnljp6EtRFTh/g/umDTqLfipIxcZBbJIqnD3B+//Lvnj57G8uNwuSb441iUionD5gxvIaha+dXQizlZXLcIK5z+4YgzowlZ3ErS9gz5MkSTtcoVezOFZ5tWmWWHflYPcq0HbqCO3j5a9ubsyFUtzcUixnqufejQHaRve/oODKymDps88hVppsK4AagXuM5jitIXtI8ekc0z2V40PenRs+HE60wiVidyoo2S+pmihrtB5qwsod2EkzSpxWpNTJwc1NVPnJuHaRXF5D4aBPUi977My9Ng6cKEIQCTg9s6K6pKljCVA584QJe5cYQ2CGNCC1MVKEAMpT1kF7W0bC+GX1GtE/7lhLljcj+KSOb5K4r64pc8DuEJ8Hdg4Vgd8T39kD7DON23YTn+zSXHNpJPZNqL2jkgbcs0auOqNVvEVPQ2r928fvK3WCu35qSZVL+VQnHforUO+wJXPNYWCP7f1s5O6BLXdBsXMu2WavmyOODfzbCzJRixLdP1JDaMVj1/ZhsLV7yMLTvayl3pDUbRomhoW8w3zDY3D2UnzDA27szTsYtdN5ktPPjUfTIxYfEdvI4aEIaDpxBYU5xY3Y1bOZn+ezdu3YtoUETrL/MM2DITfTYz8W3j8O+t2tpr8MGGV37qqab5Gm/1ivG1lWF+YVJ5/FnM1lQr1GVvP4y1dPLNqMS/0HYYw/EGwsTcvaI2kzBu47Gk82+WlLx92mM/eYHeWdoX0ub1JQrfDB0Hg8HzzIVPT7+HZqG62mfOmPSK3Aw26Hdgn+bxhpE2dJ1oC2TBC/iNrCPX94OB1/PC9MezpnXfR2ND4OOXVwPMY/Zl5iOqGYiHyLVz+zrqdBRvJWRuaZh2LLRcUBo+FtNRmtSii+ktQn8G3iGeZNNZ4nW7BeVfjPtc8/0/w6M+6ngVTQpebb73gNZW23yDNYc0K1b1Sh+Z5ZTdU9TWCJsBuEOe3cPyddTxZQnjbrfKm9N7HX3/gypBNuNXr2LqUPuPl4jmLWDOfm4Cr4YAZDomVhhWj1jE+eP7gNOAxBPcwMqNWscqy2diiEFvCOqBMSxw1Ld6RyVIo2gDniD2grjdc9+8ZIjjiseWSjRzy3Naf0Vxua1jecXv8i1CuU/IrUVp9nuZOffADN9CeCEK8o/8bgCkX9jSgdXufy05DgSDV+eoQ9JeBsFwLgsnCWtBGQAFF+Yfhr8vGPzXuf63tysjB3ExPa9NwlYff8Aq/yphTiHvHTv2V4UMm43aZsBW8wj6PvmEMhGciSEm7FfGCPCnkwJz00YLA5JzAHV7mM5NrXNqNgQ7EWQEKvO9tFQ9VFOdKhEHz4ufSjBYsnkLOQWEOU6H5pu9MxnEy5r2jjL7dz3gWdBFRjRL04GINkSWgt5QfzgT5r63msTMMEb5xiyCBis9zT5eXWGLFniRQY77I3Ge5ZxPgu0ULx/wzKoqBnfDlIqZz+oJEJLKPEOQrhvd3yMpt2iyS+yvU0oUCNBV/yRaUYL/wlUx6emzg5lp7i3Idg7MeK85/cQ1h/3b29YHenBtWHsVYlTBkJqKDHZOKwxNjn9RjtcqloQ88EgDijYCBA0j4nveI9c38CAUAzv4CEADW5MHdtHJdQfNJwpGeguBmRwnsQkPmRQNjJ9YVJvmzquUW5MZh/F037MTMerHn7HlHtoxH9AZqwHExUzDCNdGGSJsqIFdE+MjqQwkH5/QdOf0zf55vR4SAppcl0TlOIeraG5YGqp0Uy0scgfDniI9Fo2JjrNExnbsU5mc+XLAzGNXnHV0a2Josg42oAAxAlAWfC8iuhDd5z78vnS872PtMhuIEle19k1iZLKJf1OEOSFyEumkkaKxpLZOEwnVdUA6HrIDF1TB/4bX65V2cMu96/sjGAGnHRHsmai8HkVulIljNF/4nKQuTuvEsdFDCl0OonqWm10LZcYIb+kBOoQmbJvJ+veIhiU0ZqGWqTCJ8iG25/UPkj23EBb1+TY/CDKXZB2lIYR8hcrKVuWjClwiBiRDpY4aLQLZCz1SQ0ODmMjO2vBWHslScU4oxVZaUJC5U239lKvhC1UxWvSZu4OmwwEfp6yyv6zXlmYiu4GNHiAULsMOTgDYvnedjK77jDiLV0psfrcmXPToeaUsqp838ccMCqapaR8oJvBJ+XFEyMzZJ7hISpSblFHkhfUMqctLH8nGK0fuevTzHJuLAohj6s6KBVWlOuJ6r/JxoABGf8iyguT4rmwZ5MrHOz4ddLumYYiBtbo6QnPXsKBB9uYkeEGiDaw9PwirHxyS9yER4V7WqI9rt3RTJmbfCjwRX2lBOIp42MELJhAOqQyBQ8yjFK9UdASE2SthTNfCTyWx/K+2VDf55jt68Jil4nWF+mduQj6w/Tjnk8rp27ra4jemGRB3ndvn2X8PRPCLYypfT94ti909KWTpU6MI9Lo6lJMVLdGWIueqIhFPqDxEq3ceHgBOoDSeRKqVazqgzDL9cNZZRaFiEi9JpgyutgvKj6MyaEVf0VEUSOD/kRWIjhLCwOaR0rZBXh3i1KDVtQIJbDfZDNvqLD9gnh/kCKqnBZUCZd5zSew+6wijjBzfE6mr2fyHufG0mcd1tkZXo0PHG3n/4W7FcgJ7g45b9vPmPLTiv2S9Lrw947Azrw1LjDRnyaaAeJkevWNkzjChWp+0K6IYTDjwjW+4VDWPdrV3gmRCmqjbxO2h5Y/ePVRlNd7/wb0ZAa2TM+ZYEeZHzW7On3rYw2T5B+BNsyBFZLTmsWWdCP2CAoj6DOS1MKke0IqfYUuE6sQSl/WmzN5pvD3Ig4pqGFdqiuc7AeYIwyE58+Ud8G3dYga+UPYjfAR/WarOlxH0zQqYmnY9BvqVazvselwK2mswludqwVeaHo7UHhLqgw+5TxoaF2HFBqh6S3jD7mjihcj/xlT7Iv2brREieZ+oVTnIscUxno1MiacKvV/l3JNldVrykD48wGFlM0UlF3Xbg8IN0FAHCnb+dOSwTb6+NcEzVAEvnzN55ED/sZNQ4kNTmybNTqKyBFx5Reekq+Xx8wYnFuGxkx4Y6ksCPYHwXqFwMYlWBtS5rGg75RuScRx7mi0EYjpusiYlVXmrYOy1S3/RfhkMOXvykVwReGfk+JufrCOAzBzvBE8QJb2Hkp7EE/1cCDqugFI2XwPTOSaRIYxmh8LdCxPFsiXB6v/69YkSFt88ZwFD5DyKHgFhCMdHMTbY2NYSLpN3TNuVPy7Fs8db1nL8Xq1ab1tXrPYdz33LM/naMSw0p/c9SB3du65t6q9cqVJ/I4mgS/iNJ+wRwEOh8AJ/H4Hm2iAqWat7JqribAJF5IqlPm4ODQceyPIMBRXkx2F68z24vCAqzK0zjd9/gVhHfX4Hrzq68Bl/rRwr8vhHVUxkD09y9KlEzO6hh8ARDVNi4Shb14zOR4DPYNM3zxLqDDevWu1IxGyKIMNx0wwTW0svYC/NWCUPo21jQY/wN0zECgMGkqA8zlIWArnGs9XVXSQ7vRAoCTs1ss2iAYhLjIJDgU2iHAepUnIwhGjju0u6VqOxDLSmpE1R8iFxVs8zHoCsPmpeACGqnIoZYP5zmD5PrYjrwSJoF1xt9N+JvHCyG0x6BIq6SVZKqfvp6znaehZ9DrZvUfVP/tgIUt6/yvVH4WflnSPw2HVh1elSAM+u6j1D27X2jRTCvpppUBgeHly4pKW0Mn5gyzqxrZQAl6WYRraVzmaz/7iMrGEEP2L3MtxTcN4rqgE0HfSog2APjUM6Xxa9z745PxfIKaWriech2Djbd/BH1xOjf5k2u/a4CX4pk4DGPyVmmY2O0ULqAWq/YgbbTDWQ4lbdgabEOnGMKmTAbtcEaK99cUpd0NmUeLliTA1Wz0idOBKHKH2OjQHVZpXRw/xu1hCNZWsD9hvYEA8Sw1JMuaWL3FtZBMVxZ/JrQnExBwH0AbEw4x39Z8Q+/Z9TL3q+wC8YoipgvREF3teOMBG4PXhO+g2fH6VF0RHFeNTxPV1O/8zdON5UEhnFUPmuTCD/JEP00D7UI7nxYj2TOrcspa02TGBkwN+VQJVZRRRNqJvPJvH19VkemKSWUrEN++GhFU06xl71WuupbjuHOvWJP0NGf0WJyqNm2yVNyB0loPD9Gimx/XWpxxcoVZxk3t6SA+I5TjdFafOg2Xk6lPPstpSTlXbIbVR5C6hq3PBXqQ+RJiRs1xViuIg5+nRDH1M4j+XVUnr3hA9CZwHIGtTH1xTkohfEJkkHOowlwoPgw9z3iSnNWFDIw/Tralg4QeX8EwROIguK0bpJr+6z6cEA4PLS0lZ5m1oyu2ILM2ZDMCFSMV94Y/ABoYrk7ktj1G3kPcoAWu9uT4G3IMHlbWTBQd4qJu35Tqz0mS97JarNOj9S467qPpLiTBocdLaMm7urvZ7n0yPx3ZjEemGXpEc3Tgz/DjgrF0BDHG6FaaAS0hyLNJAs7DzYWR2HYJOUFMcXmrYfFf4QJ3030zf4fVWBWkDcX/Siuf72Xckp4XvAO8hd8OnJkRZj8OzqomKgbammJNDq5e7uCAh3mT3LytOZnNQZ/E0YUPQvfb1ADtr9T4EwTPJ7gm0wqnYQRwXazDs7Y0M3fuTWKwh38lnXnuPj/754AzyDglOpwPngkwAFLAwYSUBPwDPiTUTS3FsLZ52xT/moi1iHCw+hHtOo2crdSzcGHb3j32vK0GAuFtCuIkejZo53pwYMUtjmCxCpJqSwetTPslWksvXSm0xCuLLBLZvBh0Z66gyOvEvtBgsXkUY9i0CfWMrjeJmaQGXghHHK9TUYBC1tMxqy2uzpJHYLisqSUft8RFiToeHnOR9IcfQN8kDrsAcDl+V6Qz5jHd3VwT5DKggOuL44piF0SraR5jVFE2270c+iWFve436dCADbSLh6H66McDwWfEXMHVrsCJspABcKnztqlXmyGHS5G0ED1RBpaEDTmYrQdvL+cRBDvSLCJDjKF/WzY6hNN9QpyjXsk/THffy8J9Zm+pDS18RY4QVbHjMoOeVmDJBiSednQ10pFAVBK+/YFoTRNIp2cuKmLZoqfzBV9aNaq6YgSLLGcxjQg/bBluzg5eZ6aGa5ahlHNBkD9U/jSKcwBH1220Jm2ofgJZweU1hwIE2AVmw4yESzJ2iYnT3crLY6AdrtTWHbSspF+C8RWw2yBLNTKY7hpTzI73ALgQy0sJKtDvfobgqY0WG5C0dVk9vzWzwXrODXksskcS5WBrOgGZcicyyUpHJGCaQ2iRp1tKBPQDK2buw3SA5pkpGYQ8nHbHpqXQYDY5d5vC4fNDRaE/4m/QfIFclsTO76jYlD/U73aJn6uhJHT9JZBgmgRfKUa2SyGTHnI5Lh7hyXURZct61z2M4xWbMK6eA+N4rib+OH+vUMx3OFDBKC6xkH0ucm1Ya1GIHNXzD5Q1hQBQF5NgEcVusO4tSvlqn+po9aag0R0B1wiSkgUBrKjEiNrufhEbBgDG8fIRB7hqIUyn0AnyrV0jRih3boEpALfgJgIvz0Owfi4ZQD5q8pSU9DC3f9fAaa1LTQYGvycyYDrM5DyZR8Nqohtd8qDIMoa3hKQrnl+umFxkINxWN8JET9vrxhVnd9hVdO3fM6m1+VdiQltmWbhdVkqyQMpp3G/FQ0hSsaTgIkGsIJDOUqSDsQaQEiZNAPGvxqChVRv9ygKu0J5rOPwlUeIofHcPk//P2OexORnxNaAWkA7n9S6ij6XWkQZSAc9QEp7WyLcfrwPaDU8QsDj0jWQdsDwXGgITGTvVcrmva/gpz17Cd5QqPp/P1fU95ZH82ln0mdo5uZIFPhtfZJv9Cg4Tn8Zpt2+kNLsT6kf9BtXfMYnHRPDU5rhU1p9tu0FXISzNLRSqXnf3Rd4q6BtPTRwKQXAYqdWH0x8lp2wxBZF4JuJ7tMMssPxICEhwu6koTR5ZxYXddPwSbOPVEAlkE/vBIgEOm4emvhbSCqnom6ncnR5e3+DJIQY5mAGYg8CxaJLpdI0y6ur6BN0WmOMpHneLJpGI4aHUK0UgIJeB70PtUE2nH0wdE4ON7k3Fz3d0QkKGAsGdZcDr6YXkYcZbjKEcbZA2w4dfUbx+sNSmPcIlr4N/aqyypLLI5qv0WQaMCn+iSvIY04yuLmU7r0K2xxs9BdJDkAdVEjh6THwtMbzjuQ57jxzmYX6xnRMEvlm/iI645O0w7N/h0ZowtWFXFwSa8DgbTLVqZqq0iBrY4tuGGX9x8Nt5XMcr0nKqWCRMnAdv48hfsFO+EqpP1Jg6c7MeiTAB48PNVwldqA9ZqiKniqIwtTptoJVRSGOiOL2IDYj5YD6LtaBeNWzXFTNcmM0eByljpCZhCyiMExz1+l9CbYtjEUocPFUlFs5FQWV6QNILAIaAHRSWK6QjQwDpO8I/wq81k15QaEWlqfOjhmckl9C/b/gdr3+0GA3wRy8AQesn/wKdpQ35K2CzHmfWquczNq33XKmC7s2guKaiFqRTq4Bat2GpgOlC96WHYgUeRvQAN0CqHzMv9StLwShK+/AfGTPYkfWRZGuFHwnNvtvoOI3aMGAQ8tumBBs3YrQ32XgOLnnAGvNdw2LGugNcx9A3zVgdjGilY6kkvfRkTvvc4nFGyhBJctNXBHBcOchVqYQHEjPQX0rzeyWPsEF+rMV91PIedPVV2cWat+p+kZoetfyZSlWgnVn/kPqzA5xtq+3rddfP37SzzkJudfXteHCjY/LxyLstMSYESzezSUwbhoNMi3Eyu3cBrI/liCylkxLJ7HIWb1pH7BD1Ub9pEKdn1YkqeW2GXleqvv8hK4MK9eJYiPZqNWNkmYKdqid/g/YOaUVsFIIHruiCDx//xLRtdGvB1zOnhzmaM1BZ7xdSn95v7F1Lkb5YsQW1YELCLv4taBGcOMDOiZPm7gpiDldrw3TgLx6Mg2FKXXoos3ic8fksHvcfsSBtlqDh5Y8ZXr81XZspaQACQUYYj9571UGpTD1rmOOHJCJMhYDQjH7BFIp2M44hezoCuxzWIfYJyWJKh8ZvURZ/h6/cHaUNnzoHESBl4GXpEpXrEaaZp+BOhZFZWw/HPbCnQupzMpTq3zUxuH2l7zfwC2plqvK3qtpJqTiwqoExD6UJBCycoK7QXlPl4j/I4bWsA4PCJcOnJB9sgBP2ITXFi3LNQdYJKkDtTqB7/Ud3zGyJ5yqNhF/Qp1rhkbyZbuAYzzZneJ/OZA9uGp/qOGoHiMBr7pfWSYNrW5hFDdk60jPNDqUk8aZVxXlZXBgJkl+ykOeuU8Ccrs/iF1FcD7U07KzJYKd8xsJK9AZtHqSOhsvrLaERLdOrHkbiDcPw4q0DH5niIM1lyeuuFeyhfpuz5+BwsTyNFqqpEnngmy6/1UyjYRsWETAwTrm7rjklxmYgtHgGWfuH0JlnWZuGZrVZQT2C8k2LapWCpRRP2prIeZqY4ROl+zpbGIshcz0ygKvNUDHl/a/K+2W/O8P9Z2gJ7JD1f585vJVUNjeT8W1y7rwuhxtdBrziMPX1oqsqVhoWHmUEDi+0Vsop7dyROMX5fggWUfeIFxat+dANSlYKlzM7BZDl5R4t8RKBHUCJULvs54cjzFsfZ37MubKWAK91V7crEcs3SFgtkl8EQ0Jj6AJQm+Zsd18XKHLIxWEwISufAEX1p84bPUBnHBebvZM3rH9wj+HXUL2MzVSPr/fn3PjghE12pvvg5JGWm//g54xK7/79s9ig1+EntfM/NZiVHIG2rTHW+01vsVOdIASJvLav6xTBaZ+6bqIr5ePWVroumtM7i7a3hvubg/fGeEXXoso3Cs62O5fsWGJ+z8ocZCkwW56RG3Qf2Yjo5uUM8Cb0FP2iG1P22AEFRu+tMV/jte6m4PEZzeQXnQ3WzX/GzZs291jbahZ0B64EkTfQxNr653n4OH9NuGmJ9D9nCrtIwH7+qt6mbgtZEZYNiuKcWGVqJjsRScwIK/nN8pdre0essGhkMtrPIjnkpm+cMXKC9dDflLBodHNBWCGjWkMZ7ZTk6W7YEEQgYA0ug5bUA7uJPxJD+iLN1reD2tBcgDLprpdfdiSEK0vbPgrEIiwCNXghfAUMWtlSZfBEssc3pISrN4a4uz4xDOKc7pue74X+2aIvTm2Mqy36eBkSFh8iokKcYRVPcv9SJgrvbeZLL5dCTanbNjHXvlkth4+YYXYSGDtM5EXHDyon79BI0+XB6yA+LrCv/cSl7pp7EX6MAtofVxxaGWsfuNKzGZWiIZd3vclvKNZOS/m6YzCxDomfzEDrWlD96dD+6ZquDoxpoytU7Z4TGUITIECYicdJxVedwaWNoB3tuNKqIW4KiIXUU5IM2dlI947lEr9nDYyqqDz1co9wpeRNQWy/so9xEA2bPrbQ1piY4ljVwM8FjQcf5qTAqdHcESPECFR9t7c9EhYFKn4oqtzvRP8+Dl98U4QM6sdxCOa2HDTjhgzrrR3O/PdxDiFTb8d4A4OyZVzBAWrh/jUdcRA4UoN04cw3ElwvQ7sGtAowmJCkUPXhyNPBjyiBX/jtc0sLO1QGoaHl9c46j9rnzykHfgWHPOMD8Y4NVEnOI8bXPAsq+JI5/DaKYwUKYcc3OD2fH3rehBvnmenXhzj9J6T8t14tNvUuHrPtwewbz5t9N3z3+8qOM+m34XCdLdiACqgVAAydBqmRlzAMRSJ0l5b6+rwIqkOpegf+XS/QFgMKYFEoOS6fYmKqY0mT2ZMzqTZP2dOd5I8SN9Q9cmEkRKetbeYuvg5Wc/l7dJ1DvYzxY/fQbp9r4j34kmSBbkdXRZbsreU1Qu51F0sD1HCeSiRSCqYUvjUcqGQJ+9tpKFt04lkYF9/hxjxaHbx4c6KrHPJM/phXInIAu5UIJzNLxFkG1QvpGbiSJ33KQ6t5AqOAYybTWuzZmLpmBU9YmAFzmjvOwUuHISToWT3T9QbXsC/6YhUab43auE62XHdyKJnTxtUs4yIcbgWvAIu863xMYNQOrvjqniLiRAYSIZU3z5LNy17gC6DlrjrjChAKeXy3qMhqUuiQYdOSHkLZNx62rGwvzwBIEc0PC9zX86GPwOplfrCok+GTlqfLIw6xkyMGiLGHm6rqbTA7Qpa8jCwp4Pr7KwQDrs2e0udgXMTmfVV3wzUuVWpox+3qF3cC91vZDeJz3zcWynqwt0fdWhUTzsTmtFuQCf3iY4RWESHOuIxCcAC/sSX5sgyV51N8i5E/ADpTqitCct2mt+OfBVSkLsjWhofjxUFwckZNjJ2GBn8+Oi0y+dX8cnDmSqLmRaSOw221LPzyiHrMVwYoprnAZGHuE9EcP1OLfX4WZr0SntQsfu3BhyvU7/t2G5Y47mQWN2ybiEGvOW8r33mDFYd77JC+GG3JxmJqtVjN9NKJg/3k/akNnjEGGqtzDeeiEOB2Z8ShZ5CjpkKUuswLu+7tMtO+walle/0YzSdI+x63qNci8x1QiQ/nVt5qvSPMiM+GCPwtFmhFM2p3UJKtZhZo/UZ7iCsA9YGvNrh38eH8o07GPBiRSd1fovvuFtaREXggvNbDMD4ec3FyaR2j09QPpHx53AbyG4w8vwZtMaMFffg+ncC/dShUFBNlVmRNqcRV+IyaoXoPwcr26iNsJzRyXm46OZDjIkvaqucsWz/NeMnkh5J3osh8e8A3URJbKcxB6WNjU8v3S/khqwzZUJP3LRDAV6mTURg1pGY9HRPdSTD7xS5xla9ps9CnmtV5tzP1OPK5CauVFEf4zxnY653ehQywjNA+I5rw3IkplhHIgbgkQNd15acxoVHW9yfMyf4hzxVI9+h7zqIidw9SY47AROqQcu5QyBQ3/EX2uBsdmL8EJgVAuNpD1lYR8R/76cgbn5QLDKVIvsHlqpJO4WMIFSSu7OR8rANjHJU/lz0XqhHEx7Wi0rdcDoSYQgcPFKyH+0OdHJ9mTzxfDItX4gXNX+DLH47c9xizmFUiDag5vcQOkDJDSlJ4kYtFyx5x3jzgxVD/jdEzyjIMUIgvKT2NWHapYGONdIkYbbIaJPANbXJtOady2kmHsQ2RRTY9RGaTFLR7uqQnf2WzkwRuw9ETVBg6VeJrz0Lx9RZJ9txe/68NQdzqAeyte9Q8Y+VJr4lUeDpDuy+BzDjYVSx/Uh+yZuLo5HdVWqXdv3nR5u2lXvpNpCPVYaLvdCorHnh2CatniPDCZb8pAow3eFQDCsP9rRE+04TaY5H8OpLpX38nEI6Syz9dKpDAEvC9PR5nnOr/qlw//UWr2Q9JvCiaMMFWL4ULI/G/CCGbmlCfAll4EWhdMnNcVh5ZeQSrRma2kxCAAn/KfLjnxm0dI5Crnnea3jGHveKKVI76+ZcWnJ7LD4nYhK9Y7praAqXJvwx+jHM/mzXs2f3XWhy4e9zVgOljL7p0/7El3cqmRPPZ1p1khIkkrfMP1OEP/KkwL3jI/qQplMfJZP/aCQcAFI1kF5UNX2KBuRDhxbIaQF2xso8MuVR5qvA30lS1VXKEjwg4dnfdg3/X1dQtETxSDrg7NM7NSIQjabjeoQDAkwAtmAlFVUgLUWSGcGasO1UvWjrTjIFg5F2c7FUHAYJjRK4RaE/SKzVfkRZqSo4zYy/Tiy6vtdusDuXFiNwNXVnhuZ3A9HZoOVfNa63qZxborCuc6KuNjSasECSVJ8VbrJOIuKw8n3ERCCQldqfYt30DwGEfcepfJAXZfCvaCuPyBLMCsIOwWzbuAnOykWTvmnCbDTzcq/NaWqxZypTnUqeXLVeq4yiAHU5FxUPuDu/FhKfX/5+fuirZHb7fkT1IDiGiWI6zQsBo1wpePExojnLpRHnjRH4M+B8pQTMpKkdqIl7nrdEnxz2OZ1/Hhf6XduHe9AJM7PaHXzwzAtIOANyOqcRQgpbsY+PsAvKczunHIIw8gx1LhZhtNJUKxprbRmAKW2/heG4X8RtJRybPdaXzcABIdI9P/ece7h3AgyY1k7hhlh7V26dBt1clWGv6KnlRgLopm2FlgVwYUHcjNfc9g1AiN25yKzod+EO26DsAaeavwlBq2YsQeGmVKDIiD4OoUegs/wsu27ZUpiLGsA+JAZRpcjHhmp6zQYyxvNVFW4mmoYaudGnqnE3xAojtL3geFCFwNd5ceH5ZXmh1voMfFj6ApjwhIUPxeeHxFGbRpV21XFMeYi523XmbmL/pCdKa+dNJX8saTiYDCbdebCNSAj7FC3mgrajaZkuTX8+1ynVNUQVIpR617GollDT0vsHYDfsDLwOnG9uQDXz2IWajUcaXU2LlFV8s5+vRB0Squd3M6F2AtvLmEkGHvufc/SUpG9OXWNnBHNsNyygg+9BOLOiw8RTBnXhk1UchxtC9PGLbLEFOhycWj4visl0YrNiY6uVmo5owtUs2pPwThkEi9NJdX3BQEFLQvSa+tBwkwFYGI7ZhXQPw7EQEWHoZnaohMvOnIfOEi6Doi2neggJJBiImZOPbFB5dQNk0GmEvDLSQmNNca/O2MXRP6+lQTwt4SOGm1+MmWst+rRGC4/g1ghQJEG2Ehn7gdTTPae02qddmULJhAeu1CwPSYqYqLykWSIyRReRSH/fdaQFKcylUdfBJnAm89LWivk2TWyMOqTK5HW2NOQheeMo4xparIkb/iJxA26wvzigD/pXLI+UD+BOwxFtznj9UM96EuJgBoELPq22jlNjED+78vJihF0Q9ecPxfVn17cPAFWoFNkRAQUcaflmqpKWhkKnAXFEMJQ8iRgc2mUyJEGwhhd0YD/Hk1lJiSWqwROZoOfXMJykKEpBoELRqjBpRO44Z/NsYCKpK+ncwl372CG+jPBy0cpL5eXiRty+89wQiEtPeRE4XnIk8tITUGfajutSfnwz0RyO7TCkMGdAT5UOvkagIE5hSonO78CzqY8eT6Q/uab9QGLcTs5sxKmUr243345QMNihXIG/G/uHckSXIj2Q+56HGnhPtlkxLlmQh6DX9FD0HUpY1NynopQtx/BmrVBMGeDxFWx4hndAOZKZlmam46AO9dSgXK6LYZMAJaxLPc469VkSmtz31/Aut2fEY7SBR1fmQ5/4kiN8sUxQ26q7nNSNuy64nBgrDLWF1Uzk5lGmYKhZN944pMK780oANPrzlStCpWWefct1ZTLB/j3ucoNRQNbF9ReoyFKO0tKpvKjX+4N0rsMgUJiZ4Q6SBjhOmWACI3DMKem87TrEIm27ovTNugI2EO8qTfqCtntJ4Dt9iKTxBhhk44lYV16Bcu19gpycXnIGPVbJQ0gVTdnrJZ+Q22LVYOEmQingAxLu3zJ9fO3sJOfsm6BXnu+5kHmP9HMzDEtxU2EURYzsRqwxxN3YMY7yFDYTPbAhyjHyCjUd2fTmdGtpXZYGkyFCk5mXJZbmr2XyOJHRn8iPkuxKa6Zk3OtFKW8Eh/b72Rcndc0aLZPWgGRqkovGsOomCPUZNuqu0MD0/JiRamNkR0DRWOe3iST3JS0jezsmGdcZv53D5yileRxRJcm7eg64vPyIlJLjFNUB9DfCF6Dy+ykki6uPebQOCW0vs38UdGnD+kN9o8j1A4QoA1ZgaIsydeNqOhCEJN9hBhJDRVFh9BOu74vz7S3KRH82K8LbvKvCJbRUtOpj/6yoct0u8NErsCLoKe7XoCES9wWzhKQqVkWNNZ5FLTfm+nUlZ40tCqCDpCaxk9nLGL4bolnbyuP02qSc1z0QM45NhXna5AOyat1uz1DuZSHtSRfkfJ4GBKxXMc8WqxYF8kJqlRfCVDrheA5xrJTii5fKkZiAG5YpNAfBeDZGHHDWaYYwxY6LYhJjRZoWB+DPee7GGuvavbyurWZwnq7vphESvJQd0u1nzewNb5FLhaGnUQLike5sUkdPzwWN4jwtE833yMPZ9JwEcHE+1tBg5R4Y1VAKZhdTQmVGdtIxVmI915yMABywlKDbaZVWeD0yVy49aSZIXoePu3l3CwIwxpiTPsvHD+Diav4DtDXNC2L7DysmxqCoBmmjhiIfaWCRwmNw7O7ciCw78C3uhnP9j2dIK3SqnlEOQMRTuBrpfle80uit6Nmo0EUH0rFp23P2jTgpcuKgbJ/1GhMi5H9uC7kSOpHcVdwhGYJHqLaVyTlFA5iyF+pIZNWW1I+IMSvzLDA07W2xUPqJJGNFFwbY9ozhCUjpaXoML9JBL64xUmJqHaGF7H4BboLpkYuuhy2DcGvDFIgIEMKVdiDFUePCP8THNdkOgn4TDqrkSFpAwffV3VeUQRFkMw3AZuC3wjB6cQ85+zuYKZFdKmvfzjQnObH7tax7pdapid27VvMGUPzo8ecRqZzrZwiX3mzCMj/rfwd/oSuBT7h9VF8ymu1Oy/ZBp6sZN7jIfVj+2wiDvOZO8+43rvt67+li6QYd+fbG4mnAYiBCtvF+LMsfSCLIIdUzGnoKpqbD9sZmcZSeTeVMB6TLaf1VRqKfe+5GR9BXie9eedjqJK8QmwOy11XBEsTPJrjgCoHoxh2mQ3NJcxAxeldyc/D0/dnQsVe0rI8zjwo/pzQYjw1/4a8PyyLCbIHTlaUf5mw4hd6wuMHQuXkFRmbaFqQ1UExR1HDwm4edQN3uLA6DzTdmJ1Kgp2rNafKYvyfoh4tfHjp3l9p9cB2mF86M2s8nJJbFoJNP/J9NBDV1an8NHR0fFwUOvoJ5ZBhsX+LfPgzsPbuHzD0YQRcdZouZmf7yOUDtIEEqzFBwSYvCD9OaApD2+IpoNZ3ej92ec3vtB2JEVdUewRPrwSkSBYDj+d/bpFuBkzBRXJ7TkRtdpWsTlZJuMGuyGa5Y7SE+MZGlp+uUJZhHpgYyesuhDbQcYr2CL6YPGEB4guxYPFPHEEYA/nfEy2pt1Dwpn8t1MBq7uVKwq7JL9jqVos85HxAW6rb1872o9+yPjGMO9N5P4g4fQ4audfcNOXU5PfAzKTBHpqJIURjdI2/rOg8Q2L8e7/fyXpb/YEV/Hg5JXjeyi3ppK2nEeDa9XEBIZiB++eWn/wff28/nf0iIsJOdtR9Nu9zjdQh+Vnnv4O9la2Cd1zCTUUvzLSz7GFLbh3trv5qiIxxlKnnJWhHLSo4cWijtk8le1mlPxM2WsiotbdGsOJlWb7xROP1ccXH37ZW0/tNy+xhjma7e21+vfCk3/Lf1jmtttjX7K/EBy5h6aXpFhTRhcukJ+bxdXSbPOUP2tEym+niweZkc0pivYmib1+mENSjfw8Y0PnQaLQ80d2qAqI1JbRookTxpOZTCtvmBstdxykgbAesvpCYaoqBu75KlR3Cm7AvnAzYGlz9x8W+m95ljD8Ugxw8juOtpThUAD/s7BTqVukLEODHTAuJ1A6zdbuafovli3V1vrRqJEczX9mlR3Nst3VkmdYohs+dB1zNaU1+CYmH3ybaU1WGuvLVSXJiiGN7fcdYqxtYYPGUuN41CO5+UUSr6Wzi06RrfJGE6ZfQ25Obr55Ki+F/p+G/1P86KMErekaVfSxJ4MzQX57s9vl2xyTphH1rVJsSS5ZekpbJskuGiYpY4ryxjbGp+VHBT22B0lVKte7QhxpNtZNDXtun249AvaCTV1Qzt2i5qqf6C+32tBcy+74G86OTbFo793N4TdmGANT7rPb3fmS06M/W8BYOL6fjEGFER1LqkjErR7EomtfFQjd7TKCVK/7fcZkFi2pkHDOaSh8gTUYXnyknD3um0c/9UP6QDy8kESGHwp+kFNGbBEhKQVtDF8P30jCNQl4+n+rvpOVID4DlPq3gcZ+VbwxfEYhzLXccKEZyHxxbft6OBcasYNSW37wW2L+xzK7Nja4zoAUgZx3gX7sHlPzozbzqy/RAJyHpLZVBQDDH8Cn2cBpJ93mI8sDOjrPtym6hoFf/aVly/30e2fwFpye8ifoSOZt9X05V49SiNrKemPExsbevcBr0ZaXn3yih0NrklH4rDDNWIxux7OQ0bzLYPHqyPWswiCpKpW/agyMoDdLrn/w7plMSxuZ9mRvhobtM8V1J8IaVD5Altub/WxkgAAAA2afGLv/m4//FRsKcv4bNKxfOUkjvza+Mm9Ir/unTSH1v8j8uE4hL4aV1E/v3tu4mwMY6xwbVWgMhlGCsonU46Do7XoULGSAGd4r930+UWDkXE6SmDGnNQFIGKvo1y2qEl367Pd2if9yJUW12Y+0g7dNNhmjcMC3vBugjtDBEy3DM7W5n1vWNNKXsH6v1fdEKkzjlFgbe1VTlmxqXUkr6gbSbMUF27TxxLBqtSAHSaBOTupToc5E49CrN40e4DO/v1JKdlkp6uOtDZ2+XhcPAhndC2UXb2tuBuwqXTi7js3BFnMs1jBXvrdp8Law8X9P4l9Eo1mMsR/kGDCNSuAQwzVhrPt06j074FDOohqT5jyepUUKmWkyOzhAWUbOJ/S0Sd7mjz8EoU0r8GCK9azrQvxO3MaJVO5hQNMHJGBnhluBO3u/muDdqmFVLjjD07qn2Gwblv7fJkO56wU/z34UqZdhjNWp3UH3xj3RHEh4g2x6is68OoSqiezzK5Hyc2s+NufzGElaxlm5Q26IBiHgPDtw0GUlYJjjxXqAPgJHH7d0UmzVFJLx7GYOIMjdqpQ6vtpCe2wdg+vJbBGQHSfCSq8hsYe0UXmCrmP/i9f82biRkEv7j203gkv+nIxP+KeQjjdnddJgmiKOBiagajErFdcC2P8qY0mOxHh3pkifk6YZaKrm7enO89SdBVCqdCPpAKBVeOauEAqxOIfwDhdm8O7BRqjdeUW0yAbY/BTEwnguLyaExcBsUKBV3zOjwWWyvpdBjjCSjwQOdXeSNX2Jp9W3uFnVa+jpk9wWxOtTDf9PhUqYcU5/qy2xTPYJHn6W3R0NMyaS04cvlmUkfBtoM9ZMH6hloNbWepfFPUv0a4zbpXHBTNnla5SrHOIP18657U0S82TgvK6DD94y0m6vAP+I2QNdL30oMD9zyg8hI8F43a1fKSIb4pqYA6s2uOLLTn5Tr8xmM1j4lZohxOplw+xsHPbeF1gCm9nJV6sy99MkZsA17p0abbvC398tyUNrcYPDX9Y/L3kiW2KKlht5QaRYtkuPaupIKxiT2UjufljfBBxyEwbEH6DA6OmANXPimUreIpz98vlRs5S6d4Eny27AQ5xUNJxOT8bnxD9kH1kpGn6CZszRZvJs1aaUl4tZz6xpSR7gvDd/RA8d1cFLISTNVn5KuOIA/OdPley+VbouYWmylPaB4jbsgxqTWc4Z7YPiO/SHC+DZSXv+qgJK41JL5GklserkQe9hMCmuUAHWZFEy4oHm8s+QOtd5EgsuXpfKcVaQEts2LDpoAtVON1YUaS7tJwcKnbem0HT+5C/JwToint9xh8vMVHDydfJjbl+WO3VWzSBmVZCEJGuSovoGmq8Epo/cs2r++ulOYLJ0YQVg98sr5aiRX4uyhNGdjTVWG/UO2XjrAK/oodkcMRtv14gYwNpKpfi/YppLY9mPK0dQv6YK+v0knG5NhP2hh1n98AW40FOeVA6JRFki+TEOfyFvZOLnDXPiceROl0ofKcu8VJNRsYzMR1Xiv9/DtH1imckp6u6jEQHcDKVtFkoI6yJZQXuv7yTUtDswVDIja5iCC/xJLwuAUad09oeZgK1DGL39kyweLnZ5+/18Hp7PWxdXdL18OAMUPAfXK552/poxpEiPJsnM6rsg3AwhLuRNPh/yyYcYEXq47Vd5gRnn0+k8XjFQYZwzj7VmR+9JyGMHQLsCspzRv0sC3/yy/g24Az9b2FrDOyvv3LBvlLx21D+xEp+K16C7Kd7/EWkSvibroqPE48r2KtTuRo0VrsxGtTGzZ877sH1dCpnQPnd8CPYpjJRvegh/9pcSf6BMgURki+P1oXWFFjJR0pWcA1aNhNX4MGBUfVWhD19Vz6wF0Puibf8XvQdbvDfu0KbmKGqs8u1PzB1CjYqODhF7jmwRh40SCsvdBEny4Ewq7fM15C6HSf/G8lS5rrSOHGlGGqeJRzDW6K8DUJ81MK5PPu0yjSrS9Pl187jLqE/xFVwJ7dIiQ/MUkj3V36m+evK36oeCGgXRyJuqKF4nNS86O4YNKT2SJpNQvxHEiw8HA1A0q83vVk9tEcYCwpD7fs9kDpLWpsQmelQ7BdB9HzfK6Hl8nJI7bhgjmxe6uuKgKgaxcHo2WH668HqUcc7B4rduXp6JI/rC7nSJ91bFX9jmJPogaDUPlgUgSGI+eTn1h46kP+ZBYjgynL9nLTtjUaYC+jbsEyS440ta8q408L+4y5h7zIJggz/BWS7AP8o6giWyFpdigRfKbaWNFiuIA8LMFyz4JmS7gsDqkrI/y2ScYAuMdUj7yRimkZ4g9tncltsEEZqv14WueRwTw2sO2VX5bioUQXPMkC++SokWt9EQav+fv/n9gvyJkrGGjEP7NZ/2Adt+7Ty6IOoVFkSMDHw06jWGNvjFQ1gJ754cZ7BZgGsub/lVweDOEhOehSlXj+KxCNw+6Vgp8YcBNjM9DBjESSNRZlEoQyrnc6szlPlzOsRobpjEsmWUv7kCRhC2mOJBOAQEi8sJHm5B7hZMNz6360YwiqFFiNKoQll1IFmzJVqQvF1/AB+DKdij0nEc4JmFUUVu8nmmXrE6U7poa47XSIj/ao17PcK9QMVMDALYeKxSIC/MRibUxF0JNCSeRFiGFymZn7xBtdDinBUx9DkZ0mGHmmZaxVZ8sAsPvWwuIOs1EdUomQZpLszzyzZs0h9MxY8OB4738xpiS9fbR27CihEuliubpKB8UBt+pu7um63jCd0LOBY/k3XfffVilw7KPNsNG0h/0yrtwV0K7gEuuvsEKSxHUvib/KcN/C7xU/kx9TOqZnJnASObvhRojm4UXx8L1RTge+0C85IX2+PYI8rE+SLGHfyUDD8iYAFk18yI4jkFx75UXJLpZwmUhMWVl+uPAdY/pnVKV58Tl6zpCzWfeVcpypZbx//bVHMIng8dyD23yW0YQsqVIgXJypBiEET5moK/s56w2aE7tLlrGjMiJbOB5XIOjD27Q2tBx6BbrIO82+t8q7YkLCiKaqs7rbT/NiP8o3tSte7+C3v7G34WyYaIwn/vgfQOiVHs0SWlBhu0HRXWFXogblm0XwQngGfLFyoUY29xFFAhMdkJpd/jW5eahJ/ponlDmGWl7kxvEKmCw5+fTj3Am9DPBjiVXChLC4hmifv0cU24iGDI76zcVeKO/WEwHS14CzRuFf/yMKIVyjRdsWeFMu8k/kns2bN+tnsI/9Jr7B5mMEbu0KETuQbdVk5q9/71iEiIC39ScceKtAGnVJABKLWouMGfjhP78uVQq1Kmq1hZCR9b13gBs0Cgn8fQCalQRV0LxpMykh0IZPUnPkn2xURPNaEeVKrPxBTb8tGw7k2XjDD5qshcQe10wNE6guu+kiuAbQq4PECb7ZSjOg3LbdNpYZ1ObIrR8AJr9BtPuBowOLkkHkjPunOfV5BA/9xRnz1XtyQQd4lthZx8L0zcITtstMwnoGqa3ZSn8O/26wD6CtcrLTNdntr+/F/tJjSVwLjhdIzjenhbzEweANITaiWwcAcFxO9CfR2yC8XtKB/gasCr71dJN//PkKliq2BnsbvXgRQThEhrMovqY8ajdHeSFnBguUwVqjgk8piU7Rx6RzmmYFQdkHs8rSC2DQanDJArULRLso+blSPFeWvLtczOF00zM0zgX6GaaC4bB04uN/odJXmsOTT5Q+XVvJPal/eQUWtOEeJlcTafSK6P+SV6/pTmW56KXMq1W4EoQUvUrom0RWZU6Uzhj4vCTKJcu29OhdXOCADgqHCIN/ffY8Ex1NGyQLuk+U8F4WIdVSQI94Hd1qbb8b+WTvvTBFIwSxLsr4aNPgpAV9uIS3qmhEIHUoRK8y/acfLTIj0+WZmsa6wFXqaa7gZDc08N31hltnjair4ZRwo4Ea9JYnZEJz7bRU17W0oxulUM4jlvAcwUmKqp1rh8Rs6V/LQYvJmwGJJJI3/pfwE7mDZjD5g03o8uY1idnMKUZU1bwqd0x+JQiYleXVKBpNLFVfsMBLV4cXYLmdMSKEjF545UMivv90lvtbh6iPHxHXvTxVylSLRJj09UNP3pz+SEBm8r+J7zIF/+FZQz9M0CX0wzNY/NBaEY11DDJXzAGS/IpxK2xYFaV9rmcQUq3BucOYU2vtKqEf8tLE44FjQ8sruZ6ZTBdtMBG+qQk0yqIx4eHHvHE0jaDSVBEID5HtN1zLBQbWDzLGsTR5GFJMWrmPs0cfUgqb4ge8FG27uKa4FbDCx1jlsp/uGEZaIY2D3VUSTxfplFot3t7KEt7PajxR7KeZflELOzm3PrQo8R1HSZCPJ0gwec92qI0hiLt+UpfUg36KJKi0bC+5GRbVzXIvzP/Mt5xvKKVEVi1j4/lNCC/0kpvaPUPZ/McVCUXQSBOLuht3aKPs4WhFGDTwQWvcqUe++S0hP/iNS4phXNIEmnmhAj1xQHljm+cHUric/5xn7IElU0/GzmMXnOlxwklJ676Q8Xg9rXVXpnheWHtSFA7EV3mOcVU7P7cg9U+mad48t663speMr7Gr4HSM9YBnMWYmuCFOdwr+7M9rtJCvXIOhztMvga7PrusCDJIw3+/5HoIcKreAOyIy6W5pQy50Cfj8sk0glNveJFJB7h2aqdvbizFSMDS5G3U3uaEmRqC68/Hu6fnSaZzjku5/rdC64xqj3z6d0uewsXcXqIj8lHmCU2oAoBOg1ZbCE6TNm/YSw6WUsUZENlVzELMtHWEtWdF3lTm6Oqd1EVk8ZiJ5yL5ztPUu+Q4BHCL53sUhTOrU4pxlKSLX/caHaZtj9bsA6mxPIhmSJPqBXCAShvd8zXf27/uCByOncYJs/lt8S9O6v7wNE75tSJhEdPYvcpSn6JYhyI/gddPZCkx+ICq7uHbSATkDZ7s3UbxlV5JCWIMLcc/BcEMh2ZXp3vIiE6o6rOl0Sb7Yi//7rIh0Dqfk+OHA46iXrlS5S/2Jy3EGV4szA90XW31wSU5QHzCcBsGLy1Q9SMLCx9Un/Fug3f/ntr5T108ZqgDKv/dWOXXWgVLmeePmw0Wq24md3jCpYSM0nGS4VlDg5KTNmIvzho+2DGEjI+oyH2ZXW8a8kDmszkndi8ukrY0cccLGUjOuseqhuHyZZY7xf2BXrK7rp6bYaywFyI0sLY/olvX+SwedxCx26pnHDRSZNE2ViNQEFtAgjW6sCJzXQRyid9gbMkoMfYvvMO21PY9uqPaxcxzs/uT2oAhc3DkNFnvMggAlhRkII/YBvRvPP0hkNyjAI3lnlykECUgRTFcuuMV31ApN+oo+tVmeDUdB5roOO0fGpctKoRN5VYVeOdfa4wxnvPgNnSapTFhCp7icTAOVvi9GlC9Ca8NeLf9CkxDIxblLnk8oEFhNRww+xYKsFjOxHl1YKO5F3TVjQa53EPWCvCyjZ8xg8UY6QauOSxKz7xjZHdAicOCp4+G6Dwqe7l7OYW0paUio1SZZqHWGWCZOrNfQEB23CNQsiojrwNFptsROGvlWhaOQWmosK9wgPPEmwFF01My1IsxanL2gnPz49yJYwU+2/gjgS9AfzDwj6AZ9x6tROJtNg51T5QC/pfeSZvk89FR8efGfynLc9iL3YKEUMfOkM6jBpue6bL5z7dzcwnMTa8iaG6qEJyeko41IOyeOF3O3TB1OI80cOIs24DGsieYidp3B1dZteiE6uHZLXIF9wXAaQl422YsQVoR6Hr5cUdgjdXwfPNdPGVVR7DbGlNrmYuArOfmRsL0v+MP1UvNxxCIsKyo27dCw1kCEd2i2zUBYja2/5bLd1XcGkQNCoqW+M9rNexLL2CO1AEh4dCw+8eFKpg1xEMGMhxk4JaWAO4KqhA9umTapuNTazSKlWeaj+I1ELwmfPQ6GMI+SUGQOe8Gir5X8EiklR1ijITSRRKXQx3toWAeSgyfK0dgphyHP882HpKY928+wquMuXDUQKDPhwvRft+V9Ulk9Au+QfjuGpE0KOZm5JVK/VzD+7WaI6Ft38/dLXdcnZy99jAcool0OCwY7MBrjcWHwh73dqH2gR1x3cWYx1wq3l6yjYFTp0jafdQXw3FrWhUTtub90fQwZb1KLQLlplk9GJVcWxF5JV97gIzOuGDBmeePy7BR3SjvkyJR2Xr6NZDjcDNMV4brYb9cqvaA3kqZ5mMHYe5tvsBjWvPvrbR/XnlrzvN7uu6us/rvB4uq0mn0wIvhtrpmC7w+R9NvJWW6lI9bXyLzwjfJ1lZeR/f7ejFb59hKN17xwznc2WMxAfp4oMOilacS4p0Jc6M8H5eusWZMX0VZXpXb+x9uc3+E1CQhzwme0h0prar20+8Q+Pt3czG5KZl36z10NNoB6gJEUPfEC3VswQyelKrKRq9qzgCynniOTBwpmey/mEiE4kA8X/fPDEE+bOO67R8h/X5qMMT9wKL3xG5dO9wnV98k1vrr9ct7W8xeZDAoNCtRlUnhcAF4K7qIARuxYpbqpDDauxD+Pqghsfc1Kg6oonMXNwdowxRxUp12ggFGML1+Eg22gJtxHh8s3/n5zNfTAfcM5iVuoM587mR7mZoiMj6Q85sCY+K3tXk2cC7StW6Ab11yy7lharq6f9CmFJz/+6aw5YEpC5r46KRzTBLG7+yNiHZHQweHxC1H1ObPTkuh/N5vJ5P699y7OmedpgAmrdanK2eOuUK29fNeNrO2fdc+zbBBOq7zzizSsyOnoG9Idls39E53v1WT9hoMzmC13J4/4qhW528Tna7Oik4h2dhOnacDPtd0aMWxlNlJhOpkXP2ec75Tse6ZcXAP6/2nu50LEeNU8ZdQeEPlbvU+MXHw48QcvXEY2CQRCTm9JtAI66MQuDChyVh328/AiApZHZgrS7GYoxpYkNRfahIvc8kAZwbmomGFsMLV3BMOM5l1X2ZqBduvIkRjvf1EjjkOi0oXQv/y+nwhlfbDMuSwwk2TGveS95ZOOYVDKVP+FTXGo+xYfa5vvzcXaxahUSXlDkDo0cvbBCAsJTkQMQ2GT4aQst/ke5+Osa9TIgE7SyfJ+xBz8d7qc/2n6ToSrvS/PcgKLQemGdMiR45LNslBKv3gRAedtesAVXcLhZkWcMqF3FNlB6+ZOsVRF9GOIKyWWa8SAf2JEJSPKbSX4J3zK+90lSDo0j0CHp+Cr//pFSKTdXsMTbqdeyoHTJg+XhUeixrSqCKgsqSrMYPeuKo7GkaRKHZfo/ClWUkj0PEXUG3dxMD22MbnStCdOndDgzzP5xmvqs4DS4JSR0dDiQDis8svUmoFJ5cWRU6vAbtrHp0af9DyGfpmGqCD6kIpd/hteoF1Spd1XS25TGr7ppIz8iFV6206JmvbPJcUaDXDrh9/zcqPhMcm7pknXnJvRrG5Saio9TJS5DIqpFN9bV7soLw6EIxqhwEgVSflQODY3oIokv91QTuyHt10mcOeYqRRr5YJ+C/dKMB3yP7igKb8JIWddZSwGHpTpnqTnn3DkBzI+jXoySbGovVjW8NjoXa31/rlkzUqTeYKnF0fzSyaz4/8AWiCrX5xFcSrZp082/5+ACmhiTeTDefq7s9BmIVt5wcsUDdLYGvFvuvqT4h1PVTRy40OMffu+acrlSzbEvpx31+33l3TW7EXaSer/YEXLEkSQdmA+FK7zn3pCnT5M91RuIEQR4/W/R/S0c7dPbaPNfVuu+tU8q/qbncLnqO1p/N8JK0jfDJtCQbs27SUOMxKqCJb9XIZOetl9sX80I1llNnZNl52L7Zfec8WZ+vkHorovkgfXZu9pXNbg/hqiU0R1vOr+6RKvc3WM7utzB6r8HghUt/Ym4SdA3SqNkHsKTvEZBy8tNw/+0IWExQaDxhdYOlj6bZUOwbosK9TPF6QMG2f2gpwi0qm2+86bBTrVJt5Bs7dhMXpxY1IZg7Oxy4Ek5DWs//BSBhtFT32sPF9ubIf9jIkiO+FeJnkKqelruNxMZOtYcD24Xb9HUojUzH657S6K4sOc/IFbE13VvN/PaI2BAvlVtmXXDZQL34zSOlJnPVmxBqW7ryx9dYik8rhnidpHORNFite6sjx6VpallZWoaMDaoG5QjYuK/v7qT5UMc7eRNUOgtvpqgFn/O4X1UNeVT3vWYSR5puk/1MOfTsWLk/uavKeNUxvuJRK3JWMozTkV1C8Xa1m9uhd9YEFZH5tLmLrNbDn1XIJFa7pvO2Um/Yj5q1EtpDowQJtObjEZWlBzhb3tom/wEQv9Q6p/HNUWutcR5v4ddo5T9Jom+/iKo7c6b+IJLatx+2j3vgMLUQtNr0WBNlfXi1NHiqTCSZVOUZ9kY08Sh/xmo3Oy5Jnfdic4sOdKESSaqDpABEdnmj4RQJ/+1d89aIHDSbv6oamAIfdXfSqXUNCNq7fa9c17YE5PsU/q6tvTKKYSwXqV7ZyTPJ9vn0e5RFLsjjqTn3+mn8yl8AN9I9qIqPM4BhOJcWMFkkvKPWmnpkLhd+h0lw6bZ6SRwh0T0+rMBZR4hlWRvtvA8h5ZuC3RD+34B52gHbQdDi6gZoj8FOrh//lUz4GyzkmTlgZuX2RzoURlIYun26Upz+En1jteVgc1q5N0l8F3fQ/C1WtL+XBWf9CxfU6r43Tp29dhZvA/77Z5qF3l+21K31L4D91NYrEOLK6LuzmFW7J0iojBOIYXUvFwx9rNT/lNwl8R5mHr4RoDze3O+X5Ld8tJJB/rcV/EHh60Dts5JTfYX/Vu7E/iBl3w2538nfe+om4InarTqkHG84pUgth0KIdAs8e6EUgjw4X4PXjntq28E/vkuP01/9ybYXqYzgu3FdHIl3EcMqJMhpmYc0KMSXBPv/ruAY6vgz1tsBbtLrmQB/E4Ykdbjc2NjN3pcSxGpgbUX4a0BHLPMaIVAqrXHwcE9owYFGTeALKOyFohcybwERs9g2WC86lPoLOKCF5a4DZB7d1u5y/ZC9G9KOizS6DbuVweiF4v9eoaSFOt9pQgVlbrCK12Khg2rOl1meQ9nStm5iBzaVd82HolOL23lRtZlgrd7BQNkDcNF6kNq5kZT59sNtVCJyOd02ZqL7MJM8P+NivJX4KQ9KCz6aIlCQ93AAQap+rq5TGAyhROTXa4R4aHD1OfGaamnwBbVeFyMvHER2F5fjA29yZNeWhaxe6tJJPYlGw3qfV0rWZbyGwonSXGdSbXVozlXPCzSGF6DqoF2y7itWaWDMmGBeeS4SNBowx6VHmdu+4J/MlmJ0+0e9aM9JOtejHcAj8qZ8z3xMfk5MhrFJeOPDFxL11Wb41tv5abCDgE8x7Df2Ilo4F5+laLb99Bwr8l3qENwmgRL4Bh9gEI7QNn2sWSloXS2SJtKAPdbj3GZutBEfm+f+6m4xjJAZpN2+GiG1z8V2bWt1Jtbw+S6uuNBw6Ls+L6blEzUrq2IewqVsUdzefIlDSPKSsVTW3WXgq4pVkI3Hn0qxZgBPDMnswgif+UF79+EgqEFnjhY1hRGBzJjX4wDdc44ugMnsNiy5D/4++1OyH05iXVYzWe1EjJZKQoUSApyhGPmaeSqlBtnTkjr3gjgOoALe+l80sx+K85Re51as0lFDdkw3e7/9g7L3bczYbzdHsjzVA2wqmot1OPt9u3YBNS2V4ZyfDPf/9QOL3twVod8djTWiZmRD5QyN4uhzD9gcuLUQwfFPjEnVBIqqil/mhrlWjVipVZhzHGeWFRhla6o8TLnXf1XdeSUj8YIw8hIy0dGYG3Uq5hpRCmS0e1XbuCgGAJmmOEIZsmE2x56v8nthNz+8G5rUQsbfq1MRPmUonbuDQr7kNUZvilwtTQLOTl+L3kgOb3licynQjrAErGkcfonCkQXGvLhiijYEZPk3TPDueN8whhuaEpL6TXlY4SOVwp6zuujnBlty+SZ02/xIYb+d27nf6LDWG6RmpoNjfCblpHvK6Q89DHZw8IsjSEtCpkK1He6KRXvWj3avR2qbt9ephQ61wPXuJOQulvEer8wRuF/7tq7o+tecJzsTY4+qEzvXspfWgoxTCOwcUYj0Np+OETL16APbBXpseZyQF68GH7k/WSet92Wbkz9X8tDPf7E2L/NW/5DPxuG1NiIuOl4/4fvCkdOo+OfG8NFxDb33RKT2997Hw7AbC2olJKy7hHncqdIo/WKoR071gjcQZT5OY1+P/FB77wV/3g8yzO0bjZ08VKGfshBHcQUc5dNBK/8lo+vPGXn0cOYe9EWVVPvaOS63Qxj7wu4jD1UZAWdLnW9m6WAiPxk9jVpdyhyw9N6MnqkJft7rbTls8PE8QYSgU3H9ruC3KYGFNecy3iCt2/iTbQmE2gyH7MYobU1cf9m66YwfK7lsvKou05ov9vZJD0HwvP/5z4PfaBCBaZT8MtDkwQTbORAPyva4CLhiHllvplOqKmDdR7mSi+V0TEfrT2MuJyiXMg3kj5oBPnpxhZCEYuf66PKFU9qOQiB+u52FFyBY8krPwovPvQmduG0CTRU+0pU0iI0rbj4ZL/mkxHWh6Do7DuOQUsHILqWol6kzuIOOE/Mw15/qv0sbkVm7aD09hawOcFkcjDwZbBainZOzl3K5vXrWXhA0odo1oIDWh02OZ7/OBMQ2NHFfR2aZ3dG8lTbP9bCKbKUcuF5hl66hy1IjgSDsP/Q08np448fKwnd0uZLIZQscl6K2LbCQMwP3wqYKhvVYezWx9yG1ZciKJ+9BjvKr1FLFnuMe8K/FuaICO2k8kM1GM7Ds8khL5Vt/0I70iqpAIz49RRFPTz5RP+k4lILffM8o6gpIengzLldlK/TtF78kpdL0QXbK9r3Sd+YExDx5/jzgwE5H+XafqDk6zkvOav+ubja1FgyBzytWI47YfjLq03d54mcZ4+ikTDipzsTQOCPVNqwyA1krCRZY/DJyViAXDy3gYq4vgMMu4i69o6juT+99fpcioxoRD2g9VZPokUOMgD6TwHYAA9SbMNPSTXGs5fibVDeVVVix4sybro2ATR4sCU62XKzUyErr+I1cpNZjytg4UVyrLwtKuWbRY+w70U7/UVT4ppU2mSbFfHB9TbTfPWMwVztufwuNXNLopZkb7/AFaWb1Eo7hx5qa5/KHiMDyPiko20JdkA38M+lL3FaQXQ0pkNV543tWqRCavWJLqYyL5iW+34R5Nbx09R3mXG9RI3pIONwYtIJ9CkrI/M3deVdllgRRzFwmexUJ46aFqW8ooqBLq0vvlaJRNJwJFOMYd6PuF+q5w3JJf1pD3HmKxOQzLSPR4P6gPwp8psHF+jIshR0swCv0PFA44pGAoLs5L2n4uKw0iWW3E5T0kTuayMcMG0TuPfPdS57pEUxv6KfaFtcRbSjFBAi6x4OdCBzgk9cyyDIzQ5hi1hbJvtXhhFEWfZZT27T9I0zskuy2irliQYD4W7KMtrGxYbdr0KQh2pKcYjfCQCWHOhDcCaWDA1/yXXrJW7wyqoneUeXR4uMBg3ksAmT/CcosRwGxBEbnW0UN/F72qIvQ4af+LsU4ZN3O0zm3N5kuoyiuydTN497s+pw58/METK/LeNiqKD9FIPHkuAOgoEH4zTW4LIDpEioG+3XO/C1FWHOrwFx+yfthsCJfOAtQ0XocfZhcIlfJLNKgu8xbD6GFn1GcJa58uiMrQqxDt/DUPEAHbml1rBtZhdDjEAiwynzDVRAowycOeJ8KQyvEmKrmsseaeSOgmJXNkyKooAQmrwEbLytxsNJAZelSfIkFWFsXGb5BL/0wDHIqKSKiGf5GdT/wR0lSNiMqJXQQ2V2qZ7Z6o09lIX9e50T+HxpJIciPRdRIH+BpCbdGiTY+j5KrMm/Y+UcQEQ3ay/oQaw5EzFPqikX3Aa88gON1HrBPmXLtH2u3p+cxS+ztCmotOm6Odllz1iMpEPq0Umetqw0ZfiuNG8Ka6SJBWUvmbvXM+sfsy4OVK9C71c0+HuBrDU1dSPn9mbfT9sehENSuQui1IMtYVIH8MOM7Y9VZ9FPkUq7AHZeUNsZAoJErT9wrqvyUEHI1PxKGuG4vjtciV1tUcFcxYxNkTI78Nxwxd0hh6LkPp5aMRO9FbrhNQcTDyCkH9yJfXT6/daWTsFkhw6GwR0IgaznZjlGz2UrOmmUmov0CSG7LNc/Jtmkke/uI7kInx5CSMMoyV1blLLLMuMZ3SxekFfECRB7aRg+SifnRanqPJhMve0UpyDIPMoUkrrefr7aso7c+jGwxMvPu9PnIYSxChR5hD1GrKCPSwOBWK07wgHHxlboOUOXoA602WrQAujTJtpKef7pnT+MyCeoxvSGalj3N923ZsdqwHowC//VCb8H756KXzcz3yLNKUOdjSfygjvZWCdL2DXh7OQ0K7oifoqKjjE+hjGcN6QMok4S+7qBfQuKvnsoMScEghzuQIkd07vbMkVyuuCUqFjjfshtXtZIebdPfnvgV9+1PXim4jjHDvTFG3rJc6LfVLV5FPtlYZLIpMatSu3h6rVBCUVD3Q9Y94PMC43/cI39Mp5H6H1D7HmEdKXj/ZSnqrDRfv8caTva7P78md5V/pQOh7vJ9X8rmCD3zYAkKk3UxkclXpORqECtZ2q1FBUKudqwywf3BVzqV3klN91YwY7MPTUWp2keZu3sg7tTBmGKfntRWCVt0jNUHDHH4CdE94WveG6eBf/f8ojWdu5o8Pf8gRPcXpl3H/DNxFJekM92Fa0e9plLy99AHMWX4aUZ/q2f5H5dVa4thDPpcbkGT+j6F+YUsXi00I+QkCO+J9a1EzqDknrkg7eUeXD3VG8trkcOgWncI2Qrt8AmTpAJFOAVdvs24P8rMuynsMy7+K9AUPmXqFKX0V9YoLZHrRWv7oMKokYAdsBPbW++xJyqTM/SkLoG3DVJLko5x7TWqGvsGxYlMB6pmOc9os9n6vdYcLm0oScQf8ax6DnSPRWzyR2TJFSOmY3hWCEAbPU3nfr9nLaNOoPlHM38YluoZ3RSSR57Iblad17qFuuNHWqlOA4iXkczHn9T3vWTrvYRk9HEW3Q7cgIAz0dpBqLia7NN6s81GSxy8US70M15DBU3NQrH8dY0cj5jIIEd3gMmrK5Z2QGzrw029ZzI/9KDKqp0AK32pLLG6sEpYzSksjySvnMC6CAGPVTSifUvbCIUnGy5g24/h1npaX26c/lRAvjZ3pMUzSsttORsAFWsKAEmIt975oOV0x3hrzUxdMZOhWiMyMnNGiQs5FGT4tUeBLrOH1lz7s/IFQyCgbiympQ5cTaGa8vZQIxEPEmRFqkZ8Fq8InQpdDq13HO643u+PEaTE4z86VQget1BGB/K1NKo+3wWYSNj3fUY7chlvqOp4IFRJllp5orFSi35V996ETduF31oelmnOdPDIQdj2GH6gWQuF/MOwVCq6a8pb0soVEW+zAVVnXCIifSYCM5zGGJjkLrsgcEyhtj15xb8WzhXLJa353Ccn2vzEKPcS4E3Uqz3a6XZF7/tAIo21ogjeJaqyeSSkS32tBW1bGMMmFiXvN9ghi+1326EVh8Jb7xkAF9+AnUvqvUKNL+iaLkgQghOrotEf45Nn9AcR27+N1ibbr0+JDRAyCX0HxOYQmXx1xf1ub9Hs9S5KlmimwnCffGFE6pga4NQ6Iyb0iNkXSleSMNxu6VXbDTvmNZ8iAp0e2rpaihV4sWJCzXqjOr6JaxX72zSqxjsmzTn6CtxTrqGajkPWX/Lgk0KWrEmd+62mJvsUb/zbl6DDazpbBhTgsL77pi2/SENyFTkqhf79G3EvJJR2/cSK8p0AvKL1PdLuFWbU9RQZHlJbr/Sn5x8VJsr3axyIdh6zPYG3nhn7e7JGIdPgVfkLBjF28w+Yd9Xmna/GSP4ETM9tAGHfGdCq7uf4Dp899WCgzC2qkENtECGZEoXd6gb1wTLLat8kTAdRzgMv2tJclRL7RpFlrJwuqdX0446MAhrIkLWYySuPnic48dI3J5QjdL6xsY3kDdtcvmwBXfX1YAfaRWWoGmJLTemltpANnHpmlTq9P5rGbNObQmXKdOwizCJN8cKy72PLsRr9uJrrgrbEmFS8j7AHuu/gX7r9hRRcKSsIGGp4TYuzRji84teT7mg1ShWVTzIfLHCKiHgGwD8crX8iGgGW5RKfJAof3G7Yy4NMwoIlaCPmaUefwo2a5sVZtTzebjOmqqETfRBptHG0pDqqMPnOunCv4haWRZY//Xyi9jLXhomwXycG4dbUp5adsna++TuiE9G7TJiRb6lC+pU+avuZJWNrRFLh2aUVbxbcU+aSOERSxZ1Jlo+BBBoEL1/AghRChUWIXLXEW7uRwCjSS5rhf6NNkLa2BhC+JfCQHbrzy/9PmEL9+lhjT5awtYhei9XWS/4QSdOH4xDVpUDxzuuGk6xdNr7yClUfgH3O6IRoT33hmedBztiYToVySIw+ukJu2SDWHHjQYtsZkP44hVP72DXWFcArKr1zCjuEOUNHZhnWCcgt7ZNXjNHj7okNoQqg2O1P64+Z2V7qmnp/RxePsZKbX/QyZTY4/wGjw1WbHnrokvtdfU39BHKiEEf9Ca8JMnXL1tf5HCZyOtQOY6M4j4A+f6rGOUt+gcgxIg66FRfP4sRcyxvL7JYy0mV5Z59viO9mr+JYQT5F5/UJQGdzyI7mvD/RyOk7OfahE+p43wYiskjH1nWKvaBjHgE0uKm/WMwvk/up7A9MwWV+q3dlbRfb05RSEulr+SaAKePBZEo3vtPGaiurnZKy2QK9IJAKK0imupdj6YBj9BKtpMG/9Mk6VX3Ll5u5SDVVw8sOMyvUxEf2eRDleqlDDRZBM+fxxpX47P2y3aDEyL76rMYjr73/m7S6oOHvQrqV953NLBbskEmzaQEmrBuA9TMEIwSaRqaUGqV/fpoXsn9QFTsVUmdeh7WcnS48BYQDJbAxlqT++J28xqTiWjHd6ykaexIHfTfPoWZG3q3GYV+sx6TR3X8sKEu8fDMjPKtiAxtkBr+X528VsiZKEPuUsK4TpGlGBeMgT4LHpuUWwnlII76v+KurByGVcFK7d6T/J2olDIw/mqBb6Z8wvPjIRRtD9miY0247wrKaoD5P6TC8pei6wQZjwh5VTlaYLBgVKgkG2A3QxDOyfHryLRvsr4fmK7aV99FRIz+9kDHW7/5+VvmPzIl5OUFn3/OZEI0hq7stGPogo/Xl3FdlKZeyLBGPjkDSCoNmscR4e/CemlXjz+fGvuQuN30smqQ9TEh0vitwyQQiAfPw/11qYy+Pdug81I/iwGlrDfAOtl4CsemJTEqwM7hXkSBHoNZM0/vAugBxkkrmZlxUZKW4E2xw8NxEelNCc86tzIwvbKEZ8enySPRHYZ3Z84p6CB6Lt0LOyu6Mro0Zwop7nrv+H21KbQlpx9aI9TdX8E8rrCeYsWfKp5e8ykZps1CeCyzZGQBylVwuOFROJGM05pGh8ou5B88fs5cg4Zn0N021Cx0D752eiPPjkhzHv1jeHM2eQ9zNcsgQ67+RXpljnflsGOzMkduQHoPREVuy8zBTgTQUHBVw46vYsUL8W1NEVgjl33WfevY8iuMw2/t9hB5C+YutKVHT8AQtYeXzh8G82ccIoptkTXRU1nMl0ypPkBk25uxrGEgZe5ErvwwE+rnBPF/4m8FVhBjpLeYA4hGJC7evQJn/Z8xiNHSbZemU9IXIIbUpPKekctV7f1+yMmQY0duylJqu/TjeWXRnOmhidnpPfi2TsTMYicixWmKYSfCW9ys10wQWJYyAYvy3n6ojC7mxL7aVGGjgRCYuggIl53p54LgDVL+fORWAdFYzm7jgNAUe2iYpR4Mu06IItWgQS7bvT1cKgwVceMVPZhm0Y+69C/h3z4hQ5+Cd6LfaAIxruCWeJfP2lMmHYr175tOWHOffU7CSNkwsbboMB292Z7BgpFLCxBavs1/W3b7cRoZRs4vIknmbB3s8z5KjEEymhPLSWVlqa1GMqhK3ulTLInCDk8l2P0Atjx+SbRlM9yGC8VrJ61SaJbTvUKHi3Xdp3pnnmo63zNMsGWpwzMybM62idkhl2tNULnkgnMyVnih+m4lGxzXJbgbsykGFRxMOcUG+ayaIldtjX+eU7YYI40CKGPimykCVciwQlXhP3QkgKko2SS5rfRFHIyKWnWpO4gi+ii2FcEM0PeK0DA5TiFG9QkZe4GKEX2D++9jnidZkXMEErjt2zCVXyFaxE9NLlMQZmRfajCPzQWWQWHGfqSie48pyjVriZVCTop5MurhRjNUctVZE3+H1iOAQUhkl9Nu5ojVonG/pBDg1SHyDEgS6vpyS/HkZNUlhptmyT0NSS0zp3r0SJ8kY2ug6XevyU7JUQnhZFuyveSFfqkHOGry2e/aYOKiqDbCOnRfp6eanAKU0lDYebW7bwpXTiosC4nODtf3X4u4ib0KqJyI9GY5MZImHp0OecGdaGOEmRKpn11RBI1fIaMSacwzUZpLIy3u4aoUUv21sKmrjm+2Ar+YPfNrGEQoVeTAJtACl50/W5JoLzpXaKB1JCZRRp67ybiNPPLWzjGaiA1N3t2ye2eIyBi2Tvz0WeHAOjmeLXKlYwo9rlFSqYsDwlZ5LAvXAiUVe2AztuEol0DXu9PZNCfvxxCaEM1GsoHQZuhPSNRqsE4z+pOxTYtTG06d8Rs85gL2s+3+wl0CucxSNAbs6PtuQ2EFSwpaukvbjZh7zGkHISdQhc7qRgEJi65skAPKWkOERGVGn0cBUtQ1JHEhcdxXDzeY7uwZCqsKnN5yiq7yq4uqmxfDr4GpI0bmJ8tBvYh+5ksXd6r/DuFqbyKYQdzJxSYxso1vFY0Gqv1uzZ477nLZ/E+vDU9SIPSArJfolW+gv6sr8QoXW5fryavtZKgJs1iKUXtbf3kA+MYKPxWeGbFcIn5+fr/Bc2a502BXQ5roDzXRtysqu+7Uz0opZMQAnEEDShyKYdVSPaEYmItJiikbezNPp0XicW22pAjPgFb2flKFtvKApvs7frbGpsMVMpGMdNOcXgtUzJB0gfG9NO0MBhzk+bIK/L3rrZEm7TrugqrG5gw1hfgsE7wvWsxOCZ7OWFYRYvRZliEOa4O7PwPhg5KGMJ3Pkm7qroHZUoCfJGrKrS5OirFoAWlIyxnpvaReGZMrvD69jQkHQxHnsq5cjhInqZXxqDdQPRxz5xgOJuozveLmrXqlfbgxYbFOxNCbn+vNmCzK/TKKShy1ElJ9kTrJ9T7YdCcW3E3pVyZFptJ6AnpDMVeYb+imD4SY3NYAlJYDjLYFQYbtw/r4KW+f5/p4n5rmIASpg46xjKSM6xw97beFGyU7/r9zF7LXL4IpTOJXHDtveHCvJZhOQErpZsFB57zGuCwkl8htGNc5ZCedx76N5uj8hdDB6pqO0tJvPJBd6VoDYg0OvMQlN7tIB0T6qFA6e/VgoUQTqbZBDl3dWzqkz/0KRlZvmpnEt7dwigU9sKxYqXzUc3Ki3fQ1AkxUKe5UwydTki/hI3bgTVXgiEo0n11MJpqJ4UtSWmLAWtO0863XkHtmI5+/XWnenzf7k5SPHyGRfkzG1fuKL5AoTmVXdyVfhjUV47R5hY0+Wl3tj/isGDKh43LV8JAVT2PCZpz4uUuOWHF+VlPKlEi7U9c5qRdAjvOC9R0Kiyk+pKA+g7vqK/tWCnHsBhGjpmiGMLjY+6Fa9RcQRODK0gL3PMHQ57BwlOLWvKtzglv6nBnFrCpq1Ixwo4aLs1Bl2YLFXdnhC0m7tZXpQhBqJlfU4Lm0aJbWWWKld9LTmBd3/8/6facINvA4IQZMj62g44XEqYT4dYXYnFaqLzM9UsxMYR1t5j6xNem5sVvGaYEQ8dK71oJC2Ghx92dwUJTUOYc3w/EX6/Mqwh3Cv5xrLNxmFocLqcr3IXFCMUVJALxhcGmC5uNxSCGnOtXaE3CYkp+3LDeFHMqYWROFEtZaKiXfIshtGEsLkrf++kQsn3VuQp3QjZDM/NMJ9rzOr/wRC1XV/9qakPSMkcaNJzruViVOQzkN4EIWksyMJljsAu2ZIOWeWqEjl3euRy3VfGB/VInZra78p1YonLkVVXU5GO5YU1CQhan0Xw1ZGUfPH0GH7+4K2ZXwTzn18ppvicP/EBMgMhdFdt7z4ZnGU7So+u/t57B+tq/+ru+ZgZ43EQmj2CP+BohWHem3VQ5zGiwshTr0YSpEhO9zK2buYesFcHo/f+RZSzB30gGH0TQhAjOicI7DcRZCb4UhbscAa81+HcBGnpAqsF9icJcO0hTBJw6QLUH5RiAOxMDfW5ACAHkWjK4woD0Ebg3MTA3AzZ9BP5YMvjJHVRWghfJICLyKroMGgAEAAUIAEKoipKpAbihegTJijw9R/q/+KcBvY0b93cb1k/defPanm+ebp6bV86x913TT6/31d41A+dbe/1onvP5y15Cc9MeNs6dsOj5cFdjfAyHYXKX8YZD/bNo4118/eLW4EA0XmClUV7hngze4ZEsc4NnLI1/GEjKDyaxgj/4jlVmgR+ojD/4zEo5YlOgiBAimiUQWrYmNcEIKgvCxBpZEebssihloDXZUSp7lSvKnha5oRxps/TYGdcmjzjoVJ5wiRvkBddxk2XEDeyMPnCZvcp/XEEPfZNE+kwz6pZ7o1Nq41nlL/XEEbqgnsPTpmaTeVD/RKXM8S9UPQ/mP6iMP9n/p8p8Y0rSwG/zFRvlwvwPq4n/mD8m7TjFPZEl3tW9xTTKXP0nq8SR73xTBv4Z/2VZENx6Ip/xBR/IJr4yNm1By9is58rSlBsu5TOGwpSl7GIITDmXbQw20/yfU8HN0GZzLGw2Nvuk8mhmc9nEwI2WYYiEzb+Vc6QmNzb0kTJTlbKgMjb/c/kn0pjRZgktVL5YSmiJzcLSO0SfuL9mBn8kZ3t9WeOEn6fFyxF/9M17OHzTjTfL5DCRtK7HHAzJ5Eo20fTfEMrT1QboV/fJNDR+q2Nnu9gEgzHGmBa20M3xmPtME3ldo6BO7izkTmXT0vqYWdgTmRWmKvZ15mGtel9ULrnCFacgpRZr0IdwOUwdMSbreT8PLgIOkuOcL/opOrt5soRTNM7ei0vD5pIRgF/moQTDti+3pcWHa3sIFLdkiEsAkU6Txjh2A10wrp/mTNonP8gG7sDkFFRRJIyMW3b1LZdNzPAroqqDKoe3hTpghZtuHdTLyEBb6205/fCYdJWDj4lEIB6/tV+fm81Xhr/aLSgTPt/ULqV95/lU7RcGHSUmKGtFnGTnJmPo5IT+1c1oSiPi9wDjnXfVxSgLpzRiTOopbyQD4Vxvi763/opGJna7HMms7cHTubIsKidSUR7szfHexC0OXAFqm4uvTEYIu8XDjVM/WO+X5RjkivdxhgGsjZkiSW0sLD/MbKZOO4KUEXmHwRGLBMihIDr3ZBIP2WyeNAktRtI/Mg2kXL5Gxr1Zmum4kHJsusjTQwodIi88Yu+ADv2Uq/7Vcgl3nodmYm1SEPaOvumTkSR9foG7p79CjP71WM+RsCCNKLTHY9nQeeG7q31D8GluRDTyoDleppApKYE6l8RnxQcJrhWUzM+sfWbbvvgxUf992ZDbHEeZBZbR7yVpeGMYz6iNDyy8FWYO0n2qcUm2+Huu4rVXEW/oJpN7Tq2P37egD3hi+dy5LPijTwI+roNpGrI/z90Cp+bXnY2VQbsIWUEdEhuNQisUquchNG9eFK+iJ4AlWIgX2NN68lmbZfOi/x5ymGtKHb7qYpjtnZuSdlXDpkyt55RyoRqhAg9FykI4Tu5aT5GIKfz0kKpCyhAckWgfwLjb78KVQFre8E54zmkAB+r5vhecv/cihhPiSayuh88UGGipfQ09sUT9QyHwTcnbTeGKWk9IOn1aN3dVQbrDRIQn5zYQ8eR/1XmQRF4Ep7DvxKRDFKkWEsMvI56ALMiMA5F1aTGnW+O9/AsQbGq9MS6MH2PKHHnhYqN0+peIYY6R1xEsHIl8w7hB2uNuB/zNIF1zRgE6Z3JViPeU+4nnh6EO05d/CfAVC7LC3GqezDZIXPqAZkPubVTIRWvGDBNx3g6Eorxh2IbtR3xgEpkYE0Z6Q4MAcBWhJP1SSgnmHO17EJZy2Om/gG6XmUTwSAua4k6w0Zfh9CWih0SjLlkk+LgoncxuPAjurCedYuZghRqo0oRe90nHIJDekyC2czbFsGZryFMxYdjjWYHkjsfAEy+dV7CIEpM1XWRUEbS87GHdoIwsojNP0+auHZshEb709/1b35Qg0Rm0j6FeQTJ4ZFuj72TnrmN5BtL0182CVCZAIH3z2bM2tbCuQp2eEc+4qin7XcLavoySZyISaAi1mSSmn5pk8YaRo0+Y9RXF6Q7DMAzLGu6RNpOCGIfp694hvNE7uLWL1kk2R2Muj4Noc8qefsJEPqekERZIfPQMYc9rn9lr1hsB9x3CzwdVTErpCoeqCZydBrT50HLnORXdhmV16a0/nX4dn2lTjIvHs+GUSJiSbA6XI+ByHuqum9tYxnE9ydJ7gDQFOqVX8eNuLp0njJURztjTuLs2J3G13lveErY8Q7a9qIpdPUj0veW27SNcEjgtuVxvZAi9gjGL7NPxWhWdaR1zcE6h535TCLeBuCfwsTAqFaH7kD47ZqCPUt9GnofyLnPkysoALUzlAORXi+RmtgyOo9swWhbw2TaNU6gFeFa71e4tOv6zoWMj+uj8uDLeEUlx+pQuyaKfM8kSjgJH8gvCE5w1PeeA3Q8qLnxr0PrR9kQVcQcR9a6hMsZbeLwcu8nZAROpBYCIhiJCXm14LJod2RiijA8RDSGXwDTmbsVPhu69JVVbB+6wgBH1k6sUz2gCDgWubgU6jVjFEtuhFx0wK/hmmCCht7NyB6N4iq6UUp1ZDxEHgwSi31eBxVZAkzjZWH9mA+bPtgPCsFekY5PO2bxaneuK2m7H4BnzJoa2owUpAKgWTSsdqXzqPqFmMGcn51wI1lpFoPbX90jL9ET1QacQNyoaSGzyh18V+NwoUKuyA/tI81E/wlw2/noqd5rb4NYFPM2qxcM73nq2deJ0FdgDtTOuSxDokoQpK7dd6eeDaZ481jO7vDDuP6YzWeIQn9yQGCeuE5cukPHJJz0hxdPhxlZx8pvdNCcW8wtel8lqUYee01xcKv+DwhjFEF59TumrS5lhAKHhkis03obgnGQjdCi04KHNRdqEY9oChVGrOZKOIqTO15uprk2BihO5KyN9NvLbRDIe9297lcI0bwlGMb1bJawSEHTKGpYKwQT2l5BTRwpCR4pUuNXQVgmp3JZnpkWl1ksjRdyeavSGiJ9tRxWILj/y3beEp6NdS+1mqo+ZwlrtelT2OSg3kE1flbQW/5U/QT4t8fHs2MlgAWmglChJtUwgMgaOw8Yv2fvpsQEkiAADrCas2c19lnke7bOoiOrkl+COUM885WGxu2C/wds6mKUJWuIjBb+FLvDYKx4msp4MT/36HRvfTj+pyMzvdjG20SY9bICHy+uDX5pMeoyIJv5rSxsLxqi+V2f00LiineInKX63QGewX5Gpysv1gg6SMRJpm0C8oVwalNcQtIdOsH5ZNYjQbyv7DH02OgPHnaP9ykOVVdEadFSPJPmQObO2bDSm/3Rqk0zIOjv0RhkFAAXJ0fZmfQrSCtPGLE2diW/wAVw12QdgYz3zTwkfVKIE4fyMzhG13aw+ApQL7avsW4UmpYvL+2d+tdagHrCbdVpVDYZhGMZEdo6JyKBlzPQeEg7VGpUFbu57sq9WIKF1U5vNW1d4CNuiBRteopiv5Dt03gFwFzXA7YRjlnNuFtqFH73QjEkWahVnoaoklFpz4UbeHl1/rzypoOw5gV2yIzhzZ4XqAw/Ee1QgkulwJdeXDUcUF0r0jAdsXaLfm8ivXEIEWMn3+1hXKLxfddUiZ4z7LRQ5OCCHeZI9KsTDv2PAKHTElpU50fTMF8hDLzCTDYmpeGD4k35wGjzEdPvGCbGCbzl4dAwrBqxqjb3kV6vRB02+AHcKeswLp3RTlTRibQyK10EVt9TovuzuxFNaLGh210OyLJwPmv10dVdojziXvrgfBckKu54jWboiF/9Nvl0U7TMOaLH7sIgUtxCXQpTDcYihygj4ZKrXb6LwMdQmB02tssdUqVE5c68tjEuAxS5VJHPd0ie7Mn6i94LlwOQAE360e7hHwItmjeoZUQNbtrlyMnAnPRXmkTlt39kGhbwmph+vU9zfkTtcjdGlC7xiUtF8dKmIhBB6AVYH0ImXqaiBkl351KHKAuGd8GqsJZL4aZe9QnZTTCrTA864hTA0gysYB8wWcGM73D55gVL2yskHUv+GUsEZcADcchhzZYaGy48BRIvc+tXDWpcKzBC4R3mxKjVDYaOJsPxMx+ltCTcxVXmPHZvUwjdzI7rKPeCMMSY3Kwkt6rohD+DFzmksALM4fr8po2cA/6nzZQUiH++DJSwT+VANbuHRvOlHUrsNWfmdDvR+Z6Fr12c7QcJFVu3Pxdr0S+suqOLHCBIrO8agzjIZ0J4EYp/cq5J4meEFIPQrY5tgQ+mf2iMCxYqxe0uB48zQ8t06XW9hX9cmCIFIIsIYEhbodTZWV/8yqzIAhPzBRUnoM2nXUCfDaBXqJv1LeOmOSSRb4T1PSNpjjw4NWc3tIN62FlPcCiv3Y3cZoJYH4iOYR/Un1N2evcPISEZthGPNAb8vfAiNgygpJFiZ2TTa/HBQ7KldqqhZoVxB/2JHdo2Xz5PclE6b+X0Izhw4M26AW4LvOXA4p+FKqlmTP/PENG5nkKr1R3Ra+CZ8M9q9fKugvcdENbYGNmsiDqzQkJNRIjwhOgUbaaQnDdVWZvCR2jtl7WFvhTmIlSW33QNf2Sh7TkOa3gyD0OVB/y6dkqobfz940lzZIy+8i5wfGxqf30rWFCQBIbGVzMd62G68g21TfHXc8mvcabvHa9VOqrKuy3uVdX+1Iyeg8d2QQ1Lkd/3A3SBSJIyjwfEBdC2cFdD4n/Pb2u2GqQVH4nvTnYLyYPwdpFMnZkfP1F+iobx5m0d/vTxpdjw0vWEU6YfUdDB51h4bEeyd+hcvFUM+Qd1JUA3AFHe5VtEOnqbaAQzDMIwUzrfe6R8zbeQGwMJYxclCfZSJoahI72o+YDCO3prui91AKXXkN3dEse0jx5cORt6JJtmt/EoabMKW7SOVjqWQJwwtXkSVcoBZxnZBVx75rvesllPIUIo5mHKKNAsZOEc3SAQPJU/CAeeTSdqvXn7vyvWo1e0cLx3GKFdNA+w/rYmozpL0cLae3WGU6sv81tGftybVuqPESWzxerRLSW6nCML4vYwGwP79qMVAK0mw/A1DyyRo0IQM2OWGZWypm50yvHqEms3g1MyHqwq709uLAZ+zY7nOSgZ2ewaUYAtSKVgji74vgmRcgab+llkKavqan8ZxNK8HHYcGWmXj4URUz8Qmmv5cmdIobXRJxu2HJgFP9NpuCXJNEkJiGBI0c028F7FspemlzZBtUqGvxPNzyk0j4yvfgXqFnEpJWR3/oPqLdG/xzTIricai9ymdtrer8iAEvkAg5Zf0q7NwgObLwRaHiZD3Ap5VsxSefbLDvNiaLmcrFTGouyEZIXwGLCYLyZxpsRT7A1wy7HwtdBtXd14WbAyUaE15320qyw8U14Euby53KuIJdriCq48L6p+ixG7fGJ7GnvOwKsUE/xobufEXs30RaZAnVuxunnUTRod95NtY4MFQwMbJ6pEC6/S9zW/zzTFHUYTZK4Cbc2rCE9lKjNKdrpuO2p6YN8hznM/4lMcwZ4FAqEOp+oE5J5BJM0otvc+EryvNQliF6VWk171AKDkxnA9Nv7wRv/FcAsz4hP3kp2fbBj7XfoNXS2TuQpJAJri1YIi9gYR30ESUXouElNAqHdsnFk3Hj9W/2sX0DVceg2HBUhvTQdxkkYhodMC1AYjHlS6pW+hxJ0gzCG7qs4b7U+xw4ELQkfb6ZuZMYIKrc5QYqaOU/OcQvVx3Ch0lP7YFyqRjVXybdmS6nTp5HAk0JwLaQ0Pl2CjzZ6UEv9laXUmqyBLCisL+lYMzbB2wc6skuAOmoNnYyOH0no3DxGsDbqRdrLdaUEtHZW7s4klCEgO+16gRt6LIXrhZTpZKFYSpDn5BCDKWiiKugwMkryaL7MIUkGA0Xff63tOv10SRQxSLYgc5C772HqXcNg9ExRx4SrUosLFLXyc85HIKvbpKmMWyl4sI831L77N1gyZNCOLJfoymSSyyXOUGe20kFm86qkZ14vGQ8gSpmV4h8clgOwj9PYDVRDHMicEo9nI+3y21nH8ReexCTidl5GzvUsmD3Pq/Jp4Wjy7X77U+fq72WJO5y5+lupEYcJsKPB1ClTmQhU+vwP2s9U2n9lBfpMcOdKIOL5/90eZYlplCfO/eChrM5cWuwz0V+1R5PRwvgLIRBJimISpdmZien7xbvOwFST5OlJOIaMMwDMOi7I+LyAZvdXVQg3yR88JJC2mHemDsVz+qUjXq+fNSjHkuLs1v4GqoRlpPO2ZCfO4EjvijcbI5WZwD5VQoz5cdsp1pqNvCi6AT7kGupHMP6ggtceuGYD10G9oS39c8JjEdMqJnwEjHq2Udv+oJmPC1kyc9kHqx7cgyOQaFLQRrPuFdBZEME0Eelql8i/7hcVPUWdOVoQYRwSzQzuiAz6wnnF1LcvMivzI7bntkjLM9MCiuYzku4Aa1N1qgIy9PDe110YYhPrN0Gx10EjdpT9uDw90WFAogxnTC7iywNUbD5pESO6aXeHP6DudeVY6+a6VMMuFxn0goNzKddB9GUEFymPJ82bX3FP13wy6zFbkkdk6GnC5Q34A3EnofGGgjf5liM/YAjc209JdgTWwLZg1CchJE66k45Go9JfDDZsjp0ux7JJEmpj6fUJPC+NMjjRWUM1lINk0PPXVgv2I5HuYsCXu9BsoFXNZOXUlLJSdUom+c6cFkQOjvB9CukQbIl4QNcYaytZAPU5oeaViqhhIha5ddCBO++0qoD98+6SDzmvXuhdTfmWKthEwcBgmOoMfGj3nRcWtWI6YhszZGh40FSn1UdtsxXWB5lec4KUQ6WPXYu80tPD0d9TfJwwyTFeBgK1JMyWFyiXLU8aa76fGDYn13zCav6Ji/mWv6TjLveEXdwINM+PNSjFKXvenaQ/c3ldBc3ax5TGJsF+Ji98lzeKPkkC0Dn1mPE9m4LThD2hxuqCAOaYyGzbVTVUfN2APkyZxme3Ijf5k0SM9NoslYlo0Uzt87HuYsXtmTz+Dp5OUy+xrAOMi8ZikNaz97wlEEsO4LxEWyAhyEe/ozjuDNXpZS8uu+T57DtVFQ9aD8nKkso0KkAE8nLz1dQTy6MTV6u7n2NMzG1OhBEKqJrxML5DeprkNfvPqLlrIcxz9E+vX6OzXvMua01gRT35nHY5R4RHJQwSuNEl1hIKodKF79BRw7pGvcBUWrWhzIIjxnDa5k7Px+woGkhB7RxCWn5/Ds/JGAylRGWz8z6jk8W8E52Uo8GGKjipxigciIhT/mtNZcGla1Lnl418XrSW6putev9wjnmFmbv/t87hz9JAmi9YAq/c6Z+vIAmxpZzKvJsehXZ7g6nvch162kl3KJNUp05SCPrE/aJOTXCiwHf3aakiCA2pVF4g7SRpQbtLgwe1eZhQlduMUqZmA51u/ZylmdZCdhc9SLRtn38aukrwuKVg0p0wwV+JpDEhTh72fLvyugCXI+Qvk4aNDQY5DIEZpqf9p1aFpAWr7BedBCZATEJ+KvLKQB9qvwG3okqsADSQn9cFtvb8uMPThtovZRd/S7r3leIdqoiWvpgzgSgxiGYRjJPV7HV5BkUXY9tPlU+omsDKO0EEbRVkk+JEUv1add07vPfqrABS7dZUNIcR1nQBlnhgN+SvB6QsgT+7O9Q/GC0E6Vl8VomfeTimaHjrhgOEDPKglktYPhJ+JbNeMkvE2nh1slnTmB81rN48rwuSzjmj5y9hc4Plj/wsWa10hQNc2Y37hfSVVSdGItEfklLGkibNvBKbtqPj97c3WMQ+TaBleagfPOqGcpZ57O/OHNCKzRxv3mnkLVWaWwJLR2+/z3jpB8XPATyjKUIcFzffuPJpT32TNVVkV4YKrGZKv6tg+rVRBCzeaq8r+P/LU/Cp3B7GqVe5BFCYUTtFsoSh5tthq7evA5/0NkBHaKd3XCrpFMfj+ZtbOXhqQwpFCwxQhMJb8hn9miFaP8Ps2t2HgYLohjI2gvYNL0EhD9b9/IOPT6RXrCToFAeJUifq0rGG+dl/pWofq1wKnDwHH5xaTHsXTieAszoR5XUQAI85tYwtjYomekKt8+SA/1TnqOYHTNtZVm+FjrnBdaEN8OTCpdy9tpM6D8Vupptf1HJxo0YBkA2TR/za/G60miHtNP9Thvh0QjJO4TcLu5S+Ny0X80TvfJ4OlFybknxLLKZganf9uq5ynIr4riqpBYgPzJM37bAPhAuZuOnSH+GR/B0A22IMC6uSx5vbfoYptWjpZ/8ZNwdJM2aFweE5/LXR/W1iQM2+7tHvyEpjYFQ09DGBS8eA6wssqjs7nMs4hcso1aIDBUWXqVSKvDwW/+5K3ivk6yZJm4kRFkooTaZrk5p6IH23LzIPVIzdKHFHbDFGg+JQyrNc1P9DsC7wZVgwNaLmkjiF4LhEIAtCvuI0iah3tTUUReFH3WFUaJ762339qx7lWF+oXQHYAI5TkgSlqHT2iftzUVyIvoL6FkmhQSdMyu/3D3Wp/NeVpVnLUUaNTLF/e9p9EVxOHbNqwDXMD4YrbooqZczcBcqzmf2Fu+BXX2GQ4+kMVaqLQh+difiBZQ+2C562Y0D1dDxpuTWR5zrQNnaUGXPPHgbJzFr4Exz9zxxPP2zFSeq1xkXmn1k+0co4+DJLOkRzbcAHy5xuKXcPbxlqtHb2XgEAcO1kiOi238XpTxpqdF4sdvVbm1UYRaYcCwN+X/xAxG1G4qcDygWxULqDiwVyCc71hPw+7H/gI9QTTh50UXrNQX0LnsxqeQiAMU8MppoZ250Ln5HPoLRxFCny/KM8ib0wyhtLg2EuzjVuK4AlCeFg2De053smwqqOu3xe+QgrSPjVbJOU/kZwS3JdF8Vjsgl2nNjwKHXAUKkxmuaNbFuuXwISEjEEar8x0zMhbrcYfI0VBNsFQsOcO4jHgXV6spZQF/vOWrNvwxDMMwjMxlfcG3pnsxQwZETqFu5iN9lL6zCkwdTWiLS2AJsITxtED2DxK3ZWKEFdhy7o6nTJ8MsKHNHaRx8Cvb7jMtKFPixijLhIrKLd7I3pDrz3VIF9xOb7ejlJJmeQwLffx9rI1ONuUeXjYJsmkMbkBFrROAPdOLe2dVbUngAoT5Qd5YCXXAv1sdFozgwA63If+yeUJqmYN6+NWzHdVJ/bQS4QadZfg2y503eyfZHOENSUAw1Dg8frqfActPcORSle5x4KK1J4qZ/MmA2sH555mdHzzdwpWkYmWp0gkD9QZbpTuLRu6V/M1UIiSL3ayvHgsFzX2/8jAuuugy/Vd1e8xlfcG+kVWjxYun+6wXBj6iwxcU5SjaGurEVKzCcHqK9TIXlUzr50DTvNNEtUF3SjwxpeZiTkv4VeM133xL3w0fN0c8eYwLLUJhwIlfwMqvGRlJubSipHguRqhwWW1gZqTd9dP2uRuAiXft6cSvTyiO61kHqeTRGJJ0DLnOmDSZnlnrijCEi1vqwUtb3irCVQBWCfhaMjPrvrihw4AkaBZKr7ol7pM/OxQy/p0KTeezTgF9rsDYkWxyXpVsDnYZcui/mciGxqPOIRpR9pihcDP6gMEZQb9tF8xSoqW690yG0aXghHg0AU2n6YVIkebJR4jug+8WWn3w8USL0QicOoK2pnsxmF2+J6C9P4DsCyJO8f77xVYNINE9XlLx4fJishU1eX1/4Rxjk5pWhRfc0JK86IA+EBWiQMC1m8u+ZeFHg66FUfbPhY4aGJGvAuFA2uolE7gfichLDqSk4Nxtsc/xj7FGhTo0vgY5wfby1x0Ll2ZGdrRjXSNstE9jgh5AcClHLI745OrLGLk/lT8PAPvNVVFHFEpadUejsFLqhQndI4wcBmJma3qBAUl3COwhX1Oy3cr47mJgPwhIn+xUBmlExfjGnFf9ApXKM20mZUlg1Wcso59hhbZ9sxCmdQ8rL2NxmjvRaz0V1Z8xku8x6EItGy5TQr8kPR0KZKB3t5h9OIcMiByVPUG58jRIuQZgWKQ0m+z1i1PR20dP36jVbxojqm+jxuaZOH/4gwl4VgLz1E56eKvqiLKulRv5qU237dYJopo+Z3gwJfcN2sYLaHfIpDUqenSQjiLYIHiJprydBTf4OnSKmvA7wMg7PzXlL4MSz/+Jnhhkad++RWIteVg0yIqdXLNxHDES68QaxL5KJL5fJ1Zr1CoM15kTj7drqKRm9du43WQAx73KYVhuEWpDUgNws7D4K08RJgVmW3evVXkW7g/SHUmqKsTRKuDEdLPLdRN5vh9PCuQRDHayc3oaRiT8qcvVhkpMtj7dZPiQPu9tEtqpQwWmWGA0ktm9NhDpMAzDcNgtlePWzEr3avAOEHaylrFJk4/RhXtMfyX86/A3dxYShRQfW++7Ygf4kWQm2KOb7L/s7EvMpFEDbntBTB0prGpCCx7gXpz5dbndbl8UvZlPquWVgOGiaflfgd/qGp01ypyC24Q24aEAViSQimU/oJmX2bKdnZcU7VGqoVYXXrvttrM+8dAspIKPpWAgjnYsaYpJkTLacH6wHh1HrBzbpXZRf29OA7B9eEWNrwGJy3HaUU1KwGTIsjEBUQIzm9kBTVRGHBSiTnm0S6tCiAa9CEReMFAGOmRWFD5Bg0nMFHT8BerP76rHthfVbwUXfafdd+Acj6UE27OHrVUIu8pFsaEVogEjXigHPVOXuvZFObez7adtDAC8PXXLHmbTikRTmPoksxVKaxMWBU+I/n7uc1ViFhMMJt+6/pB8CbX790D2MltvZpQtaxQrkneNL7j3ZMcUBAI5OaVOPeaZ+R7W5ZXm2YSMpnkPSSUFr3R9U16P1I8zjFI7NHfugGA1zR8T/Vj8tLLT4FFgx01+ZCGQK7EBbzey4eLmZgITVQAEuOo1KSTXpYzB9JYzyZUPM8uPp9+qz4EVAk6MIZkiDoe7TXAFhNkyUAhIxpZ419AfLkLoB//aQMOt0KYZ+uoSNSP0TjYiE6AiVlEZQH8AFYdawqWGKQwxJ7kbmKB+sc5rZDghFhyPUIjLgUw8IDClcKSQSvTLWihRP15fcZSz+kVZyJQMBlHGj0QfwpEiIl4gVoxSm5f65VditoegnP425TnMYJkjgkrOitCw6gQI+8PyKXP+61bMHddmv+emGemhrGxf9ShW2TvSAx2ZyQZxWusqitvX1voRj1MgGoGgp2rVzN5BpMsSSKyygxK8Rvd8f5rJCuYNJvxyYYQ8hfSnvZW+NqrlSeDMVs4cT9J1mxtHvrOMvh+ZRTQEyvsk5JjRl2PVmrbY0moArbDE5am6LVXFQQpo23VisdjBdRduLDs7eacUTuSFFWTd3m9SK6gpDwn/VS4qGYea3v1pdV2x+smpSTa5RSVjjwrO1Ec+5lQ9rqOj66RGZYrGdJT7Pp0ZeICzRDinuCRPSjF4twTvyv6+PMgJQf3l+bhqqelhFzgyU6hP6Xz1Fai8ZeEqEOam6OYn16+VNC87eBtIxQuzWMWymyFO89hOfK8aU7AWQ3ttj6ZJWpjHW9fI9N+2AiYx2/BMs5ZE8uoIU+Uy/V5jv+BxKOEJbJdc0KjXqXDhWqpE8D9kjje0sI595pbwYesjwWdtBhrOCacqQBY+0fv2dfMlncStAJBZ5nQJrHTV969gUFlFfo68n8bMML34yA8PqxxaATz7vCIPXREw54OoctfjezaXhngDJ9J9bEcTm7a0lK/QCPBpB6AeG3A3onCVW7AcSwABttpCKkqQv05FZvcD+LxTNHpBS9GuEutqyX3isMhYZKxxOgz86MeFM/7O/Wnk47eGJ6ffGiuvs/9vzdferP9vPftcWC8AGhp8tp/tO7Wl6Oltu4+rGDAe++63yvf5+FVsh5vfGuNte/i18T3t+QlzHyT8b2s7u7dK+p7yxgy5lCcTRckRuh4EHehuQzPqWVosxuwUC/IAYR4gMBdapA9gm4DgfHzwDfC9syYg+Lbrn7EADyj4DGiYgdOV0vuIzDm14ZPCCY+ETNbP/4f2EIkZRhIYPzP+Brm6yd669N6U8VaWlcJsEOvcUJPKk4sqnmgql+Z83Y+DTVnoRxjjZRaVfx5I3a3Wqvz1pY5HI3aVyjdX9+rRulx5VcYrLSsn/g7mdWtrqfz3oYqXaCoPfvF1R442RUbUEUI8b1E5WJC6rcaqfLup4/GIQ6UxcXXvdtblxlkZr7KsnPnPoK0r1VJ58a6KZzWVvTu+7o8nm7LyMsIsXm5R+fSH1N3bWpUL/9Tx/y6ZFEni1O1gYMiSUiacyg4dmK9gVX4VlnW/Dup4y8FUlvoRp8pSkOJlXN2Hq6ry4cG63HGaujutMt49X859WVbOPdvEo0FfVzuN0Fdq31J5k1rUvXlUxftNyrVXTeXaxipeyded+lRXTv21KRtmxKJuYz1CEe+HK18+LCpf9tbxElL36E1ZefTLqhxbWdYdO6rjzbbj7pssJ9rFv6upVFENX8l4BCsXO1LpVOoi6sOpMrAt1dzTW9KX5GwnYFnKsyxtasvvKKno0m4oquUrmRvByuiWVDprdQm2h9MVDMqWaua+ZMmyVda7/qx3/l+96tzUd2s2irubcbJ4+ZQer/rtpp61EQg7GV7e+o/1y+MMfqz5rcbskOrxhfabrBo0dWa09Hw/l7Ou1A9zht77CUzPDMX6wv73fxsML3lwztpcyN5rXKMF2u0+wed7pMrec581sMLCh+PmNo4zmzLLcrAeF4JQqJ0ujE79cA2pwrmRP1hks5ze56Oaxa4JN9zbV68j1CI+oB2kiueZ/E57J3OKGzE2w21buyJ0BwmlgyQ9H5FVQuoFBmM5bqeAsixOWRBEexCFBVHvx47B/xfEhBQTdPzAjjH8C6ORwwyfqZFEmdlDBTHzgUmss3jKRJflF58Ys/GsE1gAAKAIhBFXNd0AuIRoGaTRzBrLuC2w5wc6pwXYqTcWhtBhFhcId6UJVe6AeSZ03QEfyCm63V0BxKkczLpOHCHlACrXFKgIV0dGYpNMxAJXbhcJ2P4gDQc3yIAzdtCEyxygTKLcb1K0QRCpGLtA5jrciQ0mUaIhCY/c+Rr+hvfPruV5W9oBNXRQN+4ov2FdnQjWHwFiD3Ae4A0ItTPgKgAzgGYs2dbTaFTcBy+TfdXDrpQ7GKdelR5VrzNwtWn85Jovs49b+Q4MxrnAfpfBjPB0BFPyEFrqFq2v4jyzlp+JzKxu9gbRfuXmcErnDM4kHodAy987Ktn06nnjv+N+B4/1eelux7rMrfKc1P4/ArJk10fj29qNSKlPz4miH9/Nk6cRrbfK1UzMIBvnLZaXO63Mkr/Wx70KtD5ujYxmdWa0yIXW1UVpcn7oOvof9N50S7oOtdd5zYdONbbWh6zJ9ZwzbKfJN3VH5o6W0+tL+fbfsnfZOs/mFwWqgjC3Bjgsayh8H0kxI4PF0SkET0UF0rnp3LTSGSPgTx/U4LJBDd47mUEzLymPgv2UE+97c2wPWWj96Y+ZeWmjRmUPqvWvDjP349Xyx0U3arTtnZr5W69mVj1yye5myGxcSl7aZ0kVJ3nuu0l8NevUvcomV1GT8/6xM/k4R6h33b48AcimnFD93dcEIvQ35VQ2z0bW57+sV/fcDHmUzfMsKzykUvjqlymykS/m6AIW3nH41dhrQD6yMhh3A4QA5MCY7hg0AqZ9DsyAfQuwfIOJLZSm/QJ7tzbA/gHQNJQa+k9pAgyJkN2klRU9UX0mGJIgzzOULM5L7OMF4Ez7D7HZYl+CiXlhItcz1eeWzRZ8H8xon2D0r59q3Bdg2pTsokMvgCTpnPRXFXllZqmYLp/U3MN405zkiJllz8xzwcytnxzjoxuAbJ8q/TuCCisv5CALEbpK1LDaGXJ2ynmnUhpqWP1ql/0m9EVA/tDVRLX5oNqUp5x7upqo2erOLJ+yWVZ0Ncm30n3PXsrvKedZ1sfL0urNlLtTzrm86mVTTmVTlqec63tlWb/a6PMm61PLq0JWrB4VOT7lfMmKbGTFf/sYoES5Fg0SclsjU8mWrWhLpa2ItKUq96IlgdYjVqKxlctATStRYumUW9EQS7sSAiWgopEyXwnbVFbKnWjogrY1MpRot5erQK2tdEIp0IkGX9J+Q7lkx6XojMpa8tKVWQVRCMoCCdug3JfKCW/Wboa1pLZ7t1AswltuyWMHAaeTnLLYhBt4cb0qKhsW0K4K/xXRy9vAzHa5A1uAu3FY2svHCdX5AVmiGe0fOvy9J53azDBiUUuE+s8G7jxDVcLSG3U1sIZ1jPXt1ddBY1uG7/77D47RbDCgRgfYpUtlSYlQ/8jkrPw/0hSXl/4W/7dX9vkQXWDac3tUDTsToVF2w/Pq+0McfXh1B/72A4OcdvF35duT1a/9trbx27CvCAvAEdDXIOhH27P32pTyDK8an38/LjMUNPhr6b9aaP6ze2IblyMW/cml9oeex/cHBrgdY39ILz/Xm7BFcsomytXAieLZv4RvX+q4SoRetz54NxDQn0dfJCBxk496d71WMX0uxk05pvRou9ivXmOUShxE+DmJb8/Fd1p3nrlW4UxIUduplCn5dgorqwyLyF+YDEsmuL42LWe3sIK+E6wbJzfdgkPM5uTv9vFcEtB2+1DVImhg3yb7eCITLfcWVpguysW29+FbmZadWhiIypTvyEJOIk6sm0xf1x0Wp3QkTxwUM6YTLMi2pEmk3g/CH7Ac2jenSjlGG+F7eZZ2SLBkLOeYhaYDyZgkmuBrBobBLTjPcDndCXwJ6D/Jit6Zap5tzlsG8xJP5xThwJzbVDNjmN6FnjxDTGi2hI4x7EAdTtjVGTYTNys9P+KLXJlJuuzyKBRhkNO8hpJGJ9g0dbTbvPYSrqXh3Ex8nRvykbMrPFn3wj1xCgCkIsNEztVvFKXm5iz4npB8SbTuooLr/XjkRPwCLsQIx5XKXkxgVD+PD9twTsqI4LcAx2nk725hshl66PZsYn05a66UD8rpuxMKO0X3BFaY56InAUdn+JxZN6/3jX/jQ5VcyfMy1TT1v/CFecY7Zs6rqhTGQtiLpwDu5sPtEeJmviU5wLmvXiFZyk64YrTp+D6clQ/9TDzeq3gsFxbC707oQJ0ja+08qSQq60InWi6N9OHgy1lYnoZgXvNykrOpDuZ0lJ9Z6VD36BluUL4NsbUWViZIdYrtHPQbHNFa863QEcA9nCjdpGlWMhWWcHTnzx+anTWdzBebjYcO3SzV0tzWwphiThlA/RY3wonFp3fCXJnfbqzkbhPYIueKS6qJk5WePwhm+is5yerXTwVyayphVvr+sqlfQXfy1K6znYRiPhvKBXSqq3w5eYtFS63yoX2iHdU5Jzg7CNqT+Mh5alj5DCuGZB1xnSShWct5/1DXYR6rjUcx/lSBlZwq4YaGdNkJDLMQNBgL3nHoLlmm9tFDJt7YV8mV++Fa54SWkVwdh7qh4NxiIEFHSrAEbtQzcIdwZDijLIYeNUkj9YLWwe88SbSX/WpnGdyC2OU9LS42wzyiMif4DidEZ3IKOFWaBl7ZEQcttml/7gqry7DTmRiKujbqXmtrSz+M73ujQFmyU6p4JhDGpyfklV1mlcmliFRZfM8J0FT4S7RyGLyRr0JlOLvQzTHqoOyi1bQJzLqsJAN0bApFUM4QoJBqVVrUvaMrCHM93RhozsMiL9qZOQ1ry7W078NePxJDQ5sXJjgNubPHgiXPVNKfrwTqV7ahTMpIsK2rBpXuQ7niQk/Seao/Nci4by9nuZU9f8W0xOVytW/ceuwqLA71G30Rqnn5bjjshaNion6E3L0y2rPC8SWGJ3HQsY30kidv3q8AU1ElCgntgsqlHFkDmUaqBBY88W1udC4Ck77tmSJSFzC3SYFYYLx71a6wiEh5WvM7o9Jr23F3SEPjTOtk8bf4ZSbhNo/wvcy7ENZvHbbKY+FJIxj45S8ImpcaYr9cKdfj7kJiclr1H+CruY+SW0C/VAe7hP6g4pdYSHkWfoS03vxpV+BbK3Ygnq+XfjpmM0t1fb6vhxH5sc6Iad0qN3HDvwR1uNXdchNc4rfJkyibO/d/tf4v1wIQ7Qt7tMX+Z1rkyZ/mMED/Ndtf78H5fS1OtrHg8fOskv+rnk6XeifJ+JsMh891ca7Hf10v3D3Bfz9fP/LOMvxA1+6bF1++l/8/rsaPx57TnLy/2Ukez+3qOUXgZPq79hJW0bgfX9+27rI2q1f32Xz+/dlHPx3D5ZzSey+pDptd+r+BYf1PAiTfUrL/H/Wf6HF/euv9P7/pS+M4kBCCHh75/vMvALj/4yDPCHjV9Ay4wJ36eQVnLE+I5kT2GTitAhUwlQkpgQjo0RgoejLY8ygssJD/wPEAzUtXC7C9vud/wFPPf9VxFCj7fGKSnKj3626XzY94xJLdWY/gtHilwheXHTRY5ESnYlxIZdn0cm1Xfnk6+ek6ZJ8aC4I41OTb5g6Y64R54kOGUCP5jl4XfKuP7HEounUhbKwE0d804hAD6We+8JH0txUEl4gg/fj3HOYMXS0PojwLsrYpaQh/uJB/CIbD4MovsuEkRUgWxsPQK8XyLIc8LQFgzd16SFs0BYEcnwTCHdDAGgKHHH/7e0lc01quUHzJpjJMaCujbVVHtS1bYuJaCA0s96hTWMjnIpMaBklbPJTsI25nWir0WrFhAgy3fF1BrHtQdH8MErsTT4HBEdLDe7hnfU780uSG0z7UMURD54gHL1gKxr6R/eg/hFfHVbzhzLfqYOBW0PzxifpG3gNyDgu6+k/jOUCsHD/y9xHb/PlUPpfUL8o7/P1m/ssn9vwK+6TPZ4rRTZp7+cBEvqORkxCaBWvk8syEwaORH6pMmL9DGF/8mtWaGnO+JuNdvkdXrIhxK8IzkBKiQqcw41T9R4noLnIqvh/oBa330TppC+zB0UI6j7RYrq919tLjCSuP2/Ndw4QX1ZNTgJGRFcUwn+mT4U3/i39Qcfrb1KqiJABjxY8Lp5K4b8/B0oblh8XAbzTB7osrkT8wkTbMkPz+Iw8ziudGGOWH3BPNhMhBXN03B73F7Omn4Wx7uT3tOPa0brTPIZ7+fKS8A+DKD64gyAdk9wyMA3me96UuoEDKa3PBDLLENw7bKg47tQ9b/m2b9QwRU33vAY8geHL8SEdhKT0d6b9UGOsqOAeKIF4LQo/Yf8o1/vqSsg5NqtKEKQ8YEAPpn4BDUYCal+fhyqTLVB/N/q7QMVX4NQj+JZlE1cvJ/7QRIhEijhkPVoyhF4WiJgSX2NfVXGkMh7loMIfG9mPMvUWrELAC5LaYeOC7g9F67P2SvKFPeJAJ1SBeMIu7Vng1O0sFDK56XTPsaoR1V0b2biVGZxHnU7RWoBdEi7qIdxa63F/QwubpNKYEDXuN+mg7S81UDcXnKK+Guli9L+96F/uHVhOtV6DuN08n01jWyy8WGsDd5PkyuXi1QHTcg8FgL/YYWxffWSKh6b37RwvuxMZPHChsfvCCk/m47w2ZnxcODKSGQKvjjZ8Wf9IxheB04CB63mzsxbvAawr2SBUDRgxUwC9NJmAgd75ba0AxdjcroRXThwWiIjqdhq499alH5/RtGMPWxF1m8KwzXUl9z33CRgx7qAt5k4E2wQrYIlpasZPCTU3jRLwXj5smIqXo5QRmJq82wd4idYJzk5+g06GsPwSmyCORJ5c9v/gHpE1wvfnRjlD6Ool07VprmReELy/XXpX/Qq/aiP0VQ8H0PzeL4ijHOhSfqtdnslamm9j7WCb15IILFSST8AyEFdiutZPjKcUFT/T8SfQlysrACi294eeS1DXk7X9HqGGp2ynI5gO5enL7Ox6Zn49E0pM2w6H7ZKAj91Gn6gihHPIF/VuI75Vyo9dvfA2iRqoTD+ClyXWAGoJcd0rvOW3i+rKEC8rIBAqBhBZvTBQmM7YwwH2+TnL4rRlDR6dKWfQIIuCuzWhZMmoI+otWFDPfmdlryMrFvJwy1ua0OjshJSWigYCQzhvGcx1dBdeQqRyWaQacOGfwEZbRpwWv2JpgX5iX678zivg6vXAtkyRnsG5LNLau++UgL+asiiEwoD0/0x1XnwI/sNX3CsQHaY2UzgIxwPjo93Bb1EaIlpiQ1X4f543tAst1aLu2a6gmmIrV/1yMU2tpA5+hjQy8Fq+XP7aTe7s28o12xvII0hHu3J5MfZLpW5BTNu4OWqdMoatkcMoNzBG7InqTf1gjRJr8uNhqj1mZQf7ZqWSQA+PR8rjZ9W9PX9m9ZiNonR+YIwk/vF6ybXcL1lS0DDUQdA+zIc2i3JECxZWm0e+Iz5GLoeVDc9xt28g4LDj7OAJsONpJvCt5bdy6bwPSFPQJjiTiXoXNB0UknAqXLLPnbA1xx+UV8YnjpIKoQLcX7+jJ1OO9f/vdM7j1kf/lFMUFOrqpUjC3P9JlAhbJ3wa3ivvaRuCbiAh+wr8lsobVL42RY30D6Ha9vN69gXlYymsoweXO3s8oJBPdV46Y+1U6IYczc/9thKGHLteWEMmwhGcYPi0SGaj8PNPazYm6Wo/CKfdJTTEtvco6KfpAR0i6Uy274mSZGHi0v6ai9iCcKqg/lFnqWTznrgZhdMzJo41K8gt89wI2nakBT1cBNiLJBQSOqc2USM7BC2rTOZGXsWCmpj6e548vNSrl1vBXy7K/BFdySSLfl4fj3pBbxV00U3Vp3BQvE5e66ATSOTWHSbW5YnBZXwvurpW9pOQ+3x2KhtI5ddwbm91Fg7kxxva4H4jdfDTXz7uiJ8LGB6lOldbKy2HvdzUecKUxiMHlxnSZwt9KQchg8THRwIVNYdjsRMCZI/AWjOfT3BF7CJllIPXvRULFlWqyqPelxsCFGCHc3DuPr8l5RNm8Kuv9P8crxSfqqFQKXEop/3xif3f/voZAazel3weruz8HM8Fa+gCrQXH7hahodfj3w76s8cYpyCTVXtTf9FPXRk12AsT2Yq7Zr/DqQfYYTX2EIuCI03R8fIFikWxaASQ00ZCKSoRYUMzccY3HdL0cSLy9+GbArQR1+af3v0+RN8DcsdVU8t317jqRFNzP+/GIh0O2BG3NZPDUTeo6E/GNStN8WrrBrYEcnmQrWv+GBiFrkizAa6Bf8PrABSDxXiAs7m74LyACCfLesCnN1P8y4np5WoaclMS/pGZGAKa32HXi3vJ4/c+ECWNG0wp22vpolg7hwSVTcQNWZqGY9kBhQaZQeJTpPFZBlQ2Ayx7Pc6sQhGphpJbxpqcgi98wfyIJM5IazhM1jXQIkUxMHWOyE9h63zpfPb88NYCSBANivG2dKNIbMndavbaS2B7mE3UEN2y0IgZqyqKACXowKxJMpi1D0rfjLQm7OcnnPLvCuyirmd7WjVIlv1s+fU0oTm16exXZK8Y3nGApvfkKlcUW0/QQPRjUG7NOQLRknidFlK6wcK+kT/z2IhtDaZvT3bMEoubFHnBg0ZvL+0ia7r2SGV8AhPURRVT8HdkLqEykFlR9CLU9Z8j80M1fXHAaUKTw3jQ+X1vTcbp3MEeWeua8Z6kStsSR6ebmJkQMjt96r6oscR28N8FAz2xTEQalTkB8Y5Md7FWyfERc8StPo5V4KJ7b3PEKiI2dY/i4ITz1pNlsb12rX0ZDf6cu7chLDl8kAlPQw5GfMvzZXsXIx4G1dPc0yDwaXoGp+rq0fRvCuJAM9GVpWVff6HQ/Cwpw+K6L5OB1OdGxz7b6DVVH99i6Jr4j1Wc9A1g5b6DvL9/8l5UIVDVENMkYNZa1Thh1PcVeSQSa3l4LHd96TWU1ulWQx1ZDTQPih0MLJNs9BXN+QuxnyUHfTK9SD3MSH7zF/ZLpSEXcLhHNrjmwOe5i1mmPdo0nnCvWeBowsERFQfGOXzK/Ar5fVF+AB/jGYgvnP2AlaXzp1WfCSOXPzzCo4F8pKUaguV62Tj0xh91Be2Cbz0VCA+RLxnIco3s2bmHDmkUtrvK3fS1f8DZqgmAmlyl8M5w2UHi5TlccM1HYFumH+dTCTMwm0dnlU9Zh3DkMzKOB96/0IT/R/PRlKUrOd1fZLzpr+ebDe/MCGeH7VXwUOczk+vtWFDWIBpIVOaV8q+aX/fUwM30JpNO+RUjOgQIt2Oqlznzd+X47SLq4raU0HzPEJ9vJmxM95+utQ955N4TFtDCLSTK5fR1x21gNi0XRutgVrQBw6q9Z2HHDy4lBXLF0cOLKADeu3TLQGffLazmAcgdvLgzqmJ1qw4mLZJMjAAWeTJbRcUP+pCCVySSaOqisAKeNSuEAI9jhU2Cl9bn3B5D0zIz3S4dPxJbBDELfyGKKk58MWxwqqvUox5WglJQ/+KLO4HysNekMb5WeaJW6K98Ae8m8c483xnGbUUmSvjeugqJ745IrNxnBJDuFVq5i5eQUBCI31n68OhQ4cZ3sYLTcvUPjgK2X6graMiNux+Nkx+1fvsXbClBxd3/90BOHc4Z/BTvaisBeYhplOQEk75kSQl1UJMpyW5cqU7WbsO9ILw/VbTLJEaXXzMHujeaTE0zYsJlsAGmOqWeZkNuNmqPpj3JW2tuwHNFOM5EOQqd7KiUx6GyKClXDxCnRElPGxWHsyPU4GJG42X8Ydrho0Zhnhupr69IFXZUXo+4pQ/XFLX63jxwMSpA1Zd05LqhbP5t1FMBeyG0vBN6b0+TJ0Rpu80g14kfLeXA73ys7lTLZO7JT3aUcjWI2RpVum6K/a/SikXgH0AlA2ztmrLKkjBKV88MOqF3doSlQQqJ24hPg3HU1TtjJPjF3t6kpM5Kt1HDQK++zBcxuYp+wJUJT5tAj3w0nqXorcqfGlbxWxo1zZh0fBjglEMLAT8y5ve+pLtb5EMOLaR+evHllzmnkVpmFM4KVcd15N98xe+FMjIrnCCmKMVmSt19GDEUqXTiCwlY7Q6lypBIl5yf6TFLj+w0oMtTEQKMnu8wb2ZM209OELWwkvUg6rCdakLdmUuIsB6WZxNtsKbrma1Oyt3MLwIg7gz0AV0o+ZzS5oV25M8a53Gk8yt8i2bXfwZnrpAc/4XYS8ysv0YhbyAp3U+JMRqQMP097Zwx3gVaWfGBl0RSmfBLZCSqmPxuPasnrP10FJBiRhyJfLD/Kn/UYsZ4VjUNbGYdQNg5u/ymAi+tF4OVmlUMMMuO7+0Ra86tz16/KGo+QDi6FubmbkPlTslgItHRLpLcf+MmAltx5ApJaQNl1UikOYmN+ECbibOIf9+46M99dVPwKKNfU+IruDgrFaPIbu7OYLeEwYOC6e/3vn5U7OMx6T4gSED12DL93CpBh2wc3IOM/4ISG5u1h26Z5t1TBCADhIq6UOb1EtQXv7K4h0/V5DhV7wsd59fh6zarbEBV4CumN/eqERd3cnNOl4vBh8SnNex6/gbys7r6D4oNnXZcfTjr7KYeovjlMCyWcqaEQvaaL6ybh2+PFPH9On7aq5CMpz9QIgbq9yiE6syTAU+Vmw5sJmidx3zgCx6cMvMe6mroLueQlAezHVSDs3D7MjS71z4VpvOIXjhzzzJ0KLdfrXzZd3xZzPO64lZgU3wbWzklF9Ijt04/FpLbBR2XJEpGeO9ALA+NDtLvvjyvYwftIRP3YWHwcX9TZPnlNV+6dXbR1vOd4wwNNrufImFQJlvJ5KuFfKaFk1a8liKFrg4+tgbb2m92eWJbimAJ9i3NtJL5Znn5iMRSAK1PrLX4oWl4MWF/aoLPvFVHMSgXWJ6tcKcEjuHNY7qvXy6w56srM4fksd/mZoyfhSp1FLXRTIuTdxUM8jsAtKpm3KtHXLZhBlDa+u3nQcDMaeWZ41zA+uLXHKZWVgOL55LQkUJSjNSW9+ZT3Z411EucxQ3wfwoah732a8NACsWe79SS1rlY8vP56Yh+1t0lJr1YEj3f/IQM7ZcMS6L237JBJhHMFiVBNzvZybqlggVsHiVGPw/ATVP+OLA789sTAAOkU4CcNwoFgPvGMcfgnzZqKO48OLI4trCGqhpMnKVvp+PWKtaUxuNHoSasxk8HqNh4/Q2rc5CuQtvHUEO9tIzdzFCN5ggpSmYnXFkmwSylVElmUnPrnurAUqRQ0OBMpudP/dbTyFeURTs4um3hcIkB5ya5P0ss0uouS+b2liFgP8zJGFenNoUDbKHSUfq4nmc5ktt5AjjjgE26bDM7+ckFTJaTj7jMVq9PvHuJJskfdMypyVzLOdOBJ4P+/gwnyD1gRuwnz3PExdy0SyhKmbv9fukHzs5DbVbC8FEG98nzS+4W9TrAkf0rPEFCQNKfksFTrsxmqTDel6VuGIs5abmaJOHxQ0MMT5T8MbErY2QzqdgT+nfhCW2KG92PhbiCfDKxueddYwTK2iIedlfKCClN/P8oAt2GVbA8xHMp9Hn4RgNx1cStwew+iUHFktwastQEoK18RQVbXYaAW66pa2VHxBK2ADXRw8YjbgcZqK7tlrBuu2T03vwKt0gbxiBuAvGoDuyVTtcJbE0oynjYwBuJongngLffmHZuZpqZWwck1Yd14A8huqRQv14RvZM0YXMBdi3ma+1r2ySuTsPj1OAN30cTTslhwLZrD6zPM6+MXwB6N2bAITZonZRl7F9fEhvz6kv2N7Q1vhyQQOy36uCFkIamKuebf1cCtpCXVaeS2va/JQYKky3VjL2GqawjtIQ+iD5Fb9aGJBFeaO9RZHbHHXZIrB+z0HUhBa7gBTbQOGTy4jlEwR+ydGPozr1AcuVqxjK3xwOq01DqyidlUNWruvawRA0oaCpxcegrnXS0VsFdFThr70GyUcTeSuK39CnGYziSRaOSD9IeFF+UnUk+C02iSJWEgY6P1lzKANSOpqOufnoh1SfV6T4ANMJ+BBMkggBXQZFaT5IqioDbwcRMLjsO0rXRXkViNzmQ3s7mkYH7AQbQw66l9RVI7gmri5A1fIO6/JuImW9E+l7HwMzxt7aJqeSF/kxULBOv/HIzuMqNnDxoU8yXy2++A5NRuJLRUCzAx4kyrXJ4iZco0fVKVPp+nNLyygG06NcL08akYN/l9UILOVYgHPJD3ZVkLHvsOpxe+79dZR5HEbpl5KSZPa9wU4Soq79H8o1ZpIpQ6iuhj8iNpvK86PNKAhLgT3P8qIGlGMAjMzNcb9kl4KxYlyJSX1Up5lpN1Xbj/cRmnxc21WtPyYl4Yrf9Xo4/PF1G2ZJru4ri/0bft+KkTAd/w3d3In9HYOEiVWPQCJxdVbH3KJdD1WQbOCi+hJ5H/K/KZcqm0Me8U2jdVJt5BpcR7C0eCK5Mjzwiy63yz7miSk1F81Aw74/Yrmd0Pq6qmdVbiFvl35/apGfZWSikc4aDckzNcS3CtPg/A9dQKer8cc/tWKsfa8cDpMZRYbnXo1g17Mdz9czz5dP0l38YTNpgVyTSobZk1kVa5MDzlOydto74LkYId/q/Xq9SNcLz9A9279xpv4MFssitGv+e72+MiBSq4esl3Hu2TskcK2WnnxkrfbuYTcVhWE2rbf6GDW+avz2gtUZ+73z2TPJ8jQpRNNR+729dp8NGIJOW3z7W+oT1TPbn0dXmaabOHRDcU+SlLodsUkiCW8JDLsHBN0WFyd+NvuUU25sf2PeTqZy3AytrIjA6TdV9jKI623r83L1WuxOLBAbC+hbzFGO+Penq/+lt3iUuE984T8OXbapGNNhcAL0rLvsIHl58rA7k6U4o1r1DKZ+f+QCLjc74/8mZH1+RCVOGrkOFS83JfT55LMvqgRvOCXW/aByHcFjSIByrMXSLdMi4Wt+C+J00x7M2W4dkNdcMeolg0XtYYTWPvW63SlIccEGUlamVd02T9C3SM2lj3NFmDE62K2t96EZuYdKN13PDVa0slG0UUOykr1uS0G1I8yH6Lycif2EDwMlHsSHzhW/URwfkg1/hMCXsxBB+e+xVb1srn2qaVkfVi3swxE4YAJHBBgf48+kePCrU+1cr9YjQjHV2LdgysM2uFLDAXNoZBSVbiIilttxMuP9m9V/10ErjHRccjPmPkYuBdDycoy4aBzQKd32v/YRTuLR2hOdLnLde/GstOj1dtbICl8EdFlpfa3VM1va5hX28gTkJNh/KwTyCmem5JEBaep7hzMl848ZLwYWkTkU1G51nz5iz4jWZlJzBOiJDb8BwvVQyMLoPBnzlkMroWy8EqMVmGkoCGMkwH2MacHgJyYHHSBsJQ2A4IimZ0VofV94gvgK50vKf8STHvnsQbkceKaLyl5HiFm1HEH6/OpUcOkCEwy6c0pfQG1m0JBObvWtHmsZdVehT/bhSntnlTb/r+CTRd3pEXgxRcUKgIfDKkbyEklZsJafaneu3K3Gvg/k71Bh+0wP7U6KfBgi19CgneJzq4WWK/G+sQJtDqeHIT3/MdwWEaWzz57p7kw1At/1M+FhcNswHltcFVzsxENrPwHiuMSZAINykxXe+O2DK4DVIAlBVdNvCJW0+ybTXm+fF9T7Ix/sQL1+odVUxuCcpk2khi/ijo2HwqXG8kbHgWj2hoWCkJX3cBKgmBvxQgVse2YZko6bZ1OG65ui59WLfY8mVkPaATzJtTMhlPJpSenojzHoHkWJnQkD8RQWd9RhVHe17Y5m8jvxcFb65TChzDYOoQhjj0+Eby1xdLGzLFIjQlIWfIkphfgyRMjvKK5sKG58CMmc0X2EQL1D9Pl1MciGx+appmaZVsoUcm+EXx3wfE4Lp6OELSTLFovB+Xo6riiKnfYwDxQ2o9Ft9xRppcB6P9fsKqP6oI24iE/dWht1yfuw+RLqeT/xlF9FNgnP57I91OxRo1jFVPFul7vT3lHAKVWBJeQYouO1Vht6G6N0I4Z8PhRi87IMRSZQ5VDacaU2DX6ScCvNc6kqSWaM+C1x3VaSvKF1SFRPWCD0mQ9jrziSKF7qJ97WpcKwWpCeB0XvLzkAgqLHGGRxGAEb4b46tIVSOT9+gg5ZO2sBp2vFTfiZdumtSUyBAtBshPA9pAQ1rJEx2xOQ0NYQLL/ZtSjsETicGunxlZ6jJbamdfAoXWe068W9zUSHG8YjKeYo/K6FlkxyMUlqr5VGR6mOu3vJeN6hZDHa8aty01adeSrnezQGQ6KBujkNNW5FbQ2JRdrtqsyG0/JK5+CczM9SnsPaNr2qtKlNOFWSDXReuMj0B2St1CLoOm7OETPLS7VBfkpufPZoWFLKeKNUJm+U6kE900K9jT/oyUh5Cn7v7brnHmWfT0MKrOV4BJINqDIg0mc2iixCuV7bzrF314oH1nuHM7Y/4s5vTGw90d8wbiLuUIE7tqUU1NaYeudHliWh1BIEqQi+5QvIRKnJI+mPkxrT/VCh3Y2W8kaNceVcNUY5WlBTBMVI7zg2cx/qqORRlvkGJ4kxsvKYAGB93HdtN9J1ccfuQxnu5nQKtrzSdxVBG1kb5z/IGczKlkXIs31nzEqZKnIpA4Xae7eRsKn8R8fjK8f4wonWqlEhLpAlYNG2cf1THC7CKbyJTUs8nQtt5NxCB0PIluypq5I6qhreL0ricaCz9bJ1rKyvZISEr0TLAlin1MRU249Bbq1amlhtRxT1JKqeNZxf5/TCtrVroH9+uSTRKUIe36wHv7khbsqSdJtdZSaGrfJysGC/6BKbfEmuQLIWK8Nm7JnD4gIdhUG6GcTO2qsYzOkghHKIsXGWXnGRKdb2Wy7Q24769MfWZn4DiogAOGNM43J1/MAR5UDuE/YJR6tFzJUIW4LNhKe0u1cqjgnXswgY4U9DpeRoKGNg0aM2dSTJvbkF4AhWTB1U/SupqkhNkIZDln6VeF9NbO1751Ye95qBPP/zAfverjP06Q9Qsf4YtnW+8Qd8bngzvIA2rdjGYEXVHzG2cIE7OLqRTheriAT2xLUhaejiUKEdHf1ATXxqJVSzzAJC8Q7G5cxCQsxHJcjUZNHNaicp9O4L2KXUkWbvUhfJ1yWifaG9IR/wrNVjIMe2IgtbuzrQvhcJZaV+s0WB5SuSEYd04r1NlWLfaqSV4g2EQvwOs5oemK1+qCLUNjS12sYWyPhNwjsY9+B/WAZ5cko//9zobK+C5vmwDoGdCvhNLZvqGJVBaw8NB8n0YC7pZZRH1IAudzFB5O7Mr3RqcCclV4X9/JwfAIeYLIbB1fbSgqFc8Erur49Fx2S40r+Zi0Yq/KeQlNLaoWqNnCjMgkAmjx2wrZho5TBIJVD7SSsb+7HxUdJQoQj6Eqa6TgM2/8GgKn4849jm7fcxeABKQ+FkHM43EeBanZZ88/JGkTb3laFUbTL3ZyFxdUY8S/2De3LSckIm1BF+p3ia2db6eU97PHDwmapdQVpgGcdhKFtGCvVKr5bMrC0SbWcstmsDW0KNsKpHUqbAy4+x1G5RZina+U8/SS15IYBPoZpBES2mC1Bo5DHNM3jGxofhUXY1DOZfmhomqEniJRPXzFYfC3ONLaCX1u6z9h25tQmMUhjkJoI+NADqLgQ3qEIgi7rh+MLZ5Dh4Mp5pBYUXdAp5HLMrxWmU9VUHqA6LOG588tReA/Un9a1lPZskveLm8xGS93QOLee9IpKo2VRv7zSqKVM9oy5SAqPZzikaAHWeN4homTL0r7WcrK7HBECV0yX47ijgx/FSVRA6pZyhulbRuOYonaBGrTNj3aZ2Rf/yIJn/jYyFlJgih2Q6FP/5xKS8BHD/WhUWMb480HVstoyYNB9YycaMMbPx1NoHkW4svVMZF/je9IQVkNeu5qnUT9uWSgKaZdKuu299EBu8x7+qWXwhAPlbJO9bRPSQIS65Tch2P6PREH70Gm4HF+PCJwL2NGzzLTF8YSAUTbPhyD9PzzysEoY9MIZQgZfOOrwtUKz82cBJDQS0QJNN03NCBzqzuqHbYywfAdrxJJ9VvuAU7wjBVxvV8OnFFc4Ik+KEeEy20UW9UH6lCIlA1Skyy0COy7rsUPogo/aiTN1npCkciPAeT0od2l3r+iYk+xRPXsCkiduA0PKFVMSjZffT7LMkY00Yqqd2P11hnhfHav9pgEGhQWMK9ksBJQsoTX0Bs29SbqXchsklJTVND9MyfJr/+LsjbQL7z4Fxc23WbE0aqKszWlxvxQp6USynVg81hTashugXbzToIJs671bwxqV/VX8AirklZsWLEJMHAsle8HtSKYd3cHyUzN9s1K7s2Tborp+1IYjG0y+0KEW6hWQuKrQafmWDitrap7b+y365BjLv04jJgEJlQR93g9wM5aF5YyWnnPjHBQW6jKgo6BCV8MM6yzH/6MiAKOs2G2oBouJftNs/3AWYuERJ0qChqjILiNgYUaYAh9YnZgKGmCGr4edfT5bxwoleI6WpziFd+XiPWKbBK4/ek/1G+Lvor0A9NU+GoQ9I+lDyumYBCRndg2LZmkMybjkdj2vlAf0zPeN7xeMiqjqpTgEjT4u+zkb4OvQ1ES/0KxVhTqxnXF+8jjH6rYu6HHWprWKleOSymeZ4lomQyimourXBbFOzR6fok8m0/CjftvgoroHcrbS/Hb3Ny7VYd+fDMmTngbUGt2Jo4Qir+CdPT2GYKYh1HvTL96l6iaZom1ZdUySfjaflkmbc1C/rxNuERQnOwaklH1ImKrRoLGMPyM1T3jg4nhpTQa2cRRQcBsGwN5HkBjoHJJOa3d4nQtwklfyt8BK9E3DcPxulfie1JXkGHzzeHvnJcaD7JBySgDcVISHS2G0GOPySDMzd8QdTghHqFiRr7EHQKw9VPpHFOMnGr2ph5PUyR0TiA9JhvjM0Tf0ENq0wA2OS/emUNZ6ZjOiutFL51+Z146172oUXIRzxG3oOZTw9AVKccCinGdH1oxoE5ZEdaNm4oAHnxyIZTUFx2SnY9NTupePLR+S/z/U1JA+JuamS14fOTN9+dd1MKgieamCn6tYnsmuUtdVX4hn4+/+Z7NvSdqHb+5zVlRBtymhUMWppDs0SthPB+yetYTXUO+Xyy7pV50pCT4P1MKNNdVZvOjsPWFrzgLqsFmiu1FnLqFUWEjx4K967Uk8HcRTm9GzSyPVFjVbb4Kf8DyXLZt8BUjhd+rOtKOU6YDyVcJXMj85poZRSx++orqQYgK8Ws4tf3ROXcQPzCIU4Kh+86sQLvi3m3ydTrRR0vQ0NkQF/MSi6pv88Aj1CM8d6Emei720GIjnLQrakQFDuIHVEsuXqdgnEEnLuj/s8Lh3nPc5INqkLgvTAXMIOmqeqTUZKZhz/gH6hJYwcOPs7sYvXpRx78ZBBu+XDwhxO6stV/He+uZB6OVHkpKecBAKwVvyglaic5LsQXzku21MdoMWTuYtJGkyVtijN154RkfKfUKfy+QvxWWN3vN5FndQTCdV+5SaShUYP2SfDxl8MoCJPECu45MYoH6FR2Q5gzuGzoOIbrujGKNDygkW+/EH7fspWSspFH/yLu/uwPAMzMHe0yIlL+moZtsUAlvdKGDsncJ7ynA1ApoywvI9Y9D816cVRHc/4YjnuRE6Nu4s/yKdMGbCDck0QSdkums/eDrA6+C6n2T63ZKFolQgH2AmBTvFw+3xmRRaPD30AGV26JS+gcNIWn+wkNNHmXeyJ2HgOWLn6uC7x7dGaC6cCb9APXbgjAeqZpIA63DmvipOYqjwsDLJnYkUmJdXPZ5CPJhpZdRQdkjMZvKLEtAHchIzlKW+KMZgcouKJDVhVSzu9V6X0W9hrggZmJNfoppYFPY+cb8FAvvgQunpIvn/dIqJ7ywuEIOjXBpW8mDerJ84nFxGgW4lLCwjR+EiNjTS4Od4/+g5GSIyoAarPktNHU+fDklBz3m8XOnkAuS3AraF8gwIWvMCWw0j8Tr62OC+jQe9PgrOD5tdMRgl78TM+ZhPapX+n0ce3FLmNePSnpqnDOvzewsr4IY9mb8wFdmnpWyuP7ATLoUOm+Dl2jNfpy9QhltZYMGJbHlTLJBL6vfeOOExqXFBev/WEFfIj5XcG5kcH/WFPe/mKYHgsbmoTOQIK720zhesjmkwy7xBYKUWeKYjC09aTNEc7iSHPeR8uVHqXDC55rht2qs5GeeVvNyetpiuZSfUdpKsvmUX+ex5LIzdBF+E8cEf1rGM/LpNPsfOqEB62W500+MiMkWotZIM+h3/Ca6Y4wMBMfTJzy2VjKiTBbri6TXaeYD/mlXTkXNiXbluuBOWZTetKrlGC+Jvxv4HHlxSLk8axp8zHf4APYJ1JzruF/KCS1OkLi7VAXdq1/zsDwLx5DrDeUcdLkuZD0cfm2uwaMvNT+kxxNCj03Pks8QtagpqvqMeiNKn7zNQrBi8Mm1FdTLZudWhdQXc8cN6Nz71kl9NCsdiDif0ZIYjTqpa/Uif/FWHkOaF17yTKRFDN7cuVowtkRi19atlVWCnTWsDlzU9Tox81s7v5yPZcir/q4MrbfQrhW1x3pddaILyGEz81hCmn0Mhan54hCSIKEIAkvCPsyRK47VEbjsS/IfHaAw3xwaIrQ4SQ2PyD89OwYoP26cwyqsyMuRBOoEfgQ+OoHkb/fDf4Wns7NDBwLITqBvS9k4v+SHCmKY8IPXWgzPZSgOlHcmAzPbYnOjHKT494IEFHjU3xnu5/2riAFehnJGgMmDSseDRCKy/QEt3BIFwUhg4+JtnJ4+OGsUiBphb7Qb9fHdFsvDd3OZ8ydPSye9VXZ08PweRjhH/PxLU/tjXT5XP8C1Om79UsOYPeubsWTfr5nCyBciLPMA4Rr0Vhw5Yk7zGuic31jCcGvKI1B2xZYLaFIxXOIlPj8JYK27FFZf6iQ0QdJe9mIYWYIoY9rTaPXgaNHKTuDJzlQTV7YuwEbeYPfYoyRoX6dKEUwMNogaONKALlzEXlHBzvgs8QEzA1mOp9LGp0KwSILRkXNf1KQm+13SFNlD3kSSd579A3hyqx69L6G5VTCsvAhQ2oPLqURt2VIxgDCjRfHm0PHeOqr7WFoy2dOtP9mUjpI5qx7wqZGQrmf6gpwEqdxXrpmfr/e7Gj/dA/IBQm/V6jxBQNMZiQi1HCU60mA7Ti0u7dLOm00r47OQ83RFSSwL4XKk7XHuk9GnenIoQlW9fag6cLtfKgUPuMH/vpo4qot/i0w/861KXDvDphJbqp9iSlQLyuTREryAojrChOhvWSOt/gwP18o/LSbgYRtk86b4DTsW4y2ReZsQxOMlR8fEPHW6d5yfzNuNxmyfXr7lTCWMxRS69Q1svajiAzgYhtMjd9Vu27sxO7teWRK9Xp9GvNwqx8uD+HV6Zvz1Vwk3sSf7nUvxgAWJrw6LYW0XNkKXU5nbWoSdhe4TL4+a8szyF2ttdDt48siMUFczF0FWf1/HB1m0YtUuwbHuut+jucgP/ho3gHzBIMpy0P4mygCO9P/m9BjoN8zV3R9PuxviqufVj3Ao72/x29dZmrVcpE8Z3/cTyetH+v9/rjes8U+2vz0kWGYfTRdJzsXxQaQzZyRZh39dR6NVW+1EQ2JslpTH3NLnKLJ29VheyhhAVJ9iZXhxEpSSusbxRA/r6/edytZ44TSnNecsVET6jlZtdLb+LIunzVynk4tU8Jf3e1I4AohjAXQmEXXWMtfm8iltaROpXiL7njMQQ6FrHWO/deuBIVtd9kQjHl+oRuBQQhcpVZXMzZr3b7TKCKtk5VORUhlTKa1W2tABUUJP9F2tJ3hgmRKNkgNyiqhw5XF6YITLPJ5alFctokzcJL87q/xfp8smf51PtHiNu000i0bo16rSQ883r2pWw4o/zfFZUDxpVfHBG1RxrSyR3g0sMgenQXfMwIBR01tT2mGta7fPGcbvhXqVqbVdT73Peyftw2k1Cn9/sKRnA5c6d3+bNA1d82XW955Er9t6GLFFsSW6LlveumP/OR4MKJSdyMY+0+EpWS8maBV59KR3zOcCu7R42TPzcYdmrvRwnvFY0icwfFwfT1aT0g/TT/iUXOUegkx+SugJOSwxcvgOqZ9iNxrlQ2HilsyMKh/4hrCkJrWMz5g/miIVb0RsWTWEXMr7+ckWuTL76VrK9jV49LkZOI/T67FgeYoqDoxkJ68Q34fDmhtT3ZNV8Lo1KS6lFREn+ke6f6M7hasYh2FBf3+Vde0JZ0DcsKOhLp1fMevKc7hocMcSOe19L27RqzvIkBGMW7vxLnJe+WF1zs+Rm0tv5b0W9pJN0Xu5P2kMAuXe4m/I+jmk9vQjCtKPVuADLv05zCRp6+aBCWFjg2khg3NT44vd+8uOw214DUir9bcH7Qannz6t/bv74KsH1WezfM/Cfh3z2EGmPOT2sDEPo1ejw5AzQ8cN6CyTHBRd5q7AVxhi7jVR9XXmT7yAY3GQoPysLsjHK2mBiTjFIxliK2hlE0M3bTDUUdt9zPGO7VxDVLkw1lkKOm7N9lfG8RIvrxiJN6MuDLuHYnOn8/U8hZ5nvpfz6yOrBbP8/RnNG8wfICuuDzyqt9vXgvtcuJTe40QCTxta/VWLBeb31VhJbloFegH/uT5EZWwjPFOcZdxj6zZW7cHQ1jYFxLYcO0NM/OWkB1ZfbRevLz6cEWG7op5GZvP9E3//KjWKH+rrPr7WbeT1j5pqx/Znu90d2lNeuSAnhBlTUtgM3o2gcaXLv6PRWOSan/ej53lc6/+BQKKkLQvYDSMMCajzgH6FFkVwil1rK2GrvT0BSYu/6RM7+/eG9oimbvd93ERc8cW8ysOySHv507yJc96vaH4FLpe3BcLgpyxu7suCOHKTpRtTB3uMFzXjaKxV9reP3eM7+meYmd3epXoRnPaAKOGSTFdcbTq7evMo9rO+dA8/B610G++2q73BpdMTChsXTjxBTa/cMCi7RrZ8GXUq37M+kiBNc2ekXolJ/7SH1/O/Ia3e6NzJYtSJ3Hfx94CH0f3++7yftUZsxYvr7leyn1S1rtiNDxeu/1dUHtPOGe5APazxexHh5nhKYXgNL+nSKKnW0rEhVOyejJLz3in/et06Jm7921r6QZHXxTX5QZzXlbX6g0Rrpv551nay+3583IbX/daFKZuroCE7oXKFnpplz6NKg7icmfeN9iyNRW+U6gMtbdtzaPc/uQBqbWx5LZo/hpahwLHFE1KIz+4fcsu5y5KAXkwowyk+RCf1ExLVe5Mryrr0LXXT+q5PVsW5fqpQdevyZu8daO7NdapEaoP3DgTBvbjlBvrEnyR15DGz/B6xNwQPUdlY976Ugu0X5b3yW7NrHa1Y1WwV2S2+KbZ5rkgzXMBhe6LvU/fp/emoX/m6rf0Gu4HuNf3ybb5Qf0tc3yKBSMw5a+/c1Ry5+QPOdsd5bwRJugv07iuH824NmP8KedIvKQSBKNGp3BSCJLDChQJ9IXf75PBk9/C3yxatrs3C0n+OyAoX2nyfdTC+ctpPk5Bd7q26tXuvmGaGxCuIx1Y8qxYqNuqTu/SvE8v2XqnR3PiwgB9spS4k9/LefkoE7XnwP0TRV8wltibJinFrUkT+tnJ/XHb2W5WwOYm9vb+bpkb0Td3WvfqAtRNde9Tv4N7rKVcuupf16goYOgtNvrTsNKjLY/zDQaS8+4zsipf2+z3x6vVbGmSe9WuXWwCtlqbXbHLd9figtF5VaGG6MnZ+e9ozOHnQu1PltA3xEkNY8m1NemeyS0esmI79Xpn6rGZjI+NP2m7F1wH2Xcp8w9tc1rBL6q9atv2rukvXAIB2lHjvHfyrGO9ofYHxfWgPIl3NEj2K5Z3hjZmA365e8Atr9+VdbE/lOSpzfvO0g5SBT6Iqo/I+XRfX6bCVhGdajTWw7deH3TjYWZQ39AQPNMvyPjVwzufHKFi4f4SGinNGPF+O835R0zTMspRZlj4O8slexTLdtF+7KDaVG63HWaYPLrGdSw89MvKJFJlSkDqspRB+SNZXX3lIJ0vrQWS2yZddyzf5MaoEkuVmDI+3IPVmLN0pJelmHA0jsnQzfp+XQrGBwGlLus1EjsMsSZ2lIh+ikbWZsp9XrbbRnUuRCJIg0sGqmqcNCKJe0mSHhqRe028Vl5I7v2QoHhORdtXU2NIYuywtRxxxsnbJWkROhWa7BMC8wfH1amyO6LkuEf1pzzsN75I/Hi+lrTwQHvn0yI4AqAyZ3ArJ4PLLFWg3nUFGlqMo2Qqa0HjRW4p9Ol1SSTWdhGXO4Onm1DpKUu8/c2qLEfXyP15x3cuUTl3DZLiWLyCX+YZCf3irU/QNIclpZTomx+5SxayEO8xwrXaRnG6oWdprpz6SjUstHa/E24f1RDpo7GIhlSRp5+jNb6S8lFFqHGyhXDSNpigNjZPqV9Vc2o1mxLNxIWyhNW42CE6SSHppR401fVC9LB2cqYQetcyS6yHn1+6PRz621lpqMb7o/Dwo0ra2urjSkSCStOzSGz9NOC6bC631XisUcV3psOXWXNecIgu7XufeqpGTn7Bt9P1V342wDHZxjSe947W/SjTYuTapidHf+9hfflbHJ+hAew2t+DG8RKYZnt2kIKlRO3R8H4lYdOr+9VleVPuC+dbPE5Bjr+2CtYVEnOxh8+3qVinHY0sLi411U9R7/HqlLvH499/99cfwKzyuJD+63i2D6N3v4mTiQFT0TVSiEpVIjUoNodr0xdKLAgUhB4riT9WUJY0ofCKOaSfrdUCzysQlxcyyOmLCuotZhKOxgunCqVAyHJ7PhXt7ZCGS8fqDsHM5+np074dBLPQAXiI3rlnwcIfW6XpXqfzjoFGi4rnfdtz8Hg5tNvOo2ST9sBqszEVDQGqD137UNEuFnwknMGjTBYFHrn/77WM5av2CW94llGmtl+lLDyt7ZqXu934y+dJu9XPBVl4cTP1pLrjACPnS29YXfq+kA+s7wj9flw4KFSEG/Piu8s7n/ip23j6XOIJ3xnjiV/sN8aY63qTzNInfYU3U8p3UqhK1SP1fkgFjuX/Q68blyBDkJaHp/Qi8jZg3ApgX5KuGtIBryo5zWnDpeukn801R63KU9xNK7t8u+Mvo/ZCv+LgjyGWJTbUs31KHBE6D9w+BhBCUuYx13jfhRzRZJRprAC3Rbe7bGhxt1IGaolOEtxtsUoGcqHpVMD82y2CUGqYjqlspIEnT8JKdg60JkFNjfsPLNgoxSNN07nxs5+p2nIGW5pY3WDnc1h3IaW7kw9+zuyGPYZjkiteuHW6Qgpzm4iD1OlyiNU6M/0e67HRZICfp9NehbPdLNoYpWgDb07ZeKmucqN4dusGMvQ15bi0SM/nDo4mlgVGajjcxsq2Xjk9NzfPOc7RBDWka4fDffGHjAWipLj9ahgUuwRimaeSD7fOLlmiINELeVz/PVbYka5yYuleseM68nzYW6YRuIHG7ulTGMDWzf9hFER+1tdagpWkZ8s/d4dKELVLPN8Rx6cCkiob3XbmtltanJp6qt7n3TcUC5CQXPvTm8ENI2/klxC0d+vrR/cfADNGbZnsOs2HyCKZCzBxMTN79j2XzlO9MJp92Lr2yOYh5GiK//ZYyHbiDrYIROcYndOLbrDfAAZxTKYC0nO/SwVBzU+sQX/DNiXYERB4XY3LJJHjsGAQhVsv5dQTSaJ5UDgpVarkgzL00whACupZ+iHzPS1dJhXz/g6AklxWJ8vIOufHL49ZllQr8pG+OE6Py/6xPKRAmkrR3lWsTtxLjCpOWW9nsSa8nX/N4jLyC4/kHTWW4LZcoQFIONkodUkl4SUef42tm50Hj++clySorMIk++C2zH+e49y47JSr04L5f4WEYQnq605ruuU6Qw5PBq+6WHOEB7T3edYTv8YERv8dPhoN/BFQuSeTbeW7Avyag9ZpAYx5fAaBx05Gh0EURaNVl2Nw47CIbaPG9R8AklfbOFnUor/GHR8j9/ZodGRrewI30sRlaocmSUMrNhM0uhhpdaxG/BIeoNIEepIcMTqXipwGRSrGzu55UVFzfuP/RYMLGKddNrGJoGtXXxPMfsNBjeYluG5/pq39GUSfC12+44UsyzMcQ3ngxI4saNRhS16HhGxkW8LSWeCV7h5v8byfLdpZDzBzPkAdde8xxGKD7t7jAce7YLHMnkA8FPz4rvz+4mJ90Wa0Iw//3/V+CVzReiOgfrT9XDHQB0kH43cjVfvGPJXpXFuyyUoG5Q1amBr5R6VlZYOtKM/OHRVCFu1yQ4Q7XJ7FUxVqFiRfLurH01ysWuis/d5qAIUkWvQtfQjoIX0RfXJ20kHIB+IyzVd7mUtfo3vW0DQv4HprUI1DBm4Qp5MMNAjgNV6BtwMmXNHrZRaANVPjeNWkkDLhumET68gEdSripDte2qHZ853GtLtc8LHpEbGOWgW/aXIMwBVutHW9YA2CqXLPPWcXZD3uoOoImcSROKmnCHskOeibBG2ZBqpxXwK2gqBYj0VGtXdj2nfd4VI7GYAzev+xc+/wJjaOanGy3lptlQyFQVswpBvojl5wbxgydh3e2MwSFW3W3r3q119K6PIvGs0TApe5GWOG94gTPhIsY1JbvAGE/6K1Qebb7veQedWLv3+0Db16GvDNgCpOxSPXBW0umKuL4tO3y8FJZjOf6l6DNJmx/Rije16oztcdUB2B1e5FNMoqI9oUilx0v4ZAHk/atTFYlAz7nFuwQNn0LDD0rc0xkVO0fDT/lUJnwV5jNuJHBST6cBzXB3Yy5+eAeO55XDr4zg/RZM1lWs8vttGHtIdraSWLN6jajDs8DBt8+kft/WVL/Y/DAWVloGGH5KvjZUua92oPAfqY45aRDQyalfACZ9kPcuPWNs7RByeQuRwq6/RFt6Yn8/Dvcvh6QQC3MkWJ1lDf+mcyz9y1+/roQ55MBhpjuxk8A8nopZhIdHAIUX0ClxTturFQZ+FAhRM3W7+7Jpq8XgTmMbmEVknn0giRud9I0NxO274cBSdzxaqDNewWtHRlm29+OMjQ/cs1/NNb5LzguG9p4KY2icvIymwK6ZQJJ6KOEgjYWdR9kp2/IyiU3dWcskGpXTZj+6rm4OYVCRIk4PJKmxmJHeplCp2zg/1CkStgOIJjtdmQrdoz3nkIHw0WvHjxCmIqSJOIbERILMY1LxJcACrZQMTM8NvV2V0aksp56iYg052AguuZrFFCIqc3lViwpLR+BECSO/XUWoBT2xXVOQklE9Hr+zq+HIOn/amCsk2mg883x6KmCiA4zCM9vSE4UU4wicxbKB+drfDANfb9AvE2LsrLMRfKuq8aYFih2YxpxNQ8YFkr6mGIPGaK6LQBHhK+NvI6NCdPDggWiSEtscY/zz20aBHCB4XtdUU8Gs1uw1HjxjvrEONR9k8NERvww73L4AmsUJsGTXQ4XRZ+0AKVVnN1ujQksClPH3eDjSlI3NlkdWMNCg6oQmwSyisKVeUxMjGbjGwIfEqGT6W9E1gA0wIQ1Xlr6Oviqp7v+pAEVfdfoj5lm0eTIdy3RBxglxHHy45YHxR7keUjNciJg9MRlhC403EMpNFiTb1BI5wAwhgAoiysJJcBSs5wItD0x/MQMqrG3fRxnQpAu3kbe+HvNQrC8nSKFMKCcG+zrLbA2JsdTQIVPk92l1koPXWFQuGo0EM8OMbo6ovT7cGopwxKIReRsC6MADNIAod2agx4xz71LqIPIryuYg1V3ddTopAUOTqSFAxyIEnp8d4OgRm3VPLDNxzNg6bJrK7obIh9WTBSHwlpSWH4/LUbgyuSjZrlVnZAMTCe0MR/FxhqbItGW7lfs6WBBJCWcJPwUy/zKv3GvnCF6lACyfHQwED3leDyOKU1QGJ7VrPeX2/E4kzv/XEVgitQ8m6qnRlwPrqAgKhNw8oQQqOHNCRSWxGuSp231KIeql5TBspUY4ldIf44JP/D70lQ0fIYL0plpTFDhqG7rQD5NODbIw3QCXEklLo6LP3NkkqkJubx9eNTGpmg3QidWNsCsrAHkRaEt0E4MsAW6Agze0ZHQiQn5a2UQLAKjU+ECyRzeZXJc+MYv5AXB7qyDJV1qXO1TeKbNK3gImYWc++6ZbsbsJDsfgUOtja7SRBD/gINwsLRcaiZKNL8WNxoVeNy2OpLRgJN/RCTZSD73aS0T3EXofkkptZY83jil+jNBytR0KlpO7JdRh5TsZKa/6PipAW71kGnwv2f7ntJIiohEGuBf6WSzlndKZZ9cgyBMCywltWc9oeGqCSy3I3kvX7Q6K5i4GDbqwc26XZJ1bfCKvsNoOOAz4+uy/6vSmIwIDhG+bdrfdAsf7cY4KPiR1rjVNXXBjMy76M7x5Z27tblTyNuKRMHl5rWcrvkNOULz6O/czAFe/pvaP154EhqsMKJP/i1264pmqJXQP8iQDnfK7nzr9OHFS3uRkyhV1DIbGFYc3DdmTFtG1BwA/byOu9LW9S6j8fOfnPprcFa3K/OPy+nX4yXhoJUfCvfM1k73vip70sk8oBvVT8mVz3Q4d08PXMix/mWz+f/X7+pGFNOrO/w1ex0T6T4QVLAhw6qyBBIc9Z4TCM25x6+9goGWPyRn8LXtUHljUREQhkEiyzzv78iT6YgAWPmhBNIq/90QOzuk0iF8fkyxx9Sdf/3s79sn+u6q6QVg5I762agaaAPx/M6sCEzOTASsHHc7+m2l3B9l0XNpLhg2q29zVl79mLzOUHv/tcf8aFXW+sGVg8M8NJcqhbrlfX0n669xS67tk9+eZaeLIgnpFD/L7nwi3hmHYOzwKnbkzlsG64JRxUjQ63UpIjNucGOqU468iFd7f954V9DbygfgiVoPWKImtUkAP9QCirIo9delGiJLcYeKQNt82l+yC6NLaYypa0XJHEillKcZdmRtreaN7M7amvQmwFhZea+clh+Z08vTO+BCxY4hphpvFQBN4on75k+7nDqXn/IqBFedHrd8YWhpEICeWqo9L1MdnLC1FXAtyJCnihpkJEXTM1p8y/aUY1OteHcLI76wE5eCIetI7qL/sKqiyGB+RfqdFVbIjGdaAM/URNTAC2bTWTxlnVF1NlbGP9C6fyOPM0aSOJdiJljs6l0BGjLgx97EHoHvFniijjIQfBXUFJwK/ncgQaZl6+aLzfTvRnic0r8+k5ESRb4TaV38VDXZaPNItJ510oZPyyC5ow8djyhiEWW/2Ecyl50wPK6SsEUjLlRSFxqgOVwZhvaTAHjSgiCP8afYAverBcVdB9KTjCmS8mm/6mnghQEDyjMpHovraS98suY76RcIlAiX4iheFa6+O7umhu1VbiHEy3AZpoNRjMnpit/O7fjWq1mp8tCSZStcN6x2ho1enXHY8c5SYTqXOxOnIbIKJEPRy1f4XD8bPj9cPLTplduNrEdOePWWm4F9Gdd7QFFzoBP2KKRwng/bbxLCW3jjhHHOBr1OkRCrn14dLRtFOztUs/assb8Z2V915MzoAR9cDes3Z/BmRX6Jf1CISwHgmhgSbIPRPtvDrmylNJ9tAZw8NzCkBpvuB3n/U2XirPAhgJJMKexmcQ3ocDGTtsThHNFK8J37IskGgXpiDUUbKJNXgcC3IMp5uqkJwICyFhAuabL/U5BxFW3g+L2JtPQeSA+NQMIeto7g8WllHyLkV9tMglPCZ2hGPJ1Tar0/yJSdti5RS0n1GrTEKYALCZd90tCHF4Zb5BdAtaQasU70AKE5V9gX1Ev1OMO5JZ3y4tQe62ym+knFHmdAy9bWf2uYzujERYkpK3gWV5GcOVr0ZkRODGR/gldxxCFz55JsVKmj59gswCXRqGwKsF3NUKuBH6LhoAOMEGCTq1Lo4k15y8dvO8Wum7hrk0lpzNYJnE4IMt4KqxqLpXXMJOEcVea2DOC3eZNOM+FoZ/8fP0cefOj1SZwlY5UwlvKaO9lTd8q+2/2RKwcCV77QxebIn4o9J1PVgP+icNummz8RYA/GrlB9zff2zij1ufqMdG4voaF+pDv+KOtg9s0L33q7pB2UGtdCWsvmVECLEp1Q7Cr4JSSradTplM1JjYJroH5KIVE46DsFTwQvYWCgvy6MEUXa3z3LC4XyzTOsuauI5EA+XYy9SCOfbavG9VSgfmTSnfQcjORsAHkbz20aAxV0qOd4mcbnMvrjzPkcDGiGhdWM3oGV8MM5DAMVrDaIwmV72smbIYhgzcs3EoYMcU3ADErTvrZ1MEXRtYRb8j7ZKs4KbZtIW1BcK4luUZFUCSF2/hAT5oG2dRPFzjJcHMQnNcSMRerxyYiBFFO5im6jKvSKUBOgR6J/S1RoGZqCQjSC9Fi3QwOJRjC6AqqcODsyUxIQivx5iXKMVovKIwyKLg/h4x3O8nWo46Rez3WnkWblsmvAK5L8Wc1p1+gKN1g54i5leBiZxRuE0ZODwsHFJQ40n/I5wRZl0BrPStr+gBbMbCTT/PdS1LzUoMYayK9V5myVxlzR2NW3BSXwPYwGjyK3h/uAVJjlyazcAIZE6duI1/YGGBRAa6tAVd5SlSA8JECjLB4hBOljqOs8lHyLkNgY8XAhM/sbv0jPkPgS7K7SRhu44kFX3xMTiBU99rhz1BRtoCm4QtUA0nl2h7CsDwK5jAdf5y7tpi7R1G4Vv0uFTl11rQ124Xg90NGL02/Bcgzp9Js+3RXw6m3Z+VNpEcEHPXmGtg8LntjVdhDOM4+WneHLqwVy7VpoSPFUFecF3seBPy0Bf0GdpATHgpWP8u3DHNhQDo0rWF/zvnBG4NhxTG0E/VXkYIVREmGupH9dWKaqXfmLhPWUQeTrcjrOsYTMk6VuqfwUulAC7T6fBxeTzBBNo0FqQIPYchl7znyyOrVqM9N12HfGUROHenVMfHkGysEUburgRCKvnX7bVT8vDpfEe/ojf60RH+zYTnS8ohFFTan4TDTKAJW+UV5fA1ZTG6OteIJDuwytkbgL0HiAu5OPig34yn9mR3NpOcSf8Agl2hC8GLgMc3Hc3MpgeYDp3iln5p+lN/n1pi4crBWbPxs6HnRRuqzd22ZT4VE/4iJtnSXWMwiM7dBbvdpjMlmqDJWKmzS+OodZ780yojLw2pF0jPx35hJhaUZM3sz4I4AnS6XGgx31a+fYqi5pvEBNTkqqFtjdxhIh5JBTY8OBYhUbR8M0rWxHBJaZTcWKnmXsGELzZAVx905E6E13jlxxMZNB2BHb1TD7DqOJn8Mxcn/UOVtTsjVXjUhOwTtzRN+r0UjvnE8EQxEZ856UER/tj4n6Pe//yAXZ99OOPDtacPpAHRLJ77DVPvHaR3ZZzdsMjtEwm0hGQcVWkuHvRYYkjuF70N2PiqSK3VooA26zH6DtXg3O4dEnt2rMOwwXp1RIjG54Q8AtyDZ1QSuPVJTdh/KIEtY0sXhLMZTrTUV2OtIcJTis0TLbTLU0Kq8pJ/HgLmSN6kzlev+WSWAwoY8kg4QCHf+SYvhhgD4Onjnu+vYm82k/QPepgDdhUz+ni1V4xjcr/X6a3/gMYQdduQ6VigdA+snviQY5zzXQ9W3sBINuXSdIMwHGSFhA/3w/RqQkaFLDNEg7rhKwqJr3y+yor/ddGQf5tbrYgajQrxH+8DrNPzRRyiFNfENbbpO/pBHZ5MZYyMfEzDsTtdNZrHdomVZK86QN/biWdYa4lmvM18TS4ZzCSJVU688NpMONFOJY5n0KdPlmNrvU3xcO4ehGMycc5fuxcbxp8ayYuKrJEr+L9U4z+9tffM+dnSyXyb53rjTiHtz7zYGuOZVZi3CAH1uXfIrNcK3gT87DR3bO6rPmjwYp17ZeHy5dvnBRSW65wVadbH1wHh3QtT4zZ9ulLR8996Uh+OH1ufAsbevL/SPl+HA9dMJbh/fWfeiwLdNUgx29denHLY2O77OHNe0vWy/3Vn7owObtH9O1ZSOX2+ukN12ds/Kq1PU2f9hWvxdMPuWtoCQnW8atdOb1ZoAg6VZpSk+HbLVsRbTzuX9Wuv1lq6NljH5JN0Wfkvh7odSftV3QeX0x0L2pmwMyqQSLBc0Y2DWEQrpBzo4huWRFZhd+JtT/1/hKrH4D4XUI6mj47+LNDLry7qjLSJsrweUTsUwXUVQxzYA/ds/xq2Yww9I3HjFhFSGFtRp8jTpFFmLKzwLBTiZ9zBrN8WUKtuwlas+RdrmLhzzc9HCONZqtfIX9K0ClAJubXa9On20+piveU89+tHM94sDPisMdZcS3q6AzMPsotkUKEYkgG5en69L2YWEKKtmRfv7muVVY+PYfdjPPCjWBRjZxAgdiQPRBqTGGWo1IfcFzCnIhi5oxtww6prAnBwGpIJQggjFL1x/nzEa2qBD2+0HliqbV49c41HhS6toUv38Jc5Drx8oDAfp+PKiU+EnaK9LBG4R2x+JROZe3hxIyZGdnnSeSoyMLYcc35D5vsS5ZJJs7c+f51y80jdhbEEodOdBwFTXs6J3zj0dPEZu4ZYQ4Jap4UCaMQZFowP+mMXxGxHpi5w486aGQwxFICx3IgBGiak2kmzM4EKZTDkaOnpseir+KUFE7B/zLqSQUxYkxUT8QIQ0id277kxfzepyYrqbjF1NvDFjg7K1voYIq2P3ial5gVOcJlrJGfcNnSGNcZkUTU1gpsU0oms0q6SUOaVEInNLSnywCkO1C3RB5Ds+qrD6bJoqnf5hsdyLGQUKBPnsGPeKBgtWj6+CyYleuq1hkDFHcWVU8yv3uBHeEYUswaOJ6ytPvuRZwA0sRYMYyhT7dKI0hfE7NlCCdrsCPiHAKhiMRvep7lU5lF8fhqgCDdlVOcz26ooxMP9OZng3VJDr0p7WUPBckFPBdrdRuJL0+T9PTWax9Sj+0xltaZ9hLXvh1o1NeR37O0qvNDI7/tbupdHc0xqZTbEHu+lYNxhvC0DGZp5Tm4SR0txVTUhfsqzOuzO7yGSGAolRSzbhr4GLH5mjt6jaedhdBc0UMe9K+N6mOpARHa9Gmcor+ZnEhdRe6+PKR0NBsIb37XvTY8suBxS8foIGPksbhCzQai6/yd83STwMfBFHY22LjKsKalACGb3IbQFti8dbEHRN0fB3Rzgv9wmC4aPrvP+eWinUDSiizjPE0BnDd9ZSR9Ikrxih3AtOQol6fzVHToCSE+YDWynblfvDc4RGa1Sd0Wg5BcNJjp83nyn7y4QcOf9K2g0NCYDSXQUWT+S/Aix+VDYJsu5YLWPF9RfQzAx05TSiEPJ7SQML14TegfTVrndJJGvTtTIUZMusL8+KIySHHpA3l1BfiisIhPBj9BNlA4hP36PtENNzK/j9iODT07KvYpIGO6rVt3JeJC9+EEZVAvN3Cy4i/mKWlXcBlMAO/sDtSsIRHjNQOUom2lFJ96oH79z7/SQ2egTpahvees7TXAh89L68V1vDVJAI/OPMN+ed4+UOMOx0LxoasyoY2RhJ2b4CTl1Kwihrx/X3pCMQ0kQ3nms2VGLakiUu6PkYvdgo63jr/HT92Xng4mziR+aVAR48clOZrCXOn5HtSzfKf7U/dt1dc8rNDrlpjabADs64+v+cOMjhs3wKtjYbAYZf1bUyRZhfGUzjss7KmTdBvoGRSm/Q/hTOvNNdyHbFoN/J4skN6aoGVYbbSfmNmbeZbeMuY7d3BcLphm3+jZAb8Na18Z7Ot8H5TmNLWCOOpBR7+bh76MjdxpZ1AsINN9K5t2TWiP5ivugi0hcnVB6X58tD2cg/QQ2G7HRISWguMnfvJKWImwbjuMf88K1d/OZs2D8+YXNeVQ9vIsfgnzQXaVVcti53aFwuxiUO/8vLRhqPr6mV/Obr9yoE05oYBFEzvP1aFz8rwfGitP6mO7AwoJQmjnlt8YRoFvwCuQvaocwDONnJpY/i4fvQsyvPvsyR/zpuOYcDeV+AOfRYYiNXCHcjCSyGsPL3ZHP+4AtVdqorDdPaYYCGeOjghebDQ1Hcpk1DlHFSwBqlKBxXMoApVqHJtqSrB+IPasrbWJnl9FRqkghvobTjiPlZvh44gVZAOW458M7l8B6dz/4eNyP/448XJAXiMkhRWCH5RDFD3BGs9cIa/hWUZl5An9ixwobyUdQ2MNhZ5ZAjbHBfKukrraJXXcdlcYg+4noR2XBsq9cf5fPvvILu8sYrL9LoiGLTR4b55Gk/3TcJjwZQJop/guXzT2mi3HfE3w2KbP4JPu5DNmrhcu8/TrJeAF/Ok97OFWrLFxsHLoOPKFjWEfP50sKBFXsZSRdiVJEOloAJr9K9rUni7sV9tDAFgIaLX+f7pLEvinTsm8yCWM9r4z0+n8KJeADHQug60//j2GvC3SMCKrdjXjg3qhzrZwkBAx9uDwmkPe5QP5zR+h0Yw2LEvKvF0Udg4AMTmyBRh7IAWG5jzptkYsIFO7FhjxEIsf468nlZSHmz7v1fZrcvIE7WbvjIw8LYW+rj9xyGdNFGyfrBbXUaKcGj2YzfxmEJbZy3z/75vQmy23gGLjhYlQo1jqstdI0fkZtfp49hbOLRTgyv1feOQ6l8mPwWdS3nkwcI5WDf/Jhx00VXk1CK8CDlep4vuzaPebgdJNb2hEJ5fp/S26aGHOjQRnwe+pNzDQS5tUh4zzSttJNb5Z0jDUVfeglRnG1Bn8bGJ/pAFidDgvjQ1ruz0l3Omg8r0oqHnrIzOsZJ20vYoLa1V1rAJlYe26aZS9INTrJH+3+60QOuUoYfrA0iE9x7n3nCstyULLgsdqbTkf9gYfaPFGYHUI9gjDzz6nYXe9c5o/wKzAW/AqXMk0glz6NC51b61vhKS1BUSapotCGZU6IOD1AMuRSLck3FOrqHPbYmabr6EY/2Hl0P6hsa1ePWOWjYKDzltoswaMuPBlFlDGRHn+iydzidfAuJTPQZVKdChB2SFeftSmRobhyovRJ8+20b4Jluev1R/EcHv99hIOsBRrPuDsklTFn2Sj3firzIqp3RTtauZF7o6l24p6CeVKlMmVLz6fsknZSORMDnLTrTPvvQuIQ95JZGsxaFwh4NdLvoDYzVPdPwTJSYI8UoEtP0CLhJGYcpa3QTvjxnOGKSMxZAkh6sSFBGaIdT3azbOHFLgB6xKVL2NDWTJLHlj0AKmF1nyNNkznp0QIIEnBSx1Qo2fSDLBPtirvxB7ITmWvm/4vQZWo9oErIbpRXGlfphlUm79++cbZh25SGM71tbO7URO3zoyKp/xkN1ILYJ3ceK4MwH1/lbM/RBygQOT5sQIIEGo92uhsDPDagNeKWmmL5uo4i2zhO6lDYGm8lLmYOOqnmQZnlIu6bBxWVS/zeTVfkguET55pR75XaZURC9XVVHfsQNmr8jDQwxe+NSdL4CRjASRr7VAMFwt3IsoOz9gttSXE+lS7o8xGOR2MaH6RIGSCEM5kJveG4J3uyhvnLlmjGVCrrt35tzcc52Fjk75rRIo9y4lmAnglp8LvAcH1zt69sZ1mREzs1PveWf9iL46yz90PTnNK3Ycw6E0+AUlhINMhKaVRVsqMG114aA64FkCMLAXRFcRHwybPcwdFj1A8/r1GeyZMW4r2SgeIQdCxbAqmluzRwXB4ZwXaiD481IB1cweDhfVsatKDmNMg1EndvRDtPy+eAyGjxeRKsoGzfM1ORA8h2mflbRC369cGa0QCvvBdFXROAewGRe6KUp62P0Mf4AgFEogXfLYhNfThQtAna5JQ1+ORZ8IRMi9TkuDX6NpCGCRsHpJbY0vmUr+0QyJmaTIl58F5flGsSNlgPBzx/L+yxew+gfpUeSlSIFHmmrBT+r4EDlMVA+gi4e6fkiNLL0L58cds3u9ynCBNUdMbi8kZ4kkdz3m0IsR8yvuUuJW4yKvU7V/A3LcUkdvnJXNhkBcr7KZ7zdf3e+Yjarv7XNn/+WnYQ8inO26oKD0zJB8nPnEm47p/leNFGrhVKtNeVo8qu28rjRW0Kh6u6u+avIvpu5EY3L/S7DDwLyBuv3ASMjQtgwJLm/9rETqkwkECyx8Xwf8hXUc43VEKklVeYrc+nCrN3YvI+Wod39AUGbZpWGkOzM7X5hXWUjhyU6zbCPfkbV8MbyN1XdfYTIa2dyq/nEOCW++kc7/Ca/XGzrbQ4tAmFVRaT36wUBPzoryCYn2x6v/jCsuSLypt7bVsHTSL1JtTS21iIv+SkR5LBmzhuhjp94PYm5omzycyLudcrzBITRJd9Kgu14Sz/DqIM9jnl9PJMIau+j45fLUVsa4RwYF9c1Dtu58xcSZ8/3XPiV9yzVFBXK+jeUXU8l3PJ1IJCr76Itrzt289M2xqIcJzEpAofzbxyeOvnd/2b/gg9gjwfZgve4kMD2pPnFYpyxQUPWwS1k5UkLsCkaNuY6zsoFF2ZifIgYWurITD4cR/Lr6DqoczWeHPvxypTeKMZVlaM6Hi5PuOz4WJWkp0Nd5X7Wx1rqIlFWYXvXCm194F1cGQtfs6BYUsIDKuyGjsgUcwWoNcCaUj4BPsNzFHKskK8FW2oBqy4Qshxpqw5TlkuuAfyyrLkd/4wg/peYCF+BEmWcf6izZZcVCay+hcNFW47a3yhkW2s4jRcIseanHQfAB6UH30rNpy9n1f0e876mcmywlpY3aePHY0Od0Xzj0K865nLjdhotPLfvBmzDwin6EhZx5IYykMRC/0qZHzOgRj4TnC4lZPVfoCliDvqgju7fcNS7Pb2buO+48tnqyKTDmoJYufQa5t8qkLt8x1mkNks4fSLx8n8fa1mDrqXZ9ax3v9cLYhB0Ec3wcnEVBBX1nGciDmCtL4zqIywE3odSeqsbrVblbe6ZnTJyswzhla9nDdZ6Df+SqNnwvxI80hInTlBwHHj4p+g67VpzmPDxOn682LyFgnDLPTBcrs7o5tD9YH/+zUKDUBszefHeiofy456ONayf3ZM16LY7KtG9b/PX981Lu006GmHFHVVVqvxsPiiTL5FYgGiw7mSLU1n4WsUtXG6ydH7Pz9eubTYjakn5Mx6SJBmenjwqVGx3DFoVtryP0fVWUqM2RlCTovAQYhT3MWT8PqSJJiI2Ov7yIRpelSAzh0hGNl2fpYmRcUXR3VDFYp6IzA1GF+SkFPxFX7EGdgQlZDWRUUfQtkI2PrFsHKpwhQnpyJL6OdYtxGz91os2HOjeimVzCftAyCYRKRbdrh3HhmOvY0rNUsYWV/f9THo1RpMVI9Cl624Q+NdJuzJoeVllaqKbKBelhHn+blunsW06bqWiwuUvF9rrxHXa7n4r1kh72d99C6wcdLZH/c42IL7fr+Mv5nPi16mvqsa9Eg7ej+9QCCTIs8sDNa209ulSgOVIf/0MEN/PfcSmmXI8ve4rVZdr772sIuuiC8UDDRlam1xspzjxMRJ++3GFvsYq8vNpJ1w6+aKN0wrXqdpRF9YdnJLIdy/aYzvmkGcGz+qYmzJJntha4GGiNpIditEP1NSVrrSnTSuYNTQP+ZlMK2ITOQ4gv7VE7+VEyvPK5IAJohhZbL9NkKuEnX1xwKC3oPmb3ik3cIJcGoP4JKtCA1yL4l19R6JhBoPMJCjA8dUIc1ezFaI7xAvzMGxw5u1zuIzf3p6w1GXKbNJZ8qcpBalcB2KAGGJu7aGGqXf+VRyNecj/n42Df7phagJNqizUDoZvrlAPfzo43Z7nCiTC9dEGcgnmnQbCp3zrtv/+k9I371HKCrqt5ibe9WePT2kQrmYwtj7Iu/g4y3SzvJ3a5lCIxo1m2X7NQD8yRdxTfnAtwks/sDNiiYPzb2Mz8j8Tl2/mH8+lKSEane9y/KiYSfSuw3fGJPT4PSMytoxEFwd/y+jlHxkYq9xjx7nJnoamnIhPIQhMyGyp0VwEisIccwuMxfnVII8mRo1491dGV7Alx2WGC8rozQg432a0RhHb5XqjBVzi47AE+czzGwA0/r8RwmeY564HO1CeYtfmn9jCMVo/VHmcmuPN/pOVTquJQw1y0HrnaOGWQ2/3+MUun3o0CXmd1SiKkPVoJvuqdI12T+j1bFDdK5iuUj9xTYlrseOLlVuXbfdzTTScZ/GmQliQIx0HATrxAjGmYEYH1IfBkxyVMMjESSdZrR0g3FbETF18JWcc0IDS5MfnryxXvwa1v1YugO3gXezhOSTSWfGXeGY0lh4mEM/n1DXW26xe0/9NGNIJQUmyQAwt3y/hjdPM9pBnznj/LQZaVq9Gyn7bzJq6xMPvgWQMOGn2AO7qRO789MKiSWVTj7ildDzsC6OrSufmI0ZQBGlqdPR8ihT75OUl0K9xU1F1SJtMDErHPFUzwq03weqCra/+lKp/1TsZf1su+CkSgvB5WndX0DUJkKS+wptGyAw0xT5NRwh8OmbQ8Qcl7K19lPVrS9S3WisO3sNbOl0W0Tf90GkbXzFqwUZYspMcNYxFg7nMAP6pp7s0WDTzQcJxyVFKlYtJTHFtgAAhEj2xhnwl15xPql5sHOBQ/sLimbB5ueSJaBf9QPXRL1zhWqBq/GyjtibnvU2RjHqHTqOMcAe0IsqpZAkH3gfApUiZTp4gSrwyKQ3cEWc7qtaDUL6FaVSCuV8xjixW94ii1EDxaHu6jaApakfIC8MXitqVT2yBU8VmJBSVZMJoRraEuxAmjj+eiKxRZVdCn2KzGjXUb81GhFwquEuVhfp8lXEMzML30GFfQpd9NO42GbKcNLpP/ZnEuWoKsoFXkLzS4UiI00yp7iC9JadWRDV4AUjDtmA/aayVcOh2aIQkfme5OWLy59OOOT+dzLp0v8/Nwma2V77K+4aQx0WnaQVLR5+onpYkdbulCJENt8w3X9jBJnRDKC8kQkbik992kI1EPuscKOlw+HvcnG9zLxYiUiFekDVEDKiCp8BhTkSeFNJ6sNSJ+IesJOfspo/2DCnitr06DDANYoiQfDI0Ug03XBfj4678fLzEOVuMDRTTGqXwHYw8JKbYUgaQWesjwLU7KBRynWUR7igKaLaOIGwxAM8qghVDsCxzc/RGkB+Cz9mB7oeodmMJvBVfjNLublaFJrAjCM7Y6yOseX91eOc6qdQME87bfGGa1lfDPS/ewMNvGWkF316QI+ksKWNHVAp3G1BySrQtyldKGvpk36zVB9KBAR9/k2McQxtPOhv0GjP6mAe59s8l5SGU8HSGp8AAKjNQRJl+geGGEOmwj8cfH9C2xt314Of1pOLd+g8OQvxAjA5JP8gfBaJd9m8OyhC7jaUT5qRHFp6b69F3c1CULqZdnrj1gW79Un0Vp2n7zwQvTX+9zv0Q/wnkkg2YBQW0Sw3hzbk0SsthzgJRe1RECEAIOua3Pg9H7JrPAlkVf5W04vqJW9P7YtVtleIUsNN2jvRhFK6b4JUJDNwUmtxTI63iZJ5I9lOcKRpLh2M1Gm3FpLAYMh10IESHZhopzKegg9OFZ8Ht9RA2ypIytBZ3pYQLPpr9LHadIsENSx84f7I/6jgQnhSSiB+mvRZu7eW7107AhhycLnC0mXwSUKwEbf961+t6AVtGDsm3Rx3j7vNhatNT1zq2nd71z85FeV5DdstanpVv9OnmHWzqznwj2lbIfE/Z5ptoNj8bRSdqyL4iDyyErp5GySxOyeMHPdSJfJj3vWmB3Uv6rKLjb5Nb5dkvgtWjTP75QAGgZzqPlcv8665/M9Jfn8YlHIhOfzjAj5z7n0sM8boCCRZcy3qg5V4u7U32mP5fdT+bys/l7hNjI5Cd5I6ufpHm5fTiXT7kHhoNh7sPqEsN/qfMC0aop9bdDl8lvoD9SGM2UEEyJmrxhp34cIAU5kWiSgdl13ogE4zT4Pe7TJ4cUiaaztUSaG7ag9LpsOOXQt9x7qhUlR9ZS76ZWfGxeB71Q5ezQxxT0iCaoX7d4+mz5KZIG/cMeZASrR4SNPc08NvzLt4qwwic+rZhrvnlK5y2EpPLzhm7yA/N1oE6elI2u9/jbtBF8iO8aXViD5Qp5IHuoTw6ckXti6h9rShM1tt6IVpaAHhSHqqWL9Qnvmz+dTwj1Qp2zowH5leS8waF3hB54lyDh4APoqiw/Bnq75k8Q4pzHh19/2H/9+QOfLe+Yntz0Yz4Xdtrrf8yv/amhLm/hLmWKk0B/IZvrNVmdCLiYI5KubMiRrG0VHqQsxNW0IKDeSMrwcRdk0Bbfn9vav9+WBjRnmHVcF/TBv/q3VgdMrC9DnZ9LdGQPkbKJ73G8AwLYkF+ZMC4N1CGFqTnHFo9bHzQnU0etAfK/VI9AuZMyORvA/05Lc79+sWZy2FSlNachTbVynGk1vD7s3hJsJf1lSMhRbcrIN23Ol3F3PuGkV2RQv9j1OWDPGS+rdQg3WDvgmWJrUDhUvmCJ0JsK9KoLlonmEraESwjnPDdi6rNPp/S2g+l0G3uuF06ZawsScdryKDNu+xotIKlBppRgmfsiVCEeVGgzEg1E2NMSyKGikhH7hs8lQHmdJauvm5YhM/V58kKBHMJB0Fqc5CtoFesK3Y521K2WV05s2DAKPyEgkSD0OpiPX+P01hG6UHYz4RX0btdeUj03R6yIRiDTc5DDFaUgvSsdaBAwxhFfPNjxqNrbPuteYypiLDbapnbUfNGTue6xFXdZRukePqlr+EapOo16wzgDVAwqP0Cf1AQ57BhjkGzQWtdeXNWTRyk1glN2O7p7Uy8q1CBm1lBXhMlScuqFWXx/afYbHNyDgtD8BsI/fjPl/57VNqlKko5NiWoUScmDOFg7WRt3zk6uN55Tkm2jM9vgGRGSROtH0uoxEm4COZQdKmvAn+qiuAum2JGnfnhoXTS8h5zYlOk9ZaxXx6vA8fEZSch0LIYDajGHuf5tOKGkUgM724AJgCkCfjFRWAanXOQXs5Ub4I01PEGsU4Q30NdTa30WJBhvScsvDd8IDlPh4kyNqjH+P6ehwMlMkVchxRpo/YvhRpmzKmbmglwtGUUB5fNkc2KP3ZoQGmAD141Zg5JoVmtqtlHGN8zIbstT8SVAY+s4fshmP7unrBa8aPdui++Rga6QXU0HPWaeCEl1ytIvmlzIR+q5wdzb6rIIfRuP1+oG5REBHJbZ155bjYATNlPDw33hSv0d0zXbaOsSvjxFtS97KiiLZlCDnMJ7TSyLy8h17IMOdIuyqbXpJmQECC6a8sC7zeqcQ3KpUZx+PQj/4GqCF+jPQ00VOhhGm+s67ZgEXzNO8DDHTI04Aa1yBZsrG8zHGOZunurIDgPih+0ROUFduiupwbUPmzlJDrPnzs99vPMBRa+g1quSJ4xzU4IRmXmVnf/uRYWz7okKAMSvejmn3bEsfM7vygLVkotZXZYmtnkj9u1VM1Jf7PgXC2j+yB35VnJDPCSc7EI7Ru/gSgHUgps4KIEztcLV8FTOcokuPrHludGVgCrPeDtHq5Fg46IFu+R9kKtoI7gySnRI2AwURh0s2m2E6U4sJ4dwRSgqfgNsS88kVXZC6yiPYrcR594+G2pSMTMsSmFxo8Pq/k23+7ghSPBWSjT2zZf47ew86pmkRNHR7IvJDGjOhuvA4ogVMCWad64wTZcfZ1i0lbbXeXJ4NZ0jmmA1h20U5TEXpc9t54Dbm+6rOtHSH+4XLfEkiebQrSFCj6QujWqdbEKGoHm7gfG5ujTmjdwLA6ffmlbaHOHoqJSJsB62hLQsEflO5Q7JAYRL9cDvcgg4N2iW6rWQ/5TxCAgMCO7dIYc+jXhQPIFyFTfrMyVPWx4fu/LA59MO6ePBsz+uXnKr2WPhnT5/Bu0UlE3WGPkyqWJewRWXwVC82nTZn6+J4yDBfLIjyW2TuLc+/nKjZr5cULqIIx5Scfq3u8KC4Q8ByhHdqe3OOpP3/EdfiDILnWckCbqwYERJHMmR9+xHHvgLPAwHCdr/M01tBwIcI99dMG0mYmIydeCUTYttcNtjlVElL3dCFYo8sgWqsgk3BR4AeiwAuyEojpEpVkYHkq8BlZmYq2aORwxE5cJ+AMJCQMAwDiyf0gWggFl5MDqCrIxCnqqtjdj0fPpZwfJZsZCpAWqVXYBbNdFAYYcDNRzo99b7qbeG8dVVW6yFJ640wTZsui+RqUgNud7m427eDn13U12Z7V8+IXLsrBjBCe7QIXudP4qGJy4FUt3Dy02xbceVJc4i+YcmLiBi1Nm2e18K5QYW2B6xTiLWJjnBZ7EjQzMoD6uoNV1jqk2M3J2FTGnJL2OFSOYm6zE0WJmW4G1D3GN0TzJzU6PRaacV6mHupMWKrrUm8KURBrJUNWVRTwvUoAwwjjpsRkMTycF5XmdK7YpILCaKBeskeTV087O0sYaLqCEcQrEAPLCCKj8KIeDVlAo2ppo64r5h0LAbHaAHFmCXiwboYJNcbFsbE83Zb+QxJZ6nbdMtz3r6AEIVzlnIdJu9gmzKRTF9kDqjB6Kom8iJH8WU2x/srnELOuGYkajBe+g+h+A3xkMAC7IUHgU5k9DIrwsCRmTVB42WYy4kEmC42eRmrBkVOdFITF3OIsqtdQR4I8uTdHK9lxv2mmmQZYHzLNtprVnpaEbffI4wDLo1RTd7kMAjtJor0FrOH1dSvrDpmT8MilbFzL24hHXS0NAktooCBrnQdszj5yrMrdoZc0hBnTZ7NcGEoj0wC8kXxC6EdzFNXUvoHY5W8/1rVYv7ZsIbRnz0m3q66r8eQDq5avfdf0LHKX5UOhqJ+6cR9HLfYT95vG1k3JAxJ+b3ZAxYHj1gAVNLGBxJz2MGKvg/q1icU46gYl3g+PidXDIoOEq3DyKJ6rFLcu9xr7X5kK6YaHqEtmeUen0BHmLkxduSa6fGmeZlldqapb2AwncladG0vhZJe5rnbflDRyFknU3K0JqAcxWqD745Y1vCrjRZeKPbJgQTdz/NEsXYgOWwx8/Eo2rpEGtS46KTS5xEbKg/BMdWq1ENOuMOO8G1EfxkEm2bFnTU2uGfJ0XaR7KCTKH4gbUcHRbc+psmdNwTV/MzGONYeGRz6EqFuVyaYmw8Z8nM0j8+0rd51WqcQ5tRgiqD5c8LfHV6QKvV6tb2wqvCoFWNK2qCQwm0iwUtOWoyo/WaoMhzT3nAKY9N4ZPJSVEDAnEENVkiKGBOTjYHwwZ9SKQMwynCRdghLFzBuCnBLyqotPQCHucxVkl0CV+MGcuzb+g5HKqHCQ3scOgai6Uds1yD1n0CAmP2DPN3UqlQAyVvkBfZvMBx1JgxEks1NUeJCXmD78gEto3dw6k83IlS+OwknKarjqkDr7N+90JiVGqnB8lYdIdYivT/CaCElo9hRO4oXAPzQL0K2Mc85AnSKXx3tYUFfU03wIr2MjgncKwfM97ZpmlKYihLmh0vKFqK4m1V3kccThxzLcs+1HA9m6EYbx1gMdA+nNZxE+MHKX024MK5/tdMvHCKNBL1G49qK5wuuhr7LNJeIo7mz5dAFZdH10JV+QoXTeoHKumigyo0xqYuzgjkhtseSHUFxSB2PKtv2JxEdNpm4+BpIE27Brqx+rlagxh8QHPkP83b/caE4xAANaRBNzRH30tvgIay19rz4gUERk4N8KPJ+IBCz9jUiVvbO+S3yIoxFenQJKRds/EAiHrmGxHGj51+YrmHShO3Aoc+/zzjpegu2CqMAdvtKRd6agU9nLbnX+fWmf+iLQQgROZOcz1esCMfULoC6E/O0sThQUPDePASsth0J/XAHNmxMcEIN03vyBi9R6hh0yju4cb1AyaAezd7/GlQ2kb1o6aeXL+sVyWIJ4CIY5/CQBZCEYHUobmMG8fw7d4MUqTkB/pr5iMEh48P1gyIp4u2wO0DR/2+OXkIPDvtla54LnxiM/GmwkQSfaCZLtmCVPnl4aAvcQlE9v8dzWPZjEt32tUejfvwou71/0NwoWfd232ZQTfJVzk8mKhCUQhbfEuDLjEMuM4Qoc8JjpEyPr5K0MUQyc3cwxi2GayndjyZcFNiQoVqY6M2DToDDY2VW/yQ78S9Iig2HMDeoHieXRYSCDv5+Y5SphPpjYSGFxTFel5OgEMuw0v9oQcEAo93R30MM06+Tn6SSK1fAgqzEUVvP6h9CsoMfleJwY/7BWRKQnfIFLqCmuax2wxyw149G43MnjrlsVNWhws4ZCmYXXAzU9vtaQ3AFoonN9mvT4NXkGSJmUToHTKG0saZsjlaD5xGwTUMA73cU5Lz1zlCUK5NRml/s5Gqk0fS+ZUvt/C4XV+3U9c3coYnZmvy3KwKVtgNAr2+NIcslj4nHNqev9FwwieEAfP/tuSU8BFMHAyojECapjvz5DmKjcPekGy0RHtxrxZL0TZx1mF076ujF/4KJCfqibmPWZYkooOUnhomde5P4qHoVFKL2SKNcGns+iBQ8KQ8Oo73BEkRGvHDlUCw1YT6LB6Px0wRkl1TgIrYCNmgU6/W5mxX4x+8NbBVNpFzla41W3fxddaCvVZgIJymdNns5Z4dgbKgYCRQaxEICrJUHsuhwpFIJ/wh1o/1KrAe7p3WUivLMi6eXXCghxmHBVD7V7VXIHzOBH9YZGRLjA2eQRskHBWW96PJaSQa4HYLSKl0rmVsW2HErKyPwv6wMoJaAvEAakLD4ym2FvWdCvWkS/l7cKMgCkFJSAdZjpmqy4/P0DU3Ozml79FMk9HxqRgPAtN3sk9/RQveWvYzFc3yTQK14dtbMLPFN3XNf34r1GjHhyfDwE3efF27JmwPOpDp7I5+JCUR1OV9U7raMAaHGpUAYQ2aG4YMkc20gkUN3vwzmQ1l7hHnVZHJvjrfSFHvveOrnHUrOY2uVFVlCQX9hN+hQCerkxuzArDolfef2s5OoKgXd+02VHacOlEGRHCpUuYvSGs4wWk6QMfuMuVJXOWhj4lBH7Gh3o6T44mYuNpIZaSrX2lTv++GDXWTXDuT5+LBAzs7TKhhkurBKjWGRFTmB+MsoWMusgzswCsoHHpkEIpbwpGRtEa2YW8IopCt4WqhyPqhCgEZcBvMBfkvala7wHOF6thYoUPwiBB+5O5RHc5QKfFGNuduYg+hg1VCsmQJ4pb20mY2PzV/Zq/Ic70JwZjb0fSPwQdJw34jKt7IX+Ejyh8xYFPX5xIGVURWG1GMVxtqig4xPinIXy6P8pN2w5jUtYe6kMOKGoPW241H6ERMh80AvccHY5EsLWd3CBuHQ2cX1ZoF6q6K1atHsZx+8HFl+iikPnDDfaboB+9tGI7TAlMW5RmupA0036Odkl6J5gwxQN05NtrjGUkMJOV6ylwmIROxI6AETGQYvM84lYybGl19sxCbuT60Gop2D244+dezsnnfLY4Mz02H2AgNJIPDrKInunY6BQMLkf4F8QxXVyn0miNgxm8h3eShJuzeOCIDQQRAhlWbjEHFmCzwKxCUIG/UtufJoqYQrnlPxpxinIe+0E/DUzszTBg4vYMp8IVCDdMIa+KGbSFsTzUyg7kXQrqedveF2r8vZoaVRLblagTTuWIjPIrd5/lrTwtj1CgcMFxB1IS0o9hO/RtEKkrY2ke+gn24BbNR+k7nmfcjj936gII9wn8Qfq4En+CXfPA/jriONvnLrebk54M+H0QMMFMIdEnFihESfpU3JogA6RwiOplImLOjHf8w3tBUyHWkd3l7afrZleyLTd7i959cqALUwn8qm509POXyDjfrS5y9MlL6q9lyXxiyU9IbTSk+v9wvFCCUwn/whxYL5qZl9bkFIv2tGDQFxguJ7xFh9IoQmw8DtbHNaI/Wuc2pdnwCzHPwUQK3Z7Fii/Qh+WhWoN2Iho/kx2UjE1dJQn8cwlK6iu8snRfZI6lAfKhTsbwt9m0ZDWY5HnaF3xl1LHV2Wy3qFRMGFBvJrAt6a9v3UMEHt3io4SyYOh5XzhySeQqbTjFKunvmqvMDEa9Cj/PiCcudMHyWacwTHK0Pw4zVNLWm6JrDzUNr82u+uYqP09gVy6yZp3jt2GDnN6AKIwl3OQx7V4ZcH7qTaBbHqm7T3nN9nn8C1Jba+KWwkh8vaHnAo/rPZC0pt08Yj7LWTjQySMkHcnjGu+3Id6kuDtfHsFkkdddkW7IQKksH40dx0iU0YikCGxW3q23kBqwVjWZ6B83d9JZaLFdwE0seIivZXW/iDoB46qpJvpBA+BMxEuFjDAFBI18SPU0v+h0meGc6S202XGPb6TDsOO71XBjKbp5kc11UiT4cqsYMP8Uc0CMCzOdchXCjgp6LsFbp3rGF96wGY2u/5kmnmi+OJj9NYD4Th+UVRDDqo3vIQ8pr5q33wymXqdjn6mlE7IYQLmgTFLLOZRHOoHgCB8VTjHKZvbW+6TzO0Ghm650UWsRp6ZO9vH8Qv2TN4M8BXs8La4dhEzD2AC1cnvJrr/5VX/p9f4MJA7KRkj37Xxf2n1C0Ii7m0fbQqXfbrbPiRpIvQdjoBhFPQO74vSro17t+4O3wLY1Wr6qkwKrrSrMbCruvdXEExYfcNrGdV7xMuvyU9dm7hkEcKoK63kgbW/BkLaxY171NSniykS87h3BMmzYBJpA7Sw1zT2rbLrz3P0gYMj2svEGtzYdhY4E+sVDcd7TxTXcuRixkwEZXTjnOavrojX2hDVpQXJdkoRul9UWpA+pwjAxfi2sve9uEcWBIyelgNTEAJ1P6UJ+i+3VEcV0FY6xnRe3rWy20GNKyNqMtkn+LMBl8Q1Ukh6cGvSqTHS1VoZg8J3NP4gZDmiYJ1zhEzmNOjQ4ceH9xn+do0Ehi87LlorUcFSyNgeNxhsHGy4qgMiFEJG5b5qhBOBXDxkRhsmD6/bqlvo4dUYJeDSXF0E9kJASXDcVFJRhXrcmjKKMGzc59lSsdJgFq0nOX9ZT+OyX7fiDuXfBHNaYxL7HBH631stT896VBnqUgOioSP3xFElnXcsMT59lPLOGDzBF7kVKduZdQYGwo+kaz3uQLiqjHQqr46dKPFYIfh/MbKu6riOMHyuc/x+CPjHG+x6SNZGf2NWlUkSfyhhG+78p+XZ8RFV5+7RYRws4SnIBCTcMTyUJ+ZVOJUPHdSlRi5glt7bSSOw86sSJM8mHUtK84uTMW/nM9wvejWF7CQkIvkx7v1rMt9r5MaN5tf07niFXn03j99s0sxqNuO6Qraqhx+oskOqo3989T0m9AekTudoMHX3Ib9RZ+X/SrEB5jbdERmKY/Ph2wXLxHCZ4PsdgKPUB/ZznZrN1fLuHqyvcK1Tu+SpnfsHfzMd/I/Bdl2zaUJ3MLuIDiLp0gRe/5Eb90JSwQYKzm6cWfqC+UQMsV4tVOokbsHvxUslpj0uM6008v96oYJ6aMj+0+QSDgvQOJhSnQvdNM9TN5g/JNuveg0mTpTGJthYzcrbAxa/SP61dJEpuGgLl+VHHj6p8C596hSHEr2uqd662op/pVJcCujCujLFUfYMiz40GE4n1m3OJcefe2NWZijUQvB0SI+1njX1dzO61Yq0wX/yRsSOO2aFMsAzI6/4r6G5MCPk+bk7sb+MTAy8oviPKfJwEMmuGJA5JASVfKnm2RdLYFnD4pdVcY6aok9/7XFf7D/l0KVClF1DSl7nw+pkARBadTJhw52TGYwXfqu0cxZ0sSwWSXiw6ddqL0M+aO5mMwVEYXsDGeLa0cFF50d8gIZED00wDEsyXF+e19vr4fn/o6cCv8DMjZcZc1oYm2f3ruJjEcBXGda2xps4eL8/H9s9jbbSbS8v7r0BvVpXgaLyK0C1BEmNXunOhE492u6rOrVMEjlOgqF6SaVDrG9I5XAdM5yStxwTX6uusN8RagZKpgJth7SbfQx7D8IzLJtZAJUEFBeYTLkTls9q5FNrCIjACczlQoboxJfLFgcxPdUOdvlUAD9TXumfTbc0uowOjv3c6h/JP07cO04NCdKW7bPN3sefbuM9Dm4ETiTm++3+3cLQXTxjtScyw0DlcECU1Ko2pnWFhiTUpFSP2DK0p8iibM9tG8skOue+2xzAxpD442FsUA/rAprybFt/1y/d/m42ft4sO2+TA4hxxlfg2ZS1nIxTxYztFEY6oR9RBW8bYBHe7wMGIhPquZ/RhDnZ4gBZArAN3zl9bVi/vvq3vxorS+5Zq0G1dGfmhaGt47B+qB/ouk2U8FhwTqyvfZNiOS9fMNy6wlmnYABqVoYFcQ35Pu/BI9lKDnHJ+3ndM3/7vsn6InrFabCo1rD+qmalEnVOxE7KSju6lJy1ljNIj882wn2zokEin2++zPiVjzgL3ue6XbQeQAIbdfcJYbwTelYkMkfIqNFRWtr8XhaBA5bBYulkIK/xW8ftLhMBatywV7nvanyQOmocjeT5UFIND5VkN+P/dLz4TqXmmgzNBtz5MaPuKuAGYNIW/wc5QcetOAn2DjdLvdi87gdjUOibUB6x9wVA5nGC+uaX4P/MCo0p2ihs7bV5bhGK1yyas+RP04GssqrG0mGQVy15FUTX3tRnCCPQdwjOr7jI7IBxq2BoGhsO5niHlCPrJCIIR/twF8oa8gYV4Y6BmCwgFrTCdJDicKxYZhn4+WHl5Ff4JvBzZ6lIvweek+u6cwopm+e4vMQVUf1SLl062JxNgppiL0ChzPIzhHrVnjKWzB+TNg6NmG3DqDZgNsAlAAbA3SFcP2YAXYaIKKPGaXNL9O9btC8o5W+BczuPKTeCoFS3Ujdw5s/nAk039PYIkSJwe3yWtzpI7EvqaIc97z57r12feGwPBc53t9dYKH1SEw5KImNi7x3u97iwoDv7jZ6IaEwlriwuk2pHCMKg27jEil52CoSW2FNAJ3yC00dd1DgtulczkNJszW3deDhhLmKBhShMOGcFDgmWANBBp0hBZeoNodoU1K+MIClKKB2M5sqhlOQgpDY+ZSStDRxGgkwagD9rBaoO0qLcLVPzUo32PO6TH5Y2sBX18eWJP4vKtoABg3HYDKxh6CZpuEDoLywBESAT+kuVLCFfTCijnz4H1bz3e+vn/u1xbkKa7PGDC04eKXqCWoIHrpBSOQdOwEax/03k1G/XFJueghbmTEX5SIw0huvhmv/f3tu5vY1Re9mQ4rnh/nn9Pnc3luW6ELPy3mh/6kce1tDm1PVuXbSY5U72dr1OhdgiZKlb4sxbqag6PVbZdBlLSmBJZAeUe1RBsQ8c5hweGQoX5UTUPPmIpRC86zt1yjpU4vs9NtFesM1MGworxY1dN3URucnstr3GhHkIdNrlxOKmWBZxm+NtXwKV9u//7h57RowlefGlxVUq3HESvYKLZTJx/dFNWsMysrZ0Iya8kRRo5RUncdDE4ysTKPO1yqrlxMWOpx30sqATwSAth9HyGpEsTXzUpd+bGbaYUloaMOrKahlcUJJeSF/1kxdMEy5kKO+2xrecx9JYsX+KqRLmxzw2NViZfqrtGpdUc4d/RbEi/rIb3ovEqGqrRKDf3KnsgS2YMfIiJUJhzC7epDrfKsP3cVmA7yBJc3mBxl5cL3mmK/t8MSisYw/tbjti8yAr+xkLUqqWXG1TnXJ5VtFj1t+Xcizavd6+IRUGKIekVJxPsCSjw8FULecTgEEtRLojULS6aLgSMEoge7qy/4YU/cSyE0DZruMrOoBIjdjgDYAQSNozpUe6rbR5uupflLTnB9lUMz/fcj5JeckIi8UsL9VzkuNTXnWZvAqyZqFMzLIfjmtMTM1k2U6MIQOqSDLivQhA6HB7xtulbl6O7PUs5dnpTReMzCP+r3ItQ7C5j9Vv/5v7dBY/19ofi/1tvL8kF+AfSv5z04RT+BgdXSFLaxh9g5qyznbPfpNc8G6las9tPZdWp19dv8bRWP2PphEcnva3JYBM7IXTnPSh08ZmWhkLn+lMb22e/9rUwV5tbiEc2kqWy8BKP1tZ6z4eG2jB4mExr7BB/U6gdln01P1ey1w0E8wQufWgxYjx4sjhMlFi4+NBvp14B4WAnMAydXSu19zvEwhxfpLYfHKkBIp2D4Hey7MzvLxXFvDc+MpFfmbBCshIWOEfcQt/amCojATg+zd51i2YapWAJrgPEJb9/Qee10k8S76HRlWzOifw5nIoNPT23csM1mlu/aKfffYkvnwMhM+XqHSljh1ezE0Gh006QxVlH0s5cUL+k7RjdV/rnZ7VpWnTRldfK0X4bowBEp9SYscFe+HdVr8frXIONvnQ6ZOo6WNumtQjfRsZh3LQNTr2TP1NZpR5UC1Ay9hh4fnDjy8bmPbmqr2jSmpNRONgIkDByyi98gCswJfU1nK1yPDYHklOrGEnIQMKkJWUk2dV//naf3lZr3/ALGUfP0ncbG+JgCJzbqjLF6nAiSLrNlf9pmWa2raZOyWW2njevG/WV53bQ2rg79Wc1w6mMw1FK3JEZ62ZzdfjQJt4CBEN/K+eq40bhuLobHkPRLvANhdeFGWfq0wnZ/TsI1MWXqP2LOX0Nh1QnqG/tNhmm7lg0nGGo3C/O4EKD5gIk2G8hExTY569Vy9VbV7oY0rJ/vi7zceVbyyKR3sbKWyB48+CcyRxJvYKvtTqUTLckmMedAyLCGjYZNsAEs+IsH4BddI3wQ2pnILQDCM7C/+yNwMFLvoYDKckyMH5ZuPvr6MPiLRa3f9wwHF2zhVzvcMlClna98l3xhqU7Nzt7XESnQ01W2qP5ZCCtsuvYT1H6JXZSTK9n3g1gF788cxFu1TPPE1mNirwIf7ZLs/sMy3taTURajiYTGTk7dPF1gjoZ6C3GXYhje0ImzdD1jK4iwqVl2Xbc0ezs4jFuctVyprWbojnkx32uOEmF3P6pinjFyhmZNPdt0la+57KBQZy2D5w9BWVD+Q3qJw7M8WSlbk5MPy7lp7HnFW8nZ7KmUjWl72hsuwi2W0ZJDIz5EYplg+yOKLtujPfD36g9WuzNg/KrRttgkx6AV09F1X/G3feVwgSDzfkDWJPR4+mmOLVqlO/pxTtMMbQXWE1P4ulWSCs2pxZ6xEH9jku6fTtbdSMgHWeTIGYM1yG+ofze5zR5Ze2Vd3/KBpZ9f/xsWbrdjM774mGgSozAjvi3k0+F1R3ght2ly6rQQT7l0GlQE4jtxv6UnY64D54JWJf4qGzYRc6d13GWZp5NDBMK/g41PblxNsvkaeCFnDtwl9yJ1VEnnoHTua2xuiT6K+l0dDjXbCoFfwrKu0FTL+7y5kcZNFCU06SJ+qNSoNOwvn9Oime/u8vly3WfHdZ8cd999/0ps9v4Njn8M1DhC3KWa9yqdL/PNb2T3SagpfEjYJieeoXln98nx6WbzysjDNYZ4l7tOyl1n3V1HHJeMlanZNov2tcDVhr2sVNeqQMP+cJVh52HjrXRwQiOziqLaEtn0ZrE1bIxjas2gJqSgOUUtaU3Vx4nPTxM3Dca5MxAJX4B3lz6+d5vavTevPN1eJm4OXxbmATR+Je18YbfsOcL2mryg0adQG838Ykg8+qauIDWNGMZkcv60cb/GQToDqGc6fbHUccBGwb3vL3uMIej+N3vamfoxI/KZVNyNqspV8aCw03S07unfsRcLLd7vNd4AdQh/5bZnrEMhQ3tCk372Q6B2EQ8CYD2aG6KXDpNDgLS9VFE38FI9CJvu23Y2hjSvn8+yclZ/wbw8kffT4CHwJudD5RFZje/t8yEVI9u8lKQEw0mx0IG1wfzH0fXjv9DC6/80wa6+9B/syPaSUP2wHaF7FLlq08TkOqKP/v/PsOFuYMLAx3WYymO77//JH3GCpcSSyerDHzO2P+4vwajb5oJlAXSjMWkgsNE4f0ZF82rQBDU5FDyPeF5BImVSMywh6os3L5qW9ZL2XF8NL7ftekGXsDJIwwxDFpbHnvEbVC97HuihOlEb2PEz5vZwryRIbOe70S7Twadub/B8usp91atfV8JXYArlU88maxOZqE24AEMnIB+704L9JkvPM4m7fEpvOTKeM+0aPaiRLYocRA/lZ+FOvl/XrHi7ul3pMjveKv9eroMi4H9ID57y3gFt9dkqX8qrU2ZdjNB8sb2KLxUEUTX6CeKHLHRWIjaIqZJa/uFJBZOcwYkFzwqJpzVOadGjh6c6A63Ikx0t0ajHMdxsVYfxge+atOwbPGzwIHNdz7HHAI2N+szTPMXeZ4UPRg6OJFfCQaswRmS+rDLVncrjPFIsR4Bee5NLkvQZHg7GxptkhtG4bnHElxd0ROekUk0YlQs5BRspwwwEbuEs7UWzyKhhibzkmhzn3QZWXn6WG4JWS6906hEBMCiEndQQuhu/SPI0yiUmCncwKcSjeP3jEiMF75j4uAaVGCsaZD5FDtlN8C/3lA1bqUT3yRkN5ap8SuuhD0q4rhkDA8FGoFRT60hoj7ueSLuxeQsdSz7i8/SK2fRFC9kPETwYtQk5o+q7s4VRkajXYAhLV5fwTgnjbw6aWyypjbPG8L9mgP3qwXRcO9mGqdPfd6XROzhZrJ3luy0G55V/pOgj60xUiKh7VE1MOnCGjgF6TSu8XFuCg+v55cRjFHLrnpgJ7m3dYAaxWQ/zOS1vKjmDrvPwZC/r7cD+fiKsDpBFcG6YJhA4jWJbVRnWCHKrOfOoR9eFWcWmEJLEBVAmpMDo0TYwATbQtR5WsVky44r7c9gPesDYCkJ9sgNvHpvN4DTewb5Uai/zZyFyJobxNyUELXl6zJotlu5jq7+4oXlRQyufnyGVGaKWp8yk9sSP8n0JJyjNnjBJ0blbf9iFl+2q717JafLg3XAqwsqUv0XP/K5ScWp5Kwv7QhY1TrwEoi3v9kaL9iIplnNhUpRgGYmthVtjbj40OG0aOzA+Gv16uhzhaM7XjC0rlJLRBFEoXTgHJNF3E9mVW6xZklLuImxjtBazNMlZuXQWXF05iF1DXM2v6k/fn5NNSDavd3qwn/L2qM/p6hZfLGMjLC+otCcwqoS8haPrc8xLtfidpV0GM0mmYvkSUFrKoGPvLoRz75HRR+WzBk5bZ+8rgi+TEebdT8vc1bzu1qoQ9C4SENpmnnXupKy3i2Vyv5nKzK3kgVxnZmGR0+H7uEhAdKkpF6HAqnyj95NV8HegF+kqGWnhq6I7IbU1vbyLOwigR2aJkvMvyw6Z8HJCtInPMqeeLFEc7LrTQRrULLjVS0Wb+ymgOfNQL+aGC1Gvo5prQ88gWW4lkvM/rQ11SQP5ekV5sHHZ1yGvaaWHjptQAf1R7qT3SpqyqUpXQ+OljVMWwKSeK15IWtQiVAmDgpBrtuyMcq10MciF4OsxR6IIv2bHYt24s9FfBGUU/JrgEG4OxeBpPtkigAH5SAn0CcZ65ztSESwKWYLRmS/yvOFKlE7hkidMyt3aE1BfdldvHAlT3jXD2Ts2f/KsKE3myfUqPS40LdkEKc9pAqhuN93zN/2ptpn47TPXbTFYdsLtshVGEAKm9fDzdkV7JFGEbId6F41Vt5W358bQDXN85KLvSGIxZa9PE0FbCuK42KQhF7ZpM/h9EHisMZyeMrg+oUwSrPZ1KHgwC2DuQ3Uj1PsAzNZFnnoyPpRRX+t9eQB2VgMKpCi1wMuJZSEpob2O7I6WfWKFoeGRzyM6DEoKuV5pk9yS6hQ3ALd0aZo2bU94cC9JJHOotZwygR35ymHgTh8IGuAwVvOcZ4SZE3RFMupCfgNIlssrEq8uQdtr447/XoijUTZDIf9RV66ietYgPtV+GeeJUMLZA2AL8Kw8zX4ISc/tWPEmbpIncTRYwowiyTX6b/Iw5EJe/ZIi0eH9psUzMi0mU9hvnnuvrInTv7TYApnkCQdYvzrps9FpptBTCuvgq8AypfjfDQTq+QEYcoSO9ygRkQBjTGLbNd9j+u01cXc8CsxrA7cJrCFexm8Gbx8H4/hdaqa5y2wLSpd6klmJUo9tLNNLqDOlwZtJZuPNOzFpG2iXOIguWQRWqHAvhG5AfUcN5kjq1ATtgFpwuYzqKdjV+qzVdm2shG3BJjwCCKad8AFfz2zQwjLh+VewVq5USc6MVM6IQE96pLSaPjp6ywGJE9/WIQQe+Sa8OYtSOXsimuGogoHAL5m8z8N+5ceaXRPOSag2ozSpZZ8Q7C1ZohPF7LV6ZsBv0xR35Ij9VM8YGLn9aAZGDy3FkVcH5rt9sVQkjGhGLA60u/Zm9GCDitJN3Fw95C0dR+tEkr1IXHpWYJYuBHldISaAIjCHSOpcOwkM13/aMgrTQuu710g+/z0IdKB9roK6kEcBqNxKAejuOBHK4o/i46v75I+286HALzT8B1YbobPjyH3IftoMv5NBf+X2OTtbcy109QdxEUn+QC4rvmqS1miQHiPuB+CJG7CGk3RKm+TRkwzCZpyzxTxKeQV4cFrkZnIZ6299bkJw0JmM7+bOy3UarhchQcuLh86hv0I8llN7v5V/rIDlK6dXvQgpgoEVmMlGCSKA/BrqyBJzbMrcfCc8bW7Q7DMVmFmJOuEbO4tqjsWkNnCwl9bB/b/jQ+m36BWVYMvCW0ZY23aXg49nJpEFxBdQGB2x3kfusK/b8pZeutoZHlJD17/cjdbtpewQ13lXF+r8w6vCk5Ufesuvxdd7Y39AnwbX/x82CZ62PBxXDuvIeHkpGKXxeTX8kHB7P+XCKIHXA8PmFikziEayllbaGbusHuW7Uj+SUTJzGbg73Y1rOPIFBHXN3TKR3vMpSe/f4qByOUiHiu2v3eX2K6HDw6CubIjTWcegd4jrnB0JBmFs5DsuhaECGGZuPmzehBN/k9aWEumRri9OTq4eKdMblHfMHl+zYm/rnfsaMfrCn6cPQaww6pRZqaczh0nlc47knl275CSZqa4AC36tfNi5UgfElE71j9zBe8nSNxc/30BjHOno2TBy2yLRBTGU67MbgrakI9Nc6UzZiulkcUplQ+r2u0UorF/+uFYcg1JqQQxL+SCZolVnEo7OXLA3KJl4IpJiX1Up01UMergU33jZ+AFDD6B4rA6ks7zKN9rypZrur/Irg9su4HU0X1350bx78XZPSDdj7yOEdmBc4P3RDIQdCXuyzIMGdO0U6JCh4x29+M3qqyk9WiacrAYMbJL5hLZ2btP7t24bkgwEa90QYJYl4vJUWudD0DaH5Wte5gn2ZqDctkApy7rlu3KE/ubBTIZXAZeFEn8koEeByEv3LvtlJvYlnloP6/rQABjtRBaN8TIwjOnLuAdS9C86mlynYodmcMGS/5GJkURj/Pph8+jnexT4/cl6UhovvUXGj/3x3ACa3iuRzt5ymw88MI9u9l+vlJhVFfTpRypm3XmJhUjcvgOzzXga1tbwVXdqxJXUYpbFAC1PG9/6z7Y6RwyAPE0k/M4AMfsEbQMK3X7tf+ZQkIOq8rzqaIqKOQyPDM9TczvNiYfiXWrUNvpG5Mcf6c322pP23FF44WZXSVU2jAp0Kbck2qiQH9wqybuUFC1jxf+he2bfl2AL2qrVvsJJHdToDC6Saai+zP2RQ/Py1u1Oy83eJyioYh0Y6LiA09BZwuh3j29iNcA1xFohYJw1hHWedq3ZNT/8bNX6vHPOiIB2F/gSvVQETPnezLFtP0eRxtbx9Jrp+8cFyEEEu57oPrd3kyXPHhngcS9IUKgXbcWnl54murpkuJkaKZTPFRh1Sz58UpQ+AraYHYveL8W9926eUre+/Jy31WcGZ7WE7bpn4bM9B3ZoV2KeEHt9UVWuvCz3pL2VTw+GXej1LrhCL/oTePGZnIFK7x940pZJCiSkdnZrO0FOHUAmmMUWiySUSwEbgTcKiOwnH4ybfmHxa8iOBK6qa3IdSUQPxvkwnkw3nkeRlC9Kbf0SzIHqKnT2xiLfRT6L/M69BnZ2VwVm4lutq4ZP1dK4tzm/APPXoJwdtuz1OrCwVyJlV7gRb/NmpPxHoljNMbVjqCzjvHqDGS/Cn0LUA2dVOzaKkhL5N9B33eyEtqV8vM/4K2vO5PkomHVGiZyAJLVWtf7gyR0lTEUb7XYqrE4R+iohZP8aAdsyIcoji3KoyTCrSMC9J38COmsg6bSw6SET83/Dnnui0yzuCN/B3WYDqWlSKrizhX4D+Qr6eBACSDC+9jeSJH8lu9FS7Whenx77XO37/bhG7NSh7YWCF6GL/bY+PtZfgS/4g00JFECSKtxyHfz5rScHByxCbMGhHbgjKFEkb4WiBZiMMb1ag6xCh1ROtI+FXfEdQ5QwhFlJ7YXchQ5e255+AdCdX6Z4mdo634tKYctuwPxfYKOIOkw1VYLviiDEd1Nxq9FXaycVTUNQYqcVLaDBVLtLJ11iEoHBjXQgniJWbaW2EmQOmuAGz+Lh9GJtkvLuySutYvgTfF8n21KxGXBZ+Z8w2dF57U7lwYnO2y8p0/ubz7N5t8i40+pLkTcuCmJsYDttm7ApH9aiuuROXWhAKEFaHmnYsm6wFfF+OAorWWogQUjPNd4NUupFDlNU0RvBKs65sjRWdc/NlEOMUErJG0k7OPmQGeUteXSEpbvtaZSshPSyYtqBR/O1Z40+sGzYy7fp4mz85gsNwPtxKNvCJCL4jOogD4IsV/v18MHLr1LdDVtb3tCxlbO+Hvj/XMS2ZZgb6/2rSjWmKK7KjuhmLySis39bXRxOIO7FIJr3rw1o51yKnyxNa6s0vFYcWLq/tnF2toHZKstvjStZm+mSBqr79E8oVy8p/fl1dr/0I0qNS2Qxl4Wrsz3kn7sG3efTqMgrH1k/eR9xPbxRdsq+ttToqjv6AId9ayUT11pZG/mffaIKRE1PqKKcOqrwKgBCkhdIRQDMFXgj3ixthUHDCTXX79vF6kS01o/xX50X2LJ8eCbjv6ft0WtmOBo6t/GUfAMSwddSOKKVGLfDlTXT/alpOvQlE+xb1q2shensnKoQtMADeKnsRC3P8tT5+VP11VNnTgzE2u4e7Xjzm8nQA4YJUxT1KLoVN/fs1YE0WBKiRsvkc2GvX+eEfIshEaf1bylEEAZ4yUPrZeyP/jH7DYWPOlZGSXWPyNqPOFzzGDu49/iTh/gztKdyMpT3d+FQdksd4pllymZD7m0+46Um8u1ePZOUoNW3lkM8zlEXoQaZZb96PASHyMWPwptfZmIvxtDdVn/q8Yb4P1AXwgnOSHK1nIL/uWxoszqpHldYxl/At51yvwz19qrLWb0A+k7Xsf43C+HLdXwdP0hG9t90iwrAjHwIBOn/NQU4fENesBfkPm23D0ZSi1JgVzRVJS4IXU7CbmNMZ76Opjw9rLVmr9NUzdUueLfbujg2D2rUhy0m0n+JZcizEQl4vzz913oXZptfV1d/d+7f09dvQ54E/ru24Ybcd4S8EDy6mH5g4KHrlznZkOjysITr1gTzqFUx39mii55B7SGbZSQcek3vFITgdLxxeZy05Gf7y+66nXbWnkvo10o9V0475v8ExadLC5kCqaFXZh3zVKL/c3DIYetBJt96o/jJfUkWdQ/379oFCTaVXYpUtpQm7NowwF7rO/3dirzUQAby46V3grC8OrMendmblCSTHvBEVz+mmIfcnpQz/xs34tJc7r9kQ0FVf8aUKntaOn1mHEtjkab1gMx4PVHz3csHDQ5vI/wvAWDMRDNJmvJFy4zaN71mGAj+8fuTFKLVltZgL8cUpBu8+xbHdjFpqt5X+n4ty2BOCKpwacTxn2dUj0P7r9zgF9aNlZEUIRHlEAsVh/wogxFLPxSla6PExbWHv5n2e+Gp0htwXjpX3Fl4vK4bSs51VRMP4WBjnbC/5Ph7KvIjaYnMGpGrWXHhnOvFOCkQ+/ey48IGQOQwaTPiaSFzfr3HGNtLn6xy/pf9tz3eRXThk1hDvHjYLtqhqBmxgui7xxHpziaid+gU1pDrX1FPzgtlnoR7sf5Q1WsZ3IcLQoDnpdO6BoEkviSRv7pw5g0Z6plfdcD5KIu5FRntfZkI735ZO0OmV4d5Q6wPiPjUU/KEFJ9HLgZDIAsndIy8f10DXkqK5ybamcsZcgsOvtWwcp1xc2giSWHCeKmhSLfTG0fvjC5vPOr/h6b3ArV/CaopOIpRIMFGIQnkisJxDEv9ljki8LYuM8AcMQDCLEDb3uRGtJxVBQBQIAWAJACpwuMAJbvyOG+Had5sBoZgjyfVsjRxyeGgN062jlfVALOanXTJjv3DYvC0xjnykTpQh7+kyAx+EkoFZSWny+xfSTwKbRojLes1UWbmE5M/zg8aUIkPwZ5GFMS9fRlpiEfeB59Zw/5s+ne2lxdiGTxeD7uN8KtrT/sds1uZ+cslretixK0DFeEr3VPeU3dz0FtAej5jzcVttz2rPjStHjBWwzgvh3vkJbIG5SCSBl3IQn6tfyedrN5P0yK4b4tBgyDVF9XchdHwghKuBzUCbxUb53yBN9QvGhS5wx3qEtuhsM9yYcpAKhGlMA3GbL+V5rK9y2RHOebyaEXNbynsOz+4yYstdXveKYU6slho9eUihnBgVIfcFJjNXc/CZiz8Z4oMURUDecie5q3mWLKsG5PJmf0dLVOWU+5n1L6+ybtgKQAb0+ZUpGFMf/Uyqnt2xLt39R/i4utrP5wiacI4MP8VriCD9irNKNhX/Yw55YaK0UIIDqjwHbMPLXWBv5IOrSY0CPf3XSUd7KgrB3GBaFOajRkPSJBJdbAY5a227MRfz+Lre4Djwy+P6erDM9jMgmK11XRIcB1EQx0KoHCEj+JHGOM7GlJpnzSqWJagzM4bJWjfk2CjyEIJBb23Yn/SEnWUwtAb+oUqs6MF/1TG7y24us6mzghYOnHiZoxKhjyIsy+iwS4FhnSLP5WrI2ieKPvva8HffUEYJQoAohLAkD5wm+10tlPPuYkjhJ/FAL6hBUCwT/EMj/glH/sVpyYY1GvPNv+RE3m2cVBznf4+bxGYd4DtbLa/fD11g58Q7tsid2m7DlFLUkmm5667/YbpBwqq/V3UP2605E2yz8j6XMqKluTz1y6cWhEt64ER0+s7d4wbsOzDRu2vJ+Rzy4zHNJPX+uQBY2Vn4iFh2g7fQdGXkdX7uJHcEBuynHTQrKfdzwkPKTS0e2dVvR+dUoXt5QxHfmHkafOD/cQtQjX30vU2S7F9jVx+wLigOoBpAt9fUI5SACDLkHEEo/QuPPBuWCAN+c5wzGW/sN1cjejEk5VocurCi7jpSO7tLBkVku6FZ01jA5in0nt73L2eF9cFLjF/jAHc9EwPJFfk1uXdNB1okRN0zGVJZZ3s6tWjWl2VNzl1ot2Ns7hDIWxTewLDd0cbelOv6+5VPtifbasExDqBGBXXYzwNBvl0pEh/sEPU2JT9oNbvZ4/VZWehyQAUYN5Eq6Io6H222H+Sr5us9GLfoihMiW4Z1Q46m7kOTTVYhqNDqrg12ijaGEQ9Y5Iaw1Umph7zrGqXTIP8KTKyo36RSz4TpVlLsxjnROaiIjF5xv3jlv/EYs2rxxOCwWUP/WZajh8/1Q183FGWK3dhOvCTGtWtOOsixyDOjKnMmUwQ4nw3JQ7me9dinIpblSbMeOnKHSiLlEC/EOwyRDl2cA2Wa+vBxoeZG/ll9klfZYliVtsafpsn1jZdto1MoQwvghpoq26oohLVLZ30WMtzS1q7NBujHUT7PlhS2oBBe1NNW6ptlwzILZsASI+nrFS0H1+1L0k7fJNf5EIlLeIYms0TplF2HjncPoZTUYGBL6m7a8Wd/d+qCMvSKlU2q9Ga8cHplQK2zGU90ULzVdt1/2maTqvpghXvEL5QqtpV9+xlmvKzVsNnOes53CB0dXGK9bfPN6hNNTiU01Oya3TSna5zCxju0kmj7YX+sbLbV3bl5DIZlrstKWwSPuThkFFpjm1vdEEPwN9OvILCUPAULpH6w/42veTWaZdV5SIBnZc9GD6NnyNuZrHoHPL4XAvrwNDSQ12McWYkjttc5SEaOAoM0jEEEbs5YKLkfxwlN16fqY14dS5X6BwMfM4ATcJ8v6EnrDp3R79SfUXFMjkvmbyj6Z8A5dKR1VTrMU7bPrbEfFg+vupoYbaUtfH3XHB1/P6C31uQAQtcGtjMMWBlYD4M8FWHMNXCwxo8+08I5AoTPh425tFTlt0P4B6FdAKGEIqvG1CI6qE5eL50ijjuTaJWPSj1+l5Pzp1YY1II1P+BB4jCPm9S3LAEnORSb3IscYJIfGdq99za3LLbLWkFQUbf4YNshsgRWmQ4nFahC6XZYxUEcV+B2Vz7NCUxcSVAmwHh+gIeiq0IujPQPzG1guC9mEjovUxcV4/5IuSp67u30RYbrJQd82De0TLJRrxD5PWltd9EV8vK7dKegBCwPueHcNULndcdl+X8QGIRIRmnzYIzncG6RukWqZNZ9hDtco1L2VWKAsv79fuBv40oyHKkazZYB0badMnqi1WScFGPr/neO+26H2U+8KUGKdR2/bZFm+/WAfd/uoZXybqWADLksCWT8V6aZF+btOu5ri96PXDkbwnGdfoAd9OB1NsAstPAkSeSrdnS1nJrHzr2gPV75B2SC/ndNvpGpLY0onzh+roHdsnA0XSXnkd8ojmBZd1IX7m20u1C4KTSuukuHZ/yHfrXEt0vBRJJfb9bLvsF1w/d9jyMrGQbOzZpf+eNvavGRVd+V3GUb7vdyGEyzxJZurzR3hwleT/y+5dXhzmooHWthZjoYUfCR6Mao4lzDXJe6jrTpfUxjAzlMeHK3oGHFZLQKF/TpOCM5qUTmPLqoMPKNhevPZlX858eDKunO4+peBdxY6LzpVJ0RhqYncz5N/U2FBd9mdHQ1wAQs+HOnSq1zFtpuhDiV07eJSyPICa/VTv+IzY5vnKgTB2uVzbQ2lfdlL8GzYf5ZFi1EzSeD3aki9+fUetHhci0XdvezoIO0HZOb57jtZBh3+HZpm/OxOsOsxxP1N/mQ5sXZ9z/VaeT/xekQLoixdd/Jb2NPL85Icv7Nw6pms9xDzfrd8/4v/Z6tc0yBjuTTPQ7R8tdavv7NUNLdbZ+H+6XJuYcdPznoReRHmqxVfoT1nrpYDjcKc5UwVIdPt+oNyn6OfqGPXEjMPgmRWeRYSQ4U+p3e1cPkscinvhegpTPAhF4mf2HSK4fHclIbydYViiGbk0pXoyVFN5uyJui8EbMrd5LqGE68Qogl/duAEJeRoQE0AUAVh+1c3Pbmm4ANux81//0c46uyy6bAxcgixhQXtQHACGsMy9wkhYjrkbzr99wEQjZwiKcRd9cPil/VfDU6lQ4syVDfUOHGNViMNgivQaRGX7VR2hJeaTcD51MCvcfXABDrrmgqlEWGlz0mKIR3mK5c3hrze9a/t7kj2niJtZ6omaHPaWo54uMCxaoo7y5utebIB0WVH2Vv1s0+olCJG0QkBj6qBquYh3vR0LlfHS9SnsQL+VY8/vvqTXD60WHgT+HkduWF2opyQr0HXPUqOaAON9AdssJCmdx/oLJWqx2cgiyhNlQNZCKglbafNRtj9VWmONYtCfDoFsZ7avvhFD/n9J+fqv3ZoZRxzfDimXErqkQ6eDwe6+d0af+dB+8D5/PhzSG8NQZlmd1aFzXxkDS/M1c+ewXhw1+79zy7uks9pilWOqeMn4CYvlbg8sXFxHu491eeOJbP1YhhT/HNIJzBxzssrE/I04JN1igeW5IhE/w47pY9JoHIkq1KQ9tdqko06ca8waM6lS7ihCnKYVde/5AQIy71AWFVS16QRoP62QmtYqD7+BROg1/46TzHOm0BiYLGn5ReE08aBFgCG3xkWas79AOFmNhTMgovAXJYFiqkDMDgLs9IwX8T66g3y9KJya5r1jzL+ZTLqc82rRgdkm/4mEz3uilB0i3B4UXgnfs2KROMloe+J19ZgKTWoKpPb8C7B3+N9Pj5Xq0WwsZLx0VhQrm8Lzo+t/o2teqtHTR2eKRP7RhBqBBgdIR7bVPyxGTFcYCwJyaiYY1LmlHVcxjRKwgcgp2UaqTZDQc027EiEs9lWSRQM+OykufNs0pL0UZzWNS6iWWVEVvZWyz9hOGzwB86/9ANby+I0X84dLoDAUIbqqePU3R7znGnkF4rlPj/lovoIzKcSWZtuuaVOiRIchGz+2j0Mmh87PCa1eEMi0FkTcoGO+BZkpjQpV0hti4+x2m7LCy5aG+BHW3OjBMjc9yRmJddk0GfdTWO0oJ0ELGVCDijMfYmcjTjE2XU8LA6Mo4DvFTkk4TojYEdsHtMiXIlmul033kvLKfDDLFiNrzWZdIizPuJE6oLQZOeLeJwiQbn3OiB1jVFcMjeUl+KD7jYL8chyN2GW01Pe+Gfp91/9g4emOoFC7uvKs1pHW+31TmvsPD/IL9t1W7x6c0dmPT3KvBq3bgQqKvhc0GvYYnM5HcT1Tt5RroxdNGF8/zpJYX2/2O3Wu7ZCnzZYdmi6MM+hQpEabIRskQJ7tjTcaFakGkWK2p8xySyq7qjt6mBio+b9yBwSS9SbOAy9axEY9xQsYjHdYnXKTEJyqP6yN4iNcoFJWZTnedN7w8rDm+qzrdlZDXhz2ma/RKV43QLZzFLdX9cz0G91DWvc5INeSJ18gFhHHfq+po1I5IunbF67z862HhyiyCOn3cgiAcLjluaPybHwfGt24MKKLoTbE7Nf5o41RcrY/OlLj9Fkm4345Pvf24/+pwxWY0ibV6GIqGiC2IRJ3et/TmbKSH+oHWXWcL7bJ8hT0BWWTD1DIhSTFSNW//W0xjPGF4qvD04BlCYridnADeo3kA4PfP+V3lrZCFgFMYfYIc5r4qJGxCCsHLMgp5oWK47qivudUXpFGzUUuvsBQIhyJeKUswQNcVxA8rxmxYQ4UpWDKhdUSJUSZf7dqLuWxxkwkO8hQneaENUvfk7/OS5NSwn4Di40uTtfZ5yQzsByauJWFAdPTnQFN16TU7Aw7m/1DuraX422UGub2urXPBFe18Gc+G2DAhR1tkAgIEHquKwHR6IH21SKs4+rdP3t/7LH92nAhDYH4bYhldGTdMm+6mhdMOyQLuvxSu5yUWqnFCM3Ebo7H1lDcqsQP8JLRrYMG83qySKHwnvZDbOj7UmDkkv/cB7wFwoz4JytUFxGOpKqEb0jy7cD12ZLqVn8oNXug+X3kgfRNstmfgt+YhjAt10OrN2YdWILoqw2XMgeArHL6EMUioqhHwzx0Cl3H7S64jpIjPcSLzMFwWVpD01je5RqfjeFkYNzBqYW/zqgd+lkdY2lea1cHmtTZ5UUMGb75MQ1gK0460Ibi2Juuid/ts215Ebj+sJ45O2AezG8cMAjlxBCj5A6wEKXkLRwHgsdcrc2Dm2YV8U+T1L8fmxfnOW2u3u4Tczmq3vDqNVp3xNRWQGCJDHIMGi1tpI2OrUuxs4zTE7ZYD4Z0XFX6MtO24rhy8dJPAgOOyi0EwWcuP3VOtd2DyZsn2r66rBwCC2Q9/Ob5uH0mkjbz5n5CXOXXkRHRm6GSWEoMLNcCLsYFrvftFaW4Vob+e9rY+qzbFzqhCSFRgCJ50awW+RRJpSh/Gm07IbSEuDoAHgDDqU4Yo7tlIkAAwHNQ2JJrjGoc1bJ6YhgxCwLoCGxfoDYJxdKm0/LJCdh9HiLwK5aBtgcWpWg5JQrmUGy54xmVvSDAER2aglTx15WLK1afjrMLUupS7IdojwKiQdMPiPGzghSpO+mharQ7CmtLJEFydHDZcMCSG32iVdQXBbSSkDwhwwX5igIHgMAUkEQAKclip90rztwwPuJIwY2iSdF4Esvr3FLyQxJR7IGEdk/LOG6g3j54gFQaPauaVw0f2VYuG3yq4/Fr9bSPkMDmMhJYP8/FloiQORL+9rpTTL/A7ztNx4v0kzi2aHD2qAFOILm8wiRg/4bh7V95HMFQUIdYdnrmxKDzRne8UYRBUskiHKbEjWKUtIpK7QfU7sK20x1VMYQoNUOCqr5T1mXYuM/AUWUD3kBtwaZ0DlBZXiUg9TgUPUBWFwvk97jW1kNU88TNNUakBkU6OujFppF1udP2Namqz3c8rdHXBHvZXBt4Nzvr1rK5T6cjYC44ZXLUuYKpchsEQgDDV0LsJ8wBbWAEf/nRnFLjvTaq2R3LjdU98Z2XIJxe9tHr+Yu7KnpSNf2VDOPnhudltmJPR0SKIY2HP5dA2R9GMZCf8BwYo+7B7KwL+jZGozMN1zGEzQbPVknWW4DgqqAPkYNUkq7CoYXhg4H2G4x2v+5f7uyAgYpATo12ZDaCJWlrXBQd9r6txIommrN9bkGkEyFXsqzmD+VFwua8kkOIUOwbm2sE3w0j//9oU+8okyCsVY5mOuUuag6BVIakfDtuzhj5kYYc3pUOT7LACw8YJk7YfG/S9cfKb3W233v4xn7kaqPVUPNqk+dor1Xu6cOrhAZbRKiKxM59rcZHlWhCaRh5fnWF4DgS6NYd/aPPQrtFGf1E0JLGW4c3RjWHjuIxqXNabTRgcQj+fPCxd3bQeosTaowWtsHqDy1Ab9hCH/Th5fkSjuPteWcbXCBgTKRZ5plkuqTYyhKi1GR0F5KpYCGUDSlJRlA8ZeduIWepwWub61vW6dJFTYkCddsXpBJhQ+xNOONdCx3Ke1igcnV6wsCfQn/POuKyzcAY5/KMSNuqlCPsNJH+aP6DvthU+GXXk34Qzq7M+pujm8abxJvGG8Vmu4IMtHgpP5qvGUo0qUsLaovQiIahBSEr/OS0wvpFVnqU0CHOwkOV4CmdLsVF5k7LxaPN4C/Emo41G5o/p+fRhmd6t8PiwUsToB5F+PI2nSUzMFe6d6rFThtpiYHzdow2CxAJBPOKlrHCde+mUMq0OxVyo97jSxzaJaRkgVEVQEjE1CCoVQLSMGFKfL+HKqFlF3rLXxkI125gKT+0pXyHbcrVIHbzwQza/fEMfnTIakcEsW6D1RoNZ32p3eJfabVTULm1sc98ePK5yVfvmerXJpS7lyWalN6D+KTrep0zTcA47uQ3awLXxGDDjibmn7TQlUrEwD7G655aYPlvA8hvopfIHsOCHtFQ+2Ux/aEEcRYANsJLpia5lkFVoT19eIQHMiRblknz3dEYZOc5M6wTIxGze2A4ycsWFcQ44RtYndgIPQ6Zwtg11TdXrQxBzeHZNm2MjpWi1EowgMA0KP8Tr9vZa0qN+5MnXbuvy4qwLdRExQDUceqpcd23I0NaLmi6RK/BLLnFNlUBPI2UW3M5VuoLwt20fsYDrsw1m4pZdVC/ipbxTlF/hAj08YMeF2yw2eaTXQ5IO8Rhs8LdqnGIOlDiF2uWrBMGCLJTLA5IfyWepa5DfIrkD/dhnCtVRNxdc7j6x+gDtEqS+olFjjc4SN/zIY0fwCUACpSWkgrJI3KRYsNYSCh+AaD5CSgM7Ey21lFhrREJSJ2P1X3CQxD4Xxfh5Lp6ySEP8l/bLWtZyvBYntwvM/rEfHeo2/H7ttpjG9qly+SMhh3trGW+rj+Pd8a2MTV23ooFAXr9BvviS/OJJWuHyuMfDU3uN0yMLNgfSo+WhMK5KqRkNlwiP2BpvMoOHf3p+7+/ySPsmprYylnR7baAQejwY4W5tzK99dd+XnWzTuUTkfNssUlLTC+E0lYo9B02m9ZHl/1yGzXuUOEjAENSj1neAQ6U7NnAzyvrjfAcUMxNajaiWxcuHhoNsPrjZXsC1eHm/vEc48X19eDk1Tzp1U4WW5nzTYl1SHWWqmCUAjigZBAZ37nnXKfhudONRQ4tpltHbgV1nnWrU6rOobboAUy/yH3dfk9oyx+GxBhswEPjSm4WNgccLOV4fnAqjZFbXP5OzTqImTh7QfiGAWHvbfoXJwND04wXQxIem/nN7n1///MdoJ0+xT9OFvaGh+lqhuAixpd0qGGWHNWmIuLjEs47jxbBaj6RbUrMD66rymlVSwLFmbv8eyOVdvw/gbp5QHD4+1lve9mreS0EPIwSjARP+e+F9FC48sIfDF7aHyd5pnVy2Rq/ow0feMEigEq7EC7ReW7zBknNSJrwzJ+XiQhqGkXLgrrX0Ejkx3g16sOHqFe9Ru/SQHohpMcxRQzaYLeEMjQnNKFA2HB7ZLmhNG6pxpFkszm94hsUVlFTi/ZyDB4HHsOYwYExpz1D3LakS6MojJ0+0DxKCu6naEMo5N6kwwbIe2Kv2nMHh4tPHmKcKpLDIDePBDw0x+tyVWqkyZuFSpjb7XUjjvjsryrKzlewl9zKCEjS9JMS9MG078fp+6x3+ZIYX0qzVKS1FUw/XuWmDkr7wdYcE7nUmCiao/hxV8MbVU23JnhcgerZkuC/WBnnseECzbZpFUEZeTSDpIQPF6s4Ws1mRLeUt59U8NAPRxDOHshUtwvFLpXrIH53QcdLl9IZiG8GHcqpIYHUTrGHMk1w5DL1hnLmNv818EDZjlAMmwl2Ux6zOoKJKZmk2AB7MoOfDPsxGPy7mY4eYKvdhG0NKl39ZgXV4E3Q6rjKtufWe8FEKb5eDvTPZ1Id82NqwtWFtWB6qeCyAWg53hLyS28PGFXjHBOCZ1ZMNPyS5vjOjT8vmFJlRcEJqdEconnxAZ7GzMi7LO89jtnjI7Zw9EPGd2vAhQdOzcPIS1gkdNvEkX/nP+oNwH4ZXYB1utx4DK30itLGcl7aN401jSd9y9E84TL5UTd1uYnhyJcWxwe0aT+ZgQ6cIUnXHnLJp50bMLP6gM+SwGjEpI03RgoddlawLutxMr3s2+S0yJtVpverxYffJA1sCPX+Nk77whtx+BIiJenweQO9SP947zSJy6oH1w686iemFRudeaomQVWE/+QEvTPNErQX8aIW9dAkLhD9d54gPxKlMtFCjhYdYd3a3uqa8GN5x7nS8I7rXDw1uDJWblveXe1voiBEv+Q/dctK8b3kcbEaHigmdf8xZBxWm0r+trU6/kp5cQXotadyhvVlGgR5Mo+m3/s6/cvzb3roMxIU9h30sFd8bSFrp9FD2vKQV+L8hjfhOTJUXPUb/x3Rr9K3FptBbUMlebm48xSmRFpMhhPmGkVF8cuVUuIjJnxJXa1ounFi40T7RMOczN1pX+SMc7Oc+2tJHYTxi4s0QhbDMug7Rk9COX9OadF89oQP5xO1zejgM9nru6oZYKMQn5TSbh3y8I8KVEpMBBaQRotTk+gnRJ/6oPqojCeFs+Pe5LzBCeNxrT4re7R9UsVaI9etNh3pcVjNMnn5peAD3/k0TdF7zpDG8SKIV1YHpgVh2JP9dA83MntXqDzwzI+v13PKZ5STaY/jLEBqfzhTENzkj4bgDFMJAYbGNb8b9683Pp7LvAurNcZnYwZPf90a+nU7JdWUyE4+ys+7oUhaIMbZvPU1o94CaHDgZ8B3K4+NKfM1r/ePUhP7HrHcC0o2gWI4CVW+RWgv7CqIZ/9X1lmAPXI+Y+XtanZQ9/YnC7qAGxqi+QazGaH3BKVB7iCi6P2sGBfHBtyKI7m4fmOCOJ1bPebG250slOEaXVYUmmkS8qL4qz18G78fW/38Iqdd92DSWNioJz4vLl8hmIrR+itRWzmQP+5rk3ASeI9XfTEC22qejk7EQU8SJGPk4+blgvtg7WB6x1yh4CNF0+XEXL+NlLFLqcHJinFlqmjd0OzrSnFjdb5nm2+tDjuQwTKBQ9l8=","base64")).toString()),dR)});var H6=w((CR,U6)=>{(function(r,e){typeof CR=="object"?U6.exports=e():typeof define=="function"&&define.amd?define(e):r.treeify=e()})(CR,function(){function r(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function t(n,s,o,a,l,c,u){var g="",f=0,h,p,m=a.slice(0);if(m.push([s,o])&&a.length>0&&(a.forEach(function(b,v){v>0&&(g+=(b[1]?" ":"\u2502")+" "),!p&&b[0]===s&&(p=!0)}),g+=r(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var y=e(s,c);y.forEach(function(b){h=++f===y.length,t(b,s[b],h,m,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;t(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return t(".",n,!1,[],s,o,function(l){a+=l+` +`}),a},i})});var _B=w((sAt,X6)=>{var ENe=Ks(),INe=Id(),yNe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,wNe=/^\w*$/;function BNe(r,e){if(ENe(r))return!1;var t=typeof r;return t=="number"||t=="symbol"||t=="boolean"||r==null||INe(r)?!0:wNe.test(r)||!yNe.test(r)||e!=null&&r in Object(e)}X6.exports=BNe});var VB=w((oAt,Z6)=>{var bNe=Wc(),QNe=Rn(),SNe="[object AsyncFunction]",vNe="[object Function]",xNe="[object GeneratorFunction]",kNe="[object Proxy]";function PNe(r){if(!QNe(r))return!1;var e=bNe(r);return e==vNe||e==xNe||e==SNe||e==kNe}Z6.exports=PNe});var e7=w((aAt,$6)=>{var DNe=Ns(),RNe=DNe["__core-js_shared__"];$6.exports=RNe});var i7=w((AAt,t7)=>{var QR=e7(),r7=function(){var r=/[^.]+$/.exec(QR&&QR.keys&&QR.keys.IE_PROTO||"");return r?"Symbol(src)_1."+r:""}();function FNe(r){return!!r7&&r7 in r}t7.exports=FNe});var SR=w((lAt,n7)=>{var NNe=Function.prototype,LNe=NNe.toString;function TNe(r){if(r!=null){try{return LNe.call(r)}catch(e){}try{return r+""}catch(e){}}return""}n7.exports=TNe});var o7=w((cAt,s7)=>{var ONe=VB(),MNe=i7(),KNe=Rn(),UNe=SR(),HNe=/[\\^$.*+?()[\]{}|]/g,jNe=/^\[object .+?Constructor\]$/,GNe=Function.prototype,YNe=Object.prototype,qNe=GNe.toString,JNe=YNe.hasOwnProperty,WNe=RegExp("^"+qNe.call(JNe).replace(HNe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function zNe(r){if(!KNe(r)||MNe(r))return!1;var e=ONe(r)?WNe:jNe;return e.test(UNe(r))}s7.exports=zNe});var A7=w((uAt,a7)=>{function _Ne(r,e){return r==null?void 0:r[e]}a7.exports=_Ne});var Rl=w((gAt,l7)=>{var VNe=o7(),XNe=A7();function ZNe(r,e){var t=XNe(r,e);return VNe(t)?t:void 0}l7.exports=ZNe});var cC=w((fAt,c7)=>{var $Ne=Rl(),eLe=$Ne(Object,"create");c7.exports=eLe});var f7=w((hAt,u7)=>{var g7=cC();function tLe(){this.__data__=g7?g7(null):{},this.size=0}u7.exports=tLe});var p7=w((pAt,h7)=>{function rLe(r){var e=this.has(r)&&delete this.__data__[r];return this.size-=e?1:0,e}h7.exports=rLe});var C7=w((dAt,d7)=>{var iLe=cC(),nLe="__lodash_hash_undefined__",sLe=Object.prototype,oLe=sLe.hasOwnProperty;function aLe(r){var e=this.__data__;if(iLe){var t=e[r];return t===nLe?void 0:t}return oLe.call(e,r)?e[r]:void 0}d7.exports=aLe});var E7=w((CAt,m7)=>{var ALe=cC(),lLe=Object.prototype,cLe=lLe.hasOwnProperty;function uLe(r){var e=this.__data__;return ALe?e[r]!==void 0:cLe.call(e,r)}m7.exports=uLe});var y7=w((mAt,I7)=>{var gLe=cC(),fLe="__lodash_hash_undefined__";function hLe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,t[r]=gLe&&e===void 0?fLe:e,this}I7.exports=hLe});var B7=w((EAt,w7)=>{var pLe=f7(),dLe=p7(),CLe=C7(),mLe=E7(),ELe=y7();function kf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{function ILe(){this.__data__=[],this.size=0}b7.exports=ILe});var Pf=w((yAt,S7)=>{function yLe(r,e){return r===e||r!==r&&e!==e}S7.exports=yLe});var uC=w((wAt,v7)=>{var wLe=Pf();function BLe(r,e){for(var t=r.length;t--;)if(wLe(r[t][0],e))return t;return-1}v7.exports=BLe});var k7=w((BAt,x7)=>{var bLe=uC(),QLe=Array.prototype,SLe=QLe.splice;function vLe(r){var e=this.__data__,t=bLe(e,r);if(t<0)return!1;var i=e.length-1;return t==i?e.pop():SLe.call(e,t,1),--this.size,!0}x7.exports=vLe});var D7=w((bAt,P7)=>{var xLe=uC();function kLe(r){var e=this.__data__,t=xLe(e,r);return t<0?void 0:e[t][1]}P7.exports=kLe});var F7=w((QAt,R7)=>{var PLe=uC();function DLe(r){return PLe(this.__data__,r)>-1}R7.exports=DLe});var L7=w((SAt,N7)=>{var RLe=uC();function FLe(r,e){var t=this.__data__,i=RLe(t,r);return i<0?(++this.size,t.push([r,e])):t[i][1]=e,this}N7.exports=FLe});var gC=w((vAt,T7)=>{var NLe=Q7(),LLe=k7(),TLe=D7(),OLe=F7(),MLe=L7();function Df(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var KLe=Rl(),ULe=Ns(),HLe=KLe(ULe,"Map");O7.exports=HLe});var U7=w((kAt,M7)=>{var K7=B7(),jLe=gC(),GLe=XB();function YLe(){this.size=0,this.__data__={hash:new K7,map:new(GLe||jLe),string:new K7}}M7.exports=YLe});var j7=w((PAt,H7)=>{function qLe(r){var e=typeof r;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?r!=="__proto__":r===null}H7.exports=qLe});var fC=w((DAt,G7)=>{var JLe=j7();function WLe(r,e){var t=r.__data__;return JLe(e)?t[typeof e=="string"?"string":"hash"]:t.map}G7.exports=WLe});var q7=w((RAt,Y7)=>{var zLe=fC();function _Le(r){var e=zLe(this,r).delete(r);return this.size-=e?1:0,e}Y7.exports=_Le});var W7=w((FAt,J7)=>{var VLe=fC();function XLe(r){return VLe(this,r).get(r)}J7.exports=XLe});var _7=w((NAt,z7)=>{var ZLe=fC();function $Le(r){return ZLe(this,r).has(r)}z7.exports=$Le});var X7=w((LAt,V7)=>{var eTe=fC();function tTe(r,e){var t=eTe(this,r),i=t.size;return t.set(r,e),this.size+=t.size==i?0:1,this}V7.exports=tTe});var ZB=w((TAt,Z7)=>{var rTe=U7(),iTe=q7(),nTe=W7(),sTe=_7(),oTe=X7();function Rf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var eX=ZB(),aTe="Expected a function";function vR(r,e){if(typeof r!="function"||e!=null&&typeof e!="function")throw new TypeError(aTe);var t=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=t.cache;if(s.has(n))return s.get(n);var o=r.apply(this,i);return t.cache=s.set(n,o)||s,o};return t.cache=new(vR.Cache||eX),t}vR.Cache=eX;$7.exports=vR});var iX=w((MAt,rX)=>{var ATe=tX(),lTe=500;function cTe(r){var e=ATe(r,function(i){return t.size===lTe&&t.clear(),i}),t=e.cache;return e}rX.exports=cTe});var sX=w((KAt,nX)=>{var uTe=iX(),gTe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,fTe=/\\(\\)?/g,hTe=uTe(function(r){var e=[];return r.charCodeAt(0)===46&&e.push(""),r.replace(gTe,function(t,i,n,s){e.push(n?s.replace(fTe,"$1"):i||t)}),e});nX.exports=hTe});var Ff=w((UAt,oX)=>{var pTe=Ks(),dTe=_B(),CTe=sX(),mTe=lf();function ETe(r,e){return pTe(r)?r:dTe(r,e)?[r]:CTe(mTe(r))}oX.exports=ETe});var gu=w((HAt,aX)=>{var ITe=Id(),yTe=1/0;function wTe(r){if(typeof r=="string"||ITe(r))return r;var e=r+"";return e=="0"&&1/r==-yTe?"-0":e}aX.exports=wTe});var hC=w((jAt,AX)=>{var BTe=Ff(),bTe=gu();function QTe(r,e){e=BTe(e,r);for(var t=0,i=e.length;r!=null&&t{var STe=Rl(),vTe=function(){try{var r=STe(Object,"defineProperty");return r({},"",{}),r}catch(e){}}();lX.exports=vTe});var Nf=w((YAt,cX)=>{var uX=xR();function xTe(r,e,t){e=="__proto__"&&uX?uX(r,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):r[e]=t}cX.exports=xTe});var $B=w((qAt,gX)=>{var kTe=Nf(),PTe=Pf(),DTe=Object.prototype,RTe=DTe.hasOwnProperty;function FTe(r,e,t){var i=r[e];(!(RTe.call(r,e)&&PTe(i,t))||t===void 0&&!(e in r))&&kTe(r,e,t)}gX.exports=FTe});var pC=w((JAt,fX)=>{var NTe=9007199254740991,LTe=/^(?:0|[1-9]\d*)$/;function TTe(r,e){var t=typeof r;return e=e==null?NTe:e,!!e&&(t=="number"||t!="symbol"&<e.test(r))&&r>-1&&r%1==0&&r{var OTe=$B(),MTe=Ff(),KTe=pC(),pX=Rn(),UTe=gu();function HTe(r,e,t,i){if(!pX(r))return r;e=MTe(e,r);for(var n=-1,s=e.length,o=s-1,a=r;a!=null&&++n{var jTe=hC(),GTe=kR(),YTe=Ff();function qTe(r,e,t){for(var i=-1,n=e.length,s={};++i{function JTe(r,e){return r!=null&&e in Object(r)}mX.exports=JTe});var yX=w((VAt,IX)=>{var WTe=Wc(),zTe=ta(),_Te="[object Arguments]";function VTe(r){return zTe(r)&&WTe(r)==_Te}IX.exports=VTe});var dC=w((XAt,wX)=>{var BX=yX(),XTe=ta(),bX=Object.prototype,ZTe=bX.hasOwnProperty,$Te=bX.propertyIsEnumerable,eOe=BX(function(){return arguments}())?BX:function(r){return XTe(r)&&ZTe.call(r,"callee")&&!$Te.call(r,"callee")};wX.exports=eOe});var e0=w((ZAt,QX)=>{var tOe=9007199254740991;function rOe(r){return typeof r=="number"&&r>-1&&r%1==0&&r<=tOe}QX.exports=rOe});var PR=w(($At,SX)=>{var iOe=Ff(),nOe=dC(),sOe=Ks(),oOe=pC(),aOe=e0(),AOe=gu();function lOe(r,e,t){e=iOe(e,r);for(var i=-1,n=e.length,s=!1;++i{var cOe=EX(),uOe=PR();function gOe(r,e){return r!=null&&uOe(r,e,cOe)}vX.exports=gOe});var kX=w((tlt,xX)=>{var fOe=CX(),hOe=DR();function pOe(r,e){return fOe(r,e,function(t,i){return hOe(r,i)})}xX.exports=pOe});var t0=w((rlt,PX)=>{function dOe(r,e){for(var t=-1,i=e.length,n=r.length;++t{var RX=Jc(),COe=dC(),mOe=Ks(),FX=RX?RX.isConcatSpreadable:void 0;function EOe(r){return mOe(r)||COe(r)||!!(FX&&r&&r[FX])}DX.exports=EOe});var OX=w((nlt,LX)=>{var IOe=t0(),yOe=NX();function TX(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=yOe),n||(n=[]);++s0&&t(a)?e>1?TX(a,e-1,t,i,n):IOe(n,a):i||(n[n.length]=a)}return n}LX.exports=TX});var KX=w((slt,MX)=>{var wOe=OX();function BOe(r){var e=r==null?0:r.length;return e?wOe(r,1):[]}MX.exports=BOe});var HX=w((olt,UX)=>{function bOe(r,e,t){switch(t.length){case 0:return r.call(e);case 1:return r.call(e,t[0]);case 2:return r.call(e,t[0],t[1]);case 3:return r.call(e,t[0],t[1],t[2])}return r.apply(e,t)}UX.exports=bOe});var RR=w((alt,jX)=>{var QOe=HX(),GX=Math.max;function SOe(r,e,t){return e=GX(e===void 0?r.length-1:e,0),function(){for(var i=arguments,n=-1,s=GX(i.length-e,0),o=Array(s);++n{function vOe(r){return function(){return r}}YX.exports=vOe});var r0=w((llt,JX)=>{function xOe(r){return r}JX.exports=xOe});var _X=w((clt,WX)=>{var kOe=qX(),zX=xR(),POe=r0(),DOe=zX?function(r,e){return zX(r,"toString",{configurable:!0,enumerable:!1,value:kOe(e),writable:!0})}:POe;WX.exports=DOe});var XX=w((ult,VX)=>{var ROe=800,FOe=16,NOe=Date.now;function LOe(r){var e=0,t=0;return function(){var i=NOe(),n=FOe-(i-t);if(t=i,n>0){if(++e>=ROe)return arguments[0]}else e=0;return r.apply(void 0,arguments)}}VX.exports=LOe});var FR=w((glt,ZX)=>{var TOe=_X(),OOe=XX(),MOe=OOe(TOe);ZX.exports=MOe});var eZ=w((flt,$X)=>{var KOe=KX(),UOe=RR(),HOe=FR();function jOe(r){return HOe(UOe(r,void 0,KOe),r+"")}$X.exports=jOe});var rZ=w((hlt,tZ)=>{var GOe=kX(),YOe=eZ(),qOe=YOe(function(r,e){return r==null?{}:GOe(r,e)});tZ.exports=qOe});var hZ=w((uut,uZ)=>{"use strict";var GR;try{GR=Map}catch(r){}var YR;try{YR=Set}catch(r){}function gZ(r,e,t){if(!r||typeof r!="object"||typeof r=="function")return r;if(r.nodeType&&"cloneNode"in r)return r.cloneNode(!0);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r);if(Array.isArray(r))return r.map(fZ);if(GR&&r instanceof GR)return new Map(Array.from(r.entries()));if(YR&&r instanceof YR)return new Set(Array.from(r.values()));if(r instanceof Object){e.push(r);var i=Object.create(r);t.push(i);for(var n in r){var s=e.findIndex(function(o){return o===r[n]});i[n]=s>-1?t[s]:gZ(r[n],e,t)}return i}return r}function fZ(r){return gZ(r,[],[])}uZ.exports=fZ});var IC=w(qR=>{"use strict";Object.defineProperty(qR,"__esModule",{value:!0});qR.default=eMe;var tMe=Object.prototype.toString,rMe=Error.prototype.toString,iMe=RegExp.prototype.toString,nMe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",sMe=/^Symbol\((.*)\)(.*)$/;function oMe(r){return r!=+r?"NaN":r===0&&1/r<0?"-0":""+r}function pZ(r,e=!1){if(r==null||r===!0||r===!1)return""+r;let t=typeof r;if(t==="number")return oMe(r);if(t==="string")return e?`"${r}"`:r;if(t==="function")return"[Function "+(r.name||"anonymous")+"]";if(t==="symbol")return nMe.call(r).replace(sMe,"Symbol($1)");let i=tMe.call(r).slice(8,-1);return i==="Date"?isNaN(r.getTime())?""+r:r.toISOString(r):i==="Error"||r instanceof Error?"["+rMe.call(r)+"]":i==="RegExp"?iMe.call(r):null}function eMe(r,e){let t=pZ(r,e);return t!==null?t:JSON.stringify(r,function(i,n){let s=pZ(this[i],e);return s!==null?s:n},2)}});var CA=w(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.default=bi.array=bi.object=bi.boolean=bi.date=bi.number=bi.string=bi.mixed=void 0;var dZ=aMe(IC());function aMe(r){return r&&r.__esModule?r:{default:r}}var CZ={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:r,type:e,value:t,originalValue:i})=>{let n=i!=null&&i!==t,s=`${r} must be a \`${e}\` type, but the final value was: \`${(0,dZ.default)(t,!0)}\``+(n?` (cast from the value \`${(0,dZ.default)(i,!0)}\`).`:".");return t===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};bi.mixed=CZ;var mZ={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};bi.string=mZ;var EZ={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};bi.number=EZ;var IZ={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};bi.date=IZ;var yZ={isValue:"${path} field must be ${value}"};bi.boolean=yZ;var wZ={noUnknown:"${path} field has unspecified keys: ${unknown}"};bi.object=wZ;var BZ={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};bi.array=BZ;var AMe=Object.assign(Object.create(null),{mixed:CZ,string:mZ,number:EZ,date:IZ,object:wZ,array:BZ,boolean:yZ});bi.default=AMe});var QZ=w((hut,bZ)=>{var lMe=Object.prototype,cMe=lMe.hasOwnProperty;function uMe(r,e){return r!=null&&cMe.call(r,e)}bZ.exports=uMe});var yC=w((put,SZ)=>{var gMe=QZ(),fMe=PR();function hMe(r,e){return r!=null&&fMe(r,e,gMe)}SZ.exports=hMe});var Tf=w(o0=>{"use strict";Object.defineProperty(o0,"__esModule",{value:!0});o0.default=void 0;var pMe=r=>r&&r.__isYupSchema__;o0.default=pMe});var kZ=w(a0=>{"use strict";Object.defineProperty(a0,"__esModule",{value:!0});a0.default=void 0;var dMe=vZ(yC()),CMe=vZ(Tf());function vZ(r){return r&&r.__esModule?r:{default:r}}var xZ=class{constructor(e,t){if(this.refs=e,this.refs=e,typeof t=="function"){this.fn=t;return}if(!(0,dMe.default)(t,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=t,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,t){let i=this.refs.map(s=>s.getValue(t==null?void 0:t.value,t==null?void 0:t.parent,t==null?void 0:t.context)),n=this.fn.apply(e,i.concat(e,t));if(n===void 0||n===e)return e;if(!(0,CMe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(t)}},mMe=xZ;a0.default=mMe});var WR=w(JR=>{"use strict";Object.defineProperty(JR,"__esModule",{value:!0});JR.default=EMe;function EMe(r){return r==null?[]:[].concat(r)}});var fu=w(A0=>{"use strict";Object.defineProperty(A0,"__esModule",{value:!0});A0.default=void 0;var IMe=PZ(IC()),yMe=PZ(WR());function PZ(r){return r&&r.__esModule?r:{default:r}}function zR(){return zR=Object.assign||function(r){for(var e=1;e(0,IMe.default)(t[s])):typeof e=="function"?e(t):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,t,i,n){super();this.name="ValidationError",this.value=t,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,yMe.default)(e).forEach(s=>{wC.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,wC)}};A0.default=wC});var l0=w(_R=>{"use strict";Object.defineProperty(_R,"__esModule",{value:!0});_R.default=BMe;var VR=bMe(fu());function bMe(r){return r&&r.__esModule?r:{default:r}}var QMe=r=>{let e=!1;return(...t)=>{e||(e=!0,r(...t))}};function BMe(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,path:l}=r,c=QMe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new VR.default(o,s,l)):c(null,s);for(let f=0;f{function SMe(r){return function(e,t,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[r?a:++n];if(t(s[l],l,s)===!1)break}return e}}DZ.exports=SMe});var XR=w((wut,FZ)=>{var vMe=RZ(),xMe=vMe();FZ.exports=xMe});var LZ=w((But,NZ)=>{function kMe(r,e){for(var t=-1,i=Array(r);++t{function PMe(){return!1}TZ.exports=PMe});var bC=w((BC,Of)=>{var DMe=Ns(),RMe=OZ(),MZ=typeof BC=="object"&&BC&&!BC.nodeType&&BC,KZ=MZ&&typeof Of=="object"&&Of&&!Of.nodeType&&Of,FMe=KZ&&KZ.exports===MZ,UZ=FMe?DMe.Buffer:void 0,NMe=UZ?UZ.isBuffer:void 0,LMe=NMe||RMe;Of.exports=LMe});var jZ=w((Qut,HZ)=>{var TMe=Wc(),OMe=e0(),MMe=ta(),KMe="[object Arguments]",UMe="[object Array]",HMe="[object Boolean]",jMe="[object Date]",GMe="[object Error]",YMe="[object Function]",qMe="[object Map]",JMe="[object Number]",WMe="[object Object]",zMe="[object RegExp]",_Me="[object Set]",VMe="[object String]",XMe="[object WeakMap]",ZMe="[object ArrayBuffer]",$Me="[object DataView]",e1e="[object Float32Array]",t1e="[object Float64Array]",r1e="[object Int8Array]",i1e="[object Int16Array]",n1e="[object Int32Array]",s1e="[object Uint8Array]",o1e="[object Uint8ClampedArray]",a1e="[object Uint16Array]",A1e="[object Uint32Array]",wr={};wr[e1e]=wr[t1e]=wr[r1e]=wr[i1e]=wr[n1e]=wr[s1e]=wr[o1e]=wr[a1e]=wr[A1e]=!0;wr[KMe]=wr[UMe]=wr[ZMe]=wr[HMe]=wr[$Me]=wr[jMe]=wr[GMe]=wr[YMe]=wr[qMe]=wr[JMe]=wr[WMe]=wr[zMe]=wr[_Me]=wr[VMe]=wr[XMe]=!1;function l1e(r){return MMe(r)&&OMe(r.length)&&!!wr[TMe(r)]}HZ.exports=l1e});var c0=w((Sut,GZ)=>{function c1e(r){return function(e){return r(e)}}GZ.exports=c1e});var u0=w((QC,Mf)=>{var u1e=rk(),YZ=typeof QC=="object"&&QC&&!QC.nodeType&&QC,SC=YZ&&typeof Mf=="object"&&Mf&&!Mf.nodeType&&Mf,g1e=SC&&SC.exports===YZ,ZR=g1e&&u1e.process,f1e=function(){try{var r=SC&&SC.require&&SC.require("util").types;return r||ZR&&ZR.binding&&ZR.binding("util")}catch(e){}}();Mf.exports=f1e});var g0=w((vut,qZ)=>{var h1e=jZ(),p1e=c0(),JZ=u0(),WZ=JZ&&JZ.isTypedArray,d1e=WZ?p1e(WZ):h1e;qZ.exports=d1e});var $R=w((xut,zZ)=>{var C1e=LZ(),m1e=dC(),E1e=Ks(),I1e=bC(),y1e=pC(),w1e=g0(),B1e=Object.prototype,b1e=B1e.hasOwnProperty;function Q1e(r,e){var t=E1e(r),i=!t&&m1e(r),n=!t&&!i&&I1e(r),s=!t&&!i&&!n&&w1e(r),o=t||i||n||s,a=o?C1e(r.length,String):[],l=a.length;for(var c in r)(e||b1e.call(r,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||y1e(c,l)))&&a.push(c);return a}zZ.exports=Q1e});var f0=w((kut,_Z)=>{var S1e=Object.prototype;function v1e(r){var e=r&&r.constructor,t=typeof e=="function"&&e.prototype||S1e;return r===t}_Z.exports=v1e});var eF=w((Put,VZ)=>{function x1e(r,e){return function(t){return r(e(t))}}VZ.exports=x1e});var ZZ=w((Dut,XZ)=>{var k1e=eF(),P1e=k1e(Object.keys,Object);XZ.exports=P1e});var e$=w((Rut,$Z)=>{var D1e=f0(),R1e=ZZ(),F1e=Object.prototype,N1e=F1e.hasOwnProperty;function L1e(r){if(!D1e(r))return R1e(r);var e=[];for(var t in Object(r))N1e.call(r,t)&&t!="constructor"&&e.push(t);return e}$Z.exports=L1e});var vC=w((Fut,t$)=>{var T1e=VB(),O1e=e0();function M1e(r){return r!=null&&O1e(r.length)&&!T1e(r)}t$.exports=M1e});var Kf=w((Nut,r$)=>{var K1e=$R(),U1e=e$(),H1e=vC();function j1e(r){return H1e(r)?K1e(r):U1e(r)}r$.exports=j1e});var tF=w((Lut,i$)=>{var G1e=XR(),Y1e=Kf();function q1e(r,e){return r&&G1e(r,e,Y1e)}i$.exports=q1e});var s$=w((Tut,n$)=>{var J1e=gC();function W1e(){this.__data__=new J1e,this.size=0}n$.exports=W1e});var a$=w((Out,o$)=>{function z1e(r){var e=this.__data__,t=e.delete(r);return this.size=e.size,t}o$.exports=z1e});var l$=w((Mut,A$)=>{function _1e(r){return this.__data__.get(r)}A$.exports=_1e});var u$=w((Kut,c$)=>{function V1e(r){return this.__data__.has(r)}c$.exports=V1e});var f$=w((Uut,g$)=>{var X1e=gC(),Z1e=XB(),$1e=ZB(),eKe=200;function tKe(r,e){var t=this.__data__;if(t instanceof X1e){var i=t.__data__;if(!Z1e||i.length{var rKe=gC(),iKe=s$(),nKe=a$(),sKe=l$(),oKe=u$(),aKe=f$();function Uf(r){var e=this.__data__=new rKe(r);this.size=e.size}Uf.prototype.clear=iKe;Uf.prototype.delete=nKe;Uf.prototype.get=sKe;Uf.prototype.has=oKe;Uf.prototype.set=aKe;h$.exports=Uf});var d$=w((jut,p$)=>{var AKe="__lodash_hash_undefined__";function lKe(r){return this.__data__.set(r,AKe),this}p$.exports=lKe});var m$=w((Gut,C$)=>{function cKe(r){return this.__data__.has(r)}C$.exports=cKe});var I$=w((Yut,E$)=>{var uKe=ZB(),gKe=d$(),fKe=m$();function h0(r){var e=-1,t=r==null?0:r.length;for(this.__data__=new uKe;++e{function hKe(r,e){for(var t=-1,i=r==null?0:r.length;++t{function pKe(r,e){return r.has(e)}B$.exports=pKe});var rF=w((Wut,Q$)=>{var dKe=I$(),CKe=w$(),mKe=b$(),EKe=1,IKe=2;function yKe(r,e,t,i,n,s){var o=t&EKe,a=r.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(r),u=s.get(e);if(c&&u)return c==e&&u==r;var g=-1,f=!0,h=t&IKe?new dKe:void 0;for(s.set(r,e),s.set(e,r);++g{var wKe=Ns(),BKe=wKe.Uint8Array;S$.exports=BKe});var x$=w((_ut,v$)=>{function bKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i,n){t[++e]=[n,i]}),t}v$.exports=bKe});var P$=w((Vut,k$)=>{function QKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i){t[++e]=i}),t}k$.exports=QKe});var L$=w((Xut,D$)=>{var R$=Jc(),F$=iF(),SKe=Pf(),vKe=rF(),xKe=x$(),kKe=P$(),PKe=1,DKe=2,RKe="[object Boolean]",FKe="[object Date]",NKe="[object Error]",LKe="[object Map]",TKe="[object Number]",OKe="[object RegExp]",MKe="[object Set]",KKe="[object String]",UKe="[object Symbol]",HKe="[object ArrayBuffer]",jKe="[object DataView]",N$=R$?R$.prototype:void 0,nF=N$?N$.valueOf:void 0;function GKe(r,e,t,i,n,s,o){switch(t){case jKe:if(r.byteLength!=e.byteLength||r.byteOffset!=e.byteOffset)return!1;r=r.buffer,e=e.buffer;case HKe:return!(r.byteLength!=e.byteLength||!s(new F$(r),new F$(e)));case RKe:case FKe:case TKe:return SKe(+r,+e);case NKe:return r.name==e.name&&r.message==e.message;case OKe:case KKe:return r==e+"";case LKe:var a=xKe;case MKe:var l=i&PKe;if(a||(a=kKe),r.size!=e.size&&!l)return!1;var c=o.get(r);if(c)return c==e;i|=DKe,o.set(r,e);var u=vKe(a(r),a(e),i,n,s,o);return o.delete(r),u;case UKe:if(nF)return nF.call(r)==nF.call(e)}return!1}D$.exports=GKe});var sF=w((Zut,T$)=>{var YKe=t0(),qKe=Ks();function JKe(r,e,t){var i=e(r);return qKe(r)?i:YKe(i,t(r))}T$.exports=JKe});var M$=w(($ut,O$)=>{function WKe(r,e){for(var t=-1,i=r==null?0:r.length,n=0,s=[];++t{function zKe(){return[]}K$.exports=zKe});var p0=w((tgt,U$)=>{var _Ke=M$(),VKe=oF(),XKe=Object.prototype,ZKe=XKe.propertyIsEnumerable,H$=Object.getOwnPropertySymbols,$Ke=H$?function(r){return r==null?[]:(r=Object(r),_Ke(H$(r),function(e){return ZKe.call(r,e)}))}:VKe;U$.exports=$Ke});var aF=w((rgt,j$)=>{var eUe=sF(),tUe=p0(),rUe=Kf();function iUe(r){return eUe(r,rUe,tUe)}j$.exports=iUe});var q$=w((igt,G$)=>{var Y$=aF(),nUe=1,sUe=Object.prototype,oUe=sUe.hasOwnProperty;function aUe(r,e,t,i,n,s){var o=t&nUe,a=Y$(r),l=a.length,c=Y$(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:oUe.call(e,f)))return!1}var h=s.get(r),p=s.get(e);if(h&&p)return h==e&&p==r;var m=!0;s.set(r,e),s.set(e,r);for(var y=o;++g{var AUe=Rl(),lUe=Ns(),cUe=AUe(lUe,"DataView");J$.exports=cUe});var _$=w((sgt,z$)=>{var uUe=Rl(),gUe=Ns(),fUe=uUe(gUe,"Promise");z$.exports=fUe});var X$=w((ogt,V$)=>{var hUe=Rl(),pUe=Ns(),dUe=hUe(pUe,"Set");V$.exports=dUe});var $$=w((agt,Z$)=>{var CUe=Rl(),mUe=Ns(),EUe=CUe(mUe,"WeakMap");Z$.exports=EUe});var kC=w((Agt,eee)=>{var AF=W$(),lF=XB(),cF=_$(),uF=X$(),gF=$$(),tee=Wc(),Hf=SR(),ree="[object Map]",IUe="[object Object]",iee="[object Promise]",nee="[object Set]",see="[object WeakMap]",oee="[object DataView]",yUe=Hf(AF),wUe=Hf(lF),BUe=Hf(cF),bUe=Hf(uF),QUe=Hf(gF),hu=tee;(AF&&hu(new AF(new ArrayBuffer(1)))!=oee||lF&&hu(new lF)!=ree||cF&&hu(cF.resolve())!=iee||uF&&hu(new uF)!=nee||gF&&hu(new gF)!=see)&&(hu=function(r){var e=tee(r),t=e==IUe?r.constructor:void 0,i=t?Hf(t):"";if(i)switch(i){case yUe:return oee;case wUe:return ree;case BUe:return iee;case bUe:return nee;case QUe:return see}return e});eee.exports=hu});var hee=w((lgt,aee)=>{var fF=xC(),SUe=rF(),vUe=L$(),xUe=q$(),Aee=kC(),lee=Ks(),cee=bC(),kUe=g0(),PUe=1,uee="[object Arguments]",gee="[object Array]",d0="[object Object]",DUe=Object.prototype,fee=DUe.hasOwnProperty;function RUe(r,e,t,i,n,s){var o=lee(r),a=lee(e),l=o?gee:Aee(r),c=a?gee:Aee(e);l=l==uee?d0:l,c=c==uee?d0:c;var u=l==d0,g=c==d0,f=l==c;if(f&&cee(r)){if(!cee(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new fF),o||kUe(r)?SUe(r,e,t,i,n,s):vUe(r,e,l,t,i,n,s);if(!(t&PUe)){var h=u&&fee.call(r,"__wrapped__"),p=g&&fee.call(e,"__wrapped__");if(h||p){var m=h?r.value():r,y=p?e.value():e;return s||(s=new fF),n(m,y,t,i,s)}}return f?(s||(s=new fF),xUe(r,e,t,i,n,s)):!1}aee.exports=RUe});var hF=w((cgt,pee)=>{var FUe=hee(),dee=ta();function Cee(r,e,t,i,n){return r===e?!0:r==null||e==null||!dee(r)&&!dee(e)?r!==r&&e!==e:FUe(r,e,t,i,Cee,n)}pee.exports=Cee});var Eee=w((ugt,mee)=>{var NUe=xC(),LUe=hF(),TUe=1,OUe=2;function MUe(r,e,t,i){var n=t.length,s=n,o=!i;if(r==null)return!s;for(r=Object(r);n--;){var a=t[n];if(o&&a[2]?a[1]!==r[a[0]]:!(a[0]in r))return!1}for(;++n{var KUe=Rn();function UUe(r){return r===r&&!KUe(r)}Iee.exports=UUe});var wee=w((fgt,yee)=>{var HUe=pF(),jUe=Kf();function GUe(r){for(var e=jUe(r),t=e.length;t--;){var i=e[t],n=r[i];e[t]=[i,n,HUe(n)]}return e}yee.exports=GUe});var dF=w((hgt,Bee)=>{function YUe(r,e){return function(t){return t==null?!1:t[r]===e&&(e!==void 0||r in Object(t))}}Bee.exports=YUe});var Qee=w((pgt,bee)=>{var qUe=Eee(),JUe=wee(),WUe=dF();function zUe(r){var e=JUe(r);return e.length==1&&e[0][2]?WUe(e[0][0],e[0][1]):function(t){return t===r||qUe(t,r,e)}}bee.exports=zUe});var C0=w((dgt,See)=>{var _Ue=hC();function VUe(r,e,t){var i=r==null?void 0:_Ue(r,e);return i===void 0?t:i}See.exports=VUe});var xee=w((Cgt,vee)=>{var XUe=hF(),ZUe=C0(),$Ue=DR(),e2e=_B(),t2e=pF(),r2e=dF(),i2e=gu(),n2e=1,s2e=2;function o2e(r,e){return e2e(r)&&t2e(e)?r2e(i2e(r),e):function(t){var i=ZUe(t,r);return i===void 0&&i===e?$Ue(t,r):XUe(e,i,n2e|s2e)}}vee.exports=o2e});var Pee=w((mgt,kee)=>{function a2e(r){return function(e){return e==null?void 0:e[r]}}kee.exports=a2e});var Ree=w((Egt,Dee)=>{var A2e=hC();function l2e(r){return function(e){return A2e(e,r)}}Dee.exports=l2e});var Nee=w((Igt,Fee)=>{var c2e=Pee(),u2e=Ree(),g2e=_B(),f2e=gu();function h2e(r){return g2e(r)?c2e(f2e(r)):u2e(r)}Fee.exports=h2e});var CF=w((ygt,Lee)=>{var p2e=Qee(),d2e=xee(),C2e=r0(),m2e=Ks(),E2e=Nee();function I2e(r){return typeof r=="function"?r:r==null?C2e:typeof r=="object"?m2e(r)?d2e(r[0],r[1]):p2e(r):E2e(r)}Lee.exports=I2e});var mF=w((wgt,Tee)=>{var y2e=Nf(),w2e=tF(),B2e=CF();function b2e(r,e){var t={};return e=B2e(e,3),w2e(r,function(i,n,s){y2e(t,n,e(i,n,s))}),t}Tee.exports=b2e});var PC=w((Bgt,Oee)=>{"use strict";function pu(r){this._maxSize=r,this.clear()}pu.prototype.clear=function(){this._size=0,this._values=Object.create(null)};pu.prototype.get=function(r){return this._values[r]};pu.prototype.set=function(r,e){return this._size>=this._maxSize&&this.clear(),r in this._values||this._size++,this._values[r]=e};var Q2e=/[^.^\]^[]+|(?=\[\]|\.\.)/g,Mee=/^\d+$/,S2e=/^\d/,v2e=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,x2e=/^\s*(['"]?)(.*?)(\1)\s*$/,EF=512,Kee=new pu(EF),Uee=new pu(EF),Hee=new pu(EF);Oee.exports={Cache:pu,split:yF,normalizePath:IF,setter:function(r){var e=IF(r);return Uee.get(r)||Uee.set(r,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(DC,"__esModule",{value:!0});DC.create=F2e;DC.default=void 0;var N2e=PC(),m0={context:"$",value:"."};function F2e(r,e){return new E0(r,e)}var E0=class{constructor(e,t={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===m0.context,this.isValue=this.key[0]===m0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?m0.context:this.isValue?m0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,N2e.getter)(this.path,!0),this.map=t.map}getValue(e,t,i){let n=this.isContext?i:this.isValue?e:t;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,t){return this.getValue(e,t==null?void 0:t.parent,t==null?void 0:t.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};DC.default=E0;E0.prototype.__isYupRef=!0});var jee=w(BF=>{"use strict";Object.defineProperty(BF,"__esModule",{value:!0});BF.default=L2e;var T2e=bF(mF()),I0=bF(fu()),O2e=bF(du());function bF(r){return r&&r.__esModule?r:{default:r}}function y0(){return y0=Object.assign||function(r){for(var e=1;e=0)&&(t[n]=r[n]);return t}function L2e(r){function e(t,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=t,u=M2e(t,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=r,{parent:m,context:y}=a;function b(Y){return O2e.default.isRef(Y)?Y.getValue(n,m,y):Y}function v(Y={}){let $=(0,T2e.default)(y0({value:n,originalValue:l,label:o,path:Y.path||s},h,Y.params),b),_=new I0.default(I0.default.formatError(Y.message||p,$),n,$.path,Y.type||g);return _.params=$,_}let x=y0({path:s,parent:m,type:g,createError:v,resolve:b,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(x,n,x)).then(Y=>{I0.default.isError(Y)?i(Y):Y?i(null,Y):i(v())})}catch(Y){i(Y)}return}let T;try{var q;if(T=f.call(x,n,x),typeof((q=T)==null?void 0:q.then)=="function")throw new Error(`Validation test of type: "${x.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(Y){i(Y);return}I0.default.isError(T)?i(T):T?i(null,T):i(v())}return e.OPTIONS=r,e}});var QF=w(RC=>{"use strict";Object.defineProperty(RC,"__esModule",{value:!0});RC.getIn=Gee;RC.default=void 0;var K2e=PC(),U2e=r=>r.substr(0,r.length-1).substr(1);function Gee(r,e,t,i=t){let n,s,o;return e?((0,K2e.forEach)(e,(a,l,c)=>{let u=l?U2e(a):a;if(r=r.resolve({context:i,parent:n,value:t}),r.innerType){let g=c?parseInt(u,10):0;if(t&&g>=t.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=t,t=t&&t[g],r=r.innerType}if(!c){if(!r.fields||!r.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${r._type}")`);n=t,t=t&&t[u],r=r.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:r,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:r}}var H2e=(r,e,t,i)=>Gee(r,e,t,i).schema,j2e=H2e;RC.default=j2e});var qee=w(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});w0.default=void 0;var Yee=G2e(du());function G2e(r){return r&&r.__esModule?r:{default:r}}var B0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,t]of this.refs)e.push(t.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){Yee.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){Yee.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(t(i.value)===e)return!0;return!1}clone(){let e=new B0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),t.list.forEach(n=>i.delete(n)),t.refs.forEach(n=>i.delete(n)),i}};w0.default=B0});var EA=w(b0=>{"use strict";Object.defineProperty(b0,"__esModule",{value:!0});b0.default=void 0;var Jee=mA(hZ()),jf=CA(),Y2e=mA(kZ()),Wee=mA(l0()),Q0=mA(jee()),zee=mA(IC()),q2e=mA(du()),J2e=QF(),W2e=mA(WR()),_ee=mA(fu()),Vee=mA(qee());function mA(r){return r&&r.__esModule?r:{default:r}}function Js(){return Js=Object.assign||function(r){for(var e=1;e{this.typeError(jf.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=Js({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=Js({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=(0,Jee.default)(Js({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(e.length===0)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=t,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let t=this,i=e.clone(),n=Js({},t.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=t._typeError),i._whitelistError||(i._whitelistError=t._whitelistError),i._blacklistError||(i._blacklistError=t._blacklistError),i._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),i.tests=t.tests,i.exclusiveTests=t.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let i=t.conditions;t=t.clone(),t.conditions=[],t=i.reduce((n,s)=>s.resolve(n,e),t),t=t.resolve(e)}return t}cast(e,t={}){let i=this.resolve(Js({value:e},t)),n=i._cast(e,t);if(e!==void 0&&t.assert!==!1&&i.isType(n)!==!0){let s=(0,zee.default)(e),o=(0,zee.default)(n);throw new TypeError(`The value of ${t.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". + +attempted value: ${s} +`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,t){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,t={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=t,u=e;l||(u=this._cast(u,Js({assert:!1},t)));let g={value:u,path:s,options:t,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,Wee.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,Wee.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,t,i){let n=this.resolve(Js({},t,{value:e}));return typeof i=="function"?n._validate(e,t,i):new Promise((s,o)=>n._validate(e,t,(a,l)=>{a?o(a):s(l)}))}validateSync(e,t){let i=this.resolve(Js({},t,{value:e})),n;return i._validate(e,Js({},t,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,i=>{if(_ee.default.isError(i))return!1;throw i})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(i){if(_ee.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,Jee.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return e!=null}defined(e=jf.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(t){return t!==void 0}})}required(e=jf.mixed.required){return this.clone({presence:"required"}).withMutation(t=>t.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(t=>t.OPTIONS.name!=="required"),e}nullable(e=!0){var t=this.clone({nullable:e!==!1});return t}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(e.length===1?typeof e[0]=="function"?t={test:e[0]}:t=e[0]:e.length===2?t={name:e[0],test:e[1]}:t={name:e[0],message:e[1],test:e[2]},t.message===void 0&&(t.message=jf.mixed.default),typeof t.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,Q0.default)(t),s=t.exclusive||t.name&&i.exclusiveTests[t.name]===!0;if(t.exclusive&&!t.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return t.name&&(i.exclusiveTests[t.name]=!!t.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===t.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,t){!Array.isArray(e)&&typeof e!="string"&&(t=e,e=".");let i=this.clone(),n=(0,W2e.default)(e).map(s=>new q2e.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new Y2e.default(n,t)),i}typeError(e){var t=this.clone();return t._typeError=(0,Q0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),t}oneOf(e,t=jf.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,Q0.default)({message:t,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,t=jf.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,Q0.default)({message:t,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:i}=e.spec;return{meta:i,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};b0.default=ua;ua.prototype.__isYupSchema__=!0;for(let r of["validate","validateSync"])ua.prototype[`${r}At`]=function(e,t,i={}){let{parent:n,parentPath:s,schema:o}=(0,J2e.getIn)(this,e,t,i.context);return o[r](n&&n[s],Js({},i,{parent:n,path:e}))};for(let r of["equals","is"])ua.prototype[r]=ua.prototype.oneOf;for(let r of["not","nope"])ua.prototype[r]=ua.prototype.notOneOf;ua.prototype.optional=ua.prototype.notRequired});var Zee=w(FC=>{"use strict";Object.defineProperty(FC,"__esModule",{value:!0});FC.create=Xee;FC.default=void 0;var _2e=z2e(EA());function z2e(r){return r&&r.__esModule?r:{default:r}}var SF=_2e.default,V2e=SF;FC.default=V2e;function Xee(){return new SF}Xee.prototype=SF.prototype});var Gf=w(S0=>{"use strict";Object.defineProperty(S0,"__esModule",{value:!0});S0.default=void 0;var X2e=r=>r==null;S0.default=X2e});var ite=w(NC=>{"use strict";Object.defineProperty(NC,"__esModule",{value:!0});NC.create=$ee;NC.default=void 0;var Z2e=ete(EA()),tte=CA(),rte=ete(Gf());function ete(r){return r&&r.__esModule?r:{default:r}}function $ee(){return new v0}var v0=class extends Z2e.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(t){return(0,rte.default)(t)||t===!0}})}isFalse(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(t){return(0,rte.default)(t)||t===!1}})}};NC.default=v0;$ee.prototype=v0.prototype});var ote=w(LC=>{"use strict";Object.defineProperty(LC,"__esModule",{value:!0});LC.create=nte;LC.default=void 0;var ga=CA(),IA=ste(Gf()),$2e=ste(EA());function ste(r){return r&&r.__esModule?r:{default:r}}var eHe=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,tHe=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,rHe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,iHe=r=>(0,IA.default)(r)||r===r.trim(),nHe={}.toString();function nte(){return new x0}var x0=class extends $2e.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=e!=null&&e.toString?e.toString():e;return t===nHe?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=ga.string.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,IA.default)(i)||i.length===this.resolve(e)}})}min(e,t=ga.string.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,IA.default)(i)||i.length>=this.resolve(e)}})}max(e,t=ga.string.max){return this.test({name:"max",exclusive:!0,message:t,params:{max:e},test(i){return(0,IA.default)(i)||i.length<=this.resolve(e)}})}matches(e,t){let i=!1,n,s;return t&&(typeof t=="object"?{excludeEmptyString:i=!1,message:n,name:s}=t:n=t),this.test({name:s||"matches",message:n||ga.string.matches,params:{regex:e},test:o=>(0,IA.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=ga.string.email){return this.matches(eHe,{name:"email",message:e,excludeEmptyString:!0})}url(e=ga.string.url){return this.matches(tHe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=ga.string.uuid){return this.matches(rHe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=ga.string.trim){return this.transform(t=>t!=null?t.trim():t).test({message:e,name:"trim",test:iHe})}lowercase(e=ga.string.lowercase){return this.transform(t=>(0,IA.default)(t)?t:t.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toLowerCase()})}uppercase(e=ga.string.uppercase){return this.transform(t=>(0,IA.default)(t)?t:t.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toUpperCase()})}};LC.default=x0;nte.prototype=x0.prototype});var lte=w(TC=>{"use strict";Object.defineProperty(TC,"__esModule",{value:!0});TC.create=ate;TC.default=void 0;var Cu=CA(),mu=Ate(Gf()),sHe=Ate(EA());function Ate(r){return r&&r.__esModule?r:{default:r}}var oHe=r=>r!=+r;function ate(){return new k0}var k0=class extends sHe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let t=e;if(typeof t=="string"){if(t=t.replace(/\s/g,""),t==="")return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!oHe(e)}min(e,t=Cu.number.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,mu.default)(i)||i>=this.resolve(e)}})}max(e,t=Cu.number.max){return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,mu.default)(i)||i<=this.resolve(e)}})}lessThan(e,t=Cu.number.lessThan){return this.test({message:t,name:"max",exclusive:!0,params:{less:e},test(i){return(0,mu.default)(i)||ithis.resolve(e)}})}positive(e=Cu.number.positive){return this.moreThan(0,e)}negative(e=Cu.number.negative){return this.lessThan(0,e)}integer(e=Cu.number.integer){return this.test({name:"integer",message:e,test:t=>(0,mu.default)(t)||Number.isInteger(t)})}truncate(){return this.transform(e=>(0,mu.default)(e)?e:e|0)}round(e){var t,i=["ceil","floor","round","trunc"];if(e=((t=e)==null?void 0:t.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,mu.default)(n)?n:Math[e](n))}};TC.default=k0;ate.prototype=k0.prototype});var cte=w(vF=>{"use strict";Object.defineProperty(vF,"__esModule",{value:!0});vF.default=aHe;var AHe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function aHe(r){var e=[1,4,5,6,7,10,11],t=0,i,n;if(n=AHe.exec(r)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(t=n[10]*60+n[11],n[9]==="+"&&(t=0-t)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+t,n[6],n[7]))}else i=Date.parse?Date.parse(r):NaN;return i}});var fte=w(OC=>{"use strict";Object.defineProperty(OC,"__esModule",{value:!0});OC.create=xF;OC.default=void 0;var lHe=P0(cte()),ute=CA(),gte=P0(Gf()),cHe=P0(du()),uHe=P0(EA());function P0(r){return r&&r.__esModule?r:{default:r}}var kF=new Date(""),gHe=r=>Object.prototype.toString.call(r)==="[object Date]";function xF(){return new MC}var MC=class extends uHe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,lHe.default)(e),isNaN(e)?kF:new Date(e))})})}_typeCheck(e){return gHe(e)&&!isNaN(e.getTime())}prepareParam(e,t){let i;if(cHe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${t}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,t=ute.date.min){let i=this.prepareParam(e,"min");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(n){return(0,gte.default)(n)||n>=this.resolve(i)}})}max(e,t=ute.date.max){var i=this.prepareParam(e,"max");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(n){return(0,gte.default)(n)||n<=this.resolve(i)}})}};OC.default=MC;MC.INVALID_DATE=kF;xF.prototype=MC.prototype;xF.INVALID_DATE=kF});var pte=w((Tgt,hte)=>{function fHe(r,e,t,i){var n=-1,s=r==null?0:r.length;for(i&&s&&(t=r[++n]);++n{function hHe(r){return function(e){return r==null?void 0:r[e]}}dte.exports=hHe});var Ete=w((Mgt,mte)=>{var pHe=Cte(),dHe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},CHe=pHe(dHe);mte.exports=CHe});var yte=w((Kgt,Ite)=>{var mHe=Ete(),EHe=lf(),IHe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,yHe="\\u0300-\\u036f",wHe="\\ufe20-\\ufe2f",BHe="\\u20d0-\\u20ff",bHe=yHe+wHe+BHe,QHe="["+bHe+"]",SHe=RegExp(QHe,"g");function vHe(r){return r=EHe(r),r&&r.replace(IHe,mHe).replace(SHe,"")}Ite.exports=vHe});var Bte=w((Ugt,wte)=>{var xHe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function kHe(r){return r.match(xHe)||[]}wte.exports=kHe});var Qte=w((Hgt,bte)=>{var PHe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function DHe(r){return PHe.test(r)}bte.exports=DHe});var Yte=w((jgt,Ste)=>{var vte="\\ud800-\\udfff",RHe="\\u0300-\\u036f",FHe="\\ufe20-\\ufe2f",NHe="\\u20d0-\\u20ff",LHe=RHe+FHe+NHe,xte="\\u2700-\\u27bf",kte="a-z\\xdf-\\xf6\\xf8-\\xff",THe="\\xac\\xb1\\xd7\\xf7",OHe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",MHe="\\u2000-\\u206f",KHe=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Pte="A-Z\\xc0-\\xd6\\xd8-\\xde",UHe="\\ufe0e\\ufe0f",Dte=THe+OHe+MHe+KHe,Rte="['\u2019]",Fte="["+Dte+"]",HHe="["+LHe+"]",Nte="\\d+",jHe="["+xte+"]",Lte="["+kte+"]",Tte="[^"+vte+Dte+Nte+xte+kte+Pte+"]",GHe="\\ud83c[\\udffb-\\udfff]",YHe="(?:"+HHe+"|"+GHe+")",qHe="[^"+vte+"]",Ote="(?:\\ud83c[\\udde6-\\uddff]){2}",Mte="[\\ud800-\\udbff][\\udc00-\\udfff]",Yf="["+Pte+"]",JHe="\\u200d",Kte="(?:"+Lte+"|"+Tte+")",WHe="(?:"+Yf+"|"+Tte+")",Ute="(?:"+Rte+"(?:d|ll|m|re|s|t|ve))?",Hte="(?:"+Rte+"(?:D|LL|M|RE|S|T|VE))?",jte=YHe+"?",Gte="["+UHe+"]?",zHe="(?:"+JHe+"(?:"+[qHe,Ote,Mte].join("|")+")"+Gte+jte+")*",_He="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",VHe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",XHe=Gte+jte+zHe,ZHe="(?:"+[jHe,Ote,Mte].join("|")+")"+XHe,$He=RegExp([Yf+"?"+Lte+"+"+Ute+"(?="+[Fte,Yf,"$"].join("|")+")",WHe+"+"+Hte+"(?="+[Fte,Yf+Kte,"$"].join("|")+")",Yf+"?"+Kte+"+"+Ute,Yf+"+"+Hte,VHe,_He,Nte,ZHe].join("|"),"g");function eje(r){return r.match($He)||[]}Ste.exports=eje});var Jte=w((Ggt,qte)=>{var tje=Bte(),rje=Qte(),ije=lf(),nje=Yte();function sje(r,e,t){return r=ije(r),e=t?void 0:e,e===void 0?rje(r)?nje(r):tje(r):r.match(e)||[]}qte.exports=sje});var PF=w((Ygt,Wte)=>{var oje=pte(),aje=yte(),Aje=Jte(),lje="['\u2019]",cje=RegExp(lje,"g");function uje(r){return function(e){return oje(Aje(aje(e).replace(cje,"")),r,"")}}Wte.exports=uje});var _te=w((qgt,zte)=>{var gje=PF(),fje=gje(function(r,e,t){return r+(t?"_":"")+e.toLowerCase()});zte.exports=fje});var Xte=w((Jgt,Vte)=>{var hje=Zw(),pje=PF(),dje=pje(function(r,e,t){return e=e.toLowerCase(),r+(t?hje(e):e)});Vte.exports=dje});var $te=w((Wgt,Zte)=>{var Cje=Nf(),mje=tF(),Eje=CF();function Ije(r,e){var t={};return e=Eje(e,3),mje(r,function(i,n,s){Cje(t,e(i,n,s),i)}),t}Zte.exports=Ije});var tre=w((zgt,DF)=>{DF.exports=function(r){return ere(yje(r),r)};DF.exports.array=ere;function ere(r,e){var t=r.length,i=new Array(t),n={},s=t,o=wje(e),a=Bje(r);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(r[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(m){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--t]=c}}}function yje(r){for(var e=new Set,t=0,i=r.length;t{"use strict";Object.defineProperty(RF,"__esModule",{value:!0});RF.default=bje;var Qje=D0(yC()),Sje=D0(tre()),vje=PC(),xje=D0(du()),kje=D0(Tf());function D0(r){return r&&r.__esModule?r:{default:r}}function bje(r,e=[]){let t=[],i=[];function n(s,o){var a=(0,vje.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||t.push([o,a])}for(let s in r)if((0,Qje.default)(r,s)){let o=r[s];~i.indexOf(s)||i.push(s),xje.default.isRef(o)&&o.isSibling?n(o.path,s):(0,kje.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return Sje.default.array(i,t).reverse()}});var nre=w(FF=>{"use strict";Object.defineProperty(FF,"__esModule",{value:!0});FF.default=Pje;function ire(r,e){let t=Infinity;return r.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return t=n,!0}),t}function Pje(r){return(e,t)=>ire(r,e)-ire(r,t)}});var ure=w(KC=>{"use strict";Object.defineProperty(KC,"__esModule",{value:!0});KC.create=sre;KC.default=void 0;var ore=fa(yC()),are=fa(_te()),Dje=fa(Xte()),Rje=fa($te()),Fje=fa(mF()),Nje=PC(),Are=CA(),Lje=fa(rre()),lre=fa(nre()),Tje=fa(l0()),Oje=fa(fu()),NF=fa(EA());function fa(r){return r&&r.__esModule?r:{default:r}}function qf(){return qf=Object.assign||function(r){for(var e=1;eObject.prototype.toString.call(r)==="[object Object]";function Mje(r,e){let t=Object.keys(r.fields);return Object.keys(e).filter(i=>t.indexOf(i)===-1)}var Kje=(0,lre.default)([]),R0=class extends NF.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=Kje,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return cre(e)||typeof e=="function"}_cast(e,t={}){var i;let n=super._cast(e,t);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=t.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=qf({},t,{parent:l,__validating:t.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,ore.default)(n,g);if(f){let p,m=n[g];c.path=(t.path?`${t.path}.`:"")+g,f=f.resolve({value:m,context:t.context,parent:l});let y="spec"in f?f.spec:void 0,b=y==null?void 0:y.strict;if(y==null?void 0:y.strip){u=u||g in n;continue}p=!t.__validating||!b?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,t={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=t;o=[{schema:this,value:a},...o],t.__validating=!0,t.originalValue=a,t.from=o,super._validate(e,t,(u,g)=>{if(u){if(!Oje.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!cre(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,m)=>{let y=h.indexOf(".")===-1?(t.path?`${t.path}.`:"")+h:`${t.path||""}["${h}"]`,b=this.fields[h];if(b&&"validate"in b){b.validate(g[h],qf({},t,{path:y,from:o,strict:!0,parent:g,originalValue:a[h]}),m);return}m(null)});(0,Tje.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:t.path},i)})}clone(e){let t=super.clone(e);return t.fields=qf({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),i=t.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof NF.default&&s instanceof NF.default&&(i[n]=s.concat(o))}return t.withMutation(()=>t.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let i=this.fields[t];e[t]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,t=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,lre.default)(Object.keys(n)),t.length){Array.isArray(t[0])||(t=[t]);let s=t.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,Lje.default)(n,i._excludedEdges),i}pick(e){let t={};for(let i of e)this.fields[i]&&(t[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(t)))}omit(e){let t=this.clone(),i=t.fields;t.fields={};for(let n of e)delete i[n];return t.withMutation(()=>t.shape(i))}from(e,t,i){let n=(0,Nje.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,ore.default)(s,e)&&(o=qf({},s),i||delete o[e],o[t]=n(s)),o})}noUnknown(e=!0,t=Are.object.noUnknown){typeof e=="string"&&(t=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:t,test(n){if(n==null)return!0;let s=Mje(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,t=Are.object.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&(0,Rje.default)(t,(i,n)=>e(n)))}camelCase(){return this.transformKeys(Dje.default)}snakeCase(){return this.transformKeys(are.default)}constantCase(){return this.transformKeys(e=>(0,are.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,Fje.default)(this.fields,t=>t.describe()),e}};KC.default=R0;function sre(r){return new R0(r)}sre.prototype=R0.prototype});var fre=w(UC=>{"use strict";Object.defineProperty(UC,"__esModule",{value:!0});UC.create=gre;UC.default=void 0;var LF=Jf(Gf()),Uje=Jf(Tf()),Hje=Jf(IC()),TF=CA(),jje=Jf(l0()),Gje=Jf(fu()),Yje=Jf(EA());function Jf(r){return r&&r.__esModule?r:{default:r}}function F0(){return F0=Object.assign||function(r){for(var e=1;e{this.transform(function(t){if(typeof t=="string")try{t=JSON.parse(t)}catch(i){t=null}return this.isType(t)?t:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let i=super._cast(e,t);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,F0({},t,{path:`${t.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,t={},i){var n,s;let o=[],a=t.sync,l=t.path,c=this.innerType,u=(n=t.abortEarly)!=null?n:this.spec.abortEarly,g=(s=t.recursive)!=null?s:this.spec.recursive,f=t.originalValue!=null?t.originalValue:e;super._validate(e,t,(h,p)=>{if(h){if(!Gje.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let m=new Array(p.length);for(let y=0;yc.validate(b,x,q)}(0,jje.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:m},i)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!(0,Uje.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,Hje.default)(e));return t.innerType=e,t}length(e,t=TF.array.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,LF.default)(i)||i.length===this.resolve(e)}})}min(e,t){return t=t||TF.array.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,LF.default)(i)||i.length>=this.resolve(e)}})}max(e,t){return t=t||TF.array.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,LF.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:t==null?[]:[].concat(t))}compact(e){let t=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(t):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};UC.default=N0;gre.prototype=N0.prototype});var hre=w(HC=>{"use strict";Object.defineProperty(HC,"__esModule",{value:!0});HC.create=qje;HC.default=void 0;var Wje=Jje(Tf());function Jje(r){return r&&r.__esModule?r:{default:r}}function qje(r){return new OF(r)}var OF=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(t,i={})=>{let n=this.builder(t,i);if(!(0,Wje.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,t){return this._resolve(e,t).cast(e,t)}validate(e,t,i){return this._resolve(e,t).validate(e,t,i)}validateSync(e,t){return this._resolve(e,t).validateSync(e,t)}validateAt(e,t,i){return this._resolve(t,i).validateAt(e,t,i)}validateSyncAt(e,t,i){return this._resolve(t,i).validateSyncAt(e,t,i)}describe(){return null}isValid(e,t){return this._resolve(e,t).isValid(e,t)}isValidSync(e,t){return this._resolve(e,t).isValidSync(e,t)}},zje=OF;HC.default=zje});var pre=w(MF=>{"use strict";Object.defineProperty(MF,"__esModule",{value:!0});MF.default=_je;var Xje=Vje(CA());function Vje(r){return r&&r.__esModule?r:{default:r}}function _je(r){Object.keys(r).forEach(e=>{Object.keys(r[e]).forEach(t=>{Xje.default[e][t]=r[e][t]})})}});var UF=w(Br=>{"use strict";Object.defineProperty(Br,"__esModule",{value:!0});Br.addMethod=Zje;Object.defineProperty(Br,"MixedSchema",{enumerable:!0,get:function(){return dre.default}});Object.defineProperty(Br,"mixed",{enumerable:!0,get:function(){return dre.create}});Object.defineProperty(Br,"BooleanSchema",{enumerable:!0,get:function(){return KF.default}});Object.defineProperty(Br,"bool",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"boolean",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"StringSchema",{enumerable:!0,get:function(){return Cre.default}});Object.defineProperty(Br,"string",{enumerable:!0,get:function(){return Cre.create}});Object.defineProperty(Br,"NumberSchema",{enumerable:!0,get:function(){return mre.default}});Object.defineProperty(Br,"number",{enumerable:!0,get:function(){return mre.create}});Object.defineProperty(Br,"DateSchema",{enumerable:!0,get:function(){return Ere.default}});Object.defineProperty(Br,"date",{enumerable:!0,get:function(){return Ere.create}});Object.defineProperty(Br,"ObjectSchema",{enumerable:!0,get:function(){return Ire.default}});Object.defineProperty(Br,"object",{enumerable:!0,get:function(){return Ire.create}});Object.defineProperty(Br,"ArraySchema",{enumerable:!0,get:function(){return yre.default}});Object.defineProperty(Br,"array",{enumerable:!0,get:function(){return yre.create}});Object.defineProperty(Br,"ref",{enumerable:!0,get:function(){return $je.create}});Object.defineProperty(Br,"lazy",{enumerable:!0,get:function(){return eGe.create}});Object.defineProperty(Br,"ValidationError",{enumerable:!0,get:function(){return tGe.default}});Object.defineProperty(Br,"reach",{enumerable:!0,get:function(){return rGe.default}});Object.defineProperty(Br,"isSchema",{enumerable:!0,get:function(){return wre.default}});Object.defineProperty(Br,"setLocale",{enumerable:!0,get:function(){return iGe.default}});Object.defineProperty(Br,"BaseSchema",{enumerable:!0,get:function(){return nGe.default}});var dre=Eu(Zee()),KF=Eu(ite()),Cre=Eu(ote()),mre=Eu(lte()),Ere=Eu(fte()),Ire=Eu(ure()),yre=Eu(fre()),$je=du(),eGe=hre(),tGe=jC(fu()),rGe=jC(QF()),wre=jC(Tf()),iGe=jC(pre()),nGe=jC(EA());function jC(r){return r&&r.__esModule?r:{default:r}}function Bre(){if(typeof WeakMap!="function")return null;var r=new WeakMap;return Bre=function(){return r},r}function Eu(r){if(r&&r.__esModule)return r;if(r===null||typeof r!="object"&&typeof r!="function")return{default:r};var e=Bre();if(e&&e.has(r))return e.get(r);var t={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in r)if(Object.prototype.hasOwnProperty.call(r,n)){var s=i?Object.getOwnPropertyDescriptor(r,n):null;s&&(s.get||s.set)?Object.defineProperty(t,n,s):t[n]=r[n]}return t.default=r,e&&e.set(r,t),t}function Zje(r,e,t){if(!r||!(0,wre.default)(r.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof t!="function")throw new TypeError("Method function must be provided");r.prototype[e]=t}});var xre=w((hft,YC)=>{"use strict";var aGe=process.env.TERM_PROGRAM==="Hyper",AGe=process.platform==="win32",Qre=process.platform==="linux",HF={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Sre=Object.assign({},HF,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),vre=Object.assign({},HF,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:Qre?"\u25B8":"\u276F",pointerSmall:Qre?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});YC.exports=AGe&&!aGe?Sre:vre;Reflect.defineProperty(YC.exports,"common",{enumerable:!1,value:HF});Reflect.defineProperty(YC.exports,"windows",{enumerable:!1,value:Sre});Reflect.defineProperty(YC.exports,"other",{enumerable:!1,value:vre})});var Eo=w((pft,jF)=>{"use strict";var lGe=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),cGe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,kre=()=>{let r={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(r.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},t=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(r.enabled===!1)return s;if(r.visible===!1)return"";let a=""+s,l=a.includes(` +`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=t(r.styles[o[c]],a,l);return a},n=(s,o,a)=>{r.styles[s]=e({name:s,codes:o}),(r.keys[a]||(r.keys[a]=[])).push(s),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(c){r.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,r),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),r.ansiRegex=cGe,r.hasColor=r.hasAnsi=s=>(r.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&r.ansiRegex.test(s)),r.alias=(s,o)=>{let a=typeof o=="string"?r[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),r.styles[s]=a,a.stack=[s]),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(l){r.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,r),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},r.theme=s=>{if(!lGe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))r.alias(o,s[o]);return r},r.alias("unstyle",s=>typeof s=="string"&&s!==""?(r.ansiRegex.lastIndex=0,s.replace(r.ansiRegex,"")):""),r.alias("noop",s=>s),r.none=r.clear=r.noop,r.stripColor=r.unstyle,r.symbols=xre(),r.define=n,r};jF.exports=kre();jF.exports.create=kre});var Xi=w(Lt=>{"use strict";var uGe=Object.prototype.toString,Ws=Eo(),Pre=!1,GF=[],Dre={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};Lt.longest=(r,e)=>r.reduce((t,i)=>Math.max(t,e?i[e].length:i.length),0);Lt.hasColor=r=>!!r&&Ws.hasColor(r);var T0=Lt.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);Lt.nativeType=r=>uGe.call(r).slice(8,-1).toLowerCase().replace(/\s/g,"");Lt.isAsyncFn=r=>Lt.nativeType(r)==="asyncfunction";Lt.isPrimitive=r=>r!=null&&typeof r!="object"&&typeof r!="function";Lt.resolve=(r,e,...t)=>typeof e=="function"?e.call(r,...t):e;Lt.scrollDown=(r=[])=>[...r.slice(1),r[0]];Lt.scrollUp=(r=[])=>[r.pop(),...r];Lt.reorder=(r=[])=>{let e=r.slice();return e.sort((t,i)=>t.index>i.index?1:t.index{let i=r.length,n=t===i?0:t<0?i-1:t,s=r[e];r[e]=r[n],r[n]=s};Lt.width=(r,e=80)=>{let t=r&&r.columns?r.columns:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[0]),process.platform==="win32"?t-1:t};Lt.height=(r,e=20)=>{let t=r&&r.rows?r.rows:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[1]),t};Lt.wordWrap=(r,e={})=>{if(!r)return r;typeof e=="number"&&(e={width:e});let{indent:t="",newline:i=` +`+t,width:n=80}=e;n-=((i+t).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=r.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),t+c.join(i)};Lt.unmute=r=>{let e=r.stack.find(i=>Ws.keys.color.includes(i));return e?Ws[e]:r.stack.find(i=>i.slice(2)==="bg")?Ws[e.slice(2)]:i=>i};Lt.pascal=r=>r?r[0].toUpperCase()+r.slice(1):"";Lt.inverse=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i));if(e){let i=Ws["bg"+Lt.pascal(e)];return i?i.black:r}let t=r.stack.find(i=>i.slice(0,2)==="bg");return t?Ws[t.slice(2).toLowerCase()]||r:Ws.none};Lt.complement=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i)),t=r.stack.find(i=>i.slice(0,2)==="bg");if(e&&!t)return Ws[Dre[e]||e];if(t){let i=t.slice(2).toLowerCase(),n=Dre[i];return n&&Ws["bg"+Lt.pascal(n)]||r}return Ws.none};Lt.meridiem=r=>{let e=r.getHours(),t=r.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=t<10?"0"+t:t;return n+":"+s+" "+i};Lt.set=(r={},e="",t)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:t;return!Lt.isObject(a)&&s{let i=r[e]==null?e.split(".").reduce((n,s)=>n&&n[s],r):r[e];return i==null?t:i};Lt.mixin=(r,e)=>{if(!T0(r))return e;if(!T0(e))return r;for(let t of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,t);if(i.hasOwnProperty("value"))if(r.hasOwnProperty(t)&&T0(i.value)){let n=Object.getOwnPropertyDescriptor(r,t);T0(n.value)?r[t]=Lt.merge({},r[t],e[t]):Reflect.defineProperty(r,t,i)}else Reflect.defineProperty(r,t,i);else Reflect.defineProperty(r,t,i)}return r};Lt.merge=(...r)=>{let e={};for(let t of r)Lt.mixin(e,t);return e};Lt.mixinEmitter=(r,e)=>{let t=e.constructor.prototype;for(let i of Object.keys(t)){let n=t[i];typeof n=="function"?Lt.define(r,i,n.bind(e)):Lt.define(r,i,n)}};Lt.onExit=r=>{let e=(t,i)=>{Pre||(Pre=!0,GF.forEach(n=>n()),t===!0&&process.exit(128+i))};GF.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),GF.push(r)};Lt.define=(r,e,t)=>{Reflect.defineProperty(r,e,{value:t})};Lt.defineExport=(r,e,t)=>{let i;Reflect.defineProperty(r,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():t()}})}});var Rre=w(zf=>{"use strict";zf.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};zf.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};zf.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};zf.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};zf.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var Lre=w((mft,Fre)=>{"use strict";var Nre=require("readline"),gGe=Rre(),fGe=/^(?:\x1b)([a-zA-Z0-9])$/,hGe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,pGe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function dGe(r){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(r)}function CGe(r){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(r)}var O0=(r="",e={})=>{let t,i=N({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:r,raw:r},e);if(Buffer.isBuffer(r)?r[0]>127&&r[1]===void 0?(r[0]-=128,r=""+String(r)):r=String(r):r!==void 0&&typeof r!="string"?r=String(r):r||(r=i.sequence||""),i.sequence=i.sequence||r||i.name,r==="\r")i.raw=void 0,i.name="return";else if(r===` +`)i.name="enter";else if(r===" ")i.name="tab";else if(r==="\b"||r==="\x7F"||r==="\x7F"||r==="\b")i.name="backspace",i.meta=r.charAt(0)==="";else if(r===""||r==="")i.name="escape",i.meta=r.length===2;else if(r===" "||r===" ")i.name="space",i.meta=r.length===2;else if(r<="")i.name=String.fromCharCode(r.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(r.length===1&&r>="0"&&r<="9")i.name="number";else if(r.length===1&&r>="a"&&r<="z")i.name=r;else if(r.length===1&&r>="A"&&r<="Z")i.name=r.toLowerCase(),i.shift=!0;else if(t=fGe.exec(r))i.meta=!0,i.shift=/^[A-Z]$/.test(t[1]);else if(t=hGe.exec(r)){let n=[...r];n[0]===""&&n[1]===""&&(i.option=!0);let s=[t[1],t[2],t[4],t[6]].filter(Boolean).join(""),o=(t[3]||t[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=pGe[s],i.shift=dGe(s)||i.shift,i.ctrl=CGe(s)||i.ctrl}return i};O0.listen=(r={},e)=>{let{stdin:t}=r;if(!t||t!==process.stdin&&!t.isTTY)throw new Error("Invalid stream passed");let i=Nre.createInterface({terminal:!0,input:t});Nre.emitKeypressEvents(t,i);let n=(a,l)=>e(a,O0(a,l),i),s=t.isRaw;return t.isTTY&&t.setRawMode(!0),t.on("keypress",n),i.resume(),()=>{t.isTTY&&t.setRawMode(s),t.removeListener("keypress",n),i.pause(),i.close()}};O0.action=(r,e,t)=>{let i=N(N({},gGe),t);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};Fre.exports=O0});var Ore=w((Eft,Tre)=>{"use strict";Tre.exports=r=>{r.timers=r.timers||{};let e=r.options.timers;if(!!e)for(let t of Object.keys(e)){let i=e[t];typeof i=="number"&&(i={interval:i}),mGe(r,t,i)}};function mGe(r,e,t={}){let i=r.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=t.interval||120;i.frames=t.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,r.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),r.once("close",()=>i.stop()),i.stop}});var Ure=w((Ift,Mre)=>{"use strict";var{define:EGe,width:IGe}=Xi(),Kre=class{constructor(e){let t=e.options;EGe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=IGe(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=N({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t=="function"?t:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};Mre.exports=Kre});var jre=w((yft,Hre)=>{"use strict";var YF=Xi(),Ni=Eo(),qF={default:Ni.noop,noop:Ni.noop,set inverse(r){this._inverse=r},get inverse(){return this._inverse||YF.inverse(this.primary)},set complement(r){this._complement=r},get complement(){return this._complement||YF.complement(this.primary)},primary:Ni.cyan,success:Ni.green,danger:Ni.magenta,strong:Ni.bold,warning:Ni.yellow,muted:Ni.dim,disabled:Ni.gray,dark:Ni.dim.gray,underline:Ni.underline,set info(r){this._info=r},get info(){return this._info||this.primary},set em(r){this._em=r},get em(){return this._em||this.primary.underline},set heading(r){this._heading=r},get heading(){return this._heading||this.muted.underline},set pending(r){this._pending=r},get pending(){return this._pending||this.primary},set submitted(r){this._submitted=r},get submitted(){return this._submitted||this.success},set cancelled(r){this._cancelled=r},get cancelled(){return this._cancelled||this.danger},set typing(r){this._typing=r},get typing(){return this._typing||this.dim},set placeholder(r){this._placeholder=r},get placeholder(){return this._placeholder||this.primary.dim},set highlight(r){this._highlight=r},get highlight(){return this._highlight||this.inverse}};qF.merge=(r={})=>{r.styles&&typeof r.styles.enabled=="boolean"&&(Ni.enabled=r.styles.enabled),r.styles&&typeof r.styles.visible=="boolean"&&(Ni.visible=r.styles.visible);let e=YF.merge({},qF,r.styles);delete e.merge;for(let t of Object.keys(Ni))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});for(let t of Object.keys(Ni.styles))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});return e};Hre.exports=qF});var Yre=w((wft,Gre)=>{"use strict";var JF=process.platform==="win32",yA=Eo(),yGe=Xi(),WF=te(N({},yA.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:yA.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:yA.symbols.question,submitted:yA.symbols.check,cancelled:yA.symbols.cross},separator:{pending:yA.symbols.pointerSmall,submitted:yA.symbols.middot,cancelled:yA.symbols.middot},radio:{off:JF?"( )":"\u25EF",on:JF?"(*)":"\u25C9",disabled:JF?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});WF.merge=r=>{let e=yGe.merge({},yA.symbols,WF,r.symbols);return delete e.merge,e};Gre.exports=WF});var Jre=w((Bft,qre)=>{"use strict";var wGe=jre(),BGe=Yre(),bGe=Xi();qre.exports=r=>{r.options=bGe.merge({},r.options.theme,r.options),r.symbols=BGe.merge(r.options),r.styles=wGe.merge(r.options)}});var Xre=w((Wre,zre)=>{"use strict";var _re=process.env.TERM_PROGRAM==="Apple_Terminal",QGe=Eo(),zF=Xi(),Io=zre.exports=Wre,Lr="[",Vre="\x07",_F=!1,Fl=Io.code={bell:Vre,beep:Vre,beginning:`${Lr}G`,down:`${Lr}J`,esc:Lr,getPosition:`${Lr}6n`,hide:`${Lr}?25l`,line:`${Lr}2K`,lineEnd:`${Lr}K`,lineStart:`${Lr}1K`,restorePosition:Lr+(_re?"8":"u"),savePosition:Lr+(_re?"7":"s"),screen:`${Lr}2J`,show:`${Lr}?25h`,up:`${Lr}1J`},Iu=Io.cursor={get hidden(){return _F},hide(){return _F=!0,Fl.hide},show(){return _F=!1,Fl.show},forward:(r=1)=>`${Lr}${r}C`,backward:(r=1)=>`${Lr}${r}D`,nextLine:(r=1)=>`${Lr}E`.repeat(r),prevLine:(r=1)=>`${Lr}F`.repeat(r),up:(r=1)=>r?`${Lr}${r}A`:"",down:(r=1)=>r?`${Lr}${r}B`:"",right:(r=1)=>r?`${Lr}${r}C`:"",left:(r=1)=>r?`${Lr}${r}D`:"",to(r,e){return e?`${Lr}${e+1};${r+1}H`:`${Lr}${r+1}G`},move(r=0,e=0){let t="";return t+=r<0?Iu.left(-r):r>0?Iu.right(r):"",t+=e<0?Iu.up(-e):e>0?Iu.down(e):"",t},restore(r={}){let{after:e,cursor:t,initial:i,input:n,prompt:s,size:o,value:a}=r;if(i=zF.isPrimitive(i)?String(i):"",n=zF.isPrimitive(n)?String(n):"",a=zF.isPrimitive(a)?String(a):"",o){let l=Io.cursor.up(o)+Io.cursor.to(s.length),c=n.length-t;return c>0&&(l+=Io.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+t;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Io.cursor.move(l)}}},VF=Io.erase={screen:Fl.screen,up:Fl.up,down:Fl.down,line:Fl.line,lineEnd:Fl.lineEnd,lineStart:Fl.lineStart,lines(r){let e="";for(let t=0;t{if(!e)return VF.line+Iu.to(0);let t=s=>[...QGe.unstyle(s)].length,i=r.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(t(s)-1,0)/e);return(VF.line+Iu.prevLine()).repeat(n-1)+VF.line+Iu.to(0)}});var _f=w((bft,Zre)=>{"use strict";var SGe=require("events"),$re=Eo(),XF=Lre(),vGe=Ore(),xGe=Ure(),kGe=Jre(),Tn=Xi(),yu=Xre(),M0=class extends SGe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,kGe(this),vGe(this),this.state=new xGe(this),this.initial=[e.initial,e.default].find(t=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=DGe(this.options.margin),this.setMaxListeners(0),PGe(this)}async keypress(e,t={}){this.keypressed=!0;let i=XF.action(e,XF(e,t),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(yu.code.beep)}cursorHide(){this.stdout.write(yu.cursor.hide()),Tn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(yu.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let t=this.state.buffer;this.state.buffer="",!(!t&&!e||this.options.show===!1)&&this.stdout.write(yu.cursor.down(e)+yu.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:t,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=yu.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:t,prompt:i}=this.state;i=$re.unstyle(i);let n=$re.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` +`),c=l[0],u=l[l.length-1],f=(i+(t?" "+t:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof t.initial=="function"&&(this.initial=await t.initial.call(this,this)),typeof t.onRun=="function"&&await t.onRun.call(this,this),typeof t.onSubmit=="function"){let n=t.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,t)=>{if(this.once("submit",e),this.once("cancel",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,t,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=t&&t[e]!=null?t[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,t,i);return!g&&t&&t[e]?this.resolve(c,s,t,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,t=this.timers&&this.timers.prefix,i=this.state;return i.timer=t,Tn.isObject(e)&&(e=e[i.status]||e.pending),Tn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Tn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,t=this.timers&&this.timers.separator,i=this.state;i.timer=t;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return Tn.isObject(s)&&(s=s[i.status]||s.pending),Tn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,t){let i=await this.element("pointer",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===t,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=Tn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,t){let i=await this.element("indicator",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return Tn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Tn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...t){return Tn.resolve(this,e,...t)}get base(){return M0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Tn.height(this.stdout,25)}get width(){return this.options.columns||Tn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,i=[t,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function PGe(r){let e=n=>r[n]===void 0||typeof r[n]=="function",t=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(r.options)){if(t.includes(n)||/^on[A-Z]/.test(n))continue;let s=r.options[n];typeof s=="function"&&e(n)?i.includes(n)||(r[n]=s.bind(r)):typeof r[n]!="function"&&(r[n]=s)}}function DGe(r){typeof r=="number"&&(r=[r,r,r,r]);let e=[].concat(r||[]),t=n=>n%2==0?` +`:" ",i=[];for(let n=0;n<4;n++){let s=t(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}Zre.exports=M0});var rie=w((Qft,eie)=>{"use strict";var RGe=Xi(),tie={default(r,e){return e},checkbox(r,e){throw new Error("checkbox role is not implemented yet")},editable(r,e){throw new Error("editable role is not implemented yet")},expandable(r,e){throw new Error("expandable role is not implemented yet")},heading(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||"",e},input(r,e){throw new Error("input role is not implemented yet")},option(r,e){return tie.default(r,e)},radio(r,e){throw new Error("radio role is not implemented yet")},separator(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||r.symbols.line.repeat(5),e},spacer(r,e){return e}};eie.exports=(r,e={})=>{let t=RGe.merge({},tie,e.roles);return t[r]||t.default}});var qC=w((Sft,iie)=>{"use strict";var FGe=Eo(),NGe=_f(),LGe=rie(),K0=Xi(),{reorder:ZF,scrollUp:TGe,scrollDown:OGe,isObject:nie,swap:MGe}=K0,sie=class extends NGe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");nie(t)&&(t=Object.keys(t)),Array.isArray(t)?(i!=null&&(this.index=this.findIndex(i)),t.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(t=i),typeof t=="string"&&(t=this.findIndex(t)),typeof t=="number"&&t>-1&&(this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,t,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=LGe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=t,e.cursor=0,K0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,FGe.unstyle(e.message).length));let o=N({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,t)),e}async onChoice(e,t){this.emit("choice",e,t,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,i){let n=await this.toChoice(e,t,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,t,i){let n=N({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,t,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){return typeof t!="boolean"&&(t=e.enabled),t&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=t&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedt.enabled);return this.choices.forEach(t=>t.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(t=>!!t.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof t!="boolean"&&(t=!e.enabled),e.enabled=t,e.choices&&e.choices.forEach(n=>this.toggle(n,t));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return oie(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=ZF(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=t(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=ZF(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=ZF(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>t&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===t-1?this.alert():e>t&&i===t-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=TGe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=OGe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){MGe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(t=>this.isEnabled(t));if(e.choices){let t=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&t.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(t=>this.isChoice(e,t)):this.isChoice(e,this.initial)}map(e=[],t="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,t),i),{})}filter(e,t){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return t?o.map(a=>a[t]):o}find(e,t){if(nie(e))return t?e[t]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return t?s[t]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:t,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&t!==!1&&i!==!0&&(s=K0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)this.state._choices.some(i=>i.name===t.name)||this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t=="string"||typeof t=="number"){let i=this.find(t);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return oie(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:i}=this,n=e.limit||this._limit||t.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function oie(r,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(K0.isAsyncFn(e))return e;e=e.call(r,r)}for(let t of e){if(Array.isArray(t.choices)){let i=t.choices.filter(n=>!r.isDisabled(n));t.enabled=i.every(n=>n.enabled===!0)}r.isDisabled(t)===!0&&delete t.enabled}return e}iie.exports=sie});var Nl=w((vft,aie)=>{"use strict";var KGe=qC(),$F=Xi(),Aie=class extends KGe{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):""}indicator(e,t){return this.multiple?super.indicator(e,t):""}choiceMessage(e,t){let i=this.resolve(e.message,this.state,e,t);return e.role==="heading"&&!$F.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,t)}choiceSeparator(){return":"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await this.indicator(e,t)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,t);o&&!$F.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,t),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?($F.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),t=await Promise.all(e);t.length||t.push(this.styles.danger("No matching choices"));let i=this.margin[0]+t.join(` +`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` +`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(t),this.write([n,i,u,g].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};aie.exports=Aie});var uie=w((xft,lie)=>{"use strict";var UGe=Nl(),HGe=(r,e)=>{let t=r.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(t),o=e(i.slice(s,s+t.length));return s>=0?i.slice(0,s)+o+i.slice(s+t.length):i}},cie=class extends UGe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:i}=this.state;return this.input=i.slice(0,t)+e+i.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;return t?(this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:t}=this.state;return t[e]===void 0?this.alert():(this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,t);let i=e.toLowerCase();return t.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,t=HGe(this.input,e),i=this.choices;this.choices=i.map(n=>te(N({},n),{message:t(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};lie.exports=cie});var tN=w((kft,gie)=>{"use strict";var eN=Xi();gie.exports=(r,e={})=>{r.cursorHide();let{input:t="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||r.styles.placeholder,l=eN.inverse(r.styles.primary),c=m=>l(r.styles.black(m)),u=t,g=" ",f=c(g);if(r.blink&&r.blink.off===!0&&(c=m=>m,f=""),s&&n===0&&i===""&&t==="")return c(g);if(s&&n===0&&(t===i||t===""))return c(i[0])+a(i.slice(1));i=eN.isPrimitive(i)?`${i}`:"",t=eN.isPrimitive(t)?`${t}`:"";let h=i&&i.startsWith(t)&&i!==t,p=h?c(i[t.length]):f;if(n!==t.length&&s===!0&&(u=t.slice(0,n)+c(t[n])+t.slice(n+1),p=""),s===!1&&(p=""),h){let m=r.styles.unstyle(u+p);return u+p+a(i.slice(m.length))}return u+p}});var U0=w((Pft,fie)=>{"use strict";var jGe=Eo(),GGe=Nl(),YGe=tN(),hie=class extends GGe{constructor(e){super(te(N({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(t=>t!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(t=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:i,input:n}=t;return t.value=t.input=n.slice(0,i)+e+n.slice(i),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:i}=e;return e.value=e.input=i.slice(0,t-1)+i.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:i}=e;if(i[t]===void 0)return this.alert();let n=`${i}`.slice(0,t)+`${i}`.slice(t+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:i}=e;return t&&t.startsWith(i)&&i!==t?(e.value=e.input=t,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,t){let i=await this.resolve(e.separator,this.state,e,t)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,t){await this.onChoice(e,t);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,m=this.index===t,y=e.validate||(()=>!0),b=await this.choiceSeparator(e,t),v=e.message;this.align==="right"&&(v=v.padStart(this.longest+1," ")),this.align==="left"&&(v=v.padEnd(this.longest+1," "));let x=this.values[a]=c||o,T=c?"success":"dark";await y.call(e,x,this.state)!==!0&&(T="danger");let Y=n[T](await this.indicator(e,t))+(e.pad||""),$=this.indent(e),_=()=>[$,Y,v+b,c,p].filter(Boolean).join(" ");if(i.submitted)return v=jGe.unstyle(v),c=g(c),p="",_();if(e.format)c=await e.format.call(this,c,e,t);else{let ne=this.styles.muted;c=YGe(this,{input:c,initial:o,pos:s,showCursor:m,color:ne})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,x,e,t)),m&&(v=f(v)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),_()}async submit(){return this.value=this.values,super.base.submit.call(this)}};fie.exports=hie});var rN=w((Dft,pie)=>{"use strict";var qGe=U0(),JGe=()=>{throw new Error("expected prompt to have a custom authenticate method")},die=(r=JGe)=>{class e extends qGe{constructor(i){super(i)}async submit(){this.value=await r.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return die(i)}}return e};pie.exports=die()});var Eie=w((Rft,Cie)=>{"use strict";var WGe=rN();function zGe(r,e){return r.username===this.options.username&&r.password===this.options.password}var mie=(r=zGe)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class t extends WGe.create(r){constructor(n){super(te(N({},n),{choices:e}))}static create(n){return mie(n)}}return t};Cie.exports=mie()});var H0=w((Fft,Iie)=>{"use strict";var _Ge=_f(),{isPrimitive:VGe,hasColor:XGe}=Xi(),yie=class extends _Ge{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:t,state:i}=this;return i.submitted?t.success(e):t.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return VGe(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return XGe(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(t),this.write([l,a,f].filter(Boolean).join(` +`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};Iie.exports=yie});var bie=w((Nft,wie)=>{"use strict";var ZGe=H0(),Bie=class extends ZGe{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};wie.exports=Bie});var vie=w((Lft,Qie)=>{"use strict";var $Ge=Nl(),eYe=U0(),Vf=eYe.prototype,Sie=class extends $Ge{constructor(e){super(te(N({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(t=>t!=null),this.emptyError="",this.values={}}dispatch(e,t){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():Vf.dispatch.call(this,e,t)}append(e,t){return Vf.append.call(this,e,t)}delete(e,t){return Vf.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?Vf.next.call(this):super.next()}prev(){return this.focused.editable?Vf.prev.call(this):super.prev()}async indicator(e,t){let i=e.indicator||"",n=e.editable?i:super.indicator(e,t);return await this.resolve(n,this.state,e,t)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,t){return e.indent="",e.editable?Vf.renderChoice.call(this,e,t):super.renderChoice(e,t)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!="function"||t.role==="heading")continue;let i=t.parent?this.value[t.parent.name]:this.value;if(t.editable?i=t.value===t.name?t.initial||"":t.value:this.isDisabled(t)||(i=t.enabled===!0),e=await t.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?t[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(t[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Qie.exports=Sie});var wu=w((Tft,xie)=>{"use strict";var tYe=_f(),rYe=tN(),{isPrimitive:iYe}=Xi(),kie=class extends tYe{constructor(e){super(e);this.initial=iYe(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,t={}){let i=this.state.prevKeypress;return this.state.prevKeypress=t,this.options.multiline===!0&&t.name==="return"&&(!i||i.name!=="return")?this.append(` +`,t):super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:i}=this.state;this.input=`${i}`.slice(0,t)+e+`${i}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),i=this.input.slice(e),n=t.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||t):rYe(this,{input:e,initial:t,pos:this.cursor})}async render(){let e=this.state.size,t=await this.prefix(),i=await this.separator(),n=await this.message(),s=[t,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` +`)),this.restore()}};xie.exports=kie});var Die=w((Oft,Pie)=>{"use strict";var nYe=r=>r.filter((e,t)=>r.lastIndexOf(e)===t),j0=r=>nYe(r).filter(Boolean);Pie.exports=(r,e={},t="")=>{let{past:i=[],present:n=""}=e,s,o;switch(r){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:j0([t,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:j0([...s,t]),present:o};case"save":return{past:j0([...i,t]),present:""};case"remove":return o=j0(i.filter(a=>a!==t)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${r}"`)}}});var iN=w((Mft,Rie)=>{"use strict";var sYe=wu(),Fie=Die(),Nie=class extends sYe{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let i=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=Fie(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=Fie("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Rie.exports=Nie});var Oie=w((Kft,Lie)=>{"use strict";var oYe=wu(),Tie=class extends oYe{format(){return""}};Lie.exports=Tie});var Uie=w((Uft,Mie)=>{"use strict";var aYe=wu(),Kie=class extends aYe{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:t=>t;return this.list.map(e).join(", ")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);return t!==!0?(this.state.error=t,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Mie.exports=Kie});var Gie=w((Hft,Hie)=>{"use strict";var AYe=Nl(),jie=class extends AYe{constructor(e){super(te(N({},e),{multiple:!0}))}};Hie.exports=jie});var nN=w((jft,Yie)=>{"use strict";var lYe=wu(),qie=class extends lYe{constructor(e={}){super(N({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let t=e||this.minor,i=this.toNumber(this.input);return i>this.max+t?this.alert():(this.input=`${i+t}`,this.render())}down(e){let t=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(t));return this.value=this.toNumber(e||0),super.submit()}};Yie.exports=qie});var Wie=w((Gft,Jie)=>{Jie.exports=nN()});var Vie=w((Yft,zie)=>{"use strict";var cYe=wu(),_ie=class extends cYe{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};zie.exports=_ie});var ene=w((qft,Xie)=>{"use strict";var uYe=Eo(),gYe=qC(),Zie=Xi(),$ie=class extends gYe{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` + `;let t=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+t})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` +`)}renderScaleHeading(e){let t=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(t=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-t.join("").length,n=Math.round(i/(t.length-1)),o=t.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,t,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,t,i);let n=e.scaleIndex===t.index;return t.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,t){let i=e.scale.map(s=>this.scaleIndicator(e,s,t)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await e.hint;s&&!Zie.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,t),u=await this.renderScale(e,t),g=this.margin[1]+this.margin[3];this.scaleLength=uYe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=Zie.wordWrap(c,{width:this.widths[0],newline:a}).split(` +`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` +`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),t=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...t.map(n=>n.join(" "))].join(` +`)}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(t),this.write([a,o,c,g,f].filter(Boolean).join(` +`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Xie.exports=$ie});var nne=w((Jft,tne)=>{"use strict";var rne=Eo(),fYe=(r="")=>typeof r=="string"?r.replace(/^['"]|['"]$/g,""):"",ine=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=fYe(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},hYe=async(r={},e={},t=i=>i)=>{let i=new Set,n=r.fields||[],s=r.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uT.name===b.key);b.field=n.find(T=>T.name===b.key),x||(x=new ine(b),a.push(x)),x.lines.push(b.line-1);continue}let m=o[o.length-1];m.type==="text"&&m.line===c?m.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};tne.exports=async r=>{let e=r.options,t=new Set(e.required===!0?[]:e.required||[]),i=N(N({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await hYe(e,i),a=sN("result",r,e),l=sN("format",r,e),c=sN("validate",r,e,!0),u=r.isValue.bind(r);return async(g={},f=!1)=>{let h=0;g.required=t,g.items=s,g.keys=o,g.output="";let p=async(v,x,T,q)=>{let Y=await c(v,x,T,q);return Y===!1?"Invalid field "+T.name:Y};for(let v of n){let x=v.value,T=v.key;if(v.type!=="template"){x&&(g.output+=x);continue}if(v.type==="template"){let q=s.find(ee=>ee.name===T);e.required===!0&&g.required.add(q.name);let Y=[q.input,g.values[q.value],q.value,x].find(u),_=(q.field||{}).message||v.inner;if(f){let ee=await p(g.values[T],g,q,h);if(ee&&typeof ee=="string"||ee===!1){g.invalid.set(T,ee);continue}g.invalid.delete(T);let A=await a(g.values[T],g,q,h);g.output+=rne.unstyle(A);continue}q.placeholder=!1;let ne=x;x=await l(x,g,q,h),Y!==x?(g.values[T]=Y,x=r.styles.typing(Y),g.missing.delete(_)):(g.values[T]=void 0,Y=`<${_}>`,x=r.styles.primary(Y),q.placeholder=!0,g.required.has(T)&&g.missing.add(_)),g.missing.has(_)&&g.validating&&(x=r.styles.warning(Y)),g.invalid.has(T)&&g.validating&&(x=r.styles.danger(Y)),h===g.index&&(ne!==x?x=r.styles.underline(x):x=r.styles.heading(rne.unstyle(x))),h++}x&&(g.output+=x)}let m=g.output.split(` +`).map(v=>" "+v),y=s.length,b=0;for(let v of s)g.invalid.has(v.name)&&v.lines.forEach(x=>{m[x][0]===" "&&(m[x]=g.styles.danger(g.symbols.bullet)+m[x].slice(1))}),r.isValue(g.values[v.name])&&b++;return g.completed=(b/y*100).toFixed(0),g.output=m.join(` +`),g.output}};function sN(r,e,t,i){return(n,s,o,a)=>typeof o.field[r]=="function"?o.field[r].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var ane=w((Wft,sne)=>{"use strict";var pYe=Eo(),dYe=nne(),CYe=_f(),one=class extends CYe{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await dYe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(t=this.styles.danger),t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:i,size:n}=this.state,s=[this.options.newline,` +`].find(v=>v!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=t[e]||"",m=await this.format(p),y=await this.footer();m&&(c+=" "+m),f&&!m&&this.state.completed===0&&(c+=" "+f),this.clear(n);let b=[u,c,h,y,g.trim()];this.write(b.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:t,keys:i,index:n}=this.state,s=t.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} +`;return this.state.error=a,super.submit()}if(t.size)return this.state.error="Required: "+[...t.keys()].join(", "),super.submit();let o=pYe.unstyle(i).split(` +`).map(a=>a.slice(1)).join(` +`);return this.value={values:n,result:o},super.submit()}};sne.exports=one});var cne=w((zft,Ane)=>{"use strict";var mYe="(Use + to sort)",EYe=Nl(),lne=class extends EYe{constructor(e){super(te(N({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,mYe].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,t){let i=await super.renderChoice(e,t),n=this.symbols.identicalTo+" ",s=this.index===t&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${t+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Ane.exports=lne});var fne=w((_ft,une)=>{"use strict";var IYe=qC(),gne=class extends IYe{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];t=t.map(i=>this.styles.muted(i)),this.state.header=t.join(` + `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let i of t)i.scale=yYe(5,this.options),i.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],i=t.selected;return e.scale.forEach(n=>n.selected=!1),t.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=x=>(x?this.styles.success("\u25C9"):"\u25EF")+o,u=t+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,t),h=this.indent(e),p=h+e.scale.map((x,T)=>c(T===e.scaleIdx)).join(a),m=x=>x===e.scaleIdx?g(x):x,y=h+e.scale.map((x,T)=>m(T)).join(l),b=()=>[u,f].filter(Boolean).join(" "),v=()=>[b(),p,y," "].filter(Boolean).join(` +`);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),v()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),t=await Promise.all(e);return t.length||t.push(this.styles.danger("No matching choices")),t.join(` +`)}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(t),this.write([o,a,u,g].filter(Boolean).join(` +`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function yYe(r,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>N({},i));let t=[];for(let i=1;i{hne.exports=iN()});var mne=w((Xft,dne)=>{"use strict";var wYe=H0(),Cne=class extends wYe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([t,c,l].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};dne.exports=Cne});var yne=w((Zft,Ene)=>{"use strict";var BYe=Nl(),Ine=class extends BYe{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Ene.exports=Ine});var Bne=w(oN=>{"use strict";var wne=Xi(),mi=(r,e)=>{wne.defineExport(oN,r,e),wne.defineExport(oN,r.toLowerCase(),e)};mi("AutoComplete",()=>uie());mi("BasicAuth",()=>Eie());mi("Confirm",()=>bie());mi("Editable",()=>vie());mi("Form",()=>U0());mi("Input",()=>iN());mi("Invisible",()=>Oie());mi("List",()=>Uie());mi("MultiSelect",()=>Gie());mi("Numeral",()=>Wie());mi("Password",()=>Vie());mi("Scale",()=>ene());mi("Select",()=>Nl());mi("Snippet",()=>ane());mi("Sort",()=>cne());mi("Survey",()=>fne());mi("Text",()=>pne());mi("Toggle",()=>mne());mi("Quiz",()=>yne())});var Qne=w((eht,bne)=>{bne.exports={ArrayPrompt:qC(),AuthPrompt:rN(),BooleanPrompt:H0(),NumberPrompt:nN(),StringPrompt:wu()}});var WC=w((tht,Sne)=>{"use strict";var vne=require("assert"),aN=require("events"),Ll=Xi(),ha=class extends aN{constructor(e,t){super();this.options=Ll.merge({},e),this.answers=N({},t)}register(e,t){if(Ll.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}vne.equal(typeof t,"function","expected a function");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t=="function"&&(t=await t.call(this)),await this.ask(Ll.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let t=Ll.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=Ll;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];vne(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||_f()}static get prompts(){return Bne()}static get types(){return Qne()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return Ll.mixinEmitter(e,new aN),e}};Ll.mixinEmitter(ha,new aN);var AN=ha.prompts;for(let r of Object.keys(AN)){let e=r.toLowerCase(),t=i=>new AN[r](i).run();ha.prompt[e]=t,ha[e]=t,ha[r]||Reflect.defineProperty(ha,r,{get:()=>AN[r]})}var JC=r=>{Ll.defineExport(ha,r,()=>ha.types[r])};JC("ArrayPrompt");JC("AuthPrompt");JC("BooleanPrompt");JC("NumberPrompt");JC("StringPrompt");Sne.exports=ha});var Une=w((Yht,Kne)=>{function xYe(r,e){for(var t=-1,i=r==null?0:r.length;++t{var kYe=$B(),PYe=Nf();function DYe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s{var RYe=Zf(),FYe=Kf();function NYe(r,e){return r&&RYe(e,FYe(e),r)}jne.exports=NYe});var qne=w((Wht,Yne)=>{function LYe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Yne.exports=LYe});var Wne=w((zht,Jne)=>{var TYe=Rn(),OYe=f0(),MYe=qne(),KYe=Object.prototype,UYe=KYe.hasOwnProperty;function HYe(r){if(!TYe(r))return MYe(r);var e=OYe(r),t=[];for(var i in r)i=="constructor"&&(e||!UYe.call(r,i))||t.push(i);return t}Jne.exports=HYe});var $f=w((_ht,zne)=>{var jYe=$R(),GYe=Wne(),YYe=vC();function qYe(r){return YYe(r)?jYe(r,!0):GYe(r)}zne.exports=qYe});var Vne=w((Vht,_ne)=>{var JYe=Zf(),WYe=$f();function zYe(r,e){return r&&JYe(e,WYe(e),r)}_ne.exports=zYe});var hN=w((em,eh)=>{var _Ye=Ns(),Xne=typeof em=="object"&&em&&!em.nodeType&&em,Zne=Xne&&typeof eh=="object"&&eh&&!eh.nodeType&&eh,VYe=Zne&&Zne.exports===Xne,$ne=VYe?_Ye.Buffer:void 0,ese=$ne?$ne.allocUnsafe:void 0;function XYe(r,e){if(e)return r.slice();var t=r.length,i=ese?ese(t):new r.constructor(t);return r.copy(i),i}eh.exports=XYe});var pN=w((Xht,tse)=>{function ZYe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t{var $Ye=Zf(),eqe=p0();function tqe(r,e){return $Ye(r,eqe(r),e)}rse.exports=tqe});var G0=w(($ht,nse)=>{var rqe=eF(),iqe=rqe(Object.getPrototypeOf,Object);nse.exports=iqe});var dN=w((ept,sse)=>{var nqe=t0(),sqe=G0(),oqe=p0(),aqe=oF(),Aqe=Object.getOwnPropertySymbols,lqe=Aqe?function(r){for(var e=[];r;)nqe(e,oqe(r)),r=sqe(r);return e}:aqe;sse.exports=lqe});var ase=w((tpt,ose)=>{var cqe=Zf(),uqe=dN();function gqe(r,e){return cqe(r,uqe(r),e)}ose.exports=gqe});var lse=w((rpt,Ase)=>{var fqe=sF(),hqe=dN(),pqe=$f();function dqe(r){return fqe(r,pqe,hqe)}Ase.exports=dqe});var use=w((ipt,cse)=>{var Cqe=Object.prototype,mqe=Cqe.hasOwnProperty;function Eqe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]=="string"&&mqe.call(r,"index")&&(t.index=r.index,t.input=r.input),t}cse.exports=Eqe});var Y0=w((npt,gse)=>{var fse=iF();function Iqe(r){var e=new r.constructor(r.byteLength);return new fse(e).set(new fse(r)),e}gse.exports=Iqe});var pse=w((spt,hse)=>{var yqe=Y0();function wqe(r,e){var t=e?yqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}hse.exports=wqe});var Cse=w((opt,dse)=>{var Bqe=/\w*$/;function bqe(r){var e=new r.constructor(r.source,Bqe.exec(r));return e.lastIndex=r.lastIndex,e}dse.exports=bqe});var wse=w((apt,mse)=>{var Ese=Jc(),Ise=Ese?Ese.prototype:void 0,yse=Ise?Ise.valueOf:void 0;function Qqe(r){return yse?Object(yse.call(r)):{}}mse.exports=Qqe});var CN=w((Apt,Bse)=>{var Sqe=Y0();function vqe(r,e){var t=e?Sqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}Bse.exports=vqe});var Qse=w((lpt,bse)=>{var xqe=Y0(),kqe=pse(),Pqe=Cse(),Dqe=wse(),Rqe=CN(),Fqe="[object Boolean]",Nqe="[object Date]",Lqe="[object Map]",Tqe="[object Number]",Oqe="[object RegExp]",Mqe="[object Set]",Kqe="[object String]",Uqe="[object Symbol]",Hqe="[object ArrayBuffer]",jqe="[object DataView]",Gqe="[object Float32Array]",Yqe="[object Float64Array]",qqe="[object Int8Array]",Jqe="[object Int16Array]",Wqe="[object Int32Array]",zqe="[object Uint8Array]",_qe="[object Uint8ClampedArray]",Vqe="[object Uint16Array]",Xqe="[object Uint32Array]";function Zqe(r,e,t){var i=r.constructor;switch(e){case Hqe:return xqe(r);case Fqe:case Nqe:return new i(+r);case jqe:return kqe(r,t);case Gqe:case Yqe:case qqe:case Jqe:case Wqe:case zqe:case _qe:case Vqe:case Xqe:return Rqe(r,t);case Lqe:return new i;case Tqe:case Kqe:return new i(r);case Oqe:return Pqe(r);case Mqe:return new i;case Uqe:return Dqe(r)}}bse.exports=Zqe});var xse=w((cpt,Sse)=>{var $qe=Rn(),vse=Object.create,eJe=function(){function r(){}return function(e){if(!$qe(e))return{};if(vse)return vse(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Sse.exports=eJe});var mN=w((upt,kse)=>{var tJe=xse(),rJe=G0(),iJe=f0();function nJe(r){return typeof r.constructor=="function"&&!iJe(r)?tJe(rJe(r)):{}}kse.exports=nJe});var Dse=w((gpt,Pse)=>{var sJe=kC(),oJe=ta(),aJe="[object Map]";function AJe(r){return oJe(r)&&sJe(r)==aJe}Pse.exports=AJe});var Lse=w((fpt,Rse)=>{var lJe=Dse(),cJe=c0(),Fse=u0(),Nse=Fse&&Fse.isMap,uJe=Nse?cJe(Nse):lJe;Rse.exports=uJe});var Ose=w((hpt,Tse)=>{var gJe=kC(),fJe=ta(),hJe="[object Set]";function pJe(r){return fJe(r)&&gJe(r)==hJe}Tse.exports=pJe});var Hse=w((ppt,Mse)=>{var dJe=Ose(),CJe=c0(),Kse=u0(),Use=Kse&&Kse.isSet,mJe=Use?CJe(Use):dJe;Mse.exports=mJe});var Jse=w((dpt,jse)=>{var EJe=xC(),IJe=Une(),yJe=$B(),wJe=Gne(),BJe=Vne(),bJe=hN(),QJe=pN(),SJe=ise(),vJe=ase(),xJe=aF(),kJe=lse(),PJe=kC(),DJe=use(),RJe=Qse(),FJe=mN(),NJe=Ks(),LJe=bC(),TJe=Lse(),OJe=Rn(),MJe=Hse(),KJe=Kf(),UJe=$f(),HJe=1,jJe=2,GJe=4,Gse="[object Arguments]",YJe="[object Array]",qJe="[object Boolean]",JJe="[object Date]",WJe="[object Error]",Yse="[object Function]",zJe="[object GeneratorFunction]",_Je="[object Map]",VJe="[object Number]",qse="[object Object]",XJe="[object RegExp]",ZJe="[object Set]",$Je="[object String]",e3e="[object Symbol]",t3e="[object WeakMap]",r3e="[object ArrayBuffer]",i3e="[object DataView]",n3e="[object Float32Array]",s3e="[object Float64Array]",o3e="[object Int8Array]",a3e="[object Int16Array]",A3e="[object Int32Array]",l3e="[object Uint8Array]",c3e="[object Uint8ClampedArray]",u3e="[object Uint16Array]",g3e="[object Uint32Array]",dr={};dr[Gse]=dr[YJe]=dr[r3e]=dr[i3e]=dr[qJe]=dr[JJe]=dr[n3e]=dr[s3e]=dr[o3e]=dr[a3e]=dr[A3e]=dr[_Je]=dr[VJe]=dr[qse]=dr[XJe]=dr[ZJe]=dr[$Je]=dr[e3e]=dr[l3e]=dr[c3e]=dr[u3e]=dr[g3e]=!0;dr[WJe]=dr[Yse]=dr[t3e]=!1;function q0(r,e,t,i,n,s){var o,a=e&HJe,l=e&jJe,c=e&GJe;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!OJe(r))return r;var u=NJe(r);if(u){if(o=DJe(r),!a)return QJe(r,o)}else{var g=PJe(r),f=g==Yse||g==zJe;if(LJe(r))return bJe(r,a);if(g==qse||g==Gse||f&&!n){if(o=l||f?{}:FJe(r),!a)return l?vJe(r,BJe(o,r)):SJe(r,wJe(o,r))}else{if(!dr[g])return n?r:{};o=RJe(r,g,a)}}s||(s=new EJe);var h=s.get(r);if(h)return h;s.set(r,o),MJe(r)?r.forEach(function(y){o.add(q0(y,e,t,y,r,s))}):TJe(r)&&r.forEach(function(y,b){o.set(b,q0(y,e,t,b,r,s))});var p=c?l?kJe:xJe:l?UJe:KJe,m=u?void 0:p(r);return IJe(m||r,function(y,b){m&&(b=y,y=r[b]),yJe(o,b,q0(y,e,t,b,r,s))}),o}jse.exports=q0});var EN=w((Cpt,Wse)=>{var f3e=Jse(),h3e=1,p3e=4;function d3e(r){return f3e(r,h3e|p3e)}Wse.exports=d3e});var _se=w((mpt,zse)=>{var C3e=kR();function m3e(r,e,t){return r==null?r:C3e(r,e,t)}zse.exports=m3e});var toe=w((bpt,eoe)=>{function E3e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}eoe.exports=E3e});var ioe=w((Qpt,roe)=>{var I3e=hC(),y3e=VP();function w3e(r,e){return e.length<2?r:I3e(r,y3e(e,0,-1))}roe.exports=w3e});var soe=w((Spt,noe)=>{var B3e=Ff(),b3e=toe(),Q3e=ioe(),S3e=gu();function v3e(r,e){return e=B3e(e,r),r=Q3e(r,e),r==null||delete r[S3e(b3e(e))]}noe.exports=v3e});var aoe=w((vpt,ooe)=>{var x3e=soe();function k3e(r,e){return r==null?!0:x3e(r,e)}ooe.exports=k3e});var doe=w((idt,poe)=>{poe.exports={name:"@yarnpkg/cli",version:"3.2.2",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.2.0-rc.4",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var DN=w((LEt,rae)=>{"use strict";rae.exports=function(e,t){t===!0&&(t=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof t=="number"?n[t]:n}});var RN=w((TEt,iae)=>{"use strict";var V3e=DN();function nae(r){if(Array.isArray(r))return r.indexOf("ssh")!==-1||r.indexOf("rsync")!==-1;if(typeof r!="string")return!1;var e=V3e(r);return r=r.substring(r.indexOf("://")+3),nae(e)?!0:r.indexOf("@"){"use strict";var X3e=DN(),Z3e=RN(),$3e=require("querystring");function eWe(r){r=(r||"").trim();var e={protocols:X3e(r),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:r,query:Object.create(null)},t=r.indexOf("://"),i=-1,n=null,s=null;r.startsWith(".")&&(r.startsWith("./")&&(r=r.substring(2)),e.pathname=r,e.protocol="file");var o=r.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(Z3e(r)?e.protocol="ssh":((o==="/"||o==="~")&&(r=r.substring(2)),e.protocol="file"))),t!==-1&&(r=r.substring(t+3)),s=r.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=$3e.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}sae.exports=eWe});var lae=w((MEt,aae)=>{"use strict";var tWe="text/plain",rWe="us-ascii",Aae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),iWe=(r,{stripHash:e})=>{let t=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(";");s=e?"":s;let a=!1;o[o.length-1]==="base64"&&(o.pop(),a=!0);let l=(o.shift()||"").toLowerCase(),u=[...o.map(g=>{let[f,h=""]=g.split("=").map(p=>p.trim());return f==="charset"&&(h=h.toLowerCase(),h===rWe)?"":`${f}${h?`=${h}`:""}`}).filter(Boolean)];return a&&u.push("base64"),(u.length!==0||l&&l!==tWe)&&u.unshift(l),`data:${u.join(";")},${a?n.trim():n}${s?`#${s}`:""}`},nWe=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),r=r.trim(),/^data:/i.test(r))return iWe(r,e);if(/^view-source:/i.test(r))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash?n.hash="":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,"")),n.pathname&&(n.pathname=n.pathname.replace(/(?0){let o=n.pathname.split("/"),a=o[o.length-1];Aae(a,e.removeDirectoryIndex)&&(o=o.slice(0,o.length-1),n.pathname=o.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)(?:[a-z\-\d]{1,63})\.(?:[a-z.\-\d]{2,63})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])Aae(o,e.removeQueryParameters)&&n.searchParams.delete(o);e.removeQueryParameters===!0&&(n.search=""),e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,""));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname==="/"&&!s.endsWith("/")&&n.hash===""&&(r=r.replace(/\/$/,"")),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&e.removeSingleSlash&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};aae.exports=nWe});var uae=w((KEt,cae)=>{"use strict";var sWe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(r){return typeof r}:function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},oWe=oae(),aWe=lae();function AWe(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof r!="string"||!r.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":sWe(e))!=="object"&&(e={stripHash:!1}),r=aWe(r,e));var t=oWe(r);return t}cae.exports=AWe});var hae=w((UEt,gae)=>{"use strict";var lWe=uae(),fae=RN();function cWe(r){var e=lWe(r);e.token="";var t=e.user.split(":");return t.length===2&&(t[1]==="x-oauth-basic"?e.token=t[0]:t[0]==="x-token-auth"&&(e.token=t[1])),fae(e.protocols)||fae(r)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}gae.exports=cWe});var dae=w((HEt,pae)=>{"use strict";var uWe=hae();function FN(r){if(typeof r!="string")throw new Error("The url must be a string.");var e=uWe(r),t=e.resource.split("."),i=null;switch(e.toString=function(l){return FN.stringify(this,l)},e.source=t.length>2?t.slice(1-t.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=t[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}FN.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join("+"):r.protocol);var t=r.port?":"+r.port:"",i=r.user||"git",n=r.git_suffix?".git":"";switch(e){case"ssh":return t?"ssh://"+i+"@"+r.resource+t+"/"+r.full_name+n:i+"@"+r.resource+":"+r.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+r.resource+t+"/"+r.full_name+n;case"http":case"https":var s=r.token?gWe(r):r.user&&(r.protocols.includes("http")||r.protocols.includes("https"))?r.user+"@":"";return e+"://"+s+r.resource+t+"/"+r.full_name+n;default:return r.href}};function gWe(r){switch(r.source){case"bitbucket.org":return"x-token-auth:"+r.token+"@";default:return r.token+"@"}}pae.exports=FN});var cL=w((Vwt,Mae)=>{var DWe=Nf(),RWe=Pf();function FWe(r,e,t){(t!==void 0&&!RWe(r[e],t)||t===void 0&&!(e in r))&&DWe(r,e,t)}Mae.exports=FWe});var Uae=w((Xwt,Kae)=>{var NWe=vC(),LWe=ta();function TWe(r){return LWe(r)&&NWe(r)}Kae.exports=TWe});var Gae=w((Zwt,Hae)=>{var OWe=Wc(),MWe=G0(),KWe=ta(),UWe="[object Object]",HWe=Function.prototype,jWe=Object.prototype,jae=HWe.toString,GWe=jWe.hasOwnProperty,YWe=jae.call(Object);function qWe(r){if(!KWe(r)||OWe(r)!=UWe)return!1;var e=MWe(r);if(e===null)return!0;var t=GWe.call(e,"constructor")&&e.constructor;return typeof t=="function"&&t instanceof t&&jae.call(t)==YWe}Hae.exports=qWe});var uL=w(($wt,Yae)=>{function JWe(r,e){if(!(e==="constructor"&&typeof r[e]=="function")&&e!="__proto__")return r[e]}Yae.exports=JWe});var Jae=w((eBt,qae)=>{var WWe=Zf(),zWe=$f();function _We(r){return WWe(r,zWe(r))}qae.exports=_We});var Zae=w((tBt,Wae)=>{var zae=cL(),VWe=hN(),XWe=CN(),ZWe=pN(),$We=mN(),_ae=dC(),Vae=Ks(),e4e=Uae(),t4e=bC(),r4e=VB(),i4e=Rn(),n4e=Gae(),s4e=g0(),Xae=uL(),o4e=Jae();function a4e(r,e,t,i,n,s,o){var a=Xae(r,t),l=Xae(e,t),c=o.get(l);if(c){zae(r,t,c);return}var u=s?s(a,l,t+"",r,e,o):void 0,g=u===void 0;if(g){var f=Vae(l),h=!f&&t4e(l),p=!f&&!h&&s4e(l);u=l,f||h||p?Vae(a)?u=a:e4e(a)?u=ZWe(a):h?(g=!1,u=VWe(l,!0)):p?(g=!1,u=XWe(l,!0)):u=[]:n4e(l)||_ae(l)?(u=a,_ae(a)?u=o4e(a):(!i4e(a)||r4e(a))&&(u=$We(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),zae(r,t,u)}Wae.exports=a4e});var tAe=w((rBt,$ae)=>{var A4e=xC(),l4e=cL(),c4e=XR(),u4e=Zae(),g4e=Rn(),f4e=$f(),h4e=uL();function eAe(r,e,t,i,n){r!==e&&c4e(e,function(s,o){if(n||(n=new A4e),g4e(s))u4e(r,e,o,t,eAe,i,n);else{var a=i?i(h4e(r,o),s,o+"",r,e,n):void 0;a===void 0&&(a=s),l4e(r,o,a)}},f4e)}$ae.exports=eAe});var iAe=w((iBt,rAe)=>{var p4e=r0(),d4e=RR(),C4e=FR();function m4e(r,e){return C4e(d4e(r,e,p4e),r+"")}rAe.exports=m4e});var sAe=w((nBt,nAe)=>{var E4e=Pf(),I4e=vC(),y4e=pC(),w4e=Rn();function B4e(r,e,t){if(!w4e(t))return!1;var i=typeof e;return(i=="number"?I4e(t)&&y4e(e,t.length):i=="string"&&e in t)?E4e(t[e],r):!1}nAe.exports=B4e});var aAe=w((sBt,oAe)=>{var b4e=iAe(),Q4e=sAe();function S4e(r){return b4e(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s=="function"?(n--,s):void 0,o&&Q4e(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var v4e=tAe(),x4e=aAe(),k4e=x4e(function(r,e,t){v4e(r,e,t)});AAe.exports=k4e});var QAe=w((u0t,bAe)=>{var QL;bAe.exports=()=>(typeof QL=="undefined"&&(QL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),QL)});var TAe=w((Y0t,LAe)=>{var kL;LAe.exports=()=>(typeof kL=="undefined"&&(kL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),kL)});var YAe=w((TL,OL)=>{(function(r){TL&&typeof TL=="object"&&typeof OL!="undefined"?OL.exports=r():typeof define=="function"&&define.amd?define([],r):typeof window!="undefined"?window.isWindows=r():typeof global!="undefined"?global.isWindows=r():typeof self!="undefined"?self.isWindows=r():this.isWindows=r()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var zAe=w((Vbt,qAe)=>{"use strict";ML.ifExists=C8e;var ah=require("util"),zs=require("path"),JAe=YAe(),m8e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,E8e={createPwshFile:!0,createCmdFile:JAe(),fs:require("fs")},I8e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function WAe(r){let e=N(N({},E8e),r),t=e.fs;return e.fs_={chmod:t.chmod?ah.promisify(t.chmod):async()=>{},mkdir:ah.promisify(t.mkdir),readFile:ah.promisify(t.readFile),stat:ah.promisify(t.stat),unlink:ah.promisify(t.unlink),writeFile:ah.promisify(t.writeFile)},e}async function ML(r,e,t){let i=WAe(t);await i.fs_.stat(r),await y8e(r,e,i)}function C8e(r,e,t){return ML(r,e,t).catch(()=>{})}function w8e(r,e){return e.fs_.unlink(r).catch(()=>{})}async function y8e(r,e,t){let i=await Q8e(r,t);return await B8e(e,t),b8e(r,e,i,t)}function B8e(r,e){return e.fs_.mkdir(zs.dirname(r),{recursive:!0})}function b8e(r,e,t,i){let n=WAe(i),s=[{generator:x8e,extension:""}];return n.createCmdFile&&s.push({generator:v8e,extension:".cmd"}),n.createPwshFile&&s.push({generator:k8e,extension:".ps1"}),Promise.all(s.map(o=>S8e(r,e+o.extension,t,o.generator,n)))}function P8e(r,e){return w8e(r,e)}function R8e(r,e){return D8e(r,e)}async function Q8e(r,e){let n=(await e.fs_.readFile(r,"utf8")).trim().split(/\r*\n/)[0].match(m8e);if(!n){let s=zs.extname(r).toLowerCase();return{program:I8e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function S8e(r,e,t,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[t.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:t.program,args:o}),await P8e(e,n),await n.fs_.writeFile(e,i(r,e,n),"utf8"),R8e(e,n)}function v8e(r,e,t){let n=zs.relative(zs.dirname(e),r).split("/").join("\\"),s=zs.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=t.prog,l=t.args||"",c=KL(t.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=t.progArgs?`${t.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r +`:"";return o?g+=`@IF EXIST ${o} (\r + ${o} ${l} ${n} ${u}%*\r +) ELSE (\r + @SETLOCAL\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${a} ${l} ${n} ${u}%*\r +)\r +`:g+=`@${a} ${l} ${n} ${u}%*\r +`,g}function x8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=t.args||"",l=KL(t.nodePath).posix;n?(s=`"$basedir/${t.prog}"`,i=o):(n=o,a="",i="");let c=t.progArgs?`${t.progArgs.join(" ")} `:"",u=`#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`,g=t.nodePath?`export NODE_PATH="${l}" +`:"";return s?u+=`${g}if [ -x ${s} ]; then + exec ${s} ${a} ${i} ${c}"$@" +else + exec ${n} ${a} ${i} ${c}"$@" +fi +`:u+=`${g}${n} ${a} ${i} ${c}"$@" +exit $? +`,u}function k8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=t.args||"",c=KL(t.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${t.prog}$exe"`,i=a):(s=a,l="",i="");let f=t.progArgs?`${t.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${t.nodePath?`$env_node_path=$env:NODE_PATH +$env:NODE_PATH="${u}" +`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +}`;return t.nodePath&&(h+=` else { + $env:NODE_PATH="${g}" +}`),o?h+=` +$ret=0 +if (Test-Path ${o}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${o} ${l} ${i} ${f}$args + } else { + & ${o} ${l} ${i} ${f}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${s} ${l} ${i} ${f}$args + } else { + & ${s} ${l} ${i} ${f}$args + } + $ret=$LASTEXITCODE +} +${t.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $ret +`:h+=` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${s} ${l} ${i} ${f}$args +} else { + & ${s} ${l} ${i} ${f}$args +} +${t.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $LASTEXITCODE +`,h}function D8e(r,e){return e.fs_.chmod(r,493)}function KL(r){if(!r)return{win32:"",posix:""};let e=typeof r=="string"?r.split(zs.delimiter):Array.from(r),t={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];t.win32=t.win32?`${t.win32};${n}`:n,t.posix=t.posix?`${t.posix}:${s}`:s,t[i]={win32:n,posix:s}}return t}qAe.exports=ML});var eT=w((RSt,hle)=>{hle.exports=require("stream")});var mle=w((FSt,ple)=>{"use strict";function dle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function Z8e(r){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(t){var i={data:t,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(t){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=t+i.data;return n}},{key:"concat",value:function(t){if(this.length===0)return lb.alloc(0);for(var i=lb.allocUnsafe(t>>>0),n=this.head,s=0;n;)nze(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(t,i){var n;return to.length?o.length:t;if(a===o.length?s+=o:s+=o.slice(0,t),t-=a,t===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(t){var i=lb.allocUnsafe(t),n=this.head,s=1;for(n.data.copy(i),t-=n.data.length;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(i,i.length-t,0,a),t-=a,t===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:ize,value:function(t,i){return tT(this,Z8e({},i,{depth:0,customInspect:!1}))}}]),r}()});var iT=w((NSt,Ele)=>{"use strict";function sze(r,e){var t=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(r):r&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(rT,this,r)):process.nextTick(rT,this,r)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(r||null,function(s){!e&&s?t._writableState?t._writableState.errorEmitted?process.nextTick(cb,t):(t._writableState.errorEmitted=!0,process.nextTick(Ile,t,s)):process.nextTick(Ile,t,s):e?(process.nextTick(cb,t),e(s)):process.nextTick(cb,t)}),this)}function Ile(r,e){rT(r,e),cb(r)}function cb(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit("close")}function oze(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function rT(r,e){r.emit("error",e)}function aze(r,e){var t=r._readableState,i=r._writableState;t&&t.autoDestroy||i&&i.autoDestroy?r.destroy(e):r.emit("error",e)}Ele.exports={destroy:sze,undestroy:oze,errorOrDestroy:aze}});var Ul=w((LSt,yle)=>{"use strict";var wle={};function _s(r,e,t){t||(t=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends t{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=t.name,n.prototype.code=r,wle[r]=n}function Ble(r,e){if(Array.isArray(r)){let t=r.length;return r=r.map(i=>String(i)),t>2?`one of ${e} ${r.slice(0,t-1).join(", ")}, or `+r[t-1]:t===2?`one of ${e} ${r[0]} or ${r[1]}`:`of ${e} ${r[0]}`}else return`of ${e} ${String(r)}`}function Aze(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function lze(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function cze(r,e,t){return typeof t!="number"&&(t=0),t+e.length>r.length?!1:r.indexOf(e,t)!==-1}_s("ERR_INVALID_OPT_VALUE",function(r,e){return'The value "'+e+'" is invalid for option "'+r+'"'},TypeError);_s("ERR_INVALID_ARG_TYPE",function(r,e,t){let i;typeof e=="string"&&Aze(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(lze(r," argument"))n=`The ${r} ${i} ${Ble(e,"type")}`;else{let s=cze(r,".")?"property":"argument";n=`The "${r}" ${s} ${i} ${Ble(e,"type")}`}return n+=`. Received type ${typeof t}`,n},TypeError);_s("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");_s("ERR_METHOD_NOT_IMPLEMENTED",function(r){return"The "+r+" method is not implemented"});_s("ERR_STREAM_PREMATURE_CLOSE","Premature close");_s("ERR_STREAM_DESTROYED",function(r){return"Cannot call "+r+" after a stream was destroyed"});_s("ERR_MULTIPLE_CALLBACK","Callback called multiple times");_s("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");_s("ERR_STREAM_WRITE_AFTER_END","write after end");_s("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);_s("ERR_UNKNOWN_ENCODING",function(r){return"Unknown encoding: "+r},TypeError);_s("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");yle.exports.codes=wle});var nT=w((TSt,ble)=>{"use strict";var uze=Ul().codes.ERR_INVALID_OPT_VALUE;function gze(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function fze(r,e,t,i){var n=gze(e,i,t);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?t:"highWaterMark";throw new uze(s,n)}return Math.floor(n)}return r.objectMode?16:16*1024}ble.exports={getHighWaterMark:fze}});var Qle=w((OSt,sT)=>{typeof Object.create=="function"?sT.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:sT.exports=function(e,t){if(t){e.super_=t;var i=function(){};i.prototype=t.prototype,e.prototype=new i,e.prototype.constructor=e}}});var Hl=w((MSt,oT)=>{try{if(aT=require("util"),typeof aT.inherits!="function")throw"";oT.exports=aT.inherits}catch(r){oT.exports=Qle()}var aT});var vle=w((KSt,Sle)=>{Sle.exports=require("util").deprecate});var cT=w((USt,xle)=>{"use strict";xle.exports=Gr;function kle(r){var e=this;this.next=null,this.entry=null,this.finish=function(){hze(e,r)}}var ch;Gr.WritableState=Gm;var pze={deprecate:vle()},Ple=eT(),ub=require("buffer").Buffer,dze=global.Uint8Array||function(){};function Cze(r){return ub.from(r)}function mze(r){return ub.isBuffer(r)||r instanceof dze}var AT=iT(),Eze=nT(),Ize=Eze.getHighWaterMark,jl=Ul().codes,yze=jl.ERR_INVALID_ARG_TYPE,wze=jl.ERR_METHOD_NOT_IMPLEMENTED,Bze=jl.ERR_MULTIPLE_CALLBACK,bze=jl.ERR_STREAM_CANNOT_PIPE,Qze=jl.ERR_STREAM_DESTROYED,Sze=jl.ERR_STREAM_NULL_VALUES,vze=jl.ERR_STREAM_WRITE_AFTER_END,xze=jl.ERR_UNKNOWN_ENCODING,uh=AT.errorOrDestroy;Hl()(Gr,Ple);function kze(){}function Gm(r,e,t){ch=ch||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof ch),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.writableObjectMode),this.highWaterMark=Ize(this,r,"writableHighWaterMark",t),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=r.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=r.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){Pze(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new kle(this)}Gm.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t};(function(){try{Object.defineProperty(Gm.prototype,"buffer",{get:pze.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(r){}})();var gb;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(gb=Function.prototype[Symbol.hasInstance],Object.defineProperty(Gr,Symbol.hasInstance,{value:function(e){return gb.call(this,e)?!0:this!==Gr?!1:e&&e._writableState instanceof Gm}})):gb=function(e){return e instanceof this};function Gr(r){ch=ch||ku();var e=this instanceof ch;if(!e&&!gb.call(Gr,this))return new Gr(r);this._writableState=new Gm(r,this,e),this.writable=!0,r&&(typeof r.write=="function"&&(this._write=r.write),typeof r.writev=="function"&&(this._writev=r.writev),typeof r.destroy=="function"&&(this._destroy=r.destroy),typeof r.final=="function"&&(this._final=r.final)),Ple.call(this)}Gr.prototype.pipe=function(){uh(this,new bze)};function Dze(r,e){var t=new vze;uh(r,t),process.nextTick(e,t)}function Rze(r,e,t,i){var n;return t===null?n=new Sze:typeof t!="string"&&!e.objectMode&&(n=new yze("chunk",["string","Buffer"],t)),n?(uh(r,n),process.nextTick(i,n),!1):!0}Gr.prototype.write=function(r,e,t){var i=this._writableState,n=!1,s=!i.objectMode&&mze(r);return s&&!ub.isBuffer(r)&&(r=Cze(r)),typeof e=="function"&&(t=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof t!="function"&&(t=kze),i.ending?Dze(this,t):(s||Rze(this,i,r,t))&&(i.pendingcb++,n=Fze(this,i,s,r,e,t)),n};Gr.prototype.cork=function(){this._writableState.corked++};Gr.prototype.uncork=function(){var r=this._writableState;r.corked&&(r.corked--,!r.writing&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&Dle(this,r))};Gr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new xze(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Gr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Nze(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e=="string"&&(e=ub.from(e,t)),e}Object.defineProperty(Gr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Fze(r,e,t,i,n,s){if(!t){var o=Nze(e,i,n);i!==o&&(t=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var Hze=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};Nle.exports=Ea;var Lle=uT(),gT=cT();Hl()(Ea,Lle);for(fT=Hze(gT.prototype),fb=0;fb{var pb=require("buffer"),vA=pb.Buffer;function Ole(r,e){for(var t in r)e[t]=r[t]}vA.from&&vA.alloc&&vA.allocUnsafe&&vA.allocUnsafeSlow?Tle.exports=pb:(Ole(pb,hT),hT.Buffer=gh);function gh(r,e,t){return vA(r,e,t)}Ole(vA,gh);gh.from=function(r,e,t){if(typeof r=="number")throw new TypeError("Argument must not be a number");return vA(r,e,t)};gh.alloc=function(r,e,t){if(typeof r!="number")throw new TypeError("Argument must be a number");var i=vA(r);return e!==void 0?typeof t=="string"?i.fill(e,t):i.fill(e):i.fill(0),i};gh.allocUnsafe=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return vA(r)};gh.allocUnsafeSlow=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return pb.SlowBuffer(r)}});var CT=w(Kle=>{"use strict";var pT=Mle().Buffer,Ule=pT.isEncoding||function(r){switch(r=""+r,r&&r.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Yze(r){if(!r)return"utf8";for(var e;;)switch(r){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return r;default:if(e)return;r=(""+r).toLowerCase(),e=!0}}function qze(r){var e=Yze(r);if(typeof e!="string"&&(pT.isEncoding===Ule||!Ule(r)))throw new Error("Unknown encoding: "+r);return e||r}Kle.StringDecoder=qm;function qm(r){this.encoding=qze(r);var e;switch(this.encoding){case"utf16le":this.text=Wze,this.end=zze,e=4;break;case"utf8":this.fillLast=Jze,e=4;break;case"base64":this.text=_ze,this.end=Vze,e=3;break;default:this.write=Xze,this.end=Zze;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=pT.allocUnsafe(e)}qm.prototype.write=function(r){if(r.length===0)return"";var e,t;if(this.lastNeed){if(e=this.fillLast(r),e===void 0)return"";t=this.lastNeed,this.lastNeed=0}else t=0;return t>5==6?2:r>>4==14?3:r>>3==30?4:r>>6==2?-1:-2}function t5e(r,e,t){var i=e.length-1;if(i=0?(n>0&&(r.lastNeed=n-1),n):--i=0?(n>0&&(r.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:r.lastNeed=n-3),n):0))}function r5e(r,e,t){if((e[0]&192)!=128)return r.lastNeed=0,"\uFFFD";if(r.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return r.lastNeed=1,"\uFFFD";if(r.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return r.lastNeed=2,"\uFFFD"}}function Jze(r){var e=this.lastTotal-this.lastNeed,t=r5e(this,r,e);if(t!==void 0)return t;if(this.lastNeed<=r.length)return r.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,e,0,r.length),this.lastNeed-=r.length}function e5e(r,e){var t=t5e(this,r,e);if(!this.lastNeed)return r.toString("utf8",e);this.lastTotal=t;var i=r.length-(t-this.lastNeed);return r.copy(this.lastChar,0,i),r.toString("utf8",e,i)}function $ze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+"\uFFFD":e}function Wze(r,e){if((r.length-e)%2==0){var t=r.toString("utf16le",e);if(t){var i=t.charCodeAt(t.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1],t.slice(0,-1)}return t}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=r[r.length-1],r.toString("utf16le",e,r.length-1)}function zze(r){var e=r&&r.length?this.write(r):"";if(this.lastNeed){var t=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,t)}return e}function _ze(r,e){var t=(r.length-e)%3;return t===0?r.toString("base64",e):(this.lastNeed=3-t,this.lastTotal=3,t===1?this.lastChar[0]=r[r.length-1]:(this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1]),r.toString("base64",e,r.length-t))}function Vze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function Xze(r){return r.toString(this.encoding)}function Zze(r){return r&&r.length?this.write(r):""}});var db=w((GSt,Hle)=>{"use strict";var jle=Ul().codes.ERR_STREAM_PREMATURE_CLOSE;function i5e(r){var e=!1;return function(){if(!e){e=!0;for(var t=arguments.length,i=new Array(t),n=0;n{"use strict";var Cb;function Gl(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var o5e=db(),Yl=Symbol("lastResolve"),Pu=Symbol("lastReject"),Jm=Symbol("error"),mb=Symbol("ended"),Du=Symbol("lastPromise"),mT=Symbol("handlePromise"),Ru=Symbol("stream");function ql(r,e){return{value:r,done:e}}function a5e(r){var e=r[Yl];if(e!==null){var t=r[Ru].read();t!==null&&(r[Du]=null,r[Yl]=null,r[Pu]=null,e(ql(t,!1)))}}function A5e(r){process.nextTick(a5e,r)}function l5e(r,e){return function(t,i){r.then(function(){if(e[mb]){t(ql(void 0,!0));return}e[mT](t,i)},i)}}var c5e=Object.getPrototypeOf(function(){}),u5e=Object.setPrototypeOf((Cb={get stream(){return this[Ru]},next:function(){var e=this,t=this[Jm];if(t!==null)return Promise.reject(t);if(this[mb])return Promise.resolve(ql(void 0,!0));if(this[Ru].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[Jm]?a(e[Jm]):o(ql(void 0,!0))})});var i=this[Du],n;if(i)n=new Promise(l5e(i,this));else{var s=this[Ru].read();if(s!==null)return Promise.resolve(ql(s,!1));n=new Promise(this[mT])}return this[Du]=n,n}},Gl(Cb,Symbol.asyncIterator,function(){return this}),Gl(Cb,"return",function(){var e=this;return new Promise(function(t,i){e[Ru].destroy(null,function(n){if(n){i(n);return}t(ql(void 0,!0))})})}),Cb),c5e),g5e=function(e){var t,i=Object.create(u5e,(t={},Gl(t,Ru,{value:e,writable:!0}),Gl(t,Yl,{value:null,writable:!0}),Gl(t,Pu,{value:null,writable:!0}),Gl(t,Jm,{value:null,writable:!0}),Gl(t,mb,{value:e._readableState.endEmitted,writable:!0}),Gl(t,mT,{value:function(s,o){var a=i[Ru].read();a?(i[Du]=null,i[Yl]=null,i[Pu]=null,s(ql(a,!1))):(i[Yl]=s,i[Pu]=o)},writable:!0}),t));return i[Du]=null,o5e(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[Pu];s!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,s(n)),i[Jm]=n;return}var o=i[Yl];o!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,o(ql(void 0,!0))),i[mb]=!0}),e.on("readable",A5e.bind(null,i)),i};Yle.exports=g5e});var _le=w((qSt,Jle)=>{"use strict";function Wle(r,e,t,i,n,s,o){try{var a=r[s](o),l=a.value}catch(c){t(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function f5e(r){return function(){var e=this,t=arguments;return new Promise(function(i,n){var s=r.apply(e,t);function o(l){Wle(s,i,n,o,a,"next",l)}function a(l){Wle(s,i,n,o,a,"throw",l)}o(void 0)})}}function zle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function p5e(r){for(var e=1;e{"use strict";Vle.exports=Ut;var fh;Ut.ReadableState=Xle;var JSt=require("events").EventEmitter,Zle=function(e,t){return e.listeners(t).length},Wm=eT(),Eb=require("buffer").Buffer,m5e=global.Uint8Array||function(){};function E5e(r){return Eb.from(r)}function I5e(r){return Eb.isBuffer(r)||r instanceof m5e}var ET=require("util"),Pt;ET&&ET.debuglog?Pt=ET.debuglog("stream"):Pt=function(){};var y5e=mle(),IT=iT(),w5e=nT(),B5e=w5e.getHighWaterMark,Ib=Ul().codes,b5e=Ib.ERR_INVALID_ARG_TYPE,Q5e=Ib.ERR_STREAM_PUSH_AFTER_EOF,S5e=Ib.ERR_METHOD_NOT_IMPLEMENTED,v5e=Ib.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,hh,yT,wT;Hl()(Ut,Wm);var zm=IT.errorOrDestroy,BT=["error","close","destroy","pause","resume"];function x5e(r,e,t){if(typeof r.prependListener=="function")return r.prependListener(e,t);!r._events||!r._events[e]?r.on(e,t):Array.isArray(r._events[e])?r._events[e].unshift(t):r._events[e]=[t,r._events[e]]}function Xle(r,e,t){fh=fh||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof fh),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.readableObjectMode),this.highWaterMark=B5e(this,r,"readableHighWaterMark",t),this.buffer=new y5e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.destroyed=!1,this.defaultEncoding=r.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,r.encoding&&(hh||(hh=CT().StringDecoder),this.decoder=new hh(r.encoding),this.encoding=r.encoding)}function Ut(r){if(fh=fh||ku(),!(this instanceof Ut))return new Ut(r);var e=this instanceof fh;this._readableState=new Xle(r,this,e),this.readable=!0,r&&(typeof r.read=="function"&&(this._read=r.read),typeof r.destroy=="function"&&(this._destroy=r.destroy)),Wm.call(this)}Object.defineProperty(Ut.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Ut.prototype.destroy=IT.destroy;Ut.prototype._undestroy=IT.undestroy;Ut.prototype._destroy=function(r,e){e(r)};Ut.prototype.push=function(r,e){var t=this._readableState,i;return t.objectMode?i=!0:typeof r=="string"&&(e=e||t.defaultEncoding,e!==t.encoding&&(r=Eb.from(r,e),e=""),i=!0),$le(this,r,e,!1,i)};Ut.prototype.unshift=function(r){return $le(this,r,null,!0,!1)};function $le(r,e,t,i,n){Pt("readableAddChunk",e);var s=r._readableState;if(e===null)s.reading=!1,P5e(r,s);else{var o;if(n||(o=k5e(s,e)),o)zm(r,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==Eb.prototype&&(e=E5e(e)),i)s.endEmitted?zm(r,new v5e):bT(r,s,e,!0);else if(s.ended)zm(r,new Q5e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!t?(e=s.decoder.write(e),s.objectMode||e.length!==0?bT(r,s,e,!1):QT(r,s)):bT(r,s,e,!1)}else i||(s.reading=!1,QT(r,s))}return!s.ended&&(s.length=ece?r=ece:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function tce(r,e){return r<=0||e.length===0&&e.ended?0:e.objectMode?1:r!==r?e.flowing&&e.length?e.buffer.head.data.length:e.length:(r>e.highWaterMark&&(e.highWaterMark=D5e(r)),r<=e.length?r:e.ended?e.length:(e.needReadable=!0,0))}Ut.prototype.read=function(r){Pt("read",r),r=parseInt(r,10);var e=this._readableState,t=r;if(r!==0&&(e.emittedReadable=!1),r===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Pt("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?ST(this):yb(this),null;if(r=tce(r,e),r===0&&e.ended)return e.length===0&&ST(this),null;var i=e.needReadable;Pt("need readable",i),(e.length===0||e.length-r0?n=rce(r,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,r=0):(e.length-=r,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),t!==r&&e.ended&&ST(this)),n!==null&&this.emit("data",n),n};function P5e(r,e){if(Pt("onEofChunk"),!e.ended){if(e.decoder){var t=e.decoder.end();t&&t.length&&(e.buffer.push(t),e.length+=e.objectMode?1:t.length)}e.ended=!0,e.sync?yb(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,ice(r)))}}function yb(r){var e=r._readableState;Pt("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Pt("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(ice,r))}function ice(r){var e=r._readableState;Pt("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(r.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,vT(r)}function QT(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(R5e,r,e))}function R5e(r,e){for(;!e.reading&&!e.ended&&(e.length1&&nce(i.pipes,r)!==-1)&&!c&&(Pt("false write response, pause",i.awaitDrain),i.awaitDrain++),t.pause())}function f(y){Pt("onerror",y),m(),r.removeListener("error",f),Zle(r,"error")===0&&zm(r,y)}x5e(r,"error",f);function h(){r.removeListener("finish",p),m()}r.once("close",h);function p(){Pt("onfinish"),r.removeListener("close",h),m()}r.once("finish",p);function m(){Pt("unpipe"),t.unpipe(r)}return r.emit("pipe",t),i.flowing||(Pt("pipe resume"),t.resume()),r};function F5e(r){return function(){var t=r._readableState;Pt("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Zle(r,"data")&&(t.flowing=!0,vT(r))}}Ut.prototype.unpipe=function(r){var e=this._readableState,t={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return r&&r!==e.pipes?this:(r||(r=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,r&&r.emit("unpipe",this,t),this);if(!r){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):r==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Pt("on readable",i.length,i.reading),i.length?yb(this):i.reading||process.nextTick(N5e,this)),t};Ut.prototype.addListener=Ut.prototype.on;Ut.prototype.removeListener=function(r,e){var t=Wm.prototype.removeListener.call(this,r,e);return r==="readable"&&process.nextTick(sce,this),t};Ut.prototype.removeAllListeners=function(r){var e=Wm.prototype.removeAllListeners.apply(this,arguments);return(r==="readable"||r===void 0)&&process.nextTick(sce,this),e};function sce(r){var e=r._readableState;e.readableListening=r.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:r.listenerCount("data")>0&&r.resume()}function N5e(r){Pt("readable nexttick read 0"),r.read(0)}Ut.prototype.resume=function(){var r=this._readableState;return r.flowing||(Pt("resume"),r.flowing=!r.readableListening,L5e(this,r)),r.paused=!1,this};function L5e(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(T5e,r,e))}function T5e(r,e){Pt("resume",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit("resume"),vT(r),e.flowing&&!e.reading&&r.read(0)}Ut.prototype.pause=function(){return Pt("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(Pt("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function vT(r){var e=r._readableState;for(Pt("flow",e.flowing);e.flowing&&r.read()!==null;);}Ut.prototype.wrap=function(r){var e=this,t=this._readableState,i=!1;r.on("end",function(){if(Pt("wrapped end"),t.decoder&&!t.ended){var o=t.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),r.on("data",function(o){if(Pt("wrapped data"),t.decoder&&(o=t.decoder.write(o)),!(t.objectMode&&o==null)&&!(!t.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,r.pause())}});for(var n in r)this[n]===void 0&&typeof r[n]=="function"&&(this[n]=function(a){return function(){return r[a].apply(r,arguments)}}(n));for(var s=0;s=e.length?(e.decoder?t=e.buffer.join(""):e.buffer.length===1?t=e.buffer.first():t=e.buffer.concat(e.length),e.buffer.clear()):t=e.buffer.consume(r,e.decoder),t}function ST(r){var e=r._readableState;Pt("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(O5e,e,r))}function O5e(r,e){if(Pt("endReadableNT",r.endEmitted,r.length),!r.endEmitted&&r.length===0&&(r.endEmitted=!0,e.readable=!1,e.emit("end"),r.autoDestroy)){var t=e._writableState;(!t||t.autoDestroy&&t.finished)&&e.destroy()}}typeof Symbol=="function"&&(Ut.from=function(r,e){return wT===void 0&&(wT=_le()),wT(Ut,r,e)});function nce(r,e){for(var t=0,i=r.length;t{"use strict";oce.exports=xA;var wb=Ul().codes,M5e=wb.ERR_METHOD_NOT_IMPLEMENTED,K5e=wb.ERR_MULTIPLE_CALLBACK,U5e=wb.ERR_TRANSFORM_ALREADY_TRANSFORMING,H5e=wb.ERR_TRANSFORM_WITH_LENGTH_0,Bb=ku();Hl()(xA,Bb);function j5e(r,e){var t=this._transformState;t.transforming=!1;var i=t.writecb;if(i===null)return this.emit("error",new K5e);t.writechunk=null,t.writecb=null,e!=null&&this.push(e),i(r);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";Ace.exports=_m;var lce=xT();Hl()(_m,lce);function _m(r){if(!(this instanceof _m))return new _m(r);lce.call(this,r)}_m.prototype._transform=function(r,e,t){t(null,r)}});var pce=w((VSt,uce)=>{"use strict";var kT;function Y5e(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var gce=Ul().codes,q5e=gce.ERR_MISSING_ARGS,J5e=gce.ERR_STREAM_DESTROYED;function fce(r){if(r)throw r}function W5e(r){return r.setHeader&&typeof r.abort=="function"}function z5e(r,e,t,i){i=Y5e(i);var n=!1;r.on("close",function(){n=!0}),kT===void 0&&(kT=db()),kT(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,W5e(r))return r.abort();if(typeof r.destroy=="function")return r.destroy();i(o||new J5e("pipe"))}}}function hce(r){r()}function _5e(r,e){return r.pipe(e)}function V5e(r){return!r.length||typeof r[r.length-1]!="function"?fce:r.pop()}function X5e(){for(var r=arguments.length,e=new Array(r),t=0;t0;return z5e(o,l,c,function(u){n||(n=u),u&&s.forEach(hce),!l&&(s.forEach(hce),i(n))})});return e.reduce(_5e)}uce.exports=X5e});var ph=w((Vs,Vm)=>{var Xm=require("stream");process.env.READABLE_STREAM==="disable"&&Xm?(Vm.exports=Xm.Readable,Object.assign(Vm.exports,Xm),Vm.exports.Stream=Xm):(Vs=Vm.exports=uT(),Vs.Stream=Xm||Vs,Vs.Readable=Vs,Vs.Writable=cT(),Vs.Duplex=ku(),Vs.Transform=xT(),Vs.PassThrough=cce(),Vs.finished=db(),Vs.pipeline=pce())});var mce=w((XSt,dce)=>{"use strict";var{Buffer:So}=require("buffer"),Cce=Symbol.for("BufferList");function mr(r){if(!(this instanceof mr))return new mr(r);mr._init.call(this,r)}mr._init=function(e){Object.defineProperty(this,Cce,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};mr.prototype._new=function(e){return new mr(e)};mr.prototype._offset=function(e){if(e===0)return[0,0];let t=0;for(let i=0;ithis.length||e<0)return;let t=this._offset(e);return this._bufs[t[0]][t[1]]};mr.prototype.slice=function(e,t){return typeof e=="number"&&e<0&&(e+=this.length),typeof t=="number"&&t<0&&(t+=this.length),this.copy(null,0,e,t)};mr.prototype.copy=function(e,t,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||So.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&t||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:So.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};mr.prototype.shallowSlice=function(e,t){if(e=e||0,t=typeof t!="number"?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return this._new();let i=this._offset(e),n=this._offset(t),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};mr.prototype.toString=function(e,t,i){return this.slice(t,i).toString(e)};mr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};mr.prototype.duplicate=function(){let e=this._new();for(let t=0;tthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=r.length){let l=o.indexOf(r,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-r.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,r))return l;s++}s=0}return-1};mr.prototype._match=function(r,e){if(this.length-r{"use strict";var PT=ph().Duplex,Z5e=Hl(),Zm=mce();function Zi(r){if(!(this instanceof Zi))return new Zi(r);if(typeof r=="function"){this._callback=r;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),r=null}Zm._init.call(this,r),PT.call(this)}Z5e(Zi,PT);Object.assign(Zi.prototype,Zm.prototype);Zi.prototype._new=function(e){return new Zi(e)};Zi.prototype._write=function(e,t,i){this._appendBuffer(e),typeof i=="function"&&i()};Zi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Zi.prototype.end=function(e){PT.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Zi.prototype._destroy=function(e,t){this._bufs.length=0,this.length=0,t(e)};Zi.prototype._isBufferList=function(e){return e instanceof Zi||e instanceof Zm||Zi.isBufferList(e)};Zi.isBufferList=Zm.isBufferList;bb.exports=Zi;bb.exports.BufferListStream=Zi;bb.exports.BufferList=Zm});var FT=w(dh=>{var $5e=Buffer.alloc,e9e="0000000000000000000",t9e="7777777777777777777",Ice="0".charCodeAt(0),yce=Buffer.from("ustar\0","binary"),r9e=Buffer.from("00","binary"),i9e=Buffer.from("ustar ","binary"),n9e=Buffer.from(" \0","binary"),s9e=parseInt("7777",8),$m=257,DT=263,o9e=function(r,e,t){return typeof r!="number"?t:(r=~~r,r>=e?e:r>=0||(r+=e,r>=0)?r:0)},a9e=function(r){switch(r){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},A9e=function(r){switch(r){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},wce=function(r,e,t,i){for(;te?t9e.slice(0,e)+" ":e9e.slice(0,e-r.length)+r+" "};function l9e(r){var e;if(r[0]===128)e=!0;else if(r[0]===255)e=!1;else return null;for(var t=[],i=r.length-1;i>0;i--){var n=r[i];e?t.push(n):t.push(255-n)}var s=0,o=t.length;for(i=0;i=Math.pow(10,t)&&t++,e+t+r};dh.decodeLongPath=function(r,e){return Ch(r,0,r.length,e)};dh.encodePax=function(r){var e="";r.name&&(e+=RT(" path="+r.name+` +`)),r.linkname&&(e+=RT(" linkpath="+r.linkname+` +`));var t=r.pax;if(t)for(var i in t)e+=RT(" "+i+"="+t[i]+` +`);return Buffer.from(e)};dh.decodePax=function(r){for(var e={};r.length;){for(var t=0;t100;){var n=t.indexOf("/");if(n===-1)return null;i+=i?"/"+t.slice(0,n):t.slice(0,n),t=t.slice(n+1)}return Buffer.byteLength(t)>100||Buffer.byteLength(i)>155||r.linkname&&Buffer.byteLength(r.linkname)>100?null:(e.write(t),e.write(Jl(r.mode&s9e,6),100),e.write(Jl(r.uid,6),108),e.write(Jl(r.gid,6),116),e.write(Jl(r.size,11),124),e.write(Jl(r.mtime.getTime()/1e3|0,11),136),e[156]=Ice+A9e(r.type),r.linkname&&e.write(r.linkname,157),yce.copy(e,$m),r9e.copy(e,DT),r.uname&&e.write(r.uname,265),r.gname&&e.write(r.gname,297),e.write(Jl(r.devmajor||0,6),329),e.write(Jl(r.devminor||0,6),337),i&&e.write(i,345),e.write(Jl(Bce(e),6),148),e)};dh.decode=function(r,e,t){var i=r[156]===0?0:r[156]-Ice,n=Ch(r,0,100,e),s=Wl(r,100,8),o=Wl(r,108,8),a=Wl(r,116,8),l=Wl(r,124,12),c=Wl(r,136,12),u=a9e(i),g=r[157]===0?null:Ch(r,157,100,e),f=Ch(r,265,32),h=Ch(r,297,32),p=Wl(r,329,8),m=Wl(r,337,8),y=Bce(r);if(y===8*32)return null;if(y!==Wl(r,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(yce.compare(r,$m,$m+6)===0)r[345]&&(n=Ch(r,345,155,e)+"/"+n);else if(!(i9e.compare(r,$m,$m+6)===0&&n9e.compare(r,DT,DT+2)===0)){if(!t)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:m}}});var Pce=w((evt,bce)=>{var Qce=require("util"),c9e=Ece(),eE=FT(),Sce=ph().Writable,vce=ph().PassThrough,xce=function(){},kce=function(r){return r&=511,r&&512-r},u9e=function(r,e){var t=new Qb(r,e);return t.end(),t},g9e=function(r,e){return e.path&&(r.name=e.path),e.linkpath&&(r.linkname=e.linkpath),e.size&&(r.size=parseInt(e.size,10)),r.pax=e,r},Qb=function(r,e){this._parent=r,this.offset=e,vce.call(this,{autoDestroy:!1})};Qce.inherits(Qb,vce);Qb.prototype.destroy=function(r){this._parent.destroy(r)};var kA=function(r){if(!(this instanceof kA))return new kA(r);Sce.call(this,r),r=r||{},this._offset=0,this._buffer=c9e(),this._missing=0,this._partial=!1,this._onparse=xce,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,t=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=kce(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(kce(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=eE.decodePax(t.slice(0,f)),t.consume(f),s()},l=function(){var f=e._header.size;e._pax=eE.decodePax(t.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),t.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=eE.decode(t.slice(0,512),r.filenameEncoding,r.allowUnknownFormat)}catch(p){e.emit("error",p)}if(t.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=g9e(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,u9e(e,f),n);return}e._stream=new Qb(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};Qce.inherits(kA,Sce);kA.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.emit("close"))};kA.prototype._parse=function(r,e){this._destroyed||(this._offset+=r,this._missing=r,e===this._onheader&&(this._partial=!1),this._onparse=e)};kA.prototype._continue=function(){if(!this._destroyed){var r=this._cb;this._cb=xce,this._overflow?this._write(this._overflow,void 0,r):r()}};kA.prototype._write=function(r,e,t){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(r.length&&(this._partial=!0),r.lengths&&(o=r.slice(s),r=r.slice(0,s)),i?i.end(r):n.append(r),this._overflow=o,this._onparse()}};kA.prototype._final=function(r){if(this._partial)return this.destroy(new Error("Unexpected end of data"));r()};bce.exports=kA});var Rce=w((tvt,Dce)=>{Dce.exports=require("fs").constants||require("constants")});var Oce=w((rvt,Fce)=>{var mh=Rce(),Nce=Mk(),Sb=Hl(),f9e=Buffer.alloc,Lce=ph().Readable,Eh=ph().Writable,h9e=require("string_decoder").StringDecoder,vb=FT(),p9e=parseInt("755",8),d9e=parseInt("644",8),Tce=f9e(1024),NT=function(){},LT=function(r,e){e&=511,e&&r.push(Tce.slice(0,512-e))};function C9e(r){switch(r&mh.S_IFMT){case mh.S_IFBLK:return"block-device";case mh.S_IFCHR:return"character-device";case mh.S_IFDIR:return"directory";case mh.S_IFIFO:return"fifo";case mh.S_IFLNK:return"symlink"}return"file"}var xb=function(r){Eh.call(this),this.written=0,this._to=r,this._destroyed=!1};Sb(xb,Eh);xb.prototype._write=function(r,e,t){if(this.written+=r.length,this._to.push(r))return t();this._to._drain=t};xb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var kb=function(){Eh.call(this),this.linkname="",this._decoder=new h9e("utf-8"),this._destroyed=!1};Sb(kb,Eh);kb.prototype._write=function(r,e,t){this.linkname+=this._decoder.write(r),t()};kb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var tE=function(){Eh.call(this),this._destroyed=!1};Sb(tE,Eh);tE.prototype._write=function(r,e,t){t(new Error("No body allowed for this entry"))};tE.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Ia=function(r){if(!(this instanceof Ia))return new Ia(r);Lce.call(this,r),this._drain=NT,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Sb(Ia,Lce);Ia.prototype.entry=function(r,e,t){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(t=e,e=null),t||(t=NT);var i=this;if((!r.size||r.type==="symlink")&&(r.size=0),r.type||(r.type=C9e(r.mode)),r.mode||(r.mode=r.type==="directory"?p9e:d9e),r.uid||(r.uid=0),r.gid||(r.gid=0),r.mtime||(r.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){r.size=e.length,this._encode(r);var n=this.push(e);return LT(i,r.size),n?process.nextTick(t):this._drain=t,new tE}if(r.type==="symlink"&&!r.linkname){var s=new kb;return Nce(s,function(a){if(a)return i.destroy(),t(a);r.linkname=s.linkname,i._encode(r),t()}),s}if(this._encode(r),r.type!=="file"&&r.type!=="contiguous-file")return process.nextTick(t),new tE;var o=new xb(this);return this._stream=o,Nce(o,function(a){if(i._stream=null,a)return i.destroy(),t(a);if(o.written!==r.size)return i.destroy(),t(new Error("size mismatch"));LT(i,r.size),i._finalizing&&i.finalize(),t()}),o}};Ia.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(Tce),this.push(null))};Ia.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Ia.prototype._encode=function(r){if(!r.pax){var e=vb.encode(r);if(e){this.push(e);return}}this._encodePax(r)};Ia.prototype._encodePax=function(r){var e=vb.encodePax({name:r.name,linkname:r.linkname,pax:r.pax}),t={name:"PaxHeader",mode:r.mode,uid:r.uid,gid:r.gid,size:e.length,mtime:r.mtime,type:"pax-header",linkname:r.linkname&&"PaxHeader",uname:r.uname,gname:r.gname,devmajor:r.devmajor,devminor:r.devminor};this.push(vb.encode(t)),this.push(e),LT(this,e.length),t.size=r.size,t.type=r.type,this.push(vb.encode(t))};Ia.prototype._read=function(r){var e=this._drain;this._drain=NT,e()};Fce.exports=Ia});var Mce=w(TT=>{TT.extract=Pce();TT.pack=Oce()});var Xce=w((Qvt,Wce)=>{"use strict";var Ih=class{constructor(e,t,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=t||{},this.__providers=_ce(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return jT(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,t=this){for(let[i,n]of this.entries())e.call(t,n,i,this)}toJSON(){let e={};return this.forEach((t,i)=>{e[i]=t}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let t=e||this.__opts.other;if(t){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(t):P9e(n);for(let[o,a]of s)t(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Ih(this.__specs,this.__opts,_ce(this.__providers).concat(e)),zce)}};try{let r=require("util");Ih.prototype[r.inspect.custom]=function(e,t){return this[Symbol.toStringTag]+" "+r.inspect(this.toJSON(),t)}}catch(r){}function D9e(r){throw Object.assign(new Error(`invalid config key requested: ${r}`),{code:"EBADKEY"})}function jT(r,e,t){let i=r.__specs[e];if(t&&!i&&(!r.__opts.other||!r.__opts.other(e)))D9e(e);else{i||(i={});let n;for(let s of r.__providers){if(n=Vce(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=Vce(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(r):i.default:n}}function Vce(r,e){let t;return e.__isFiggyPudding?t=jT(e,r,!1):typeof e.get=="function"?t=e.get(r):t=e[r],t}var zce={has(r,e){return e in r.__specs&&jT(r,e,!1)!==void 0},ownKeys(r){return Object.keys(r.__specs)},get(r,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Ih.prototype?r[e]:r.get(e)},set(r,e,t){if(typeof e=="symbol"||e.slice(0,2)==="__")return r[e]=t,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};Wce.exports=R9e;function R9e(r,e){function t(...i){return new Proxy(new Ih(r,e,i),zce)}return t}function _ce(r){let e=[];return r.forEach(t=>e.unshift(t)),e}function P9e(r){return Object.keys(r).map(e=>[e,r[e]])}});var eue=w((Svt,ya)=>{"use strict";var iE=require("crypto"),F9e=Xce(),N9e=require("stream").Transform,Zce=["sha256","sha384","sha512"],L9e=/^[a-z0-9+/]+(?:=?=?)$/i,T9e=/^([^-]+)-([^?]+)([?\S*]*)$/,O9e=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,M9e=/^[\x21-\x7E]+$/,Cn=F9e({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>K9e},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),Fu=class{get isHash(){return!0}constructor(e,t){t=Cn(t);let i=!!t.strict;this.source=e.trim();let n=this.source.match(i?O9e:T9e);if(!n||i&&!Zce.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=Cn(e),e.strict&&!(Zce.some(i=>i===this.algorithm)&&this.digest.match(L9e)&&(this.options||[]).every(i=>i.match(M9e))))return"";let t=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${t}`}},yh=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=Cn(e);let t=e.sep||" ";return e.strict&&(t=t.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>Fu.prototype.toString.call(n,e)).filter(n=>n.length).join(t)).filter(i=>i.length).join(t)}concat(e,t){t=Cn(t);let i=typeof e=="string"?e:nE(e,t);return wa(`${this.toString(t)} ${i}`,t)}hexDigest(){return wa(this,{single:!0}).hexDigest()}match(e,t){t=Cn(t);let i=wa(e,t),n=i.pickAlgorithm(t);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=Cn(e);let t=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>t(n,s)||n)}};ya.exports.parse=wa;function wa(r,e){if(e=Cn(e),typeof r=="string")return GT(r,e);if(r.algorithm&&r.digest){let t=new yh;return t[r.algorithm]=[r],GT(nE(t,e),e)}else return GT(nE(r,e),e)}function GT(r,e){return e.single?new Fu(r,e):r.trim().split(/\s+/).reduce((t,i)=>{let n=new Fu(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;t[s]||(t[s]=[]),t[s].push(n)}return t},new yh)}ya.exports.stringify=nE;function nE(r,e){return e=Cn(e),r.algorithm&&r.digest?Fu.prototype.toString.call(r,e):typeof r=="string"?nE(wa(r,e),e):yh.prototype.toString.call(r,e)}ya.exports.fromHex=U9e;function U9e(r,e,t){t=Cn(t);let i=t.options&&t.options.length?`?${t.options.join("?")}`:"";return wa(`${e}-${Buffer.from(r,"hex").toString("base64")}${i}`,t)}ya.exports.fromData=H9e;function H9e(r,e){e=Cn(e);let t=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return t.reduce((n,s)=>{let o=iE.createHash(s).update(r).digest("base64"),a=new Fu(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new yh)}ya.exports.fromStream=j9e;function j9e(r,e){e=Cn(e);let t=e.Promise||Promise,i=YT(e);return new t((n,s)=>{r.pipe(i),r.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}ya.exports.checkData=G9e;function G9e(r,e,t){if(t=Cn(t),e=wa(e,t),!Object.keys(e).length){if(t.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(t),n=iE.createHash(i).update(r).digest("base64"),s=wa({algorithm:i,digest:n}),o=s.match(e,t);if(o||!t.error)return o;if(typeof t.size=="number"&&r.length!==t.size){let a=new Error(`data size mismatch when checking ${e}. + Wanted: ${t.size} + Found: ${r.length}`);throw a.code="EBADSIZE",a.found=r.length,a.expected=t.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${r.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}ya.exports.checkStream=Y9e;function Y9e(r,e,t){t=Cn(t);let i=t.Promise||Promise,n=YT(t.concat({integrity:e}));return new i((s,o)=>{r.pipe(n),r.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}ya.exports.integrityStream=YT;function YT(r){r=Cn(r);let e=r.integrity&&wa(r.integrity,r),t=e&&Object.keys(e).length,i=t&&e.pickAlgorithm(r),n=t&&e[i],s=Array.from(new Set(r.algorithms.concat(i?[i]:[]))),o=s.map(iE.createHash),a=0,l=new N9e({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=r.options&&r.options.length?`?${r.options.join("?")}`:"",u=wa(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),r),g=t&&u.match(e,r);if(typeof r.size=="number"&&a!==r.size){let f=new Error(`stream size mismatch when checking ${e}. + Wanted: ${r.size} + Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=r.size,f.sri=e,l.emit("error",f)}else if(r.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}ya.exports.create=q9e;function q9e(r){r=Cn(r);let e=r.algorithms,t=r.options.length?`?${r.options.join("?")}`:"",i=e.map(iE.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new Fu(`${a}-${l}${t}`,r);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new yh)}}}var J9e=new Set(iE.getHashes()),$ce=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(r=>J9e.has(r));function K9e(r,e){return $ce.indexOf(r.toLowerCase())>=$ce.indexOf(e.toLowerCase())?r:e}});var EC={};ft(EC,{BuildType:()=>cs,Cache:()=>Nt,Configuration:()=>ye,DEFAULT_LOCK_FILENAME:()=>fk,DEFAULT_RC_FILENAME:()=>gk,FormatType:()=>Ri,InstallMode:()=>Ci,LightReport:()=>pA,LinkType:()=>Qt,Manifest:()=>At,MessageName:()=>X,MultiFetcher:()=>yd,PackageExtensionStatus:()=>qi,PackageExtensionType:()=>wi,Project:()=>ze,ProjectLookup:()=>ul,Report:()=>Ji,ReportError:()=>ct,SettingsType:()=>Ie,StreamReport:()=>Je,TAG_REGEXP:()=>zg,TelemetryManager:()=>mC,ThrowReport:()=>di,VirtualFetcher:()=>Bd,Workspace:()=>CC,WorkspaceFetcher:()=>bd,WorkspaceResolver:()=>oi,YarnVersion:()=>Ur,execUtils:()=>Nr,folderUtils:()=>sk,formatUtils:()=>ae,hashUtils:()=>Dn,httpUtils:()=>ir,miscUtils:()=>Se,nodeUtils:()=>Vg,parseMessageName:()=>II,scriptUtils:()=>Zt,semverUtils:()=>Wt,stringifyMessageName:()=>_A,structUtils:()=>P,tgzUtils:()=>Bi,treeUtils:()=>ls});var Nr={};ft(Nr,{EndStrategy:()=>ss,ExecError:()=>Ik,PipeError:()=>ww,execvp:()=>pve,pipevp:()=>ra});var Zh={};ft(Zh,{AliasFS:()=>Na,CwdFS:()=>_t,DEFAULT_COMPRESSION_LEVEL:()=>lc,FakeFS:()=>YA,Filename:()=>kt,JailFS:()=>La,LazyFS:()=>_h,LinkStrategy:()=>Gh,NoFS:()=>jE,NodeFS:()=>ar,PortablePath:()=>Me,PosixFS:()=>Vh,ProxiedFS:()=>Qi,VirtualFS:()=>Wr,ZipFS:()=>li,ZipOpenFS:()=>Is,constants:()=>Rr,extendFs:()=>WE,normalizeLineEndings:()=>sc,npath:()=>H,opendir:()=>KE,patchFs:()=>pQ,ppath:()=>k,statUtils:()=>rQ,toFilename:()=>Jr,xfs:()=>K});var Rr={};ft(Rr,{SAFE_TIME:()=>tQ,S_IFDIR:()=>Da,S_IFLNK:()=>Fa,S_IFMT:()=>_n,S_IFREG:()=>Ra});var _n=61440,Da=16384,Ra=32768,Fa=40960,tQ=456789e3;var rQ={};ft(rQ,{BigIntStatsEntry:()=>Uh,DEFAULT_MODE:()=>Kh,DirEntry:()=>KO,StatEntry:()=>jA,areStatsEqual:()=>nQ,clearStats:()=>RE,convertToBigIntStats:()=>FE,makeDefaultStats:()=>Hh,makeEmptyStats:()=>fge});var iQ=ge(require("util"));var Kh=Ra|420,KO=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},jA=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Kh;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},Uh=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Kh);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(_n))===BigInt(Da)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(_n))===BigInt(Ra)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(_n))===BigInt(Fa)}};function Hh(){return new jA}function fge(){return RE(Hh())}function RE(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(r,e)){let t=r[e];typeof t=="number"?r[e]=0:typeof t=="bigint"?r[e]=BigInt(0):iQ.types.isDate(t)&&(r[e]=new Date(0))}return r}function FE(r){let e=new Uh;for(let t in r)if(Object.prototype.hasOwnProperty.call(r,t)){let i=r[t];typeof i=="number"?e[t]=BigInt(i):iQ.types.isDate(i)&&(e[t]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function nQ(r,e){if(r.atimeMs!==e.atimeMs||r.birthtimeMs!==e.birthtimeMs||r.blksize!==e.blksize||r.blocks!==e.blocks||r.ctimeMs!==e.ctimeMs||r.dev!==e.dev||r.gid!==e.gid||r.ino!==e.ino||r.isBlockDevice()!==e.isBlockDevice()||r.isCharacterDevice()!==e.isCharacterDevice()||r.isDirectory()!==e.isDirectory()||r.isFIFO()!==e.isFIFO()||r.isFile()!==e.isFile()||r.isSocket()!==e.isSocket()||r.isSymbolicLink()!==e.isSymbolicLink()||r.mode!==e.mode||r.mtimeMs!==e.mtimeMs||r.nlink!==e.nlink||r.rdev!==e.rdev||r.size!==e.size||r.uid!==e.uid)return!1;let t=r,i=e;return!(t.atimeNs!==i.atimeNs||t.mtimeNs!==i.mtimeNs||t.ctimeNs!==i.ctimeNs||t.birthtimeNs!==i.birthtimeNs)}var LE=ge(require("fs"));var jh=ge(require("path")),UO;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(UO||(UO={}));var Me={root:"/",dot:"."},kt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},H=Object.create(jh.default),k=Object.create(jh.default.posix);H.cwd=()=>process.cwd();k.cwd=()=>sQ(process.cwd());k.resolve=(...r)=>r.length>0&&k.isAbsolute(r[0])?jh.default.posix.resolve(...r):jh.default.posix.resolve(k.cwd(),...r);var HO=function(r,e,t){return e=r.normalize(e),t=r.normalize(t),e===t?".":(e.endsWith(r.sep)||(e=e+r.sep),t.startsWith(e)?t.slice(e.length):null)};H.fromPortablePath=jO;H.toPortablePath=sQ;H.contains=(r,e)=>HO(H,r,e);k.contains=(r,e)=>HO(k,r,e);var hge=/^([a-zA-Z]:.*)$/,pge=/^\/\/(\.\/)?(.*)$/,dge=/^\/([a-zA-Z]:.*)$/,Cge=/^\/unc\/(\.dot\/)?(.*)$/;function jO(r){if(process.platform!=="win32")return r;let e,t;if(e=r.match(dge))r=e[1];else if(t=r.match(Cge))r=`\\\\${t[1]?".\\":""}${t[2]}`;else return r;return r.replace(/\//g,"\\")}function sQ(r){if(process.platform!=="win32")return r;r=r.replace(/\\/g,"/");let e,t;return(e=r.match(hge))?r=`/${e[1]}`:(t=r.match(pge))&&(r=`/unc/${t[1]?".dot/":""}${t[2]}`),r}function NE(r,e){return r===H?jO(e):sQ(e)}function Jr(r){if(H.parse(r).dir!==""||k.parse(r).dir!=="")throw new Error(`Invalid filename: "${r}"`);return r}var TE=new Date(tQ*1e3),Gh;(function(t){t.Allow="allow",t.ReadOnly="readOnly"})(Gh||(Gh={}));async function GO(r,e,t,i,n){let s=r.pathUtils.normalize(e),o=t.pathUtils.normalize(i),a=[],l=[],{atime:c,mtime:u}=n.stableTime?{atime:TE,mtime:TE}:await t.lstatPromise(o);await r.mkdirpPromise(r.pathUtils.dirname(e),{utimes:[c,u]});let g=typeof r.lutimesPromise=="function"?r.lutimesPromise.bind(r):r.utimesPromise.bind(r);await oQ(a,l,g,r,s,t,o,te(N({},n),{didParentExist:!0}));for(let f of a)await f();await Promise.all(l.map(f=>f()))}async function oQ(r,e,t,i,n,s,o,a){var h,p;let l=a.didParentExist?await mge(i,n):null,c=await s.lstatPromise(o),{atime:u,mtime:g}=a.stableTime?{atime:TE,mtime:TE}:c,f;switch(!0){case c.isDirectory():f=await Ege(r,e,t,i,n,l,s,o,c,a);break;case c.isFile():f=await Ige(r,e,t,i,n,l,s,o,c,a);break;case c.isSymbolicLink():f=await yge(r,e,t,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(f||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==g.getTime()||((p=l==null?void 0:l.atime)==null?void 0:p.getTime())!==u.getTime())&&(e.push(()=>t(n,u,g)),f=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),f=!0),f}async function mge(r,e){try{return await r.lstatPromise(e)}catch(t){return null}}async function Ege(r,e,t,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(r.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!=="EEXIST")throw h}}),u=!0);let g=await o.readdirPromise(a),f=c.didParentExist&&!s?te(N({},c),{didParentExist:!1}):c;if(c.stableSort)for(let h of g.sort())await oQ(r,e,t,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),f)&&(u=!0);else(await Promise.all(g.map(async p=>{await oQ(r,e,t,i,i.pathUtils.join(n,p),o,o.pathUtils.join(a,p),f)}))).some(p=>p)&&(u=!0);return u}var aQ=new WeakMap;function AQ(r,e,t,i,n){return async()=>{await r.linkPromise(t,e),n===Gh.ReadOnly&&(i.mode&=~146,await r.chmodPromise(e,i.mode))}}function wge(r,e,t,i,n){let s=aQ.get(r);return typeof s=="undefined"?async()=>{try{await r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE),aQ.set(r,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")aQ.set(r,!1),await AQ(r,e,t,i,n)();else throw o}}:s?async()=>r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE):AQ(r,e,t,i,n)}async function Ige(r,e,t,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?wge(i,n,a,l,u):async()=>i.copyFilePromise(a,n,LE.default.constants.COPYFILE_FICLONE):u!==null?AQ(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return r.push(async()=>g()),!0}async function yge(r,e,t,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;return r.push(async()=>{await i.symlinkPromise(NE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function Es(r,e){return Object.assign(new Error(`${r}: ${e}`),{code:r})}function OE(r){return Es("EBUSY",r)}function Yh(r,e){return Es("ENOSYS",`${r}, ${e}`)}function GA(r){return Es("EINVAL",`invalid argument, ${r}`)}function Ai(r){return Es("EBADF",`bad file descriptor, ${r}`)}function io(r){return Es("ENOENT",`no such file or directory, ${r}`)}function Ro(r){return Es("ENOTDIR",`not a directory, ${r}`)}function qh(r){return Es("EISDIR",`illegal operation on a directory, ${r}`)}function ME(r){return Es("EEXIST",`file already exists, ${r}`)}function In(r){return Es("EROFS",`read-only filesystem, ${r}`)}function YO(r){return Es("ENOTEMPTY",`directory not empty, ${r}`)}function qO(r){return Es("EOPNOTSUPP",`operation not supported, ${r}`)}function JO(){return Es("ERR_DIR_CLOSED","Directory handle was closed")}var lQ=class extends Error{constructor(e,t){super(e);this.name="Libzip Error",this.code=t}};var WO=class{constructor(e,t,i={}){this.path=e;this.nextDirent=t;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw JO()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let t=this.readSync();return typeof e!="undefined"?e(null,t):Promise.resolve(t)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,t;this.throwIfClosed(),(t=(e=this.opts).onClose)==null||t.call(e),this.closed=!0}};function KE(r,e,t,i){let n=()=>{let s=t.shift();return typeof s=="undefined"?null:Object.assign(r.statSync(r.pathUtils.join(e,s)),{name:s})};return new WO(e,n,i)}var zO=ge(require("os"));var YA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:t=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(t)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:t=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(t){let s=await this.readdirPromise(e);await Promise.all(s.map(o=>this.removePromise(this.pathUtils.resolve(e,o))))}for(let s=0;s<=i;s++)try{await this.rmdirPromise(e);break}catch(o){if(o.code!=="EBUSY"&&o.code!=="ENOTEMPTY")throw o;ssetTimeout(a,s*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:t=!0}={}){let i;try{i=this.lstatSync(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(i.isDirectory()){if(t)for(let n of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,n));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{await this.mkdirPromise(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&await this.chmodPromise(a,t),i!=null)await this.utimesPromise(a,i[0],i[1]);else{let l=await this.statPromise(this.pathUtils.dirname(a));await this.utimesPromise(a,l.atime,l.mtime)}}}return s}mkdirpSync(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{this.mkdirSync(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&this.chmodSync(a,t),i!=null)this.utimesSync(a,i[0],i[1]);else{let l=this.statSync(this.pathUtils.dirname(a));this.utimesSync(a,l.atime,l.mtime)}}}return s}async copyPromise(e,t,{baseFs:i=this,overwrite:n=!0,stableSort:s=!1,stableTime:o=!1,linkStrategy:a=null}={}){return await GO(this,e,i,t,{overwrite:n,stableSort:s,stableTime:o,linkStrategy:a})}copySync(e,t,{baseFs:i=this,overwrite:n=!0}={}){let s=i.lstatSync(t),o=this.existsSync(e);if(s.isDirectory()){this.mkdirpSync(e);let l=i.readdirSync(t);for(let c of l)this.copySync(this.pathUtils.join(e,c),i.pathUtils.join(t,c),{baseFs:i,overwrite:n})}else if(s.isFile()){if(!o||n){o&&this.removeSync(e);let l=i.readFileSync(t);this.writeFileSync(e,l)}}else if(s.isSymbolicLink()){if(!o||n){o&&this.removeSync(e);let l=i.readlinkSync(t);this.symlinkSync(NE(this.pathUtils,l),e)}}else throw new Error(`Unsupported file type (file: ${t}, mode: 0o${s.mode.toString(8).padStart(6,"0")})`);let a=s.mode&511;this.chmodSync(e,a)}async changeFilePromise(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferPromise(e,t,i):this.changeFileTextPromise(e,t,i)}async changeFileBufferPromise(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=await this.readFilePromise(e)}catch(s){}Buffer.compare(n,t)!==0&&await this.writeFilePromise(e,t,{mode:i})}async changeFileTextPromise(e,t,{automaticNewlines:i,mode:n}={}){let s="";try{s=await this.readFilePromise(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&await this.writeFilePromise(e,o,{mode:n})}changeFileSync(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferSync(e,t,i):this.changeFileTextSync(e,t,i)}changeFileBufferSync(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=this.readFileSync(e)}catch(s){}Buffer.compare(n,t)!==0&&this.writeFileSync(e,t,{mode:i})}changeFileTextSync(e,t,{automaticNewlines:i=!1,mode:n}={}){let s="";try{s=this.readFileSync(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&this.writeFileSync(e,o,{mode:n})}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(i){if(i.code==="EXDEV")await this.copyPromise(t,e),await this.removePromise(e);else throw i}}moveSync(e,t){try{this.renameSync(e,t)}catch(i){if(i.code==="EXDEV")this.copySync(t,e),this.removeSync(e);else throw i}}async lockPromise(e,t){let i=`${e}.flock`,n=1e3/60,s=Date.now(),o=null,a=async()=>{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let t=await this.readFilePromise(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let t=this.readFileSync(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,`${JSON.stringify(t,null,2)} +`)}writeJsonSync(e,t){return this.writeFileSync(e,`${JSON.stringify(t,null,2)} +`)}async preserveTimePromise(e,t){let i=await this.lstatPromise(e),n=await t();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,t){let i=this.lstatSync(e),n=t();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},oc=class extends YA{constructor(){super(k)}};function Bge(r){let e=r.match(/\r?\n/g);if(e===null)return zO.EOL;let t=e.filter(n=>n===`\r +`).length,i=e.length-t;return t>i?`\r +`:` +`}function sc(r,e){return e.replace(/\r?\n/g,Bge(r))}var zu=ge(require("fs")),cQ=ge(require("stream")),ZO=ge(require("util")),uQ=ge(require("zlib"));var _O=ge(require("fs"));var ar=class extends oc{constructor(e=_O.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Me.root}resolve(e){return k.resolve(e)}async openPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.open(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}openSync(e,t,i){return this.realFs.openSync(H.fromPortablePath(e),t,i)}async opendirPromise(e,t){return await new Promise((i,n)=>{typeof t!="undefined"?this.realFs.opendir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.opendir(H.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,t){let i=typeof t!="undefined"?this.realFs.opendirSync(H.fromPortablePath(e),t):this.realFs.opendirSync(H.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,t,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,t,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,t,i,n,s){return this.realFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return await new Promise((o,a)=>typeof t=="string"?this.realFs.write(e,t,i,this.makeCallback(o,a)):this.realFs.write(e,t,i,n,s,this.makeCallback(o,a)))}writeSync(e,t,i,n,s){return typeof t=="string"?this.realFs.writeSync(e,t,i):this.realFs.writeSync(e,t,i,n,s)}async closePromise(e){await new Promise((t,i)=>{this.realFs.close(e,this.makeCallback(t,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createReadStream(i,t)}createWriteStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createWriteStream(i,t)}async realpathPromise(e){return await new Promise((t,i)=>{this.realFs.realpath(H.fromPortablePath(e),{},this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}realpathSync(e){return H.toPortablePath(this.realFs.realpathSync(H.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(t=>{this.realFs.exists(H.fromPortablePath(e),t)})}accessSync(e,t){return this.realFs.accessSync(H.fromPortablePath(e),t)}async accessPromise(e,t){return await new Promise((i,n)=>{this.realFs.access(H.fromPortablePath(e),t,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(H.fromPortablePath(e))}async statPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.stat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.stat(H.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,t){return t?this.realFs.statSync(H.fromPortablePath(e),t):this.realFs.statSync(H.fromPortablePath(e))}async fstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.fstat(e,t,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,t){return t?this.realFs.fstatSync(e,t):this.realFs.fstatSync(e)}async lstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.lstat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.lstat(H.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,t){return t?this.realFs.lstatSync(H.fromPortablePath(e),t):this.realFs.lstatSync(H.fromPortablePath(e))}async fchmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.fchmod(e,t,this.makeCallback(i,n))})}fchmodSync(e,t){return this.realFs.fchmodSync(e,t)}async chmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.chmod(H.fromPortablePath(e),t,this.makeCallback(i,n))})}chmodSync(e,t){return this.realFs.chmodSync(H.fromPortablePath(e),t)}async chownPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.chown(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}chownSync(e,t,i){return this.realFs.chownSync(H.fromPortablePath(e),t,i)}async renamePromise(e,t){return await new Promise((i,n)=>{this.realFs.rename(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}renameSync(e,t){return this.realFs.renameSync(H.fromPortablePath(e),H.fromPortablePath(t))}async copyFilePromise(e,t,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(H.fromPortablePath(e),H.fromPortablePath(t),i,this.makeCallback(n,s))})}copyFileSync(e,t,i=0){return this.realFs.copyFileSync(H.fromPortablePath(e),H.fromPortablePath(t),i)}async appendFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFile(o,t,i,this.makeCallback(n,s)):this.realFs.appendFile(o,t,this.makeCallback(n,s))})}appendFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,t,i):this.realFs.appendFileSync(n,t)}async writeFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFile(o,t,i,this.makeCallback(n,s)):this.realFs.writeFile(o,t,this.makeCallback(n,s))})}writeFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,t,i):this.realFs.writeFileSync(n,t)}async unlinkPromise(e){return await new Promise((t,i)=>{this.realFs.unlink(H.fromPortablePath(e),this.makeCallback(t,i))})}unlinkSync(e){return this.realFs.unlinkSync(H.fromPortablePath(e))}async utimesPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.utimes(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}utimesSync(e,t,i){this.realFs.utimesSync(H.fromPortablePath(e),t,i)}async lutimesPromiseImpl(e,t,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,H.fromPortablePath(e),t,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,t,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,H.fromPortablePath(e),t,i)}async mkdirPromise(e,t){return await new Promise((i,n)=>{this.realFs.mkdir(H.fromPortablePath(e),t,this.makeCallback(i,n))})}mkdirSync(e,t){return this.realFs.mkdirSync(H.fromPortablePath(e),t)}async rmdirPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.rmdir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.rmdir(H.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,t){return this.realFs.rmdirSync(H.fromPortablePath(e),t)}async linkPromise(e,t){return await new Promise((i,n)=>{this.realFs.link(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}linkSync(e,t){return this.realFs.linkSync(H.fromPortablePath(e),H.fromPortablePath(t))}async symlinkPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.symlink(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i,this.makeCallback(n,s))})}symlinkSync(e,t,i){return this.realFs.symlinkSync(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i)}async readFilePromise(e,t){return await new Promise((i,n)=>{let s=typeof e=="string"?H.fromPortablePath(e):e;this.realFs.readFile(s,t,this.makeCallback(i,n))})}readFileSync(e,t){let i=typeof e=="string"?H.fromPortablePath(e):e;return this.realFs.readFileSync(i,t)}async readdirPromise(e,t){return await new Promise((i,n)=>{(t==null?void 0:t.withFileTypes)?this.realFs.readdir(H.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(H.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,t){return(t==null?void 0:t.withFileTypes)?this.realFs.readdirSync(H.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(H.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((t,i)=>{this.realFs.readlink(H.fromPortablePath(e),this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}readlinkSync(e){return H.toPortablePath(this.realFs.readlinkSync(H.fromPortablePath(e)))}async truncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.truncate(H.fromPortablePath(e),t,this.makeCallback(i,n))})}truncateSync(e,t){return this.realFs.truncateSync(H.fromPortablePath(e),t)}async ftruncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.ftruncate(e,t,this.makeCallback(i,n))})}ftruncateSync(e,t){return this.realFs.ftruncateSync(e,t)}watch(e,t,i){return this.realFs.watch(H.fromPortablePath(e),t,i)}watchFile(e,t,i){return this.realFs.watchFile(H.fromPortablePath(e),t,i)}unwatchFile(e,t){return this.realFs.unwatchFile(H.fromPortablePath(e),t)}makeCallback(e,t){return(i,n)=>{i?t(i):e(n)}}};var VO=ge(require("events"));var ac;(function(t){t.Change="change",t.Stop="stop"})(ac||(ac={}));var Ac;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(Ac||(Ac={}));function XO(r,e){if(r!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${r}'`)}var Jh=class extends VO.EventEmitter{constructor(e,t,{bigint:i=!1}={}){super();this.status=Ac.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=t,this.bigint=i,this.lastStats=this.stat()}static create(e,t,i){let n=new Jh(e,t,i);return n.start(),n}start(){XO(this.status,Ac.Ready),this.status=Ac.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(ac.Change,this.lastStats,this.lastStats)},3)}stop(){XO(this.status,Ac.Running),this.status=Ac.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(ac.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let t=this.bigint?new Uh:new jA;return RE(t)}}makeInterval(e){let t=setInterval(()=>{let i=this.stat(),n=this.lastStats;nQ(i,n)||(this.lastStats=i,this.emit(ac.Change,i,n))},e.interval);return e.persistent?t:t.unref()}registerChangeListener(e,t){this.addListener(ac.Change,e),this.changeListeners.set(e,this.makeInterval(t))}unregisterChangeListener(e){this.removeListener(ac.Change,e);let t=this.changeListeners.get(e);typeof t!="undefined"&&clearInterval(t),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var UE=new WeakMap;function HE(r,e,t,i){let n,s,o,a;switch(typeof t){case"function":n=!1,s=!0,o=5007,a=t;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=t),a=i;break}let l=UE.get(r);typeof l=="undefined"&&UE.set(r,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=Jh.create(r,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function Wh(r,e,t){let i=UE.get(r);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof t=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(t),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function zh(r){let e=UE.get(r);if(typeof e!="undefined")for(let t of e.keys())Wh(r,t)}var lc="mixed";function bge(r){if(typeof r=="string"&&String(+r)===r)return+r;if(Number.isFinite(r))return r<0?Date.now()/1e3:r;if(ZO.types.isDate(r))return r.getTime()/1e3;throw new Error("Invalid time")}function $O(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var li=class extends oc{constructor(e,t){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=t.libzip;let i=t;if(this.level=typeof i.level!="undefined"?i.level:lc,e!=null||(e=$O()),typeof e=="string"){let{baseFs:o=new ar}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(t.stats)this.stats=t.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Hh();else throw o}else this.stats=Hh();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),t.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(H.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Me.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(t,t+e);return Buffer.from(n)}finally{this.libzip.free(t)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw OE("archive closed, close");zh(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===Kh?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,$O(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return k.resolve(Me.root,e)}async openPromise(e,t,i){return this.openSync(e,t,i)}openSync(e,t,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,t){return this.opendirSync(e,t)}opendirSync(e,t={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return KE(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,t,i,n,s){return this.readSync(e,t,i,n,s)}readSync(e,t,i=0,n=t.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw Ai("read");let a=s===-1||s===null?o.cursor:s,l=this.readFileSync(o.p);l.copy(t,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,t,i,n,s){return typeof t=="string"?this.writeSync(e,t,s):this.writeSync(e,t,i,n,s)}writeSync(e,t,i,n,s){throw typeof this.fds.get(e)=="undefined"?Ai("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw Ai("read");this.fds.delete(e)}createReadStream(e,{encoding:t}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new cQ.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,t);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:t}={}){if(this.readOnly)throw In(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new cQ.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),t),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let t=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`lstat '${e}'`);return t}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw OE(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=k.resolve(Me.root,e);return this.entries.has(i)||this.listings.has(i)}let t;try{t=this.resolveFilename(`stat '${e}'`,e,void 0,!1)}catch(i){return!1}return t===void 0?!1:this.entries.has(t)||this.listings.has(t)}async accessPromise(e,t){return this.accessSync(e,t)}accessSync(e,t=zu.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`access '${e}'`);if(this.readOnly&&t&zu.constants.W_OK)throw In(`access '${e}'`)}async statPromise(e,t={bigint:!1}){return t.bigint?this.statSync(e,{bigint:!0}):this.statSync(e)}statSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`stat '${e}'`,e,void 0,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`stat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,t)}}async fstatPromise(e,t){return this.fstatSync(e,t)}fstatSync(e,t){let i=this.fds.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw io(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw Ro(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,t)}async lstatPromise(e,t={bigint:!1}){return t.bigint?this.lstatSync(e,{bigint:!0}):this.lstatSync(e)}lstatSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`lstat '${e}'`,e,!1,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`lstat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,t)}}statImpl(e,t,i={}){let n=this.entries.get(t);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,m=f,y=new Date(h),b=new Date(p),v=new Date(m),x=new Date(f),T=this.listings.has(t)?Da:this.isSymbolicLink(n)?Fa:Ra,q=T===Da?493:420,Y=T|this.getUnixMode(n,q)&511,$=this.libzip.struct.statCrc(s),_=Object.assign(new jA,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:y,birthtime:b,ctime:v,mtime:x,atimeMs:h,birthtimeMs:p,ctimeMs:m,mtimeMs:f,mode:Y,crc:$});return i.bigint===!0?FE(_):_}if(this.listings.has(t)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),m=new Date(g),y=new Date(f),b=new Date(h),v=Da|493,x=0,T=Object.assign(new jA,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:m,ctime:y,mtime:b,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:v,crc:x});return i.bigint===!0?FE(T):T}throw new Error("Unreachable")}getUnixMode(e,t){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?t:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let t=this.listings.get(e);if(t)return t;this.registerListing(k.dirname(e)).add(k.basename(e));let n=new Set;return this.listings.set(e,n),n}registerEntry(e,t){this.registerListing(k.dirname(e)).add(k.basename(e)),this.entries.set(e,t)}unregisterListing(e){this.listings.delete(e);let t=this.listings.get(k.dirname(e));t==null||t.delete(k.basename(e))}unregisterEntry(e){this.unregisterListing(e);let t=this.entries.get(e);this.entries.delete(e),typeof t!="undefined"&&(this.fileSources.delete(t),this.isSymbolicLink(t)&&this.symlinkCount--)}deleteEntry(e,t){if(this.unregisterEntry(e),this.libzip.delete(this.zip,t)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,t,i=!0,n=!0){if(!this.ready)throw OE(`archive closed, ${e}`);let s=k.resolve(Me.root,t);if(s==="/")return Me.root;let o=this.entries.get(s);if(i&&o!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(o)){let a=this.getFileSource(o).toString();return this.resolveFilename(e,k.resolve(k.dirname(s),a),!0,n)}else return s;for(;;){let a=this.resolveFilename(e,k.dirname(s),!0,n);if(a===void 0)return a;let l=this.listings.has(a),c=this.entries.has(a);if(!l&&!c){if(n===!1)return;throw io(e)}if(!l)throw Ro(e);if(s=k.resolve(a,k.basename(s)),!i||this.symlinkCount===0)break;let u=this.libzip.name.locate(this.zip,s.slice(1));if(u===-1)break;if(this.isSymbolicLink(u)){let g=this.getFileSource(u).toString();s=k.resolve(k.dirname(s),g)}else break}return s}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let t=this.libzip.malloc(e.byteLength);if(!t)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,t,e.byteLength).set(e),{buffer:t,byteLength:e.byteLength}}allocateUnattachedSource(e){let t=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,t);if(s===0)throw this.libzip.free(t),this.makeLibzipError(t);return s}allocateSource(e){let{buffer:t,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,t,i,0,!0);if(n===0)throw this.libzip.free(t),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,t){let i=Buffer.isBuffer(t)?t:Buffer.from(t),n=k.relative(Me.root,e),s=this.allocateSource(t);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&_n)===Fa}getFileSource(e,t={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(t.asyncDecompress)return new Promise((h,p)=>{uQ.default.inflateRaw(f,(m,y)=>{m?p(m):(this.fileSources.set(e,y),h(y))})});{let h=uQ.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async fchmodPromise(e,t){return this.chmodPromise(this.fdToPath(e,"fchmod"),t)}fchmodSync(e,t){return this.chmodSync(this.fdToPath(e,"fchmodSync"),t)}async chmodPromise(e,t){return this.chmodSync(e,t)}chmodSync(e,t){if(this.readOnly)throw In(`chmod '${e}'`);t&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Ra|0)&~511|t;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,t,i){return this.chownSync(e,t,i)}chownSync(e,t,i){throw new Error("Unimplemented")}async renamePromise(e,t){return this.renameSync(e,t)}renameSync(e,t){throw new Error("Unimplemented")}async copyFilePromise(e,t,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,t,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,t,i=0){if(this.readOnly)throw In(`copyfile '${e} -> '${t}'`);if((i&zu.constants.COPYFILE_FICLONE_FORCE)!=0)throw Yh("unsupported clone operation",`copyfile '${e}' -> ${t}'`);let n=this.resolveFilename(`copyfile '${e} -> ${t}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw GA(`copyfile '${e}' -> '${t}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${t}'`,t),a=this.entries.get(o);if((i&(zu.constants.COPYFILE_EXCL|zu.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw ME(`copyfile '${e}' -> '${t}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,t,i){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFilePromise(e,t,i)}appendFileSync(e,t,i={}){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFileSync(e,t,i)}fdToPath(e,t){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw Ai(t);return i}async writeFilePromise(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([this.getFileSource(o),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,t){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw In(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw qh(`open '${e}'`);let n=null,s=null;typeof t=="string"?n=t:typeof t=="object"&&({encoding:n=null,mode:s=null}=t);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw In(`unlink '${e}'`);let t=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(t))throw qh(`unlink '${e}'`);let i=this.entries.get(t);if(typeof i=="undefined")throw GA(`unlink '${e}'`);this.deleteEntry(t,i)}async utimesPromise(e,t,i){return this.utimesSync(e,t,i)}utimesSync(e,t,i){if(this.readOnly)throw In(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,t,i){return this.lutimesSync(e,t,i)}lutimesSync(e,t,i){if(this.readOnly)throw In(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,t){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,bge(t),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,t){return this.mkdirSync(e,t)}mkdirSync(e,{mode:t=493,recursive:i=!1}={}){if(i)return this.mkdirpSync(e,{chmod:t});if(this.readOnly)throw In(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw ME(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,t)}async rmdirPromise(e,t){return this.rmdirSync(e,t)}rmdirSync(e,{recursive:t=!1}={}){if(this.readOnly)throw In(`rmdir '${e}'`);if(t){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw Ro(`rmdir '${e}'`);if(n.size>0)throw YO(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw GA(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let t=this.libzip.dir.add(this.zip,k.relative(Me.root,e));if(t===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,t),t}async linkPromise(e,t){return this.linkSync(e,t)}linkSync(e,t){throw qO(`link '${e}' -> '${t}'`)}async symlinkPromise(e,t){return this.symlinkSync(e,t)}symlinkSync(e,t){if(this.readOnly)throw In(`symlink '${e}' -> '${t}'`);let i=this.resolveFilename(`symlink '${e}' -> '${t}'`,t);if(this.listings.has(i))throw qh(`symlink '${e}' -> '${t}'`);if(this.entries.has(i))throw ME(`symlink '${e}' -> '${t}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(Fa|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return t?i.toString(t):i}readFileSync(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=this.readFileBuffer(e);return t?i.toString(t):i}readFileBuffer(e,t={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`open '${e}'`);if(this.listings.has(i))throw qh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,t)}async readdirPromise(e,t){return this.readdirSync(e,t)}readdirSync(e,t){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`scandir '${e}'`);let s=[...n];return(t==null?void 0:t.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",k.join(e,o)),{name:o})):s}async readlinkPromise(e){let t=this.prepareReadlink(e);return(await this.getFileSource(t,{asyncDecompress:!0})).toString()}readlinkSync(e){let t=this.prepareReadlink(e);return this.getFileSource(t).toString()}prepareReadlink(e){let t=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(t))throw Ro(`open '${e}'`);if(this.listings.has(t))throw GA(`readlink '${e}'`);let i=this.entries.get(t);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw GA(`readlink '${e}'`);return i}async truncatePromise(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(t,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(t,0);return s.copy(o),this.writeFileSync(e,o)}async ftruncatePromise(e,t){return this.truncatePromise(this.fdToPath(e,"ftruncate"),t)}ftruncateSync(e,t){return this.truncateSync(this.fdToPath(e,"ftruncateSync"),t)}watch(e,t,i){let n;switch(typeof t){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=t);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,t,i){let n=k.resolve(Me.root,e);return HE(this,n,t,i)}unwatchFile(e,t){let i=k.resolve(Me.root,e);return Wh(this,i,t)}};var Qi=class extends YA{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,t,i){return this.baseFs.openPromise(this.mapToBase(e),t,i)}openSync(e,t,i){return this.baseFs.openSync(this.mapToBase(e),t,i)}async opendirPromise(e,t){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),t),{path:e})}opendirSync(e,t){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),t),{path:e})}async readPromise(e,t,i,n,s){return await this.baseFs.readPromise(e,t,i,n,s)}readSync(e,t,i,n,s){return this.baseFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s)}writeSync(e,t,i,n,s){return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}async accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}async statPromise(e,t){return this.baseFs.statPromise(this.mapToBase(e),t)}statSync(e,t){return this.baseFs.statSync(this.mapToBase(e),t)}async fstatPromise(e,t){return this.baseFs.fstatPromise(e,t)}fstatSync(e,t){return this.baseFs.fstatSync(e,t)}lstatPromise(e,t){return this.baseFs.lstatPromise(this.mapToBase(e),t)}lstatSync(e,t){return this.baseFs.lstatSync(this.mapToBase(e),t)}async fchmodPromise(e,t){return this.baseFs.fchmodPromise(e,t)}fchmodSync(e,t){return this.baseFs.fchmodSync(e,t)}async chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}async chownPromise(e,t,i){return this.baseFs.chownPromise(this.mapToBase(e),t,i)}chownSync(e,t,i){return this.baseFs.chownSync(this.mapToBase(e),t,i)}async renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}async copyFilePromise(e,t,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),i)}copyFileSync(e,t,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),i)}async appendFilePromise(e,t,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,i)}appendFileSync(e,t,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,i)}async writeFilePromise(e,t,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,i)}writeFileSync(e,t,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,t,i){return this.baseFs.utimesPromise(this.mapToBase(e),t,i)}utimesSync(e,t,i){return this.baseFs.utimesSync(this.mapToBase(e),t,i)}async mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}async rmdirPromise(e,t){return this.baseFs.rmdirPromise(this.mapToBase(e),t)}rmdirSync(e,t){return this.baseFs.rmdirSync(this.mapToBase(e),t)}async linkPromise(e,t){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(t))}linkSync(e,t){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(t))}async symlinkPromise(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,t){return t==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),t):this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return t==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),t):this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,t){return this.baseFs.readdirPromise(this.mapToBase(e),t)}readdirSync(e,t){return this.baseFs.readdirSync(this.mapToBase(e),t)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,t){return this.baseFs.truncatePromise(this.mapToBase(e),t)}truncateSync(e,t){return this.baseFs.truncateSync(this.mapToBase(e),t)}async ftruncatePromise(e,t){return this.baseFs.ftruncatePromise(e,t)}ftruncateSync(e,t){return this.baseFs.ftruncateSync(e,t)}watch(e,t,i){return this.baseFs.watch(this.mapToBase(e),t,i)}watchFile(e,t,i){return this.baseFs.watchFile(this.mapToBase(e),t,i)}unwatchFile(e,t){return this.baseFs.unwatchFile(this.mapToBase(e),t)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Na=class extends Qi{constructor(e,{baseFs:t,pathUtils:i}){super(i);this.target=e,this.baseFs=t}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var _t=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.normalize(e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?k.normalize(e):this.baseFs.resolve(k.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var eM=Me.root,La=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.resolve(Me.root,e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Me.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let t=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(eM,e));if(t.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(eM,this.pathUtils.relative(this.target,e))}};var _h=class extends Qi{constructor(e,t){super(t);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var et=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),gQ=class extends YA{constructor(){super(k)}getExtractHint(){throw et()}getRealPath(){throw et()}resolve(){throw et()}async openPromise(){throw et()}openSync(){throw et()}async opendirPromise(){throw et()}opendirSync(){throw et()}async readPromise(){throw et()}readSync(){throw et()}async writePromise(){throw et()}writeSync(){throw et()}async closePromise(){throw et()}closeSync(){throw et()}createWriteStream(){throw et()}createReadStream(){throw et()}async realpathPromise(){throw et()}realpathSync(){throw et()}async readdirPromise(){throw et()}readdirSync(){throw et()}async existsPromise(e){throw et()}existsSync(e){throw et()}async accessPromise(){throw et()}accessSync(){throw et()}async statPromise(){throw et()}statSync(){throw et()}async fstatPromise(e){throw et()}fstatSync(e){throw et()}async lstatPromise(e){throw et()}lstatSync(e){throw et()}async fchmodPromise(){throw et()}fchmodSync(){throw et()}async chmodPromise(){throw et()}chmodSync(){throw et()}async chownPromise(){throw et()}chownSync(){throw et()}async mkdirPromise(){throw et()}mkdirSync(){throw et()}async rmdirPromise(){throw et()}rmdirSync(){throw et()}async linkPromise(){throw et()}linkSync(){throw et()}async symlinkPromise(){throw et()}symlinkSync(){throw et()}async renamePromise(){throw et()}renameSync(){throw et()}async copyFilePromise(){throw et()}copyFileSync(){throw et()}async appendFilePromise(){throw et()}appendFileSync(){throw et()}async writeFilePromise(){throw et()}writeFileSync(){throw et()}async unlinkPromise(){throw et()}unlinkSync(){throw et()}async utimesPromise(){throw et()}utimesSync(){throw et()}async readFilePromise(){throw et()}readFileSync(){throw et()}async readlinkPromise(){throw et()}readlinkSync(){throw et()}async truncatePromise(){throw et()}truncateSync(){throw et()}async ftruncatePromise(e,t){throw et()}ftruncateSync(e,t){throw et()}watch(){throw et()}watchFile(){throw et()}unwatchFile(){throw et()}},jE=gQ;jE.instance=new gQ;var Vh=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return H.fromPortablePath(e)}mapToBase(e){return H.toPortablePath(e)}};var Qge=/^[0-9]+$/,fQ=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,Sge=/^([^/]+-)?[a-f0-9]+$/,Wr=class extends Qi{static makeVirtualPath(e,t,i){if(k.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!k.basename(t).match(Sge))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=k.relative(k.dirname(e),i).split("/"),o=0;for(;o{let t=r.indexOf(e);if(t<=0)return null;let i=t;for(;t>=0&&(i=t+e.length,r[i]!==k.sep);){if(r[t-1]===k.sep)return null;t=r.indexOf(e,i)}return r.length>i&&r[i]!==k.sep?null:r.slice(0,i)},Is=class extends oc{constructor({libzip:e,baseFs:t=new ar,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=t,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,t){let i=new Is(t);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,t){let i=this.nextFd++|Vn;return this.fdMap.set(i,[e,t]),i}async openPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,t,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,t,i)))}openSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,t,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,t,i)))}async opendirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,t),async(i,{subPath:n})=>await i.opendirPromise(n,t),{requireSubpath:!1})}opendirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,t),(i,{subPath:n})=>i.opendirSync(n,t),{requireSubpath:!1})}async readPromise(e,t,i,n,s){if((e&Vn)==0)return await this.baseFs.readPromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("read");let[a,l]=o;return await a.readPromise(l,t,i,n,s)}readSync(e,t,i,n,s){if((e&Vn)==0)return this.baseFs.readSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("readSync");let[a,l]=o;return a.readSync(l,t,i,n,s)}async writePromise(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("write");let[a,l]=o;return typeof t=="string"?await a.writePromise(l,t,i):await a.writePromise(l,t,i,n,s)}writeSync(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("writeSync");let[a,l]=o;return typeof t=="string"?a.writeSync(l,t,i):a.writeSync(l,t,i,n,s)}async closePromise(e){if((e&Vn)==0)return await this.baseFs.closePromise(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("close");this.fdMap.delete(e);let[i,n]=t;return await i.closePromise(n)}closeSync(e){if((e&Vn)==0)return this.baseFs.closeSync(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("closeSync");this.fdMap.delete(e);let[i,n]=t;return i.closeSync(n)}createReadStream(e,t){return e===null?this.baseFs.createReadStream(e,t):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,t),(i,{archivePath:n,subPath:s})=>{let o=i.createReadStream(s,t);return o.path=H.fromPortablePath(this.pathUtils.join(n,s)),o})}createWriteStream(e,t){return e===null?this.baseFs.createWriteStream(e,t):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,t),(i,{subPath:n})=>i.createWriteStream(n,t))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,await t.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,t.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(t,{subPath:i})=>await t.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(t,{subPath:i})=>t.existsSync(i))}async accessPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,t),async(i,{subPath:n})=>await i.accessPromise(n,t))}accessSync(e,t){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,t),(i,{subPath:n})=>i.accessSync(n,t))}async statPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,t),async(i,{subPath:n})=>await i.statPromise(n,t))}statSync(e,t){return this.makeCallSync(e,()=>this.baseFs.statSync(e,t),(i,{subPath:n})=>i.statSync(n,t))}async fstatPromise(e,t){if((e&Vn)==0)return this.baseFs.fstatPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstat");let[n,s]=i;return n.fstatPromise(s,t)}fstatSync(e,t){if((e&Vn)==0)return this.baseFs.fstatSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let[n,s]=i;return n.fstatSync(s,t)}async lstatPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,t),async(i,{subPath:n})=>await i.lstatPromise(n,t))}lstatSync(e,t){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,t),(i,{subPath:n})=>i.lstatSync(n,t))}async fchmodPromise(e,t){if((e&Vn)==0)return this.baseFs.fchmodPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmod");let[n,s]=i;return n.fchmodPromise(s,t)}fchmodSync(e,t){if((e&Vn)==0)return this.baseFs.fchmodSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmodSync");let[n,s]=i;return n.fchmodSync(s,t)}async chmodPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,t),async(i,{subPath:n})=>await i.chmodPromise(n,t))}chmodSync(e,t){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,t),(i,{subPath:n})=>i.chmodSync(n,t))}async chownPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,t,i),async(n,{subPath:s})=>await n.chownPromise(s,t,i))}chownSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,t,i),(n,{subPath:s})=>n.chownSync(s,t,i))}async renamePromise(e,t){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.renamePromise(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(t,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,t){return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.renameSync(e,t),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(t,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,t,i=0){let n=async(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.copyFilePromise(e,t,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(t,async()=>await n(s,o,this.baseFs,t),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,t,i=0){let n=(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.copyFileSync(e,t,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(t,()=>n(s,o,this.baseFs,t),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,t,i),async(n,{subPath:s})=>await n.appendFilePromise(s,t,i))}appendFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,t,i),(n,{subPath:s})=>n.appendFileSync(s,t,i))}async writeFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,t,i),async(n,{subPath:s})=>await n.writeFilePromise(s,t,i))}writeFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,t,i),(n,{subPath:s})=>n.writeFileSync(s,t,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(t,{subPath:i})=>await t.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(t,{subPath:i})=>t.unlinkSync(i))}async utimesPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,t,i),async(n,{subPath:s})=>await n.utimesPromise(s,t,i))}utimesSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,t,i),(n,{subPath:s})=>n.utimesSync(s,t,i))}async mkdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,t),async(i,{subPath:n})=>await i.mkdirPromise(n,t))}mkdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,t),(i,{subPath:n})=>i.mkdirSync(n,t))}async rmdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,t),async(i,{subPath:n})=>await i.rmdirPromise(n,t))}rmdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,t),(i,{subPath:n})=>i.rmdirSync(n,t))}async linkPromise(e,t){return await this.makeCallPromise(t,async()=>await this.baseFs.linkPromise(e,t),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,t){return this.makeCallSync(t,()=>this.baseFs.linkSync(e,t),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.symlinkPromise(e,t,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,t,i){return this.makeCallSync(t,()=>this.baseFs.symlinkSync(e,t,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,t){return this.makeCallPromise(e,async()=>{switch(t){case"utf8":return await this.baseFs.readFilePromise(e,t);default:return await this.baseFs.readFilePromise(e,t)}},async(i,{subPath:n})=>await i.readFilePromise(n,t))}readFileSync(e,t){return this.makeCallSync(e,()=>{switch(t){case"utf8":return this.baseFs.readFileSync(e,t);default:return this.baseFs.readFileSync(e,t)}},(i,{subPath:n})=>i.readFileSync(n,t))}async readdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,t),async(i,{subPath:n})=>await i.readdirPromise(n,t),{requireSubpath:!1})}readdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,t),(i,{subPath:n})=>i.readdirSync(n,t),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(t,{subPath:i})=>await t.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(t,{subPath:i})=>t.readlinkSync(i))}async truncatePromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,t),async(i,{subPath:n})=>await i.truncatePromise(n,t))}truncateSync(e,t){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,t),(i,{subPath:n})=>i.truncateSync(n,t))}async ftruncatePromise(e,t){if((e&Vn)==0)return this.baseFs.ftruncatePromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncate");let[n,s]=i;return n.ftruncatePromise(s,t)}ftruncateSync(e,t){if((e&Vn)==0)return this.baseFs.ftruncateSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncateSync");let[n,s]=i;return n.ftruncateSync(s,t)}watch(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,t,i),(n,{subPath:s})=>n.watch(s,t,i))}watchFile(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,t,i),()=>HE(this,e,t,i))}unwatchFile(e,t){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,t),()=>Wh(this,e,t))}async makeCallPromise(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await t();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await t():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await t()}makeCallSync(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return t();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?t():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let t="";for(;;){let i=e.substring(t.length),n;if(!this.fileExtensions)n=tM(i,".zip");else for(let s of this.fileExtensions)if(n=tM(i,s),n)break;if(!n)return null;if(t=this.pathUtils.join(t,n),this.isZip.has(t)===!1){if(this.notZip.has(t))continue;try{if(!this.baseFs.lstatSync(t).isFile()){this.notZip.add(t);continue}}catch{return null}this.isZip.add(t)}return{archivePath:t,subPath:this.pathUtils.join(Me.root,e.substring(t.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let t=Date.now(),i=t+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(t>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-t).unref())}async getZipPromise(e,t){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new li(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await t(n.zipFs)}finally{n.refCount-=1}}else{let n=new li(e,await i());try{return await t(n)}finally{n.saveAndClose()}}}getZipSync(e,t){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new li(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,t(n.zipFs)}else{let n=new li(e,i());try{return t(n)}finally{n.saveAndClose()}}}};var Vu=ge(require("util"));var GE=ge(require("url"));var hQ=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof GE.URL?(0,GE.fileURLToPath)(e):e}};var en=Symbol("kBaseFs"),Ta=Symbol("kFd"),qA=Symbol("kClosePromise"),YE=Symbol("kCloseResolve"),qE=Symbol("kCloseReject"),_u=Symbol("kRefs"),Fo=Symbol("kRef"),No=Symbol("kUnref"),Q6e,S6e,v6e,x6e,JE=class{constructor(e,t){this[Q6e]=1;this[S6e]=void 0;this[v6e]=void 0;this[x6e]=void 0;this[en]=t,this[Ta]=e}get fd(){return this[Ta]}async appendFile(e,t){var i;try{this[Fo](this.appendFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;return await this[en].appendFilePromise(this.fd,e,n?{encoding:n}:void 0)}finally{this[No]()}}chown(e,t){throw new Error("Method not implemented.")}async chmod(e){try{return this[Fo](this.chmod),await this[en].fchmodPromise(this.fd,e)}finally{this[No]()}}createReadStream(e){return this[en].createReadStream(null,te(N({},e),{fd:this.fd}))}createWriteStream(e){return this[en].createWriteStream(null,te(N({},e),{fd:this.fd}))}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,t,i,n){var s,o,a;try{this[Fo](this.read);let l;return Buffer.isBuffer(e)?l=e:(e!=null||(e={}),l=(s=e.buffer)!=null?s:Buffer.alloc(16384),t=e.offset||0,i=(o=e.length)!=null?o:l.byteLength,n=(a=e.position)!=null?a:null),t!=null||(t=0),i!=null||(i=0),i===0?{bytesRead:i,buffer:l}:{bytesRead:await this[en].readPromise(this.fd,l,t,i,n),buffer:l}}finally{this[No]()}}async readFile(e){var t;try{this[Fo](this.readFile);let i=(t=typeof e=="string"?e:e==null?void 0:e.encoding)!=null?t:void 0;return await this[en].readFilePromise(this.fd,i)}finally{this[No]()}}async stat(e){try{return this[Fo](this.stat),await this[en].fstatPromise(this.fd,e)}finally{this[No]()}}async truncate(e){try{return this[Fo](this.truncate),await this[en].ftruncatePromise(this.fd,e)}finally{this[No]()}}utimes(e,t){throw new Error("Method not implemented.")}async writeFile(e,t){var i;try{this[Fo](this.writeFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;await this[en].writeFilePromise(this.fd,e,n)}finally{this[No]()}}async write(...e){try{if(this[Fo](this.write),ArrayBuffer.isView(e[0])){let[t,i,n,s]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i!=null?i:void 0,n!=null?n:void 0,s!=null?s:void 0),buffer:t}}else{let[t,i,n]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i,n),buffer:t}}}finally{this[No]()}}async writev(e,t){try{this[Fo](this.writev);let i=0;if(typeof t!="undefined")for(let n of e){let s=await this.write(n,void 0,void 0,t);i+=s.bytesWritten,t+=s.bytesWritten}else for(let n of e)i+=(await this.write(n)).bytesWritten;return{buffers:e,bytesWritten:i}}finally{this[No]()}}readv(e,t){throw new Error("Method not implemented.")}close(){if(this[Ta]===-1)return Promise.resolve();if(this[qA])return this[qA];if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[qA]=this[en].closePromise(e).finally(()=>{this[qA]=void 0})}else this[qA]=new Promise((e,t)=>{this[YE]=e,this[qE]=t}).finally(()=>{this[qA]=void 0,this[qE]=void 0,this[YE]=void 0});return this[qA]}[(en,Ta,Q6e=_u,S6e=qA,v6e=YE,x6e=qE,Fo)](e){if(this[Ta]===-1){let t=new Error("file closed");throw t.code="EBADF",t.syscall=e.name,t}this[_u]++}[No](){if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[en].closePromise(e).then(this[YE],this[qE])}}};var vge=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),rM=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]);function pQ(r,e){e=new hQ(e);let t=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Vu.promisify.custom])!="undefined"&&(s[Vu.promisify.custom]=o[Vu.promisify.custom])};{t(r,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),t(r,"read",(...i)=>{let[n,s,o,a,l,c]=i;if(i.length<=3){let u={};i.length<3?c=i[1]:(u=i[1],c=i[2]),{buffer:s=Buffer.alloc(16384),offset:o=0,length:a=s.byteLength,position:l}=u}if(o==null&&(o=0),a|=0,a===0){process.nextTick(()=>{c(null,0,s)});return}l==null&&(l=-1),process.nextTick(()=>{e.readPromise(n,s,o,a,l).then(u=>{c(null,u,s)},u=>{c(u,0,s)})})});for(let i of rM){let n=i.replace(/Promise$/,"");if(typeof r[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;t(r,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}r.realpath.native=r.realpath}{t(r,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}}),t(r,"readSync",(...i)=>{let[n,s,o,a,l]=i;return i.length<=3&&({offset:o=0,length:a=s.byteLength,position:l}=i[2]||{}),o==null&&(o=0),a|=0,a===0?0:(l==null&&(l=-1),e.readSync(n,s,o,a,l))});for(let i of vge){let n=i;if(typeof r[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&t(r,n,s.bind(e))}r.realpathSync.native=r.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=r.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let s of rM){let o=s.replace(/Promise$/,"");if(typeof n[o]=="undefined")continue;let a=e[s];typeof a!="undefined"&&s!=="open"&&t(n,o,(l,...c)=>l instanceof JE?l[o].apply(l,c):a.call(e,l,...c))}t(n,"open",async(...s)=>{let o=await e.openPromise(...s);return new JE(o,e)})}}r.read[Vu.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n}),r.write[Vu.promisify.custom]=async(i,n,...s)=>({bytesWritten:await e.writePromise(i,n,...s),buffer:n})}function WE(r,e){let t=Object.create(r);return pQ(t,e),t}var iM=ge(require("os"));function nM(r){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${r}${e}`}var no=new Set,dQ=null;function sM(){if(dQ)return dQ;let r=H.toPortablePath(iM.default.tmpdir()),e=K.realpathSync(r);return process.once("exit",()=>{K.rmtempSync()}),dQ={tmpdir:r,realTmpdir:e}}var K=Object.assign(new ar,{detachTemp(r){no.delete(r)},mktempSync(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{this.mkdirSync(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return r(n)}finally{if(no.has(n)){no.delete(n);try{this.removeSync(n)}catch{}}}}},async mktempPromise(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{await this.mkdirPromise(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return await r(n)}finally{if(no.has(n)){no.delete(n);try{await this.removePromise(n)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(no.values()).map(async r=>{try{await K.removePromise(r,{maxRetries:0}),no.delete(r)}catch{}}))},rmtempSync(){for(let r of no)try{K.removeSync(r),no.delete(r)}catch{}}});var mk=ge(SQ());var op={};ft(op,{parseResolution:()=>$E,parseShell:()=>_E,parseSyml:()=>Si,stringifyArgument:()=>PQ,stringifyArgumentSegment:()=>DQ,stringifyArithmeticExpression:()=>ZE,stringifyCommand:()=>kQ,stringifyCommandChain:()=>eg,stringifyCommandChainThen:()=>xQ,stringifyCommandLine:()=>VE,stringifyCommandLineThen:()=>vQ,stringifyEnvSegment:()=>XE,stringifyRedirectArgument:()=>$h,stringifyResolution:()=>eI,stringifyShell:()=>$u,stringifyShellLine:()=>$u,stringifySyml:()=>Ma,stringifyValueArgument:()=>uc});var _M=ge(zM());function _E(r,e={isGlobPattern:()=>!1}){try{return(0,_M.parse)(r,e)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function $u(r,{endSemicolon:e=!1}={}){return r.map(({command:t,type:i},n)=>`${VE(t)}${i===";"?n!==r.length-1||e?";":"":" &"}`).join(" ")}function VE(r){return`${eg(r.chain)}${r.then?` ${vQ(r.then)}`:""}`}function vQ(r){return`${r.type} ${VE(r.line)}`}function eg(r){return`${kQ(r)}${r.then?` ${xQ(r.then)}`:""}`}function xQ(r){return`${r.type} ${eg(r.chain)}`}function kQ(r){switch(r.type){case"command":return`${r.envs.length>0?`${r.envs.map(e=>XE(e)).join(" ")} `:""}${r.args.map(e=>PQ(e)).join(" ")}`;case"subshell":return`(${$u(r.subshell)})${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"group":return`{ ${$u(r.group,{endSemicolon:!0})} }${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"envs":return r.envs.map(e=>XE(e)).join(" ");default:throw new Error(`Unsupported command type: "${r.type}"`)}}function XE(r){return`${r.name}=${r.args[0]?uc(r.args[0]):""}`}function PQ(r){switch(r.type){case"redirection":return $h(r);case"argument":return uc(r);default:throw new Error(`Unsupported argument type: "${r.type}"`)}}function $h(r){return`${r.subtype} ${r.args.map(e=>uc(e)).join(" ")}`}function uc(r){return r.segments.map(e=>DQ(e)).join("")}function DQ(r){let e=(i,n)=>n?`"${i}"`:i,t=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(r.type){case"text":return t(r.text);case"glob":return r.pattern;case"shell":return e(`\${${$u(r.shell)}}`,r.quoted);case"variable":return e(typeof r.defaultValue=="undefined"?typeof r.alternativeValue=="undefined"?`\${${r.name}}`:r.alternativeValue.length===0?`\${${r.name}:+}`:`\${${r.name}:+${r.alternativeValue.map(i=>uc(i)).join(" ")}}`:r.defaultValue.length===0?`\${${r.name}:-}`:`\${${r.name}:-${r.defaultValue.map(i=>uc(i)).join(" ")}}`,r.quoted);case"arithmetic":return`$(( ${ZE(r.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${r.type}"`)}}function ZE(r){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},t=(n,s)=>s?`( ${n} )`:n,i=n=>t(ZE(n),!["number","variable"].includes(n.type));switch(r.type){case"number":return String(r.value);case"variable":return r.name;default:return`${i(r.left)} ${e(r.type)} ${i(r.right)}`}}var ZM=ge(XM());function $E(r){let e=r.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${r}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,ZM.parse)(r)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function eI(r){let e="";return r.from&&(e+=r.from.fullName,r.from.description&&(e+=`@${r.from.description}`),e+="/"),e+=r.descriptor.fullName,r.descriptor.description&&(e+=`@${r.descriptor.description}`),e}var uI=ge(jK()),qK=ge(YK()),Tpe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,JK=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],YQ=class{constructor(e){this.data=e}};function WK(r){return r.match(Tpe)?r:JSON.stringify(r)}function zK(r){return typeof r=="undefined"?!0:typeof r=="object"&&r!==null?Object.keys(r).every(e=>zK(r[e])):!1}function qQ(r,e,t){if(r===null)return`null +`;if(typeof r=="number"||typeof r=="boolean")return`${r.toString()} +`;if(typeof r=="string")return`${WK(r)} +`;if(Array.isArray(r)){if(r.length===0)return`[] +`;let i=" ".repeat(e);return` +${r.map(s=>`${i}- ${qQ(s,e+1,!1)}`).join("")}`}if(typeof r=="object"&&r){let i,n;r instanceof YQ?(i=r.data,n=!1):(i=r,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=JK.indexOf(l),g=JK.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!zK(i[l])).map((l,c)=>{let u=i[l],g=WK(l),f=qQ(u,e+1,!0),h=c>0||t?s:"",p=g.length>1024?`? ${g} +${h}:`:`${g}:`,m=f.startsWith(` +`)?f:` ${f}`;return`${h}${p}${m}`}).join(e===0?` +`:"")||` +`;return t?` +${a}`:`${a}`}throw new Error(`Unsupported value type (${r})`)}function Ma(r){try{let e=qQ(r,0,!1);return e!==` +`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Ma.PreserveOrdering=YQ;function Ope(r){return r.endsWith(` +`)||(r+=` +`),(0,qK.parse)(r)}var Mpe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function Kpe(r){if(Mpe.test(r))return Ope(r);let e=(0,uI.safeLoad)(r,{schema:uI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Si(r){return Kpe(r)}var T4=ge(VK()),mw=ge(Ic());var Cp={};ft(Cp,{Builtins:()=>oS,Cli:()=>ws,Command:()=>Re,Option:()=>J,UsageError:()=>Pe,formatMarkdownish:()=>Ui});var yc=0,ap=1,tn=2,WQ="",vi="\0",lg=-1,zQ=/^(-h|--help)(?:=([0-9]+))?$/,gI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,tU=/^-[a-zA-Z]{2,}$/,_Q=/^([^=]+)=([\s\S]*)$/,VQ=process.env.DEBUG_CLI==="1";var Pe=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},Ap=class extends Error{constructor(e,t){super();if(this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} + +${this.candidates.map(({usage:n})=>`$ ${n}`).join(` +`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: + +$ ${i} +${XQ(e)}`}else this.message=`Command not found; did you mean one of: + +${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` +`)} + +${XQ(e)}`}},ZQ=class extends Error{constructor(e,t){super();this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: + +${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` +`)} + +${XQ(e)}`}},XQ=r=>`While running ${r.filter(e=>e!==vi).map(e=>{let t=JSON.stringify(e);return e.match(/\s/)||e.length===0||t!==`"${e}"`?t:e}).join(" ")}`;var lp=Symbol("clipanion/isOption");function rn(r){return te(N({},r),{[lp]:!0})}function Oo(r,e){return typeof r=="undefined"?[r,e]:typeof r=="object"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function fI(r,e=!1){let t=r.replace(/^\.: /,"");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function cp(r,e){return e.length===1?new Pe(`${r}: ${fI(e[0],!0)}`):new Pe(`${r}: +${e.map(t=>` +- ${fI(t)}`).join("")}`)}function up(r,e,t){if(typeof t=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw cp(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}var Re=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(ys(),cg)),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw cp("Invalid option schema",l);for(let[,g]of c)g()}else if(t!=null)throw new Error("Invalid command schema");let i=await this.execute();return typeof i!="undefined"?i:0}};Re.isOption=lp;Re.Default=[];var uU=80,tS=Array(uU).fill("\u2501");for(let r=0;r<=24;++r)tS[tS.length-r]=`[38;5;${232+r}m\u2501`;var rS={header:r=>`\u2501\u2501\u2501 ${r}${r.length`${r}`,error:r=>`${r}`,code:r=>`${r}`},gU={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function yde(r){let e=r.split(` +`),t=e.filter(n=>n.match(/\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` +`)}function Ui(r,{format:e,paragraphs:t}){return r=r.replace(/\r\n?/g,` +`),r=yde(r),r=r.replace(/^\n+|\n+$/g,""),r=r.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 + +`),r=r.replace(/\n(\n)?\n*/g,"$1"),t&&(r=r.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` +`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` +`)}).join(` + +`)),r=r.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r} +`:""}var sS=ge(require("tty"));function wn(r){VQ&&console.log(r)}var fU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:lg};function hU(){return{nodes:[sn(),sn(),sn()]}}function Bde(r){let e=hU(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(yc)}function Qde(r,{prefix:e=""}={}){if(VQ){wn(`${e}Nodes are:`);for(let t=0;tl!==tn).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===tn))throw new Ap(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=Sde(a)}if(i.length>0){wn(" Results:");for(let s of i)wn(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else wn(" No results");return i}function vde(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,vi)){for(let{to:t}of r.statics[vi])if(t===ap)return!0}return!1}function kde(r,e,t){let i=t&&e.length>0?[""]:[],n=dU(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let m=r.nodes[p],y=Object.keys(m.statics);for(let b of Object.keys(m.statics)){let v=y[0];for(let{to:x,reducer:T}of m.statics[v])T==="pushPath"&&(u||l.push(v),g.push(x))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=vde(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==vi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===tn)continue;let p=xde(f,c);if(p!==null)for(let m of p)a([...i,m],l)}}return[...s].sort()}function Dde(r,e){let t=dU(r,[...e,vi]);return Pde(e,t.map(({state:i})=>i))}function Sde(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function Pde(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Ap(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=Rde(c);if(u.length>1)throw new ZQ(r,u.map(g=>g.candidateUsage));return u[0]}function Rde(r){let e=[],t=[];for(let i of r)i.selectedIndex===lg?t.push(i):e.push(i);return t.length>0&&e.push(te(N({},fU),{path:CU(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])})),e}function CU(r,e,...t){return e===void 0?Array.from(r):CU(r.filter((i,n)=>i===e[n]),...t)}function sn(){return{dynamics:[],shortcuts:[],statics:{}}}function pU(r){return r===ap||r===tn}function nS(r,e=0){return{to:pU(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function wde(r,e=0){let t=sn();for(let[i,n]of r.dynamics)t.dynamics.push([i,nS(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(nS(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>nS(s,e));return t}function xi(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function ug(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function Ka(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function pI(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function xde(r,e){let t=Array.isArray(r)?dI[r[0]]:dI[r];if(typeof t.suggest=="undefined")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var dI={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(r,e)=>r.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&&tU.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(_Q);return!r.ignoreOptions&&!!n&&gI.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&&zQ.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith("-")&&gI.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith("-")&&!gI.test(e)};dI.isOption.suggest=(r,e,t=!0)=>t?null:[e];var iS={setCandidateState:(r,e,t)=>N(N({},r),t),setSelectedIndex:(r,e,t)=>te(N({},r),{selectedIndex:t}),pushBatch:(r,e)=>te(N({},r),{options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(_Q);return te(N({},r),{options:r.options.concat({name:t,value:i})})},pushPath:(r,e)=>te(N({},r),{path:r.path.concat(e)}),pushPositional:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:Zn})}),pushTrue:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>te(N({},r),{options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i=te(N({},r),{options:[...r.options]}),n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t=te(N({},r),{options:[...r.options]}),i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>te(N({},r),{ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(zQ);return typeof i!="undefined"?te(N({},r),{options:[{name:"-c",value:String(t)},{name:"-i",value:i}]}):te(N({},r),{options:[{name:"-c",value:String(t)}]})},setError:(r,e,t)=>e===vi?te(N({},r),{errorMessage:`${t}.`}):te(N({},r),{errorMessage:`${t} ("${e}").`}),setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return te(N({},r),{errorMessage:`Not enough arguments to option ${t.name}.`})}},Zn=Symbol(),mU=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===Zn)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!t&&this.arity.extra!==Zn?this.arity.extra.push(e):this.arity.extra!==Zn&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===Zn)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Zn?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=hU(),t=yc,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=so(e,sn()),Ka(e,yc,WQ,t,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=so(e,sn());ug(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=so(e,sn());xi(e,l,"isHelp",f,["useHelp",this.cliIndex]),Ka(e,f,vi,ap,["setSelectedIndex",lg]),this.registerOptions(e,l)}this.arity.leading.length>0&&Ka(e,l,vi,tn,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&Ka(e,h,vi,tn,["setError","Not enough positional arguments"]),xi(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Zn||this.arity.extra.length>0){let f=so(e,sn());if(ug(e,c,f),this.arity.extra===Zn){let h=so(e,sn());this.arity.proxy||this.registerOptions(e,h),xi(e,c,s,h,"pushExtraNoLimits"),xi(e,h,s,h,"pushExtraNoLimits"),ug(e,h,f)}else for(let h=0;h0&&Ka(e,u,vi,tn,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)xi(e,t,["isOption",s,i.hidden||s!==n],t,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&xi(e,t,["isNegatedOption",s],t,["pushFalse",s]);else{let s=so(e,sn());for(let o of i.names)xi(e,t,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eDde(i,n),suggest:(n,s)=>kde(i,n,s)}}};var dp=class extends Re{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,t){let i=new dp(t);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: +`),this.context.stdout.write(` +`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(` +`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. +`)}}};var EU=Symbol("clipanion/errorCommand");function Fde(){return process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY?8:1}var ws=class{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new pp({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new ws(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[Re.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case lg:return dp.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[EU]=a,l}}break}}async run(e,t){var i;let n,s=N(N({},ws.defaultContext),t),o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,N(N({},s),u)),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?Nde(s):IU,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Ui(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Ui(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Ui(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Ui(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof Re?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Ui(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` +`),(c!==""||u.length>0)&&(a+=`${this.format(t).header("Usage")} +`,a+=` +`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g} +`,f.length>0){a+=` +`,a+=`${rS.header("Options")} +`;let h=f.reduce((p,m)=>Math.max(p,m.definition.length),0);a+=` +`;for(let{definition:p,description:m}of f)a+=` ${this.format(t).bold(p.padEnd(h))} ${Ui(m,{format:this.format(t),paragraphs:!1})}`}if(c!==""&&(a+=` +`,a+=`${this.format(t).header("Details")} +`,a+=` +`,a+=Ui(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=` +`,a+=`${this.format(t).header("Examples")} +`;for(let[h,p]of u)a+=` +`,a+=Ui(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(t).bold(n)}`).replace(/\$0/g,this.binaryName)} +`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l} +`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Ui(f.usage.category,{format:this.format(t),paragraphs:!1}):null,m=l.get(p);typeof m=="undefined"&&l.set(p,m=[]);let{usage:y}=this.getUsageByIndex(h);m.push({commandClass:f,usage:y})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)} + +`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)} +`:a+=`${this.format(t).header(`${this.binaryVersion}`)} +`,a+=` ${this.format(t).bold(n)}${this.binaryName} +`):a+=`${this.format(t).bold(n)}${this.binaryName} +`;for(let f of c){let h=l.get(f).slice().sort((m,y)=>m.usage.localeCompare(y.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` +`,a+=`${this.format(t).header(`${p}`)} +`;for(let{commandClass:m,usage:y}of h){let b=m.usage.description||"undocumented";a+=` +`,a+=` ${this.format(t).bold(y)} +`,a+=` ${Ui(b,{format:this.format(t),paragraphs:!1})}`}}a+=` +`,a+=Ui("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[EU])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} +`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` +`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} +`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:ws.defaultContext.colorDepth>1)?rS:gU}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};ws.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:"getColorDepth"in sS.default.WriteStream.prototype?sS.default.WriteStream.prototype.getColorDepth():Fde()};var yU;function Nde(r){let e=yU;if(typeof e=="undefined"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return IU;let{AsyncLocalStorage:t}=require("async_hooks");e=yU=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function IU(r){return r()}var oS={};ft(oS,{DefinitionsCommand:()=>CI,HelpCommand:()=>mI,VersionCommand:()=>EI});var CI=class extends Re{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} +`)}};CI.paths=[["--clipanion=definitions"]];var mI=class extends Re{async execute(){this.context.stdout.write(this.cli.usage())}};mI.paths=[["-h"],["--help"]];var EI=class extends Re{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} +`)}};EI.paths=[["-v"],["--version"]];var J={};ft(J,{Array:()=>wU,Boolean:()=>BU,Counter:()=>bU,Proxy:()=>QU,Rest:()=>SU,String:()=>vU,applyValidator:()=>up,cleanValidationError:()=>fI,formatError:()=>cp,isOptionSymbol:()=>lp,makeCommandOption:()=>rn,rerouteArguments:()=>Oo});function wU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function BU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function bU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function QU(r={}){return rn({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}function SU(r={}){return rn({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Zn||a.extra===!1&&oo)}})}function Lde(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?up(g!=null?g:c,f,n.validator):f}})}function Tde(r={}){let{required:e=!0}=r;return rn({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;oYW,areIdentsEqual:()=>fd,areLocatorsEqual:()=>hd,areVirtualPackagesEquivalent:()=>aSe,bindDescriptor:()=>sSe,bindLocator:()=>oSe,convertDescriptorToLocator:()=>Aw,convertLocatorToDescriptor:()=>_x,convertPackageToLocator:()=>nSe,convertToIdent:()=>iSe,convertToManifestRange:()=>cSe,copyPackage:()=>cd,devirtualizeDescriptor:()=>ud,devirtualizeLocator:()=>gd,getIdentVendorPath:()=>ek,isPackageCompatible:()=>gw,isVirtualDescriptor:()=>Al,isVirtualLocator:()=>ea,makeDescriptor:()=>rr,makeIdent:()=>$o,makeLocator:()=>cn,makeRange:()=>cw,parseDescriptor:()=>ll,parseFileStyleRange:()=>ASe,parseIdent:()=>An,parseLocator:()=>Yc,parseRange:()=>qg,prettyDependent:()=>Lv,prettyDescriptor:()=>sr,prettyIdent:()=>fi,prettyLocator:()=>It,prettyLocatorNoColors:()=>$x,prettyRange:()=>aw,prettyReference:()=>dd,prettyResolution:()=>Tv,prettyWorkspace:()=>Cd,renamePackage:()=>ld,slugifyIdent:()=>Zx,slugifyLocator:()=>Jg,sortDescriptors:()=>Wg,stringifyDescriptor:()=>Pn,stringifyIdent:()=>Ot,stringifyLocator:()=>Rs,tryParseDescriptor:()=>pd,tryParseIdent:()=>qW,tryParseLocator:()=>lw,virtualizeDescriptor:()=>Vx,virtualizePackage:()=>Xx});var Yg=ge(require("querystring")),HW=ge(ri()),jW=ge(nY());var ae={};ft(ae,{LogLevel:()=>ho,Style:()=>Tc,Type:()=>qe,addLogFilterSupport:()=>nd,applyColor:()=>ns,applyHyperlink:()=>Mg,applyStyle:()=>Ry,json:()=>Oc,jsonOrPretty:()=>KBe,mark:()=>Hv,pretty:()=>tt,prettyField:()=>_o,prettyList:()=>Uv,supportsColor:()=>Py,supportsHyperlinks:()=>Mv,tuple:()=>fo});var rd=ge(uv()),id=ge(Ic());var sJ=ge(is()),oJ=ge(Jq());var Se={};ft(Se,{AsyncActions:()=>$q,BufferStream:()=>Zq,CachingStrategy:()=>Lc,DefaultStream:()=>eJ,allSettledSafe:()=>go,assertNever:()=>Pv,bufferStream:()=>Tg,buildIgnorePattern:()=>LBe,convertMapsToIndexableObjects:()=>ky,dynamicRequire:()=>Og,escapeRegExp:()=>PBe,getArrayWithDefault:()=>Fg,getFactoryWithDefault:()=>_a,getMapWithDefault:()=>Ng,getSetWithDefault:()=>Nc,isIndexableObject:()=>Dv,isPathLike:()=>TBe,isTaggedYarnVersion:()=>kBe,mapAndFilter:()=>zo,mapAndFind:()=>$p,overrideType:()=>kv,parseBoolean:()=>td,parseOptionalBoolean:()=>nJ,prettifyAsyncErrors:()=>Lg,prettifySyncErrors:()=>Rv,releaseAfterUseAsync:()=>RBe,replaceEnvVariables:()=>Fv,sortMap:()=>kn,tryParseOptionalBoolean:()=>Nv,validateEnum:()=>DBe});var Wq=ge(is()),zq=ge(gg()),_q=ge(ri()),xv=ge(require("stream"));function kBe(r){return!!(_q.default.valid(r)&&r.match(/^[^-]+(-rc\.[0-9]+)?$/))}function PBe(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kv(r){}function Pv(r){throw new Error(`Assertion failed: Unexpected object '${r}'`)}function DBe(r,e){let t=Object.values(r);if(!t.includes(e))throw new Pe(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${t.map(i=>JSON.stringify(i)).join(", ")})`);return e}function zo(r,e){let t=[];for(let i of r){let n=e(i);n!==Vq&&t.push(n)}return t}var Vq=Symbol();zo.skip=Vq;function $p(r,e){for(let t of r){let i=e(t);if(i!==Xq)return i}}var Xq=Symbol();$p.skip=Xq;function Dv(r){return typeof r=="object"&&r!==null}async function go(r){let e=await Promise.allSettled(r),t=[];for(let i of e){if(i.status==="rejected")throw i.reason;t.push(i.value)}return t}function ky(r){if(r instanceof Map&&(r=Object.fromEntries(r)),Dv(r))for(let e of Object.keys(r)){let t=r[e];Dv(t)&&(r[e]=ky(t))}return r}function _a(r,e,t){let i=r.get(e);return typeof i=="undefined"&&r.set(e,i=t()),i}function Fg(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=[]),t}function Nc(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Set),t}function Ng(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Map),t}async function RBe(r,e){if(e==null)return await r();try{return await r()}finally{await e()}}async function Lg(r,e){try{return await r()}catch(t){throw t.message=e(t.message),t}}function Rv(r,e){try{return r()}catch(t){throw t.message=e(t.message),t}}async function Tg(r){return await new Promise((e,t)=>{let i=[];r.on("error",n=>{t(n)}),r.on("data",n=>{i.push(n)}),r.on("end",()=>{e(Buffer.concat(i))})})}var Zq=class extends xv.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}};function FBe(){let r,e;return{promise:new Promise((i,n)=>{r=i,e=n}),resolve:r,reject:e}}var $q=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,zq.default)(e)}set(e,t){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=FBe());let n=this.limit(()=>t());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,t){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>t(i))}async wait(){await Promise.all(this.promises.values())}},eJ=class extends xv.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},ed=eval("require");function tJ(r){return ed(H.fromPortablePath(r))}function rJ(path){let physicalPath=H.fromPortablePath(path),currentCacheEntry=ed.cache[physicalPath];delete ed.cache[physicalPath];let result;try{result=tJ(physicalPath);let freshCacheEntry=ed.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{ed.cache[physicalPath]=currentCacheEntry}return result}var iJ=new Map;function NBe(r){let e=iJ.get(r),t=K.statSync(r);if((e==null?void 0:e.mtime)===t.mtimeMs)return e.instance;let i=rJ(r);return iJ.set(r,{mtime:t.mtimeMs,instance:i}),i}var Lc;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Lc||(Lc={}));function Og(r,{cachingStrategy:e=2}={}){switch(e){case 0:return rJ(r);case 1:return NBe(r);case 2:return tJ(r);default:throw new Error("Unsupported caching strategy")}}function kn(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function LBe(r){return r.length===0?null:r.map(e=>`(${Wq.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Fv(r,{env:e}){let t=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return r.replace(t,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new Pe(`Environment variable not found (${n})`)})}function td(r){switch(r){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${r}" as a boolean`)}}function nJ(r){return typeof r=="undefined"?r:td(r)}function Nv(r){try{return nJ(r)}catch{return null}}function TBe(r){return!!(H.isAbsolute(r)||r.match(/^(\.{1,2}|~)\//))}var Qt;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(Qt||(Qt={}));var wi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(wi||(wi={}));var qi;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(qi||(qi={}));var qe={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN"},Tc;(function(e){e[e.BOLD=2]="BOLD"})(Tc||(Tc={}));var Ov=id.default.GITHUB_ACTIONS?{level:2}:rd.default.supportsColor?{level:rd.default.supportsColor.level}:{level:0},Py=Ov.level!==0,Mv=Py&&!id.default.GITHUB_ACTIONS&&!id.default.CIRCLE&&!id.default.GITLAB,Kv=new rd.default.Instance(Ov),OBe=new Map([[qe.NO_HINT,null],[qe.NULL,["#a853b5",129]],[qe.SCOPE,["#d75f00",166]],[qe.NAME,["#d7875f",173]],[qe.RANGE,["#00afaf",37]],[qe.REFERENCE,["#87afff",111]],[qe.NUMBER,["#ffd700",220]],[qe.PATH,["#d75fd7",170]],[qe.URL,["#d75fd7",170]],[qe.ADDED,["#5faf00",70]],[qe.REMOVED,["#d70000",160]],[qe.CODE,["#87afff",111]],[qe.SIZE,["#ffd700",220]]]),Fs=r=>r,Dy={[qe.NUMBER]:Fs({pretty:(r,e)=>`${e}`,json:r=>r}),[qe.IDENT]:Fs({pretty:(r,e)=>fi(r,e),json:r=>Ot(r)}),[qe.LOCATOR]:Fs({pretty:(r,e)=>It(r,e),json:r=>Rs(r)}),[qe.DESCRIPTOR]:Fs({pretty:(r,e)=>sr(r,e),json:r=>Pn(r)}),[qe.RESOLUTION]:Fs({pretty:(r,{descriptor:e,locator:t})=>Tv(r,e,t),json:({descriptor:r,locator:e})=>({descriptor:Pn(r),locator:e!==null?Rs(e):null})}),[qe.DEPENDENT]:Fs({pretty:(r,{locator:e,descriptor:t})=>Lv(r,e,t),json:({locator:r,descriptor:e})=>({locator:Rs(r),descriptor:Pn(e)})}),[qe.PACKAGE_EXTENSION]:Fs({pretty:(r,e)=>{switch(e.type){case wi.Dependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"dependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependencyMeta:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependenciesMeta",qe.CODE)} \u27A4 ${fi(r,An(e.selector))} \u27A4 ${ns(r,e.key,qe.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:r=>{switch(r.type){case wi.Dependency:return`${Ot(r.parentDescriptor)} > ${Ot(r.descriptor)}`;case wi.PeerDependency:return`${Ot(r.parentDescriptor)} >> ${Ot(r.descriptor)}`;case wi.PeerDependencyMeta:return`${Ot(r.parentDescriptor)} >> ${r.selector} / ${r.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${r.type}`)}}}),[qe.SETTING]:Fs({pretty:(r,e)=>(r.get(e),Mg(r,ns(r,e,qe.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:r=>r}),[qe.DURATION]:Fs({pretty:(r,e)=>{if(e>1e3*60){let t=Math.floor(e/1e3/60),i=Math.ceil((e-t*60*1e3)/1e3);return i===0?`${t}m`:`${t}m ${i}s`}else{let t=Math.floor(e/1e3),i=e-t*1e3;return i===0?`${t}s`:`${t}s ${i}ms`}},json:r=>r}),[qe.SIZE]:Fs({pretty:(r,e)=>{let t=["KB","MB","GB","TB"],i=t.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return ns(r,`${s} ${t[i-1]}`,qe.NUMBER)},json:r=>r}),[qe.PATH]:Fs({pretty:(r,e)=>ns(r,H.fromPortablePath(e),qe.PATH),json:r=>H.fromPortablePath(r)}),[qe.MARKDOWN]:Fs({pretty:(r,{text:e,format:t,paragraphs:i})=>Ui(e,{format:t,paragraphs:i}),json:({text:r})=>r})};function fo(r,e){return[e,r]}function Ry(r,e,t){return r.get("enableColors")&&t&2&&(e=rd.default.bold(e)),e}function ns(r,e,t){if(!r.get("enableColors"))return e;let i=OBe.get(t);if(i===null)return e;let n=typeof i=="undefined"?t:Ov.level>=3?i[0]:i[1],s=typeof n=="number"?Kv.ansi256(n):n.startsWith("#")?Kv.hex(n):Kv[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var MBe=!!process.env.KONSOLE_VERSION;function Mg(r,e,t){return r.get("enableHyperlinks")?MBe?`]8;;${t}\\${e}]8;;\\`:`]8;;${t}\x07${e}]8;;\x07`:e}function tt(r,e,t){if(e===null)return ns(r,"null",qe.NULL);if(Object.prototype.hasOwnProperty.call(Dy,t))return Dy[t].pretty(r,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return ns(r,e,t)}function Uv(r,e,t,{separator:i=", "}={}){return[...e].map(n=>tt(r,n,t)).join(i)}function Oc(r,e){if(r===null)return null;if(Object.prototype.hasOwnProperty.call(Dy,e))return kv(e),Dy[e].json(r);if(typeof r!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof r}`);return r}function KBe(r,e,[t,i]){return r?Oc(t,i):tt(e,t,i)}function Hv(r){return{Check:ns(r,"\u2713","green"),Cross:ns(r,"\u2718","red"),Question:ns(r,"?","cyan")}}function _o(r,{label:e,value:[t,i]}){return`${tt(r,e,qe.CODE)}: ${tt(r,t,i)}`}var ho;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(ho||(ho={}));function nd(r,{configuration:e}){let t=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of t){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let m=g.get("pattern");typeof m!="undefined"&&s.push([sJ.default.matcher(m,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===X.UNNAMED)return h;let p=n.size>0||s.length>0?(0,oJ.default)(f):f;if(n.size>0){let m=n.get(p);if(typeof m!="undefined")return m!=null?m:h}if(s.length>0){for(let[m,y]of s)if(m(p))return y!=null?y:h}if(i.size>0){let m=i.get(_A(g));if(typeof m!="undefined")return m!=null?m:h}return h},a=r.reportInfo,l=r.reportWarning,c=r.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case ho.Info:a.call(g,f,h);break;case ho.Warning:l.call(g,f!=null?f:X.UNNAMED,h);break;case ho.Error:c.call(g,f!=null?f:X.UNNAMED,h);break}};r.reportInfo=function(...g){return u(this,...g,ho.Info)},r.reportWarning=function(...g){return u(this,...g,ho.Warning)},r.reportError=function(...g){return u(this,...g,ho.Error)}}var Dn={};ft(Dn,{checksumFile:()=>sw,checksumPattern:()=>ow,makeHash:()=>ln});var nw=ge(require("crypto")),zx=ge(Wx());function ln(...r){let e=(0,nw.createHash)("sha512"),t="";for(let i of r)typeof i=="string"?t+=i:i&&(t&&(e.update(t),t=""),e.update(i));return t&&e.update(t),e.digest("hex")}async function sw(r,{baseFs:e,algorithm:t}={baseFs:K,algorithm:"sha512"}){let i=await e.openPromise(r,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,nw.createHash)(t),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function ow(r,{cwd:e}){let i=(await(0,zx.default)(r,{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,zx.default)([r,...i],{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=H.toPortablePath(a),u=await K.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await K.readlinkPromise(c))):u.isFile()&&l.push(await K.readFilePromise(c)),l.join("\0")})),o=(0,nw.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var Ad="virtual:",tSe=5,GW=/(os|cpu|libc)=([a-z0-9_-]+)/,rSe=(0,jW.makeParser)(GW);function $o(r,e){if(r==null?void 0:r.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:ln(r,e),scope:r,name:e}}function rr(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:ln(r.identHash,e),range:e}}function cn(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:ln(r.identHash,e),reference:e}}function iSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name}}function Aw(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.descriptorHash,reference:r.range}}function _x(r){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:r.locatorHash,range:r.reference}}function nSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.locatorHash,reference:r.reference}}function ld(r,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:r.version,languageName:r.languageName,linkType:r.linkType,conditions:r.conditions,dependencies:new Map(r.dependencies),peerDependencies:new Map(r.peerDependencies),dependenciesMeta:new Map(r.dependenciesMeta),peerDependenciesMeta:new Map(r.peerDependenciesMeta),bin:new Map(r.bin)}}function cd(r){return ld(r,r)}function Vx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return rr(r,`virtual:${e}#${r.range}`)}function Xx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return ld(r,cn(r,`virtual:${e}#${r.reference}`))}function Al(r){return r.range.startsWith(Ad)}function ea(r){return r.reference.startsWith(Ad)}function ud(r){if(!Al(r))throw new Error("Not a virtual descriptor");return rr(r,r.range.replace(/^[^#]*#/,""))}function gd(r){if(!ea(r))throw new Error("Not a virtual descriptor");return cn(r,r.reference.replace(/^[^#]*#/,""))}function sSe(r,e){return r.range.includes("::")?r:rr(r,`${r.range}::${Yg.default.stringify(e)}`)}function oSe(r,e){return r.reference.includes("::")?r:cn(r,`${r.reference}::${Yg.default.stringify(e)}`)}function fd(r,e){return r.identHash===e.identHash}function YW(r,e){return r.descriptorHash===e.descriptorHash}function hd(r,e){return r.locatorHash===e.locatorHash}function aSe(r,e){if(!ea(r))throw new Error("Invalid package type");if(!ea(e))throw new Error("Invalid package type");if(!fd(r,e)||r.dependencies.size!==e.dependencies.size)return!1;for(let t of r.dependencies.values()){let i=e.dependencies.get(t.identHash);if(!i||!YW(t,i))return!1}return!0}function An(r){let e=qW(r);if(!e)throw new Error(`Invalid ident (${r})`);return e}function qW(r){let e=r.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,t,i]=e,n=typeof t!="undefined"?t:null;return $o(n,i)}function ll(r,e=!1){let t=pd(r,e);if(!t)throw new Error(`Invalid descriptor (${r})`);return t}function pd(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid range (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return rr($o(o,n),a)}function Yc(r,e=!1){let t=lw(r,e);if(!t)throw new Error(`Invalid locator (${r})`);return t}function lw(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid reference (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return cn($o(o,n),a)}function qg(r,e){let t=r.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(t===null)throw new Error(`Invalid range (${r})`);let i=typeof t[1]!="undefined"?t[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof t[3]!="undefined"?decodeURIComponent(t[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${r})`);let s=typeof t[3]!="undefined"?decodeURIComponent(t[3]):decodeURIComponent(t[2]),o=(e==null?void 0:e.parseSelector)?Yg.default.parse(s):s,a=typeof t[4]!="undefined"?Yg.default.parse(t[4]):null;return{protocol:i,source:n,selector:o,params:a}}function ASe(r,{protocol:e}){let{selector:t,params:i}=qg(r,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${r}`);return{parentLocator:Yc(i.locator,!0),path:t}}function JW(r){return r=r.replace(/%/g,"%25"),r=r.replace(/:/g,"%3A"),r=r.replace(/#/g,"%23"),r}function lSe(r){return r===null?!1:Object.entries(r).length>0}function cw({protocol:r,source:e,selector:t,params:i}){let n="";return r!==null&&(n+=`${r}`),e!==null&&(n+=`${JW(e)}#`),n+=JW(t),lSe(i)&&(n+=`::${Yg.default.stringify(i)}`),n}function cSe(r){let{params:e,protocol:t,source:i,selector:n}=qg(r);for(let s in e)s.startsWith("__")&&delete e[s];return cw({protocol:t,source:i,params:e,selector:n})}function Ot(r){return r.scope?`@${r.scope}/${r.name}`:`${r.name}`}function Pn(r){return r.scope?`@${r.scope}/${r.name}@${r.range}`:`${r.name}@${r.range}`}function Rs(r){return r.scope?`@${r.scope}/${r.name}@${r.reference}`:`${r.name}@${r.reference}`}function Zx(r){return r.scope!==null?`@${r.scope}-${r.name}`:r.name}function Jg(r){let{protocol:e,selector:t}=qg(r.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=HW.default.valid(t),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=r.scope?`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`:`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`;return Jr(a)}function fi(r,e){return e.scope?`${tt(r,`@${e.scope}/`,qe.SCOPE)}${tt(r,e.name,qe.NAME)}`:`${tt(r,e.name,qe.NAME)}`}function uw(r){if(r.startsWith(Ad)){let e=uw(r.substring(r.indexOf("#")+1)),t=r.substring(Ad.length,Ad.length+tSe);return`${e} [${t}]`}else return r.replace(/\?.*/,"?[...]")}function aw(r,e){return`${tt(r,uw(e),qe.RANGE)}`}function sr(r,e){return`${fi(r,e)}${tt(r,"@",qe.RANGE)}${aw(r,e.range)}`}function dd(r,e){return`${tt(r,uw(e),qe.REFERENCE)}`}function It(r,e){return`${fi(r,e)}${tt(r,"@",qe.REFERENCE)}${dd(r,e.reference)}`}function $x(r){return`${Ot(r)}@${uw(r.reference)}`}function Wg(r){return kn(r,[e=>Ot(e),e=>e.range])}function Cd(r,e){return fi(r,e.locator)}function Tv(r,e,t){let i=Al(e)?ud(e):e;return t===null?`${sr(r,i)} \u2192 ${Hv(r).Cross}`:i.identHash===t.identHash?`${sr(r,i)} \u2192 ${dd(r,t.reference)}`:`${sr(r,i)} \u2192 ${It(r,t)}`}function Lv(r,e,t){return t===null?`${It(r,e)}`:`${It(r,e)} (via ${aw(r,t.range)})`}function ek(r){return`node_modules/${Ot(r)}`}function gw(r,e){return r.conditions?rSe(r.conditions,t=>{let[,i,n]=t.match(GW),s=e[i];return s?s.includes(n):!0}):!0}var WW={hooks:{reduceDependency:(r,e,t,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==Ot(t)||o.from&&o.from.description&&o.from.description!==t.reference||o.descriptor.fullName!==Ot(r)||o.descriptor.description&&o.descriptor.description!==r.range)continue;return n.bindDescriptor(rr(r,a),e.topLevelWorkspace.anchoredLocator,s)}return r},validateProject:async(r,e)=>{for(let t of r.workspaces){let i=Cd(r.configuration,t);await r.configuration.triggerHook(n=>n.validateWorkspace,t,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(r,e)=>{let{manifest:t}=r;t.resolutions.length&&r.cwd!==r.project.cwd&&t.errors.push(new Error("Resolutions field will be ignored"));for(let i of t.errors)e.reportWarning(X.INVALID_MANIFEST,i.message)}}};var XW=ge(ri());var md=class{supportsDescriptor(e,t){return!!(e.range.startsWith(md.protocol)||t.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,t){return!!e.reference.startsWith(md.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.getWorkspaceByCwd(e.reference.slice(md.protocol.length));return te(N({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:Qt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},oi=md;oi.protocol="workspace:";var Wt={};ft(Wt,{SemVer:()=>zW.SemVer,clean:()=>gSe,satisfiesWithPrereleases:()=>qc,validRange:()=>po});var fw=ge(ri()),zW=ge(ri()),_W=new Map;function qc(r,e,t=!1){if(!r)return!1;let i=`${e}${t}`,n=_W.get(i);if(typeof n=="undefined")try{n=new fw.default.Range(e,{includePrerelease:!0,loose:t})}catch{return!1}finally{_W.set(i,n||null)}else if(n===null)return!1;let s;try{s=new fw.default.SemVer(r,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var VW=new Map;function po(r){if(r.indexOf(":")!==-1)return null;let e=VW.get(r);if(typeof e!="undefined")return e;try{e=new fw.default.Range(r)}catch{e=null}return VW.set(r,e),e}var uSe=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/;function gSe(r){let e=uSe.exec(r);return e?e[1]:null}var cl=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:t=new ar}={}){let i=k.join(e,"package.json");try{return await cl.fromFile(i,{baseFs:t})}catch(n){if(n.code==="ENOENT")return null;throw n}}static async find(e,{baseFs:t}={}){let i=await cl.tryFind(e,{baseFs:t});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:t=new ar}={}){let i=new cl;return await i.loadFile(e,{baseFs:t}),i}static fromText(e){let t=new cl;return t.loadFromText(e),t}static isManifestFieldCompatible(e,t){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,t===s.slice(1))return!1}else if(i=!1,s===t)return!0;return n&&i}loadFromText(e){let t;try{t=JSON.parse($W(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(t),this.indent=ZW(e)}async loadFile(e,{baseFs:t=new ar}){let i=await t.readFilePromise(e,"utf8"),n;try{n=JSON.parse($W(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=ZW(i)}load(e,{yamlCompatibilityMode:t=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=An(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(Array.isArray(e.libc)){let s=[];this.libc=s;for(let o of e.libc)typeof o!="string"?i.push(new Error("Parsing failed for the 'libc' field")):s.push(o)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=un(e.main):this.main=null,typeof e.module=="string"?this.module=un(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=un(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(un(s),typeof o=="string"?un(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,un(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}let a=An(s);this.bin.set(a.name,un(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(oi.protocol)&&!po(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=rr(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=ll(s),l=this.ensureDependencyMeta(a),c=hw(o.built,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=hw(o.optional,{yamlCompatibilityMode:t});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=hw(o.unplugged,{yamlCompatibilityMode:t});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=ll(s),l=this.ensurePeerDependencyMeta(a),c=hw(o.optional,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:$E(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=un(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=un(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=un(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(un(s),typeof o=="string"?un(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,un(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,un(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(un(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l);let c=rr(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(tk("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(tk("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(tk("libc",this.libc)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return cl.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return cl.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!XW.default.valid(e.range))throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(t);n||this.dependenciesMeta.set(t,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=this.peerDependenciesMeta.get(t);return i||this.peerDependenciesMeta.set(t,i={}),i}setRawField(e,t,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=t,a=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=Ot(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=te(N({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(Ot(o)),l=!1;if(t&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Wg(i).map(o=>({[Ot(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Wg(n).map(o=>({[Ot(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Wg(this.devDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Wg(this.peerDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of kn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of kn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?Pn(rr(An(o),l)):o,g=N({},c);t&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...kn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[eI(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},At=cl;At.fileName="package.json",At.allDependencies=["dependencies","devDependencies","peerDependencies"],At.hardDependencies=["dependencies","devDependencies"];function ZW(r){let e=r.match(/^[ \t]+/m);return e?e[0]:" "}function $W(r){return r.charCodeAt(0)===65279?r.slice(1):r}function un(r){return r.replace(/\\/g,"/")}function hw(r,{yamlCompatibilityMode:e}){return e?Nv(r):typeof r=="undefined"||typeof r=="boolean"?r:null}function e4(r,e){let t=e.search(/[^!]/);if(t===-1)return"invalid";let i=t%2==0?"":"!",n=e.slice(t);return`${i}${r}=${n}`}function tk(r,e){return e.length===1?e4(r,e[0]):`(${e.map(t=>e4(r,t)).join(" | ")})`}var D4=ge(P4()),R4=ge(require("stream")),F4=ge(require("string_decoder"));var sve=15,ct=class extends Error{constructor(e,t,i){super(t);this.reportExtra=i;this.reportCode=e}};function ove(r){return typeof r.reportCode!="undefined"}var Ji=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let t=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),t=l,c()},o=(l=0)=>{s(t+1)},a=async function*(){for(;t{t=o}),n=(0,D4.default)(o=>{let a=t;i=new Promise(l=>{t=l}),e=o,a()},1e3/sve),s=async function*(){for(;;)await i,yield{title:e}}();return{[Symbol.asyncIterator](){return s},hasProgress:!1,hasTitle:!0,setTitle:n}}async startProgressPromise(e,t){let i=this.reportProgress(e);try{return await t(e)}finally{i.stop()}}startProgressSync(e,t){let i=this.reportProgress(e);try{return t(e)}finally{i.stop()}}reportInfoOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportWarningOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportErrorOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportExceptionOnce(e){ove(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(X.EXCEPTION,e.stack||e.message,{key:e})}createStreamReporter(e=null){let t=new R4.PassThrough,i=new F4.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` +`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),t}};var yd=class{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){return await this.getFetcher(e,t).fetch(e,t)}tryFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));return i||null}getFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));if(!i)throw new ct(X.FETCHER_NOT_FOUND,`${It(t.project.configuration,e)} isn't supported by any available fetcher`);return i}};var wd=class{constructor(e){this.resolvers=e.filter(t=>t)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,t,i)}async getSatisfying(e,t,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,t,i)}async resolve(e,t){return await this.getResolverByLocator(e,t).resolve(e,t)}tryResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));return i||null}getResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));if(!i)throw new Error(`${sr(t.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));return i||null}getResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));if(!i)throw new Error(`${It(t.project.configuration,e)} isn't supported by any available resolver`);return i}};var N4=ge(ri());var zg=/^(?!v)[a-z0-9._-]+$/i,nk=class{supportsDescriptor(e,t){return!!(po(e.range)||zg.test(e.range))}supportsLocator(e,t){return!!(N4.default.valid(e.reference)||zg.test(e.reference))}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),t,i)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),t,i)}async getSatisfying(e,t,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),t,i)}async resolve(e,t){let i=await t.resolver.resolve(this.forwardLocator(e,t),t);return ld(i,e)}forwardDescriptor(e,t){return rr(e,`${t.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,t){return cn(e,`${t.project.configuration.get("defaultProtocol")}${e.reference}`)}};var Bd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n);return t.fetcher.getLocalPath(s,t)}async fetch(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n),o=await t.fetcher.fetch(s,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return Jg(e)}async ensureVirtualLink(e,t,i){let n=t.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Wr.makeVirtualPath(s,o,n),l=new Na(a,{baseFs:t.packageFs,pathUtils:k});return te(N({},t),{packageFs:l})}};var _g=class{static isVirtualDescriptor(e){return!!e.range.startsWith(_g.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(_g.protocol)}supportsDescriptor(e,t){return _g.isVirtualDescriptor(e)}supportsLocator(e,t){return _g.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,t,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,t,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},pw=_g;pw.protocol="virtual:";var bd=class{supports(e){return!!e.reference.startsWith(oi.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){let i=this.getWorkspace(e,t).cwd;return{packageFs:new _t(i),prefixPath:Me.dot,localPath:i}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(oi.protocol.length))}};var sk={};ft(sk,{getDefaultGlobalFolder:()=>ak,getHomeFolder:()=>Qd,isFolderInside:()=>Ak});var ok=ge(require("os"));function ak(){if(process.platform==="win32"){let r=H.toPortablePath(process.env.LOCALAPPDATA||H.join((0,ok.homedir)(),"AppData","Local"));return k.resolve(r,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let r=H.toPortablePath(process.env.XDG_DATA_HOME);return k.resolve(r,"yarn/berry")}return k.resolve(Qd(),".yarn/berry")}function Qd(){return H.toPortablePath((0,ok.homedir)()||"/usr/local/share")}function Ak(r,e){let t=k.relative(e,r);return t&&!t.startsWith("..")&&!k.isAbsolute(t)}var Vg={};ft(Vg,{builtinModules:()=>lk,getArchitecture:()=>Sd,getArchitectureName:()=>Ave,getArchitectureSet:()=>ck});var L4=ge(require("module"));function lk(){return new Set(L4.default.builtinModules||Object.keys(process.binding("natives")))}function ave(){var i,n,s,o;if(process.platform==="win32")return null;let e=(s=((n=(i=process.report)==null?void 0:i.getReport())!=null?n:{}).sharedObjects)!=null?s:[],t=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return(o=$p(e,a=>{let l=a.match(t);if(!l)return $p.skip;if(l[1])return"glibc";if(l[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")}))!=null?o:null}var dw,Cw;function Sd(){return dw=dw!=null?dw:{os:process.platform,cpu:process.arch,libc:ave()}}function Ave(r=Sd()){return r.libc?`${r.os}-${r.cpu}-${r.libc}`:`${r.os}-${r.cpu}`}function ck(){let r=Sd();return Cw=Cw!=null?Cw:{os:[r.os],cpu:[r.cpu],libc:r.libc?[r.libc]:[]}}var lve=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),Ew="yarn_",gk=".yarnrc.yml",fk="yarn.lock",cve="********",Ie;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(Ie||(Ie={}));var Ri=qe,hk={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:Ie.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:Ie.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:Ie.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:Ie.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:Ie.STRING,default:null},globalFolder:{description:"Folder where all system-global files are stored",type:Ie.ABSOLUTE_PATH,default:ak()},cacheFolder:{description:"Folder where the cache files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:Ie.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:lc},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:Ie.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:Ie.STRING,default:fk},installStatePath:{description:"Path of the file where the install state will be persisted",type:Ie.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:Ie.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:Ie.STRING,default:Iw()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:Ie.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:Ie.BOOLEAN,default:Py,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:Ie.BOOLEAN,default:Mv,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:Ie.BOOLEAN,default:mw.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:Ie.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:Ie.BOOLEAN,default:!mw.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:Ie.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:Ie.BOOLEAN,default:mw.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:Ie.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:Ie.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:Ie.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:Ie.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:Ie.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:Ie.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:Ie.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:Ie.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:Ie.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:Ie.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:Ie.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:Ie.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:Ie.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:Ie.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:Ie.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:Ie.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:Ie.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:Ie.STRING,values:Object.values(ho),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:Ie.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:Ie.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:Ie.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:Ie.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:Ie.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:Ie.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:Ie.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:Ie.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:Ie.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:Ie.MAP,valueDefinition:{description:"A range",type:Ie.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:Ie.MAP,valueDefinition:{description:"A semver range",type:Ie.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:Ie.MAP,valueDefinition:{description:"The peerDependency meta",type:Ie.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:Ie.BOOLEAN,default:!1}}}}}}}};function dk(r,e,t,i,n){if(i.isArray||i.type===Ie.ANY&&Array.isArray(t))return Array.isArray(t)?t.map((s,o)=>pk(r,`${e}[${o}]`,s,i,n)):String(t).split(/,/).map(s=>pk(r,e,s,i,n));if(Array.isArray(t))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return pk(r,e,t,i,n)}function pk(r,e,t,i,n){var a;switch(i.type){case Ie.ANY:return t;case Ie.SHAPE:return uve(r,e,t,i,n);case Ie.MAP:return gve(r,e,t,i,n)}if(t===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(t))return t;let o=(()=>{if(i.type===Ie.BOOLEAN&&typeof t!="string")return td(t);if(typeof t!="string")throw new Error(`Expected value (${t}) to be a string`);let l=Fv(t,{env:process.env});switch(i.type){case Ie.ABSOLUTE_PATH:return k.resolve(n,H.toPortablePath(l));case Ie.LOCATOR_LOOSE:return Yc(l,!1);case Ie.NUMBER:return parseInt(l);case Ie.LOCATOR:return Yc(l);case Ie.BOOLEAN:return td(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function uve(r,e,t,i,n){if(typeof t!="object"||Array.isArray(t))throw new Pe(`Object configuration settings "${e}" must be an object`);let s=Ck(r,i,{ignoreArrays:!0});if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=`${e}.${o}`;if(!i.properties[o])throw new Pe(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,dk(r,l,a,i.properties[o],n))}return s}function gve(r,e,t,i,n){let s=new Map;if(typeof t!="object"||Array.isArray(t))throw new Pe(`Map configuration settings "${e}" must be an object`);if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,dk(r,c,a,u,n))}return s}function Ck(r,e,{ignoreArrays:t=!1}={}){switch(e.type){case Ie.SHAPE:{if(e.isArray&&!t)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,Ck(r,s));return i}break;case Ie.MAP:return e.isArray&&!t?[]:new Map;case Ie.ABSOLUTE_PATH:return e.default===null?null:r.projectCwd===null?k.isAbsolute(e.default)?k.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>k.resolve(r.projectCwd,i)):k.resolve(r.projectCwd,e.default);default:return e.default}}function yw(r,e,t){if(e.type===Ie.SECRET&&typeof r=="string"&&t.hideSecrets)return cve;if(e.type===Ie.ABSOLUTE_PATH&&typeof r=="string"&&t.getNativePaths)return H.fromPortablePath(r);if(e.isArray&&Array.isArray(r)){let i=[];for(let n of r)i.push(yw(n,e,t));return i}if(e.type===Ie.MAP&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries())i.set(n,yw(s,e.valueDefinition,t));return i}if(e.type===Ie.SHAPE&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries()){let o=e.properties[n];i.set(n,yw(s,o,t))}return i}return r}function fve(){let r={};for(let[e,t]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(Ew)&&(e=(0,T4.default)(e.slice(Ew.length)),r[e]=t);return r}function Iw(){let r=`${Ew}rc_filename`;for(let[e,t]of Object.entries(process.env))if(e.toLowerCase()===r&&typeof t=="string")return t;return gk}var ul;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(ul||(ul={}));var tA=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,t,i){let n=new tA(e);typeof t!="undefined"&&!(t instanceof Map)&&(n.projectCwd=t),n.importSettings(hk);let s=typeof i!="undefined"?i:t instanceof Map?t:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,t,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=fve();delete a.rcFilename;let l=await tA.findRcFiles(e),c=await tA.findHomeRcFile();if(c){let b=l.find(v=>v.path===c.path);b?b.strict=!1:l.push(te(N({},c),{strict:!1}))}let u=({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T})=>({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}),g=Y=>{var $=Y,{ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}=$,q=Or($,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return q},f=new tA(e);f.importSettings(u(hk)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:b,cwd:v,data:x}of l)f.useWithSource(b,u(x),v,{strict:!1});if(s){let b=f.get("yarnPath"),v=f.get("ignorePath");if(b!==null&&!v)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await tA.findProjectCwd(e,h);break;case 1:p=await tA.findProjectCwd(e,null);break;case 2:K.existsSync(k.join(e,"package.json"))?p=k.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(hk));let m=new Map([["@@core",WW]]),y=b=>"default"in b?b.default:b;if(t!==null){for(let T of t.plugins.keys())m.set(T,y(t.modules.get(T)));let b=new Map;for(let T of lk())b.set(T,()=>Og(T));for(let[T,q]of t.modules)b.set(T,()=>q);let v=new Set,x=async(T,q)=>{let{factory:Y,name:$}=Og(T);if(v.has($))return;let _=new Map(b),ne=A=>{if(_.has(A))return _.get(A)();throw new Pe(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},ee=await Lg(async()=>y(await Y(ne)),A=>`${A} (when initializing ${$}, defined in ${q})`);b.set($,()=>ee),v.add($),m.set($,ee)};if(a.plugins)for(let T of a.plugins.split(";")){let q=k.resolve(e,H.toPortablePath(T));await x(q,"")}for(let{path:T,cwd:q,data:Y}of l)if(!!o&&!!Array.isArray(Y.plugins))for(let $ of Y.plugins){let _=typeof $!="string"?$.path:$,ne=k.resolve(q,H.toPortablePath(_));await x(ne,T)}}for(let[b,v]of m)f.activatePlugin(b,v);f.useWithSource("",g(a),e,{strict:n});for(let{path:b,cwd:v,data:x,strict:T}of l)f.useWithSource(b,g(x),v,{strict:T!=null?T:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let t=Iw(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=k.join(s,t);if(K.existsSync(o)){let a=await K.readFilePromise(o,"utf8"),l;try{l=Si(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new Pe(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=k.dirname(s)}return i}static async findHomeRcFile(){let e=Iw(),t=Qd(),i=k.join(t,e);if(K.existsSync(i)){let n=await K.readFilePromise(i,"utf8"),s=Si(n);return{path:i,cwd:t,data:s}}return null}static async findProjectCwd(e,t){let i=null,n=e,s=null;for(;n!==s;){if(s=n,K.existsSync(k.join(s,"package.json"))&&(i=s),t!==null){if(K.existsSync(k.join(s,t))){i=s;break}}else if(i!==null)break;n=k.dirname(s)}return i}static async updateConfiguration(e,t){let i=Iw(),n=k.join(e,i),s=K.existsSync(n)?Si(await K.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof t=="function"){try{a=t(s)}catch{a=t({})}if(a===s)return}else{a=s;for(let l of Object.keys(t)){let c=s[l],u=t[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await K.changeFilePromise(n,Ma(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let t=Qd();return await tA.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),typeof t.configuration!="undefined"&&this.importSettings(t.configuration)}importSettings(e){for(let[t,i]of Object.entries(e))if(i!=null){if(this.settings.has(t))throw new Error(`Cannot redefine settings "${t}"`);this.settings.set(t,i),this.values.set(t,Ck(this,i))}}useWithSource(e,t,i,n){try{this.use(e,t,i,n)}catch(s){throw s.message+=` (in ${tt(this,e,qe.PATH)})`,s}}use(e,t,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(t)]){if(typeof t[o]=="undefined"||o==="plugins"||e===""&&lve.has(o))continue;if(o==="rcFilename")throw new Pe(`The rcFilename settings can only be set via ${`${Ew}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new Pe(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===Ie.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=dk(this,o,t[o],l,i)}catch(u){throw u.message+=` in ${tt(this,e,qe.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===Ie.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new Pe(`Couldn't find a configuration settings named "${e}"`);return yw(n,s,{hideSecrets:t,getNativePaths:i})}getSubprocessStreams(e,{header:t,prefix:i,report:n}){let s,o,a=K.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${tt(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${tt(this,"STDERR","red")}`);s=new uk.PassThrough,s.pipe(l),s.pipe(a),o=new uk.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof t!="undefined"&&s.write(`${t} +`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let t of this.plugins.values())for(let i of t.resolvers||[])e.push(new i);return new wd([new pw,new oi,new nk,...e])}makeFetcher(){let e=[];for(let t of this.plugins.values())for(let i of t.fetchers||[])e.push(new i);return new yd([new Bd,new bd,...e])}getLinkers(){let e=[];for(let t of this.plugins.values())for(let i of t.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=Sd(),t=this.get("supportedArchitectures"),i=t.get("os");i!==null&&(i=i.map(o=>o==="current"?e.os:o));let n=t.get("cpu");n!==null&&(n=n.map(o=>o==="current"?e.cpu:o));let s=t.get("libc");return s!==null&&(s=zo(s,o=>{var a;return o==="current"?(a=e.libc)!=null?a:zo.skip:o})),{os:i,cpu:n,libc:s}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,t=(i,n,{userProvided:s=!1}={})=>{if(!po(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new At;o.load(n,{yamlCompatibilityMode:!0});let a=Fg(e,i.identHash),l=[];a.push([i.range,l]);let c={status:qi.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(te(N({},c),{type:wi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(te(N({},c),{type:wi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(te(N({},c),{type:wi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,t);for(let[i,n]of this.get("packageExtensions"))t(ll(i,!0),ky(n),{userProvided:!0})}normalizePackage(e){let t=cd(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!qc(s,o))for(let l of a)switch(l.status===qi.Inactive&&(l.status=qi.Redundant),l.type){case wi.Dependency:typeof t.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.dependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependency:typeof t.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependencyMeta:{let c=t.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=qi.Active,_a(t.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:Pv(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of t.peerDependenciesMeta.keys()){let o=An(s);t.peerDependencies.has(o.identHash)||t.peerDependencies.set(o.identHash,rr(o,"*"))}for(let s of t.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=$o("types",o),l=Ot(a);t.peerDependencies.has(a.identHash)||t.peerDependenciesMeta.has(l)||(t.peerDependencies.set(a.identHash,rr(a,"*")),t.peerDependenciesMeta.set(l,{optional:!0}))}return t.dependencies=new Map(kn(t.dependencies,([,s])=>Pn(s))),t.peerDependencies=new Map(kn(t.peerDependencies,([,s])=>Pn(s))),t}getLimit(e){return _a(this.limits,e,()=>(0,O4.default)(this.get(e)))}async triggerHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...t)}}async triggerMultipleHooks(e,t){for(let i of t)await this.triggerHook(e,...i)}async reduceHook(e,t,...i){let n=t;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...t);if(typeof o!="undefined")return o}return null}},ye=tA;ye.telemetry=null;var ss;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(ss||(ss={}));var ww=class extends ct{constructor({fileName:e,code:t,signal:i}){let n=ye.create(k.cwd()),s=tt(n,e,qe.PATH);super(X.EXCEPTION,`Child ${s} reported an error`,o=>{hve(t,i,{configuration:n,report:o})});this.code=Ek(t,i)}},Ik=class extends ww{constructor({fileName:e,code:t,signal:i,stdout:n,stderr:s}){super({fileName:e,code:t,signal:i});this.stdout=n,this.stderr=s}};function zc(r){return r!==null&&typeof r.fd=="number"}var _c=new Set;function yk(){}function wk(){for(let r of _c)r.kill()}async function ra(r,e,{cwd:t,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":zc(s)&&(c[0]=s),zc(o)&&(c[1]=o),zc(a)&&(c[2]=a);let u=(0,mk.default)(r,e,{cwd:H.fromPortablePath(t),env:te(N({},i),{PWD:H.fromPortablePath(t)}),stdio:c});_c.add(u),_c.size===1&&(process.on("SIGINT",yk),process.on("SIGTERM",wk)),!zc(s)&&s!==null&&s.pipe(u.stdin),zc(o)||u.stdout.pipe(o,{end:!1}),zc(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))zc(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,m)=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:Ek(p,m)}):h(new ww({fileName:r,code:p,signal:m}))})})}async function pve(r,e,{cwd:t,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=H.fromPortablePath(t);typeof i.PWD!="undefined"&&(i=te(N({},i),{PWD:c}));let u=(0,mk.default)(r,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",h=>{let p=ye.create(t),m=tt(p,r,qe.PATH);f(new ct(X.EXCEPTION,`Process ${m} failed to spawn`,y=>{y.reportError(X.EXCEPTION,` ${_o(p,{label:"Thrown Error",value:fo(qe.NO_HINT,h.message)})}`)}))}),u.on("close",(h,p)=>{let m=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),y=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:Ek(h,p),stdout:m,stderr:y}):f(new Ik({fileName:r,code:h,signal:p,stdout:m,stderr:y}))})})}var dve=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function Ek(r,e){let t=dve.get(e);return typeof t!="undefined"?128+t:r!=null?r:1}function hve(r,e,{configuration:t,report:i}){i.reportError(X.EXCEPTION,` ${_o(t,r!==null?{label:"Exit Code",value:fo(qe.NUMBER,r)}:{label:"Exit Signal",value:fo(qe.CODE,e)})}`)}var ir={};ft(ir,{Method:()=>Cl,RequestError:()=>w5.RequestError,del:()=>xPe,get:()=>SPe,getNetworkSettings:()=>S5,post:()=>HP,put:()=>vPe,request:()=>Od});var E5=ge(Uw()),I5=ge(require("https")),y5=ge(require("http")),MP=ge(is()),KP=ge(m5()),Hw=ge(require("url"));var w5=ge(Uw()),B5=new Map,b5=new Map,wPe=new y5.Agent({keepAlive:!0}),BPe=new I5.Agent({keepAlive:!0});function Q5(r){let e=new Hw.URL(r),t={host:e.hostname,headers:{}};return e.port&&(t.port=Number(e.port)),{proxy:t}}async function UP(r){return _a(b5,r,()=>K.readFilePromise(r).then(e=>(b5.set(r,e),e)))}function bPe({statusCode:r,statusMessage:e},t){let i=tt(t,r,qe.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${r}`;return Mg(t,`${i}${e?` (${e})`:""}`,n)}async function jw(r,{configuration:e,customErrorMessage:t}){var i,n;try{return await r}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=t==null?void 0:t(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof E5.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${tt(e,"httpTimeout",qe.SETTING)})`);let a=new ct(X.NETWORK_ERROR,o,l=>{s.response&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Response Code",value:fo(qe.NO_HINT,bPe(s.response,e))})}`),s.request&&(l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Method",value:fo(qe.NO_HINT,s.request.options.method)})}`),l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request URL",value:fo(qe.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Redirects",value:fo(qe.NO_HINT,Uv(e,s.request.redirects,qe.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Retry Count",value:fo(qe.NO_HINT,`${tt(e,s.request.retryCount,qe.NUMBER)} (can be increased via ${tt(e,"httpRetry",qe.SETTING)})`)})}`)});throw a.originalError=s,a}}function S5(r,e){let t=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},n=Object.keys(i),s=typeof r=="string"?new Hw.URL(r):r;for(let[o,a]of t)if(MP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var Cl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(Cl||(Cl={}));async function Od(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=async()=>await QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o});return await(await t.reduceHook(c=>c.wrapNetworkRequest,a,{target:r,body:e,configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o}))()}async function SPe(r,n){var s=n,{configuration:e,jsonResponse:t}=s,i=Or(s,["configuration","jsonResponse"]);let o=_a(B5,r,()=>jw(Od(r,null,N({configuration:e},i)),{configuration:e}).then(a=>(B5.set(r,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),t?JSON.parse(o.toString()):o}async function vPe(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.PUT})),i)).body}async function HP(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.POST})),i)).body}async function xPe(r,i){var n=i,{customErrorMessage:e}=n,t=Or(n,["customErrorMessage"]);return(await jw(Od(r,null,te(N({},t),{method:Cl.DELETE})),t)).body}async function QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=typeof r=="string"?new Hw.URL(r):r,l=S5(a,{configuration:t});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!MP.default.isMatch(a.hostname,t.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?KP.default.httpOverHttp(Q5(l.httpProxy)):wPe,https:l.httpsProxy?KP.default.httpsOverHttp(Q5(l.httpsProxy)):BPe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=t.get("httpTimeout"),f=t.get("httpRetry"),h=t.get("enableStrictSsl"),p=l.caFilePath,m=l.httpsCertFilePath,y=l.httpsKeyFilePath,{default:b}=await Promise.resolve().then(()=>ge(Uw())),v=p?await UP(p):void 0,x=m?await UP(m):void 0,T=y?await UP(y):void 0,q=b.extend(N({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:v,certificate:x,key:T}},u));return t.getLimit("networkConcurrency")(()=>q(a))}var Zt={};ft(Zt,{PackageManager:()=>hn,detectPackageManager:()=>K9,executePackageAccessibleBinary:()=>Y9,executePackageScript:()=>nB,executePackageShellcode:()=>rD,executeWorkspaceAccessibleBinary:()=>WDe,executeWorkspaceLifecycleScript:()=>G9,executeWorkspaceScript:()=>j9,getPackageAccessibleBinaries:()=>sB,getWorkspaceAccessibleBinaries:()=>H9,hasPackageScript:()=>YDe,hasWorkspaceScript:()=>tD,makeScriptEnv:()=>Yd,maybeExecuteWorkspaceLifecycleScript:()=>JDe,prepareExternalProject:()=>GDe});var Md={};ft(Md,{getLibzipPromise:()=>fn,getLibzipSync:()=>D5});var P5=ge(x5());var ml=["number","number"],YP;(function(L){L[L.ZIP_ER_OK=0]="ZIP_ER_OK",L[L.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",L[L.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",L[L.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",L[L.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",L[L.ZIP_ER_READ=5]="ZIP_ER_READ",L[L.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",L[L.ZIP_ER_CRC=7]="ZIP_ER_CRC",L[L.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",L[L.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",L[L.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",L[L.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",L[L.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",L[L.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",L[L.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",L[L.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",L[L.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",L[L.ZIP_ER_EOF=17]="ZIP_ER_EOF",L[L.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",L[L.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",L[L.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",L[L.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",L[L.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",L[L.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",L[L.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",L[L.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",L[L.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",L[L.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",L[L.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",L[L.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",L[L.ZIP_ER_TELL=30]="ZIP_ER_TELL",L[L.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(YP||(YP={}));var k5=r=>({get HEAP8(){return r.HEAP8},get HEAPU8(){return r.HEAPU8},errors:YP,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:r._malloc(1),uint16S:r._malloc(2),uint32S:r._malloc(4),uint64S:r._malloc(8),malloc:r._malloc,free:r._free,getValue:r.getValue,open:r.cwrap("zip_open","number",["string","number","number"]),openFromSource:r.cwrap("zip_open_from_source","number",["number","number","number"]),close:r.cwrap("zip_close","number",["number"]),discard:r.cwrap("zip_discard",null,["number"]),getError:r.cwrap("zip_get_error","number",["number"]),getName:r.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:r.cwrap("zip_get_num_entries","number",["number","number"]),delete:r.cwrap("zip_delete","number",["number","number"]),stat:r.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:r.cwrap("zip_stat_index","number",["number",...ml,"number","number"]),fopen:r.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:r.cwrap("zip_fopen_index","number",["number",...ml,"number"]),fread:r.cwrap("zip_fread","number",["number","number","number","number"]),fclose:r.cwrap("zip_fclose","number",["number"]),dir:{add:r.cwrap("zip_dir_add","number",["number","string"])},file:{add:r.cwrap("zip_file_add","number",["number","string","number","number"]),getError:r.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:r.cwrap("zip_file_get_external_attributes","number",["number",...ml,"number","number","number"]),setExternalAttributes:r.cwrap("zip_file_set_external_attributes","number",["number",...ml,"number","number","number"]),setMtime:r.cwrap("zip_file_set_mtime","number",["number",...ml,"number","number"]),setCompression:r.cwrap("zip_set_file_compression","number",["number",...ml,"number","number"])},ext:{countSymlinks:r.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:r.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:r.cwrap("zip_error_strerror","string",["number"])},name:{locate:r.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:r.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:r.cwrap("zip_source_buffer","number",["number","number",...ml,"number"]),free:r.cwrap("zip_source_free",null,["number"]),keep:r.cwrap("zip_source_keep",null,["number"]),open:r.cwrap("zip_source_open","number",["number"]),close:r.cwrap("zip_source_close","number",["number"]),seek:r.cwrap("zip_source_seek","number",["number",...ml,"number"]),tell:r.cwrap("zip_source_tell","number",["number"]),read:r.cwrap("zip_source_read","number",["number","number","number"]),error:r.cwrap("zip_source_error","number",["number"]),setMtime:r.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:r.cwrap("zipstruct_stat","number",[]),statS:r.cwrap("zipstruct_statS","number",[]),statName:r.cwrap("zipstruct_stat_name","string",["number"]),statIndex:r.cwrap("zipstruct_stat_index","number",["number"]),statSize:r.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:r.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:r.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:r.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:r.cwrap("zipstruct_stat_crc","number",["number"]),error:r.cwrap("zipstruct_error","number",[]),errorS:r.cwrap("zipstruct_errorS","number",[]),errorCodeZip:r.cwrap("zipstruct_error_code_zip","number",["number"])}});var qP=null;function D5(){return qP===null&&(qP=k5((0,P5.default)())),qP}async function fn(){return D5()}var Ud={};ft(Ud,{ShellError:()=>Ms,execute:()=>Xw,globUtils:()=>Yw});var G5=ge(uv()),Y5=ge(require("os")),os=ge(require("stream")),q5=ge(require("util"));var Ms=class extends Error{constructor(e){super(e);this.name="ShellError"}};var Yw={};ft(Yw,{fastGlobOptions:()=>N5,isBraceExpansion:()=>L5,isGlobPattern:()=>kPe,match:()=>PPe,micromatchOptions:()=>Jw});var R5=ge(Zy()),F5=ge(require("fs")),qw=ge(is()),Jw={strictBrackets:!0},N5={onlyDirectories:!1,onlyFiles:!1};function kPe(r){if(!qw.default.scan(r,Jw).isGlob)return!1;try{qw.default.parse(r,Jw)}catch{return!1}return!0}function PPe(r,{cwd:e,baseFs:t}){return(0,R5.default)(r,te(N({},N5),{cwd:H.fromPortablePath(e),fs:WE(F5.default,new Vh(t))}))}function L5(r){return qw.default.scan(r,Jw).isBrace}var T5=ge(SQ()),na=ge(require("stream")),O5=ge(require("string_decoder")),Fn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(Fn||(Fn={}));var Xc=new Set;function JP(){}function WP(){for(let r of Xc)r.kill()}function M5(r,e,t,i){return n=>{let s=n[0]instanceof na.Transform?"pipe":n[0],o=n[1]instanceof na.Transform?"pipe":n[1],a=n[2]instanceof na.Transform?"pipe":n[2],l=(0,T5.default)(r,e,te(N({},i),{stdio:[s,o,a]}));return Xc.add(l),Xc.size===1&&(process.on("SIGINT",JP),process.on("SIGTERM",WP)),n[0]instanceof na.Transform&&n[0].pipe(l.stdin),n[1]instanceof na.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof na.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),u.code){case"ENOENT":n[2].write(`command not found: ${r} +`),c(127);break;case"EACCES":n[2].write(`permission denied: ${r} +`),c(128);break;default:n[2].write(`uncaught error: ${u.message} +`),c(1);break}}),l.on("close",u=>{Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),c(u!==null?u:129)})})}}}function K5(r){return e=>{let t=e[0]==="pipe"?new na.PassThrough:e[0];return{stdin:t,promise:Promise.resolve().then(()=>r({stdin:t,stdout:e[1],stderr:e[2]}))}}}var mo=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},U5=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Kd=class{constructor(e,t){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:i,stderr:n}){let s=new Kd(null,e);return s.stdin=t,s.stdout=i,s.stderr=n,s}pipeTo(e,t=1){let i=new Kd(this,e),n=new U5;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(t&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(t&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let t;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");t=this.stdout,e[1]=t.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(t.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function Ww(r,e){return Kd.start(r,e)}function H5(r,e=null){let t=new na.PassThrough,i=new O5.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` +`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",r(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&r(e!==null?`${e} ${s}`:s)}),t}function j5(r,{prefix:e}){return{stdout:H5(t=>r.stdout.write(`${t} +`),r.stdout.isTTY?e:null),stderr:H5(t=>r.stderr.write(`${t} +`),r.stderr.isTTY?e:null)}}var DPe=(0,q5.promisify)(setTimeout);var zi;(function(t){t[t.Readable=1]="Readable",t[t.Writable=2]="Writable"})(zi||(zi={}));function J5(r,e,t){let i=new os.PassThrough({autoDestroy:!0});switch(r){case Fn.STDIN:(e&1)==1&&t.stdin.pipe(i,{end:!1}),(e&2)==2&&t.stdin instanceof os.Writable&&i.pipe(t.stdin,{end:!1});break;case Fn.STDOUT:(e&1)==1&&t.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stdout,{end:!1});break;case Fn.STDERR:(e&1)==1&&t.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stderr,{end:!1});break;default:throw new Ms(`Bad file descriptor: "${r}"`)}return i}function zw(r,e={}){let t=N(N({},r),e);return t.environment=N(N({},r.environment),e.environment),t.variables=N(N({},r.variables),e.variables),t}var RPe=new Map([["cd",async([r=(0,Y5.homedir)(),...e],t,i)=>{let n=k.resolve(i.cwd,H.toPortablePath(r));if(!(await t.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new Ms(`cd: no such file or directory: ${r}`):o})).isDirectory())throw new Ms(`cd: not a directory: ${r}`);return i.cwd=n,0}],["pwd",async(r,e,t)=>(t.stdout.write(`${H.fromPortablePath(t.cwd)} +`),0)],[":",async(r,e,t)=>0],["true",async(r,e,t)=>0],["false",async(r,e,t)=>1],["exit",async([r,...e],t,i)=>i.exitCode=parseInt(r!=null?r:i.variables["?"],10)],["echo",async(r,e,t)=>(t.stdout.write(`${r.join(" ")} +`),0)],["sleep",async([r],e,t)=>{if(typeof r=="undefined")throw new Ms("sleep: missing operand");let i=Number(r);if(Number.isNaN(i))throw new Ms(`sleep: invalid time interval '${r}'`);return await DPe(1e3*i,0)}],["__ysh_run_procedure",async(r,e,t)=>{let i=t.procedures[r[0]];return await Ww(i,{stdin:new mo(t.stdin),stdout:new mo(t.stdout),stderr:new mo(t.stderr)}).run()}],["__ysh_set_redirects",async(r,e,t)=>{let i=t.stdin,n=t.stdout,s=t.stderr,o=[],a=[],l=[],c=0;for(;r[c]!=="--";){let g=r[c++],{type:f,fd:h}=JSON.parse(g),p=v=>{switch(h){case null:case 0:o.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=v=>{switch(h){case null:case 1:a.push(v);break;case 2:l.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},y=Number(r[c++]),b=c+y;for(let v=c;ve.baseFs.createReadStream(k.resolve(t.cwd,H.toPortablePath(r[v]))));break;case"<<<":p(()=>{let x=new os.PassThrough;return process.nextTick(()=>{x.write(`${r[v]} +`),x.end()}),x});break;case"<&":p(()=>J5(Number(r[v]),1,t));break;case">":case">>":{let x=k.resolve(t.cwd,H.toPortablePath(r[v]));m(x==="/dev/null"?new os.Writable({autoDestroy:!0,emitClose:!0,write(T,q,Y){setImmediate(Y)}}):e.baseFs.createWriteStream(x,f===">>"?{flags:"a"}:void 0))}break;case">&":m(J5(Number(r[v]),2,t));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new os.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new os.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new os.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await Ww(Hd(r.slice(c+1),e,t),{stdin:new mo(i),stdout:new mo(n),stderr:new mo(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function FPe(r,e,t){let i=[],n=new os.PassThrough;return n.on("data",s=>i.push(s)),await _w(r,e,zw(t,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function W5(r,e,t){let i=r.map(async s=>{let o=await aA(s.args,e,t);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function Vw(r){return r.match(/[^ \r\n\t]+/g)||[]}async function z5(r,e,t,i,n=i){switch(r.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(r.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=Vw(s);for(let a=0;a=0&&sr+e,subtraction:(r,e)=>r-e,multiplication:(r,e)=>r*e,division:(r,e)=>Math.trunc(r/e)};async function jd(r,e,t){if(r.type==="number"){if(Number.isInteger(r.value))return r.value;throw new Error(`Invalid number: "${r.value}", only integers are allowed`)}else if(r.type==="variable"){let i=[];await z5(te(N({},r),{quoted:!0}),e,t,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?jd({type:"variable",name:i.join(" ")},e,t):jd({type:"number",value:n},e,t)}else return NPe[r.type](await jd(r.left,e,t),await jd(r.right,e,t))}async function aA(r,e,t){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of r){let g=!1;switch(u.type){case"redirection":{let f=await aA(u.args,e,t);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await FPe(f.shell,e,t);if(f.quoted)o(h);else{let p=Vw(h);for(let m=0;m0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Hd(r,e,t){e.builtins.has(r[0])||(r=["command",...r]);let i=H.fromPortablePath(t.cwd),n=t.environment;typeof n.PWD!="undefined"&&(n=te(N({},n),{PWD:i}));let[s,...o]=r;if(s==="command")return M5(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return K5(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=t;t.stdin=l,t.stdout=c,t.stderr=u;try{return await a(o,e,t)}finally{t.stdin=g,t.stdout=f,t.stderr=h}})}function LPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,zw(t,{stdin:n}));return{stdin:n,promise:s}}}function TPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,t);return{stdin:n,promise:s}}}function _5(r,e,t,i){if(e.length===0)return r;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=N({},i.procedures),i.procedures[n]=r,Hd([...e,"__ysh_run_procedure",n],t,i)}}async function V5(r,e,t){let i=r,n=null,s=null;for(;i;){let o=i.then?N({},t):t,a;switch(i.type){case"command":{let l=await aA(i.args,e,t),c=await W5(i.envs,e,t);a=i.envs.length?Hd(l,e,zw(o,{environment:c})):Hd(l,e,o)}break;case"subshell":{let l=await aA(i.args,e,t),c=LPe(i.subshell,e,o);a=_5(c,l,e,o)}break;case"group":{let l=await aA(i.args,e,t),c=TPe(i.group,e,o);a=_5(c,l,e,o)}break;case"envs":{let l=await W5(i.envs,e,t);o.environment=N(N({},o.environment),l),a=Hd(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=Ww(a,{stdin:new mo(o.stdin),stdout:new mo(o.stdout),stderr:new mo(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,Fn.STDOUT);break;case"|&":s=s.pipeTo(a,Fn.STDOUT|Fn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function OPe(r,e,t,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return G5.default.hex(a)}if(i){let s=t.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=j5(t,{prefix:l});return t.backgroundJobs.push(V5(r,e,zw(t,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} +`)).finally(()=>{t.stdout.isTTY&&t.stdout.write(`Job ${l}, '${o(eg(r))}' has ended +`)})),0}return await V5(r,e,t)}async function MPe(r,e,t,{background:i=!1}={}){let n,s=a=>{n=a,t.variables["?"]=String(a)},o=async a=>{try{return await OPe(a.chain,e,t,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof Ms))throw l;return t.stderr.write(`${l.message} +`),1}};for(s(await o(r));r.then;){if(t.exitCode!==null)return t.exitCode;switch(r.then.type){case"&&":n===0&&s(await o(r.then.line));break;case"||":n!==0&&s(await o(r.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${r.then.type}"`)}r=r.then.line}return n}async function _w(r,e,t){let i=t.backgroundJobs;t.backgroundJobs=[];let n=0;for(let{command:s,type:o}of r){if(n=await MPe(s,e,t,{background:o==="&"}),t.exitCode!==null)return t.exitCode;t.variables["?"]=String(n)}return await Promise.all(t.backgroundJobs),t.backgroundJobs=i,n}function X5(r){switch(r.type){case"variable":return r.name==="@"||r.name==="#"||r.name==="*"||Number.isFinite(parseInt(r.name,10))||"defaultValue"in r&&!!r.defaultValue&&r.defaultValue.some(e=>Gd(e))||"alternativeValue"in r&&!!r.alternativeValue&&r.alternativeValue.some(e=>Gd(e));case"arithmetic":return zP(r.arithmetic);case"shell":return _P(r.shell);default:return!1}}function Gd(r){switch(r.type){case"redirection":return r.args.some(e=>Gd(e));case"argument":return r.segments.some(e=>X5(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${r.type}"`)}}function zP(r){switch(r.type){case"variable":return X5(r);case"number":return!1;default:return zP(r.left)||zP(r.right)}}function _P(r){return r.some(({command:e})=>{for(;e;){let t=e.chain;for(;t;){let i;switch(t.type){case"subshell":i=_P(t.subshell);break;case"command":i=t.envs.some(n=>n.args.some(s=>Gd(s)))||t.args.some(n=>Gd(n));break}if(i)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Xw(r,e=[],{baseFs:t=new ar,builtins:i={},cwd:n=H.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=Yw}={}){let g={};for(let[p,m]of Object.entries(s))typeof m!="undefined"&&(g[p]=m);let f=new Map(RPe);for(let[p,m]of Object.entries(i))f.set(p,m);o===null&&(o=new os.PassThrough,o.end());let h=_E(r,u);if(!_P(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let m=p.chain;for(;m.then;)m=m.then.chain;m.type==="command"&&(m.args=m.args.concat(e.map(y=>({type:"argument",segments:[{type:"text",text:y}]}))))}return await _w(h,{args:e,baseFs:t,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var O9=ge(Zw()),M9=ge(gg()),El=ge(require("stream"));var R9=ge(D9()),tB=ge(Ic());var F9=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],N9=80,TDe=new Set([X.FETCH_NOT_CACHED,X.UNUSED_CACHE_ENTRY]),ODe=5,rB=tB.default.GITHUB_ACTIONS?{start:r=>`::group::${r} +`,end:r=>`::endgroup:: +`}:tB.default.TRAVIS?{start:r=>`travis_fold:start:${r} +`,end:r=>`travis_fold:end:${r} +`}:tB.default.GITLAB?{start:r=>`section_start:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${r} +`,end:r=>`section_end:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}\r`}:null,L9=new Date,MDe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,KDe=r=>r,iB=KDe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),UDe=MDe&&Object.keys(iB).find(r=>{let e=iB[r];return!(e.date&&(e.date[0]!==L9.getDate()||e.date[1]!==L9.getMonth()+1))})||"default";function T9(r,{configuration:e,json:t}){if(!e.get("enableMessageNames"))return"";let n=_A(r===null?0:r);return!t&&r===null?tt(e,n,"grey"):n}function eD(r,{configuration:e,json:t}){let i=T9(r,{configuration:e,json:t});if(!i||r===null||r===X.UNNAMED)return i;let n=X[r],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Mg(e,i,s)}var Je=class extends Ji{constructor({configuration:e,stdout:t,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=ODe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(nd(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...TDe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=t,e.get("enableProgressBars")&&!i&&t.isTTY&&t.columns>22){let u=e.get("progressBarStyle")||UDe;if(!Object.prototype.hasOwnProperty.call(iB,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=iB[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(t.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}}static async start(e,t){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(X.UNNAMED,a)};try{await t(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,t){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof t!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(X.FETCH_NOT_CACHED,t)}startSectionSync({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}async startSectionPromise({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return await n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}startTimerImpl(e,t,i){let n=typeof t=="function"?{}:t;return{cb:typeof t=="function"?t:i,reportHeader:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.start(e))},reportFooter:o=>{this.indent-=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.end(e)),this.configuration.get("enableTimers")&&o>200?this.reportInfo(null,`\u2514 Completed in ${tt(this.configuration,o,qe.DURATION)}`):this.reportInfo(null,"\u2514 Completed")},skipIfEmpty:n.skipIfEmpty}}startTimerSync(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionSync(s,n)}async startTimerPromise(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionPromise(s,n)}async startCacheReport(e){let t=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{t!==null&&this.reportCacheChanges(t)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,t){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${tt(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${t}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,t){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${t}`)}reportError(e,t){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${t}`,{truncate:!1})}reportProgress(e){if(this.progressStyle===null)return te(N({},Promise.resolve()),{stop:()=>{}});if(e.hasProgress&&e.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let t=!1,i=Promise.resolve().then(async()=>{let s={progress:e.hasProgress?0:void 0,title:e.hasTitle?"":void 0};this.progress.set(e,{definition:s,lastScaledSize:e.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:o,title:a}of e)t||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{t||(t=!0,this.progress.delete(e),this.refreshProgress({delta:1}))};return te(N({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let t=tt(this.configuration,Date.now()-this.startTime,qe.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${t}`:e;this.errorCount>0?this.reportError(X.UNNAMED,i):this.warningCount>0?this.reportWarning(X.UNNAMED,i):this.reportInfo(X.UNNAMED,i)}writeLine(e,{truncate:t}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:t})} +`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:t}={}){this.forgettableLines=[],this.writeLine(e,{truncate:t})}writeLines(e,{truncate:t}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:t})} +`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:t}){let i=this.cacheHitCount-e,n=this.cacheMissCount-t;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${It(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${It(this.configuration,this.lastCacheMiss)})`),this.reportInfo(X.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let t of e)t.committed=!0,t.action()}clearProgress({delta:e=0,clear:t=!1}){this.progressStyle!==null&&this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||t)&&this.stdout.write(""))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>N9&&(this.progressFrame=(this.progressFrame+1)%F9.length,this.progressTime=e);let t=F9[this.progressFrame];for(let i of this.progress.values()){let n="";if(typeof i.lastScaledSize!="undefined"){let l=this.progressStyle.chars[0].repeat(i.lastScaledSize),c=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize);n=` ${l}${c}`}let s=this.formatName(null),o=s?`${s}: `:"",a=i.definition.title?` ${i.definition.title}`:"";this.stdout.write(`${tt(this.configuration,"\u27A4","blueBright")} ${o}${t}${n}${a} +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},N9)}refreshProgress({delta:e=0,force:t=!1}={}){let i=!1,n=!1;if(t||this.progress.size===0)i=!0;else for(let s of this.progress.values()){let o=typeof s.definition.progress!="undefined"?Math.trunc(this.progressMaxScaledSize*s.definition.progress):void 0,a=s.lastScaledSize;s.lastScaledSize=o;let l=s.lastTitle;if(s.lastTitle=s.definition.title,o!==a||(n=l!==s.definition.title)){i=!0;break}}i&&(this.clearProgress({delta:e,clear:n}),this.writeProgress())}truncate(e,{truncate:t}={}){return this.progressStyle===null&&(t=!1),typeof t=="undefined"&&(t=this.configuration.get("preferTruncatedLines")),t&&(e=(0,R9.default)(e,0,this.stdout.columns-1)),e}formatName(e){return T9(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Ur="3.2.2";var hn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(hn||(hn={}));async function AA(r,e,t,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${t}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await K.writeFilePromise(k.format({dir:r,name:e,ext:".cmd"}),n)}await K.writeFilePromise(k.join(r,e),`#!/bin/sh +exec "${t}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" +`,{mode:493})}async function K9(r){let e=await At.tryFind(r);if(e==null?void 0:e.packageManager){let i=lw(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?hn.Yarn1:hn.Yarn2,reason:n};case"npm":return{packageManager:hn.Npm,reason:n};case"pnpm":return{packageManager:hn.Pnpm,reason:n}}}}let t;try{t=await K.readFilePromise(k.join(r,kt.lockfile),"utf8")}catch{}return t!==void 0?t.match(/^__metadata:$/m)?{packageManager:hn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:hn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:K.existsSync(k.join(r,"package-lock.json"))?{packageManager:hn.Npm,reason:`found npm's "package-lock.json" lockfile`}:K.existsSync(k.join(r,"pnpm-lock.yaml"))?{packageManager:hn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Yd({project:r,locator:e,binFolder:t,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=H.fromPortablePath(t);n.BERRY_BIN_FOLDER=H.fromPortablePath(s);let o=process.env.COREPACK_ROOT?H.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([AA(t,"node",process.execPath),...Ur!==null?[AA(t,"run",process.execPath,[o,"run"]),AA(t,"yarn",process.execPath,[o]),AA(t,"yarnpkg",process.execPath,[o]),AA(t,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),r&&(n.INIT_CWD=H.fromPortablePath(r.configuration.startingCwd),n.PROJECT_CWD=H.fromPortablePath(r.cwd)),n.PATH=n.PATH?`${s}${H.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${H.sep}yarn`,n.npm_node_execpath=`${s}${H.sep}node`,e){if(!r)throw new Error("Assertion failed: Missing project");let u=r.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=r.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=Ot(e),n.npm_package_version=g;let f;if(u)f=u.cwd;else{let h=r.storedPackages.get(e.locatorHash);if(!h)throw new Error(`Package for ${It(r.configuration,e)} not found in the project`);let p=r.configuration.getLinkers(),m={project:r,report:new Je({stdout:new El.PassThrough,configuration:r.configuration})},y=p.find(b=>b.supportsPackage(h,m));if(!y)throw new Error(`The package ${It(r.configuration,h)} isn't supported by any of the available linkers`);f=await y.findPackageLocation(h,m)}n.npm_package_json=H.fromPortablePath(k.join(f,kt.manifest))}let a=Ur!==null?`yarn/${Ur}`:`yarn/${Og("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.version} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),r&&await r.configuration.triggerHook(u=>u.setupScriptEnvironment,r,n,async(u,g,f)=>await AA(t,Jr(u),g,f)),n}var HDe=2,jDe=(0,M9.default)(HDe);async function GDe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await jDe(async()=>{await K.mktempPromise(async o=>{let a=k.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=t.getSubprocessStreams(a,{prefix:H.fromPortablePath(r),report:i}),g=s&&ea(s)?gd(s):s,f=g?Rs(g):"an external project";c.write(`Packing ${f} from sources +`);let h=await K9(r),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} + +`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn + +`),p=hn.Yarn2),await K.mktempPromise(async m=>{let y=await Yd({binFolder:m}),v=new Map([[hn.Yarn1,async()=>{let T=n!==null?["workspace",n]:[],q=await ra("yarn",["set","version","classic","--only-if-needed"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;await K.appendFilePromise(k.join(r,".npmignore"),`/.yarn +`),c.write(` +`),delete y.NODE_ENV;let Y=await ra("yarn",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(Y.code!==0)return Y.code;c.write(` +`);let $=await ra("yarn",[...T,"pack","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return $.code!==0?$.code:0}],[hn.Yarn2,async()=>{let T=n!==null?["workspace",n]:[];y.YARN_ENABLE_INLINE_BUILDS="1";let q=k.join(r,kt.lockfile);await K.existsPromise(q)||await K.writeFilePromise(q,"");let Y=await ra("yarn",[...T,"pack","--install-if-needed","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return Y.code!==0?Y.code:0}],[hn.Npm,async()=>{if(n!==null){let A=new El.PassThrough,oe=Tg(A);A.pipe(c,{end:!1});let ce=await ra("npm",["--version"],{cwd:r,env:y,stdin:l,stdout:A,stderr:u,end:ss.Never});if(A.end(),ce.code!==0)return c.end(),u.end(),ce.code;let Z=(await oe).toString().trim();if(!qc(Z,">=7.x")){let O=$o(null,"npm"),L=rr(O,Z),de=rr(O,">=7.x");throw new Error(`Workspaces aren't supported by ${sr(t,L)}; please upgrade to ${sr(t,de)} (npm has been detected as the primary package manager for ${tt(t,r,qe.PATH)})`)}}let T=n!==null?["--workspace",n]:[];delete y.npm_config_user_agent,delete y.npm_config_production,delete y.NPM_CONFIG_PRODUCTION,delete y.NODE_ENV;let q=await ra("npm",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;let Y=new El.PassThrough,$=Tg(Y);Y.pipe(c);let _=await ra("npm",["pack","--silent",...T],{cwd:r,env:y,stdin:l,stdout:Y,stderr:u});if(_.code!==0)return _.code;let ne=(await $).toString().trim().replace(/^.*\n/s,""),ee=k.resolve(r,H.toPortablePath(ne));return await K.renamePromise(ee,e),0}]]).get(p);if(typeof v=="undefined")throw new Error("Assertion failed: Unsupported workflow");let x=await v();if(!(x===0||typeof x=="undefined"))throw K.detachTemp(o),new ct(X.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${x}, logs can be found here: ${tt(t,a,qe.PATH)})`)})})})}async function YDe(r,e,{project:t}){let i=t.tryWorkspaceByLocator(r);if(i!==null)return tD(i,e);let n=t.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t.configuration,r)} not found in the project`);return await Is.openPromise(async s=>{let o=t.configuration,a=t.configuration.getLinkers(),l={project:t,report:new Je({stdout:new El.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${It(t.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new _t(u,{baseFs:s});return(await At.find(Me.dot,{baseFs:g})).scripts.has(e)},{libzip:await fn()})}async function nB(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await U9(r,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await Xw(f,t,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(m=>m.wrapScriptExecution,h,n,r,e,{script:f,args:t,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function rD(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{env:c,cwd:u}=await U9(r,{project:n,binFolder:l,cwd:i});return await Xw(e,t,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function qDe(r,{binFolder:e,cwd:t,lifecycleScript:i}){let n=await Yd({project:r.project,locator:r.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await H9(r),([s,[,o]])=>AA(e,Jr(s),process.execPath,[o]))),typeof t=="undefined"&&(t=k.dirname(await K.realpathPromise(k.join(r.cwd,"package.json")))),{manifest:r.manifest,binFolder:e,env:n,cwd:t}}async function U9(r,{project:e,binFolder:t,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(r);if(s!==null)return qDe(s,{binFolder:t,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(r.locatorHash);if(!o)throw new Error(`Package for ${It(e.configuration,r)} not found in the project`);return await Is.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Je({stdout:new El.PassThrough,configuration:l})},g=c.find(y=>y.supportsPackage(o,u));if(!g)throw new Error(`The package ${It(e.configuration,o)} isn't supported by any of the available linkers`);let f=await Yd({project:e,locator:r,binFolder:t,lifecycleScript:n});await Promise.all(Array.from(await sB(r,{project:e}),([y,[,b]])=>AA(t,Jr(y),process.execPath,[b])));let h=await g.findPackageLocation(o,u),p=new _t(h,{baseFs:a}),m=await At.find(Me.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:m,binFolder:t,env:f,cwd:i}},{libzip:await fn()})}async function j9(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o}){return await nB(r.anchoredLocator,e,t,{cwd:i,project:r.project,stdin:n,stdout:s,stderr:o})}function tD(r,e){return r.manifest.scripts.has(e)}async function G9(r,e,{cwd:t,report:i}){let{configuration:n}=r.project,s=null;await K.mktempPromise(async o=>{let a=k.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${H.fromPortablePath(r.cwd)}") +`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:It(n,r.anchoredLocator),header:l});i.reportInfo(X.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await j9(r,e,[],{cwd:t,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw K.detachTemp(o),new ct(X.LIFECYCLE_SCRIPT,`${(0,O9.default)(e)} script failed (exit code ${tt(n,g,qe.NUMBER)}, logs can be found here: ${tt(n,a,qe.PATH)}); run ${tt(n,`yarn ${e}`,qe.CODE)} to investigate`)})}async function JDe(r,e,t){tD(r,e)&&await G9(r,e,t)}async function sB(r,{project:e}){let t=e.configuration,i=new Map,n=e.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t,r)} not found in the project`);let s=new El.Writable,o=t.getLinkers(),a={project:e,report:new Je({configuration:t,stdout:s})},l=new Set([r.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${sr(t,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return zo.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return zo.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return zo.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===zo.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,H.fromPortablePath(k.resolve(f,p))])}return i}async function H9(r){return await sB(r.anchoredLocator,{project:r.project})}async function Y9(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await sB(r,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${It(n.configuration,r)}`);return await K.mktempPromise(async g=>{let[,f]=u,h=await Yd({project:n,locator:r,binFolder:g});await Promise.all(Array.from(c,([m,[,y]])=>AA(h.BERRY_BIN_FOLDER,Jr(m),process.execPath,[y])));let p;try{p=await ra(process.execPath,[...l,f,...t],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await K.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function WDe(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await Y9(r.anchoredLocator,e,t,{project:r.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Bi={};ft(Bi,{convertToZip:()=>iNe,extractArchiveTo:()=>sNe,makeArchiveFromDirectory:()=>rNe});var T6=ge(require("stream")),O6=ge(P6());var D6=ge(require("os")),R6=ge(gg()),F6=ge(require("worker_threads")),Dl=Symbol("kTaskInfo"),pR=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,R6.default)(Math.max(1,(0,D6.cpus)().length));this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let t=this.workers.pop();t?t.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new F6.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",t=>{if(!e[Dl])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[Dl].resolve(t),e[Dl]=null,e.unref(),this.workers.push(e)}),e.on("error",t=>{var i;(i=e[Dl])==null||i.reject(t),e[Dl]=null}),e.on("exit",t=>{var i;t!==0&&((i=e[Dl])==null||i.reject(new Error(`Worker exited with code ${t}`))),e[Dl]=null}),e}run(e){return this.limit(()=>{var i;let t=(i=this.workers.pop())!=null?i:this.createWorker();return t.ref(),new Promise((n,s)=>{t[Dl]={resolve:n,reject:s},t.postMessage(e)})})}};var M6=ge(L6());async function rNe(r,{baseFs:e=new ar,prefixPath:t=Me.root,compressionLevel:i,inMemory:n=!1}={}){let s=await fn(),o;if(n)o=new li(null,{libzip:s,level:i});else{let l=await K.mktempPromise(),c=k.join(l,"archive.zip");o=new li(c,{create:!0,libzip:s,level:i})}let a=k.resolve(Me.root,t);return await o.copyPromise(a,r,{baseFs:e,stableTime:!0,stableSort:!0}),o}var K6;async function iNe(r,e){let t=await K.mktempPromise(),i=k.join(t,"archive.zip");return K6||(K6=new pR((0,M6.getContent)())),await K6.run({tmpFile:i,tgz:r,opts:e}),new li(i,{libzip:await fn(),level:e.compressionLevel})}async function*nNe(r){let e=new O6.default.Parse,t=new T6.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{t.write(i)}),e.on("error",i=>{t.destroy(i)}),e.on("close",()=>{t.destroyed||t.end()}),e.end(r);for await(let i of t){let n=i;yield n,n.resume()}}async function sNe(r,e,{stripComponents:t=0,prefixPath:i=Me.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=t)}for await(let a of nNe(r)){if(n(a))continue;let l=k.normalize(H.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=t)continue;let c=l.slice(t).join("/"),u=k.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.writeFileSync(u,await Tg(a),{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,Rr.SAFE_TIME,Rr.SAFE_TIME);break}}return e}var ls={};ft(ls,{emitList:()=>oNe,emitTree:()=>q6,treeNodeToJson:()=>Y6,treeNodeToTreeify:()=>G6});var j6=ge(H6());function G6(r,{configuration:e}){let t={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Ry(e,l,Tc.BOLD)),typeof c!="undefined"&&g.push(tt(e,c[0],c[1])),g.length===0&&g.push(Ry(e,`${a}`,Tc.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof r.children=="undefined")throw new Error("The root node must only contain children");return i(r.children,t),t}function Y6(r){let e=t=>{var s;if(typeof t.children=="undefined"){if(typeof t.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Oc(t.value[0],t.value[1])}let i=Array.isArray(t.children)?t.children.entries():Object.entries((s=t.children)!=null?s:{}),n=Array.isArray(t.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof t.value=="undefined"?n:{value:Oc(t.value[0],t.value[1]),children:n}};return e(r)}function oNe(r,{configuration:e,stdout:t,json:i}){let n=r.map(s=>({value:s}));q6({children:n},{configuration:e,stdout:t,json:i})}function q6(r,{configuration:e,stdout:t,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(r.children)?r.children.values():Object.values((o=r.children)!=null?o:{});for(let l of a)t.write(`${JSON.stringify(Y6(l))} +`);return}let s=(0,j6.asTree)(G6(r,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 +$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 +$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");t.write(s)}var J6=ge(require("crypto")),mR=ge(require("fs"));var aNe=8,Nt=class{constructor(e,{configuration:t,immutable:i=t.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,J6.randomBytes)(8).toString("hex")}.tmp`;this.configuration=t,this.cwd=e,this.immutable=i,this.check=n;let s=t.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=t.get("compressionLevel"),a=o!==lc?`c${o}`:"";this.cacheKey=[aNe,a].join("")}}static async find(e,{immutable:t,check:i}={}){let n=new Nt(e.get("cacheFolder"),{configuration:e,immutable:t,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Jg(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){let n=ANe(t).slice(0,10);return`${Jg(e)}-${n}.zip`}getLocatorPath(e,t,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?k.resolve(this.cwd,this.getVersionFilename(e)):t===null||ER(t)!==this.cacheKey?null:k.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){let t=this.mirrorCwd;return t!==null?k.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await K.existsPromise(this.cwd))throw new ct(X.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await K.mkdirPromise(this.cwd,{recursive:!0});let e=k.resolve(this.cwd,".gitignore");await K.changeFilePromise(e,`/.gitignore +*.flock +*.tmp +`)}(this.mirrorCwd||!this.immutable)&&await K.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,t,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=Or(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new ar,g=()=>{let oe=new li(null,{libzip:q}),ce=k.join(Me.root,ek(e));return oe.mkdirSync(ce,{recursive:!0}),oe.writeJsonSync(k.join(ce,kt.manifest),{name:Ot(e),mocked:!0}),oe},f=async(oe,ce=null)=>{var O;if(ce===null&&((O=o.unstablePackages)==null?void 0:O.has(e.locatorHash)))return null;let Z=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(oe)}`:t;if(ce!==null){let L=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(ce)}`:t;if(Z!==L)throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(t!==null&&Z!==t){let L;switch(this.check?L="throw":ER(t)!==ER(Z)?L="update":L=this.configuration.get("checksumBehavior"),L){case"ignore":return t;case"update":return Z;default:case"throw":throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return Z},h=async oe=>{if(!s)throw new Error(`Cache check required but no loader configured for ${It(this.configuration,e)}`);let ce=await s(),Z=ce.getRealPath();return ce.saveAndClose(),await K.chmodPromise(Z,420),await f(oe,Z)},p=async()=>{if(c===null||!await K.existsPromise(c)){let oe=await s(),ce=oe.getRealPath();return oe.saveAndClose(),{source:"loader",path:ce}}return{source:"mirror",path:c}},m=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${It(this.configuration,e)}`);if(this.immutable)throw new ct(X.IMMUTABLE_CACHE,`Cache entry required but missing for ${It(this.configuration,e)}`);let{path:oe,source:ce}=await p(),Z=await f(oe),O=this.getLocatorPath(e,Z,o);if(!O)throw new Error("Assertion failed: Expected the cache path to be available");let L=[];ce!=="mirror"&&c!==null&&L.push(async()=>{let Be=`${c}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,c)}),(!o.mirrorWriteOnly||c===null)&&L.push(async()=>{let Be=`${O}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,O)});let de=o.mirrorWriteOnly&&c!=null?c:O;return await Promise.all(L.map(Be=>Be())),[!1,de,Z]},y=async()=>{let ce=(async()=>{var je;let Z=this.getLocatorPath(e,t,o),O=Z!==null?await u.existsPromise(Z):!1,L=!!((je=o.mockedPackages)==null?void 0:je.has(e.locatorHash))&&(!this.check||!O),de=L||O,Be=de?i:n;if(Be&&Be(),de){let re=null,se=Z;return L||(re=this.check?await h(se):await f(se)),[L,se,re]}else return m()})();this.mutexes.set(e.locatorHash,ce);try{return await ce}finally{this.mutexes.delete(e.locatorHash)}};for(let oe;oe=this.mutexes.get(e.locatorHash);)await oe;let[b,v,x]=await y();this.markedFiles.add(v);let T,q=await fn(),Y=b?()=>g():()=>new li(v,{baseFs:u,libzip:q,readOnly:!0}),$=new _h(()=>Rv(()=>T=Y(),oe=>`Failed to open the cache entry for ${It(this.configuration,e)}: ${oe}`),k),_=new Na(v,{baseFs:$,pathUtils:k}),ne=()=>{T==null||T.discardAndClose()},ee=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:x;return[_,ne,ee]}};function ER(r){let e=r.indexOf("/");return e!==-1?r.slice(0,e):null}function ANe(r){let e=r.indexOf("/");return e!==-1?r.slice(e+1):r}var cs;(function(t){t[t.SCRIPT=0]="SCRIPT",t[t.SHELLCODE=1]="SHELLCODE"})(cs||(cs={}));var pA=class extends Ji{constructor({configuration:e,stdout:t,suggestInstall:i=!0}){super();this.errorCount=0;nd(this,{configuration:e}),this.configuration=e,this.stdout=t,this.suggestInstall=i}static async start(e,t){let i=new this(e);try{await t(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){this.errorCount+=1,this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${t} +`)}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` +`),this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. +`),this.suggestInstall&&this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. +`))}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:!1})}};var i0=ge(require("crypto"));function dA(){}dA.prototype={diff:function(e,t){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(m){return n?(setTimeout(function(){n(void 0,m)},0),!0):m}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var a=t.length,l=e.length,c=1,u=a+l;i.maxEditLength&&(u=Math.min(u,i.maxEditLength));var g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],t,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(t),count:t.length}]);function h(){for(var m=-1*c;m<=c;m+=2){var y=void 0,b=g[m-1],v=g[m+1],x=(v?v.newPos:0)-m;b&&(g[m-1]=void 0);var T=b&&b.newPos+1=a&&x+1>=l)return o(lNe(s,y.components,t,e,s.useLongestToken));g[m]=y}c++}if(n)(function m(){setTimeout(function(){if(c>u)return n();h()||m()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,t,i){var n=e[e.length-1];n&&n.added===t&&n.removed===i?e[e.length-1]={count:n.count+1,added:t,removed:i}:e.push({count:1,added:t,removed:i})},extractCommon:function(e,t,i,n){for(var s=t.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?m:h}),c.value=r.join(u)}else c.value=r.join(t.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&r.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function cNe(r){return{newPos:r.newPos,components:r.components.slice(0)}}var nAt=new dA;var W6=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,z6=/\S/,_6=new dA;_6.equals=function(r,e){return this.options.ignoreCase&&(r=r.toLowerCase(),e=e.toLowerCase()),r===e||this.options.ignoreWhitespace&&!z6.test(r)&&!z6.test(e)};_6.tokenize=function(r){for(var e=r.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),t=0;tr.length)&&(e=r.length);for(var t=0,i=new Array(e);t0?l(Y.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(q=f).push.apply(q,yR(T.map(function(Z){return(x.added?"+":"-")+Z}))),x.added?p+=T.length:h+=T.length}else{if(u)if(T.length<=o.context*2&&v=a.length-2&&T.length<=o.context){var A=/\n$/.test(t),oe=/\n$/.test(i),ce=T.length==0&&f.length>ee.oldLines;!A&&ce&&t.length>0&&f.splice(ee.oldLines,0,"\\ No newline at end of file"),(!A&&!ce||!oe)&&f.push("\\ No newline at end of file")}c.push(ee),u=0,g=0,f=[]}h+=T.length,p+=T.length}},y=0;y`${t}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,r=>`npm:${r}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(r,e)=>cw({protocol:"npm:",source:null,selector:r,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,r=>`npm:${r}`]],NR=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:t}){let i=k.join(e.cwd,e.configuration.get("lockfileFilename"));if(!K.existsSync(i))return;let n=await K.readFilePromise(i,"utf8"),s=Si(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=pd(a);if(!l){t.reportWarning(X.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}po(l.range)&&(l=rr(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of JOe){let m=u.match(h);if(m){g=p(c,...m);break}}if(!g){t.reportWarning(X.YARN_IMPORT_FAILED,`${sr(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=qg(l.range),p=pd(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,cn(f,g))}}supportsDescriptor(e,t){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return await this.resolver.getCandidates(_x(n),t,i)}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var LR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return!!(t.project.storedResolutions.get(e.descriptorHash)||t.project.originalPackages.has(Aw(e).locatorHash))}supportsLocator(e,t){return!!(t.project.originalPackages.has(e.locatorHash)&&!t.project.lockfileNeedsRefresh)}shouldPersistResolution(e,t){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){let n=i.project.originalPackages.get(Aw(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var TR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.resolver.bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,t){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var di=class extends Ji{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){}};var iZ=ge(Wx());var CC=class{constructor(e,{project:t}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=t,this.cwd=e}async setup(){var s;this.manifest=(s=await At.tryFind(this.cwd))!=null?s:new At,this.relativeCwd=k.relative(this.project.cwd,this.cwd)||Me.dot;let e=this.manifest.name?this.manifest.name:$o(null,`${this.computeCandidateName()}-${ln(this.relativeCwd).substring(0,6)}`),t=this.manifest.version?this.manifest.version:"0.0.0";this.locator=cn(e,t),this.anchoredDescriptor=rr(this.locator,`${oi.protocol}${this.relativeCwd}`),this.anchoredLocator=cn(this.locator,`${oi.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o),n=await(0,iZ.default)(i,{cwd:H.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let o of n){let a=k.resolve(this.cwd,H.toPortablePath(o));K.existsSync(k.join(a,"package.json"))&&this.workspacesCwds.add(a)}}accepts(e){var o;let t=e.indexOf(":"),i=t!==-1?e.slice(0,t+1):null,n=t!==-1?e.slice(t+1):e;if(i===oi.protocol&&k.normalize(n)===this.relativeCwd||i===oi.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=po(n);return s?i===oi.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${k.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||t.has(a)||(t.add(a),i(a))}};return i(this),t}getRecursiveWorkspaceDependents({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&hd(c.anchoredLocator,n.anchoredLocator)}))&&!t.has(s)&&(t.add(s),i(s))};return i(this),t}getRecursiveWorkspaceChildren(){let e=[];for(let t of this.workspacesCwds){let i=this.project.workspacesByCwd.get(t);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let t=k.join(this.cwd,At.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} +`;await K.changeFilePromise(t,i,{automaticNewlines:!0}),this.manifest.raw=e}};var oZ=6,WOe=1,zOe=/ *, */g,aZ=/\/$/,_Oe=32,VOe=(0,OR.promisify)(KR.default.gzip),XOe=(0,OR.promisify)(KR.default.gunzip),Ci;(function(t){t.UpdateLockfile="update-lockfile",t.SkipBuild="skip-build"})(Ci||(Ci={}));var UR={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},AZ=r=>ln(`${WOe}`,r),ze=class{constructor(e,{configuration:t}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=t,this.cwd=e}static async find(e,t){var p,m,y;if(!e.projectCwd)throw new Pe(`No project found in ${t}`);let i=e.projectCwd,n=t,s=null;for(;s!==e.projectCwd;){if(s=n,K.existsSync(k.join(s,kt.manifest))){i=s;break}n=k.dirname(s)}let o=new ze(e.projectCwd,{configuration:e});(p=ye.telemetry)==null||p.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(m=ye.telemetry)==null||m.reportWorkspaceCount(o.workspaces.length),(y=ye.telemetry)==null||y.reportDependencyCount(o.workspaces.reduce((b,v)=>b+v.manifest.dependencies.size+v.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};let c=tt(e,o.cwd,qe.PATH),u=tt(e,k.relative(o.cwd,i),qe.PATH),g=`- If ${c} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,f=`- If ${c} is intended to be a project, it might be that you forgot to list ${u} in its workspace configuration.`,h=`- Finally, if ${c} is fine and you intend ${u} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new Pe(`The nearest package directory (${tt(e,i,qe.PATH)}) doesn't seem to be part of the project declared in ${tt(e,o.cwd,qe.PATH)}. + +${[g,f,h].join(` +`)}`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.configuration.get("defaultLanguageName");if(K.existsSync(e)){let n=await K.readFilePromise(e,"utf8");this.lockFileChecksum=AZ(n);let s=Si(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let t=e;e=[];for(let i of t){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let t=new CC(e,{project:this});await t.setup();let i=this.workspacesByIdent.get(t.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${fi(this.configuration,t.locator)}: ${H.fromPortablePath(e)} conflicts with ${H.fromPortablePath(i.cwd)}`);return this.workspaces.push(t),this.workspacesByCwd.set(e,t),this.workspacesByIdent.set(t.locator.identHash,t),t}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){k.isAbsolute(e)||(e=k.resolve(this.cwd,e)),e=k.normalize(e).replace(/\/+$/,"");let t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){let t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(let i of this.workspaces)k.relative(i.cwd,e).startsWith("../")||t&&t.cwd.length>=i.cwd.length||(t=i);return t||null}getWorkspaceByFilePath(e){let t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){let t=this.workspacesByIdent.get(e.identHash);return typeof t=="undefined"?null:t}getWorkspaceByIdent(e){let t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${fi(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){let t=this.tryWorkspaceByIdent(e);return t===null||(Al(e)&&(e=ud(e)),!t.accepts(e.range))?null:t}getWorkspaceByDescriptor(e){let t=this.tryWorkspaceByDescriptor(e);if(t===null)throw new Error(`Workspace not found (${sr(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){let t=this.tryWorkspaceByIdent(e);return t===null||(ea(e)&&(e=gd(e)),t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash)?null:t}getWorkspaceByLocator(e){let t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${It(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(let e of this.workspaces){let t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error(`Assertion failed: Expected workspace ${Cd(this.configuration,e)} (${tt(this.configuration,k.join(e.cwd,kt.manifest),qe.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(t.dependencies)}}forgetResolution(e){let t=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);t(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&t(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let t of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(t,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(t)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[t,i]of e.dependencies)Al(i)&&e.dependencies.set(t,ud(i))}getDependencyMeta(e,t){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(Ot(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),t===null||!sZ.default.valid(t))return i;for(let[a,l]of s)a!==null&&a===t&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:t=!1}={}){let i=new di,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(t&&(await o.findPackageLocation(a,s)).replace(aZ,"")!==e.replace(aZ,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let t=e.resolver||this.configuration.makeResolver(),i=new NR(t);await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new TR(t)]:[i,t],s=new wd([new LR(t),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,m=new Set,y=[],b=ck(),v=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ji.progressViaTitle(),async ne=>{let ee=async O=>{let L=await Lg(async()=>await s.resolve(O,a),je=>`${It(this.configuration,O)}: ${je}`);if(!hd(O,L))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${It(this.configuration,O)} to ${It(this.configuration,L)})`);g.set(L.locatorHash,L);let de=this.configuration.normalizePackage(L);for(let[je,re]of de.dependencies){let se=await this.configuration.reduceHook(he=>he.reduceDependency,re,this,de,re,{resolver:s,resolveOptions:a});if(!fd(re,se))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let be=s.bindDescriptor(se,O,a);de.dependencies.set(je,be)}let Be=go([...de.dependencies.values()].map(je=>Z(je)));return y.push(Be),Be.catch(()=>{}),c.set(de.locatorHash,de),de},A=async O=>{let L=f.get(O.locatorHash);if(typeof L!="undefined")return L;let de=Promise.resolve().then(()=>ee(O));return f.set(O.locatorHash,de),de},oe=async(O,L)=>{let de=await Z(L);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,de.locatorHash),de},ce=async O=>{ne.setTitle(sr(this.configuration,O));let L=this.resolutionAliases.get(O.descriptorHash);if(typeof L!="undefined")return oe(O,this.storedDescriptors.get(L));let de=s.getResolutionDependencies(O,a),Be=new Map(await go(de.map(async se=>{let be=s.bindDescriptor(se,p,a),he=await Z(be);return m.add(he.locatorHash),[se.descriptorHash,he]}))),re=(await Lg(async()=>await s.getCandidates(O,Be,a),se=>`${sr(this.configuration,O)}: ${se}`))[0];if(typeof re=="undefined")throw new Error(`${sr(this.configuration,O)}: No candidates found`);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,re.locatorHash),A(re)},Z=O=>{let L=h.get(O.descriptorHash);if(typeof L!="undefined")return L;l.set(O.descriptorHash,O);let de=Promise.resolve().then(()=>ce(O));return h.set(O.descriptorHash,de),de};for(let O of this.workspaces){let L=O.anchoredDescriptor;y.push(Z(L))}for(;y.length>0;){let O=[...y];y.length=0,await go(O)}});let x=new Set(this.resolutionAliases.values()),T=new Set(c.keys()),q=new Set,Y=new Map;ZOe({project:this,report:e.report,accessibleLocators:q,volatileDescriptors:x,optionalBuilds:T,peerRequirements:Y,allDescriptors:l,allResolutions:u,allPackages:c});for(let ne of m)T.delete(ne);for(let ne of x)l.delete(ne),u.delete(ne);let $=new Set,_=new Set;for(let ne of c.values())ne.conditions!=null&&(!T.has(ne.locatorHash)||(gw(ne,v)||(gw(ne,b)&&e.report.reportWarningOnce(X.GHOST_ARCHITECTURE,`${It(this.configuration,ne)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${tt(this.configuration,"supportedArchitectures",Ri.SETTING)} setting`),_.add(ne.locatorHash)),$.add(ne.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=q,this.conditionalLocators=$,this.disabledLocators=_,this.originalPackages=g,this.optionalBuilds=T,this.peerRequirements=Y,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,cacheOptions:s},l=Array.from(new Set(kn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return Rs(h)}])));n===Ci.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Ji.progressViaCounter(l.length);t.reportProgress(u);let g=(0,nZ.default)(_Oe);if(await t.startCacheReport(async()=>{await go(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(ea(h))return;let p;try{p=await o.fetch(h,a)}catch(m){m.message=`${It(this.configuration,h)}: ${m.message}`,t.reportExceptionOnce(m),c=m;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:t,fetcher:i,mode:n}){var A,oe,ce;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:t},u=new Map(l.map(Z=>{let O=Z.makeInstaller(c),L=O.getCustomDataKey(),de=this.installersCustomData.get(L);return typeof de!="undefined"&&O.attachCustomData(de),[Z,O]})),g=new Map,f=new Map,h=new Map,p=new Map(await go([...this.accessibleLocators].map(async Z=>{let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");return[Z,await o.fetch(O,a)]}))),m=[];for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(typeof O=="undefined")throw new Error("Assertion failed: The locator should have been registered");let L=p.get(O.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let de=[],Be=re=>{de.push(re)},je=this.tryWorkspaceByLocator(O);if(je!==null){let re=[],{scripts:se}=je.manifest;for(let he of["preinstall","install","postinstall"])se.has(he)&&re.push([cs.SCRIPT,he]);try{for(let[he,Fe]of u)if(he.supportsPackage(O,c)&&(await Fe.installPackage(O,L,{holdFetchResult:Be})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{de.length===0?(A=L.releaseFs)==null||A.call(L):m.push(go(de).catch(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}let be=k.join(L.packageFs.getRealPath(),L.prefixPath);f.set(O.locatorHash,be),!ea(O)&&re.length>0&&h.set(O.locatorHash,{directives:re,buildLocations:[be]})}else{let re=l.find(he=>he.supportsPackage(O,c));if(!re)throw new ct(X.LINKER_NOT_FOUND,`${It(this.configuration,O)} isn't supported by any available linker`);let se=u.get(re);if(!se)throw new Error("Assertion failed: The installer should have been registered");let be;try{be=await se.installPackage(O,L,{holdFetchResult:Be})}finally{de.length===0?(oe=L.releaseFs)==null||oe.call(L):m.push(go(de).then(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}g.set(O.locatorHash,re),f.set(O.locatorHash,be.packageLocation),be.buildDirective&&be.buildDirective.length>0&&be.packageLocation&&h.set(O.locatorHash,{directives:be.buildDirective,buildLocations:[be.packageLocation]})}}let y=new Map;for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");let L=this.tryWorkspaceByLocator(O)!==null,de=async(Be,je)=>{let re=f.get(O.locatorHash);if(typeof re=="undefined")throw new Error(`Assertion failed: The package (${It(this.configuration,O)}) should have been registered`);let se=[];for(let be of O.dependencies.values()){let he=this.storedResolutions.get(be.descriptorHash);if(typeof he=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,be)}, from ${It(this.configuration,O)})should have been registered`);let Fe=this.storedPackages.get(he);if(typeof Fe=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);let Ke=this.tryWorkspaceByLocator(Fe)===null?g.get(he):null;if(typeof Ke=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);Ke===Be||Ke===null?f.get(Fe.locatorHash)!==null&&se.push([be,Fe]):!L&&re!==null&&Fg(y,he).push(re)}re!==null&&await je.attachInternalDependencies(O,se)};if(L)for(let[Be,je]of u)Be.supportsPackage(O,c)&&await de(Be,je);else{let Be=g.get(O.locatorHash);if(!Be)throw new Error("Assertion failed: The linker should have been found");let je=u.get(Be);if(!je)throw new Error("Assertion failed: The installer should have been registered");await de(Be,je)}}for(let[Z,O]of y){let L=this.storedPackages.get(Z);if(!L)throw new Error("Assertion failed: The package should have been registered");let de=g.get(L.locatorHash);if(!de)throw new Error("Assertion failed: The linker should have been found");let Be=u.get(de);if(!Be)throw new Error("Assertion failed: The installer should have been registered");await Be.attachExternalDependents(L,O)}let b=new Map;for(let Z of u.values()){let O=await Z.finalizeInstall();for(let L of(ce=O==null?void 0:O.records)!=null?ce:[])h.set(L.locatorHash,{directives:L.buildDirective,buildLocations:L.buildLocations});typeof(O==null?void 0:O.customData)!="undefined"&&b.set(Z.getCustomDataKey(),O.customData)}if(this.installersCustomData=b,await go(m),n===Ci.SkipBuild)return;let v=new Set(this.storedPackages.keys()),x=new Set(h.keys());for(let Z of x)v.delete(Z);let T=(0,i0.createHash)("sha512");T.update(process.versions.node),await this.configuration.triggerHook(Z=>Z.globalHashGeneration,this,Z=>{T.update("\0"),T.update(Z)});let q=T.digest("hex"),Y=new Map,$=Z=>{let O=Y.get(Z.locatorHash);if(typeof O!="undefined")return O;let L=this.storedPackages.get(Z.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The package should have been registered");let de=(0,i0.createHash)("sha512");de.update(Z.locatorHash),Y.set(Z.locatorHash,"");for(let Be of L.dependencies.values()){let je=this.storedResolutions.get(Be.descriptorHash);if(typeof je=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,Be)}) should have been registered`);let re=this.storedPackages.get(je);if(typeof re=="undefined")throw new Error("Assertion failed: The package should have been registered");de.update($(re))}return O=de.digest("hex"),Y.set(Z.locatorHash,O),O},_=(Z,O)=>{let L=(0,i0.createHash)("sha512");L.update(q),L.update($(Z));for(let de of O)L.update(de);return L.digest("hex")},ne=new Map,ee=!1;for(;x.size>0;){let Z=x.size,O=[];for(let L of x){let de=this.storedPackages.get(L);if(!de)throw new Error("Assertion failed: The package should have been registered");let Be=!0;for(let se of de.dependencies.values()){let be=this.storedResolutions.get(se.descriptorHash);if(!be)throw new Error(`Assertion failed: The resolution (${sr(this.configuration,se)}) should have been registered`);if(x.has(be)){Be=!1;break}}if(!Be)continue;x.delete(L);let je=h.get(de.locatorHash);if(!je)throw new Error("Assertion failed: The build directive should have been registered");let re=_(de,je.buildLocations);if(this.storedBuildState.get(de.locatorHash)===re){ne.set(de.locatorHash,re);continue}ee||(await this.persistInstallStateFile(),ee=!0),this.storedBuildState.has(de.locatorHash)?t.reportInfo(X.MUST_REBUILD,`${It(this.configuration,de)} must be rebuilt because its dependency tree changed`):t.reportInfo(X.MUST_BUILD,`${It(this.configuration,de)} must be built because it never has been before or the last one failed`);for(let se of je.buildLocations){if(!k.isAbsolute(se))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${se})`);O.push((async()=>{for(let[be,he]of je.directives){let Fe=`# This file contains the result of Yarn building a package (${Rs(de)}) +`;switch(be){case cs.SCRIPT:Fe+=`# Script name: ${he} +`;break;case cs.SHELLCODE:Fe+=`# Script code: ${he} +`;break}let Ke=null;if(!await K.mktempPromise(async ve=>{let pe=k.join(ve,"build.log"),{stdout:V,stderr:Qe}=this.configuration.getSubprocessStreams(pe,{header:Fe,prefix:It(this.configuration,de),report:t}),le;try{switch(be){case cs.SCRIPT:le=await nB(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break;case cs.SHELLCODE:le=await rD(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break}}catch(gt){Qe.write(gt.stack),le=1}if(V.end(),Qe.end(),le===0)return ne.set(de.locatorHash,re),!0;K.detachTemp(ve);let fe=`${It(this.configuration,de)} couldn't be built successfully (exit code ${tt(this.configuration,le,qe.NUMBER)}, logs can be found here: ${tt(this.configuration,pe,qe.PATH)})`;return this.optionalBuilds.has(de.locatorHash)?(t.reportInfo(X.BUILD_FAILED,fe),ne.set(de.locatorHash,re),!0):(t.reportError(X.BUILD_FAILED,fe),!1)}))return}})())}}if(await go(O),Z===x.size){let L=Array.from(x).map(de=>{let Be=this.storedPackages.get(de);if(!Be)throw new Error("Assertion failed: The package should have been registered");return It(this.configuration,Be)}).join(", ");t.reportError(X.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${L})`);break}}this.storedBuildState=ne}async install(e){var a,l;let t=this.configuration.get("nodeLinker");(a=ye.telemetry)==null||a.reportInstall(t),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=qi.Inactive;let i=k.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await K.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=tt(this.configuration,g,qe.PACKAGE_EXTENSION);switch(g.status){case qi.Inactive:e.report.reportWarning(X.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case qi.Redundant:e.report.reportWarning(X.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=sc(n,this.generateLockfile());if(c!==n){let u=V6(i,i,n,c,void 0,void 0,{maxEditLength:100});if(u){e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.ADDED)):f.startsWith("-")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.REMOVED)):e.report.reportInfo(null,tt(this.configuration,f,"grey"))}e.report.reportSeparator()}throw new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===qi.Active&&((l=ye.telemetry)==null||l.reportPackageExtension(Oc(g,qe.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==Ci.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>ow(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===Ci.UpdateLockfile){e.report.reportWarning(X.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${tt(this.configuration,"mode=update-lockfile",qe.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>ow(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let t={};t.__metadata={version:oZ,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>Pn(f)).sort().join(", "),c=new At;c.version=o.linkType===Qt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof t.__metadata.cacheKey=="undefined"&&(t.__metadata.cacheKey=h),h===t.__metadata.cacheKey?u=p:u=g}t[l]=te(N({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:Rs(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. +`,`# Manual changes might be lost - proceed with caution! +`].join("")} +`+Ma(t)}async persistLockfile(){let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t="";try{t=await K.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=sc(t,i);n!==t&&(await K.writeFilePromise(e,n),this.lockFileChecksum=AZ(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(UR))e.push(...o);let t=(0,n0.default)(this,e),i=MR.default.serialize(t),n=ln(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await K.mkdirPromise(k.dirname(s),{recursive:!0}),await K.writeFilePromise(s,await VOe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:t=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath"),s;try{let o=await XOe(await K.readFilePromise(n));s=MR.default.deserialize(o),this.installStateChecksum=ln(o)}catch{t&&await this.applyLightResolution();return}e&&typeof s.installersCustomData!="undefined"&&(this.installersCustomData=s.installersCustomData),i&&Object.assign(this,(0,n0.default)(s,UR.restoreBuildState)),t&&(s.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,n0.default)(s,UR.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new di}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:t}){if(this.configuration.get("enableGlobalCache"))return;let i=new Set([".gitignore"]);if(!Ak(e.cwd,this.cwd)||!await K.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await K.readdirPromise(e.cwd)){if(i.has(a))continue;let l=k.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?t.reportError(X.IMMUTABLE_CACHE,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:t.reportInfo(X.UNUSED_CACHE_ENTRY,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused - removing`),await K.removePromise(l)))}n&&s!==0&&t.reportInfo(X.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function ZOe({project:r,allDescriptors:e,allResolutions:t,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,peerRequirements:o=new Map,volatileDescriptors:a=new Set,report:l,tolerateMissingPackages:c=!1}){var ne;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,m=new Map,y=new Map,b=new Map(r.workspaces.map(ee=>{let A=ee.anchoredLocator.locatorHash,oe=i.get(A);if(typeof oe=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,cd(oe)]})),v=()=>{let ee=K.mktempSync(),A=k.join(ee,"stacktrace.log"),oe=String(g.length+1).length,ce=g.map((Z,O)=>`${`${O+1}.`.padStart(oe," ")} ${Rs(Z)} +`).join("");throw K.writeFileSync(A,ce),K.detachTemp(ee),new ct(X.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${H.fromPortablePath(A)}`)},x=ee=>{let A=t.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let oe=i.get(A);if(!oe)throw new Error("Assertion failed: The package could not be found");return oe},T=(ee,A,oe,{top:ce,optional:Z})=>{g.length>1e3&&v(),g.push(A);let O=q(ee,A,oe,{top:ce,optional:Z});return g.pop(),O},q=(ee,A,oe,{top:ce,optional:Z})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),Z||s.delete(A.locatorHash);let O=i.get(A.locatorHash);if(!O){if(c)return;throw new Error(`Assertion failed: The package (${It(r.configuration,A)}) should have been registered`)}let L=[],de=[],Be=[],je=[],re=[];for(let be of Array.from(O.dependencies.values())){if(O.peerDependencies.has(be.identHash)&&O.locatorHash!==ce)continue;if(Al(be))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");a.delete(be.descriptorHash);let he=Z;if(!he){let Qe=O.dependenciesMeta.get(Ot(be));if(typeof Qe!="undefined"){let le=Qe.get(null);typeof le!="undefined"&&le.optional&&(he=!0)}}let Fe=t.get(be.descriptorHash);if(!Fe){if(c)continue;throw new Error(`Assertion failed: The resolution (${sr(r.configuration,be)}) should have been registered`)}let Ke=b.get(Fe)||i.get(Fe);if(!Ke)throw new Error(`Assertion failed: The package (${Fe}, resolved from ${sr(r.configuration,be)}) should have been registered`);if(Ke.peerDependencies.size===0){T(be,Ke,new Map,{top:ce,optional:he});continue}let ke,ve,pe=new Set,V;de.push(()=>{ke=Vx(be,A.locatorHash),ve=Xx(Ke,A.locatorHash),O.dependencies.delete(be.identHash),O.dependencies.set(ke.identHash,ke),t.set(ke.descriptorHash,ve.locatorHash),e.set(ke.descriptorHash,ke),i.set(ve.locatorHash,ve),L.push([Ke,ke,ve])}),Be.push(()=>{var Qe;V=new Map;for(let le of ve.peerDependencies.values()){let fe=O.dependencies.get(le.identHash);if(!fe&&fd(A,le)&&(ee.identHash===A.identHash?fe=ee:(fe=rr(A,ee.range),e.set(fe.descriptorHash,fe),t.set(fe.descriptorHash,A.locatorHash),a.delete(fe.descriptorHash))),(!fe||fe.range==="missing:")&&ve.dependencies.has(le.identHash)){ve.peerDependencies.delete(le.identHash);continue}fe||(fe=rr(le,"missing:")),ve.dependencies.set(fe.identHash,fe),Al(fe)&&Nc(p,fe.descriptorHash).add(ve.locatorHash),f.set(fe.identHash,fe),fe.range==="missing:"&&pe.add(fe.identHash),V.set(le.identHash,(Qe=oe.get(le.identHash))!=null?Qe:ve.locatorHash)}ve.dependencies=new Map(kn(ve.dependencies,([le,fe])=>Ot(fe)))}),je.push(()=>{if(!i.has(ve.locatorHash))return;let Qe=u.get(Ke.locatorHash);typeof Qe=="number"&&Qe>=2&&v();let le=u.get(Ke.locatorHash),fe=typeof le!="undefined"?le+1:1;u.set(Ke.locatorHash,fe),T(ke,ve,V,{top:ce,optional:he}),u.set(Ke.locatorHash,fe-1)}),re.push(()=>{let Qe=O.dependencies.get(be.identHash);if(typeof Qe=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let le=t.get(Qe.descriptorHash);if(typeof le=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(Nc(y,le).add(A.locatorHash),!!i.has(ve.locatorHash)){for(let fe of ve.peerDependencies.values()){let gt=V.get(fe.identHash);if(typeof gt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Fg(Ng(m,gt),Ot(fe)).push(ve.locatorHash)}for(let fe of pe)ve.dependencies.delete(fe)}})}for(let be of[...de,...Be])be();let se;do{se=!0;for(let[be,he,Fe]of L){let Ke=Ng(h,be.locatorHash),ke=ln(...[...Fe.dependencies.values()].map(Qe=>{let le=Qe.range!=="missing:"?t.get(Qe.descriptorHash):"missing:";if(typeof le=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${sr(r.configuration,Qe)} to have been registered`);return le===ce?`${le} (top)`:le}),he.identHash),ve=Ke.get(ke);if(typeof ve=="undefined"){Ke.set(ke,he);continue}if(ve===he)continue;i.delete(Fe.locatorHash),e.delete(he.descriptorHash),t.delete(he.descriptorHash),n.delete(Fe.locatorHash);let pe=p.get(he.descriptorHash)||[],V=[O.locatorHash,...pe];p.delete(he.descriptorHash);for(let Qe of V){let le=i.get(Qe);typeof le!="undefined"&&(le.dependencies.get(he.identHash).descriptorHash!==ve.descriptorHash&&(se=!1),le.dependencies.set(he.identHash,ve))}}}while(!se);for(let be of[...je,...re])be()};for(let ee of r.workspaces){let A=ee.anchoredLocator;a.delete(ee.anchoredDescriptor.descriptorHash),T(ee.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var Y;(function(oe){oe[oe.NotProvided=0]="NotProvided",oe[oe.NotCompatible=1]="NotCompatible"})(Y||(Y={}));let $=[];for(let[ee,A]of y){let oe=i.get(ee);if(typeof oe=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let ce=m.get(ee);if(typeof ce!="undefined")for(let Z of A){let O=i.get(Z);if(typeof O!="undefined")for(let[L,de]of ce){let Be=An(L);if(O.peerDependencies.has(Be.identHash))continue;let je=`p${ln(Z,L,ee).slice(0,5)}`;o.set(je,{subject:Z,requested:Be,rootRequester:ee,allRequesters:de});let re=oe.dependencies.get(Be.identHash);if(typeof re!="undefined"){let se=x(re),be=(ne=se.version)!=null?ne:"0.0.0",he=new Set;for(let Ke of de){let ke=i.get(Ke);if(typeof ke=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let ve=ke.peerDependencies.get(Be.identHash);if(typeof ve=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");he.add(ve.range)}[...he].every(Ke=>{if(Ke.startsWith(oi.protocol)){if(!r.tryWorkspaceByLocator(se))return!1;Ke=Ke.slice(oi.protocol.length),(Ke==="^"||Ke==="~")&&(Ke="*")}return qc(be,Ke)})||$.push({type:1,subject:O,requested:Be,requester:oe,version:be,hash:je,requirementCount:de.length})}else{let se=oe.peerDependenciesMeta.get(L);(se==null?void 0:se.optional)||$.push({type:0,subject:O,requested:Be,requester:oe,hash:je})}}}}let _=[ee=>$x(ee.subject),ee=>Ot(ee.requested),ee=>`${ee.type}`];l==null||l.startSectionSync({reportFooter:()=>{l.reportWarning(X.UNNAMED,`Some peer dependencies are incorrectly met; run ${tt(r.configuration,"yarn explain peer-requirements ",qe.CODE)} for details, where ${tt(r.configuration,"",qe.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let ee of kn($,_))switch(ee.type){case 0:l.reportWarning(X.MISSING_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} doesn't provide ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}), requested by ${fi(r.configuration,ee.requester)}`);break;case 1:{let A=ee.requirementCount>1?"and some of its descendants request":"requests";l.reportWarning(X.INCOMPATIBLE_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} provides ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}) with version ${dd(r.configuration,ee.version)}, which doesn't satisfy what ${fi(r.configuration,ee.requester)} ${A}`)}break}})}var ca;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(ca||(ca={}));var mC=class{constructor(e,t){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!K.existsSync(i),this.sendReport(t),this.startBuffer()}reportVersion(e){this.reportValue(ca.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(ca.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(ca.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(ca.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(ca.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(ca.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(ca.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(ca.DEPENDENCY_COUNT,String(e))}reportValue(e,t){Nc(this.values,e).add(t)}reportEnumerator(e,t){Nc(this.enumerators,e).add(ln(t))}reportHit(e,t="*"){let i=Ng(this.hits,e),n=_a(i,t,()=>0);i.set(t,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return k.join(e,"telemetry.json")}sendReport(e){var u,g,f;let t=this.getRegistryPath(),i;try{i=K.readJsonSync(t)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{K.mkdirSync(k.dirname(t),{recursive:!0}),K.writeJsonSync(t,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>HP(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let m=p;m.userId=h,m.reportType="primary";for(let v of Object.keys((f=m.enumerators)!=null?f:{}))m.enumerators[v]=m.enumerators[v].length;c(m);let y=new Map,b=20;for(let[v,x]of Object.entries(m.values))x.length>0&&y.set(v,x.slice(0,b));for(;y.size>0;){let v={};v.userId=h,v.reportType="secondary",v.metrics={};for(let[x,T]of y)v.metrics[x]=T.shift(),T.length===0&&y.delete(x);c(v)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),t;try{t=K.readJsonSync(e)}catch{t={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=t.blocks=(a=t.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let m of this.hits.keys()){let y=s.hits=(c=s.hits)!=null?c:{},b=y[m]=(u=y[m])!=null?u:{};for(let[v,x]of this.hits.get(m))b[v]=((g=b[v])!=null?g:0)+x}for(let m of["values","enumerators"])for(let y of this[m].keys()){let b=s[m]=(f=s[m])!=null?f:{};b[y]=[...new Set([...(h=b[y])!=null?h:[],...(p=this[m].get(y))!=null?p:[]])]}K.mkdirSync(k.dirname(e),{recursive:!0}),K.writeJsonSync(e,t)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var HR=ge(require("child_process")),lZ=ge(Ic());var jR=ge(require("fs"));var Lf=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function $Oe(r){let e=H.fromPortablePath(r);process.on("SIGINT",()=>{}),e?(0,HR.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,HR.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function s0({binaryVersion:r,pluginConfiguration:e}){async function t(){let n=new ws({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:r});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var m,y,b,v,x;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(!Se.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!Wt.satisfiesWithPrereleases(s,o))throw new Pe(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let l=await ye.find(H.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),c=l.get("yarnPath"),u=l.get("ignorePath"),g=l.get("ignoreCwd"),f=H.toPortablePath(H.resolve(process.argv[1])),h=T=>K.readFilePromise(T).catch(()=>Buffer.of());if(!u&&!g&&await(async()=>c===f||Buffer.compare(...await Promise.all([h(c),h(f)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(c!==null&&!u)if(!K.existsSync(c))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${l.sources.get("yarnPath")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1;else try{$Oe(c)}catch(T){process.exitCode=T.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get("enableTelemetry")&&!lZ.isCI&&process.stdout.isTTY&&(ye.telemetry=new mC(l,"puba9cdc10ec5790a2cf4969dd413a47270")),(m=ye.telemetry)==null||m.reportVersion(r);for(let[$,_]of l.plugins.entries()){Lf.has((b=(y=$.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:y[1])!=null?b:"")&&((v=ye.telemetry)==null||v.reportPluginName($));for(let ne of _.commands||[])n.register(ne)}let q=n.process(process.argv.slice(2));q.help||(x=ye.telemetry)==null||x.reportCommandName(q.path.join(" "));let Y=q.cwd;if(typeof Y!="undefined"&&!g){let $=(0,jR.realpathSync)(process.cwd()),_=(0,jR.realpathSync)(Y);if($!==_){process.chdir(Y),await t();return}}await n.runExit(q,{cwd:H.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return t().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>K.rmtempPromise())}function cZ(r){r.Command.Path=(...e)=>t=>{t.paths=t.paths||[],t.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])r.Command[e]=(...t)=>(i,n)=>{let s=r.Option[e](...t);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return r}var GC={};ft(GC,{BaseCommand:()=>Le,WorkspaceRequiredError:()=>ht,getDynamicLibs:()=>bre,getPluginConfiguration:()=>L0,main:()=>s0,openWorkspace:()=>Wf,pluginCommands:()=>Lf});var Le=class extends Re{constructor(){super(...arguments);this.cwd=J.String("--cwd",{hidden:!0})}};var ht=class extends Pe{constructor(e,t){let i=k.relative(e,t),n=k.join(e,At.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var sGe=ge(ri());ys();var oGe=ge(UF()),bre=()=>new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",Cp],["semver",sGe],["typanion",cg],["yup",oGe]]);async function Wf(r,e){let{project:t,workspace:i}=await ze.find(r,e);if(!i)throw new ht(t.cwd,e);return i}var Q_e=ge(ri());ys();var S_e=ge(UF());var GN={};ft(GN,{dedupeUtils:()=>wN,default:()=>mWe,suggestUtils:()=>lN});var Sae=ge(Ic());var Fne=ge(WC());ys();var lN={};ft(lN,{Modifier:()=>pa,Strategy:()=>Vr,Target:()=>Hr,WorkspaceModifier:()=>Xf,applyModifier:()=>kne,extractDescriptorFromPath:()=>gN,extractRangeModifier:()=>xne,fetchDescriptorFrom:()=>uN,findProjectDescriptors:()=>Rne,getModifier:()=>zC,getSuggestedDescriptors:()=>_C,makeWorkspaceDescriptor:()=>Dne,toWorkspaceModifier:()=>Pne});var cN=ge(ri()),bYe="workspace:",Hr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(Hr||(Hr={}));var pa;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(pa||(pa={}));var Xf;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(Xf||(Xf={}));var Vr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Vr||(Vr={}));function zC(r,e){return r.exact?pa.EXACT:r.caret?pa.CARET:r.tilde?pa.TILDE:e.configuration.get("defaultSemverRangePrefix")}var QYe=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function xne(r,{project:e}){let t=r.match(QYe);return t?t[1]:e.configuration.get("defaultSemverRangePrefix")}function kne(r,e){let{protocol:t,source:i,params:n,selector:s}=P.parseRange(r.range);return cN.default.valid(s)&&(s=`${e}${r.range}`),P.makeDescriptor(r,P.makeRange({protocol:t,source:i,params:n,selector:s}))}function Pne(r){switch(r){case pa.CARET:return Xf.CARET;case pa.TILDE:return Xf.TILDE;case pa.EXACT:return Xf.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${r}"`)}}function Dne(r,e){return P.makeDescriptor(r.anchoredDescriptor,`${bYe}${Pne(e)}`)}async function Rne(r,{project:e,target:t}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(t===Hr.PEER){let o=s.manifest.peerDependencies.get(r.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(r.identHash),a=s.manifest.devDependencies.get(r.identHash);t===Hr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function gN(r,{cwd:e,workspace:t}){return await SYe(async i=>{k.isAbsolute(r)||(r=k.relative(t.cwd,k.resolve(e,r)),r.match(/^\.{0,2}\//)||(r=`./${r}`));let{project:n}=t,s=await uN(P.makeIdent(null,"archive"),r,{project:t.project,cache:i,workspace:t});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new di,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,t.anchoredLocator,c),g=P.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await At.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return P.makeDescriptor(h.name,r)})}async function _C(r,{project:e,workspace:t,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(r.range!=="unknown")return{suggestions:[{descriptor:r,name:`Use ${P.prettyDescriptor(e.configuration,r)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof t!="undefined"&&t!==null&&t.manifest[n].get(r.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Vr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${P.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Vr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await Rne(r,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===t.anchoredLocator.locatorHash&&o.includes(Vr.KEEP))continue;let m=`(originally used by ${P.prettyLocator(e.configuration,p[0])}`;m+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:m})}});break;case Vr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===r.identHash&&c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Vr.PROJECT:await g(async()=>{if(t.manifest.name!==null&&r.identHash===t.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(r);if(h===null)return;let p=Dne(h,s);c.push({descriptor:p,name:`Attach ${P.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ae.pretty(e.configuration,h.relativeCwd,ae.Type.PATH)})`})});break;case Vr.LATEST:await g(async()=>{if(r.range!=="unknown")c.push({descriptor:r,name:`Use ${P.prettyRange(e.configuration,r.range)}`,reason:"(explicit range requested)"});else if(n===Hr.PEER)c.push({descriptor:P.makeDescriptor(r,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:ae.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await uN(r,"latest",{project:e,cache:i,workspace:t,preserveModifier:!1});h&&(h=kne(h,s),c.push({descriptor:h,name:`Use ${P.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function uN(r,e,{project:t,cache:i,workspace:n,preserveModifier:s=!0}){let o=P.makeDescriptor(r,e),a=new di,l=t.configuration.makeFetcher(),c=t.configuration.makeResolver(),u={project:t,fetcher:l,cache:i,checksums:t.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=te(N({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:m,source:y,params:b,selector:v}=P.parseRange(P.convertToManifestRange(p.reference));if(m===t.configuration.get("defaultProtocol")&&(m=null),cN.default.valid(v)&&s!==!1){let x=typeof s=="string"?s:o.range;v=xne(x,{project:t})+v}return P.makeDescriptor(p,P.makeRange({protocol:m,source:y,params:b,selector:v}))}async function SYe(r){return await K.mktempPromise(async e=>{let t=ye.create(e);return t.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await r(new Nt(e,{configuration:t,check:!1,immutable:!1}))})}var VC=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=J.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=J.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=J.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=J.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=J.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=J.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.silent=J.Boolean("--silent",{hidden:!0});this.packages=J.Rest()}async execute(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=[...s?[Vr.REUSE]:[],Vr.PROJECT,...this.cached?[Vr.CACHE]:[],Vr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async y=>{let b=y.match(/^\.{0,2}\//)?await gN(y,{cwd:this.context.cwd,workspace:i}):P.tryParseDescriptor(y),v=y.match(/^(https?:|git@github)/);if(v)throw new Pe(`It seems you are trying to add a package using a ${ae.pretty(e,`${v[0]}...`,Ri.RANGE)} url; we now require package names to be explicitly specified. +Try running the command again with the package name prefixed: ${ae.pretty(e,"yarn add",Ri.CODE)} ${ae.pretty(e,P.makeDescriptor(P.makeIdent(null,"my-package"),`${v[0]}...`),Ri.DESCRIPTOR)}`);if(!b)throw new Pe(`The ${ae.pretty(e,y,Ri.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let x=vYe(i,b,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),T=await _C(b,{project:t,workspace:i,cache:n,target:x,modifier:o,strategies:a,maxResults:l});return[b,T,x]})),u=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[b,{suggestions:v,rejections:x}]of c)if(v.filter(q=>q.descriptor!==null).length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),y.reportSeparator(),y.reportExceptionOnce(q)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:y},b]of c){let v,x=y.filter($=>$.descriptor!==null),T=x[0].descriptor,q=x.every($=>P.areDescriptorsEqual($.descriptor,T));x.length===1||q?v=T:(g=!0,{answer:v}=await(0,Fne.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:y.map(({descriptor:$,name:_,reason:ne})=>$?{name:_,hint:ne,descriptor:$}:{name:_,hint:ne,disabled:!0}),onCancel:()=>process.exit(130),result($){return this.find($,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Y=i.manifest[b].get(v.identHash);(typeof Y=="undefined"||Y.descriptorHash!==v.descriptorHash)&&(i.manifest[b].set(v.identHash,v),this.optional&&(b==="dependencies"?i.manifest.ensureDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0:b==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0)),typeof Y=="undefined"?f.push([i,b,v,a]):h.push([i,b,Y,v]))}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` +`),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};VC.paths=[["add"]],VC.usage=Re.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var Nne=VC;function vYe(r,e,{dev:t,peer:i,preferDev:n,optional:s}){let o=r.manifest[Hr.REGULAR].has(e.identHash),a=r.manifest[Hr.DEVELOPMENT].has(e.identHash),l=r.manifest[Hr.PEER].has(e.identHash);if((t||i)&&o)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!t&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((t||n)&&s)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?Hr.PEER:t||n?Hr.DEVELOPMENT:o?Hr.REGULAR:a?Hr.DEVELOPMENT:Hr.REGULAR}var XC=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);if(await t.restoreInstallState(),this.name){let o=(await Zt.getPackageAccessibleBinaries(i,{project:t})).get(this.name);if(!o)throw new Pe(`Couldn't find a binary named "${this.name}" for package "${P.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} +`),0}return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Zt.getPackageAccessibleBinaries(i,{project:t}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:P.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${P.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};XC.paths=[["bin"]],XC.usage=Re.Usage({description:"get the path to a binary script",details:` + When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. + + When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. + `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var Lne=XC;var ZC=class extends Le{constructor(){super(...arguments);this.mirror=J.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=J.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Nt.find(e);return(await Je.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&t.mirrorCwd!==null,s=!this.mirror;n&&(await K.removePromise(t.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await K.removePromise(t.cwd)})).exitCode()}};ZC.paths=[["cache","clean"],["cache","clear"]],ZC.usage=Re.Usage({description:"remove the shared cache files",details:` + This command will remove all the files from the cache. + `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var Tne=ZC;var One=ge(C0()),fN=ge(require("util")),$C=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=J.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(t)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${t}"`);let s=e.getSpecial(t,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=Se.convertMapsToIndexableObjects(s),a=i?(0,One.default)(o,i):o,l=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} +`),l.exitCode();fN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,fN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} +`)}return l.exitCode()}};$C.paths=[["config","get"]],$C.usage=Re.Usage({description:"read a configuration settings",details:` + This command will print a configuration setting. + + Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. + `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var Mne=$C;var Vse=ge(EN()),Xse=ge(C0()),Zse=ge(_se()),IN=ge(require("util")),tm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String();this.value=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new Pe("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>ye.updateHomeConfiguration(h):h=>ye.updateConfiguration(t(),h))(h=>{if(n){let p=(0,Vse.default)(h);return(0,Zse.default)(p,this.name,o),p}else return te(N({},h),{[i]:o})});let c=(await ye.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=Se.convertMapsToIndexableObjects(c),g=n?(0,Xse.default)(u,n):u;return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{IN.inspect.styles.name="cyan",h.reportInfo(X.UNNAMED,`Successfully set ${this.name} to ${(0,IN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};tm.paths=[["config","set"]],tm.usage=Re.Usage({description:"change a configuration settings",details:` + This command will set a configuration setting. + + When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). + + When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. + `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var $se=tm;var Aoe=ge(EN()),loe=ge(yC()),coe=ge(aoe()),rm=class extends Le{constructor(){super(...arguments);this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>ye.updateHomeConfiguration(l):l=>ye.updateConfiguration(t(),l);return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,loe.default)(u,this.name))return l.reportWarning(X.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Aoe.default)(u):N({},u);return(0,coe.default)(g,this.name),g}),c||l.reportInfo(X.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};rm.paths=[["config","unset"]],rm.usage=Re.Usage({description:"unset a configuration setting",details:` + This command will unset a configuration setting. + `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var uoe=rm;var yN=ge(require("util")),im=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=J.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(X.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=Se.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(N({key:s,effective:a,source:l},o))}}else{let n=Se.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,yN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,yN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};im.paths=[["config"]],im.usage=Re.Usage({description:"display the current configuration",details:` + This command prints the current active configuration settings. + `,examples:[["Print the active configuration settings","$0 config"]]});var goe=im;ys();var wN={};ft(wN,{Strategy:()=>Bu,acceptedStrategies:()=>P3e,dedupe:()=>BN});var foe=ge(is()),Bu;(function(e){e.HIGHEST="highest"})(Bu||(Bu={}));var P3e=new Set(Object.values(Bu)),D3e={highest:async(r,e,{resolver:t,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of r.storedResolutions){let c=r.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);Se.getSetWithDefault(o,c.identHash).add(l)}return Array.from(r.storedDescriptors.values(),async a=>{if(e.length&&!foe.default.isMatch(P.stringifyIdent(a),e))return null;let l=r.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=r.originalPackages.get(l);if(typeof c=="undefined"||!t.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(y=>{let b=r.originalPackages.get(y);if(typeof b=="undefined")throw new Error(`Assertion failed: The package (${y}) should have been registered`);return b.reference}),f=await t.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,m=r.originalPackages.get(p);if(typeof m=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:m}})}};async function BN(r,{strategy:e,patterns:t,cache:i,report:n}){let{configuration:s}=r,o=new di,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:r.storedChecksums,fetcher:l,project:r,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:r,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await D3e[e](r,t,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Ji.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(b=>b.then(v=>{if(v===null)return;p++;let{descriptor:x,currentPackage:T,updatedPackage:q}=v;n.reportInfo(X.UNNAMED,`${P.prettyDescriptor(s,x)} can be deduped from ${P.prettyLocator(s,T)} to ${P.prettyLocator(s,q)}`),n.reportJson({descriptor:P.stringifyDescriptor(x),currentResolution:P.stringifyLocator(T),updatedResolution:P.stringifyLocator(q)}),r.storedResolutions.set(x.descriptorHash,q.locatorHash)}).finally(()=>h.tick())));let m;switch(p){case 0:m="No packages";break;case 1:m="One package";break;default:m=`${p} packages`}let y=ae.pretty(s,e,ae.Type.CODE);return n.reportInfo(X.UNNAMED,`${m} can be deduped using the ${y} strategy`),p})}var nm=class extends Le{constructor(){super(...arguments);this.strategy=J.String("-s,--strategy",Bu.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:nn(Bu)});this.check=J.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=await Nt.find(e);await t.restoreInstallState({restoreResolutions:!1});let n=0,s=await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await BN(t,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await t.install({cache:i,report:a,mode:this.mode})})).exitCode()}};nm.paths=[["dedupe"]],nm.usage=Re.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var hoe=nm;var J0=class extends Le{async execute(){let{plugins:e}=await ye.find(this.context.cwd,this.context.plugins),t=[];for(let o of e){let{commands:a}=o[1];if(a){let c=ws.from(a).definitions();t.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=doe()["@yarnpkg/builder"].bundles.standard;for(let o of t){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} +`)}};J0.paths=[["--clipanion=definitions"]];var Coe=J0;var W0=class extends Le{async execute(){this.context.stdout.write(this.cli.usage(null))}};W0.paths=[["help"],["--help"],["-h"]];var moe=W0;var bN=class extends Le{constructor(){super(...arguments);this.leadingArgument=J.String();this.args=J.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!P.tryParseIdent(this.leadingArgument)){let e=k.resolve(this.context.cwd,H.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Eoe=bN;var z0=class extends Le{async execute(){this.context.stdout.write(`${Ur||""} +`)}};z0.paths=[["-v"],["--version"]];var Ioe=z0;var sm=class extends Le{constructor(){super(...arguments);this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);return await t.restoreInstallState(),await Zt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:t})}};sm.paths=[["exec"]],sm.usage=Re.Usage({description:"execute a shell script",details:` + This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. + + It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var yoe=sm;ys();var om=class extends Le{constructor(){super(...arguments);this.hash=J.String({required:!1,validator:fp(gp(),[hp(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return await t.restoreInstallState({restoreResolutions:!1}),await t.applyLightResolution(),typeof this.hash!="undefined"?await R3e(this.hash,t,{stdout:this.context.stdout}):(await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>P.stringifyLocator(t.storedPackages.get(a.subject)),([,a])=>P.stringifyIdent(a.requested)];for(let[a,l]of Se.sortMap(t.peerRequirements,s)){let c=t.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=t.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=ae.pretty(e,a,ae.Type.CODE),h=P.prettyLocator(e,c),p=P.prettyIdent(e,l.requested),m=P.prettyIdent(e,u),y=l.allRequesters.length-1,b=`descendant${y===1?"":"s"}`,v=y>0?` and ${y} ${b}`:"",x=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${x} ${p} to ${m}${v}`)}})).exitCode()}};om.paths=[["explain","peer-requirements"]],om.usage=Re.Usage({description:"explain a set of peer requirements",details:` + A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. + + When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. + + When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. + + **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). + `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var woe=om;async function R3e(r,e,t){let{configuration:i}=e,n=e.peerRequirements.get(r);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${r}"`);return(await Je.start({configuration:i,stdout:t.stdout,includeFooter:!1},async o=>{var b,v;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(b=a.dependencies.get(n.requested.identHash))!=null?b:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(x=>{let T=e.storedPackages.get(x);if(typeof T=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let q=P.devirtualizeLocator(T),Y=e.storedPackages.get(q.locatorHash);if(typeof Y=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let $=Y.peerDependencies.get(n.requested.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:T,peerDependency:$}});if(g!==null){let x=f.every(({peerDependency:T})=>Wt.satisfiesWithPrereleases(g.version,T.range));o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} provides ${P.prettyLocator(i,g)} with version ${P.prettyReference(i,(v=g.version)!=null?v:"")}, which ${x?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} doesn't provide ${P.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ae.mark(i),p=[];for(let{pkg:x,peerDependency:T}of Se.sortMap(f,q=>P.stringifyLocator(q.pkg))){let Y=(g!==null?Wt.satisfiesWithPrereleases(g.version,T.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:P.stringifyLocator(x),prettyLocator:P.prettyLocator(i,x),prettyRange:P.prettyRange(i,T.range),mark:Y})}let m=Math.max(...p.map(({stringifiedLocator:x})=>x.length)),y=Math.max(...p.map(({prettyRange:x})=>x.length));for(let{stringifiedLocator:x,prettyLocator:T,prettyRange:q,mark:Y}of Se.sortMap(p,({stringifiedLocator:$})=>$))o.reportInfo(null,`${T.padEnd(m+(T.length-x.length)," ")} \u2192 ${q.padEnd(y," ")} ${Y}`);p.length>1&&(o.reportSeparator(),o.reportInfo(X.UNNAMED,`Note: these requirements start with ${P.prettyLocator(e.configuration,l)}`))})).exitCode()}ys();var Boe=ge(ri()),am=class extends Le{constructor(){super(...arguments);this.onlyIfNeeded=J.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let t=()=>{if(typeof Ur=="undefined")throw new Pe("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=t();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await Am(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await Am(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^https?:/))i=this.version;else if(this.version.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.version))i=`file://${H.resolve(this.version)}`;else if(Wt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(Wt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(Wt.validRange(this.version))i=`https://repo.yarnpkg.com/${await F3e(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new Pe(`Invalid version descriptor "${this.version}"`);return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,i,Ri.URL)}`),a=await K.readFilePromise(H.toPortablePath(i.slice(o.length)))):(s.reportInfo(X.UNNAMED,`Retrieving ${ae.pretty(e,i,Ri.PATH)}`),a=await ir.get(i,{configuration:e})),await QN(e,null,a,{report:s})})).exitCode()}};am.paths=[["set","version"]],am.usage=Re.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});var boe=am;async function F3e(r,e){let i=(await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0})).tags.filter(n=>Wt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new Pe(`No matching release found for range ${ae.pretty(r,e,ae.Type.RANGE)}.`);return i[0]}async function Am(r,e){let t=await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0});if(!t.latest[e])throw new Pe(`Tag ${ae.pretty(r,e,ae.Type.RANGE)} not found`);return t.latest[e]}async function QN(r,e,t,{report:i}){var g;e===null&&await K.mktempPromise(async f=>{let h=k.join(f,"yarn.cjs");await K.writeFilePromise(h,t);let{stdout:p}=await Nr.execvp(process.execPath,[H.fromPortablePath(h),"--version"],{cwd:f,env:te(N({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!Boe.default.valid(e))throw new Error(`Invalid semver version. ${ae.pretty(r,"yarn --version",ae.Type.CODE)} returned: +${e}`)});let n=(g=r.projectCwd)!=null?g:r.startingCwd,s=k.resolve(n,".yarn/releases"),o=k.resolve(s,`yarn-${e}.cjs`),a=k.relative(r.startingCwd,o),l=k.relative(n,o),c=r.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(X.UNNAMED,`Saving the new release in ${ae.pretty(r,a,"magenta")}`),await K.removePromise(k.dirname(o)),await K.mkdirPromise(k.dirname(o),{recursive:!0}),await K.writeFilePromise(o,t,{mode:493}),u){await ye.updateConfiguration(n,{yarnPath:l});let f=await At.tryFind(n)||new At;f.packageManager=`yarn@${e&&Se.isTaggedYarnVersion(e)?e:await Am(r,"stable")}`;let h={};f.exportTo(h);let p=k.join(n,At.fileName),m=`${JSON.stringify(h,null,f.indent)} +`;await K.changeFilePromise(p,m,{automaticNewlines:!0})}}function Qoe(r){return X[II(r)]}var N3e=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function L3e(r){let t=`https://repo.yarnpkg.com/${Se.isTaggedYarnVersion(Ur)?Ur:await Am(r,"canary")}/packages/gatsby/content/advanced/error-codes.md`,i=await ir.get(t,{configuration:r});return new Map(Array.from(i.toString().matchAll(N3e),({groups:n})=>{if(!n)throw new Error("Assertion failed: Expected the match to have been successful");let s=Qoe(n.code);if(n.name!==s)throw new Error(`Assertion failed: Invalid error code data: Expected "${n.name}" to be named "${s}"`);return[n.code,n.details]}))}var lm=class extends Le{constructor(){super(...arguments);this.code=J.String({required:!1,validator:fp(gp(),[hp(/^YN[0-9]{4}$/)])});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(typeof this.code!="undefined"){let t=Qoe(this.code),i=ae.pretty(e,t,ae.Type.CODE),n=this.cli.format().header(`${this.code} - ${i}`),o=(await L3e(e)).get(this.code),a=typeof o!="undefined"?ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.MARKDOWN,{text:o,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. + +You can help us by editing this page on GitHub \u{1F642}: +${ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} +`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:t,details:a})} +`):this.context.stdout.write(`${n} + +${a} +`)}else{let t={children:Se.mapAndFilter(Object.entries(X),([i,n])=>Number.isNaN(Number(i))?Se.mapAndFilter.skip:{label:_A(Number(i)),value:ae.tuple(ae.Type.CODE,n)})};ls.emitTree(t,{configuration:e,stdout:this.context.stdout,json:this.json})}}};lm.paths=[["explain"]],lm.usage=Re.Usage({description:"explain an error code",details:` + When the code argument is specified, this command prints its name and its details. + + When used without arguments, this command lists all error codes and their names. + `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});var Soe=lm;var voe=ge(is()),cm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=J.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=J.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=J.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=J.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=J.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=J.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i&&!this.all)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(x,{recursive:T})=>{let q=x.anchoredLocator.locatorHash,Y=new Map,$=[q];for(;$.length>0;){let _=$.shift();if(Y.has(_))continue;let ne=t.storedPackages.get(_);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(Y.set(_,ne),P.isVirtualLocator(ne)&&$.push(P.devirtualizeLocator(ne).locatorHash),!(!T&&_!==q))for(let ee of ne.dependencies.values()){let A=t.storedResolutions.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");$.push(A)}}return Y.values()},a=({recursive:x})=>{let T=new Map;for(let q of t.workspaces)for(let Y of o(q,{recursive:x}))T.set(Y.locatorHash,Y);return T.values()},l=({all:x,recursive:T})=>x&&T?t.storedPackages.values():x?a({recursive:T}):o(i,{recursive:T}),c=({all:x,recursive:T})=>{let q=l({all:x,recursive:T}),Y=this.patterns.map(ne=>{let ee=P.parseLocator(ne),A=voe.default.makeRe(P.stringifyIdent(ee)),oe=P.isVirtualLocator(ee),ce=oe?P.devirtualizeLocator(ee):ee;return Z=>{let O=P.stringifyIdent(Z);if(!A.test(O))return!1;if(ee.reference==="unknown")return!0;let L=P.isVirtualLocator(Z),de=L?P.devirtualizeLocator(Z):Z;return!(oe&&L&&ee.reference!==Z.reference||ce.reference!==de.reference)}}),$=Se.sortMap([...q],ne=>P.stringifyLocator(ne));return{selection:$.filter(ne=>Y.length===0||Y.some(ee=>ee(ne))),sortedLookup:$}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new Pe("No package matched your request");let f=new Map;if(this.dependents)for(let x of g)for(let T of x.dependencies.values()){let q=t.storedResolutions.get(T.descriptorHash);if(typeof q=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");Se.getArrayWithDefault(f,q).push(x)}let h=new Map;for(let x of g){if(!P.isVirtualLocator(x))continue;let T=P.devirtualizeLocator(x);Se.getArrayWithDefault(h,T.locatorHash).push(x)}let p={},m={children:p},y=e.makeFetcher(),b={project:t,fetcher:y,cache:n,checksums:t.storedChecksums,report:new di,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},v=[async(x,T,q)=>{var _,ne;if(!T.has("manifest"))return;let Y=await y.fetch(x,b),$;try{$=await At.find(Y.prefixPath,{baseFs:Y.packageFs})}finally{(_=Y.releaseFs)==null||_.call(Y)}q("Manifest",{License:ae.tuple(ae.Type.NO_HINT,$.license),Homepage:ae.tuple(ae.Type.URL,(ne=$.raw.homepage)!=null?ne:null)})},async(x,T,q)=>{var A;if(!T.has("cache"))return;let Y={mockedPackages:t.disabledLocators,unstablePackages:t.conditionalLocators},$=(A=t.storedChecksums.get(x.locatorHash))!=null?A:null,_=n.getLocatorPath(x,$,Y),ne;if(_!==null)try{ne=K.statSync(_)}catch{}let ee=typeof ne!="undefined"?[ne.size,ae.Type.SIZE]:void 0;q("Cache",{Checksum:ae.tuple(ae.Type.NO_HINT,$),Path:ae.tuple(ae.Type.PATH,_),Size:ee})}];for(let x of u){let T=P.isVirtualLocator(x);if(!this.virtuals&&T)continue;let q={},Y={value:[x,ae.Type.LOCATOR],children:q};if(p[P.stringifyLocator(x)]=Y,this.nameOnly){delete Y.children;continue}let $=h.get(x.locatorHash);typeof $!="undefined"&&(q.Instances={label:"Instances",value:ae.tuple(ae.Type.NUMBER,$.length)}),q.Version={label:"Version",value:ae.tuple(ae.Type.NO_HINT,x.version)};let _=(ee,A)=>{let oe={};if(q[ee]=oe,Array.isArray(A))oe.children=A.map(ce=>({value:ce}));else{let ce={};oe.children=ce;for(let[Z,O]of Object.entries(A))typeof O!="undefined"&&(ce[Z]={label:Z,value:O})}};if(!T){for(let ee of v)await ee(x,s,_);await e.triggerHook(ee=>ee.fetchPackageInfo,x,s,_)}x.bin.size>0&&!T&&_("Exported Binaries",[...x.bin.keys()].map(ee=>ae.tuple(ae.Type.PATH,ee)));let ne=f.get(x.locatorHash);typeof ne!="undefined"&&ne.length>0&&_("Dependents",ne.map(ee=>ae.tuple(ae.Type.LOCATOR,ee))),x.dependencies.size>0&&!T&&_("Dependencies",[...x.dependencies.values()].map(ee=>{var ce;let A=t.storedResolutions.get(ee.descriptorHash),oe=typeof A!="undefined"&&(ce=t.storedPackages.get(A))!=null?ce:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:oe})})),x.peerDependencies.size>0&&T&&_("Peer dependencies",[...x.peerDependencies.values()].map(ee=>{var Z,O;let A=x.dependencies.get(ee.identHash),oe=typeof A!="undefined"&&(Z=t.storedResolutions.get(A.descriptorHash))!=null?Z:null,ce=oe!==null&&(O=t.storedPackages.get(oe))!=null?O:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:ce})}))}ls.emitTree(m,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};cm.paths=[["info"]],cm.usage=Re.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var xoe=cm;var _0=ge(Ic());ys();var um=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=J.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=J.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=J.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=J.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.cacheFolder=J.String("--cache-folder",{hidden:!0});this.frozenLockfile=J.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=J.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=J.Boolean("--non-interactive",{hidden:!0});this.preferOffline=J.Boolean("--prefer-offline",{hidden:!0});this.production=J.Boolean("--production",{hidden:!0});this.registry=J.String("--registry",{hidden:!0});this.silent=J.Boolean("--silent",{hidden:!0});this.networkTimeout=J.String("--network-timeout",{hidden:!0})}async execute(){var g;let e=await ye.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let t=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(f,{error:h})=>{let p=await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async m=>{h?m.reportError(X.DEPRECATED_CLI_SETTINGS,f):m.reportWarning(X.DEPRECATED_CLI_SETTINGS,f)});return p.hasErrors()?p.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let f=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.registry!="undefined"){let f=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(f!==null)return f}if(typeof this.preferOffline!="undefined"){let f=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.production!="undefined"){let f=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(f!==null)return f}if(typeof this.nonInteractive!="undefined"){let f=await i("The --non-interactive option is deprecated",{error:!t});if(f!==null)return f}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let f=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!_0.default.NETLIFY});if(f!==null)return f}let n=this.mode===Ci.UpdateLockfile;if(n&&(this.immutable||this.immutableCache))throw new Pe(`${ae.pretty(e,"--immutable",ae.Type.CODE)} and ${ae.pretty(e,"--immutable-cache",ae.Type.CODE)} cannot be used with ${ae.pretty(e,"--mode=update-lockfile",ae.Type.CODE)}`);let s=((g=this.immutable)!=null?g:e.get("enableImmutableInstalls"))&&!n,o=this.immutableCache&&!n;if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{await T3e(e,s)&&(h.reportInfo(X.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let f=e.projectCwd,h;try{h=await K.readFilePromise(k.join(f,kt.lockfile),"utf8")}catch{}if(h==null?void 0:h.includes("yarn lockfile v1")){let p=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async m=>{m.reportInfo(X.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),m.reportSeparator(),e.use("",{nodeLinker:"node-modules"},f,{overwrite:!0}),await ye.updateConfiguration(f,{nodeLinker:"node-modules"})});if(p.hasErrors())return p.exitCode()}}if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{var p;((p=ye.telemetry)==null?void 0:p.isNew)&&(h.reportInfo(X.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),h.reportInfo(X.TELEMETRY_NOTICE,`Run ${ae.pretty(e,"yarn config set --home enableTelemetry 0",ae.Type.CODE)} to disable`),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}let{project:a,workspace:l}=await ze.find(e,this.context.cwd),c=await Nt.find(e,{immutable:o,check:this.checkCache});if(!l)throw new ht(a.cwd,this.context.cwd);return await a.restoreInstallState({restoreResolutions:!1}),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async f=>{await a.install({cache:c,report:f,immutable:s,mode:this.mode})})).exitCode()}};um.paths=[["install"],Re.Default],um.usage=Re.Usage({description:"install the project dependencies",details:` + This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: + + - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). + + - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). + + - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). + + - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. + + Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. + + If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. + + If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). + + If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. + + If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var koe=um,O3e="|||||||",M3e=">>>>>>>",K3e="=======",Poe="<<<<<<<";async function T3e(r,e){if(!r.projectCwd)return!1;let t=k.join(r.projectCwd,r.get("lockfileFilename"));if(!await K.existsPromise(t))return!1;let i=await K.readFilePromise(t,"utf8");if(!i.includes(Poe))return!1;if(e)throw new ct(X.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=U3e(i),o,a;try{o=Si(n),a=Si(s)}catch(c){throw new ct(X.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=N(N({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await K.changeFilePromise(t,Ma(l),{automaticNewlines:!0}),!0}function U3e(r){let e=[[],[]],t=r.split(/\r?\n/g),i=!1;for(;t.length>0;){let n=t.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Poe)){for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===K3e){i=!1;break}else if(i||s.startsWith(O3e)){i=!0;continue}else e[0].push(s)}for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(M3e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` +`),e[1].join(` +`)]}var gm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=J.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=J.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=k.resolve(this.context.cwd,H.toPortablePath(this.destination)),o=await ye.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await ze.find(o,s);if(t.cwd===a.cwd)throw new Pe("Invalid destination; Can't link the project to itself");if(!l)throw new ht(a.cwd,s);let c=t.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new Pe("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new Pe("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=P.stringifyIdent(f.locator),p=this.relative?k.relative(t.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Je.start({configuration:e,stdout:this.context.stdout},async f=>{await t.install({cache:n,report:f})})).exitCode()}};gm.paths=[["link"]],gm.usage=Re.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var Doe=gm;var fm=class extends Le{constructor(){super(...arguments);this.args=J.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};fm.paths=[["node"]],fm.usage=Re.Usage({description:"run node with the hook already setup",details:` + This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + + The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. + `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Roe=fm;var Hoe=ge(require("os"));var Noe=ge(require("os"));var H3e="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function bu(r){let e=await ir.get(H3e,{configuration:r});return Si(e.toString())}var hm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await bu(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=Or(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(N({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};hm.paths=[["plugin","list"]],hm.usage=Re.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var Foe=hm;var j3e=/^[0-9]+$/;function Loe(r){return j3e.test(r)?`pull/${r}/head`:r}var G3e=({repository:r,branch:e},t)=>[["git","init",H.fromPortablePath(t)],["git","remote","add","origin",r],["git","fetch","origin","--depth=1",Loe(e)],["git","reset","--hard","FETCH_HEAD"]],Y3e=({branch:r})=>[["git","fetch","origin","--depth=1",Loe(r),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],q3e=({plugins:r,noMinify:e},t)=>[["yarn","build:cli",...new Array().concat(...r.map(i=>["--plugin",k.resolve(t,i)])),...e?["--no-minify"]:[],"|"]],pm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=J.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=J.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Noe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{await vN(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(X.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await dm(q3e(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=k.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await K.readFilePromise(o);await QN(e,"sources",a,{report:s}),this.skipPlugins||await J3e(this,{project:t,report:s,target:i})})).exitCode()}};pm.paths=[["set","version","from","sources"]],pm.usage=Re.Usage({description:"build Yarn from master",details:` + This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. + + By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. + `,examples:[["Build Yarn from master","$0 set version from sources"]]});var Toe=pm;async function dm(r,{configuration:e,context:t,target:i}){for(let[n,...s]of r){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await Nr.pipevp(n,s,{cwd:i,stdin:t.stdin,stdout:t.stdout,stderr:t.stderr,strict:!0});else{t.stdout.write(`${ae.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} +`);try{await Nr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw t.stdout.write(a.stdout||a.stack),a}}}}async function vN(r,{configuration:e,report:t,target:i}){let n=!1;if(!r.force&&K.existsSync(k.join(i,".git"))){t.reportInfo(X.UNNAMED,"Fetching the latest commits"),t.reportSeparator();try{await dm(Y3e(r),{configuration:e,context:r.context,target:i}),n=!0}catch(s){t.reportSeparator(),t.reportWarning(X.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(t.reportInfo(X.UNNAMED,"Cloning the remote repository"),t.reportSeparator(),await K.removePromise(i),await K.mkdirPromise(i,{recursive:!0}),await dm(G3e(r,i),{configuration:e,context:r.context,target:i}))}async function J3e(r,{project:e,report:t,target:i}){let n=await bu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await SN(o,r,{project:e,report:t,target:i})}var Ooe=ge(ri()),Moe=ge(require("url")),Koe=ge(require("vm"));var Cm=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await ze.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.name)){let a=k.resolve(this.context.cwd,H.toPortablePath(this.name));i.reportInfo(X.UNNAMED,`Reading ${ae.pretty(e,a,ae.Type.PATH)}`),s=k.relative(n.cwd,a),o=await K.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new Moe.URL(this.name)}catch{throw new ct(X.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=P.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!Ooe.default.valid(l.reference))throw new ct(X.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=P.stringifyIdent(l),u=await bu(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Ur!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Ur}/`))}i.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,a,"green")}`),o=await ir.get(a,{configuration:e})}await xN(s,o,{project:n,report:i})})).exitCode()}};Cm.paths=[["plugin","import"]],Cm.usage=Re.Usage({category:"Plugin-related commands",description:"download a plugin",details:` + This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. + + Three types of plugin references are accepted: + + - If the plugin is stored within the Yarn repository, it can be referenced by name. + - Third-party plugins can be referenced directly through their public urls. + - Local plugins can be referenced by their path on the disk. + + Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). + `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var Uoe=Cm;async function xN(r,e,{project:t,report:i}){let{configuration:n}=t,s={},o={exports:s};(0,Koe.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=k.resolve(t.cwd,l);i.reportInfo(X.UNNAMED,`Saving the new plugin in ${ae.pretty(n,l,"magenta")}`),await K.mkdirPromise(k.dirname(c),{recursive:!0}),await K.writeFilePromise(c,e);let u={path:l,spec:r};await ye.updateConfiguration(t.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let m=typeof p!="string"?p.path:p,y=k.resolve(t.cwd,H.toPortablePath(m)),{name:b}=Se.dynamicRequire(y);b!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),te(N({},g),{plugins:f})})}var W3e=({pluginName:r,noMinify:e},t)=>[["yarn",`build:${r}`,...e?["--no-minify"]:[],"|"]],mm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Hoe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await ze.find(e,this.context.cwd),o=P.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=P.stringifyIdent(o),l=await bu(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await vN(this,{configuration:e,report:n,target:t}),await SN(c,this,{project:s,report:n,target:t})})).exitCode()}};mm.paths=[["plugin","import","from","sources"]],mm.usage=Re.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` + This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. + + The plugins can be referenced by their short name if sourced from the official Yarn repository. + `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var joe=mm;async function SN(r,{context:e,noMinify:t},{project:i,report:n,target:s}){let o=r.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(X.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await dm(W3e({pluginName:o,noMinify:t},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=k.resolve(s,`packages/${o}/bundles/${r}.js`),c=await K.readFilePromise(l);await xN(r,c,{project:i,report:n})}var Em=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=P.parseIdent(s);if(!e.plugins.has(s))throw new Pe(`${P.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=k.resolve(t.cwd,a);K.existsSync(l)&&(n.reportInfo(X.UNNAMED,`Removing ${ae.pretty(e,a,ae.Type.PATH)}...`),await K.removePromise(l)),n.reportInfo(X.UNNAMED,"Updating the configuration..."),await ye.updateConfiguration(t.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:te(N({},c),{plugins:u})})})).exitCode()}};Em.paths=[["plugin","remove"]],Em.usage=Re.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` + This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. + + **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. + `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var Goe=Em;var Im=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};Im.paths=[["plugin","runtime"]],Im.usage=Re.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` + This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. + `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var Yoe=Im;var ym=class extends Le{constructor(){super(...arguments);this.idents=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(P.parseIdent(a).identHash);if(await t.restoreInstallState({restoreResolutions:!1}),await t.resolveEverything({cache:n,report:new di}),s.size>0)for(let a of t.storedPackages.values())s.has(a.identHash)&&t.storedBuildState.delete(a.locatorHash);else t.storedBuildState.clear();return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await t.install({cache:n,report:a})})).exitCode()}};ym.paths=[["rebuild"]],ym.usage=Re.Usage({description:"rebuild the project's native packages",details:` + This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. + + Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). + + By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. + `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var qoe=ym;var kN=ge(is());ys();var wm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=this.all?t.workspaces:[i],o=[Hr.REGULAR,Hr.DEVELOPMENT,Hr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,m=P.parseIdent(h);for(let y of s){let b=[...y.manifest.peerDependenciesMeta.keys()];for(let v of(0,kN.default)(b,h))y.manifest.peerDependenciesMeta.delete(v),l=!0,p=!0;for(let v of o){let x=y.manifest.getForScope(v),T=[...x.values()].map(q=>P.stringifyIdent(q));for(let q of(0,kN.default)(T,P.stringifyIdent(m))){let{identHash:Y}=P.parseIdent(q),$=x.get(Y);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");y.manifest[v].delete(Y),c.push([y,v,$]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new Pe(`${u} ${ae.prettyList(e,a,Ri.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Je.start({configuration:e,stdout:this.context.stdout},async p=>{await t.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};wm.paths=[["remove"]],wm.usage=Re.Usage({description:"remove dependencies from the project",details:` + This command will remove the packages matching the specified patterns from the current workspace. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + + This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. + `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var Joe=wm;var Woe=ge(require("util")),V0=class extends Le{async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=Se.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,Woe.inspect)(g,l)}`)})).exitCode()}};V0.paths=[["run"]];var zoe=V0;var Bm=class extends Le{constructor(){super(...arguments);this.inspect=J.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=J.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=J.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=J.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=J.Boolean("--silent",{hidden:!0});this.scriptName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i,locator:n}=await ze.find(e,this.context.cwd);await t.restoreInstallState();let s=this.topLevel?t.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Zt.hasPackageScript(s,this.scriptName,{project:t}))return await Zt.executePackageScript(s,this.scriptName,this.args,{project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Zt.getPackageAccessibleBinaries(s,{project:t});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Zt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(t.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Zt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new Pe("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Lf)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new Pe(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new Pe(`Couldn't find a script named "${this.scriptName}".`)}}};Bm.paths=[["run"]],Bm.usage=Re.Usage({description:"run a script defined in the package.json",details:` + This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: + + - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. + + - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. + + - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. + + Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). + `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var _oe=Bm;var bm=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=J.String();this.resolution=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(await t.restoreInstallState({restoreResolutions:!1}),!i)throw new ht(t.cwd,this.context.cwd);let s=P.parseDescriptor(this.descriptor,!0),o=P.makeDescriptor(s,this.resolution);return t.storedDescriptors.set(s.descriptorHash,s),t.storedDescriptors.set(o.descriptorHash,o),t.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};bm.paths=[["set","resolution"]],bm.usage=Re.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var Voe=bm;var Xoe=ge(is()),Qm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=t.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=k.resolve(this.context.cwd,H.toPortablePath(l));if(Se.isPathLike(l)){let u=await ye.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await ze.find(u,c);if(!f)throw new ht(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(P.stringifyIdent(h.locator));if(o.size===0)throw new Pe("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be unlinked");o.add(P.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,Xoe.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};Qm.paths=[["unlink"]],Qm.usage=Re.Usage({description:"disconnect the local project from another one",details:` + This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. + `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var Zoe=Qm;var $oe=ge(WC()),PN=ge(is());ys();var th=class extends Le{constructor(){super(...arguments);this.interactive=J.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=[...t.storedDescriptors.values()],o=s.map(u=>P.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(P.parseDescriptor(u).range!=="unknown")throw new Pe("Ranges aren't allowed when using --recursive");for(let g of(0,PN.default)(o,u)){let f=P.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)t.storedDescriptors.delete(u.descriptorHash),t.storedResolutions.delete(u.descriptorHash);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{await t.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=s?[Vr.KEEP,Vr.REUSE,Vr.PROJECT,Vr.LATEST]:[Vr.PROJECT,Vr.LATEST],l=[],c=[];for(let y of this.patterns){let b=!1,v=P.parseDescriptor(y);for(let x of t.workspaces)for(let T of[Hr.REGULAR,Hr.DEVELOPMENT]){let Y=[...x.manifest.getForScope(T).values()].map($=>P.stringifyIdent($));for(let $ of(0,PN.default)(Y,P.stringifyIdent(v))){let _=P.parseIdent($),ne=x.manifest[T].get(_.identHash);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let ee=P.makeDescriptor(_,v.range);l.push(Promise.resolve().then(async()=>[x,T,ne,await _C(ee,{project:t,workspace:x,cache:n,target:T,modifier:o,strategies:a})])),b=!0}}b||c.push(y)}if(c.length>1)throw new Pe(`Patterns ${ae.prettyList(e,c,Ri.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new Pe(`Pattern ${ae.prettyList(e,c,Ri.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[,,b,{suggestions:v,rejections:x}]of u){let T=v.filter(q=>q.descriptor!==null);if(T.length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let Y=this.cli.error(q);t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range + +${Y}`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled) + +${Y}`)}else T.length>1&&!s&&y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[y,b,,{suggestions:v}]of u){let x,T=v.filter(_=>_.descriptor!==null),q=T[0].descriptor,Y=T.every(_=>P.areDescriptorsEqual(_.descriptor,q));T.length===1||Y?x=q:(f=!0,{answer:x}=await(0,$oe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${P.prettyWorkspace(e,y)} \u276F ${b}?`,choices:v.map(({descriptor:_,name:ne,reason:ee})=>_?{name:ne,hint:ee,descriptor:_}:{name:ne,hint:ee,disabled:!0}),onCancel:()=>process.exit(130),result(_){return this.find(_,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let $=y.manifest[b].get(x.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if($.descriptorHash!==x.descriptorHash)y.manifest[b].set(x.identHash,x),h.push([y,b,$,x]);else{let _=e.makeResolver(),ne={project:t,resolver:_},ee=_.bindDescriptor($,y.anchoredLocator,ne);t.forgetResolution(ee)}}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` +`),(await Je.start({configuration:e,stdout:this.context.stdout},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};th.paths=[["up"]],th.usage=Re.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),th.schema=[eS("recursive",Bc.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var eae=th;var Sm=class extends Le{constructor(){super(...arguments);this.recursive=J.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=J.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=P.parseIdent(this.package).identHash,s=this.recursive?_3e(t,n,{configuration:e,peers:this.peers}):z3e(t,n,{configuration:e,peers:this.peers});ls.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};Sm.paths=[["why"]],Sm.usage=Re.Usage({description:"display the reason why a package is needed",details:` + This command prints the exact reasons why a package appears in the dependency tree. + + If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. + `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var tae=Sm;function z3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.storedPackages.values(),a=>P.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=r.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=r.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=P.stringifyLocator(a);s[p]={value:[a,ae.Type.LOCATOR],children:l}}let h=P.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ae.Type.DEPENDENT]}}}return o}function _3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.workspaces,f=>P.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let m=r.storedResolutions.get(p.descriptorHash);if(!m)throw new Error("Assertion failed: The resolution should have been registered");let y=r.storedPackages.get(m);if(!y)throw new Error("Assertion failed: The package should have been registered");a(y)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let m=p!==null?ae.tuple(ae.Type.DEPENDENT,{locator:f,descriptor:p}):ae.tuple(ae.Type.LOCATOR,f),y={},b={value:m,children:y},v=P.stringifyLocator(f);if(h[v]=b,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&r.tryWorkspaceByLocator(f))))for(let x of f.dependencies.values()){if(!i&&f.peerDependencies.has(x.identHash))continue;let T=r.storedResolutions.get(x.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let q=r.storedPackages.get(T);if(!q)throw new Error("Assertion failed: The package should have been registered");g(q,y,x)}};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var jN={};ft(jN,{default:()=>dWe,gitUtils:()=>Qu});var Qu={};ft(Qu,{TreeishProtocols:()=>On,clone:()=>KN,fetchBase:()=>wae,fetchChangedFiles:()=>Bae,fetchChangedWorkspaces:()=>hWe,fetchRoot:()=>yae,isGitUrl:()=>ih,lsRemote:()=>Iae,normalizeLocator:()=>TN,normalizeRepoUrl:()=>vm,resolveUrl:()=>MN,splitRepoUrl:()=>xm});var NN=ge(dae()),Cae=ge(Zw()),rh=ge(require("querystring")),LN=ge(ri()),mae=ge(require("url"));function Eae(){return te(N({},process.env),{GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`})}var fWe=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],On;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(On||(On={}));function ih(r){return r?fWe.some(e=>!!r.match(e)):!1}function xm(r){r=vm(r);let e=r.indexOf("#");if(e===-1)return{repo:r,treeish:{protocol:On.Head,request:"HEAD"},extra:{}};let t=r.slice(0,e),i=r.slice(e+1);if(i.match(/^[a-z]+=/)){let n=rh.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(On).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=On.Head,a="HEAD");for(let l of Object.values(On))delete n[l];return{repo:t,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:t,treeish:{protocol:s,request:o},extra:{}}}}function vm(r,{git:e=!1}={}){var t;if(r=r.replace(/^git\+https:/,"https:"),r=r.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),r=r.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){r=r.replace(/^git\+([^:]+):/,"$1:");let i;try{i=mae.default.parse(r)}catch{i=null}i&&i.protocol==="ssh:"&&((t=i.path)==null?void 0:t.startsWith("/:"))&&(r=r.replace(/^ssh:\/\//,""))}return r}function TN(r){return P.makeLocator(r,vm(r.reference))}async function Iae(r,e){let t=vm(r,{git:!0});if(!ir.getNetworkSettings(`https://${(0,NN.default)(t).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${t}' has been blocked because of your configuration settings`);let n=await ON("listing refs",["ls-remote",t],{cwd:e.startingCwd,env:Eae()},{configuration:e,normalizedRepoUrl:t}),s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function MN(r,e){let{repo:t,treeish:{protocol:i,request:n},extra:s}=xm(r),o=await Iae(t,e),a=(c,u)=>{switch(c){case On.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return rh.default.stringify(te(N({},s),{commit:u}))}case On.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Semver:{let g=Wt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,m])=>[LN.default.parse(p.slice(10)),m]).filter(p=>p[0]!==null)),h=LN.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return rh.default.stringify(te(N({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(On.Commit,u))!==null||(g=l(On.Tag,u))!==null||(g=l(On.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${t}#${a(i,n)}`}async function KN(r,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:t,treeish:{protocol:i,request:n}}=xm(r);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=vm(t,{git:!0});if(ir.getNetworkSettings(`https://${(0,NN.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await K.mktempPromise(),a={cwd:o,env:Eae()};return await ON("cloning the repository",["clone","-c core.autocrlf=false",s,H.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await ON("switching branch",["checkout",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function yae(r){let e=null,t,i=r;do t=i,await K.existsPromise(k.join(t,".git"))&&(e=t),i=k.dirname(t);while(e===null&&i!==t);return e}async function wae(r,{baseRefs:e}){if(e.length===0)throw new Pe("Can't run this command with zero base refs specified.");let t=[];for(let a of e){let{code:l}=await Nr.execvp("git",["merge-base",a,"HEAD"],{cwd:r});l===0&&t.push(a)}if(t.length===0)throw new Pe(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await Nr.execvp("git",["merge-base","HEAD",...t],{cwd:r,strict:!0}),n=i.trim(),{stdout:s}=await Nr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:r,strict:!0}),o=s.trim();return{hash:n,title:o}}async function Bae(r,{base:e,project:t}){let i=Se.buildIgnorePattern(t.configuration.get("changesetIgnorePatterns")),{stdout:n}=await Nr.execvp("git",["diff","--name-only",`${e}`],{cwd:r,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),{stdout:o}=await Nr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:r,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!k.relative(t.cwd,c).match(i)):l}async function hWe({ref:r,project:e}){if(e.configuration.projectCwd===null)throw new Pe("This command can only be run from within a Yarn project");let t=[k.resolve(e.cwd,e.configuration.get("cacheFolder")),k.resolve(e.cwd,e.configuration.get("installStatePath")),k.resolve(e.cwd,e.configuration.get("lockfileFilename")),k.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&t.push(o)});let i=await yae(e.configuration.projectCwd);if(i==null)throw new Pe("This command can only be run on Git repositories");let n=await wae(i,{baseRefs:typeof r=="string"?[r]:e.configuration.get("changesetBaseRefs")}),s=await Bae(i,{base:n.hash,project:e});return new Set(Se.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?Se.mapAndFilter.skip:t.some(l=>o.startsWith(l))?Se.mapAndFilter.skip:a}))}async function ON(r,e,t,{configuration:i,normalizedRepoUrl:n}){try{return await Nr.execvp("git",e,te(N({},t),{strict:!0}))}catch(s){if(!(s instanceof Nr.ExecError))throw s;let o=s.reportExtra,a=s.stderr.toString();throw new ct(X.EXCEPTION,`Failed ${r}`,l=>{l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:"Repository URL",value:ae.tuple(ae.Type.URL,n)})}`);for(let c of a.matchAll(/^(.+?): (.*)$/gm)){let[,u,g]=c;u=u.toLowerCase();let f=u==="error"?"Error":`${(0,Cae.default)(u)} Error`;l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:f,value:ae.tuple(ae.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var UN=class{supports(e,t){return ih(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,n=TN(e),s=new Map(t.checksums);s.set(n.locatorHash,i);let o=te(N({},t),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:P.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,t){return t.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){let i=await KN(e.reference,t.project.configuration),n=xm(e.reference),s=k.join(i,"package.tgz");await Zt.prepareExternalProject(i,s,{configuration:t.project.configuration,report:t.report,workspace:n.extra.workspace,locator:e});let o=await K.readFilePromise(s);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(o,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}))}};var HN=class{supportsDescriptor(e,t){return ih(e.range)}supportsLocator(e,t){return ih(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=await MN(e.range,i.project.configuration);return[P.makeLocator(e,n)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var pWe={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:Ie.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:Ie.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:Ie.NUMBER,default:2}},fetchers:[UN],resolvers:[HN]};var dWe=pWe;var km=class extends Le{constructor(){super(...arguments);this.since=J.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=J.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Qu.fetchChangedWorkspaces({ref:this.since,project:t}):t.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of At.hardDependencies)for(let[h,p]of l.getForScope(f)){let m=t.tryWorkspaceByDescriptor(p);m===null?t.workspacesByIdent.has(h)&&g.add(p):u.add(m)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>P.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(N({location:a.relativeCwd,name:l.name?P.stringifyIdent(l.name):null},c))}})).exitCode()}};km.paths=[["workspaces","list"]],km.usage=Re.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var bae=km;var Pm=class extends Le{constructor(){super(...arguments);this.workspaceName=J.String();this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=t.workspaces,s=new Map(n.map(a=>{let l=P.convertToIdent(a.locator);return[P.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new Pe(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: + - ${a.join(` + - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};Pm.paths=[["workspace"]],Pm.usage=Re.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` + This command will run a given sub-command on a single workspace. + `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var Qae=Pm;var CWe={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:Ie.BOOLEAN,default:Sae.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:Ie.STRING,values:["^","~",""],default:pa.CARET}},commands:[Tne,Mne,$se,uoe,Voe,Toe,boe,bae,Coe,moe,Eoe,Ioe,Nne,Lne,goe,hoe,yoe,woe,Soe,xoe,koe,Doe,Zoe,Roe,joe,Uoe,Goe,Foe,Yoe,qoe,Joe,zoe,_oe,eae,tae,Qae]},mWe=CWe;var zN={};ft(zN,{default:()=>IWe});var Ge={optional:!0},YN=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Ge}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Ge,["postcss-jsx"]:Ge,["postcss-less"]:Ge,["postcss-markdown"]:Ge,["postcss-scss"]:Ge}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Ge}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Ge}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Ge,"vue-template-compiler":Ge}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Ge,"utf-8-validate":Ge}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge,"vuetify-loader":Ge}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Ge}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Ge}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:Ge}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Ge,tinyliquid:Ge,"liquid-node":Ge,jade:Ge,"then-jade":Ge,dust:Ge,"dustjs-helpers":Ge,"dustjs-linkedin":Ge,swig:Ge,"swig-templates":Ge,"razor-tmpl":Ge,atpl:Ge,liquor:Ge,twig:Ge,ejs:Ge,eco:Ge,jazz:Ge,jqtpl:Ge,hamljs:Ge,hamlet:Ge,whiskers:Ge,"haml-coffee":Ge,"hogan.js":Ge,templayed:Ge,handlebars:Ge,underscore:Ge,lodash:Ge,pug:Ge,"then-pug":Ge,qejs:Ge,walrus:Ge,mustache:Ge,just:Ge,ect:Ge,mote:Ge,toffee:Ge,dot:Ge,"bracket-template":Ge,ractive:Ge,nunjucks:Ge,htmling:Ge,"babel-core":Ge,plates:Ge,"react-dom":Ge,react:Ge,"arc-templates":Ge,vash:Ge,slm:Ge,marko:Ge,teacup:Ge,"coffee-script":Ge,squirrelly:Ge,twing:Ge}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge,vue:Ge}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Ge}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Ge}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(r=>[r,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Ge,"webpack-command":Ge}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Ge}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Ge}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:Ge,jimp:Ge}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":Ge,"eslint-import-resolver-typescript":Ge,"eslint-import-resolver-webpack":Ge,"@typescript-eslint/parser":Ge}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":Ge}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":Ge}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.0"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:Ge}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:Ge}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@*",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{["vue-template-compiler"]:"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["parcel@*",{peerDependenciesMeta:{["@parcel/core"]:Ge}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@*",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:{optional:!0}}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}]];var qN;function vae(){return typeof qN=="undefined"&&(qN=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),qN}var JN;function xae(){return typeof JN=="undefined"&&(JN=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),JN}var WN;function kae(){return typeof WN=="undefined"&&(WN=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),WN}var Pae=new Map([[P.makeIdent(null,"fsevents").identHash,vae],[P.makeIdent(null,"resolve").identHash,xae],[P.makeIdent(null,"typescript").identHash,kae]]),EWe={hooks:{registerPackageExtensions:async(r,e)=>{for(let[t,i]of YN)e(P.parseDescriptor(t,!0),i)},getBuiltinPatch:async(r,e)=>{var s;let t="compat/";if(!e.startsWith(t))return;let i=P.parseIdent(e.slice(t.length)),n=(s=Pae.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(r,e,t,i)=>typeof Pae.get(r.identHash)=="undefined"?r:P.makeDescriptor(r,P.makeRange({protocol:"patch:",source:P.stringifyDescriptor(r),selector:`~builtin`,params:null}))}},IWe=EWe;var _N={};ft(_N,{default:()=>wWe});var X0=class extends Le{constructor(){super(...arguments);this.pkg=J.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let t=P.parseDescriptor(this.command),i;t.scope?i=P.makeIdent(t.scope,`create-${t.name}`):t.name.startsWith("@")?i=P.makeIdent(t.name.substring(1),"create"):i=P.makeIdent(null,`create-${t.name}`);let n=P.stringifyIdent(i);return t.range!=="unknown"&&(n+=`@${t.range}`),this.cli.run(["dlx",...e,n,...this.args])}};X0.paths=[["create"]];var Dae=X0;var Dm=class extends Le{constructor(){super(...arguments);this.packages=J.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){return ye.telemetry=null,await K.mktempPromise(async e=>{var p;let t=k.join(e,`dlx-${process.pid}`);await K.mkdirPromise(t),await K.writeFilePromise(k.join(t,"package.json"),`{} +`),await K.writeFilePromise(k.join(t,"yarn.lock"),"");let i=k.join(t,".yarnrc.yml"),n=await ye.findProjectCwd(this.context.cwd,kt.lockfile),s=!(await ye.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?k.join(n,".yarnrc.yml"):null;o!==null&&K.existsSync(o)?(await K.copyFilePromise(o,i),await ye.updateConfiguration(t,m=>{let y=te(N({},m),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(m.plugins)&&(y.plugins=m.plugins.map(b=>{let v=typeof b=="string"?b:b.path,x=H.isAbsolute(v)?v:H.resolve(H.fromPortablePath(n),v);return typeof b=="string"?x:{path:x,spec:b.spec}})),y})):await K.writeFilePromise(i,`enableGlobalCache: ${s} +enableTelemetry: false +`);let a=(p=this.packages)!=null?p:[this.command],l=P.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:t,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` +`);let u=await ye.find(t,this.context.plugins),{project:g,workspace:f}=await ze.find(u,t);if(f===null)throw new ht(g.cwd,t);await g.restoreInstallState();let h=await Zt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Zt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Dm.paths=[["dlx"]],Dm.usage=Re.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var Rae=Dm;var yWe={commands:[Dae,Rae]},wWe=yWe;var nL={};ft(nL,{default:()=>QWe,fileUtils:()=>VN});var nh=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,Rm=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Xr="file:";var VN={};ft(VN,{makeArchiveFromLocator:()=>Z0,makeBufferFromLocator:()=>$N,makeLocator:()=>ZN,makeSpec:()=>Fae,parseSpec:()=>XN});function XN(r){let{params:e,selector:t}=P.parseRange(r),i=H.toPortablePath(t);return{parentLocator:e&&typeof e.locator=="string"?P.parseLocator(e.locator):null,path:i}}function Fae({parentLocator:r,path:e,folderHash:t,protocol:i}){let n=r!==null?{locator:P.stringifyLocator(r)}:{},s=typeof t!="undefined"?{hash:t}:{};return P.makeRange({protocol:i,source:e,selector:e,params:N(N({},s),n)})}function ZN(r,{parentLocator:e,path:t,folderHash:i,protocol:n}){return P.makeLocator(r,Fae({parentLocator:e,path:t,folderHash:i,protocol:n}))}async function Z0(r,{protocol:e,fetchOptions:t,inMemory:i=!1}){let{parentLocator:n,path:s}=P.parseFileStyleRange(r.reference,{protocol:e}),o=k.isAbsolute(s)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(n,t),a=o.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=k.join(a.prefixPath,s);return await Se.releaseAfterUseAsync(async()=>await Bi.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:P.getIdentVendorPath(r),compressionLevel:t.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function $N(r,{protocol:e,fetchOptions:t}){return(await Z0(r,{protocol:e,fetchOptions:t,inMemory:!0})).getBufferAndClose()}var eL=class{supports(e,t){return!!e.reference.startsWith(Xr)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async fetchFromDisk(e,t){return Z0(e,{protocol:Xr,fetchOptions:t})}};var BWe=2,tL=class{supportsDescriptor(e,t){return e.range.match(nh)?!0:!!e.range.startsWith(Xr)}supportsLocator(e,t){return!!e.reference.startsWith(Xr)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=XN(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await $N(P.makeLocator(e,P.makeRange({protocol:Xr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:Xr,fetchOptions:i.fetchOptions}),a=Dn.makeHash(`${BWe}`,o).slice(0,6);return[ZN(e,{parentLocator:s,path:n,folderHash:a,protocol:Xr})]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var rL=class{supports(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.join(o.prefixPath,n),c=await a.readFilePromise(l);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(c,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var iL=class{supportsDescriptor(e,t){return Rm.test(e.range)?!!(e.range.startsWith(Xr)||nh.test(e.range)):!1}supportsLocator(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range;return n.startsWith(Xr)&&(n=n.slice(Xr.length)),[P.makeLocator(e,`${Xr}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var bWe={fetchers:[rL,eL],resolvers:[iL,tL]},QWe=bWe;var oL={};ft(oL,{default:()=>xWe});var Nae=ge(require("querystring")),Lae=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function Tae(r){return r?Lae.some(e=>!!r.match(e)):!1}function Oae(r){let e;for(let a of Lae)if(e=r.match(a),e)break;if(!e)throw new Error(SWe(r));let[,t,i,n,s="master"]=e,{commit:o}=Nae.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:t,username:i,reponame:n,treeish:s}}function SWe(r){return`Input cannot be parsed as a valid GitHub URL ('${r}').`}var sL=class{supports(e,t){return!!Tae(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await K.mktempPromise(async n=>{let s=new _t(n);await Bi.extractArchiveTo(i,s,{stripComponents:1});let o=Qu.splitRepoUrl(e.reference),a=k.join(n,"package.tgz");await Zt.prepareExternalProject(n,a,{configuration:t.project.configuration,report:t.report,workspace:o.extra.workspace,locator:e});let l=await K.readFilePromise(a);return await Bi.convertToZip(l,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){let{auth:i,username:n,reponame:s,treeish:o}=Oae(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var vWe={hooks:{async fetchHostedRepository(r,e,t){if(r!==null)return r;let i=new sL;if(!i.supports(e,t))return null;try{return await i.fetch(e,t)}catch(n){return null}}}},xWe=vWe;var lL={};ft(lL,{default:()=>PWe});var Fm=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,Nm=/^https?:/;var aL=class{supports(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(e.reference,{configuration:t.project.configuration});return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var AL=class{supportsDescriptor(e,t){return Fm.test(e.range)?!!Nm.test(e.range):!1}supportsLocator(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[P.convertDescriptorToLocator(e)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var kWe={fetchers:[aL],resolvers:[AL]},PWe=kWe;var fL={};ft(fL,{default:()=>D4e});var cAe=ge(lAe()),gL=ge(require("util")),Lm=class extends Le{constructor(){super(...arguments);this.private=J.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=J.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=J.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=J.Boolean("-2",!1,{hidden:!0});this.yes=J.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=J.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return t!==null?await this.executeProxy(e,t):await this.executeRegular(e)}async executeProxy(e,t){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new Pe("Cannot use the --install flag from within a project subdirectory");K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=k.join(this.context.cwd,e.get("lockfileFilename"));K.existsSync(i)||await K.writeFilePromise(i,"");let n=await this.cli.run(["set","version",t],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await K.mktempPromise(async o=>{let{code:a}=await Nr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Zt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let t=null;try{t=(await ze.find(e,this.context.cwd)).project}catch{t=null}K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=await At.tryFind(this.context.cwd)||new At,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:P.makeIdent(e.get("initScope"),k.basename(this.context.cwd)),i.packageManager=Ur&&Se.isTaggedYarnVersion(Ur)?`yarn@${Ur}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await K.mkdirPromise(k.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),gL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,gL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} +`);let o=k.join(this.context.cwd,At.fileName);await K.changeFilePromise(o,`${JSON.stringify(s,null,2)} +`,{automaticNewlines:!0});let a=k.join(this.context.cwd,"README.md");if(K.existsSync(a)||await K.writeFilePromise(a,`# ${P.stringifyIdent(i.name)} +`),!t||t.cwd===this.context.cwd){let c=k.join(this.context.cwd,kt.lockfile);K.existsSync(c)||await K.writeFilePromise(c,"");let g=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!.yarn/cache","#.pnp.*"].map(y=>`${y} +`).join(""),f=k.join(this.context.cwd,".gitignore");K.existsSync(f)||await K.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,cAe.default)(h,e.get("initEditorConfig"));let p=`root = true +`;for(let[y,b]of Object.entries(h)){p+=` +[${y}] +`;for(let[v,x]of Object.entries(b))p+=`${v.replace(/[A-Z]/g,q=>`_${q.toLowerCase()}`)} = ${x} +`}let m=k.join(this.context.cwd,".editorconfig");K.existsSync(m)||await K.writeFilePromise(m,p),K.existsSync(k.join(this.context.cwd,".git"))||await Nr.execvp("git",["init"],{cwd:this.context.cwd})}}};Lm.paths=[["init"]],Lm.usage=Re.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var uAe=Lm;var P4e={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:Ie.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}}},commands:[uAe]},D4e=P4e;var mL={};ft(mL,{default:()=>F4e});var wA="portal:",BA="link:";var hL=class{supports(e,t){return!!e.reference.startsWith(wA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot}}};var pL=class{supportsDescriptor(e,t){return!!e.range.startsWith(wA)}supportsLocator(e,t){return!!e.reference.startsWith(wA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(wA.length);return[P.makeLocator(e,`${wA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var dL=class{supports(e,t){return!!e.reference.startsWith(BA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0}}};var CL=class{supportsDescriptor(e,t){return!!e.range.startsWith(BA)}supportsLocator(e,t){return!!e.reference.startsWith(BA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(BA.length);return[P.makeLocator(e,`${BA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){return te(N({},e),{version:"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var R4e={fetchers:[dL,hL],resolvers:[CL,pL]},F4e=R4e;var JL={};ft(JL,{default:()=>j8e});var Mn;(function(i){i[i.REGULAR=0]="REGULAR",i[i.WORKSPACE=1]="WORKSPACE",i[i.EXTERNAL_SOFT_LINK=2]="EXTERNAL_SOFT_LINK"})(Mn||(Mn={}));var bA;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(bA||(bA={}));var EL=(r,e)=>`${r}@${e}`,gAe=(r,e)=>{let t=e.indexOf("#"),i=t>=0?e.substring(t+1):e;return EL(r,i)},yo;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(yo||(yo={}));var hAe=(r,e={})=>{let t=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||t>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:t,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=N4e(r,s),l=!1,c=0;do l=IL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=Tm(a);if(IL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: +${u}, next tree: +${Tm(a)}`);let f=fAe(a);if(f)throw new Error(`${f}, after hoisting finished: +${Tm(a)}`)}return s.debugLevel>=2&&console.log(Tm(a)),L4e(a)},T4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())t.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),t},O4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of r)u=g.dependencies.get(c.name),u&&t.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),t},pAe=(r,e)=>{if(e.decoupled)return e;let{name:t,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:p,hoistedTo:m}=e,y={name:t,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:new Map(p),hoistedTo:new Map(m)},b=y.dependencies.get(t);return b&&b.ident==y.ident&&y.dependencies.set(t,y),r.dependencies.set(y.name,y),y},M4e=(r,e)=>{let t=new Map([[r.name,[r.ident]]]);for(let n of r.dependencies.values())r.peerNames.has(n.name)||t.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!r.peerNames.has(s)){let a=t.get(s);a||(a=[],t.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return t},yL=r=>{let e=new Set,t=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!r.peerNames.has(s)){let o=r.dependencies.get(s);o&&!e.has(o)&&t(o,n)}e.add(i)}};for(let i of r.dependencies.values())r.peerNames.has(i.name)||t(i);return e},IL=(r,e,t,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=U4e(o),l=M4e(o,a),c=r==o?new Map:n.fastLookupPossible?T4e(e):O4e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([m,y])=>[m,y[0]])),p=new Map;do{let m=K4e(r,e,t,c,h,l,i,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),u=!1;for(let[y,b]of l)b.length>1&&!o.dependencies.has(y)&&(h.delete(y),b.shift(),h.set(y,b[0]),u=!0)}while(u);for(let m of o.dependencies.values())if(!o.peerNames.has(m.name)&&!t.has(m.locator)){t.add(m.locator);let y=IL(r,[...e,m],t,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),t.delete(m.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},H4e=r=>{for(let[e,t]of r.dependencies)if(!r.peerNames.has(e)&&t.ident!==r.ident)return!0;return!1},j4e=(r,e,t,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(y=>Li(y)).join("\u2192")}`);let h=t[t.length-1],m=!(i.ident===h.ident);if(l&&!m&&(g="- self-reference"),m&&(m=i.dependencyKind!==1,l&&!m&&(g="- workspace")),m&&i.dependencyKind===2&&(m=!H4e(i),l&&!m&&(g="- external soft link with unhoisted dependencies")),m&&(m=h.dependencyKind!==1||h.hoistedFrom.has(i.name)||e.size===1,l&&!m&&(g=h.reasons.get(i.name))),m&&(m=!r.peerNames.has(i.name),l&&!m&&(g=`- cannot shadow peer: ${Li(r.originalDependencies.get(i.name).locator)} at ${u}`)),m){let y=!1,b=n.get(i.name);if(y=!b||b.ident===i.ident,l&&!y&&(g=`- filled by: ${Li(b.locator)} at ${u}`),y)for(let v=t.length-1;v>=1;v--){let T=t[v].dependencies.get(i.name);if(T&&T.ident!==i.ident){y=!1;let q=a.get(h);q||(q=new Set,a.set(h,q)),q.add(i.name),l&&(g=`- filled by ${Li(T.locator)} at ${t.slice(0,v).map(Y=>Li(Y.locator)).join("\u2192")}`);break}}m=y}if(m&&(m=s.get(i.name)===i.ident,l&&!m&&(g=`- filled by: ${Li(o.get(i.name)[0])} at ${u}`)),m){let y=!0,b=new Set(i.peerNames);for(let v=t.length-1;v>=1;v--){let x=t[v];for(let T of b){if(x.peerNames.has(T)&&x.originalDependencies.has(T))continue;let q=x.dependencies.get(T);q&&r.dependencies.get(T)!==q&&(v===t.length-1?f.add(q):(f=null,y=!1,l&&(g=`- peer dependency ${Li(q.locator)} from parent ${Li(x.locator)} was not hoisted to ${u}`))),b.delete(T)}if(!y)break}m=y}if(m&&!c)for(let y of i.hoistedDependencies.values()){let b=n.get(y.name)||r.dependencies.get(y.name);if(!b||y.ident!==b.ident){m=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${Li(y.locator)}, available: ${Li(b==null?void 0:b.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:m?0:1,reason:g}},$0=r=>`${r.name}@${r.locator}`,K4e=(r,e,t,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(b,v,x,T,q)=>{if(u.has(T))return;let Y=[...v,$0(T)],$=[...x,$0(T)],_=new Map,ne=new Map;for(let Z of yL(T)){let O=j4e(c,t,[c,...b,T],Z,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(ne.set(Z,O),O.isHoistable===2)for(let L of O.dependsOn){let de=_.get(L.name)||new Set;de.add(Z.name),_.set(L.name,de)}}let ee=new Set,A=(Z,O,L)=>{if(!ee.has(Z)){ee.add(Z),ne.set(Z,{isHoistable:1,reason:L});for(let de of _.get(Z.name)||[])A(T.dependencies.get(de),O,l.debugLevel>=2?`- peer dependency ${Li(Z.locator)} from parent ${Li(T.locator)} was not hoisted`:"")}};for(let[Z,O]of ne)O.isHoistable===1&&A(Z,O,O.reason);let oe=!1;for(let Z of ne.keys())if(!ee.has(Z)){f=!0;let O=o.get(T);O&&O.has(Z.name)&&(g=!0),oe=!0,T.dependencies.delete(Z.name),T.hoistedDependencies.set(Z.name,Z),T.reasons.delete(Z.name);let L=c.dependencies.get(Z.name);if(l.debugLevel>=2){let de=Array.from(v).concat([T.locator]).map(je=>Li(je)).join("\u2192"),Be=c.hoistedFrom.get(Z.name);Be||(Be=[],c.hoistedFrom.set(Z.name,Be)),Be.push(de),T.hoistedTo.set(Z.name,Array.from(e).map(je=>Li(je.locator)).join("\u2192"))}if(!L)c.ident!==Z.ident&&(c.dependencies.set(Z.name,Z),q.add(Z));else for(let de of Z.references)L.references.add(de)}if(T.dependencyKind===2&&oe&&(g=!0),l.check){let Z=fAe(r);if(Z)throw new Error(`${Z}, after hoisting dependencies of ${[c,...b,T].map(O=>Li(O.locator)).join("\u2192")}: +${Tm(r)}`)}let ce=yL(T);for(let Z of ce)if(ee.has(Z)){let O=ne.get(Z);if((n.get(Z.name)===Z.ident||!T.reasons.has(Z.name))&&O.isHoistable!==0&&T.reasons.set(Z.name,O.reason),!Z.isHoistBorder&&$.indexOf($0(Z))<0){u.add(T);let de=pAe(T,Z);h([...b,T],Y,$,de,m),u.delete(T)}}},p,m=new Set(yL(c)),y=Array.from(e).map(b=>$0(b));do{p=m,m=new Set;for(let b of p){if(b.locator===c.locator||b.isHoistBorder)continue;let v=pAe(c,b);h([],Array.from(t),y,v,m)}}while(m.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},fAe=r=>{let e=[],t=new Set,i=new Set,n=(s,o,a)=>{if(t.has(s)||(t.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>Li(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,m=`${h?` hoisted to ${h}`:""}`,y=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${y} - broken require promise for ${c.name}${m}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${y} - broken require promise: no required dependency ${c.name}${m} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(r,r.dependencies,r),e.join(` +`)},N4e=(r,e)=>{let{identName:t,name:i,reference:n,peerNames:s}=r,o={name:i,references:new Set([n]),locator:EL(t,n),ident:gAe(t,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[r,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:m,peerNames:y,hoistPriority:b,dependencyKind:v}=c,x=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([m]),locator:EL(p,m),ident:gAe(p,m),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(y),reasons:new Map,decoupled:!0,isHoistBorder:x?x.has(h):!1,hoistPriority:b||0,dependencyKind:v||0,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=m=>{if(!h.has(m)){h.add(m),m.decoupled=!1;for(let y of m.dependencies.values())m.peerNames.has(y.name)||p(y)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of r.dependencies)l(c,o);return o},wL=r=>r.substring(0,r.indexOf("@",1)),L4e=r=>{let e={name:r.name,identName:wL(r.locator),references:new Set(r.references),dependencies:new Set},t=new Set([r]),i=(n,s,o)=>{let a=t.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:wL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){t.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);t.delete(n)}};for(let n of r.dependencies.values())i(n,r,e);return e},U4e=r=>{let e=new Map,t=new Set([r]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!t.has(a);if(n(a).dependents.add(o.ident),!l){t.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of r.dependencies.values())r.peerNames.has(o.name)||s(r,o);return e},Li=r=>{if(!r)return"none";let e=r.indexOf("@",1),t=r.substring(0,e);t.endsWith("$wsroot$")&&(t=`wh:${t.replace("$wsroot$","")}`);let i=r.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(t=`v:${t}`),n.startsWith("workspace")&&(t=`w:${t}`,n=""),`${t}${n?`@${n}`:""}`}else return`${t}`},dAe=5e4,Tm=r=>{let e=0,t=(n,s,o="")=>{if(e>dAe||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name===u.name?0:c.name>u.name?1:-1),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+Li(u.locator)+(g?` ${g}`:"")} +`,l+=t(u,s,`${o}${cdAe?` +Tree is too large, part of the tree has been dunped +`:"")};var wo;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(wo||(wo={}));var Kn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Kn||(Kn={}));var CAe="node_modules",Su="$wsroot$";var Om=(r,e)=>{let{packageTree:t,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=G4e(r,e),o=null;if(n.length===0){let a=hAe(t,{hoistingLimits:i});o=Y4e(r,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},da=r=>`${r.name}@${r.reference}`,BL=r=>{let e=new Map;for(let[t,i]of r.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(t)}for(let t of e.values())t.locations=t.locations.sort((i,n)=>{let s=i.split(k.delimiter).length,o=n.split(k.delimiter).length;return n===i?0:s!==o?o-s:n>i?1:-1});return e},mAe=(r,e)=>{let t=P.isVirtualLocator(r)?P.devirtualizeLocator(r):r,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(t,i)},bL=(r,e,t,i)=>{if(r.linkType!==wo.SOFT)return!1;let n=H.toPortablePath(t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation);return k.contains(i,n)===null},q4e=r=>{let e=r.getPackageInformation(r.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(r.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=H.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=r.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=da(f);if(l.has(p))return;l.add(p);let m=r.getPackageInformation(f);if(m){let y=h?da(h):"";if(da(f)!==y&&m.linkType===wo.SOFT&&!bL(m,f,r,i)){let b=EAe(m,f,r);(!a.get(b)||f.reference.startsWith("workspace:"))&&a.set(b,f)}for(let[b,v]of m.packageDependencies)v!==null&&(m.packagePeers.has(b)||c(r.getLocator(b,v),f))}};for(let f of o)c(f,null);let u=i.split(k.sep);for(let f of a.values()){let h=r.getPackageInformation(f),m=H.toPortablePath(h.packageLocation.slice(0,-1)).split(k.sep).slice(u.length),y=s;for(let b of m){let v=y.children.get(b);v||(v={children:new Map},y.children.set(b,v)),y=v}y.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=da(h),m=n.get(p);m||(m=new Set,n.set(p,m)),m.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},G4e=(r,e)=>{let t=[],i=!1,n=new Map,s=q4e(r),o=r.getPackageInformation(r.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=r.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=H.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,dependencyKind:Mn.WORKSPACE},u=new Map,g=(h,p)=>`${da(p)}:${h}`,f=(h,p,m,y,b,v,x,T)=>{var Z,O;let q=g(h,m),Y=u.get(q),$=!!Y;!$&&m.name===a.name&&m.reference===a.reference&&(Y=c,u.set(q,c));let _=bL(p,m,r,l);if(!Y){let L=Mn.REGULAR;_?L=Mn.EXTERNAL_SOFT_LINK:p.linkType===wo.SOFT&&m.name.endsWith(Su)&&(L=Mn.WORKSPACE),Y={name:h,identName:m.name,reference:m.reference,dependencies:new Set,peerNames:L===Mn.WORKSPACE?new Set:p.packagePeers,dependencyKind:L},u.set(q,Y)}let ne;if(_?ne=2:b.linkType===wo.SOFT?ne=1:ne=0,Y.hoistPriority=Math.max(Y.hoistPriority||0,ne),T&&!_){let L=da({name:y.identName,reference:y.reference}),de=n.get(L)||new Set;n.set(L,de),de.add(Y.name)}let ee=new Map(p.packageDependencies);if(e.project){let L=e.project.workspacesByCwd.get(H.toPortablePath(p.packageLocation.slice(0,-1)));if(L){let de=new Set([...Array.from(L.manifest.peerDependencies.values(),Be=>P.stringifyIdent(Be)),...Array.from(L.manifest.peerDependenciesMeta.keys())]);for(let Be of de)ee.has(Be)||(ee.set(Be,v.get(Be)||null),Y.peerNames.add(Be))}}let A=da({name:m.name.replace(Su,""),reference:m.reference}),oe=s.get(A);if(oe)for(let L of oe)ee.set(`${L.name}${Su}`,L.reference);(p!==b||p.linkType!==wo.SOFT||!_&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(x)))&&y.dependencies.add(Y);let ce=m!==a&&p.linkType===wo.SOFT&&!m.name.endsWith(Su)&&!_;if(!$&&!ce){let L=new Map;for(let[de,Be]of ee)if(Be!==null){let je=r.getLocator(de,Be),re=r.getLocator(de.replace(Su,""),Be),se=r.getPackageInformation(re);if(se===null)throw new Error("Assertion failed: Expected the package to have been registered");let be=bL(se,je,r,l);if(e.validateExternalSoftLinks&&e.project&&be){se.packageDependencies.size>0&&(i=!0);for(let[ve,pe]of se.packageDependencies)if(pe!==null){let V=P.parseLocator(Array.isArray(pe)?`${pe[0]}@${pe[1]}`:`${ve}@${pe}`);if(da(V)!==da(je)){let Qe=ee.get(ve);if(Qe){let le=P.parseLocator(Array.isArray(Qe)?`${Qe[0]}@${Qe[1]}`:`${ve}@${Qe}`);mAe(le,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with parent dependency ${P.prettyLocator(e.project.configuration,le)}`})}else{let le=L.get(ve);if(le){let fe=le.target,gt=P.parseLocator(Array.isArray(fe)?`${fe[0]}@${fe[1]}`:`${ve}@${fe}`);mAe(gt,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with dependency ${P.prettyLocator(e.project.configuration,gt)} from sibling portal ${P.prettyIdent(e.project.configuration,P.parseIdent(le.portal.name))}`})}else L.set(ve,{target:V.reference,portal:je})}}}}let he=(Z=e.hoistingLimitsByCwd)==null?void 0:Z.get(x),Fe=be?x:k.relative(l,H.toPortablePath(se.packageLocation))||Me.dot,Ke=(O=e.hoistingLimitsByCwd)==null?void 0:O.get(Fe),ke=he===Kn.DEPENDENCIES||Ke===Kn.DEPENDENCIES||Ke===Kn.WORKSPACES;f(de,se,je,Y,p,ee,Fe,ke)}}};return f(a.name,o,a,c,o,o.packageDependencies,Me.dot,!1),{packageTree:c,hoistingLimits:n,errors:t,preserveSymlinksRequired:i}};function EAe(r,e,t){let i=t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation;return H.toPortablePath(i||r.packageLocation)}function J4e(r,e,t){let i=e.getLocator(r.name.replace(Su,""),r.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return t.pnpifyFs?(o=H.toPortablePath(n.packageLocation),s=wo.SOFT):(o=EAe(n,r,e),s=n.linkType),{linkType:s,target:o}}var Y4e=(r,e,t)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=J4e(u,r,t);return{locator:da(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:Jr(g),name:Jr(f)}:{scope:null,name:Jr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),m={name:h.identName,reference:p[0]},{name:y,scope:b}=s(h.name),v=b?[b,y]:[y],x=k.join(g,CAe),T=k.join(x,...v),q=`${f}/${m.name}`,Y=n(m,f,p.slice(1)),$=!1;if(Y.linkType===wo.SOFT&&t.project){let _=t.project.workspacesByCwd.get(Y.target.slice(0,-1));$=!!(_&&!_.manifest.name)}if(!h.name.endsWith(Su)&&!$){let _=i.get(T);if(_){if(_.dirList)throw new Error(`Assertion failed: ${T} cannot merge dir node with leaf node`);{let oe=P.parseLocator(_.locator),ce=P.parseLocator(Y.locator);if(_.linkType!==Y.linkType)throw new Error(`Assertion failed: ${T} cannot merge nodes with different link types ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/${P.stringifyLocator(ce)}`);if(oe.identHash!==ce.identHash)throw new Error(`Assertion failed: ${T} cannot merge nodes with different idents ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/s${P.stringifyLocator(ce)}`);Y.aliases=[...Y.aliases,..._.aliases,P.parseLocator(_.locator).reference]}}i.set(T,Y);let ne=T.split("/"),ee=ne.indexOf(CAe),A=ne.length-1;for(;ee>=0&&A>ee;){let oe=H.toPortablePath(ne.slice(0,A).join(k.sep)),ce=Jr(ne[A]),Z=i.get(oe);if(!Z)i.set(oe,{dirList:new Set([ce])});else if(Z.dirList){if(Z.dirList.has(ce))break;Z.dirList.add(ce)}A--}}a(h,Y.linkType===wo.SOFT?Y.target:T,q)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var LL={};ft(LL,{PnpInstaller:()=>oh,PnpLinker:()=>xu,default:()=>d8e,getPnpPath:()=>Tl,jsInstallUtils:()=>Ca,pnpUtils:()=>FL,quotePathIfNeeded:()=>GAe});var HAe=ge(ri()),jAe=ge(require("url"));var IAe;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(IAe||(IAe={}));var er;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(er||(er={}));var yAe={[er.DEFAULT]:{collapsed:!1,next:{["*"]:er.DEFAULT}},[er.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:er.FALLBACK_EXCLUSION_LIST,packageRegistryData:er.PACKAGE_REGISTRY_DATA,["*"]:er.DEFAULT}},[er.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:er.FALLBACK_EXCLUSION_ENTRIES}},[er.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:er.FALLBACK_EXCLUSION_DATA}},[er.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:er.DEFAULT}},[er.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_REGISTRY_ENTRIES}},[er.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_STORE_DATA}},[er.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_STORE_ENTRIES}},[er.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_INFORMATION_DATA}},[er.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:er.PACKAGE_DEPENDENCIES,["*"]:er.DEFAULT}},[er.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:er.PACKAGE_DEPENDENCY}},[er.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:er.DEFAULT}}};function W4e(r,e,t){let i="";i+="[";for(let n=0,s=r.length;ns(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function X4e(r){let e=new Map,t=Mm(r.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of t){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function Z4e(r){return Mm(r.fallbackPool||[],([e])=>e)}function $4e(r){let e=[];for(let[t,i]of Mm(r.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([t,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of Mm(i,([g])=>g===null?"0":`1${g}`)){let g=[];t!==null&&s!==null&&!a.has(t)&&g.push([t,s]);for(let[p,m]of Mm(a.entries(),([y])=>y))g.push([p,m]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function Km(r){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:r.dependencyTreeRoots,enableTopLevelFallback:r.enableTopLevelFallback||!1,ignorePatternData:r.ignorePattern||null,fallbackExclusionList:X4e(r),fallbackPool:Z4e(r),packageRegistryData:$4e(r)}}var SAe=ge(QAe());function vAe(r,e){return[r?`${r} +`:"",`/* eslint-disable */ + +`,`try { +`,` Object.freeze({}).detectStrictMode = true; +`,`} catch (error) { +`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} +`,` +`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,e.replace(/^/gm," "),`} +`,` +`,(0,SAe.default)()].join("")}function e8e(r){return JSON.stringify(r,null,2)}function t8e(r){return`'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ +`)}'`}function r8e(r){return[`return hydrateRuntimeState(JSON.parse(${t8e(BAe(r))}), {basePath: basePath || __dirname}); +`].join("")}function i8e(r){return[`var path = require('path'); +`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(r)}); +`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); +`].join("")}function xAe(r){let e=Km(r),t=r8e(e);return vAe(r.shebang,t)}function kAe(r){let e=Km(r),t=i8e(r.dataLocation),i=vAe(r.shebang,t);return{dataFile:e8e(e),loaderFile:i}}var RAe=ge(require("fs")),l8e=ge(require("path")),FAe=ge(require("util"));function SL(r,{basePath:e}){let t=H.toPortablePath(e),i=k.resolve(t),n=r.ignorePatternData!==null?new RegExp(r.ignorePatternData):null,s=new Map,o=new Map(r.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var x;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let m=(x=p.discardFromLookup)!=null?x:!1,y={name:g,reference:h},b=s.get(p.packageLocation);b?(b.discardFromLookup=b.discardFromLookup&&m,m||(b.locator=y)):s.set(p.packageLocation,{locator:y,discardFromLookup:m});let v=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:m,get packageLocation(){return v||(v=k.join(i,p.packageLocation))}}]}))])),a=new Map(r.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(r.fallbackPool),c=r.dependencyTreeRoots,u=r.enableTopLevelFallback;return{basePath:t,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var Um=ge(require("module"));function sh(r,e){if(typeof r=="string")return r;if(r){let t,i;if(Array.isArray(r)){for(t=0;t0)return(f=sh(n[g],u))?f.replace("*",c.substring(g.length-1)):vu(i,c,1)}return vu(i,c)}}var vL=ge(require("util"));var ur;(function(c){c.API_ERROR="API_ERROR",c.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",c.EXPORTS_RESOLUTION_FAILED="EXPORTS_RESOLUTION_FAILED",c.MISSING_DEPENDENCY="MISSING_DEPENDENCY",c.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",c.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",c.INTERNAL="INTERNAL",c.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",c.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var s8e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ai(r,e,t={},i){i!=null||(i=s8e.has(r)?"MODULE_NOT_FOUND":r);let n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:te(N({},n),{value:i}),pnpCode:te(N({},n),{value:r}),data:te(N({},n),{value:t})})}function Bo(r){return H.normalize(H.fromPortablePath(r))}var o8e=ge(require("fs")),DAe=ge(require("module")),a8e=ge(require("path")),A8e=new Set(DAe.Module.builtinModules||Object.keys(process.binding("natives"))),tb=r=>r.startsWith("node:")||A8e.has(r);function xL(r,e){let t=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,s=/^(\/|\.{1,2}(\/|$))/,o=/\/$/,a=/^\.{0,2}\//,l={name:null,reference:null},c=[],u=new Set;if(r.enableTopLevelFallback===!0&&c.push(l),e.compatibilityMode!==!1)for(let re of["react-scripts","gatsby"]){let se=r.packageRegistry.get(re);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");c.push({name:re,reference:be})}}let{ignorePattern:g,packageRegistry:f,packageLocatorsByLocations:h}=r;function p(re,se){return{fn:re,args:se,error:null,result:null}}function m(re){var Ke,ke,ve,pe,V,Qe;let se=(ve=(ke=(Ke=process.stderr)==null?void 0:Ke.hasColors)==null?void 0:ke.call(Ke))!=null?ve:process.stdout.isTTY,be=(le,fe)=>`[${le}m${fe}`,he=re.error;console.error(he?be("31;1",`\u2716 ${(pe=re.error)==null?void 0:pe.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),re.args.length>0&&console.error();for(let le of re.args)console.error(` ${be("37;1","In \u2190")} ${(0,vL.inspect)(le,{colors:se,compact:!0})}`);re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,vL.inspect)(re.result,{colors:se,compact:!0})}`));let Fe=(Qe=(V=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:V.slice(2))!=null?Qe:[];if(Fe.length>0){console.error();for(let le of Fe)console.error(` ${be("38;5;244",le)}`)}console.error()}function y(re,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let he=p(re,be);try{return he.result=se(...be)}catch(Fe){throw he.error=Fe}finally{m(he)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(he){let Fe=p(re,be);throw Fe.error=he,m(Fe),he}}}return se}function b(re){let se=A(re);if(!se)throw ai(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function v(re){if(re.name===null)return!0;for(let se of r.dependencyTreeRoots)if(se.name===re.name&&se.reference===re.reference)return!0;return!1}let x=new Set(["default","node","require"]);function T(re,se=x){let be=Z(k.join(re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ai(ur.INTERNAL,`The locator that owns the "${re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:he}=b(be),Fe=k.join(he,kt.manifest);if(!e.fakeFs.existsSync(Fe))return null;let Ke=JSON.parse(e.fakeFs.readFileSync(Fe,"utf8")),ke=k.contains(he,re);if(ke===null)throw ai(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");a.test(ke)||(ke=`./${ke}`);let ve;try{ve=PAe(Ke,k.normalize(ke),{conditions:se,unsafe:!0})}catch(pe){throw ai(ur.EXPORTS_RESOLUTION_FAILED,pe.message,{unqualifiedPath:Bo(re),locator:be,pkgJson:Ke,subpath:Bo(ke),conditions:se},"ERR_PACKAGE_PATH_NOT_EXPORTED")}return typeof ve=="string"?k.join(he,ve):null}function q(re,se,{extensions:be}){let he;try{se.push(re),he=e.fakeFs.statSync(re)}catch(Fe){}if(he&&!he.isDirectory())return e.fakeFs.realpathSync(re);if(he&&he.isDirectory()){let Fe;try{Fe=JSON.parse(e.fakeFs.readFileSync(k.join(re,kt.manifest),"utf8"))}catch(ke){}let Ke;if(Fe&&Fe.main&&(Ke=k.resolve(re,Fe.main)),Ke&&Ke!==re){let ke=q(Ke,se,{extensions:be});if(ke!==null)return ke}}for(let Fe=0,Ke=be.length;Fe{let ve=JSON.stringify(ke.name);if(he.has(ve))return;he.add(ve);let pe=oe(ke);for(let V of pe)if(b(V).packagePeers.has(re))Fe(V);else{let le=be.get(V.name);typeof le=="undefined"&&be.set(V.name,le=new Set),le.add(V.reference)}};Fe(se);let Ke=[];for(let ke of[...be.keys()].sort())for(let ve of[...be.get(ke)].sort())Ke.push({name:ke,reference:ve});return Ke}function Z(re,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(_(re)&&!se)return null;let he=k.relative(r.basePath,re);he.match(s)||(he=`./${he}`),he.endsWith("/")||(he=`${he}/`);do{let Fe=h.get(he);if(typeof Fe=="undefined"||Fe.discardFromLookup&&!be){he=he.substring(0,he.lastIndexOf("/",he.length-2)+1);continue}return Fe.locator}while(he!=="");return null}function O(re,se,{considerBuiltins:be=!0}={}){if(re==="pnpapi")return H.toPortablePath(e.pnpapiResolution);if(be&&tb(re))return null;let he=Bo(re),Fe=se&&Bo(se);if(se&&_(se)&&(!k.isAbsolute(re)||Z(re)===null)){let ve=$(re,se);if(ve===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${he}" +Required by: ${Fe} +`,{request:he,issuer:Fe});return H.toPortablePath(ve)}let Ke,ke=re.match(n);if(ke){if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let[,ve,pe]=ke,V=Z(se);if(!V){let jt=$(re,se);if(jt===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${he}" +Required by: ${Fe} +`,{request:he,issuer:Fe});return H.toPortablePath(jt)}let le=b(V).packageDependencies.get(ve),fe=null;if(le==null&&V.name!==null){let jt=r.fallbackExclusionList.get(V.name);if(!jt||!jt.has(V.reference)){for(let Oi=0,Xs=c.length;Oiv(Qr))?gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${ve}${ve!==he?` (via "${he}")`:""} +Required by: ${V.name}@${V.reference} (via ${Fe}) +${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} +`).join("")} +`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt}):gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${ve}${ve!==he?` (via "${he}")`:""} +Required by: ${V.name}@${V.reference} (via ${Fe}) + +${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} +`).join("")} +`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt})}else le===void 0&&(!be&&tb(re)?v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${ve}${ve!==he?` (via "${he}")`:""} +Required by: ${Fe} +`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in ${V.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${ve}${ve!==he?` (via "${he}")`:""} +Required by: ${Fe} +`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}):v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${ve}${ve!==he?` (via "${he}")`:""} +Required by: ${Fe} +`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${ve}${ve!==he?` (via "${he}")`:""} +Required by: ${V.name}@${V.reference} (via ${Fe}) +`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}));if(le==null){if(fe===null||gt===null)throw gt||new Error("Assertion failed: Expected an error to have been set");le=fe;let jt=gt.message.replace(/\n.*/g,"");gt.message=jt,!u.has(jt)&&i!==0&&(u.add(jt),process.emitWarning(gt))}let Ht=Array.isArray(le)?{name:le[0],reference:le[1]}:{name:ve,reference:le},Mt=b(Ht);if(!Mt.packageLocation)throw ai(ur.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. + +Required package: ${Ht.name}@${Ht.reference}${Ht.name!==he?` (via "${he}")`:""} +Required by: ${V.name}@${V.reference} (via ${Fe}) +`,{request:he,issuer:Fe,dependencyLocator:Object.assign({},Ht)});let Ei=Mt.packageLocation;pe?Ke=k.join(Ei,pe):Ke=Ei}else if(k.isAbsolute(re))Ke=k.normalize(re);else{if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let ve=k.resolve(se);se.match(o)?Ke=k.normalize(k.join(ve,re)):Ke=k.normalize(k.join(k.dirname(ve),re))}return k.normalize(Ke)}function L(re,se,be=x){if(s.test(re))return se;let he=T(se,be);return he?k.normalize(he):se}function de(re,{extensions:se=Object.keys(Um.Module._extensions)}={}){var Fe,Ke;let be=[],he=q(re,be,{extensions:se});if(he)return k.normalize(he);{let ke=Bo(re),ve=Z(re);if(ve){let{packageLocation:pe}=b(ve),V=!0;try{e.fakeFs.accessSync(pe)}catch(Qe){if((Qe==null?void 0:Qe.code)==="ENOENT")V=!1;else{let le=((Ke=(Fe=Qe==null?void 0:Qe.message)!=null?Fe:Qe)!=null?Ke:"empty exception thrown").replace(/^[A-Z]/,fe=>fe.toLowerCase());throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Required package exists but could not be accessed (${le}). + +Missing package: ${ve.name}@${ve.reference} +Expected package location: ${Bo(pe)} +`,{unqualifiedPath:ke,extensions:se})}}if(!V){let Qe=pe.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${Qe} + +Missing package: ${ve.name}@${ve.reference} +Expected package location: ${Bo(pe)} +`,{unqualifiedPath:ke,extensions:se})}}throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed: we looked for the following paths, but none could be accessed. + +Source path: ${ke} +${be.map(pe=>`Not found: ${Bo(pe)} +`).join("")}`,{unqualifiedPath:ke,extensions:se})}}function Be(re,se,{considerBuiltins:be,extensions:he,conditions:Fe}={}){try{let Ke=O(re,se,{considerBuiltins:be});if(re==="pnpapi")return Ke;if(Ke===null)return null;let ke=()=>se!==null?_(se):!1,ve=(!be||!tb(re))&&!ke()?L(re,Ke,Fe):Ke;return de(ve,{extensions:he})}catch(Ke){throw Object.prototype.hasOwnProperty.call(Ke,"pnpCode")&&Object.assign(Ke.data,{request:Bo(re),issuer:se&&Bo(se)}),Ke}}function je(re){let se=k.normalize(re),be=Wr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:ne,topLevel:ee,getLocator:(re,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:re,reference:se},getDependencyTreeRoots:()=>[...r.dependencyTreeRoots],getAllLocators(){let re=[];for(let[se,be]of f)for(let he of be.keys())se!==null&&he!==null&&re.push({name:se,reference:he});return re},getPackageInformation:re=>{let se=A(re);if(se===null)return null;let be=H.fromPortablePath(se.packageLocation);return te(N({},se),{packageLocation:be})},findPackageLocator:re=>Z(H.toPortablePath(re)),resolveToUnqualified:y("resolveToUnqualified",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=O(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveUnqualified:y("resolveUnqualified",(re,se)=>H.fromPortablePath(de(H.toPortablePath(re),se))),resolveRequest:y("resolveRequest",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=Be(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveVirtual:y("resolveVirtual",re=>{let se=je(H.toPortablePath(re));return se!==null?H.fromPortablePath(se):null})}}var O0t=(0,FAe.promisify)(RAe.readFile);var NAe=(r,e,t)=>{let i=Km(r),n=SL(i,{basePath:e}),s=H.join(e,kt.pnpCjs);return xL(n,{fakeFs:t,pnpapiResolution:s})};var PL=ge(TAe());var Ca={};ft(Ca,{checkAndReportManifestCompatibility:()=>MAe,checkManifestCompatibility:()=>OAe,extractBuildScripts:()=>rb,getExtractHint:()=>DL,hasBindingGyp:()=>RL});function OAe(r){return P.isPackageCompatible(r,Vg.getArchitectureSet())}function MAe(r,e,{configuration:t,report:i}){return OAe(r)?!0:(i==null||i.reportWarningOnce(X.INCOMPATIBLE_ARCHITECTURE,`${P.prettyLocator(t,r)} The ${Vg.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function rb(r,e,t,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([cs.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([cs.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:r.linkType!==Qt.HARD?(n==null||n.reportWarningOnce(X.SOFT_LINK_BUILD,`${P.prettyLocator(i,r)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):t&&t.built===!1?(n==null||n.reportInfoOnce(X.BUILD_DISABLED,`${P.prettyLocator(i,r)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!t.built?(n==null||n.reportWarningOnce(X.DISABLED_BUILD_SCRIPTS,`${P.prettyLocator(i,r)} lists build scripts, but all build scripts have been disabled.`),[]):MAe(r,"build",{configuration:i,report:n})?s:[]}var c8e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function DL(r){return r.packageFs.getExtractHint({relevantExtensions:c8e})}function RL(r){let e=k.join(r.prefixPath,"binding.gyp");return r.packageFs.existsSync(e)}var FL={};ft(FL,{getUnpluggedPath:()=>Hm});function Hm(r,{configuration:e}){return k.resolve(e.get("pnpUnpluggedFolder"),P.slugifyLocator(r))}var u8e=new Set([P.makeIdent(null,"nan").identHash,P.makeIdent(null,"node-gyp").identHash,P.makeIdent(null,"node-pre-gyp").identHash,P.makeIdent(null,"node-addon-api").identHash,P.makeIdent(null,"fsevents").identHash,P.makeIdent(null,"open").identHash,P.makeIdent(null,"opn").identHash]),xu=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let i=Tl(t.project).cjs;if(!K.existsSync(i))throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})),s={name:P.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return H.toPortablePath(o.packageLocation)}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=Tl(t.project).cjs;if(!K.existsSync(i))return null;let s=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})).findPackageLocator(H.fromPortablePath(e));return s?P.makeLocator(P.parseIdent(s.name),s.reference):null}makeInstaller(e){return new oh(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},oh=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new Se.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t,i){let n=P.stringifyIdent(e),s=e.reference,o=!!this.opts.project.tryWorkspaceByLocator(e),a=P.isVirtualLocator(e),l=e.peerDependencies.size>0&&!a,c=!l&&!o,u=!l&&e.linkType!==Qt.SOFT,g,f;if(c||u){let x=a?P.devirtualizeLocator(e):e;g=this.customData.store.get(x.locatorHash),typeof g=="undefined"&&(g=await g8e(t),e.linkType===Qt.HARD&&this.customData.store.set(x.locatorHash,g)),g.manifest.type==="module"&&(this.isESMLoaderRequired=!0),f=this.opts.project.getDependencyMeta(x,e.version)}let h=c?rb(e,g,f,{configuration:this.opts.project.configuration,report:this.opts.report}):[],p=u?await this.unplugPackageIfNeeded(e,g,t,f,i):t.packageFs;if(k.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);let m=k.resolve(p.getRealPath(),t.prefixPath),y=NL(this.opts.project.cwd,m),b=new Map,v=new Set;if(a){for(let x of e.peerDependencies.values())b.set(P.stringifyIdent(x),null),v.add(P.stringifyIdent(x));if(!o){let x=P.devirtualizeLocator(e);this.virtualTemplates.set(x.locatorHash,{location:NL(this.opts.project.cwd,Wr.resolveVirtual(m)),locator:x})}}return Se.getMapWithDefault(this.packageRegistry,n).set(s,{packageLocation:y,packageDependencies:b,packagePeers:v,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),{packageLocation:m,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,t){let i=this.getPackageInformation(e);for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){for(let i of t)this.getDiskInformation(i).packageDependencies.set(P.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=Tl(this.opts.project);if(K.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(X.UNNAMED,`Removing the old ${ae.pretty(this.opts.project.configuration,kt.pnpJs,ae.Type.PATH)} file. You might need to manually update existing references to reference the new ${ae.pretty(this.opts.project.configuration,kt.pnpCjs,ae.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ae.pretty(this.opts.project.configuration,"yarn sdks",ae.Type.CODE)}.`),await K.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await K.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await K.removePromise(e.cjs),await K.removePromise(this.opts.project.configuration.get("pnpDataPath")),await K.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())Se.getMapWithDefault(this.packageRegistry,P.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let t=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:P.stringifyIdent(u),reference:u.reference})),n=t!=="none",s=[],o=new Map,a=Se.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(t==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:P.stringifyIdent(u),reference:u.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let t=Tl(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(X.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await K.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=xAe(e);await K.changeFilePromise(t.cjs,o,{automaticNewlines:!0,mode:493}),await K.removePromise(i)}else{let o=k.relative(k.dirname(t.cjs),i),{dataFile:a,loaderFile:l}=kAe(te(N({},e),{dataLocation:o}));await K.changeFilePromise(t.cjs,l,{automaticNewlines:!0,mode:493}),await K.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(X.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await K.changeFilePromise(t.esmLoader,(0,PL.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await K.removePromise(s);else for(let o of await K.readdirPromise(s)){let a=k.resolve(s,o);this.unpluggedPaths.has(a)||await K.removePromise(a)}}async locateNodeModules(e){let t=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=k.join(n.cwd,"node_modules");if(i&&i.test(k.relative(this.opts.project.cwd,n.cwd))||!K.existsSync(s))continue;let o=await K.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)t.push(s);else for(let l of a)t.push(k.join(s,l.name))}return t}async unplugPackageIfNeeded(e,t,i,n,s){return this.shouldBeUnplugged(e,t,n)?this.unplugPackage(e,i,s):i.packageFs}shouldBeUnplugged(e,t,i){return typeof i.unplugged!="undefined"?i.unplugged:u8e.has(e.identHash)||e.conditions!=null?!0:t.manifest.preferUnplugged!==null?t.manifest.preferUnplugged:!!(rb(e,t,i,{configuration:this.opts.project.configuration}).length>0||t.misc.extractHint)}async unplugPackage(e,t,i){let n=Hm(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new Na(n,{baseFs:t.packageFs,pathUtils:k}):(this.unpluggedPaths.add(n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let s=k.join(n,t.prefixPath,".ready");await K.existsPromise(s)||(this.opts.project.storedBuildState.delete(e.locatorHash),await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,Me.dot,{baseFs:t.packageFs,overwrite:!1}),await K.writeFilePromise(s,""))})),new _t(n))}getPackageInformation(e){let t=P.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(t);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${P.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${P.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let t=Se.getMapWithDefault(this.packageRegistry,"@@disk"),i=NL(this.opts.project.cwd,e);return Se.getFactoryWithDefault(t,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1}))}};function NL(r,e){let t=k.relative(r,e);return t.match(/^\.{0,2}\//)||(t=`./${t}`),t.replace(/\/?$/,"/")}async function g8e(r){var i;let e=(i=await At.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?i:new At,t=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())t.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:DL(r),hasBindingGyp:RL(r)}}}var KAe=ge(is());var jm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new Pe("This command can only be used if the `nodeLinker` option is set to `pnp`");await t.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=P.parseDescriptor(f),p=h.range!=="unknown"?h:P.makeDescriptor(h,"*");if(!Wt.validRange(p.range))throw new Pe(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(e,p)})`);return m=>{let y=P.stringifyIdent(m);return!KAe.default.isMatch(y,P.stringifyIdent(p))||m.version&&!Wt.satisfiesWithPrereleases(m.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of t.storedPackages.values())!t.tryWorkspaceByLocator(h)&&!P.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],m=(y,b)=>{if(!h.has(y.locatorHash)&&(h.add(y.locatorHash),!t.tryWorkspaceByLocator(y)&&o.some(v=>v(y))&&p.push(y),!(b>0&&!this.recursive)))for(let v of y.dependencies.values()){let x=t.storedResolutions.get(v.descriptorHash);if(!x)throw new Error("Assertion failed: The resolution should have been registered");let T=t.storedPackages.get(x);if(!T)throw new Error("Assertion failed: The package should have been registered");m(T,b+1)}};for(let y of f){let b=t.storedPackages.get(y.anchoredLocator.locatorHash);if(!b)throw new Error("Assertion failed: The package should have been registered");m(b,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(t.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new Pe(`Patterns ${ae.prettyList(e,s,ae.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new Pe(`Pattern ${ae.prettyList(e,s,ae.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=Se.sortMap(c,f=>P.stringifyLocator(f)),(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let m=(h=p.version)!=null?h:"unknown",y=t.topLevelWorkspace.manifest.ensureDependencyMeta(P.makeDescriptor(p,m));y.unplugged=!0,f.reportInfo(X.UNNAMED,`Will unpack ${P.prettyLocator(e,p)} to ${ae.pretty(e,Hm(p,{configuration:e}),ae.Type.PATH)}`),f.reportJson({locator:P.stringifyLocator(p),version:m})}await t.topLevelWorkspace.persistManifest(),f.reportSeparator(),await t.install({cache:n,report:f})})).exitCode()}};jm.paths=[["unplug"]],jm.usage=Re.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var UAe=jm;var Tl=r=>({cjs:k.join(r.cwd,kt.pnpCjs),cjsLegacy:k.join(r.cwd,kt.pnpJs),esmLoader:k.join(r.cwd,".pnp.loader.mjs")}),GAe=r=>/\s/.test(r)?JSON.stringify(r):r;async function f8e(r,e,t){let i=Tl(r),n=`--require ${GAe(H.fromPortablePath(i.cjs))}`;if(K.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,jAe.pathToFileURL)(H.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&HAe.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(K.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function h8e(r,e){let t=Tl(r);e(t.cjs),e(t.esmLoader),e(r.configuration.get("pnpDataPath")),e(r.configuration.get("pnpUnpluggedFolder"))}var p8e={hooks:{populateYarnPaths:h8e,setupScriptEnvironment:f8e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:Ie.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:Ie.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:Ie.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:Ie.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:Ie.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:Ie.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:Ie.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:Ie.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:Ie.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[xu],commands:[UAe]},d8e=p8e;var _Ae=ge(zAe());var UL=ge(require("crypto")),VAe=ge(require("fs")),XAe=1,jr="node_modules",ib=".bin",ZAe=".yarn-state.yml",Ti;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Ti||(Ti={}));var HL=class{constructor(){this.installStateCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let i=t.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(n===null)throw new Pe("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(P.stringifyLocator(e));if(!s){let a=new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=t.project.configuration.startingCwd;return s.locations.find(a=>k.contains(o,a))||s.locations[0]}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=nb(k.resolve(e),{skipPrefix:t.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return P.parseLocator(a)}makeInstaller(e){return new $Ae(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},$Ae=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t){var u;let i=k.resolve(t.packageFs.getRealPath(),t.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await F8e(e,t),e.linkType===Qt.HARD&&this.customData.store.set(e.locatorHash,n)),!P.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(P.stringifyIdent(e))||s.set(P.stringifyIdent(e),e.reference);let a=e;if(P.isVirtualLocator(e)){a=P.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(P.stringifyIdent(g),null),o.add(P.stringifyIdent(g))}let l={packageLocation:`${H.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=t.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=t.checksum?t.checksum.substring(t.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,t){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),t=await jL(this.opts.project),i=this.opts.project.configuration.get("nmMode");(t===null||i!==t.nmMode)&&(this.opts.project.storedBuildState.clear(),t={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i,mtimeMs:0});let n=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=Se.validateEnum(Kn,(m=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?m:h)}catch(y){let b=P.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(X.INVALID_MANIFEST,`${b}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Kn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(m=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?m:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:P.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:P.makeLocator(P.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(H.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:P.stringifyIdent(p),reference:p.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:f=>H.fromPortablePath(Wr.resolveVirtual(H.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=Om(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=BL(a);await N8e(t,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=P.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(ele(f))continue;let p=P.parseLocator(f),m=this.localStore.get(p.locatorHash);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(m.pkg))continue;let y=Ca.extractBuildScripts(m.pkg,m.customPackageData,m.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});y.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:y})}return c&&this.opts.report.reportWarning(X.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${ae.pretty(this.opts.project.configuration,"--preserve-symlinks",ae.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function F8e(r,e){var n;let t=(n=await At.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new At,i=new Set(["preinstall","install","postinstall"]);for(let s of t.scripts.keys())i.has(s)||t.scripts.delete(s);return{manifest:{bin:t.bin,scripts:t.scripts},misc:{extractHint:Ca.getExtractHint(e),hasBindingGyp:Ca.hasBindingGyp(e)}}}async function L8e(r,e,t,i,{installChangedByUser:n}){let s="";s+=`# Warning: This file is automatically generated. Removing it is fine, but will +`,s+=`# cause your node_modules installation to become invalidated. +`,s+=` +`,s+=`__metadata: +`,s+=` version: ${XAe} +`,s+=` nmMode: ${i.value} +`;let o=Array.from(e.keys()).sort(),a=P.stringifyLocator(r.topLevelWorkspace.anchoredLocator);for(let u of o){let g=e.get(u);s+=` +`,s+=`${JSON.stringify(u)}: +`,s+=` locations: +`;for(let f of g.locations){let h=k.contains(r.cwd,f);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` - ${JSON.stringify(h)} +`}if(g.aliases.length>0){s+=` aliases: +`;for(let f of g.aliases)s+=` - ${JSON.stringify(f)} +`}if(u===a&&t.size>0){s+=` bin: +`;for(let[f,h]of t){let p=k.contains(r.cwd,f);if(p===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` ${JSON.stringify(p)}: +`;for(let[m,y]of h){let b=k.relative(k.join(f,jr),y);s+=` ${JSON.stringify(m)}: ${JSON.stringify(b)} +`}}}}let l=r.cwd,c=k.join(l,jr,ZAe);n&&await K.removePromise(c),await K.changeFilePromise(c,s,{automaticNewlines:!0})}async function jL(r,{unrollAliases:e=!1}={}){let t=r.cwd,i=k.join(t,jr,ZAe),n;try{n=await K.statPromise(i)}catch(c){}if(!n)return null;let s=Si(await K.readFilePromise(i,"utf8"));if(s.__metadata.version>XAe)return null;let o=s.__metadata.nmMode||Ti.CLASSIC,a=new Map,l=new Map;delete s.__metadata;for(let[c,u]of Object.entries(s)){let g=u.locations.map(h=>k.join(t,h)),f=u.bin;if(f)for(let[h,p]of Object.entries(f)){let m=k.join(t,H.toPortablePath(h)),y=Se.getMapWithDefault(l,m);for(let[b,v]of Object.entries(p))y.set(Jr(b),H.toPortablePath([m,jr,v].join(k.sep)))}if(a.set(c,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:u.aliases||[]}),e&&u.aliases)for(let h of u.aliases){let{scope:p,name:m}=P.parseLocator(c),y=P.makeLocator(P.makeIdent(p,m),h),b=P.stringifyLocator(y);a.set(b,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:[]})}}return{locatorMap:a,binSymlinks:l,locationTree:tle(a,{skipPrefix:r.cwd}),nmMode:o,mtimeMs:n.mtimeMs}}var Ah=async(r,e)=>{if(r.split(k.sep).indexOf(jr)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${r}`);try{if(!e.innerLoop){let i=e.allowSymlink?await K.statPromise(r):await K.lstatPromise(r);if(e.allowSymlink&&!i.isDirectory()||!e.allowSymlink&&i.isSymbolicLink()){await K.unlinkPromise(r);return}}let t=await K.readdirPromise(r,{withFileTypes:!0});for(let i of t){let n=k.join(r,Jr(i.name));i.isDirectory()?(i.name!==jr||e&&e.innerLoop)&&await Ah(n,{innerLoop:!0,contentsOnly:!1}):await K.unlinkPromise(n)}e.contentsOnly||await K.rmdirPromise(r)}catch(t){if(t.code!=="ENOENT"&&t.code!=="ENOTEMPTY")throw t}},rle=4,nb=(r,{skipPrefix:e})=>{let t=k.contains(e,r);if(t===null)throw new Error(`Assertion failed: Writing attempt prevented to ${r} which is outside project root: ${e}`);let i=t.split(k.sep).filter(l=>l!==""),n=i.indexOf(jr),s=i.slice(0,n).join(k.sep),o=k.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},tle=(r,{skipPrefix:e})=>{let t=new Map;if(r===null)return t;let i=()=>({children:new Map,linkType:Qt.HARD});for(let[n,s]of r.entries()){if(s.linkType===Qt.SOFT&&k.contains(e,s.target)!==null){let a=Se.getFactoryWithDefault(t,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=nb(o,{skipPrefix:e}),c=Se.getFactoryWithDefault(t,a,i);for(let u=0;u{let t;try{process.platform==="win32"&&(t=await K.lstatPromise(r))}catch(i){}process.platform=="win32"&&(!t||t.isDirectory())?await K.symlinkPromise(r,e,"junction"):await K.symlinkPromise(k.relative(k.dirname(e),r),e)};async function ile(r,e,t){let i=k.join(r,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));try{await K.writeFilePromise(i,t);try{await K.linkPromise(i,e)}catch(n){}}finally{await K.unlinkPromise(i)}}async function T8e({srcPath:r,dstPath:e,srcMode:t,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Ti.HARDLINKS_GLOBAL&&i&&o){let l=k.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await Dn.checksumFile(l,{baseFs:K,algorithm:"sha1"})!==o){let g=k.join(i,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));await K.renamePromise(l,g);let f=await n.readFilePromise(r);await K.writeFilePromise(g,f);try{await K.linkPromise(g,l),await K.unlinkPromise(g)}catch(h){}}await K.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(r);await ile(i,l,u);try{await K.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Ti.HARDLINKS_LOCAL,await n.copyFilePromise(r,e))}}}else await n.copyFilePromise(r,e);let a=t&511;a!==420&&await K.chmodPromise(e,a)}var Ol;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(Ol||(Ol={}));var O8e=async(r,e,{baseFs:t,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await K.mkdirPromise(r,{recursive:!0});let o=async(l=Me.dot)=>{let c=k.join(e,l),u=await t.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=k.join(l,f.name),p,m=k.join(c,f.name);if(f.isFile()){if(p={kind:Ol.FILE,mode:(await t.lstatPromise(m)).mode},n.value===Ti.HARDLINKS_GLOBAL){let y=await Dn.checksumFile(m,{baseFs:t,algorithm:"sha1"});p.digest=y}}else if(f.isDirectory())p={kind:Ol.DIRECTORY};else if(f.isSymbolicLink())p={kind:Ol.SYMLINK,symlinkTo:await t.readlinkPromise(m)};else throw new Error(`Unsupported file type (file: ${m}, mode: 0o${await t.statSync(m).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==jr){let y=await o(h);for(let[b,v]of y)g.set(b,v)}}return g},a;if(n.value===Ti.HARDLINKS_GLOBAL&&i&&s){let l=k.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await K.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await ile(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=k.join(e,l),g=k.join(r,l);c.kind===Ol.DIRECTORY?await K.mkdirPromise(g,{recursive:!0}):c.kind===Ol.FILE?await T8e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:t,globalHardlinksStore:i}):c.kind===Ol.SYMLINK&&await GL(k.resolve(k.dirname(g),c.symlinkTo),g)}};function M8e(r,e,t,i){let n=new Map,s=new Map,o=new Map,a=!1,l=(c,u,g,f,h)=>{let p=!0,m=k.join(c,u),y=new Set;if(u===jr||u.startsWith("@")){let v;try{v=K.statSync(m)}catch(T){}p=!!v,v?v.mtimeMs>t?(a=!0,y=new Set(K.readdirSync(m))):y=new Set(g.children.get(u).children.keys()):a=!0;let x=e.get(c);if(x){let T=k.join(c,jr,ib),q;try{q=K.statSync(T)}catch(Y){}if(!q)a=!0;else if(q.mtimeMs>t){a=!0;let Y=new Set(K.readdirSync(T)),$=new Map;s.set(c,$);for(let[_,ne]of x)Y.has(_)&&$.set(_,ne)}else s.set(c,x)}}else p=h.has(u);let b=g.children.get(u);if(p){let{linkType:v,locator:x}=b,T={children:new Map,linkType:v,locator:x};if(f.children.set(u,T),x){let q=Se.getSetWithDefault(o,x);q.add(m),o.set(x,q)}for(let q of b.children.keys())l(m,q,b,T,y)}else b.locator&&i.storedBuildState.delete(P.parseLocator(b.locator).locatorHash)};for(let[c,u]of r){let{linkType:g,locator:f}=u,h={children:new Map,linkType:g,locator:f};if(n.set(c,h),f){let p=Se.getSetWithDefault(o,u.locator);p.add(c),o.set(u.locator,p)}u.children.has(jr)&&l(c,jr,u,h,new Set)}return{locationTree:n,binSymlinks:s,locatorLocations:o,installChangedByUser:a}}function ele(r){let e=P.parseDescriptor(r);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function K8e(r,e,t,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of r){let c=ele(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=k.join(l[0],f);f!==""&&K.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=k.contains(t,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let m=k.join(a,H.toPortablePath(p));u.set(Jr(h),m)}for(let[h,p]of c.children){let m=k.join(a,h),y=o(m,m,p);y.size>0&&s.set(a,new Map([...s.get(a)||new Map,...y]))}}else for(let[f,h]of c.children){let p=o(k.join(a,f),l,h);for(let[m,y]of p)u.set(m,y)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var nle=(r,e)=>{if(!r||!e)return r===e;let t=P.parseLocator(r);P.isVirtualLocator(t)&&(t=P.devirtualizeLocator(t));let i=P.parseLocator(e);return P.isVirtualLocator(i)&&(i=P.devirtualizeLocator(i)),P.areLocatorsEqual(t,i)};function YL(r){return k.join(r.get("globalFolder"),"store")}async function N8e(r,e,{baseFs:t,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=k.join(i.cwd,jr),{locationTree:l,binSymlinks:c,locatorLocations:u,installChangedByUser:g}=M8e(r.locationTree,r.binSymlinks,r.mtimeMs,i),f=tle(e,{skipPrefix:i.cwd}),h=[],p=async({srcDir:_,dstDir:ne,linkType:ee,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})=>{let Z=(async()=>{try{ee===Qt.SOFT?(await K.mkdirPromise(k.dirname(ne),{recursive:!0}),await GL(k.resolve(_),ne)):await O8e(ne,_,{baseFs:t,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})}catch(O){throw O.message=`While persisting ${_} -> ${ne} ${O.message}`,O}finally{T.tick()}})().then(()=>h.splice(h.indexOf(Z),1));h.push(Z),h.length>rle&&await Promise.race(h)},m=async(_,ne,ee)=>{let A=(async()=>{let oe=async(ce,Z,O)=>{try{O.innerLoop||await K.mkdirPromise(Z,{recursive:!0});let L=await K.readdirPromise(ce,{withFileTypes:!0});for(let de of L){if(!O.innerLoop&&de.name===ib)continue;let Be=k.join(ce,de.name),je=k.join(Z,de.name);de.isDirectory()?(de.name!==jr||O&&O.innerLoop)&&(await K.mkdirPromise(je,{recursive:!0}),await oe(Be,je,te(N({},O),{innerLoop:!0}))):$.value===Ti.HARDLINKS_LOCAL||$.value===Ti.HARDLINKS_GLOBAL?await K.linkPromise(Be,je):await K.copyFilePromise(Be,je,VAe.default.constants.COPYFILE_FICLONE)}}catch(L){throw O.innerLoop||(L.message=`While cloning ${ce} -> ${Z} ${L.message}`),L}finally{O.innerLoop||T.tick()}};await oe(_,ne,ee)})().then(()=>h.splice(h.indexOf(A),1));h.push(A),h.length>rle&&await Promise.race(h)},y=async(_,ne,ee)=>{if(ee)for(let[A,oe]of ne.children){let ce=ee.children.get(A);await y(k.join(_,A),oe,ce)}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!1});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:_===a,allowSymlink:A})}};for(let[_,ne]of l){let ee=f.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A),Z=k.join(_,A);await y(Z,oe,ce)}}let b=async(_,ne,ee)=>{if(ee){nle(ne.locator,ee.locator)||await Ah(_,{contentsOnly:ne.linkType===Qt.HARD});for(let[A,oe]of ne.children){let ce=ee.children.get(A);await b(k.join(_,A),oe,ce)}}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!0});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:ne.linkType===Qt.HARD,allowSymlink:A})}};for(let[_,ne]of f){let ee=l.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A);await b(k.join(_,A),oe,ce)}}let v=new Map,x=[];for(let[_,ne]of u)for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=f.get(A),Z=A;if(ce){for(let O of oe)if(Z=k.join(Z,O),ce=ce.children.get(O),!ce)break;if(ce){let O=nle(ce.locator,_),L=e.get(ce.locator),de=L.target,Be=Z,je=L.linkType;if(O)v.has(de)||v.set(de,Be);else if(de!==Be){let re=P.parseLocator(ce.locator);P.isVirtualLocator(re)&&(re=P.devirtualizeLocator(re)),x.push({srcDir:de,dstDir:Be,linkType:je,realLocatorHash:re.locatorHash})}}}}for(let[_,{locations:ne}]of e.entries())for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=l.get(A),Z=f.get(A),O=A,L=e.get(_),de=P.parseLocator(_);P.isVirtualLocator(de)&&(de=P.devirtualizeLocator(de));let Be=de.locatorHash,je=L.target,re=ee;if(je===re)continue;let se=L.linkType;for(let be of oe)Z=Z.children.get(be);if(!ce)x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});else for(let be of oe)if(O=k.join(O,be),ce=ce.children.get(be),!ce){x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});break}}let T=Ji.progressViaCounter(x.length),q=n.reportProgress(T),Y=i.configuration.get("nmMode"),$={value:Y};try{let _=$.value===Ti.HARDLINKS_GLOBAL?`${YL(i.configuration)}/v1`:null;if(_&&!await K.existsPromise(_)){await K.mkdirpPromise(_);for(let ee=0;ee<256;ee++)await K.mkdirPromise(k.join(_,ee.toString(16).padStart(2,"0")))}for(let ee of x)(ee.linkType===Qt.SOFT||!v.has(ee.srcDir))&&(v.set(ee.srcDir,ee.dstDir),await p(te(N({},ee),{globalHardlinksStore:_,nmMode:$,packageChecksum:o.get(ee.realLocatorHash)||null})));await Promise.all(h),h.length=0;for(let ee of x){let A=v.get(ee.srcDir);ee.linkType!==Qt.SOFT&&ee.dstDir!==A&&await m(A,ee.dstDir,{nmMode:$})}await Promise.all(h),await K.mkdirPromise(a,{recursive:!0});let ne=await K8e(e,f,i.cwd,{loadManifest:s});await U8e(c,ne,i.cwd),await L8e(i,e,ne,$,{installChangedByUser:g}),Y==Ti.HARDLINKS_GLOBAL&&$.value==Ti.HARDLINKS_LOCAL&&n.reportWarningOnce(X.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{q.stop()}}async function U8e(r,e,t){for(let i of r.keys()){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=k.join(i,jr,ib);await K.removePromise(n)}}for(let[i,n]of e){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=k.join(i,jr,ib),o=r.get(i)||new Map;await K.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await K.removePromise(k.join(s,a)),process.platform==="win32"&&await K.removePromise(k.join(s,Jr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=k.join(s,a);c!==l&&(process.platform==="win32"?await(0,_Ae.default)(H.fromPortablePath(l),H.fromPortablePath(u),{createPwshFile:!1}):(await K.removePromise(u),await GL(l,u),k.contains(t,await K.realpathPromise(l))!==null&&await K.chmodPromise(l,493)))}}}var qL=class extends xu{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new sle(e)}},sle=class extends oh{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let t=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),i=NAe(e,this.opts.project.cwd,t),{tree:n,errors:s}=Om(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=P.parseLocator(g.locator),h=P.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=k.join(this.opts.project.cwd,kt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=k.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=k.join(g,h),m=n.get(p);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in m)a(`${u}/${h}`,m);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var H8e={hooks:{cleanGlobalArtifacts:async r=>{let e=YL(r);await K.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:Ie.STRING,values:[Kn.WORKSPACES,Kn.DEPENDENCIES,Kn.NONE],default:Kn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:Ie.STRING,values:[Ti.CLASSIC,Ti.HARDLINKS_LOCAL,Ti.HARDLINKS_GLOBAL],default:Ti.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:Ie.BOOLEAN,default:!0}},linkers:[HL,qL]},j8e=H8e;var qT={};ft(qT,{default:()=>V9e,npmConfigUtils:()=>br,npmHttpUtils:()=>zt,npmPublishUtils:()=>wh});var cle=ge(ri());var Cr="npm:";var zt={};ft(zt,{AuthType:()=>us,customPackageError:()=>q8e,del:()=>z8e,get:()=>bo,getIdentUrl:()=>Kl,handleInvalidAuthenticationError:()=>Ml,post:()=>J8e,put:()=>W8e});var Ale=ge(WC()),lle=ge(require("url"));var br={};ft(br,{RegistryType:()=>QA,getAuditRegistry:()=>G8e,getAuthConfiguration:()=>zL,getDefaultRegistry:()=>sb,getPublishRegistry:()=>ole,getRegistryConfiguration:()=>ale,getScopeConfiguration:()=>WL,getScopeRegistry:()=>SA,normalizeRegistry:()=>ma});var QA;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(QA||(QA={}));function ma(r){return r.replace(/\/$/,"")}function G8e(r,{configuration:e}){let t=e.get(QA.AUDIT_REGISTRY);return t!==null?ma(t):ole(r,{configuration:e})}function ole(r,{configuration:e}){var t;return((t=r.publishConfig)==null?void 0:t.registry)?ma(r.publishConfig.registry):r.name?SA(r.name.scope,{configuration:e,type:QA.PUBLISH_REGISTRY}):sb({configuration:e,type:QA.PUBLISH_REGISTRY})}function SA(r,{configuration:e,type:t=QA.FETCH_REGISTRY}){let i=WL(r,{configuration:e});if(i===null)return sb({configuration:e,type:t});let n=i.get(t);return n===null?sb({configuration:e,type:t}):ma(n)}function sb({configuration:r,type:e=QA.FETCH_REGISTRY}){let t=r.get(e);return ma(t!==null?t:r.get(QA.FETCH_REGISTRY))}function ale(r,{configuration:e}){let t=e.get("npmRegistries"),i=ma(r),n=t.get(i);if(typeof n!="undefined")return n;let s=t.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function WL(r,{configuration:e}){if(r===null)return null;let i=e.get("npmScopes").get(r);return i||null}function zL(r,{configuration:e,ident:t}){let i=t&&WL(t.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:ale(r,{configuration:e})||e}var us;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(us||(us={}));async function Ml(r,{attemptedAs:e,registry:t,headers:i,configuration:n}){var s,o;if(ob(r))throw new ct(X.AUTHENTICATION_INVALID,"Invalid OTP token");if(((s=r.originalError)==null?void 0:s.name)==="HTTPError"&&((o=r.originalError)==null?void 0:o.response.statusCode)===401)throw new ct(X.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await Y8e(t,i,{configuration:n})}`:`attempted as ${e}`})`)}function q8e(r){var e;return((e=r.response)==null?void 0:e.statusCode)===404?"Package not found":null}function Kl(r){return r.scope?`/@${r.scope}%2f${r.name}`:`/${r.name}`}async function bo(r,a){var l=a,{configuration:e,headers:t,ident:i,authType:n,registry:s}=l,o=Or(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=SA(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await ab(s,{authType:n,configuration:e,ident:i});c&&(t=te(N({},t),{authorization:c}));try{return await ir.get(r.charAt(0)==="/"?`${s}${r}`:r,N({configuration:e,headers:t},o))}catch(u){throw await Ml(u,{registry:s,configuration:e,headers:t}),u}}async function J8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.post(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h)||l)throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.post(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function W8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.put(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h))throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.put(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function z8e(r,c){var u=c,{attemptedAs:e,configuration:t,headers:i,ident:n,authType:s=3,registry:o,otp:a}=u,l=Or(u,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(n&&typeof o=="undefined"&&(o=SA(n.scope,{configuration:t})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let g=await ab(o,{authType:s,configuration:t,ident:n});g&&(i=te(N({},i),{authorization:g})),a&&(i=N(N({},i),lh(a)));try{return await ir.del(o+r,N({configuration:t,headers:i},l))}catch(f){if(!ob(f)||a)throw await Ml(f,{attemptedAs:e,registry:o,configuration:t,headers:i}),f;a=await _L();let h=N(N({},i),lh(a));try{return await ir.del(`${o}${r}`,N({configuration:t,headers:h},l))}catch(p){throw await Ml(p,{attemptedAs:e,registry:o,configuration:t,headers:i}),p}}}async function ab(r,{authType:e=2,configuration:t,ident:i}){let n=zL(r,{configuration:t,ident:i}),s=_8e(n,e);if(!s)return null;let o=await t.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,r,{configuration:t,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new ct(X.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function _8e(r,e){switch(e){case 2:return r.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function Y8e(r,e,{configuration:t}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await ir.get(new lle.URL(`${r}/-/whoami`).href,{configuration:t,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function _L(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:r}=await(0,Ale.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return r}function ob(r){var e,t;if(((e=r.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((t=r.originalError)==null?void 0:t.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function lh(r){return{["npm-otp"]:r}}var VL=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!cle.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let{params:i}=P.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await bo(i.__archiveUrl,{configuration:t.project.configuration,ident:e});return await Bi.convertToZip(n,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var XL=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!P.tryParseDescriptor(e.range.slice(Cr.length),!0))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){let i=P.parseDescriptor(e.range.slice(Cr.length),!0);return t.resolver.getResolutionDependencies(i,t)}async getCandidates(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return await i.resolver.getCandidates(n,t,i)}async getSatisfying(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return i.resolver.getSatisfying(n,t,i)}resolve(e,t){throw new Error("Unreachable")}};var ule=ge(ri()),gle=ge(require("url"));var Qo=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let i=new gle.URL(e.reference);return!(!ule.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i;try{i=await bo(Qo.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch(n){i=await bo(Qo.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:t.project.configuration,ident:e})}return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:i}){let n=SA(e.scope,{configuration:i}),s=Qo.getLocatorUrl(e);return t=t.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t=t.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t===n+s||t===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let t=Wt.clean(e.reference.slice(Cr.length));if(t===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${Kl(e)}/-/${e.name}-${t}.tgz`}};var fle=ge(ri());var Ab=P.makeIdent(null,"node-gyp"),V8e=/\b(node-gyp|prebuild-install)\b/,ZL=class{supportsDescriptor(e,t){return e.range.startsWith(Cr)?!!Wt.validRange(e.range.slice(Cr.length)):!1}supportsLocator(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i}=P.parseRange(e.reference);return!!fle.default.valid(i)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);let s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=Se.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new Wt.SemVer(c);if(n.test(u))return u}catch{}return Se.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=P.makeLocator(e,`${Cr}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Qo.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:P.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);return Se.mapAndFilter(t,s=>{try{let{selector:o}=P.parseRange(s,{requireProtocol:Cr}),a=new Wt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return Se.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>P.makeLocator(e,s))}async resolve(e,t){let{selector:i}=P.parseRange(e.reference),n=Wt.clean(i);if(n===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await bo(Kl(e),{configuration:t.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new At;if(o.load(s.versions[n]),!o.dependencies.has(Ab.identHash)&&!o.peerDependencies.has(Ab.identHash)){for(let a of o.scripts.values())if(a.match(V8e)){o.dependencies.set(Ab.identHash,P.makeDescriptor(Ab,"latest")),t.report.reportWarningOnce(X.NODE_GYP_INJECTED,`${P.prettyLocator(t.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof o.raw.deprecated=="string"&&o.raw.deprecated!==""){let a=P.prettyLocator(t.project.configuration,e),l=o.raw.deprecated.match(/\S/)?`${a} is deprecated: ${o.raw.deprecated}`:`${a} is deprecated`;t.report.reportWarningOnce(X.DEPRECATED_PACKAGE,l)}return te(N({},e),{version:n,languageName:"node",linkType:Qt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var $L=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!zg.test(e.range.slice(Cr.length)))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(Cr.length),s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=P.makeLocator(e,`${Cr}${a}`),c=s.versions[a].dist.tarball;return Qo.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[P.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Unreachable")}};var wh={};ft(wh,{getGitHead:()=>z9e,makePublishBody:()=>W9e});var HT={};ft(HT,{default:()=>k9e,packUtils:()=>PA});var PA={};ft(PA,{genPackList:()=>Pb,genPackStream:()=>UT,genPackageManifest:()=>Hce,hasPackScripts:()=>MT,prepareForPack:()=>KT});var OT=ge(is()),Kce=ge(Mce()),Uce=ge(require("zlib")),m9e=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],E9e=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function MT(r){return!!(Zt.hasWorkspaceScript(r,"prepack")||Zt.hasWorkspaceScript(r,"postpack"))}async function KT(r,{report:e},t){await Zt.maybeExecuteWorkspaceLifecycleScript(r,"prepack",{report:e});try{let i=k.join(r.cwd,At.fileName);await K.existsPromise(i)&&await r.manifest.loadFile(i,{baseFs:K}),await t()}finally{await Zt.maybeExecuteWorkspaceLifecycleScript(r,"postpack",{report:e})}}async function UT(r,e){var s,o;typeof e=="undefined"&&(e=await Pb(r));let t=new Set;for(let a of(o=(s=r.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)t.add(k.normalize(a));for(let a of r.manifest.bin.values())t.add(k.normalize(a));let i=Kce.default.pack();process.nextTick(async()=>{for(let a of e){let l=k.normalize(a),c=k.resolve(r.cwd,l),u=k.join("package",l),g=await K.lstatPromise(c),f={name:u,mtime:new Date(Rr.SAFE_TIME*1e3)},h=t.has(l)?493:420,p,m,y=new Promise((v,x)=>{p=v,m=x}),b=v=>{v?m(v):p()};if(g.isFile()){let v;l==="package.json"?v=Buffer.from(JSON.stringify(await Hce(r),null,2)):v=await K.readFilePromise(c),i.entry(te(N({},f),{mode:h,type:"file"}),v,b)}else g.isSymbolicLink()?i.entry(te(N({},f),{mode:h,type:"symlink",linkname:await K.readlinkPromise(c)}),b):b(new Error(`Unsupported file type ${g.mode} for ${H.fromPortablePath(l)}`));await y}i.finalize()});let n=(0,Uce.createGzip)();return i.pipe(n),n}async function Hce(r){let e=JSON.parse(JSON.stringify(r.manifest.raw));return await r.project.configuration.triggerHook(t=>t.beforeWorkspacePacking,r,e),e}async function Pb(r){var g,f,h,p,m,y,b,v;let e=r.project,t=e.configuration,i={accept:[],reject:[]};for(let x of E9e)i.reject.push(x);for(let x of m9e)i.accept.push(x);i.reject.push(t.get("rcFilename"));let n=x=>{if(x===null||!x.startsWith(`${r.cwd}/`))return;let T=k.relative(r.cwd,x),q=k.resolve(Me.root,T);i.reject.push(q)};n(k.resolve(e.cwd,t.get("lockfileFilename"))),n(t.get("cacheFolder")),n(t.get("globalFolder")),n(t.get("installStatePath")),n(t.get("virtualFolder")),n(t.get("yarnPath")),await t.triggerHook(x=>x.populateYarnPaths,e,x=>{n(x)});for(let x of e.workspaces){let T=k.relative(r.cwd,x.cwd);T!==""&&!T.match(/^(\.\.)?\//)&&i.reject.push(`/${T}`)}let s={accept:[],reject:[]},o=(f=(g=r.manifest.publishConfig)==null?void 0:g.main)!=null?f:r.manifest.main,a=(p=(h=r.manifest.publishConfig)==null?void 0:h.module)!=null?p:r.manifest.module,l=(y=(m=r.manifest.publishConfig)==null?void 0:m.browser)!=null?y:r.manifest.browser,c=(v=(b=r.manifest.publishConfig)==null?void 0:b.bin)!=null?v:r.manifest.bin;o!=null&&s.accept.push(k.resolve(Me.root,o)),a!=null&&s.accept.push(k.resolve(Me.root,a)),typeof l=="string"&&s.accept.push(k.resolve(Me.root,l));for(let x of c.values())s.accept.push(k.resolve(Me.root,x));if(l instanceof Map)for(let[x,T]of l.entries())s.accept.push(k.resolve(Me.root,x)),typeof T=="string"&&s.accept.push(k.resolve(Me.root,T));let u=r.manifest.files!==null;if(u){s.reject.push("/*");for(let x of r.manifest.files)jce(s.accept,x,{cwd:Me.root})}return await I9e(r.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function I9e(r,{hasExplicitFileList:e,globalList:t,ignoreList:i}){let n=[],s=new La(r),o=[[Me.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!Yce(a,{globalList:t,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Me.root)for(let m of u)g=g||m===".gitignore",f=f||m===".npmignore";let h=f?await Gce(s,a,".npmignore"):g?await Gce(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;Yce(a,{globalList:t,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let m of u)o.push([k.resolve(a,m),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(k.relative(Me.root,a))}return n.sort()}async function Gce(r,e,t){let i={accept:[],reject:[]},n=await r.readFilePromise(k.join(e,t),"utf8");for(let s of n.split(/\n/g))jce(i.reject,s,{cwd:e});return i}function y9e(r,{cwd:e}){let t=r[0]==="!";return t&&(r=r.slice(1)),r.match(/\.{0,1}\//)&&(r=k.resolve(e,r)),t&&(r=`!${r}`),r}function jce(r,e,{cwd:t}){let i=e.trim();i===""||i[0]==="#"||r.push(y9e(i,{cwd:t}))}var gs;(function(i){i[i.None=0]="None",i[i.Match=1]="Match",i[i.NegatedMatch=2]="NegatedMatch"})(gs||(gs={}));function Yce(r,{globalList:e,ignoreLists:t}){let i=Db(r,e.accept);if(i!==0)return i===2;let n=Db(r,e.reject);if(n!==0)return n===1;if(t!==null)for(let s of t){let o=Db(r,s.accept);if(o!==0)return o===2;let a=Db(r,s.reject);if(a!==0)return a===1}return!1}function Db(r,e){let t=e,i=[];for(let n=0;n{await KT(i,{report:l},async()=>{l.reportJson({base:H.fromPortablePath(i.cwd)});let c=await Pb(i);for(let u of c)l.reportInfo(null,H.fromPortablePath(u)),l.reportJson({location:H.fromPortablePath(u)});if(!this.dryRun){let u=await UT(i,c),g=K.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo(X.UNNAMED,`Package archive generated in ${ae.pretty(e,s,ae.Type.PATH)}`),l.reportJson({output:H.fromPortablePath(s)}))})).exitCode()}};rE.paths=[["pack"]],rE.usage=Re.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var Jce=rE;function w9e(r,{workspace:e}){let t=r.replace("%s",B9e(e)).replace("%v",b9e(e));return H.toPortablePath(t)}function B9e(r){return r.manifest.name!==null?P.slugifyIdent(r.manifest.name):"package"}function b9e(r){return r.manifest.version!==null?r.manifest.version:"unknown"}var Q9e=["dependencies","devDependencies","peerDependencies"],S9e="workspace:",v9e=(r,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let t=r.project;for(let s of Q9e)for(let o of r.manifest.getForScope(s).values()){let a=t.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===S9e)if(a===null){if(t.tryWorkspaceByIdent(o)===null)throw new ct(X.WORKSPACE_NOT_FOUND,`${P.prettyDescriptor(t.configuration,o)}: No local workspace found for this range`)}else{let c;P.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector;let u=s==="dependencies"?P.makeDescriptor(o,"unknown"):null,g=u!==null&&r.manifest.ensureDependencyMeta(u).optional?"optionalDependencies":s;e[g][P.stringifyIdent(o)]=c}}},x9e={hooks:{beforeWorkspacePacking:v9e},commands:[Jce]},k9e=x9e;var tue=ge(require("crypto")),rue=ge(eue()),iue=ge(require("url"));async function W9e(r,e,{access:t,tag:i,registry:n,gitHead:s}){let o=r.project.configuration,a=r.manifest.name,l=r.manifest.version,c=P.stringifyIdent(a),u=(0,tue.createHash)("sha1").update(e).digest("hex"),g=rue.default.fromData(e).toString();typeof t=="undefined"&&(r.manifest.publishConfig&&typeof r.manifest.publishConfig.access=="string"?t=r.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?t=o.get("npmPublishAccess"):a.scope?t="restricted":t="public");let f=await PA.genPackageManifest(r),h=`${c}-${l}.tgz`,p=new iue.URL(`${ma(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:t,["dist-tags"]:{[i]:l},versions:{[l]:te(N({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function z9e(r){try{let{stdout:e}=await Nr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:r});return e.trim()===""?void 0:e.trim()}catch{return}}var JT={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:Ie.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:Ie.SECRET,default:null}},nue={npmAuditRegistry:{description:"Registry to query for audit reports",type:Ie.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:Ie.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.STRING,default:"https://registry.yarnpkg.com"}},_9e={configuration:te(N(N({},JT),nue),{npmScopes:{description:"Settings per package scope",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:N(N({},JT),nue)}},npmRegistries:{description:"Settings per registry",type:Ie.MAP,normalizeKeys:ma,valueDefinition:{description:"",type:Ie.SHAPE,properties:N({},JT)}}}),fetchers:[VL,Qo],resolvers:[XL,ZL,$L]},V9e=_9e;var VT={};ft(VT,{default:()=>s_e});ys();var Ba;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ba||(Ba={}));var vo;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(vo||(vo={}));var Rb=[vo.Info,vo.Low,vo.Moderate,vo.High,vo.Critical];function sue(r,e){let t=[],i=new Set,n=o=>{i.has(o)||(i.add(o),t.push(o))};for(let o of e)n(o);let s=new Set;for(;t.length>0;){let o=t.shift(),a=r.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=r.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function X9e(r,e){return new Set([...r].filter(t=>!e.has(t)))}function Z9e(r,e,{all:t}){let i=t?r.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=sue(r,l),g=sue(r,c);return X9e(g,u)}function oue(r){let e={};for(let t of r)e[P.stringifyIdent(t)]=P.parseRange(t.range).selector;return e}function aue(r){if(typeof r=="undefined")return new Set;let e=Rb.indexOf(r),t=Rb.slice(e);return new Set(t)}function $9e(r,e){let t=aue(e),i={};for(let n of t)i[n]=r[n];return i}function Aue(r,e){var i;let t=$9e(r,e);for(let n of Object.keys(t))if((i=t[n])!=null?i:0>0)return!0;return!1}function lue(r,e){var s;let t={},i={children:t},n=Object.values(r.advisories);if(e!=null){let o=aue(e);n=n.filter(a=>o.has(a.severity))}for(let o of Se.sortMap(n,a=>a.module_name))t[o.module_name]={label:o.module_name,value:ae.tuple(ae.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:ae.tuple(ae.Type.NO_HINT,o.title)},URL:{label:"URL",value:ae.tuple(ae.Type.URL,o.url)},Severity:{label:"Severity",value:ae.tuple(ae.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ae.tuple(ae.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ae.tuple(ae.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:ae.tuple(ae.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ae.tuple(ae.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function cue(r,e,{all:t,environment:i}){let n=t?r.workspaces:[e],s=[Ba.All,Ba.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ba.All,Ba.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return oue([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function uue(r,e,{all:t}){var s;let i=Z9e(r,e,{all:t}),n={};for(let o of r.storedPackages.values())n[P.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:oue(o.dependencies.values()),dev:i.has(P.convertLocatorToDescriptor(o).descriptorHash)};return n}var sE=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=J.String("--environment",Ba.All,{description:"Which environments to cover",validator:nn(Ba)});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=J.String("--severity",vo.Info,{description:"Minimal severity requested for packages to be displayed",validator:nn(vo)})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=cue(t,i,{all:this.all,environment:this.environment}),s=uue(t,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=br.getAuditRegistry(i.manifest,{configuration:e}),l,c=await pA.start({configuration:e,stdout:this.context.stdout},async()=>{l=await zt.post("/-/npm/v1/security/audits/quick",o,{authType:zt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=Aue(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(ls.emitTree(lue(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo(X.EXCEPTION,"No audit suggestions")})).exitCode()}};sE.paths=[["npm","audit"]],sE.usage=Re.Usage({description:"perform a vulnerability audit against the installed packages",details:` + This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). + + For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. + + Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${Rb.map(e=>`\`${e}\``).join(", ")}. + + If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. + + To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. + `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var gue=sE;var WT=ge(ri()),zT=ge(require("util")),oE=class extends Le{constructor(){super(...arguments);this.fields=J.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let x=t.topLevelWorkspace;if(!x.manifest.name)throw new Pe(`Missing ${ae.pretty(e,"name",ae.Type.CODE)} field in ${H.fromPortablePath(k.join(x.cwd,kt.manifest))}`);c=P.makeDescriptor(x.manifest.name,"unknown")}else c=P.parseDescriptor(l);let u=zt.getIdentUrl(c),g=_T(await zt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:zt.customPackageError})),f=Object.keys(g.versions).sort(WT.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],m=Wt.validRange(c.range);if(m){let x=WT.default.maxSatisfying(f,m);x!==null?p=x:(a.reportWarning(X.UNNAMED,`Unmet range ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else Object.prototype.hasOwnProperty.call(g["dist-tags"],c.range)?p=g["dist-tags"][c.range]:c.range!=="unknown"&&(a.reportWarning(X.UNNAMED,`Unknown tag ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let y=g.versions[p],b=te(N(N({},g),y),{version:p,versions:f}),v;if(i!==null){v={};for(let x of i){let T=b[x];if(typeof T!="undefined")v[x]=T;else{a.reportWarning(X.EXCEPTION,`The ${ae.pretty(e,x,ae.Type.CODE)} field doesn't exist inside ${P.prettyIdent(e,c)}'s information`),s=!0;continue}}}else this.json||(delete b.dist,delete b.readme,delete b.users),v=b;a.reportJson(v),this.json||n.push(v)}});zT.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` +`),this.context.stdout.write(`${(0,zT.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} +`);return o.exitCode()}};oE.paths=[["npm","info"]],oE.usage=Re.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var fue=oE;function _T(r){if(Array.isArray(r)){let e=[];for(let t of r)t=_T(t),t&&e.push(t);return e}else if(typeof r=="object"&&r!==null){let e={};for(let t of Object.keys(r)){if(t.startsWith("_"))continue;let i=_T(r[t]);i&&(e[t]=i)}return e}else return r||null}var hue=ge(WC()),aE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await t_e({registry:t,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await zt.put(o,s,{attemptedAs:s.name,configuration:e,registry:t,jsonResponse:!0,authType:zt.AuthType.NO_AUTH});return await e_e(t,a.token,{configuration:e,scope:this.scope}),n.reportInfo(X.UNNAMED,"Successfully logged in")})).exitCode()}};aE.paths=[["npm","login"]],aE.usage=Re.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var pue=aE;async function Fb({scope:r,publish:e,configuration:t,cwd:i}){return r&&e?br.getScopeRegistry(r,{configuration:t,type:br.RegistryType.PUBLISH_REGISTRY}):r?br.getScopeRegistry(r,{configuration:t}):e?br.getPublishRegistry((await Wf(t,i)).manifest,{configuration:t}):br.getDefaultRegistry({configuration:t})}async function e_e(r,e,{configuration:t,scope:i}){let n=o=>a=>{let l=Se.isIndexableObject(a)?a:{},c=l[o],u=Se.isIndexableObject(c)?c:{};return te(N({},l),{[o]:te(N({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(r)};return await ye.updateHomeConfiguration(s)}async function t_e({registry:r,report:e,stdin:t,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(X.UNNAMED,`Logging in to ${r}`);let n=!1;r.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(X.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,hue.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var Bh=new Set(["npmAuthIdent","npmAuthToken"]),AE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=J.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=async()=>{var l;let n=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await ye.find(this.context.cwd,this.context.plugins),o=P.makeIdent((l=this.scope)!=null?l:null,"pkg");return!br.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await r_e(),n.reportInfo(X.UNNAMED,"Successfully logged out from everything")),this.scope){await due("npmScopes",this.scope),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(X.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish});await due("npmRegistries",s),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(X.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};AE.paths=[["npm","logout"]],AE.usage=Re.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Cue=AE;function i_e(r,e){let t=r[e];if(!Se.isIndexableObject(t))return!1;let i=new Set(Object.keys(t));if([...Bh].every(s=>!i.has(s)))return!1;for(let s of Bh)i.delete(s);if(i.size===0)return r[e]=void 0,!0;let n=N({},t);for(let s of Bh)delete n[s];return r[e]=n,!0}async function r_e(){let r=e=>{let t=!1,i=Se.isIndexableObject(e)?N({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,t=!0);for(let n of Object.keys(i))i_e(i,n)&&(t=!0);if(Object.keys(i).length!==0)return t?i:e};return await ye.updateHomeConfiguration({npmRegistries:r,npmScopes:r})}async function due(r,e){return await ye.updateHomeConfiguration({[r]:t=>{let i=Se.isIndexableObject(t)?t:{};if(!Object.prototype.hasOwnProperty.call(i,e))return t;let n=i[e],s=Se.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...Bh].every(l=>!o.has(l)))return t;for(let l of Bh)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:te(N({},i),{[e]:void 0});let a={};for(let l of Bh)a[l]=void 0;return te(N({},i),{[e]:N(N({},s),a)})}})}var lE=class extends Le{constructor(){super(...arguments);this.access=J.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=J.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=J.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=J.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);if(i.manifest.private)throw new Pe("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new Pe("Workspaces must have valid names and versions to be published on an external registry");await t.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=br.getPublishRegistry(i.manifest,{configuration:e});return(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await zt.get(zt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(X.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Zt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await PA.prepareForPack(i,{report:l},async()=>{let g=await PA.genPackList(i);for(let y of g)l.reportInfo(null,y);let f=await PA.genPackStream(i,g),h=await Se.bufferStream(f),p=await wh.getGitHead(i.cwd),m=await wh.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await zt.put(zt.getIdentUrl(n),m,{configuration:e,registry:o,ident:n,otp:this.otp,jsonResponse:!0})}),l.reportInfo(X.UNNAMED,"Package archive published")})).exitCode()}};lE.paths=[["npm","publish"]],lE.usage=Re.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var mue=lE;var Iue=ge(ri());var cE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=P.parseIdent(this.package);else{if(!i)throw new ht(t.cwd,this.context.cwd);if(!i.manifest.name)throw new Pe(`Missing 'name' field in ${H.fromPortablePath(k.join(i.cwd,kt.manifest))}`);n=i.manifest.name}let s=await uE(n,e),a={children:Se.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:ae.tuple(ae.Type.RESOLUTION,{descriptor:P.makeDescriptor(n,l),locator:P.makeLocator(n,c)})}))};return ls.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};cE.paths=[["npm","tag","list"]],cE.usage=Re.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` + This command will list all tags of a package from the npm registry. + + If the package is not specified, Yarn will default to the current workspace. + `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Eue=cE;async function uE(r,e){let t=`/-/package${zt.getIdentUrl(r)}/dist-tags`;return zt.get(t,{configuration:e,ident:r,jsonResponse:!0,customErrorMessage:zt.customPackageError})}var gE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseDescriptor(this.package,!0),s=n.range;if(!Iue.default.valid(s))throw new Pe(`The range ${ae.pretty(e,n.range,ae.Type.RANGE)} must be a valid semver version`);let o=br.getPublishRegistry(i.manifest,{configuration:e}),a=ae.pretty(e,n,ae.Type.IDENT),l=ae.pretty(e,s,ae.Type.RANGE),c=ae.pretty(e,this.tag,ae.Type.CODE);return(await Je.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await uE(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning(X.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(X.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};gE.paths=[["npm","tag","add"]],gE.usage=Re.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` + This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. + `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var yue=gE;var fE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){if(this.tag==="latest")throw new Pe("The 'latest' tag cannot be removed.");let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseIdent(this.package),s=br.getPublishRegistry(i.manifest,{configuration:e}),o=ae.pretty(e,this.tag,ae.Type.CODE),a=ae.pretty(e,n,ae.Type.IDENT),l=await uE(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new Pe(`${o} is not a tag of package ${a}`);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(X.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};fE.paths=[["npm","tag","remove"]],fE.usage=Re.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` + This command will remove a tag from a package from the npm registry. + `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var wue=fE;var hE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t;return this.scope&&this.publish?t=br.getScopeRegistry(this.scope,{configuration:e,type:br.RegistryType.PUBLISH_REGISTRY}):this.scope?t=br.getScopeRegistry(this.scope,{configuration:e}):this.publish?t=br.getPublishRegistry((await Wf(e,this.context.cwd)).manifest,{configuration:e}):t=br.getDefaultRegistry({configuration:e}),(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await zt.get("/-/whoami",{configuration:e,registry:t,authType:zt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?P.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(X.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(X.UNNAMED,s.username)})).exitCode()}};hE.paths=[["npm","whoami"]],hE.usage=Re.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var Bue=hE;var n_e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:Ie.STRING,default:null}},commands:[gue,fue,pue,Cue,mue,yue,Eue,wue,Bue]},s_e=n_e;var nO={};ft(nO,{default:()=>y_e,patchUtils:()=>XT});var XT={};ft(XT,{applyPatchFile:()=>Tb,diffFolders:()=>tO,extractPackageToDisk:()=>eO,extractPatchFlags:()=>Due,isParentRequired:()=>$T,loadPatchFiles:()=>mE,makeDescriptor:()=>m_e,makeLocator:()=>ZT,parseDescriptor:()=>dE,parseLocator:()=>CE,parsePatchFile:()=>Lb});var pE=class extends Error{constructor(e,t){super(`Cannot apply hunk #${e+1}`);this.hunk=t}};var o_e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function bh(r){return k.relative(Me.root,k.resolve(Me.root,H.toPortablePath(r)))}function a_e(r){let e=r.trim().match(o_e);if(!e)throw new Error(`Bad header line: '${r}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var A_e=420,l_e=493,Zr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Zr||(Zr={}));var bue=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),c_e=r=>({header:a_e(r),parts:[]}),u_e={["@"]:"header",["-"]:Zr.Deletion,["+"]:Zr.Insertion,[" "]:Zr.Context,["\\"]:"pragma",undefined:Zr.Context};function f_e(r){let e=[],t=bue(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),t.hunks.push(n),n=null)}function a(){o(),e.push(t),t=bue()}for(let l=0;l0?"patch":"mode change",v=null;switch(b){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:bh(u),toPath:bh(g)}),v=g}break;case"file deletion":{let x=n||p;if(!x)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(l),hash:f})}break;case"file creation":{let x=s||m;if(!x)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(c),hash:h})}break;case"patch":case"mode change":v=m||s;break;default:Se.assertNever(b);break}v&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:bh(v),oldMode:Nb(o),newMode:Nb(a)}),v&&y&&y.length&&e.push({type:"patch",semverExclusivity:i,path:bh(v),hunks:y,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function Nb(r){let e=parseInt(r,8)&511;if(e!==A_e&&e!==l_e)throw new Error(`Unexpected file mode string: ${r}`);return e}function Lb(r){let e=r.split(/\n/g);return e[e.length-1]===""&&e.pop(),h_e(f_e(e))}function g_e(r){let e=0,t=0;for(let{type:i,lines:n}of r.parts)switch(i){case Zr.Context:t+=n.length,e+=n.length;break;case Zr.Deletion:e+=n.length;break;case Zr.Insertion:t+=n.length;break;default:Se.assertNever(i);break}if(e!==r.header.original.length||t!==r.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(r.header.original.length)} ${i(r.header.patched.length)} @@, got @@ ${i(e)} ${i(t)} @@)`)}}async function Qh(r,e,t){let i=await r.lstatPromise(e),n=await t();if(typeof n!="undefined"&&(e=n),r.lutimesPromise)await r.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await r.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function Tb(r,{baseFs:e=new ar,dryRun:t=!1,version:i=null}={}){for(let n of r)if(!(n.semverExclusivity!==null&&i!==null&&!Wt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(t){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await Qh(e,k.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(t){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await Qh(e,k.dirname(n.fromPath),async()=>{await Qh(e,k.dirname(n.toPath),async()=>{await Qh(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(t){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` +`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` +`):"";await e.mkdirpPromise(k.dirname(n.path),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,Rr.SAFE_TIME,Rr.SAFE_TIME)}break;case"patch":await Qh(e,n.path,async()=>{await p_e(n,{baseFs:e,dryRun:t})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(Que(n.newMode)!==Que(o))continue;await Qh(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:Se.assertNever(n);break}}function Que(r){return(r&64)>0}function Sue(r){return r.replace(/\s+$/,"")}function d_e(r,e){return Sue(r)===Sue(e)}async function p_e({hunks:r,path:e},{baseFs:t,dryRun:i=!1}){let n=await t.statSync(e).mode,o=(await t.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of r){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),m=Math.max(h,p),y=0,b=0,v=null;for(;y<=m;){if(y<=h&&(b=f-y,v=vue(g,o,b),v!==null)){y=-y;break}if(y<=p&&(b=f+y,v=vue(g,o,b),v!==null))break;y+=1}if(v===null)throw new pE(r.indexOf(g),g);a.push(v),l+=y,c=b+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:Se.assertNever(f);break}await t.writeFilePromise(e,o.join(` +`),{mode:n})}function vue(r,e,t){let i=[];for(let n of r.parts)switch(n.type){case Zr.Context:case Zr.Deletion:{for(let s of n.lines){let o=e[t];if(o==null||!d_e(o,s))return null;t+=1}n.type===Zr.Deletion&&(i.push({type:"splice",index:t-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Zr.Insertion:i.push({type:"splice",index:t,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:Se.assertNever(n.type);break}return i}var C_e=/^builtin<([^>]+)>$/;function xue(r,e){let{source:t,selector:i,params:n}=P.parseRange(r);if(t===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>H.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?P.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(t);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function dE(r){let i=xue(r.range,P.parseDescriptor),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceDescriptor:e})}function CE(r){let i=xue(r.reference,P.parseLocator),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceLocator:e})}function kue({parentLocator:r,sourceItem:e,patchPaths:t,sourceVersion:i,patchHash:n},s){let o=r!==null?{locator:P.stringifyLocator(r)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return P.makeRange({protocol:"patch:",source:s(e),selector:t.join("&"),params:N(N(N({},a),l),o)})}function m_e(r,{parentLocator:e,sourceDescriptor:t,patchPaths:i}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,patchPaths:i},P.stringifyDescriptor))}function ZT(r,{parentLocator:e,sourcePackage:t,patchPaths:i,patchHash:n}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,sourceVersion:t.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function Pue({onAbsolute:r,onRelative:e,onBuiltin:t},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(C_e);return s!==null?t(s[1]):k.isAbsolute(i)?r(i):e(i)}function Due(r){let e=r.startsWith("~");return e&&(r=r.slice(1)),{optional:e}}function $T(r){return Pue({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},r)}async function mE(r,e,t){let i=r!==null?await t.fetcher.fetch(r,t):null,n=i&&i.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await Se.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Due(o),l=await Pue({onAbsolute:async()=>await K.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(k.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await t.project.configuration.firstHook(u=>u.getBuiltinPatch,t.project,c)},o);return te(N({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` +`));return s}async function eO(r,{cache:e,project:t}){let i=t.storedPackages.get(r.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=t.storedChecksums,s=new di,o=t.configuration.makeFetcher(),a=await o.fetch(r,{cache:e,project:t,fetcher:o,checksums:n,report:s}),l=await K.mktempPromise(),c=k.join(l,"source"),u=k.join(l,"user"),g=k.join(l,".yarn-patch.json");return await Promise.all([K.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),K.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),K.writeJsonPromise(g,{locator:P.stringifyLocator(r),version:i.version})]),K.detachTemp(l),u}async function tO(r,e){let t=H.fromPortablePath(r).replace(/\\/g,"/"),i=H.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await Nr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",t,i],{cwd:H.toPortablePath(process.cwd()),env:te(N({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. +The following error was reported by 'git': +${s}`);let o=t.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${Se.escapeRegExp(`/${o(t)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${Se.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(Se.escapeRegExp(`${t}/`),"g"),"").replace(new RegExp(Se.escapeRegExp(`${i}/`),"g"),"")}function Rue(r,{configuration:e,report:t}){for(let i of r.parts)for(let n of i.lines)switch(i.type){case Zr.Context:t.reportInfo(null,` ${ae.pretty(e,n,"grey")}`);break;case Zr.Deletion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`- ${ae.pretty(e,n,ae.Type.REMOVED)}`);break;case Zr.Insertion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`+ ${ae.pretty(e,n,ae.Type.ADDED)}`);break;default:Se.assertNever(i.type)}}var rO=class{supports(e,t){return!!e.reference.startsWith("patch:")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async patchPackage(e,t){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=CE(e),a=await mE(i,o,t),l=await K.mktempPromise(),c=k.join(l,"current.zip"),u=await t.fetcher.fetch(n,t),g=P.getIdentVendorPath(e),f=await fn(),h=new li(c,{libzip:f,create:!0,level:t.project.configuration.get("compressionLevel")});await Se.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:m}of a){if(p===null)continue;let y=new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")}),b=new _t(k.resolve(Me.root,g),{baseFs:y});try{await Tb(Lb(p),{baseFs:b,version:s})}catch(v){if(!(v instanceof pE))throw v;let x=t.project.configuration.get("enableInlineHunks"),T=!x&&!m?" (set enableInlineHunks for details)":"",q=`${P.prettyLocator(t.project.configuration,e)}: ${v.message}${T}`,Y=$=>{!x||Rue(v.hunk,{configuration:t.project.configuration,report:$})};if(y.discardAndClose(),m){t.report.reportWarningOnce(X.PATCH_HUNK_FAILED,q,{reportExtra:Y});continue}else throw new ct(X.PATCH_HUNK_FAILED,q,Y)}y.saveAndClose()}return new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")})}};var E_e=3,iO=class{supportsDescriptor(e,t){return!!e.range.startsWith("patch:")}supportsLocator(e,t){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){let{patchPaths:n}=dE(e);return n.every(s=>!$T(s))?e:P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){let{sourceDescriptor:i}=dE(e);return[i]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=dE(e),a=await mE(n,o,i.fetchOptions),l=t.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=Dn.makeHash(`${E_e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[ZT(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){let{sourceLocator:i}=CE(e),n=await t.resolver.resolve(i,t);return N(N({},n),e)}};var EE=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=k.resolve(this.context.cwd,H.toPortablePath(this.patchFolder)),s=k.join(n,"../source"),o=k.join(n,"../.yarn-patch.json");if(!K.existsSync(s))throw new Pe("The argument folder didn't get created by 'yarn patch'");let a=await tO(s,n),l=await K.readJsonPromise(o),c=P.parseLocator(l.locator,!0);if(!t.storedPackages.has(c.locatorHash))throw new Pe("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=k.join(u,`${P.slugifyLocator(c)}.patch`);await K.mkdirPromise(u,{recursive:!0}),await K.writeFilePromise(g,a);let f=k.relative(t.cwd,g);t.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:P.stringifyIdent(c),description:l.version}},reference:`patch:${P.stringifyLocator(c)}#${f}`}),await t.persist()}};EE.paths=[["patch-commit"]],EE.usage=Re.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var Fue=EE;var IE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=P.parseLocator(this.package);if(s.reference==="unknown"){let o=Se.mapAndFilter([...t.storedPackages.values()],a=>a.identHash!==s.identHash?Se.mapAndFilter.skip:P.isVirtualLocator(a)?Se.mapAndFilter.skip:a);if(o.length===0)throw new Pe("No package found in the project for the given locator");if(o.length>1)throw new Pe(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): +${o.map(a=>` +- ${P.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!t.storedPackages.has(s.locatorHash))throw new Pe("No package found in the project for the given locator");await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await eO(s,{cache:n,project:t});o.reportJson({locator:P.stringifyLocator(s),path:H.fromPortablePath(a)}),o.reportInfo(X.UNNAMED,`Package ${P.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(X.UNNAMED,`You can now edit the following folder: ${ae.pretty(e,H.fromPortablePath(a),"magenta")}`),o.reportInfo(X.UNNAMED,`Once you are done run ${ae.pretty(e,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${H.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};IE.paths=[["patch"]],IE.usage=Re.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n \n Once you're done with your changes, run `yarn patch-commit -s ` (with `` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n "});var Nue=IE;var I_e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:Ie.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[Fue,Nue],fetchers:[rO],resolvers:[iO]},y_e=I_e;var AO={};ft(AO,{default:()=>b_e});var sO=class{supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=n.pathByLocator.get(e.locatorHash);if(typeof s=="undefined")throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return s}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=k.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new Lue(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},Lue=class{constructor(e){this.opts=e;this.asyncActions=new Se.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return oO()}attachCustomData(e){}async installPackage(e,t,i){switch(e.linkType){case Qt.SOFT:return this.installPackageSoft(e,t,i);case Qt.HARD:return this.installPackageHard(e,t,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,t,i){let n=k.resolve(t.packageFs.getRealPath(),t.prefixPath);return this.customData.pathByLocator.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,t,i){var u;let n=w_e(e,{project:this.opts.project});this.customData.locatorByPath.set(n,P.stringifyLocator(e)),this.customData.pathByLocator.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,t.prefixPath,{baseFs:t.packageFs,overwrite:!1})}));let o=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e,a={manifest:(u=await At.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?u:new At,misc:{hasBindingGyp:Ca.hasBindingGyp(t)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Ca.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,t){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!Mue(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.customData.pathByLocator.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(e)})`);let s=k.join(n,kt.nodeModules),o=[],a=await Kue(s);for(let[l,c]of t){let u=c;Mue(c,{project:this.opts.project})||(this.opts.report.reportWarning(X.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=P.devirtualizeLocator(c));let g=this.customData.pathByLocator.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(c)})`);let f=P.stringifyIdent(l),h=k.join(s,f),p=k.relative(k.dirname(h),g),m=a.get(f);a.delete(f),o.push(Promise.resolve().then(async()=>{if(m){if(m.isSymbolicLink()&&await K.readlinkPromise(h)===p)return;await K.removePromise(h)}await K.mkdirpPromise(k.dirname(h)),process.platform=="win32"?await K.symlinkPromise(g,h,"junction"):await K.symlinkPromise(p,h)}))}o.push(Uue(s,a)),await Promise.all(o)}))}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=Oue(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await K.removePromise(e);else{let t=[],i=new Set;for(let s of this.customData.pathByLocator.values()){let o=k.contains(e,s);if(o!==null){let[a,,...l]=o.split(k.sep);i.add(a);let c=k.join(e,a);t.push(K.readdirPromise(c).then(u=>Promise.all(u.map(async g=>{let f=k.join(c,g);if(g===kt.nodeModules){let h=await Kue(f);return h.delete(l.join(k.sep)),Uue(f,h)}else return K.removePromise(f)}))).catch(u=>{if(u.code!=="ENOENT")throw u}))}}let n;try{n=await K.readdirPromise(e)}catch{n=[]}for(let s of n)i.has(s)||t.push(K.removePromise(k.join(e,s)));await Promise.all(t)}return await this.asyncActions.wait(),await aO(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await aO(Tue(this.opts.project)),{customData:this.customData}}};function oO(){return JSON.stringify({name:"PnpmInstaller",version:2})}function Tue(r){return k.join(r.cwd,kt.nodeModules)}function Oue(r){return k.join(Tue(r),".store")}function w_e(r,{project:e}){let t=P.slugifyLocator(r),i=P.getIdentVendorPath(r);return k.join(Oue(e),t,i)}function Mue(r,{project:e}){return!P.isVirtualLocator(r)||!e.tryWorkspaceByLocator(r)}async function Kue(r){let e=new Map,t=[];try{t=await K.readdirPromise(r,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of t)if(!i.name.startsWith("."))if(i.name.startsWith("@")){let n=await K.readdirPromise(k.join(r,i.name),{withFileTypes:!0});if(n.length===0)e.set(i.name,i);else for(let s of n)e.set(`${i.name}/${s.name}`,s)}else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}async function Uue(r,e){var n;let t=[],i=new Set;for(let s of e.keys()){t.push(K.removePromise(k.join(r,s)));let o=(n=P.tryParseIdent(s))==null?void 0:n.scope;o&&i.add(`@${o}`)}return Promise.all(t).then(()=>Promise.all([...i].map(s=>aO(k.join(r,s)))))}async function aO(r){try{await K.rmdirPromise(r)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var B_e={linkers:[sO]},b_e=B_e;var L0=()=>({modules:new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",cZ(Cp)],["semver",Q_e],["typanion",cg],["yup",S_e],["@yarnpkg/plugin-essentials",GN],["@yarnpkg/plugin-compat",zN],["@yarnpkg/plugin-dlx",_N],["@yarnpkg/plugin-file",nL],["@yarnpkg/plugin-git",jN],["@yarnpkg/plugin-github",oL],["@yarnpkg/plugin-http",lL],["@yarnpkg/plugin-init",fL],["@yarnpkg/plugin-link",mL],["@yarnpkg/plugin-nm",JL],["@yarnpkg/plugin-npm",qT],["@yarnpkg/plugin-npm-cli",VT],["@yarnpkg/plugin-pack",HT],["@yarnpkg/plugin-patch",nO],["@yarnpkg/plugin-pnp",LL],["@yarnpkg/plugin-pnpm",AO]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});s0({binaryVersion:Ur||"",pluginConfiguration:L0()});})(); +/*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + */ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ diff --git a/nym-api/tests/README.md b/nym-api/tests/README.md index 914e55bdcd..baf72a79aa 100644 --- a/nym-api/tests/README.md +++ b/nym-api/tests/README.md @@ -1,5 +1,5 @@ -## validator-api-test suite +## nym-api-test suite A Typescript test framework utilising Jest and Node to perform tests against the NYM validator-apis. diff --git a/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts b/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts new file mode 100644 index 0000000000..1b60887e3a --- /dev/null +++ b/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts @@ -0,0 +1,25 @@ +import ConfigHandler from "../../src/config/configHandler"; +import ContractCache from "../../src/endpoints/CirculatingSupply"; +let contract: ContractCache; +let config: ConfigHandler; + + +describe("Get circulating supply", (): void => { + beforeAll(async (): Promise => { + contract = new ContractCache(); + config = ConfigHandler.getInstance(); + }); + + it("Get circulating supply amounts", async (): Promise => { + const response = await contract.getCirculatingSupply(); + + let initial: number = +(response.initial_supply.amount); + let mixmining: number = +(response.mixmining_reserve.amount); + let vest: number = +(response.vesting_tokens.amount); + let circsupply: number = +(response.circulating_supply.amount); + + expect(typeof response.vesting_tokens.amount).toBe('string'); + expect(initial - mixmining - vest).toStrictEqual(circsupply); + + }); + }); \ No newline at end of file diff --git a/nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts b/nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts new file mode 100644 index 0000000000..11239d01be --- /dev/null +++ b/nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts @@ -0,0 +1,40 @@ +import ContractCache from "../../src/endpoints/ContractCache"; +import ConfigHandler from "../../src/config/configHandler"; + +let contract: ContractCache; +let config: ConfigHandler; + + +describe("Get epoch info", (): void => { + beforeAll(async (): Promise => { + contract = new ContractCache(); + config = ConfigHandler.getInstance(); + }); + + it("Get epoch reward params", async (): Promise => { + const response = await contract.getEpochRewardParams(); + expect(typeof response.interval.reward_pool).toBe('string'); + expect(typeof response.interval.staking_supply_scale_factor).toBe('string'); + expect(typeof response.interval.staking_supply).toBe('string'); + expect(typeof response.interval.epoch_reward_budget).toBe('string'); + expect(typeof response.interval.stake_saturation_point).toBe('string'); + expect(typeof response.interval.sybil_resistance).toBe('string'); + expect(typeof response.interval.active_set_work_factor).toBe('string'); + expect(typeof response.interval.interval_pool_emission).toBe('string'); + expect(typeof response.active_set_size).toBe('number'); + expect(typeof response.rewarded_set_size).toBe('number'); + }); + + it("Get current epoch", async (): Promise => { + const response = await contract.getCurrentEpoch(); + expect(typeof response.id).toBe('number'); + expect(typeof response.epochs_in_interval).toBe('number'); + expect(typeof response.current_epoch_id).toBe('number'); + expect(typeof response.current_epoch_start).toBe('string'); + expect(typeof response.epoch_length.secs).toBe('number'); + expect(typeof response.epoch_length.nanos).toBe('number'); + expect(typeof response.total_elapsed_epochs).toBe('number'); + }); + + +}); \ No newline at end of file diff --git a/nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts b/nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts new file mode 100644 index 0000000000..6f1546f2d2 --- /dev/null +++ b/nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts @@ -0,0 +1,50 @@ +import ContractCache from "../../../src/endpoints/ContractCache"; +import ConfigHandler from "../../../src/config/configHandler"; + +let contract: ContractCache; +let config: ConfigHandler; + + +describe("Get gateway data", (): void => { + beforeAll(async (): Promise => { + contract = new ContractCache(); + config = ConfigHandler.getInstance(); + }); + + it("Get all gateways", async (): Promise => { + const response = await contract.getGateways(); + response.forEach((gateway) => { + //overview + expect(typeof gateway.owner).toBe('string'); + expect(typeof gateway.block_height).toBe('number'); + + if (gateway.proxy === null) { + return true; + } + else { + expect(typeof gateway.proxy).toBe('string'); + } + + //pledge_amount + expect(typeof gateway.pledge_amount.denom).toBe('string'); + expect(typeof gateway.pledge_amount.amount).toBe('string'); + + //gateway + expect(typeof gateway.gateway.host).toBe('string'); + expect(typeof gateway.gateway.mix_port).toBe('number'); + expect(typeof gateway.gateway.clients_port).toBe('number'); + expect(typeof gateway.gateway.location).toBe('string'); + expect(typeof gateway.gateway.sphinx_key).toBe('string'); + expect(typeof gateway.gateway.identity_key).toBe('string'); + expect(typeof gateway.gateway.version).toBe('string'); + }); + }); + + it("Get blacklisted gateways", async (): Promise => { + const response = await contract.getBlacklistedGateways(); + response.forEach(function (value) { + expect(typeof value).toBe('string'); + }); + }); + +}); diff --git a/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts new file mode 100644 index 0000000000..1cfa93cbac --- /dev/null +++ b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts @@ -0,0 +1,173 @@ +import ContractCache from "../../../src/endpoints/ContractCache"; +import ConfigHandler from "../../../src/config/configHandler"; + +let contract: ContractCache; +let config: ConfigHandler; + + +describe("Get mixnode data", (): void => { + beforeAll(async (): Promise => { + contract = new ContractCache(); + config = ConfigHandler.getInstance(); + }); + + it("Get all mixnodes", async (): Promise => { + const response = await contract.getMixnodes(); + + response.forEach((mixnode) => { + //bond information overview + expect(typeof mixnode.bond_information.mix_id).toBe('number'); + expect(typeof mixnode.bond_information.owner).toBe('string'); + expect(typeof mixnode.bond_information.original_pledge.amount).toBe('string'); + expect(typeof mixnode.bond_information.original_pledge.denom).toBe('string'); + expect(typeof mixnode.bond_information.layer).toBe('number'); + expect(typeof mixnode.bond_information.bonding_height).toBe('number'); + expect(typeof mixnode.bond_information.is_unbonding).toBe('boolean'); + + if (mixnode.bond_information.proxy === null) { + return true; + } + else { + expect(typeof mixnode.bond_information.proxy).toBe('string'); + } + + //mixnode + expect(typeof mixnode.bond_information.mix_node.host).toBe('string') + expect(mixnode.bond_information.mix_node.http_api_port).toStrictEqual(8000); + expect(typeof mixnode.bond_information.mix_node.verloc_port).toBe('number') + expect(typeof mixnode.bond_information.mix_node.mix_port).toBe('number') + expect(mixnode.bond_information.mix_node.mix_port).toStrictEqual(1789); + expect(mixnode.bond_information.mix_node.verloc_port).toStrictEqual(1790) + + let identitykey = mixnode.bond_information.mix_node.identity_key + if (typeof identitykey === 'string') { + if (identitykey.length === 43) { + return true + } + else expect(identitykey).toHaveLength(44); + } + + let sphinx = mixnode.bond_information.mix_node.sphinx_key + if (typeof sphinx === 'string') { + if (sphinx.length === 43) { + return true + } + else expect(sphinx).toHaveLength(44); + } + + //rewarding details + expect(typeof mixnode.rewarding_details.cost_params.profit_margin_percent).toBe('string') + expect(typeof mixnode.rewarding_details.cost_params.interval_operating_cost.denom).toBe('string') + expect(typeof mixnode.rewarding_details.cost_params.interval_operating_cost.amount).toBe('string') + expect(typeof mixnode.rewarding_details.operator).toBe('string') + expect(typeof mixnode.rewarding_details.delegates).toBe('string') + expect(typeof mixnode.rewarding_details.total_unit_reward).toBe('string') + expect(typeof mixnode.rewarding_details.unit_delegation).toBe('string') + expect(typeof mixnode.rewarding_details.last_rewarded_epoch).toBe('number') + expect(typeof mixnode.rewarding_details.unique_delegations).toBe('number') + + }); + }); + + it("Get all mixnodes detailed", async (): Promise => { + const response = await contract.getMixnodesDetailed(); + response.forEach((mixnode) => { + // overview details + expect(typeof mixnode.estimated_delegators_apy).toBe('string'); + expect(typeof mixnode.estimated_operator_apy).toBe('string'); + expect(typeof mixnode.performance).toBe('string'); + expect(typeof mixnode.uncapped_stake_saturation).toBe('string'); + expect(typeof mixnode.stake_saturation).toBe('string'); + expect(typeof mixnode.family).toBe('string'); + + //mixnode details bond info + expect(typeof mixnode.mixnode_details.bond_information.mix_id).toBe('number') + expect(typeof mixnode.mixnode_details.bond_information.owner).toBe('string'); + expect(typeof mixnode.mixnode_details.bond_information.original_pledge.amount).toBe('string'); + expect(typeof mixnode.mixnode_details.bond_information.original_pledge.denom).toBe('string'); + expect(typeof mixnode.mixnode_details.bond_information.layer).toBe('number'); + expect(typeof mixnode.mixnode_details.bond_information.bonding_height).toBe('number'); + expect(typeof mixnode.mixnode_details.bond_information.is_unbonding).toBe('boolean'); + + if (mixnode.mixnode_details.bond_information.proxy === null) { + return true; + } + else { + expect(typeof mixnode.mixnode_details.bond_information.proxy).toBe('string'); + } + + //mixnode + expect(typeof mixnode.mixnode_details.bond_information.mix_node.host).toBe('string') + expect(mixnode.mixnode_details.bond_information.mix_node.http_api_port).toStrictEqual(8000); + expect(typeof mixnode.mixnode_details.bond_information.mix_node.verloc_port).toBe('number') + expect(typeof mixnode.mixnode_details.bond_information.mix_node.mix_port).toBe('number') + expect(mixnode.mixnode_details.bond_information.mix_node.mix_port).toStrictEqual(1789); + expect(mixnode.mixnode_details.bond_information.mix_node.verloc_port).toStrictEqual(1790) + + let identitykey2 = mixnode.mixnode_details.bond_information.mix_node.identity_key + if (typeof identitykey2 === 'string') { + if (identitykey2.length === 43) { + return true + } + else expect(identitykey2).toHaveLength(44); + } + + let sphinx2 = mixnode.mixnode_details.bond_information.mix_node.sphinx_key + if (typeof sphinx2 === 'string') { + if (sphinx2.length === 43) { + return true + } + else expect(sphinx2).toHaveLength(44); + } + + //mixnode rewarding info + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBe('string') + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.denom).toBe('string') + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.amount).toBe('string') + expect(typeof mixnode.mixnode_details.rewarding_details.operator).toBe('string') + expect(typeof mixnode.mixnode_details.rewarding_details.delegates).toBe('string') + expect(typeof mixnode.mixnode_details.rewarding_details.total_unit_reward).toBe('string') + expect(typeof mixnode.mixnode_details.rewarding_details.unit_delegation).toBe('string') + expect(typeof mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBe('number') + expect(typeof mixnode.mixnode_details.rewarding_details.unique_delegations).toBe('number') + + }); + }); + + it("Get active mixnodes", async (): Promise => { + const response = await contract.getActiveMixnodes(); + response.forEach(function (mixnode) { + expect(mixnode.rewarding_details.cost_params.profit_margin_percent).toBeTruthy() + expect(typeof mixnode.bond_information.layer).toBe('number') + }); + }); + + it("Get active mixnodes detailed", async (): Promise => { + const response = await contract.getActiveMixnodesDetailed(); + response.forEach(function (mixnode) { + expect(mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBeTruthy() + }); + }); + + it("Get rewarded mixnodes", async (): Promise => { + const response = await contract.getRewardedMixnodes(); + response.forEach(function (mixnode) { + expect(mixnode.rewarding_details.last_rewarded_epoch).toBeTruthy() + }); + }); + + it("Get rewarded mixnodes detailed", async (): Promise => { + const response = await contract.getRewardedMixnodesDetailed(); + response.forEach(function (mixnode) { + expect(mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBeTruthy() + }); + }); + + it("Get blacklisted mixnodes", async (): Promise => { + const response = await contract.getBlacklistedMixnodes(); + response.forEach(function (value) { + expect(typeof value).toBe('number'); + }); + }); + +}); diff --git a/nym-api/tests/functional_test/status/status-gateway.test.ts b/nym-api/tests/functional_test/status/status-gateway.test.ts new file mode 100644 index 0000000000..9c046cd2b7 --- /dev/null +++ b/nym-api/tests/functional_test/status/status-gateway.test.ts @@ -0,0 +1,50 @@ +import Status from "../../src/endpoints/Status"; +import ConfigHandler from "../../src/config/configHandler"; + +let status: Status; +let config: ConfigHandler; + +describe("Get gateway data", (): void => { + beforeAll(async (): Promise => { + status = new Status(); + config = ConfigHandler.getInstance(); + }); + + it("Get all gateways detailed", async (): Promise => { + const response = await status.getDetailedGateways(); + response.forEach((x) => { + expect(typeof x.gateway_bond.owner).toBe("string"); + expect(typeof x.performance).toBe("string"); + }); + }); + + it("Get a gateway history", async (): Promise => { + const identity_key = config.environmnetConfig.gateway_identity; + const response = await status.getGatewayHistory(identity_key); + response.history.forEach((x) => { + expect(typeof x.date).toBe("string"); + expect(typeof x.uptime).toBe("number"); + }); + + expect(identity_key).toStrictEqual(response.identity); + expect(typeof response.owner).toBe("string"); + }); + + it("Get gateway core status count", async (): Promise => { + const identity_key = config.environmnetConfig.gateway_identity; + const response = await status.getGatewayCoreCount(identity_key); + expect(identity_key).toStrictEqual(response.identity); + expect(typeof response.count).toBe("number"); + }); + + it("Get a gateway status report", async (): Promise => { + const identity_key = config.environmnetConfig.gateway_identity; + const response = await status.getGatewayStatusReport(identity_key); + expect(identity_key).toStrictEqual(response.identity); + expect(typeof response.owner).toBe("string"); + expect(typeof response.most_recent).toBe("number"); + expect(typeof response.last_hour).toBe("number"); + expect(typeof response.last_day).toBe("number"); + }); + +}); diff --git a/nym-api/tests/functional_test/status/status-mixnode.test.ts b/nym-api/tests/functional_test/status/status-mixnode.test.ts new file mode 100644 index 0000000000..ca2880dd00 --- /dev/null +++ b/nym-api/tests/functional_test/status/status-mixnode.test.ts @@ -0,0 +1,120 @@ +import Status from "../../src/endpoints/Status"; +import ConfigHandler from "../../src/config/configHandler"; + +let status: Status; +let config: ConfigHandler; + +describe("Get mixnode data", (): void => { + beforeAll(async (): Promise => { + status = new Status(); + config = ConfigHandler.getInstance(); + }); + + it("Get a mixnode report", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeStatusReport(identity_key); + + expect(typeof response.last_day).toBe("number"); + expect(typeof response.owner).toBe("string"); + }); + + it("Get a mixnode stake saturation", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeStakeSaturation(identity_key); + + expect(typeof response.as_at).toBe("number"); + expect(typeof response.saturation).toBe("string"); + expect(typeof response.uncapped_saturation).toBe("string"); + }); + + it("Get a mixnode average uptime", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeAverageUptime(identity_key); + + expect(identity_key).toStrictEqual(response.mix_id); + expect(typeof response.avg_uptime).toBe("number"); + }); + + it("Get a mixnode history", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeHistory(identity_key); + + response.history.forEach((x) => { + console.log(x.date); + console.log(x.uptime); + }) + + expect(identity_key).toStrictEqual(response.mix_id); + expect(typeof response.owner).toBe("string"); + }); + + it("Get a mixnode core count", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeCoreCount(identity_key); + + expect(identity_key).toStrictEqual(response.mix_id); + expect(typeof response.count).toBe("number"); + }); + + it("Get a mixnode status", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeStatus(identity_key); + + expect(response.status).toStrictEqual("active"); + }); + + it("Get a mixnode reward estimation", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeRewardComputation(identity_key); + + expect(response.reward_params.interval.sybil_resistance).toStrictEqual("0.3"); + expect(response.reward_params.active_set_size).toStrictEqual(240); + expect(typeof response.reward_params.interval.reward_pool).toBe("string"); + }); + + it("Get a mixnode inclusion probability", async (): Promise => { + const identity_key = config.environmnetConfig.mix_id; + const response = await status.getMixnodeInclusionProbability(identity_key); + + expect(typeof response.in_active).toBe("string"); + }); + + it("Get all mixnodes inclusion probability", async (): Promise => { + const response = await status.getAllMixnodeInclusionProbability(); + + expect(response.inclusion_probabilities).toBeTruthy(); + }); + + it("Get all mixnodes", async (): Promise => { + const response = await status.getDetailedMixnodes(); + + expect(typeof response.stake_saturation).toBe("string"); + }); + + it("Get all rewarded mixnodes", async (): Promise => { + const response = await status.getDetailedRewardedMixnodes(); + + expect(typeof response.mixnode_details.rewarding_details.last_rewarded_epoch).toBe("number"); + }); + + it("Get all active mixnodes", async (): Promise => { + const response = await status.getDetailedActiveMixnodes(); + + expect(typeof response.mixnode_details.bond_information.layer).toBe("number"); + }); + +}); + +describe("Compute mixnode reward estimation", (): void => { + beforeAll(async (): Promise => { + status = new Status(); + config = ConfigHandler.getInstance(); + }); + it("with correct data", async (): Promise => { + const response = await status.sendMixnodeRewardEstimatedComputation(8); + const body = + + expect(typeof response.estimation.total_node_reward).toBe("string"); + }); + +}); diff --git a/nym-api/tests/functional_test/validator-api/status/status-mixnode.test.ts b/nym-api/tests/functional_test/validator-api/status/status-mixnode.test.ts deleted file mode 100644 index 58542fafae..0000000000 --- a/nym-api/tests/functional_test/validator-api/status/status-mixnode.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -import Status from "../../../src/endpoints/Status"; -import ConfigHandler from "../../../src/config/configHandler"; - -let status: Status; -let config: ConfigHandler; - -describe("Get mixnode data", (): void => { - beforeAll(async (): Promise => { - status = new Status(); - config = ConfigHandler.getInstance(); - }); - - it("Get a mixnode stake saturation", async (): Promise => { - const identity_key = config.environmnetConfig.mixnode_identity; - const response = await status.getMixnodeStakeSaturation(identity_key); - - console.log(response.as_at); - console.log(response.saturation); - - expect(typeof response.as_at).toBe("number"); - expect(typeof response.saturation).toBe("number"); - }); - - it("Get a mixnode average uptime", async (): Promise => { - const identity_key = config.environmnetConfig.mixnode_identity; - const response = await status.getMixnodeAverageUptime(identity_key); - - console.log(response.avg_uptime); - console.log(response.identity); - - expect(identity_key).toStrictEqual(response.identity); - expect(typeof response.avg_uptime).toBe("number"); - }); - - it("Get a mixnode history", async (): Promise => { - const identity_key = config.environmnetConfig.mixnode_identity; - const response = await status.getMixnodeHistory(identity_key); - - response.history.forEach((x) => { - console.log(x.date); - console.log(x.uptime); - }); - console.log(response.identity); - console.log(response.owner); - - expect(identity_key).toStrictEqual(response.identity); - expect(typeof response.owner).toBe("string"); - }); - - it("Get a gateway history", async (): Promise => { - const identity_key = config.environmnetConfig.gateway_identity; - const response = await status.getGatewayHistory(identity_key); - - response.history.forEach((x) => { - console.log(x.date); - console.log(x.uptime); - }); - console.log(response.identity); - console.log(response.owner); - - expect(identity_key).toStrictEqual(response.identity); - expect(typeof response.owner).toBe("string"); - }); - - it("Get a gateway history", async (): Promise => { - const identity_key = config.environmnetConfig.gateway_identity; - const response = await status.getGatewayCoreCount(identity_key); - - console.log(response.count); - console.log(response.identity); - - expect(identity_key).toStrictEqual(response.identity); - expect(typeof response.count).toBe("number"); - }); - - it("Get a gateway history", async (): Promise => { - const identity_key = config.environmnetConfig.mixnode_identity; - const response = await status.getMixnodeCoreCount(identity_key); - - console.log(response.count); - console.log(response.identity); - - expect(identity_key).toStrictEqual(response.identity); - expect(typeof response.count).toBe("number"); - }); - - it("Get a mixnode status", async (): Promise => { - const identity_key = config.environmnetConfig.mixnode_identity; - const response = await status.getMixnodeStatus(identity_key); - - console.log(response.status); - - expect(response.status).toStrictEqual("active"); - }); - - it("Get a mixnode reward estimation", async (): Promise => { - const identity_key = config.environmnetConfig.mixnode_identity; - const response = await status.getMixnodeRewardComputation(identity_key); - - console.log(response.estimated_delegators_reward); - console.log(response.estimated_node_profit); - console.log(response.estimated_operator_cost); - console.log(response.estimated_operator_reward); - console.log(response.estimated_total_node_reward); - console.log(response.reward_params); - console.log(response.as_at); - console.log(response); - - //assertions to come - //expect(response).toStrictEqual('something'); - }); - - it("Get a mixnode inclusion probability", async (): Promise => { - const identity_key = config.environmnetConfig.mixnode_identity; - const response = await status.getMixnodeInclusionProbability(identity_key); - - console.log(response.in_active); - console.log(response.in_reserve); - - //assertions to come - //expect(response).toStrictEqual('something'); - }); -}); diff --git a/nym-api/tests/package-lock.json b/nym-api/tests/package-lock.json new file mode 100644 index 0000000000..7e89111737 --- /dev/null +++ b/nym-api/tests/package-lock.json @@ -0,0 +1,8401 @@ +{ + "name": "validator-api-test-suite", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "validator-api-test-suite", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "axios": "^0.27.2", + "eslint": "^8.21.0", + "form-data": "4.0.0", + "json-stringify-safe": "5.0.1", + "tslog": "3.3.3", + "uuid": "8.3.2", + "yaml": "^2.1.1" + }, + "devDependencies": { + "@types/jest": "28.1.6", + "@types/mocha": "^10.0.1", + "@typescript-eslint/eslint-plugin": "^5.12.1", + "@typescript-eslint/parser": "^5.33.0", + "axios-mock-adapter": "^1.20.0", + "eslint-config-prettier": "^8.4.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "^28.1.3", + "jest-junit": "^14.0.0", + "prettier": "2.7.1", + "process": "0.11.10", + "ts-jest": "28.0.7", + "typescript": "^4.7.4", + "uuidv4": "^6.2.12" + }, + "engines": { + "node": "18.1.0", + "npm": "8.x" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/core": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", + "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/reporters": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.1.3", + "jest-config": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-resolve-dependencies": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "jest-watcher": "^28.1.3", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, + "dependencies": { + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", + "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.13", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.27", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz", + "integrity": "sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", + "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "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==", + "dev": true + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "28.1.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.6.tgz", + "integrity": "sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==", + "dev": true, + "dependencies": { + "jest-matcher-utils": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz", + "integrity": "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", + "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", + "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@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==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", + "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/type-utils": "5.33.0", + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz", + "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", + "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", + "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz", + "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", + "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz", + "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", + "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.33.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/axios-mock-adapter": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz", + "integrity": "sha512-jzyNxU3JzB2XVhplZboUcF0YDs7xuExzoRSHXPHr+UQajaGmcTqvkkUADgkVI2WkGlpZ1zZlMVdcTMU0ejV8zQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + }, + "peerDependencies": { + "axios": ">= 0.17.0" + } + }, + "node_modules/babel-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", + "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "dev": true, + "dependencies": { + "@jest/transform": "^28.1.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^28.1.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001375", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", + "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.215", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz", + "integrity": "sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "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.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", + "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.3", + "@jest/types": "^28.1.3", + "import-local": "^3.0.2", + "jest-cli": "^28.1.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", + "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "p-limit": "^3.1.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-cli": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", + "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", + "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.3", + "@jest/types": "^28.1.3", + "babel-jest": "^28.1.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.3", + "jest-environment-node": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-each": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.3", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-junit": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-14.0.0.tgz", + "integrity": "sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", + "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/environment": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-leak-detector": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-resolve": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-util": "^28.1.3", + "jest-watcher": "^28.1.3", + "jest-worker": "^28.1.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/globals": "^28.1.3", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "28.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz", + "integrity": "sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^28.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^28.0.0", + "babel-jest": "^28.0.0", + "jest": "^28.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tslog": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tslog/-/tslog-3.3.3.tgz", + "integrity": "sha512-lGrkndwpAohZ9ntQpT+xtUw5k9YFV1DjsksiWQlBSf82TTqsSAWBARPRD9juI730r8o3Awpkjp2aXy9k+6vr+g==", + "dependencies": { + "source-map-support": "^0.5.21" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tslog/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuidv4": { + "version": "6.2.13", + "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz", + "integrity": "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==", + "dev": true, + "dependencies": { + "@types/uuid": "8.3.4", + "uuid": "8.3.2" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true + }, + "@babel/core": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==" + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", + "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/reporters": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.1.3", + "jest-config": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-resolve-dependencies": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "jest-watcher": "^28.1.3", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + } + }, + "@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, + "requires": { + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + } + }, + "@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2" + } + }, + "@jest/fake-timers": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + } + }, + "@jest/globals": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" + } + }, + "@jest/reporters": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", + "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.13", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + } + }, + "@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "requires": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sinclair/typebox": { + "version": "0.24.27", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz", + "integrity": "sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", + "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "28.1.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.6.tgz", + "integrity": "sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==", + "dev": true, + "requires": { + "jest-matcher-utils": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "@types/node": { + "version": "18.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz", + "integrity": "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==", + "dev": true + }, + "@types/prettier": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", + "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", + "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@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==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", + "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/type-utils": "5.33.0", + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz", + "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", + "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", + "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz", + "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", + "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.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": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz", + "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", + "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.33.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "axios-mock-adapter": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz", + "integrity": "sha512-jzyNxU3JzB2XVhplZboUcF0YDs7xuExzoRSHXPHr+UQajaGmcTqvkkUADgkVI2WkGlpZ1zZlMVdcTMU0ejV8zQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + } + }, + "babel-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", + "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "dev": true, + "requires": { + "@jest/transform": "^28.1.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^28.1.3", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001375", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", + "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.4.215", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz", + "integrity": "sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg==", + "dev": true + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "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.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" + }, + "espree": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "requires": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==" + }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", + "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "dev": true, + "requires": { + "@jest/core": "^28.1.3", + "@jest/types": "^28.1.3", + "import-local": "^3.0.2", + "jest-cli": "^28.1.3" + } + }, + "jest-changed-files": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", + "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "p-limit": "^3.1.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-cli": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", + "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "dev": true, + "requires": { + "@jest/core": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", + "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.3", + "@jest/types": "^28.1.3", + "babel-jest": "^28.1.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.3", + "jest-environment-node": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.3", + "pretty-format": "^28.1.3" + } + }, + "jest-environment-node": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + } + }, + "jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true + }, + "jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-junit": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-14.0.0.tgz", + "integrity": "sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + } + }, + "jest-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true + }, + "jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", + "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "dev": true, + "requires": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.3" + } + }, + "jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/environment": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-leak-detector": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-resolve": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-util": "^28.1.3", + "jest-watcher": "^28.1.3", + "jest-worker": "^28.1.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + } + }, + "jest-runtime": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/globals": "^28.1.3", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.3", + "semver": "^7.3.5" + } + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.3" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "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" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "requires": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-jest": { + "version": "28.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz", + "integrity": "sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^28.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tslog": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tslog/-/tslog-3.3.3.tgz", + "integrity": "sha512-lGrkndwpAohZ9ntQpT+xtUw5k9YFV1DjsksiWQlBSf82TTqsSAWBARPRD9juI730r8o3Awpkjp2aXy9k+6vr+g==", + "requires": { + "source-map-support": "^0.5.21" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "uuidv4": { + "version": "6.2.13", + "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz", + "integrity": "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==", + "dev": true, + "requires": { + "@types/uuid": "8.3.4", + "uuid": "8.3.2" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==" + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + } + } +} diff --git a/nym-api/tests/package.json b/nym-api/tests/package.json index deb5ee46b1..b249270f71 100644 --- a/nym-api/tests/package.json +++ b/nym-api/tests/package.json @@ -7,7 +7,8 @@ "test": "test" }, "scripts": { - "test": "jest --forceExit --detectOpenHandles --passWithNoTests", + "test:qa": "TEST_ENV=qa jest --forceExit --detectOpenHandles --passWithNoTests", + "test:prod": "TEST_ENV=prod jest --forceExit --detectOpenHandles --passWithNoTests", "build": "tsc", "lint": "eslint --ext .js,.ts,.tsx .", "lint:fix": "eslint --fix", @@ -33,6 +34,7 @@ }, "devDependencies": { "@types/jest": "28.1.6", + "@types/mocha": "^10.0.1", "@typescript-eslint/eslint-plugin": "^5.12.1", "@typescript-eslint/parser": "^5.33.0", "axios-mock-adapter": "^1.20.0", diff --git a/nym-api/tests/src/config/config.yaml b/nym-api/tests/src/config/config.yaml index a2271032bf..8a0007600e 100644 --- a/nym-api/tests/src/config/config.yaml +++ b/nym-api/tests/src/config/config.yaml @@ -3,13 +3,14 @@ common: Accept: application/json Content-Type: application/json qa: - api_base_url: https://qa-validator-api.nymtech.net/api/v1 - mixnode_identity: DLdMKLPywEy1vnu3yPrtXvzY7fw1puiiHpA9n9UQatiQ - gateway_identity: CgQrYP8etksSBf4nALNqp93SHPpgFwEUyTsjBNNLj5WM - log_level: debug + api_base_url: https://qwerty-validator-api.qa.nymte.ch/api/v1 + mix_id: 7 + identity_key: 4Yr4qmEHd9sgsuQ83191FR2hD88RfsbMmB4tzhhZWriz + gateway_identity: 336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9 + log_level: error prod: - api_base_url: https://qa-validator-api.nymtech.net/api/v1 + api_base_url: https://validator.nymtech.net/api/v1 mixnode_identity: DLdMKLPywEy1vnu3yPrtXvzY7fw1puiiHpA9n9UQatiQ gateway_identity: CgQrYP8etksSBf4nALNqp93SHPpgFwEUyTsjBNNLj5WM - log_level: debug + log_level: error time_zone: utc diff --git a/nym-api/tests/src/config/configHandler.ts b/nym-api/tests/src/config/configHandler.ts index be37be979d..cd214061c5 100644 --- a/nym-api/tests/src/config/configHandler.ts +++ b/nym-api/tests/src/config/configHandler.ts @@ -16,13 +16,14 @@ class ConfigHandler { log_level: TLogLevelName; time_zone: string; api_base_url: string; - mixnode_identity: string; + mix_id: number; + identity_key: string; gateway_identity: string; }; private constructor() { this.setCommonConfig(); - this.setEnvironmentConfig(process.env.TEST_ENV || "prod"); + this.setEnvironmentConfig(process.env.TEST_ENV || "qa" || "prod" ); } public static getInstance(): ConfigHandler { diff --git a/nym-api/tests/src/endpoints/CirculatingSupply.ts b/nym-api/tests/src/endpoints/CirculatingSupply.ts new file mode 100644 index 0000000000..553a7172ab --- /dev/null +++ b/nym-api/tests/src/endpoints/CirculatingSupply.ts @@ -0,0 +1,17 @@ +import { + Detailed +} from "../types/CirculatingSupplyTypes"; +import { APIClient } from "./abstracts/APIClient"; + +export default class ContractCache extends APIClient { + constructor() { + super("/"); + } + + public async getCirculatingSupply(): Promise { + const response = await this.restClient.sendGet({ + route: `circulating-supply`, + }); + return response.data; + } + } diff --git a/nym-api/tests/src/endpoints/ContractCache.ts b/nym-api/tests/src/endpoints/ContractCache.ts new file mode 100644 index 0000000000..9e6cb95997 --- /dev/null +++ b/nym-api/tests/src/endpoints/ContractCache.ts @@ -0,0 +1,96 @@ +import { + MixnodesDetailed, + AllGateways, + AllMixnodes, + EpochRewardParams, + BlacklistedGateways, + BlacklistedMixnodes, + CurrentEpoch, + Mixnode +} from "../types/ContractCacheTypes"; +import { APIClient } from "./abstracts/APIClient"; + +export default class ContractCache extends APIClient { + constructor() { + super("/"); + } + + public async getMixnodes(): Promise { + const response = await this.restClient.sendGet({ + route: `mixnodes`, + }); + return response.data; + } + + public async getMixnodesDetailed(): Promise { + const response = await this.restClient.sendGet({ + route: `mixnodes/detailed`, + }); + + return response.data; + } + + public async getGateways(): Promise { + const response = await this.restClient.sendGet({ + route: `gateways`, + }); + return response.data; + } + + public async getActiveMixnodes(): Promise { + const response = await this.restClient.sendGet({ + route: `mixnodes/active`, + }); + return response.data; + } + + public async getActiveMixnodesDetailed(): Promise { + const response = await this.restClient.sendGet({ + route: `mixnodes/active/detailed`, + }); + return response.data; + } + + public async getRewardedMixnodes(): Promise { + const response = await this.restClient.sendGet({ + route: `mixnodes/rewarded`, + }); + return response.data; + } + + public async getRewardedMixnodesDetailed(): Promise { + const response = await this.restClient.sendGet({ + route: `mixnodes/rewarded/detailed`, + }); + return response.data; + } + + public async getBlacklistedMixnodes(): Promise { + const response = await this.restClient.sendGet({ + route: `mixnodes/blacklisted`, + }); + return response.data; + } + + public async getBlacklistedGateways(): Promise { + const response = await this.restClient.sendGet({ + route: `gateways/blacklisted`, + }); + return response.data; + } + + public async getEpochRewardParams(): Promise { + const response = await this.restClient.sendGet({ + route: `epoch/reward_params` + }); + return response.data; + } + + public async getCurrentEpoch(): Promise { + const response = await this.restClient.sendGet({ + route: `epoch/current` + }); + return response.data; + } + +} diff --git a/nym-api/tests/src/endpoints/Status.ts b/nym-api/tests/src/endpoints/Status.ts index 8c0576f524..1c10aae124 100644 --- a/nym-api/tests/src/endpoints/Status.ts +++ b/nym-api/tests/src/endpoints/Status.ts @@ -2,13 +2,17 @@ import { AxiosResponse } from "axios"; import { ActiveStatus, AvgUptime, + ComputeRewardEstimation, CoreCount, - EstimatedReward, + DetailedGateway, + DetailedMixnodes, + InclusionProbabilities, InclusionProbability, NodeHistory, Report, + RewardEstimation, StakeSaturation, -} from "../../src/interfaces/StatusInterfaces"; +} from "../types/StatusInterfaces"; import { APIClient } from "./abstracts/APIClient"; export default class Status extends APIClient { @@ -16,18 +20,14 @@ export default class Status extends APIClient { super("/status"); } - public async getMixnodeStatusReport(identity_key: string): Promise { + // GATEWAYS + + public async getDetailedGateways(): Promise { const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/report`, + route: `/gateways/detailed`, }); - return { - identity: response.data.identity, - owner: response.data.owner, - most_recent: response.data.most_recent, - last_hour: response.data.last_hour, - last_day: response.data.last_day, - }; + return response.data; } public async getGatewayStatusReport(identity_key: string): Promise { @@ -35,13 +35,7 @@ export default class Status extends APIClient { route: `/gateway/${identity_key}/report`, }); - return { - identity: response.data.identity, - owner: response.data.owner, - most_recent: response.data.most_recent, - last_hour: response.data.last_hour, - last_day: response.data.last_day, - }; + return response.data; } public async getGatewayHistory(identity_key: string): Promise { @@ -49,35 +43,7 @@ export default class Status extends APIClient { route: `/gateway/${identity_key}/history`, }); - return { - identity: response.data.identity, - owner: response.data.owner, - history: response.data.history, - }; - } - - public async getMixnodeStakeSaturation( - identity_key: string - ): Promise { - const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/stake-saturation`, - }); - - return { - as_at: response.data.as_at, - saturation: response.data.saturation, - }; - } - - public async getMixnodeCoreCount(identity_key: string): Promise { - const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/core-status-count`, - }); - - return { - identity: response.data.identity, - count: response.data.count, - }; + return response.data; } public async getGatewayCoreCount(identity_key: string): Promise { @@ -85,93 +51,134 @@ export default class Status extends APIClient { route: `/gateway/${identity_key}/core-status-count`, }); - return { - identity: response.data.identity, - count: response.data.count, - }; + return response.data; + } + + + // MIXNODES + + public async getMixnodeStatusReport(mix_id: number): Promise { + const response = await this.restClient.sendGet({ + route: `/mixnode/${mix_id}/report`, + }); + + return response.data; + } + + public async getMixnodeStakeSaturation( + mix_id: number + ): Promise { + const response = await this.restClient.sendGet({ + route: `/mixnode/${mix_id}/stake-saturation`, + }); + + return response.data; + } + + public async getMixnodeCoreCount(mix_id: number): Promise { + const response = await this.restClient.sendGet({ + route: `/mixnode/${mix_id}/core-status-count`, + }); + + return response.data; } public async getMixnodeRewardComputation( - identity_key: string - ): Promise { + mix_id: number + ): Promise { const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/reward-estimation`, + route: `/mixnode/${mix_id}/reward-estimation`, }); - return { - estimated_total_node_reward: response.data.estimated_total_node_reward, - estimated_operator_reward: response.data.estimated_operator_reward, - estimated_delegators_reward: response.data.estimated_delegators_reward, - estimated_node_profit: response.data.estimated_node_profit, - estimated_operator_cost: response.data.estimated_operator_cost, - reward_params: response.data.reward_params, - as_at: response.data.as_at, - }; + return response.data; } - public async getMixnodeRewardEstimatedComputation( - identity_key: string - ): Promise { + public async sendMixnodeRewardEstimatedComputation( + mix_id: number + ): Promise { const response = await this.restClient.sendPost({ - route: `/mixnode/${identity_key}/compute-reward-estimation`, + route: `/mixnode/${mix_id}/compute-reward-estimation`, + data: { + // performance: "10", + active_in_rewarded_set: true, + // pledge_amount: 10, + // total_delegation: 2000, + // interval_operating_cost: { + // denom: "unym", + // amount: "250000000" + // }, + // profit_margin_percent: 10 + } }); - return { - estimated_total_node_reward: response.data.estimated_total_node_reward, - estimated_operator_reward: response.data.estimated_operator_reward, - estimated_delegators_reward: response.data.estimated_delegators_reward, - estimated_node_profit: response.data.estimated_node_profit, - estimated_operator_cost: response.data.estimated_operator_cost, - reward_params: response.data.reward_params, - as_at: response.data.as_at, - }; + return response.data; } - public async getMixnodeHistory(identity_key: string): Promise { + public async getMixnodeHistory(mix_id: number): Promise { const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/history`, + route: `/mixnode/${mix_id}/history`, }); - return { - identity: response.data.identity, - owner: response.data.owner, - history: response.data.history, - }; + return response.data; } public async getMixnodeAverageUptime( - identity_key: string + mix_id: number ): Promise { const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/avg_uptime`, + route: `/mixnode/${mix_id}/avg_uptime`, }); - return { - identity: response.data.identity, - avg_uptime: response.data.avg_uptime, - }; + return response.data; } public async getMixnodeInclusionProbability( - identity_key: string + mix_id: number ): Promise { const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/inclusion-probability`, + route: `/mixnode/${mix_id}/inclusion-probability`, }); - return { - in_active: response.data.in_active, - in_reserve: response.data.in_reserve, - }; + return response.data; } - public async getMixnodeStatus(identity_key: string): Promise { + public async getMixnodeStatus(mix_id: number): Promise { const response = await this.restClient.sendGet({ - route: `/mixnode/${identity_key}/status`, + route: `/mixnode/${mix_id}/status`, }); - return { - status: response.data.status, - }; + return response.data; + } + + public async getAllMixnodeInclusionProbability(): Promise { + const response = await this.restClient.sendGet({ + route: `/mixnodes/inclusion-probability`, + }); + + return response.data; + } + + public async getDetailedMixnodes(): Promise { + const response = await this.restClient.sendGet({ + route: `/mixnodes/detailed`, + }); + + return response.data; + } + + public async getDetailedRewardedMixnodes(): Promise { + const response = await this.restClient.sendGet({ + route: `/mixnodes/rewarded/detailed`, + }); + + return response.data; + } + + public async getDetailedActiveMixnodes(): Promise { + const response = await this.restClient.sendGet({ + route: `/mixnodes/active/detailed`, + }); + + return response.data; } } diff --git a/nym-api/tests/src/interfaces/StatusInterfaces.ts b/nym-api/tests/src/interfaces/StatusInterfaces.ts deleted file mode 100644 index d6a7d91498..0000000000 --- a/nym-api/tests/src/interfaces/StatusInterfaces.ts +++ /dev/null @@ -1,72 +0,0 @@ -export type Epoch = { - epoch_reward_pool: string; - rewarded_set_size: string; - active_set_size: string; - staking_supply: string; - sybil_resistance_percent: number; - active_set_work_factor: number; -}; - -export type Node = { - reward_blockstamp: number; - uptime: string; - in_active_set: boolean; -}; - -export type RewardParams = { - epoch: Epoch; - node: Node; -}; - -export type EstimatedReward = { - estimated_total_node_reward: number; - estimated_operator_reward: number; - estimated_delegators_reward: number; - estimated_node_profit: number; - estimated_operator_cost: number; - reward_params: RewardParams; - as_at: number; -}; - -export type StakeSaturation = { - saturation: number; - as_at: number; -}; - -export type AvgUptime = { - identity: string; - avg_uptime: number; -}; - -export type InclusionProbability = { - in_active: string; - in_reserve: string; -}; - -export type Report = { - identity: string; - owner: string; - most_recent: number; - last_hour: number; - last_day: number; -}; - -export type History = { - date: string; - uptime: number; -}; - -export type NodeHistory = { - identity: string; - owner: string; - history: History[]; -}; - -export type CoreCount = { - identity: string; - count: number; -}; - -export type ActiveStatus = { - status: string; -}; diff --git a/nym-api/tests/src/types/CirculatingSupplyTypes.ts b/nym-api/tests/src/types/CirculatingSupplyTypes.ts new file mode 100644 index 0000000000..c637b53d21 --- /dev/null +++ b/nym-api/tests/src/types/CirculatingSupplyTypes.ts @@ -0,0 +1,26 @@ +export type Detailed = { + initial_supply: InitialSupply; + mixmining_reserve: MixminingReserve; + vesting_tokens: VestingTokens; + circulating_supply: CirculatingSupply; + }; + + export type InitialSupply = { + demon: "unym"; + amount: string; + }; + + export type MixminingReserve = { + demon: "unym"; + amount: string; + }; + + export type VestingTokens = { + demon: "unym"; + amount: string; + }; + + export type CirculatingSupply = { + demon: "unym"; + amount: string; + }; \ No newline at end of file diff --git a/nym-api/tests/src/types/ContractCacheTypes.ts b/nym-api/tests/src/types/ContractCacheTypes.ts new file mode 100644 index 0000000000..771faa702b --- /dev/null +++ b/nym-api/tests/src/types/ContractCacheTypes.ts @@ -0,0 +1,132 @@ +export type AllMixnodes = { + bond_information: BondInformation; + rewarding_details: RewardingDetails; +}; + +export type BondInformation = { + mix_id: number; + owner: string; + original_pledge: OriginalPledge; + layer: number; + mix_node: Mixnode; + proxy: string; + bonding_height: number; + is_unbonding: boolean; +} + +export type RewardingDetails = { + cost_params: CostParams; + operator: string; + delegates: string; + total_unit_reward: string; + unit_delegation: string; + last_rewarded_epoch: number; + unique_delegations: number; +} + +export type CostParams = { + profit_margin_percent: string; + interval_operating_cost: IntervalOperatingCost; +} + +export type IntervalOperatingCost = { + denom: string; + amount: string; +} + +export type OriginalPledge = { + denom: string; + amount: string; +} + +export type TotalDelegation = { + denom: string; + amount: string; +}; + +export type Mixnode = { + host: string; + mix_port: number; + verloc_port: number; + http_api_port: number; + sphinx_key: string; + identity_key: string; + version: string; +}; + +export type MixnodeBond = { + pledge_amount: OriginalPledge; + total_delegation: TotalDelegation; + owner: string; + layer: string; + block_height: string; + mix_node: Mixnode; + proxy: string; + accumulated_rewards: string; +} + +export type MixnodesDetailed = { + mixnode_details: AllMixnodes; + stake_saturation: string; + uncapped_stake_saturation: string; + performance: string; + estimated_operator_apy: string + estimated_delegators_apy: string; + family: string +}; + +export type BlacklistedMixnodes = { +}; + +export type BlacklistedGateways = { +}; + +export interface Gateway { + host: string; + mix_port: number; + clients_port: number; + location: string; + sphinx_key: string; + identity_key: string; + version: string; +} + +export interface AllGateways { + pledge_amount: OriginalPledge; + owner: string; + block_height: number; + gateway: Gateway; + proxy: string; +} + +export type EpochRewardParams = { + interval: Interval; + rewarded_set_size: number; + active_set_size: number; +}; + +export type Interval = { + reward_pool: string; + staking_supply: string; + staking_supply_scale_factor: string; + epoch_reward_budget: string; + stake_saturation_point: string; + sybil_resistance: string; + active_set_work_factor: string; + interval_pool_emission: string; +} + +export type CurrentEpoch = { + id: number; + epochs_in_interval: number; + current_epoch_start: string; + current_epoch_id: number; + epoch_length: EpochLength; + total_elapsed_epochs: number; +}; + +export type EpochLength = { + secs: number; + nanos: number; +}; + diff --git a/nym-api/tests/src/types/StatusInterfaces.ts b/nym-api/tests/src/types/StatusInterfaces.ts new file mode 100644 index 0000000000..03b797db56 --- /dev/null +++ b/nym-api/tests/src/types/StatusInterfaces.ts @@ -0,0 +1,231 @@ +export interface CurrentEpoch { + epoch_reward_pool: string; + rewarded_set_size: string; + active_set_size: string; + staking_supply: string; + sybil_resistance_percent: number; + active_set_work_factor: number; +} + + +export interface Epoch { + id: number; + epochs_in_interval: number; + current_epoch_start: string; + current_epoch_id: number; + epoch_length: EpochLength; + total_elapsed_epochs: number; +} + +export interface EpochLength { + secs: number; + nanos: number; +} + +export interface Node { + reward_blockstamp: number; + uptime: string; + in_active_set: boolean; +} + +export interface RewardEstimation { + estimation: Estimation; + reward_params: RewardParams; + epoch: Epoch; + as_at: number; +} + +export interface Estimation { + total_node_reward: string; + operator: string; + delegates: string; + operating_cost: string; +} + +export interface RewardParams { + interval: Interval; + rewarded_set_size: number; + active_set_size: number; +} + +export interface ComputeRewardEstimation { + performance: string, + active_in_rewarded_set: boolean, + pledge_amount: number, + total_delegation: number, + interval_operating_cost: IntervalOperatingCost; + profit_margin_percent: string +} + +export interface IntervalOperatingCost { + denom: string, + amount: string +} + +export interface Interval { + reward_pool: string; + staking_supply: string; + staking_supply_scale_factor: string; + epoch_reward_budget: string; + stake_saturation_point: string; + sybil_resistance: string; + active_set_work_factor: string; + interval_pool_emission: string; +} + +export interface StakeSaturation { + saturation: string; + uncapped_saturation: string; + as_at: number; +} + +export interface AvgUptime { + mix_id: number; + avg_uptime: number; +} + +export interface SingleInclusionProbability { + in_active: number; + in_reserve: number; +} + +export interface InclusionProbability { + mix_id: number; + in_active: string; + in_reserve: string; +} + +export interface InclusionProbabilities { + inclusion_probabilities: InclusionProbability[]; + samples: number; + elapsed: Elapsed; + delta_max: number; + delta_l2: number; + as_at: number; +} + +export interface Elapsed { + secs: number; + nanos: number; +} + +export interface Report { + mix_id: number; + identity: string; + owner: string; + most_recent: number; + last_hour: number; + last_day: number; +} + +export interface History { + date: string; + uptime: number; +} + +export interface NodeHistory { + mix_id: number, + identity: string; + owner: string; + history: History[]; +} + +export interface CoreCount { + mix_id: number, + identity: string; + count: number; +} + +export interface ActiveStatus { + status: string; +} + + +export interface PledgeAmount { + denom: string; + amount: string; +} + +export interface Gateway { + host: string; + mix_port: number; + clients_port: number; + location: string; + sphinx_key: string; + identity_key: string; + version: string; +} + +export interface GatewayBond { + pledge_amount: PledgeAmount; + owner: string; + block_height: number; + gateway: Gateway; + proxy?: any; +} + +export interface DetailedGateway { + gateway_bond: GatewayBond; + performance: string; +} + +export interface OriginalPledge { + denom: string; + amount: string; +} + +export interface MixNode { + host: string; + mix_port: number; + verloc_port: number; + http_api_port: number; + sphinx_key: string; + identity_key: string; + version: string; +} + +export interface BondInformation { + mix_id: number; + owner: string; + original_pledge: OriginalPledge; + layer: string; + mix_node: MixNode; + proxy: string; + bonding_height: number; + is_unbonding: boolean; +} + +export interface IntervalOperatingCost { + denom: string; + amount: string; +} + +export interface CostParams { + profit_margin_percent: string; + interval_operating_cost: IntervalOperatingCost; +} + +export interface RewardingDetails { + cost_params: CostParams; + operator: string; + delegates: string; + total_unit_reward: string; + unit_delegation: string; + last_rewarded_epoch: number; + unique_delegations: number; +} + +export interface MixnodeDetails { + bond_information: BondInformation; + rewarding_details: RewardingDetails; +} + +export interface DetailedMixnodes { + mixnode_details: MixnodeDetails; + stake_saturation: string; + uncapped_stake_saturation: string; + performance: string; + estimated_operator_apy: string; + estimated_delegators_apy: string; + family: string; +} \ No newline at end of file diff --git a/nym-api/tests/tsconfig.json b/nym-api/tests/tsconfig.json index c25d4218fa..60fd578d9a 100644 --- a/nym-api/tests/tsconfig.json +++ b/nym-api/tests/tsconfig.json @@ -20,6 +20,6 @@ "typeRoots": ["node_modules/@types"], "alwaysStrict": true }, - "include": ["src/**/*", "functional_test/**/*"], + "include": ["src/**/*", "tests/functional_test/*/*"], "exclude": ["unit_test/**/*"] } diff --git a/nym-api/tests/yarn.lock b/nym-api/tests/yarn.lock index 5cd1da22a1..57b3910ded 100644 --- a/nym-api/tests/yarn.lock +++ b/nym-api/tests/yarn.lock @@ -3,29 +3,29 @@ "@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + "integrity" "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==" + "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + "version" "2.2.0" dependencies: "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + "integrity" "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==" + "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== + "integrity" "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" + "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz" + "version" "7.18.8" -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" - integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + "integrity" "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==" + "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" + "version" "7.18.10" dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" @@ -37,62 +37,62 @@ "@babel/template" "^7.18.10" "@babel/traverse" "^7.18.10" "@babel/types" "^7.18.10" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + "convert-source-map" "^1.7.0" + "debug" "^4.1.0" + "gensync" "^1.0.0-beta.2" + "json5" "^2.2.1" + "semver" "^6.3.0" "@babel/generator@^7.18.10", "@babel/generator@^7.7.2": - version "7.18.12" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" - integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== + "integrity" "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==" + "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" + "version" "7.18.12" dependencies: "@babel/types" "^7.18.10" "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" + "jsesc" "^2.5.1" "@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + "integrity" "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==" + "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/compat-data" "^7.18.8" "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" + "browserslist" "^4.20.2" + "semver" "^6.3.0" "@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "integrity" "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + "version" "7.18.9" "@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + "integrity" "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==" + "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/template" "^7.18.6" "@babel/types" "^7.18.9" "@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + "integrity" "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==" + "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + "integrity" "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==" + "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + "integrity" "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==" + "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -104,166 +104,166 @@ "@babel/types" "^7.18.9" "@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.8.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + "integrity" "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" + "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" + "version" "7.18.9" "@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + "integrity" "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==" + "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + "integrity" "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==" + "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + "integrity" "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" + "version" "7.18.10" "@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + "integrity" "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" + "version" "7.18.6" "@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "integrity" "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + "version" "7.18.6" "@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + "integrity" "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==" + "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" + "version" "7.18.9" dependencies: "@babel/template" "^7.18.6" "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + "integrity" "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==" + "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" + "chalk" "^2.0.0" + "js-tokens" "^4.0.0" "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11": - version "7.18.11" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz" - integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== + "integrity" "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==" + "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz" + "version" "7.18.11" "@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + "version" "7.8.4" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + "integrity" "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + "version" "7.12.13" dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + "integrity" "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + "version" "7.10.4" dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + "version" "7.8.3" dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + "version" "7.14.5" dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + "integrity" "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==" + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" + "version" "7.18.6" dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + "integrity" "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==" + "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" + "version" "7.18.10" dependencies: "@babel/code-frame" "^7.18.6" "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": - version "7.18.11" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz" - integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== + "integrity" "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==" + "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz" + "version" "7.18.11" dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.18.10" @@ -273,89 +273,89 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/parser" "^7.18.11" "@babel/types" "^7.18.10" - debug "^4.1.0" - globals "^11.1.0" + "debug" "^4.1.0" + "globals" "^11.1.0" "@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz" - integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== + "integrity" "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==" + "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz" + "version" "7.18.10" dependencies: "@babel/helper-string-parser" "^7.18.10" "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" + "to-fast-properties" "^2.0.0" "@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "integrity" "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + "resolved" "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + "version" "0.2.3" "@eslint/eslintrc@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" - integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + "integrity" "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==" + "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz" + "version" "1.3.0" dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.3.2" - globals "^13.15.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" + "ajv" "^6.12.4" + "debug" "^4.3.2" + "espree" "^9.3.2" + "globals" "^13.15.0" + "ignore" "^5.2.0" + "import-fresh" "^3.2.1" + "js-yaml" "^4.1.0" + "minimatch" "^3.1.2" + "strip-json-comments" "^3.1.1" "@humanwhocodes/config-array@^0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" - integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== + "integrity" "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz" + "version" "0.10.4" dependencies: "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.4" + "debug" "^4.1.1" + "minimatch" "^3.0.4" "@humanwhocodes/gitignore-to-minimatch@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" - integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + "integrity" "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz" + "version" "1.0.2" "@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "integrity" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + "version" "1.2.1" "@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + "integrity" "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==" + "resolved" "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + "version" "1.1.0" dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" + "camelcase" "^5.3.1" + "find-up" "^4.1.0" + "get-package-type" "^0.1.0" + "js-yaml" "^3.13.1" + "resolve-from" "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + "integrity" "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + "resolved" "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + "version" "0.1.3" "@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + "integrity" "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==" + "resolved" "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" + "chalk" "^4.0.0" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" + "slash" "^3.0.0" "@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + "integrity" "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==" + "resolved" "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/console" "^28.1.3" "@jest/reporters" "^28.1.3" @@ -363,80 +363,80 @@ "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" - micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" + "ansi-escapes" "^4.2.1" + "chalk" "^4.0.0" + "ci-info" "^3.2.0" + "exit" "^0.1.2" + "graceful-fs" "^4.2.9" + "jest-changed-files" "^28.1.3" + "jest-config" "^28.1.3" + "jest-haste-map" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-regex-util" "^28.0.2" + "jest-resolve" "^28.1.3" + "jest-resolve-dependencies" "^28.1.3" + "jest-runner" "^28.1.3" + "jest-runtime" "^28.1.3" + "jest-snapshot" "^28.1.3" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "jest-watcher" "^28.1.3" + "micromatch" "^4.0.4" + "pretty-format" "^28.1.3" + "rimraf" "^3.0.0" + "slash" "^3.0.0" + "strip-ansi" "^6.0.0" "@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + "integrity" "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==" + "resolved" "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/fake-timers" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^28.1.3" + "jest-mock" "^28.1.3" "@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + "integrity" "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==" + "resolved" "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" + "version" "28.1.3" dependencies: - jest-get-type "^28.0.2" + "jest-get-type" "^28.0.2" "@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + "integrity" "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==" + "resolved" "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" + "version" "28.1.3" dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" + "expect" "^28.1.3" + "jest-snapshot" "^28.1.3" "@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + "integrity" "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==" + "resolved" "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-mock" "^28.1.3" + "jest-util" "^28.1.3" "@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + "integrity" "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==" + "resolved" "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/expect" "^28.1.3" "@jest/types" "^28.1.3" "@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== + "integrity" "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==" + "resolved" "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" + "version" "28.1.3" dependencies: "@bcoe/v8-coverage" "^0.2.3" "@jest/console" "^28.1.3" @@ -445,178 +445,178 @@ "@jest/types" "^28.1.3" "@jridgewell/trace-mapping" "^0.3.13" "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - terminal-link "^2.0.0" - v8-to-istanbul "^9.0.1" + "chalk" "^4.0.0" + "collect-v8-coverage" "^1.0.0" + "exit" "^0.1.2" + "glob" "^7.1.3" + "graceful-fs" "^4.2.9" + "istanbul-lib-coverage" "^3.0.0" + "istanbul-lib-instrument" "^5.1.0" + "istanbul-lib-report" "^3.0.0" + "istanbul-lib-source-maps" "^4.0.0" + "istanbul-reports" "^3.1.3" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" + "jest-worker" "^28.1.3" + "slash" "^3.0.0" + "string-length" "^4.0.1" + "strip-ansi" "^6.0.0" + "terminal-link" "^2.0.0" + "v8-to-istanbul" "^9.0.1" "@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + "integrity" "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==" + "resolved" "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" + "version" "28.1.3" dependencies: "@sinclair/typebox" "^0.24.1" "@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + "integrity" "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==" + "resolved" "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" + "version" "28.1.2" dependencies: "@jridgewell/trace-mapping" "^0.3.13" - callsites "^3.0.0" - graceful-fs "^4.2.9" + "callsites" "^3.0.0" + "graceful-fs" "^4.2.9" "@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + "integrity" "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==" + "resolved" "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/console" "^28.1.3" "@jest/types" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" + "collect-v8-coverage" "^1.0.0" "@jest/test-sequencer@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + "integrity" "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==" + "resolved" "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/test-result" "^28.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - slash "^3.0.0" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "slash" "^3.0.0" "@jest/transform@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" - integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + "integrity" "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==" + "resolved" "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/core" "^7.11.6" "@jest/types" "^28.1.3" "@jridgewell/trace-mapping" "^0.3.13" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.1" + "babel-plugin-istanbul" "^6.1.1" + "chalk" "^4.0.0" + "convert-source-map" "^1.4.0" + "fast-json-stable-stringify" "^2.0.0" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "jest-regex-util" "^28.0.2" + "jest-util" "^28.1.3" + "micromatch" "^4.0.4" + "pirates" "^4.0.4" + "slash" "^3.0.0" + "write-file-atomic" "^4.0.1" -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== +"@jest/types@^28.0.0", "@jest/types@^28.1.3": + "integrity" "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==" + "resolved" "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" - chalk "^4.0.0" + "chalk" "^4.0.0" "@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + "integrity" "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==" + "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + "version" "0.1.1" dependencies: "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + "integrity" "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==" + "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + "version" "0.3.2" dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@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== + "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + "version" "3.1.0" "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + "version" "1.1.2" "@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== + "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + "version" "1.4.14" "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + "integrity" "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==" + "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" + "version" "0.3.14" dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" "@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + "version" "2.1.5" dependencies: "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" + "run-parallel" "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + "version" "2.0.5" "@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + "version" "1.2.8" dependencies: "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + "fastq" "^1.6.0" "@sinclair/typebox@^0.24.1": - version "0.24.27" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz" - integrity sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg== + "integrity" "sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==" + "resolved" "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz" + "version" "0.24.27" "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + "integrity" "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==" + "resolved" "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + "version" "1.8.3" dependencies: - type-detect "4.0.8" + "type-detect" "4.0.8" "@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + "integrity" "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==" + "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" + "version" "9.1.2" dependencies: "@sinonjs/commons" "^1.7.0" "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + "integrity" "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==" + "resolved" "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" + "version" "7.1.19" dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -625,313 +625,318 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + "integrity" "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==" + "resolved" "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + "version" "7.6.4" dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + "integrity" "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==" + "resolved" "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + "version" "7.4.1" dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.0" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz" - integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== + "integrity" "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==" + "resolved" "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz" + "version" "7.18.0" dependencies: "@babel/types" "^7.3.0" "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + "integrity" "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==" + "resolved" "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + "version" "4.1.5" dependencies: "@types/node" "*" "@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.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + "integrity" "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "resolved" "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + "version" "2.0.4" "@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== + "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==" + "resolved" "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + "version" "3.0.0" 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== + "integrity" "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==" + "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + "version" "3.0.1" dependencies: "@types/istanbul-lib-report" "*" "@types/jest@28.1.6": - version "28.1.6" - resolved "https://registry.npmjs.org/@types/jest/-/jest-28.1.6.tgz" - integrity sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ== + "integrity" "sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==" + "resolved" "https://registry.npmjs.org/@types/jest/-/jest-28.1.6.tgz" + "version" "28.1.6" dependencies: - jest-matcher-utils "^28.0.0" - pretty-format "^28.0.0" + "jest-matcher-utils" "^28.0.0" + "pretty-format" "^28.0.0" "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + "integrity" "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + "version" "7.0.11" + +"@types/mocha@^10.0.1": + "integrity" "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==" + "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz" + "version" "10.0.1" "@types/node@*": - version "18.7.1" - resolved "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz" - integrity sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ== + "integrity" "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz" + "version" "18.7.1" "@types/prettier@^2.1.5": - version "2.7.0" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz" - integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== + "integrity" "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==" + "resolved" "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz" + "version" "2.7.0" "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + "integrity" "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + "resolved" "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + "version" "2.0.1" "@types/uuid@8.3.4": - version "8.3.4" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "integrity" "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + "resolved" "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + "version" "8.3.4" "@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== + "integrity" "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + "resolved" "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + "version" "21.0.0" "@types/yargs@^17.0.8": - version "17.0.11" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz" - integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== + "integrity" "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==" + "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz" + "version" "17.0.11" dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.12.1": - version "5.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz" - integrity sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg== + "integrity" "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz" + "version" "5.33.0" dependencies: "@typescript-eslint/scope-manager" "5.33.0" "@typescript-eslint/type-utils" "5.33.0" "@typescript-eslint/utils" "5.33.0" - debug "^4.3.4" - functional-red-black-tree "^1.0.1" - ignore "^5.2.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" + "debug" "^4.3.4" + "functional-red-black-tree" "^1.0.1" + "ignore" "^5.2.0" + "regexpp" "^3.2.0" + "semver" "^7.3.7" + "tsutils" "^3.21.0" -"@typescript-eslint/parser@^5.33.0": - version "5.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.33.0.tgz#26ec3235b74f0667414613727cb98f9b69dc5383" - integrity sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w== +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.33.0": + "integrity" "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz" + "version" "5.33.0" dependencies: "@typescript-eslint/scope-manager" "5.33.0" "@typescript-eslint/types" "5.33.0" "@typescript-eslint/typescript-estree" "5.33.0" - debug "^4.3.4" + "debug" "^4.3.4" "@typescript-eslint/scope-manager@5.33.0": - version "5.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz" - integrity sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw== + "integrity" "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz" + "version" "5.33.0" dependencies: "@typescript-eslint/types" "5.33.0" "@typescript-eslint/visitor-keys" "5.33.0" "@typescript-eslint/type-utils@5.33.0": - version "5.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz" - integrity sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA== + "integrity" "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz" + "version" "5.33.0" dependencies: "@typescript-eslint/utils" "5.33.0" - debug "^4.3.4" - tsutils "^3.21.0" + "debug" "^4.3.4" + "tsutils" "^3.21.0" "@typescript-eslint/types@5.33.0": - version "5.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz" - integrity sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw== + "integrity" "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz" + "version" "5.33.0" "@typescript-eslint/typescript-estree@5.33.0": - version "5.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz" - integrity sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ== + "integrity" "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz" + "version" "5.33.0" dependencies: "@typescript-eslint/types" "5.33.0" "@typescript-eslint/visitor-keys" "5.33.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.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.33.0": - version "5.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz" - integrity sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw== + "integrity" "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz" + "version" "5.33.0" dependencies: "@types/json-schema" "^7.0.9" "@typescript-eslint/scope-manager" "5.33.0" "@typescript-eslint/types" "5.33.0" "@typescript-eslint/typescript-estree" "5.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "eslint-scope" "^5.1.1" + "eslint-utils" "^3.0.0" "@typescript-eslint/visitor-keys@5.33.0": - version "5.33.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz" - integrity sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw== + "integrity" "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==" + "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz" + "version" "5.33.0" dependencies: "@typescript-eslint/types" "5.33.0" - eslint-visitor-keys "^3.3.0" + "eslint-visitor-keys" "^3.3.0" -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +"acorn-jsx@^5.3.2": + "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + "version" "5.3.2" -acorn@^8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.8.0": + "integrity" "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" + "version" "8.8.0" -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +"ajv@^6.10.0", "ajv@^6.12.4": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + "fast-deep-equal" "^3.1.1" + "fast-json-stable-stringify" "^2.0.0" + "json-schema-traverse" "^0.4.1" + "uri-js" "^4.2.2" -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== +"ansi-escapes@^4.2.1": + "integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==" + "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + "version" "4.3.2" dependencies: - type-fest "^0.21.3" + "type-fest" "^0.21.3" -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" dependencies: - color-convert "^1.9.0" + "color-convert" "^1.9.0" -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== +"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" dependencies: - color-convert "^2.0.1" + "color-convert" "^2.0.1" -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +"ansi-styles@^5.0.0": + "integrity" "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + "version" "5.2.0" -anymatch@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +"anymatch@^3.0.3": + "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + "version" "3.1.2" dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== +"argparse@^1.0.7": + "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + "version" "1.0.10" dependencies: - sprintf-js "~1.0.2" + "sprintf-js" "~1.0.2" -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +"argparse@^2.0.1": + "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + "version" "2.0.1" -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +"array-union@^2.1.0": + "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + "version" "2.1.0" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +"asynckit@^0.4.0": + "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + "version" "0.4.0" -axios-mock-adapter@^1.20.0: - version "1.21.2" - resolved "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz" - integrity sha512-jzyNxU3JzB2XVhplZboUcF0YDs7xuExzoRSHXPHr+UQajaGmcTqvkkUADgkVI2WkGlpZ1zZlMVdcTMU0ejV8zQ== +"axios-mock-adapter@^1.20.0": + "integrity" "sha512-jzyNxU3JzB2XVhplZboUcF0YDs7xuExzoRSHXPHr+UQajaGmcTqvkkUADgkVI2WkGlpZ1zZlMVdcTMU0ejV8zQ==" + "resolved" "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz" + "version" "1.21.2" dependencies: - fast-deep-equal "^3.1.3" - is-buffer "^2.0.5" + "fast-deep-equal" "^3.1.3" + "is-buffer" "^2.0.5" -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== +"axios@^0.27.2", "axios@>= 0.17.0": + "integrity" "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==" + "resolved" "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" + "version" "0.27.2" dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" + "follow-redirects" "^1.14.9" + "form-data" "^4.0.0" -babel-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" - integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== +"babel-jest@^28.0.0", "babel-jest@^28.1.3": + "integrity" "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==" + "resolved" "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/transform" "^28.1.3" "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" + "babel-plugin-istanbul" "^6.1.1" + "babel-preset-jest" "^28.1.3" + "chalk" "^4.0.0" + "graceful-fs" "^4.2.9" + "slash" "^3.0.0" -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== +"babel-plugin-istanbul@^6.1.1": + "integrity" "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==" + "resolved" "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + "version" "6.1.1" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" + "istanbul-lib-instrument" "^5.0.4" + "test-exclude" "^6.0.0" -babel-plugin-jest-hoist@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" - integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== +"babel-plugin-jest-hoist@^28.1.3": + "integrity" "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==" + "resolved" "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== +"babel-preset-current-node-syntax@^1.0.0": + "integrity" "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==" + "resolved" "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + "version" "1.0.1" dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -946,1038 +951,1051 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" - integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== +"babel-preset-jest@^28.1.3": + "integrity" "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==" + "resolved" "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" + "version" "28.1.3" dependencies: - babel-plugin-jest-hoist "^28.1.3" - babel-preset-current-node-syntax "^1.0.0" + "babel-plugin-jest-hoist" "^28.1.3" + "babel-preset-current-node-syntax" "^1.0.0" -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== +"balanced-match@^1.0.0": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" -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== +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +"braces@^3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" dependencies: - fill-range "^7.0.1" + "fill-range" "^7.0.1" -browserslist@^4.20.2: - version "4.21.3" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" - integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== +"browserslist@^4.20.2", "browserslist@>= 4.21.0": + "integrity" "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==" + "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" + "version" "4.21.3" dependencies: - caniuse-lite "^1.0.30001370" - electron-to-chromium "^1.4.202" - node-releases "^2.0.6" - update-browserslist-db "^1.0.5" + "caniuse-lite" "^1.0.30001370" + "electron-to-chromium" "^1.4.202" + "node-releases" "^2.0.6" + "update-browserslist-db" "^1.0.5" -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== +"bs-logger@0.x": + "integrity" "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==" + "resolved" "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + "version" "0.2.6" dependencies: - fast-json-stable-stringify "2.x" + "fast-json-stable-stringify" "2.x" -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== +"bser@2.1.1": + "integrity" "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==" + "resolved" "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + "version" "2.1.1" dependencies: - node-int64 "^0.4.0" + "node-int64" "^0.4.0" -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +"buffer-from@^1.0.0": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +"callsites@^3.0.0": + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +"camelcase@^5.3.1": + "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + "version" "5.3.1" -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +"camelcase@^6.2.0": + "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + "version" "6.3.0" -caniuse-lite@^1.0.30001370: - version "1.0.30001375" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz" - integrity sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw== +"caniuse-lite@^1.0.30001370": + "integrity" "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==" + "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz" + "version" "1.0.30001375" -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +"chalk@^2.0.0": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" -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== +"chalk@^4.0.0": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +"char-regex@^1.0.2": + "integrity" "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + "resolved" "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + "version" "1.0.2" -ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== +"ci-info@^3.2.0": + "integrity" "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==" + "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz" + "version" "3.3.2" -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +"cjs-module-lexer@^1.0.0": + "integrity" "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + "resolved" "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + "version" "1.2.2" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== +"cliui@^7.0.2": + "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" + "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + "version" "7.0.4" dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" + "string-width" "^4.2.0" + "strip-ansi" "^6.0.0" + "wrap-ansi" "^7.0.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== +"co@^4.6.0": + "integrity" "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + "version" "4.6.0" -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== +"collect-v8-coverage@^1.0.0": + "integrity" "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + "resolved" "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + "version" "1.0.1" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" dependencies: - color-name "1.1.3" + "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== +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" dependencies: - color-name "~1.1.4" + "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.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" -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-name@1.1.3": + "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== +"combined-stream@^1.0.8": + "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + "version" "1.0.8" dependencies: - delayed-stream "~1.0.0" + "delayed-stream" "~1.0.0" -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== +"concat-map@0.0.1": + "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== +"convert-source-map@^1.4.0", "convert-source-map@^1.6.0", "convert-source-map@^1.7.0": + "integrity" "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==" + "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + "version" "1.8.0" dependencies: - safe-buffer "~5.1.1" + "safe-buffer" "~5.1.1" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +"cross-spawn@^7.0.2", "cross-spawn@^7.0.3": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +"debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" dependencies: - ms "2.1.2" + "ms" "2.1.2" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +"dedent@^0.7.0": + "integrity" "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + "resolved" "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + "version" "0.7.0" -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +"deep-is@^0.1.3": + "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + "version" "0.1.4" -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +"deepmerge@^4.2.2": + "integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + "version" "4.2.2" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +"delayed-stream@~1.0.0": + "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "version" "1.0.0" -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +"detect-newline@^3.0.0": + "integrity" "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + "resolved" "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + "version" "3.1.0" -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +"diff-sequences@^28.1.1": + "integrity" "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" + "resolved" "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" + "version" "28.1.1" -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== +"dir-glob@^3.0.1": + "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + "version" "3.0.1" dependencies: - path-type "^4.0.0" + "path-type" "^4.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== +"doctrine@^3.0.0": + "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + "version" "3.0.0" dependencies: - esutils "^2.0.2" + "esutils" "^2.0.2" -electron-to-chromium@^1.4.202: - version "1.4.215" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz" - integrity sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg== +"electron-to-chromium@^1.4.202": + "integrity" "sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg==" + "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz" + "version" "1.4.215" -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +"emittery@^0.10.2": + "integrity" "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" + "resolved" "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" + "version" "0.10.2" -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== +"error-ex@^1.3.1": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" dependencies: - is-arrayish "^0.2.1" + "is-arrayish" "^0.2.1" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +"escape-string-regexp@^1.0.5": + "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +"escape-string-regexp@^2.0.0": + "integrity" "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + "version" "2.0.0" -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +"escape-string-regexp@^4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" -eslint-config-prettier@^8.4.0: - version "8.5.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +"eslint-config-prettier@^8.4.0": + "integrity" "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==" + "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" + "version" "8.5.0" -eslint-plugin-prettier@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== +"eslint-plugin-prettier@^4.0.0": + "integrity" "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==" + "resolved" "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + "version" "4.2.1" dependencies: - prettier-linter-helpers "^1.0.0" + "prettier-linter-helpers" "^1.0.0" -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== +"eslint-scope@^5.1.1": + "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + "version" "5.1.1" dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" + "esrecurse" "^4.3.0" + "estraverse" "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +"eslint-scope@^7.1.1": + "integrity" "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + "version" "7.1.1" dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" + "esrecurse" "^4.3.0" + "estraverse" "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== +"eslint-utils@^3.0.0": + "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" + "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + "version" "3.0.0" dependencies: - eslint-visitor-keys "^2.0.0" + "eslint-visitor-keys" "^2.0.0" -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +"eslint-visitor-keys@^2.0.0": + "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + "version" "2.1.0" -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +"eslint-visitor-keys@^3.3.0": + "integrity" "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + "version" "3.3.0" -eslint@^8.21.0: - version "8.21.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.21.0.tgz#1940a68d7e0573cef6f50037addee295ff9be9ef" - integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== +"eslint@*", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^8.21.0", "eslint@>=5", "eslint@>=7.0.0", "eslint@>=7.28.0": + "integrity" "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==" + "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz" + "version" "8.21.0" dependencies: "@eslint/eslintrc" "^1.3.0" "@humanwhocodes/config-array" "^0.10.4" "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" - ajv "^6.10.0" - 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.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.3.3" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - functional-red-black-tree "^1.0.1" - glob-parent "^6.0.1" - globals "^13.15.0" - globby "^11.1.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" + "ajv" "^6.10.0" + "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.1.1" + "eslint-utils" "^3.0.0" + "eslint-visitor-keys" "^3.3.0" + "espree" "^9.3.3" + "esquery" "^1.4.0" + "esutils" "^2.0.2" + "fast-deep-equal" "^3.1.3" + "file-entry-cache" "^6.0.1" + "find-up" "^5.0.0" + "functional-red-black-tree" "^1.0.1" + "glob-parent" "^6.0.1" + "globals" "^13.15.0" + "globby" "^11.1.0" + "grapheme-splitter" "^1.0.4" + "ignore" "^5.2.0" + "import-fresh" "^3.0.0" + "imurmurhash" "^0.1.4" + "is-glob" "^4.0.0" + "js-yaml" "^4.1.0" + "json-stable-stringify-without-jsonify" "^1.0.1" + "levn" "^0.4.1" + "lodash.merge" "^4.6.2" + "minimatch" "^3.1.2" + "natural-compare" "^1.4.0" + "optionator" "^0.9.1" + "regexpp" "^3.2.0" + "strip-ansi" "^6.0.1" + "strip-json-comments" "^3.1.0" + "text-table" "^0.2.0" + "v8-compile-cache" "^2.0.3" -espree@^9.3.2, espree@^9.3.3: - version "9.3.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" - integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== +"espree@^9.3.2", "espree@^9.3.3": + "integrity" "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==" + "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz" + "version" "9.3.3" dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + "acorn" "^8.8.0" + "acorn-jsx" "^5.3.2" + "eslint-visitor-keys" "^3.3.0" -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +"esprima@^4.0.0": + "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + "version" "4.0.1" -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +"esquery@^1.4.0": + "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" + "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + "version" "1.4.0" dependencies: - estraverse "^5.1.0" + "estraverse" "^5.1.0" -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== +"esrecurse@^4.3.0": + "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + "version" "4.3.0" dependencies: - estraverse "^5.2.0" + "estraverse" "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +"estraverse@^4.1.1": + "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + "version" "4.3.0" -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +"estraverse@^5.1.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +"estraverse@^5.2.0": + "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + "version" "5.3.0" -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== +"esutils@^2.0.2": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + +"execa@^5.0.0": + "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==" + "resolved" "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + "version" "5.1.1" dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" + "cross-spawn" "^7.0.3" + "get-stream" "^6.0.0" + "human-signals" "^2.1.0" + "is-stream" "^2.0.0" + "merge-stream" "^2.0.0" + "npm-run-path" "^4.0.1" + "onetime" "^5.1.2" + "signal-exit" "^3.0.3" + "strip-final-newline" "^2.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +"exit@^0.1.2": + "integrity" "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + "version" "0.1.2" -expect@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== +"expect@^28.1.3": + "integrity" "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==" + "resolved" "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + "jest-get-type" "^28.0.2" + "jest-matcher-utils" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +"fast-diff@^1.1.2": + "integrity" "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + "version" "1.2.0" -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== +"fast-glob@^3.2.9": + "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" + "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + "version" "3.2.11" dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" + "glob-parent" "^5.1.2" + "merge2" "^1.3.0" + "micromatch" "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +"fast-json-stable-stringify@^2.0.0", "fast-json-stable-stringify@2.x": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +"fast-levenshtein@^2.0.6": + "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + "version" "2.0.6" -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== +"fastq@^1.6.0": + "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" + "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + "version" "1.13.0" dependencies: - reusify "^1.0.4" + "reusify" "^1.0.4" -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== +"fb-watchman@^2.0.0": + "integrity" "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==" + "resolved" "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" + "version" "2.0.1" dependencies: - bser "2.1.1" + "bser" "2.1.1" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +"file-entry-cache@^6.0.1": + "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" + "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + "version" "6.0.1" dependencies: - flat-cache "^3.0.4" + "flat-cache" "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" dependencies: - to-regex-range "^5.0.1" + "to-regex-range" "^5.0.1" -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +"find-up@^4.0.0": + "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + "version" "4.1.0" dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" + "locate-path" "^5.0.0" + "path-exists" "^4.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== +"find-up@^4.1.0": + "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + "version" "4.1.0" dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" + "locate-path" "^5.0.0" + "path-exists" "^4.0.0" -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== +"find-up@^5.0.0": + "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + "version" "5.0.0" dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" + "locate-path" "^6.0.0" + "path-exists" "^4.0.0" -flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -follow-redirects@^1.14.9: - version "1.15.1" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -form-data@4.0.0, form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== +"flat-cache@^3.0.4": + "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" + "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + "version" "3.0.4" dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" + "flatted" "^3.1.0" + "rimraf" "^3.0.2" -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== +"flatted@^3.1.0": + "integrity" "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==" + "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz" + "version" "3.2.6" -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== +"follow-redirects@^1.14.9": + "integrity" "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" + "version" "1.15.1" -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== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -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-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== +"form-data@^4.0.0", "form-data@4.0.0": + "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + "version" "4.0.0" dependencies: - is-glob "^4.0.1" + "asynckit" "^0.4.0" + "combined-stream" "^1.0.8" + "mime-types" "^2.1.12" -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== +"fs.realpath@^1.0.0": + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"fsevents@^2.3.2": + "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" + "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + "version" "2.3.2" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"functional-red-black-tree@^1.0.1": + "integrity" "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + "version" "1.0.1" + +"gensync@^1.0.0-beta.2": + "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + "version" "1.0.0-beta.2" + +"get-caller-file@^2.0.5": + "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + "version" "2.0.5" + +"get-package-type@^0.1.0": + "integrity" "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + "resolved" "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + "version" "0.1.0" + +"get-stream@^6.0.0": + "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + "version" "6.0.1" + +"glob-parent@^5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" dependencies: - is-glob "^4.0.3" + "is-glob" "^4.0.1" -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +"glob-parent@^6.0.1": + "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + "version" "6.0.2" 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" + "is-glob" "^4.0.3" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.15.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== +"glob@^7.1.3", "glob@^7.1.4": + "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + "version" "7.2.3" dependencies: - type-fest "^0.20.2" + "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" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== +"globals@^11.1.0": + "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + "version" "11.12.0" + +"globals@^13.15.0": + "integrity" "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==" + "resolved" "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" + "version" "13.17.0" dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" + "type-fest" "^0.20.2" -graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -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@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +"globby@^11.1.0": + "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" + "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + "version" "11.1.0" dependencies: - function-bind "^1.1.1" + "array-union" "^2.1.0" + "dir-glob" "^3.0.1" + "fast-glob" "^3.2.9" + "ignore" "^5.2.0" + "merge2" "^1.4.1" + "slash" "^3.0.0" -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +"graceful-fs@^4.2.9": + "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + "version" "4.2.10" -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +"grapheme-splitter@^1.0.4": + "integrity" "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + "resolved" "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + "version" "1.0.4" -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +"has-flag@^3.0.0": + "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" -import-fresh@^3.0.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== +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"has@^1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + "version" "1.0.3" dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" + "function-bind" "^1.1.1" -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== +"html-escaper@^2.0.0": + "integrity" "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "resolved" "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + "version" "2.0.2" + +"human-signals@^2.1.0": + "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + "version" "2.1.0" + +"ignore@^5.2.0": + "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + "version" "5.2.0" + +"import-fresh@^3.0.0", "import-fresh@^3.2.1": + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + "version" "3.3.0" dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -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== +"import-local@^3.0.2": + "integrity" "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==" + "resolved" "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + "version" "3.1.0" dependencies: - once "^1.3.0" - wrappy "1" + "pkg-dir" "^4.2.0" + "resolve-cwd" "^3.0.0" -inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +"imurmurhash@^0.1.4": + "integrity" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-buffer@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== +"inflight@^1.0.4": + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" dependencies: - has "^1.0.3" + "once" "^1.3.0" + "wrappy" "1" -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +"inherits@2": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +"is-arrayish@^0.2.1": + "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +"is-buffer@^2.0.5": + "integrity" "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + "version" "2.0.5" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== +"is-core-module@^2.9.0": + "integrity" "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==" + "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" + "version" "2.10.0" dependencies: - is-extglob "^2.1.1" + "has" "^1.0.3" -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +"is-extglob@^2.1.1": + "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" -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-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +"is-generator-fn@^2.0.0": + "integrity" "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + "resolved" "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + "version" "2.1.0" -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== +"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"is-stream@^2.0.0": + "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + "version" "2.0.1" + +"isexe@^2.0.0": + "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"istanbul-lib-coverage@^3.0.0", "istanbul-lib-coverage@^3.2.0": + "integrity" "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + "resolved" "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + "version" "3.2.0" + +"istanbul-lib-instrument@^5.0.4", "istanbul-lib-instrument@^5.1.0": + "integrity" "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==" + "resolved" "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" + "version" "5.2.0" dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" + "istanbul-lib-coverage" "^3.2.0" + "semver" "^6.3.0" -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== +"istanbul-lib-report@^3.0.0": + "integrity" "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==" + "resolved" "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + "version" "3.0.0" dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" + "istanbul-lib-coverage" "^3.0.0" + "make-dir" "^3.0.0" + "supports-color" "^7.1.0" -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== +"istanbul-lib-source-maps@^4.0.0": + "integrity" "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==" + "resolved" "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + "version" "4.0.1" dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" + "debug" "^4.1.1" + "istanbul-lib-coverage" "^3.0.0" + "source-map" "^0.6.1" -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== +"istanbul-reports@^3.1.3": + "integrity" "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==" + "resolved" "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + "version" "3.1.5" dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" + "html-escaper" "^2.0.0" + "istanbul-lib-report" "^3.0.0" -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== +"jest-changed-files@^28.1.3": + "integrity" "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==" + "resolved" "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" + "version" "28.1.3" dependencies: - execa "^5.0.0" - p-limit "^3.1.0" + "execa" "^5.0.0" + "p-limit" "^3.1.0" -jest-circus@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== +"jest-circus@^28.1.3": + "integrity" "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==" + "resolved" "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/expect" "^28.1.3" "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - p-limit "^3.1.0" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" + "chalk" "^4.0.0" + "co" "^4.6.0" + "dedent" "^0.7.0" + "is-generator-fn" "^2.0.0" + "jest-each" "^28.1.3" + "jest-matcher-utils" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-runtime" "^28.1.3" + "jest-snapshot" "^28.1.3" + "jest-util" "^28.1.3" + "p-limit" "^3.1.0" + "pretty-format" "^28.1.3" + "slash" "^3.0.0" + "stack-utils" "^2.0.3" -jest-cli@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== +"jest-cli@^28.1.3": + "integrity" "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==" + "resolved" "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/core" "^28.1.3" "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - prompts "^2.0.1" - yargs "^17.3.1" + "chalk" "^4.0.0" + "exit" "^0.1.2" + "graceful-fs" "^4.2.9" + "import-local" "^3.0.2" + "jest-config" "^28.1.3" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "prompts" "^2.0.1" + "yargs" "^17.3.1" -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== +"jest-config@^28.1.3": + "integrity" "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==" + "resolved" "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/core" "^7.11.6" "@jest/test-sequencer" "^28.1.3" "@jest/types" "^28.1.3" - babel-jest "^28.1.3" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^28.1.3" - slash "^3.0.0" - strip-json-comments "^3.1.1" + "babel-jest" "^28.1.3" + "chalk" "^4.0.0" + "ci-info" "^3.2.0" + "deepmerge" "^4.2.2" + "glob" "^7.1.3" + "graceful-fs" "^4.2.9" + "jest-circus" "^28.1.3" + "jest-environment-node" "^28.1.3" + "jest-get-type" "^28.0.2" + "jest-regex-util" "^28.0.2" + "jest-resolve" "^28.1.3" + "jest-runner" "^28.1.3" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "micromatch" "^4.0.4" + "parse-json" "^5.2.0" + "pretty-format" "^28.1.3" + "slash" "^3.0.0" + "strip-json-comments" "^3.1.1" -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== +"jest-diff@^28.1.3": + "integrity" "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==" + "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" + "version" "28.1.3" dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + "chalk" "^4.0.0" + "diff-sequences" "^28.1.1" + "jest-get-type" "^28.0.2" + "pretty-format" "^28.1.3" -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== +"jest-docblock@^28.1.1": + "integrity" "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==" + "resolved" "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" + "version" "28.1.1" dependencies: - detect-newline "^3.0.0" + "detect-newline" "^3.0.0" -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== +"jest-each@^28.1.3": + "integrity" "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==" + "resolved" "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" - chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" + "chalk" "^4.0.0" + "jest-get-type" "^28.0.2" + "jest-util" "^28.1.3" + "pretty-format" "^28.1.3" -jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== +"jest-environment-node@^28.1.3": + "integrity" "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==" + "resolved" "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/fake-timers" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" + "jest-mock" "^28.1.3" + "jest-util" "^28.1.3" -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== +"jest-get-type@^28.0.2": + "integrity" "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==" + "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" + "version" "28.0.2" -jest-haste-map@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" - integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== +"jest-haste-map@^28.1.3": + "integrity" "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==" + "resolved" "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - jest-worker "^28.1.3" - micromatch "^4.0.4" - walker "^1.0.8" + "anymatch" "^3.0.3" + "fb-watchman" "^2.0.0" + "graceful-fs" "^4.2.9" + "jest-regex-util" "^28.0.2" + "jest-util" "^28.1.3" + "jest-worker" "^28.1.3" + "micromatch" "^4.0.4" + "walker" "^1.0.8" optionalDependencies: - fsevents "^2.3.2" + "fsevents" "^2.3.2" -jest-junit@^14.0.0: - version "14.0.0" - resolved "https://registry.npmjs.org/jest-junit/-/jest-junit-14.0.0.tgz" - integrity sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g== +"jest-junit@^14.0.0": + "integrity" "sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g==" + "resolved" "https://registry.npmjs.org/jest-junit/-/jest-junit-14.0.0.tgz" + "version" "14.0.0" dependencies: - mkdirp "^1.0.4" - strip-ansi "^6.0.1" - uuid "^8.3.2" - xml "^1.0.1" + "mkdirp" "^1.0.4" + "strip-ansi" "^6.0.1" + "uuid" "^8.3.2" + "xml" "^1.0.1" -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== +"jest-leak-detector@^28.1.3": + "integrity" "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==" + "resolved" "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" + "version" "28.1.3" dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + "jest-get-type" "^28.0.2" + "pretty-format" "^28.1.3" -jest-matcher-utils@^28.0.0, jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== +"jest-matcher-utils@^28.0.0", "jest-matcher-utils@^28.1.3": + "integrity" "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==" + "resolved" "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" + "version" "28.1.3" dependencies: - chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + "chalk" "^4.0.0" + "jest-diff" "^28.1.3" + "jest-get-type" "^28.0.2" + "pretty-format" "^28.1.3" -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== +"jest-message-util@^28.1.3": + "integrity" "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==" + "resolved" "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^28.1.3" "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" + "chalk" "^4.0.0" + "graceful-fs" "^4.2.9" + "micromatch" "^4.0.4" + "pretty-format" "^28.1.3" + "slash" "^3.0.0" + "stack-utils" "^2.0.3" -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== +"jest-mock@^28.1.3": + "integrity" "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==" + "resolved" "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/node" "*" -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== +"jest-pnp-resolver@^1.2.2": + "integrity" "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "resolved" "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" + "version" "1.2.2" -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== +"jest-regex-util@^28.0.2": + "integrity" "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" + "resolved" "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" + "version" "28.0.2" -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== +"jest-resolve-dependencies@^28.1.3": + "integrity" "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==" + "resolved" "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" + "version" "28.1.3" dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" + "jest-regex-util" "^28.0.2" + "jest-snapshot" "^28.1.3" -jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== +"jest-resolve@*", "jest-resolve@^28.1.3": + "integrity" "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==" + "resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" + "version" "28.1.3" dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" + "chalk" "^4.0.0" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "jest-pnp-resolver" "^1.2.2" + "jest-util" "^28.1.3" + "jest-validate" "^28.1.3" + "resolve" "^1.20.0" + "resolve.exports" "^1.1.0" + "slash" "^3.0.0" -jest-runner@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== +"jest-runner@^28.1.3": + "integrity" "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==" + "resolved" "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/console" "^28.1.3" "@jest/environment" "^28.1.3" @@ -1985,26 +2003,26 @@ jest-runner@^28.1.3: "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - emittery "^0.10.2" - graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" - p-limit "^3.1.0" - source-map-support "0.5.13" + "chalk" "^4.0.0" + "emittery" "^0.10.2" + "graceful-fs" "^4.2.9" + "jest-docblock" "^28.1.1" + "jest-environment-node" "^28.1.3" + "jest-haste-map" "^28.1.3" + "jest-leak-detector" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-resolve" "^28.1.3" + "jest-runtime" "^28.1.3" + "jest-util" "^28.1.3" + "jest-watcher" "^28.1.3" + "jest-worker" "^28.1.3" + "p-limit" "^3.1.0" + "source-map-support" "0.5.13" -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== +"jest-runtime@^28.1.3": + "integrity" "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==" + "resolved" "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/environment" "^28.1.3" "@jest/fake-timers" "^28.1.3" @@ -2013,26 +2031,26 @@ jest-runtime@^28.1.3: "@jest/test-result" "^28.1.3" "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - strip-bom "^4.0.0" + "chalk" "^4.0.0" + "cjs-module-lexer" "^1.0.0" + "collect-v8-coverage" "^1.0.0" + "execa" "^5.0.0" + "glob" "^7.1.3" + "graceful-fs" "^4.2.9" + "jest-haste-map" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-mock" "^28.1.3" + "jest-regex-util" "^28.0.2" + "jest-resolve" "^28.1.3" + "jest-snapshot" "^28.1.3" + "jest-util" "^28.1.3" + "slash" "^3.0.0" + "strip-bom" "^4.0.0" -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== +"jest-snapshot@^28.1.3": + "integrity" "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==" + "resolved" "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" + "version" "28.1.3" dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -2044,888 +2062,893 @@ jest-snapshot@^28.1.3: "@jest/types" "^28.1.3" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^28.1.3" - graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - natural-compare "^1.4.0" - pretty-format "^28.1.3" - semver "^7.3.5" + "babel-preset-current-node-syntax" "^1.0.0" + "chalk" "^4.0.0" + "expect" "^28.1.3" + "graceful-fs" "^4.2.9" + "jest-diff" "^28.1.3" + "jest-get-type" "^28.0.2" + "jest-haste-map" "^28.1.3" + "jest-matcher-utils" "^28.1.3" + "jest-message-util" "^28.1.3" + "jest-util" "^28.1.3" + "natural-compare" "^1.4.0" + "pretty-format" "^28.1.3" + "semver" "^7.3.5" -jest-util@^28.0.0, jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== +"jest-util@^28.0.0", "jest-util@^28.1.3": + "integrity" "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==" + "resolved" "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + "chalk" "^4.0.0" + "ci-info" "^3.2.0" + "graceful-fs" "^4.2.9" + "picomatch" "^2.2.3" -jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== +"jest-validate@^28.1.3": + "integrity" "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==" + "resolved" "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/types" "^28.1.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^28.0.2" - leven "^3.1.0" - pretty-format "^28.1.3" + "camelcase" "^6.2.0" + "chalk" "^4.0.0" + "jest-get-type" "^28.0.2" + "leven" "^3.1.0" + "pretty-format" "^28.1.3" -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== +"jest-watcher@^28.1.3": + "integrity" "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==" + "resolved" "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" + "ansi-escapes" "^4.2.1" + "chalk" "^4.0.0" + "emittery" "^0.10.2" + "jest-util" "^28.1.3" + "string-length" "^4.0.1" -jest-worker@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== +"jest-worker@^28.1.3": + "integrity" "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==" + "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" + "version" "28.1.3" dependencies: "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" + "merge-stream" "^2.0.0" + "supports-color" "^8.0.0" -jest@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" - integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== +"jest@^28.0.0", "jest@^28.1.3": + "integrity" "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==" + "resolved" "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/core" "^28.1.3" "@jest/types" "^28.1.3" - import-local "^3.0.2" - jest-cli "^28.1.3" + "import-local" "^3.0.2" + "jest-cli" "^28.1.3" -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +"js-tokens@^4.0.0": + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + "version" "4.0.0" -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== +"js-yaml@^3.13.1": + "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + "version" "3.14.1" dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + "argparse" "^1.0.7" + "esprima" "^4.0.0" -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== +"js-yaml@^4.1.0": + "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + "version" "4.1.0" dependencies: - argparse "^2.0.1" + "argparse" "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +"jsesc@^2.5.1": + "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + "version" "2.5.2" -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +"json-parse-even-better-errors@^2.3.0": + "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + "version" "2.3.1" -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" -json-stable-stringify-without-jsonify@^1.0.1: - version "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-without-jsonify@^1.0.1": + "integrity" "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + "version" "1.0.1" -json-stringify-safe@5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +"json-stringify-safe@5.0.1": + "integrity" "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + "version" "5.0.1" -json5@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +"json5@^2.2.1": + "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + "version" "2.2.3" -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +"kleur@^3.0.3": + "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + "version" "3.0.3" -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +"leven@^3.1.0": + "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + "version" "3.1.0" -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== +"levn@^0.4.1": + "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + "version" "0.4.1" dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" + "prelude-ls" "^1.2.1" + "type-check" "~0.4.0" -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +"lines-and-columns@^1.1.6": + "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + "version" "1.2.4" -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== +"locate-path@^5.0.0": + "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + "version" "5.0.0" dependencies: - p-locate "^4.1.0" + "p-locate" "^4.1.0" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== +"locate-path@^6.0.0": + "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + "version" "6.0.0" dependencies: - p-locate "^5.0.0" + "p-locate" "^5.0.0" -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== +"lodash.memoize@4.x": + "integrity" "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + "version" "4.1.2" -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +"lodash.merge@^4.6.2": + "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + "version" "4.6.2" -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== +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" dependencies: - yallist "^4.0.0" + "yallist" "^4.0.0" -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== +"make-dir@^3.0.0": + "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" + "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + "version" "3.1.0" dependencies: - semver "^6.0.0" + "semver" "^6.0.0" -make-error@1.x: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +"make-error@1.x": + "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + "version" "1.3.6" -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== +"makeerror@1.0.12": + "integrity" "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==" + "resolved" "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + "version" "1.0.12" dependencies: - tmpl "1.0.5" + "tmpl" "1.0.5" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +"merge-stream@^2.0.0": + "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + "version" "2.0.0" -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +"merge2@^1.3.0", "merge2@^1.4.1": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +"micromatch@^4.0.4": + "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + "version" "4.0.5" dependencies: - braces "^3.0.2" - picomatch "^2.3.1" + "braces" "^3.0.2" + "picomatch" "^2.3.1" -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-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== +"mime-types@^2.1.12": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" dependencies: - mime-db "1.52.0" + "mime-db" "1.52.0" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +"mimic-fn@^2.1.0": + "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + "version" "2.1.0" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +"minimatch@^3.0.4", "minimatch@^3.1.1", "minimatch@^3.1.2": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" dependencies: - brace-expansion "^1.1.7" + "brace-expansion" "^1.1.7" -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +"mkdirp@^1.0.4": + "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + "version" "1.0.4" -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +"ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +"natural-compare@^1.4.0": + "integrity" "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + "version" "1.4.0" -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +"node-int64@^0.4.0": + "integrity" "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + "resolved" "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + "version" "0.4.0" -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +"node-releases@^2.0.6": + "integrity" "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" + "version" "2.0.6" -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +"normalize-path@^3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== +"npm-run-path@^4.0.1": + "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + "version" "4.0.1" dependencies: - path-key "^3.0.0" + "path-key" "^3.0.0" -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== +"once@^1.3.0": + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" dependencies: - wrappy "1" + "wrappy" "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== +"onetime@^5.1.2": + "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + "version" "5.1.2" dependencies: - mimic-fn "^2.1.0" + "mimic-fn" "^2.1.0" -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.1": + "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" + "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + "version" "0.9.1" dependencies: - 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" + "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" -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== +"p-limit@^2.2.0": + "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + "version" "2.3.0" dependencies: - p-try "^2.0.0" + "p-try" "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== +"p-limit@^3.0.2", "p-limit@^3.1.0": + "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + "version" "3.1.0" dependencies: - yocto-queue "^0.1.0" + "yocto-queue" "^0.1.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +"p-locate@^4.1.0": + "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + "version" "4.1.0" dependencies: - p-limit "^2.2.0" + "p-limit" "^2.2.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== +"p-locate@^5.0.0": + "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + "version" "5.0.0" dependencies: - p-limit "^3.0.2" + "p-limit" "^3.0.2" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +"p-try@^2.0.0": + "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + "version" "2.2.0" -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== +"parent-module@^1.0.0": + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" dependencies: - callsites "^3.0.0" + "callsites" "^3.0.0" -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== +"parse-json@^5.2.0": + "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" + "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + "version" "5.2.0" dependencies: "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" + "error-ex" "^1.3.1" + "json-parse-even-better-errors" "^2.3.0" + "lines-and-columns" "^1.1.6" -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +"path-exists@^4.0.0": + "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + "version" "4.0.0" -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-is-absolute@^1.0.0": + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +"path-key@^3.0.0", "path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" -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-parse@^1.0.7": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +"path-type@^4.0.0": + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + "version" "4.0.0" -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +"picocolors@^1.0.0": + "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + "version" "1.0.0" -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +"picomatch@^2.0.4", "picomatch@^2.2.3", "picomatch@^2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +"pirates@^4.0.4": + "integrity" "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + "resolved" "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + "version" "4.0.5" -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== +"pkg-dir@^4.2.0": + "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==" + "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + "version" "4.2.0" dependencies: - find-up "^4.0.0" + "find-up" "^4.0.0" -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +"prelude-ls@^1.2.1": + "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + "version" "1.2.1" -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== +"prettier-linter-helpers@^1.0.0": + "integrity" "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==" + "resolved" "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + "version" "1.0.0" dependencies: - fast-diff "^1.1.2" + "fast-diff" "^1.1.2" -prettier@2.7.1: - version "2.7.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +"prettier@>=2.0.0", "prettier@2.7.1": + "integrity" "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" + "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + "version" "2.7.1" -pretty-format@^28.0.0, pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== +"pretty-format@^28.0.0", "pretty-format@^28.1.3": + "integrity" "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==" + "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" + "version" "28.1.3" dependencies: "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" + "ansi-regex" "^5.0.1" + "ansi-styles" "^5.0.0" + "react-is" "^18.0.0" -process@0.11.10: - version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +"process@0.11.10": + "integrity" "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + "resolved" "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + "version" "0.11.10" -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== +"prompts@^2.0.1": + "integrity" "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==" + "resolved" "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + "version" "2.4.2" dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" + "kleur" "^3.0.3" + "sisteransi" "^1.0.5" -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +"punycode@^2.1.0": + "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + "version" "2.1.1" -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +"queue-microtask@^1.2.2": + "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + "version" "1.2.3" -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +"react-is@^18.0.0": + "integrity" "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + "version" "18.2.0" -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +"regexpp@^3.2.0": + "integrity" "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + "version" "3.2.0" -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +"require-directory@^2.1.1": + "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + "version" "2.1.1" -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== +"resolve-cwd@^3.0.0": + "integrity" "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==" + "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + "version" "3.0.0" dependencies: - resolve-from "^5.0.0" + "resolve-from" "^5.0.0" -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +"resolve-from@^5.0.0": + "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + "version" "5.0.0" -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +"resolve.exports@^1.1.0": + "integrity" "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" + "resolved" "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" + "version" "1.1.0" -resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +"resolve@^1.20.0": + "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + "version" "1.22.1" dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" + "is-core-module" "^2.9.0" + "path-parse" "^1.0.7" + "supports-preserve-symlinks-flag" "^1.0.0" -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== +"rimraf@^3.0.0", "rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" dependencies: - glob "^7.1.3" + "glob" "^7.1.3" -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" dependencies: - queue-microtask "^1.2.2" + "queue-microtask" "^1.2.2" -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +"safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +"semver@^6.0.0": + "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + "version" "6.3.0" + +"semver@^6.3.0": + "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + "version" "6.3.0" + +"semver@^7.3.5", "semver@^7.3.7", "semver@7.x": + "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + "version" "7.3.7" dependencies: - lru-cache "^6.0.0" + "lru-cache" "^6.0.0" -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" dependencies: - shebang-regex "^3.0.0" + "shebang-regex" "^3.0.0" -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +"signal-exit@^3.0.3", "signal-exit@^3.0.7": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +"sisteransi@^1.0.5": + "integrity" "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "resolved" "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + "version" "1.0.5" -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +"slash@^3.0.0": + "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + "version" "3.0.0" -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== +"source-map-support@^0.5.21": + "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + "version" "0.5.21" dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" + "buffer-from" "^1.0.0" + "source-map" "^0.6.0" -source-map-support@^0.5.21: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== +"source-map-support@0.5.13": + "integrity" "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==" + "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + "version" "0.5.13" dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" + "buffer-from" "^1.0.0" + "source-map" "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +"source-map@^0.6.0", "source-map@^0.6.1": + "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "version" "0.6.1" -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +"sprintf-js@~1.0.2": + "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + "version" "1.0.3" -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== +"stack-utils@^2.0.3": + "integrity" "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==" + "resolved" "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + "version" "2.0.5" dependencies: - escape-string-regexp "^2.0.0" + "escape-string-regexp" "^2.0.0" -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== +"string-length@^4.0.1": + "integrity" "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==" + "resolved" "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + "version" "4.0.2" dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" + "char-regex" "^1.0.2" + "strip-ansi" "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +"string-width@^4.1.0", "string-width@^4.2.0", "string-width@^4.2.3": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" dependencies: - ansi-regex "^5.0.1" + "ansi-regex" "^5.0.1" -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== +"strip-bom@^4.0.0": + "integrity" "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + "version" "4.0.0" -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +"strip-final-newline@^2.0.0": + "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + "version" "2.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1": + "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + "version" "3.1.1" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" dependencies: - has-flag "^3.0.0" + "has-flag" "^3.0.0" -supports-color@^7.0.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== +"supports-color@^7.0.0", "supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" dependencies: - has-flag "^4.0.0" + "has-flag" "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== +"supports-color@^8.0.0": + "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + "version" "8.1.1" dependencies: - has-flag "^4.0.0" + "has-flag" "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== +"supports-hyperlinks@^2.0.0": + "integrity" "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==" + "resolved" "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" + "version" "2.2.0" dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" + "has-flag" "^4.0.0" + "supports-color" "^7.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== +"supports-preserve-symlinks-flag@^1.0.0": + "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + "version" "1.0.0" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== +"terminal-link@^2.0.0": + "integrity" "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==" + "resolved" "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + "version" "2.1.1" dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" + "ansi-escapes" "^4.2.1" + "supports-hyperlinks" "^2.0.0" -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== +"test-exclude@^6.0.0": + "integrity" "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==" + "resolved" "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + "version" "6.0.0" dependencies: "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" + "glob" "^7.1.4" + "minimatch" "^3.0.4" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +"text-table@^0.2.0": + "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +"tmpl@1.0.5": + "integrity" "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + "resolved" "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + "version" "1.0.5" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +"to-fast-properties@^2.0.0": + "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + "version" "2.0.0" -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" dependencies: - is-number "^7.0.0" + "is-number" "^7.0.0" -ts-jest@28.0.7: - version "28.0.7" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz" - integrity sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA== +"ts-jest@28.0.7": + "integrity" "sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA==" + "resolved" "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz" + "version" "28.0.7" dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^28.0.0" - json5 "^2.2.1" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" + "bs-logger" "0.x" + "fast-json-stable-stringify" "2.x" + "jest-util" "^28.0.0" + "json5" "^2.2.1" + "lodash.memoize" "4.x" + "make-error" "1.x" + "semver" "7.x" + "yargs-parser" "^21.0.1" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +"tslib@^1.8.1": + "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + "version" "1.14.1" -tslog@3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/tslog/-/tslog-3.3.3.tgz" - integrity sha512-lGrkndwpAohZ9ntQpT+xtUw5k9YFV1DjsksiWQlBSf82TTqsSAWBARPRD9juI730r8o3Awpkjp2aXy9k+6vr+g== +"tslog@3.3.3": + "integrity" "sha512-lGrkndwpAohZ9ntQpT+xtUw5k9YFV1DjsksiWQlBSf82TTqsSAWBARPRD9juI730r8o3Awpkjp2aXy9k+6vr+g==" + "resolved" "https://registry.npmjs.org/tslog/-/tslog-3.3.3.tgz" + "version" "3.3.3" dependencies: - source-map-support "^0.5.21" + "source-map-support" "^0.5.21" -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== +"tsutils@^3.21.0": + "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" + "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + "version" "3.21.0" dependencies: - tslib "^1.8.1" + "tslib" "^1.8.1" -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== +"type-check@^0.4.0", "type-check@~0.4.0": + "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + "version" "0.4.0" dependencies: - prelude-ls "^1.2.1" + "prelude-ls" "^1.2.1" -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +"type-detect@4.0.8": + "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + "version" "4.0.8" -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +"type-fest@^0.20.2": + "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + "version" "0.20.2" -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +"type-fest@^0.21.3": + "integrity" "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + "version" "0.21.3" -typescript@^4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +"typescript@^4.7.4", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=4.3": + "integrity" "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" + "version" "4.7.4" -update-browserslist-db@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== +"update-browserslist-db@^1.0.5": + "integrity" "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==" + "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" + "version" "1.0.5" dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + "escalade" "^3.1.1" + "picocolors" "^1.0.0" -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== +"uri-js@^4.2.2": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" dependencies: - punycode "^2.1.0" + "punycode" "^2.1.0" -uuid@8.3.2, 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== +"uuid@^8.3.2", "uuid@8.3.2": + "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + "version" "8.3.2" -uuidv4@^6.2.12: - version "6.2.13" - resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz" - integrity sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ== +"uuidv4@^6.2.12": + "integrity" "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==" + "resolved" "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz" + "version" "6.2.13" dependencies: "@types/uuid" "8.3.4" - uuid "8.3.2" + "uuid" "8.3.2" -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +"v8-compile-cache@^2.0.3": + "integrity" "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + "version" "2.3.0" -v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== +"v8-to-istanbul@^9.0.1": + "integrity" "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==" + "resolved" "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" + "version" "9.0.1" dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + "convert-source-map" "^1.6.0" -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== +"walker@^1.0.8": + "integrity" "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==" + "resolved" "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + "version" "1.0.8" dependencies: - makeerror "1.0.12" + "makeerror" "1.0.12" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" dependencies: - isexe "^2.0.0" + "isexe" "^2.0.0" -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": + "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + "version" "1.2.3" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +"wrap-ansi@^7.0.0": + "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + "version" "7.0.0" dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.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== +"wrappy@1": + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" -write-file-atomic@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== +"write-file-atomic@^4.0.1": + "integrity" "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==" + "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz" + "version" "4.0.1" dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" + "imurmurhash" "^0.1.4" + "signal-exit" "^3.0.7" -xml@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" - integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== +"xml@^1.0.1": + "integrity" "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" + "resolved" "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" + "version" "1.0.1" -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +"y18n@^5.0.5": + "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + "version" "5.0.8" -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" -yaml@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz" - integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== +"yaml@^2.1.1": + "integrity" "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==" + "resolved" "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz" + "version" "2.1.1" -yargs-parser@^21.0.0, yargs-parser@^21.0.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +"yargs-parser@^21.0.0", "yargs-parser@^21.0.1": + "integrity" "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + "version" "21.1.1" -yargs@^17.3.1: - version "17.5.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== +"yargs@^17.3.1": + "integrity" "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==" + "resolved" "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" + "version" "17.5.1" dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" + "cliui" "^7.0.2" + "escalade" "^3.1.1" + "get-caller-file" "^2.0.5" + "require-directory" "^2.1.1" + "string-width" "^4.2.3" + "y18n" "^5.0.5" + "yargs-parser" "^21.0.0" -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +"yocto-queue@^0.1.0": + "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + "version" "0.1.0" From c8866b1af29e44a6d4c6ff53e1e4126384c2ca5f Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 26 Jan 2023 12:27:59 +0100 Subject: [PATCH 246/591] Delete yarn-stable-temp.cjs --- .../tests/.yarn/releases/yarn-stable-temp.cjs | 783 ------------------ 1 file changed, 783 deletions(-) delete mode 100755 nym-api/tests/.yarn/releases/yarn-stable-temp.cjs diff --git a/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs b/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs deleted file mode 100755 index 0912bea85e..0000000000 --- a/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs +++ /dev/null @@ -1,783 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var nge=Object.create,Mh=Object.defineProperty,sge=Object.defineProperties,oge=Object.getOwnPropertyDescriptor,age=Object.getOwnPropertyDescriptors,Age=Object.getOwnPropertyNames,DE=Object.getOwnPropertySymbols,lge=Object.getPrototypeOf,eQ=Object.prototype.hasOwnProperty,OO=Object.prototype.propertyIsEnumerable;var MO=(r,e,t)=>e in r?Mh(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,N=(r,e)=>{for(var t in e||(e={}))eQ.call(e,t)&&MO(r,t,e[t]);if(DE)for(var t of DE(e))OO.call(e,t)&&MO(r,t,e[t]);return r},te=(r,e)=>sge(r,age(e)),cge=r=>Mh(r,"__esModule",{value:!0});var Or=(r,e)=>{var t={};for(var i in r)eQ.call(r,i)&&e.indexOf(i)<0&&(t[i]=r[i]);if(r!=null&&DE)for(var i of DE(r))e.indexOf(i)<0&&OO.call(r,i)&&(t[i]=r[i]);return t},uge=(r,e)=>()=>(r&&(e=r(r=0)),e),w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ft=(r,e)=>{for(var t in e)Mh(r,t,{get:e[t],enumerable:!0})},gge=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Age(e))!eQ.call(r,i)&&i!=="default"&&Mh(r,i,{get:()=>e[i],enumerable:!(t=oge(e,i))||t.enumerable});return r},ge=r=>gge(cge(Mh(r!=null?nge(lge(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var cM=w((i7e,oM)=>{oM.exports=aM;aM.sync=xge;var AM=require("fs");function kge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{uM.exports=gM;gM.sync=Pge;var fM=require("fs");function gM(r,e,t){fM.stat(r,function(i,n){t(i,i?!1:hM(n,e))})}function Pge(r,e){return hM(fM.statSync(r),e)}function hM(r,e){return r.isFile()&&Dge(r,e)}function Dge(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var CM=w((o7e,dM)=>{var s7e=require("fs"),zE;process.platform==="win32"||global.TESTING_WINDOWS?zE=cM():zE=pM();dM.exports=CQ;CQ.sync=Rge;function CQ(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){CQ(r,e||{},function(s,o){s?n(s):i(o)})})}zE(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function Rge(r,e){try{return zE.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var bM=w((a7e,mM)=>{var Xu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",EM=require("path"),Fge=Xu?";":":",IM=CM(),yM=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),wM=(r,e)=>{let t=e.colon||Fge,i=r.match(/\//)||Xu&&r.match(/\\/)?[""]:[...Xu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=Xu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Xu?n.split(t):[""];return Xu&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},BM=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=wM(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(yM(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=EM.join(h,r),m=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(m,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];IM(c+p,{pathExt:s},(m,y)=>{if(!m&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},Nge=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=wM(r,e),s=[];for(let o=0;o{"use strict";var QM=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};mQ.exports=QM;mQ.exports.default=QM});var PM=w((l7e,vM)=>{"use strict";var xM=require("path"),Lge=bM(),Tge=SM();function kM(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch(a){}let o;try{o=Lge.sync(r.command,{path:t[Tge({env:t})],pathExt:e?xM.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=xM.resolve(n?r.options.cwd:"",o)),o}function Oge(r){return kM(r)||kM(r,!0)}vM.exports=Oge});var DM=w((c7e,EQ)=>{"use strict";var IQ=/([()\][%!^"`<>&|;, *?])/g;function Mge(r){return r=r.replace(IQ,"^$1"),r}function Kge(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(IQ,"^$1"),e&&(r=r.replace(IQ,"^$1")),r}EQ.exports.command=Mge;EQ.exports.argument=Kge});var FM=w((u7e,RM)=>{"use strict";RM.exports=/^#!(.*)/});var LM=w((g7e,NM)=>{"use strict";var Uge=FM();NM.exports=(r="")=>{let e=r.match(Uge);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var OM=w((f7e,TM)=>{"use strict";var yQ=require("fs"),Hge=LM();function jge(r){let e=150,t=Buffer.alloc(e),i;try{i=yQ.openSync(r,"r"),yQ.readSync(i,t,0,e,0),yQ.closeSync(i)}catch(n){}return Hge(t.toString())}TM.exports=jge});var HM=w((h7e,MM)=>{"use strict";var Gge=require("path"),KM=PM(),UM=DM(),Yge=OM(),qge=process.platform==="win32",Jge=/\.(?:com|exe)$/i,Wge=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function zge(r){r.file=KM(r);let e=r.file&&Yge(r.file);return e?(r.args.unshift(r.file),r.command=e,KM(r)):r.file}function _ge(r){if(!qge)return r;let e=zge(r),t=!Jge.test(e);if(r.options.forceShell||t){let i=Wge.test(e);r.command=Gge.normalize(r.command),r.command=UM.command(r.command),r.args=r.args.map(s=>UM.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Vge(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:_ge(i)}MM.exports=Vge});var YM=w((p7e,jM)=>{"use strict";var wQ=process.platform==="win32";function BQ(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Xge(r,e){if(!wQ)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=GM(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function GM(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawn"):null}function Zge(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawnSync"):null}jM.exports={hookChildProcess:Xge,verifyENOENT:GM,verifyENOENTSync:Zge,notFoundError:BQ}});var SQ=w((d7e,Zu)=>{"use strict";var qM=require("child_process"),bQ=HM(),QQ=YM();function JM(r,e,t){let i=bQ(r,e,t),n=qM.spawn(i.command,i.args,i.options);return QQ.hookChildProcess(n,i),n}function $ge(r,e,t){let i=bQ(r,e,t),n=qM.spawnSync(i.command,i.args,i.options);return n.error=n.error||QQ.verifyENOENTSync(n.status,i),n}Zu.exports=JM;Zu.exports.spawn=JM;Zu.exports.sync=$ge;Zu.exports._parse=bQ;Zu.exports._enoent=QQ});var zM=w((C7e,WM)=>{"use strict";function efe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function cc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,cc)}efe(cc,Error);cc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",le=me(">>",!1),fe=">&",gt=me(">&",!1),Ht=">",Mt=me(">",!1),Ei="<<<",jt=me("<<<",!1),Qr="<&",Oi=me("<&",!1),Xs="<",Un=me("<",!1),Hn=function(C){return{type:"argument",segments:[].concat(...C)}},Sr=function(C){return C},jn="$'",fs=me("$'",!1),ba="'",DA=me("'",!1),Nu=function(C){return[{type:"text",text:C}]},hs='""',RA=me('""',!1),Qa=function(){return{type:"text",text:""}},Lu='"',FA=me('"',!1),NA=function(C){return C},vr=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},zl=function(C){return{type:"shell",shell:C,quoted:!0}},Tu=function(C){return te(N({type:"variable"},C),{quoted:!0})},xo=function(C){return{type:"text",text:C}},Ou=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},Sh=function(C){return{type:"shell",shell:C,quoted:!1}},vh=function(C){return te(N({type:"variable"},C),{quoted:!1})},Dr=function(C){return{type:"glob",pattern:C}},Ae=/^[^']/,ko=_e(["'"],!0,!1),Gn=function(C){return C.join("")},Mu=/^[^$"]/,St=_e(["$",'"'],!0,!1),_l=`\\ -`,Yn=me(`\\ -`,!1),ps=function(){return""},ds="\\",pt=me("\\",!1),Po=/^[\\$"`]/,lt=_e(["\\","$",'"',"`"],!1,!1),mn=function(C){return C},S="\\a",Tt=me("\\a",!1),Ku=function(){return"a"},Vl="\\b",xh=me("\\b",!1),kh=function(){return"\b"},Ph=/^[Ee]/,Dh=_e(["E","e"],!1,!1),Rh=function(){return""},j="\\f",wt=me("\\f",!1),LA=function(){return"\f"},$i="\\n",Xl=me("\\n",!1),$e=function(){return` -`},Sa="\\r",Uu=me("\\r",!1),yE=function(){return"\r"},Fh="\\t",wE=me("\\t",!1),gr=function(){return" "},qn="\\v",Zl=me("\\v",!1),Nh=function(){return"\v"},Zs=/^[\\'"?]/,va=_e(["\\","'",'"',"?"],!1,!1),En=function(C){return String.fromCharCode(parseInt(C,16))},Oe="\\x",Hu=me("\\x",!1),$l="\\u",$s=me("\\u",!1),ec="\\U",TA=me("\\U",!1),ju=function(C){return String.fromCodePoint(parseInt(C,16))},Gu=/^[0-7]/,xa=_e([["0","7"]],!1,!1),ka=/^[0-9a-fA-f]/,nt=_e([["0","9"],["a","f"],["A","f"]],!1,!1),Do=ot(),OA="-",tc=me("-",!1),eo="+",rc=me("+",!1),BE=".",Lh=me(".",!1),Yu=function(C,Q,F){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+F.join(""))}},Th=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},bE=function(C){return N({type:"variable"},C)},ic=function(C){return{type:"variable",name:C}},QE=function(C){return C},qu="*",MA=me("*",!1),Tr="/",SE=me("/",!1),to=function(C,Q,F){return{type:Q==="*"?"multiplication":"division",right:F}},ro=function(C,Q){return Q.reduce((F,U)=>N({left:F},U),C)},Ju=function(C,Q,F){return{type:Q==="+"?"addition":"subtraction",right:F}},KA="$((",R=me("$((",!1),G="))",Ce=me("))",!1),He=function(C){return C},Te="$(",Xe=me("$(",!1),Et=function(C){return C},Rt="${",Jn=me("${",!1),Ob=":-",lO=me(":-",!1),cO=function(C,Q){return{name:C,defaultValue:Q}},Mb=":-}",uO=me(":-}",!1),gO=function(C){return{name:C,defaultValue:[]}},Kb=":+",fO=me(":+",!1),hO=function(C,Q){return{name:C,alternativeValue:Q}},Ub=":+}",pO=me(":+}",!1),dO=function(C){return{name:C,alternativeValue:[]}},Hb=function(C){return{name:C}},CO="$",mO=me("$",!1),EO=function(C){return e.isGlobPattern(C)},IO=function(C){return C},jb=/^[a-zA-Z0-9_]/,Gb=_e([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Yb=function(){return M()},qb=/^[$@*?#a-zA-Z0-9_\-]/,Jb=_e(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),yO=/^[(){}<>$|&; \t"']/,Wu=_e(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Wb=/^[<>&; \t"']/,zb=_e(["<",">","&",";"," "," ",'"',"'"],!1,!1),vE=/^[ \t]/,xE=_e([" "," "],!1,!1),B=0,Ue=0,UA=[{line:1,column:1}],d=0,E=[],I=0,D;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function M(){return r.substring(Ue,B)}function z(){return yt(Ue,B)}function ie(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Mi([ut(C)],r.substring(Ue,B),Q)}function we(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Wn(C,Q)}function me(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function _e(C,Q,F){return{type:"class",parts:C,inverted:Q,ignoreCase:F}}function ot(){return{type:"any"}}function Bt(){return{type:"end"}}function ut(C){return{type:"other",description:C}}function st(C){var Q=UA[C],F;if(Q)return Q;for(F=C-1;!UA[F];)F--;for(Q=UA[F],Q={line:Q.line,column:Q.column};Fd&&(d=B,E=[]),E.push(C))}function Wn(C,Q){return new cc(C,null,null,Q)}function Mi(C,Q,F){return new cc(cc.buildMessage(C,Q),C,Q,F)}function HA(){var C,Q;return C=B,Q=Yr(),Q===t&&(Q=null),Q!==t&&(Ue=C,Q=s(Q)),C=Q,C}function Yr(){var C,Q,F,U,ue;if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U!==t?(ue=Cs(),ue===t&&(ue=null),ue!==t?(Ue=C,Q=o(Q,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;if(C===t)if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U===t&&(U=null),U!==t?(Ue=C,Q=a(Q,U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Cs(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yr(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=l(F),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function Pa(){var C;return r.charCodeAt(B)===59?(C=c,B++):(C=t,I===0&&xe(u)),C===t&&(r.charCodeAt(B)===38?(C=g,B++):(C=t,I===0&&xe(f))),C}function qr(){var C,Q,F;return C=B,Q=wO(),Q!==t?(F=Hue(),F===t&&(F=null),F!==t?(Ue=C,Q=h(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Hue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=jue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=qr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=p(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function jue(){var C;return r.substr(B,2)===m?(C=m,B+=2):(C=t,I===0&&xe(y)),C===t&&(r.substr(B,2)===b?(C=b,B+=2):(C=t,I===0&&xe(v))),C}function wO(){var C,Q,F;return C=B,Q=que(),Q!==t?(F=Gue(),F===t&&(F=null),F!==t?(Ue=C,Q=x(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Gue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=wO(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=T(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function Yue(){var C;return r.substr(B,2)===q?(C=q,B+=2):(C=t,I===0&&xe(Y)),C===t&&(r.charCodeAt(B)===124?(C=$,B++):(C=t,I===0&&xe(_))),C}function kE(){var C,Q,F,U,ue,De;if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t)if(U=QO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(Ue=C,Q=A(Q,U),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;else B=C,C=t;if(C===t)if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=oe(Q),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function que(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===40?(F=ce,B++):(F=t,I===0&&xe(Z)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===41?(Ct=O,B++):(Ct=t,I===0&&xe(L)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=de(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===123?(F=Be,B++):(F=t,I===0&&xe(je)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===125?(Ct=re,B++):(Ct=t,I===0&&xe(se)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=be(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){for(F=[],U=kE();U!==t;)F.push(U),U=kE();if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t){if(ue=[],De=bO(),De!==t)for(;De!==t;)ue.push(De),De=bO();else ue=t;if(ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=he(F,ue),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t}else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=kE(),U!==t)for(;U!==t;)F.push(U),U=kE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Fe(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}}}return C}function BO(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=PE(),U!==t)for(;U!==t;)F.push(U),U=PE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Ke(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t;return C}function bO(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t?(F=Oh(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();Q!==t?(F=PE(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t)}return C}function Oh(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(ve.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(pe)),F===t&&(F=null),F!==t?(U=Jue(),U!==t?(ue=PE(),ue!==t?(Ue=C,Q=V(F,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Jue(){var C;return r.substr(B,2)===Qe?(C=Qe,B+=2):(C=t,I===0&&xe(le)),C===t&&(r.substr(B,2)===fe?(C=fe,B+=2):(C=t,I===0&&xe(gt)),C===t&&(r.charCodeAt(B)===62?(C=Ht,B++):(C=t,I===0&&xe(Mt)),C===t&&(r.substr(B,3)===Ei?(C=Ei,B+=3):(C=t,I===0&&xe(jt)),C===t&&(r.substr(B,2)===Qr?(C=Qr,B+=2):(C=t,I===0&&xe(Oi)),C===t&&(r.charCodeAt(B)===60?(C=Xs,B++):(C=t,I===0&&xe(Un))))))),C}function PE(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(F=QO(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C}function QO(){var C,Q,F;if(C=B,Q=[],F=SO(),F!==t)for(;F!==t;)Q.push(F),F=SO();else Q=t;return Q!==t&&(Ue=C,Q=Hn(Q)),C=Q,C}function SO(){var C,Q;return C=B,Q=Wue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=zue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=_ue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=Vue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q))),C}function Wue(){var C,Q,F,U;return C=B,r.substr(B,2)===jn?(Q=jn,B+=2):(Q=t,I===0&&xe(fs)),Q!==t?(F=$ue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function zue(){var C,Q,F,U;return C=B,r.charCodeAt(B)===39?(Q=ba,B++):(Q=t,I===0&&xe(DA)),Q!==t?(F=Xue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function _ue(){var C,Q,F,U;if(C=B,r.substr(B,2)===hs?(Q=hs,B+=2):(Q=t,I===0&&xe(RA)),Q!==t&&(Ue=C,Q=Qa()),C=Q,C===t)if(C=B,r.charCodeAt(B)===34?(Q=Lu,B++):(Q=t,I===0&&xe(FA)),Q!==t){for(F=[],U=vO();U!==t;)F.push(U),U=vO();F!==t?(r.charCodeAt(B)===34?(U=Lu,B++):(U=t,I===0&&xe(FA)),U!==t?(Ue=C,Q=NA(F),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Vue(){var C,Q,F;if(C=B,Q=[],F=xO(),F!==t)for(;F!==t;)Q.push(F),F=xO();else Q=t;return Q!==t&&(Ue=C,Q=NA(Q)),C=Q,C}function vO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=vr(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=zl(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=Tu(Q)),C=Q,C===t&&(C=B,Q=Zue(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q))),C}function xO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=Ou(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=Sh(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=vh(Q)),C=Q,C===t&&(C=B,Q=rge(),Q!==t&&(Ue=C,Q=Dr(Q)),C=Q,C===t&&(C=B,Q=tge(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q)))),C}function Xue(){var C,Q,F;for(C=B,Q=[],Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));F!==t;)Q.push(F),Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Zue(){var C,Q,F;if(C=B,Q=[],F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St))),F!==t)for(;F!==t;)Q.push(F),F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St)));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function kO(){var C,Q,F;return C=B,r.substr(B,2)===_l?(Q=_l,B+=2):(Q=t,I===0&&xe(Yn)),Q!==t&&(Ue=C,Q=ps()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Po.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(lt)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t)),C}function $ue(){var C,Q,F;for(C=B,Q=[],F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));F!==t;)Q.push(F),F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function PO(){var C,Q,F;return C=B,r.substr(B,2)===S?(Q=S,B+=2):(Q=t,I===0&&xe(Tt)),Q!==t&&(Ue=C,Q=Ku()),C=Q,C===t&&(C=B,r.substr(B,2)===Vl?(Q=Vl,B+=2):(Q=t,I===0&&xe(xh)),Q!==t&&(Ue=C,Q=kh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Ph.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Dh)),F!==t?(Ue=C,Q=Rh(),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===j?(Q=j,B+=2):(Q=t,I===0&&xe(wt)),Q!==t&&(Ue=C,Q=LA()),C=Q,C===t&&(C=B,r.substr(B,2)===$i?(Q=$i,B+=2):(Q=t,I===0&&xe(Xl)),Q!==t&&(Ue=C,Q=$e()),C=Q,C===t&&(C=B,r.substr(B,2)===Sa?(Q=Sa,B+=2):(Q=t,I===0&&xe(Uu)),Q!==t&&(Ue=C,Q=yE()),C=Q,C===t&&(C=B,r.substr(B,2)===Fh?(Q=Fh,B+=2):(Q=t,I===0&&xe(wE)),Q!==t&&(Ue=C,Q=gr()),C=Q,C===t&&(C=B,r.substr(B,2)===qn?(Q=qn,B+=2):(Q=t,I===0&&xe(Zl)),Q!==t&&(Ue=C,Q=Nh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Zs.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(va)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=ege()))))))))),C}function ege(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms,$b;return C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(F=_b(),F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Oe?(Q=Oe,B+=2):(Q=t,I===0&&xe(Hu)),Q!==t?(F=B,U=B,ue=_b(),ue!==t?(De=zn(),De!==t?(ue=[ue,De],U=ue):(B=U,U=t)):(B=U,U=t),U===t&&(U=_b()),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===$l?(Q=$l,B+=2):(Q=t,I===0&&xe($s)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?(ue=[ue,De,Ct,bt],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===ec?(Q=ec,B+=2):(Q=t,I===0&&xe(TA)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?($r=zn(),$r!==t?(Ii=zn(),Ii!==t?(ms=zn(),ms!==t?($b=zn(),$b!==t?(ue=[ue,De,Ct,bt,$r,Ii,ms,$b],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=ju(F),C=Q):(B=C,C=t)):(B=C,C=t)))),C}function _b(){var C;return Gu.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(xa)),C}function zn(){var C;return ka.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(nt)),C}function tge(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t)),F!==t)for(;F!==t;)Q.push(F),F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Vb(){var C,Q,F,U,ue,De;if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;if(F!==t)if(r.charCodeAt(B)===46?(U=BE,B++):(U=t,I===0&&xe(Lh)),U!==t){if(ue=[],ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe)),De!==t)for(;De!==t;)ue.push(De),ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe));else ue=t;ue!==t?(Ue=C,Q=Yu(Q,F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;if(C===t){if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;F!==t?(Ue=C,Q=Th(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;if(C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=bE(Q)),C=Q,C===t&&(C=B,Q=nc(),Q!==t&&(Ue=C,Q=ic(Q)),C=Q,C===t)))if(C=B,r.charCodeAt(B)===40?(Q=ce,B++):(Q=t,I===0&&xe(Z)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.charCodeAt(B)===41?(De=O,B++):(De=t,I===0&&xe(L)),De!==t?(Ue=C,Q=QE(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t}return C}function Xb(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Vb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function DO(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Xb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function RO(){var C,Q,F,U,ue,De;if(C=B,r.substr(B,3)===KA?(Q=KA,B+=3):(Q=t,I===0&&xe(R)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.substr(B,2)===G?(De=G,B+=2):(De=t,I===0&&xe(Ce)),De!==t?(Ue=C,Q=He(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;return C}function FO(){var C,Q,F,U;return C=B,r.substr(B,2)===Te?(Q=Te,B+=2):(Q=t,I===0&&xe(Xe)),Q!==t?(F=Yr(),F!==t?(r.charCodeAt(B)===41?(U=O,B++):(U=t,I===0&&xe(L)),U!==t?(Ue=C,Q=Et(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Zb(){var C,Q,F,U,ue,De;return C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Ob?(U=Ob,B+=2):(U=t,I===0&&xe(lO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=cO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Mb?(U=Mb,B+=3):(U=t,I===0&&xe(uO)),U!==t?(Ue=C,Q=gO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Kb?(U=Kb,B+=2):(U=t,I===0&&xe(fO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=hO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Ub?(U=Ub,B+=3):(U=t,I===0&&xe(pO)),U!==t?(Ue=C,Q=dO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.charCodeAt(B)===125?(U=re,B++):(U=t,I===0&&xe(se)),U!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.charCodeAt(B)===36?(Q=CO,B++):(Q=t,I===0&&xe(mO)),Q!==t?(F=nc(),F!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)))))),C}function rge(){var C,Q,F;return C=B,Q=ige(),Q!==t?(Ue=B,F=EO(Q),F?F=void 0:F=t,F!==t?(Ue=C,Q=IO(Q),C=Q):(B=C,C=t)):(B=C,C=t),C}function ige(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F!==t)for(;F!==t;)Q.push(F),F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t);else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function NO(){var C,Q,F;if(C=B,Q=[],jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb)),F!==t)for(;F!==t;)Q.push(F),jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function nc(){var C,Q,F;if(C=B,Q=[],qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb)),F!==t)for(;F!==t;)Q.push(F),qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function LO(){var C;return yO.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(Wu)),C}function TO(){var C;return Wb.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(zb)),C}function Ye(){var C,Q;if(C=[],vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE)),Q!==t)for(;Q!==t;)C.push(Q),vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE));else C=t;return C}if(D=n(),D!==t&&B===r.length)return D;throw D!==t&&B{"use strict";function rfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function gc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,gc)}rfe(gc,Error);gc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gq&&(q=v,Y=[]),Y.push(pe))}function se(pe,V){return new gc(pe,null,null,V)}function be(pe,V,Qe){return new gc(gc.buildMessage(pe,V),pe,V,Qe)}function he(){var pe,V,Qe,le;return pe=v,V=Fe(),V!==t?(r.charCodeAt(v)===47?(Qe=s,v++):(Qe=t,$===0&&re(o)),Qe!==t?(le=Fe(),le!==t?(x=pe,V=a(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Fe(),V!==t&&(x=pe,V=l(V)),pe=V),pe}function Fe(){var pe,V,Qe,le;return pe=v,V=Ke(),V!==t?(r.charCodeAt(v)===64?(Qe=c,v++):(Qe=t,$===0&&re(u)),Qe!==t?(le=ve(),le!==t?(x=pe,V=g(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Ke(),V!==t&&(x=pe,V=f(V)),pe=V),pe}function Ke(){var pe,V,Qe,le,fe;return pe=v,r.charCodeAt(v)===64?(V=c,v++):(V=t,$===0&&re(u)),V!==t?(Qe=ke(),Qe!==t?(r.charCodeAt(v)===47?(le=s,v++):(le=t,$===0&&re(o)),le!==t?(fe=ke(),fe!==t?(x=pe,V=h(),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=ke(),V!==t&&(x=pe,V=h()),pe=V),pe}function ke(){var pe,V,Qe;if(pe=v,V=[],p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m)),Qe!==t)for(;Qe!==t;)V.push(Qe),p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}function ve(){var pe,V,Qe;if(pe=v,V=[],y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b)),Qe!==t)for(;Qe!==t;)V.push(Qe),y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}if(_=n(),_!==t&&v===r.length)return _;throw _!==t&&v{"use strict";function $M(r){return typeof r=="undefined"||r===null}function nfe(r){return typeof r=="object"&&r!==null}function sfe(r){return Array.isArray(r)?r:$M(r)?[]:[r]}function ofe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function ep(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}ep.prototype=Object.create(Error.prototype);ep.prototype.constructor=ep;ep.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};e1.exports=ep});var i1=w((L7e,t1)=>{"use strict";var r1=hc();function RQ(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}RQ.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),r1.repeat(" ",e)+i+a+s+` -`+r1.repeat(" ",e+this.position-n+i.length)+"^"};RQ.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: -`+t)),i};t1.exports=RQ});var ci=w((T7e,n1)=>{"use strict";var s1=tg(),lfe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],cfe=["scalar","sequence","mapping"];function ufe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function gfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(lfe.indexOf(t)===-1)throw new s1('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=ufe(e.styleAliases||null),cfe.indexOf(this.kind)===-1)throw new s1('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}n1.exports=gfe});var pc=w((O7e,o1)=>{"use strict";var a1=hc(),tI=tg(),ffe=ci();function FQ(r,e,t){var i=[];return r.include.forEach(function(n){t=FQ(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function hfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var pfe=ci();A1.exports=new pfe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var u1=w((K7e,c1)=>{"use strict";var dfe=ci();c1.exports=new dfe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var f1=w((U7e,g1)=>{"use strict";var Cfe=ci();g1.exports=new Cfe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var rI=w((H7e,h1)=>{"use strict";var mfe=pc();h1.exports=new mfe({explicit:[l1(),u1(),f1()]})});var d1=w((j7e,p1)=>{"use strict";var Efe=ci();function Ife(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function yfe(){return null}function wfe(r){return r===null}p1.exports=new Efe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Ife,construct:yfe,predicate:wfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var m1=w((G7e,C1)=>{"use strict";var Bfe=ci();function bfe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function Qfe(r){return r==="true"||r==="True"||r==="TRUE"}function Sfe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}C1.exports=new Bfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:bfe,construct:Qfe,predicate:Sfe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var I1=w((Y7e,E1)=>{"use strict";var vfe=hc(),xfe=ci();function kfe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function Pfe(r){return 48<=r&&r<=55}function Dfe(r){return 48<=r&&r<=57}function Rfe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var B1=w((q7e,y1)=>{"use strict";var w1=hc(),Lfe=ci(),Tfe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Ofe(r){return!(r===null||!Tfe.test(r)||r[r.length-1]==="_")}function Mfe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var Kfe=/^[-+]?[0-9]+e/;function Ufe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(w1.isNegativeZero(r))return"-0.0";return t=r.toString(10),Kfe.test(t)?t.replace("e",".e"):t}function Hfe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!=0||w1.isNegativeZero(r))}y1.exports=new Lfe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Ofe,construct:Mfe,predicate:Hfe,represent:Ufe,defaultStyle:"lowercase"})});var NQ=w((J7e,b1)=>{"use strict";var jfe=pc();b1.exports=new jfe({include:[rI()],implicit:[d1(),m1(),I1(),B1()]})});var LQ=w((W7e,Q1)=>{"use strict";var Gfe=pc();Q1.exports=new Gfe({include:[NQ()]})});var k1=w((z7e,S1)=>{"use strict";var Yfe=ci(),v1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),x1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function qfe(r){return r===null?!1:v1.exec(r)!==null||x1.exec(r)!==null}function Jfe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=v1.exec(r),e===null&&(e=x1.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Wfe(r){return r.toISOString()}S1.exports=new Yfe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:qfe,construct:Jfe,instanceOf:Date,represent:Wfe})});var D1=w((_7e,P1)=>{"use strict";var zfe=ci();function _fe(r){return r==="<<"||r===null}P1.exports=new zfe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:_fe})});var N1=w((V7e,R1)=>{"use strict";var dc;try{F1=require,dc=F1("buffer").Buffer}catch(r){}var F1,Vfe=ci(),TQ=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function Xfe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=TQ;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8==0}function Zfe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=TQ,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),dc?dc.from?dc.from(a):new dc(a):a}function $fe(r){var e="",t=0,i,n,s=r.length,o=TQ;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function ehe(r){return dc&&dc.isBuffer(r)}R1.exports=new Vfe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Xfe,construct:Zfe,predicate:ehe,represent:$fe})});var T1=w((X7e,L1)=>{"use strict";var the=ci(),rhe=Object.prototype.hasOwnProperty,ihe=Object.prototype.toString;function nhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var ohe=ci(),ahe=Object.prototype.toString;function Ahe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var che=ci(),uhe=Object.prototype.hasOwnProperty;function ghe(r){if(r===null)return!0;var e,t=r;for(e in t)if(uhe.call(t,e)&&t[e]!==null)return!1;return!0}function fhe(r){return r!==null?r:{}}K1.exports=new che("tag:yaml.org,2002:set",{kind:"mapping",resolve:ghe,construct:fhe})});var ig=w((eXe,H1)=>{"use strict";var hhe=pc();H1.exports=new hhe({include:[LQ()],implicit:[k1(),D1()],explicit:[N1(),T1(),M1(),U1()]})});var G1=w((tXe,j1)=>{"use strict";var phe=ci();function dhe(){return!0}function Che(){}function mhe(){return""}function Ehe(r){return typeof r=="undefined"}j1.exports=new phe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:dhe,construct:Che,predicate:Ehe,represent:mhe})});var q1=w((rXe,Y1)=>{"use strict";var Ihe=ci();function yhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function whe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Bhe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function bhe(r){return Object.prototype.toString.call(r)==="[object RegExp]"}Y1.exports=new Ihe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:yhe,construct:whe,predicate:bhe,represent:Bhe})});var z1=w((iXe,J1)=>{"use strict";var iI;try{W1=require,iI=W1("esprima")}catch(r){typeof window!="undefined"&&(iI=window.esprima)}var W1,Qhe=ci();function She(r){if(r===null)return!1;try{var e="("+r+")",t=iI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function vhe(r){var e="("+r+")",t=iI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function xhe(r){return r.toString()}function khe(r){return Object.prototype.toString.call(r)==="[object Function]"}J1.exports=new Qhe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:She,construct:vhe,predicate:khe,represent:xhe})});var tp=w((nXe,_1)=>{"use strict";var V1=pc();_1.exports=V1.DEFAULT=new V1({include:[ig()],explicit:[G1(),q1(),z1()]})});var pK=w((sXe,rp)=>{"use strict";var Oa=hc(),X1=tg(),Phe=i1(),Z1=ig(),Dhe=tp(),JA=Object.prototype.hasOwnProperty,nI=1,$1=2,eK=3,sI=4,OQ=1,Rhe=2,tK=3,Fhe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Nhe=/[\x85\u2028\u2029]/,Lhe=/[,\[\]\{\}]/,rK=/^(?:!|!!|![a-z\-]+!)$/i,iK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function nK(r){return Object.prototype.toString.call(r)}function Lo(r){return r===10||r===13}function Cc(r){return r===9||r===32}function yn(r){return r===9||r===32||r===10||r===13}function ng(r){return r===44||r===91||r===93||r===123||r===125}function The(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Ohe(r){return r===120?2:r===117?4:r===85?8:0}function Mhe(r){return 48<=r&&r<=57?r-48:-1}function sK(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` -`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function Khe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var oK=new Array(256),aK=new Array(256);for(var sg=0;sg<256;sg++)oK[sg]=sK(sg)?1:0,aK[sg]=sK(sg);function Uhe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||Dhe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function AK(r,e){return new X1(e,new Phe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function dt(r,e){throw AK(r,e)}function oI(r,e){r.onWarning&&r.onWarning.call(null,AK(r,e))}var lK={YAML:function(e,t,i){var n,s,o;e.version!==null&&dt(e,"duplication of %YAML directive"),i.length!==1&&dt(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&dt(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&dt(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&oI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&dt(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],rK.test(n)||dt(e,"ill-formed tag handle (first argument) of the TAG directive"),JA.call(e.tagMap,n)&&dt(e,'there is a previously declared suffix for "'+n+'" tag handle'),iK.test(s)||dt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function WA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Oa.repeat(` -`,e-1))}function Hhe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),yn(h)||ng(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),yn(i))break}else{if(r.position===r.lineStart&&aI(r)||t&&ng(h))break;if(Lo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,ei(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(WA(r,s,o,!1),KQ(r,r.line-l),s=o=r.position,a=!1),Cc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return WA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function jhe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(WA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else Lo(t)?(WA(r,i,n,!0),KQ(r,ei(r,!1,e)),i=n=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);dt(r,"unexpected end of the stream within a single quoted scalar")}function Ghe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return WA(r,t,r.position,!0),r.position++,!0;if(a===92){if(WA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),Lo(a))ei(r,!1,e);else if(a<256&&oK[a])r.result+=aK[a],r.position++;else if((o=Ohe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=The(a))>=0?s=(s<<4)+o:dt(r,"expected hexadecimal character");r.result+=Khe(s),r.position++}else dt(r,"unknown escape sequence");t=i=r.position}else Lo(a)?(WA(r,t,i,!0),KQ(r,ei(r,!1,e)),t=i=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}dt(r,"unexpected end of the stream within a double quoted scalar")}function Yhe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,m,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(ei(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||dt(r,"missed comma between flow collection entries"),p=h=m=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),yn(a)&&(c=u=!0,r.position++,ei(r,!0,e))),i=r.line,ag(r,e,nI,!1,!0),p=r.tag,h=r.result,ei(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),ei(r,!0,e),ag(r,e,nI,!1,!0),m=r.result),g?og(r,s,f,p,h,m):c?s.push(og(r,null,f,p,h,m)):s.push(h),ei(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}dt(r,"unexpected end of the stream within a flow collection")}function qhe(r,e){var t,i,n=OQ,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)OQ===n?n=g===43?tK:Rhe:dt(r,"repeat of a chomping mode identifier");else if((u=Mhe(g))>=0)u===0?dt(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?dt(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Cc(g)){do g=r.input.charCodeAt(++r.position);while(Cc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!Lo(g)&&g!==0)}for(;g!==0;){for(MQ(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),Lo(g)){l++;continue}if(r.lineIndente)&&l!==0)dt(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(ag(r,e,sI,!0,n)&&(p?f=r.result:h=r.result),p||(og(r,c,u,g,f,h,s,o),g=f=h=null),ei(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)dt(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):dt(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):dt(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function Vhe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(ei(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&dt(r,"directive name must not be less than one character in length");o!==0;){for(;Cc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!Lo(o));break}if(Lo(o))break;for(t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&MQ(r),JA.call(lK,i)?lK[i](r,i,n):oI(r,'unknown document directive "'+i+'"')}if(ei(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,ei(r,!0,-1)):s&&dt(r,"directives end mark is expected"),ag(r,r.lineIndent-1,sI,!1,!0),ei(r,!0,-1),r.checkLineBreaks&&Nhe.test(r.input.slice(e,r.position))&&oI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&aI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,ei(r,!0,-1));return}if(r.position{"use strict";var ip=hc(),np=tg(),$he=tp(),epe=ig(),dK=Object.prototype.toString,CK=Object.prototype.hasOwnProperty,tpe=9,sp=10,rpe=13,ipe=32,npe=33,spe=34,mK=35,ope=37,ape=38,Ape=39,lpe=42,EK=44,cpe=45,IK=58,upe=61,gpe=62,fpe=63,hpe=64,yK=91,wK=93,ppe=96,BK=123,dpe=124,bK=125,Ki={};Ki[0]="\\0";Ki[7]="\\a";Ki[8]="\\b";Ki[9]="\\t";Ki[10]="\\n";Ki[11]="\\v";Ki[12]="\\f";Ki[13]="\\r";Ki[27]="\\e";Ki[34]='\\"';Ki[92]="\\\\";Ki[133]="\\N";Ki[160]="\\_";Ki[8232]="\\L";Ki[8233]="\\P";var Cpe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function mpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Ag(o))return AI;a=s>0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?kK:PK:t>9&&xK(r)?AI:c?RK:DK}function Spe(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&Cpe.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Ipe(r,l)}switch(Bpe(e,o,r.indent,s,a)){case kK:return e;case PK:return"'"+e.replace(/'/g,"''")+"'";case DK:return"|"+FK(e,r.indent)+NK(SK(e,n));case RK:return">"+FK(e,r.indent)+NK(SK(bpe(e,s),n));case AI:return'"'+Qpe(e,s)+'"';default:throw new np("impossible error: invalid scalar style")}}()}function FK(r,e){var t=xK(r)?String(e):"",i=r[r.length-1]===` -`,n=i&&(r[r.length-2]===` -`||r===` -`),s=n?"+":i?"":"-";return t+s+` -`}function NK(r){return r[r.length-1]===` -`?r.slice(0,-1):r}function bpe(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` -`);return c=c!==-1?c:r.length,t.lastIndex=c,LK(r.slice(0,c),e)}(),n=r[0]===` -`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+LK(l,e),n=s}return i}function LK(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+r.slice(n,s),n=s+1),o=a;return l+=` -`,r.length-n>e&&o>n?l+=r.slice(n,o)+` -`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Qpe(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=QK((t-55296)*1024+i-56320+65536),s++;continue}n=Ki[t],e+=!n&&Ag(t)?r[s]:n||QK(t)}return e}function vpe(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),!!mc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function Ppe(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new np("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&sp===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=HQ(r,e)),!!mc(r,e+1,u,!0,g)&&(r.dump&&sp===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function TK(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function mc(r,e,t,i,n,s){r.tag=null,r.dump=t,TK(r,t,!1)||TK(r,t,!0);var o=dK.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(Ppe(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(kpe(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(xpe(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(vpe(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&Spe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new np("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function Dpe(r,e){var t=[],i=[],n,s;for(GQ(r,t,i),n=0,s=i.length;n{"use strict";var lI=pK(),KK=MK();function cI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Mr.exports.Type=ci();Mr.exports.Schema=pc();Mr.exports.FAILSAFE_SCHEMA=rI();Mr.exports.JSON_SCHEMA=NQ();Mr.exports.CORE_SCHEMA=LQ();Mr.exports.DEFAULT_SAFE_SCHEMA=ig();Mr.exports.DEFAULT_FULL_SCHEMA=tp();Mr.exports.load=lI.load;Mr.exports.loadAll=lI.loadAll;Mr.exports.safeLoad=lI.safeLoad;Mr.exports.safeLoadAll=lI.safeLoadAll;Mr.exports.dump=KK.dump;Mr.exports.safeDump=KK.safeDump;Mr.exports.YAMLException=tg();Mr.exports.MINIMAL_SCHEMA=rI();Mr.exports.SAFE_SCHEMA=ig();Mr.exports.DEFAULT_SCHEMA=tp();Mr.exports.scan=cI("scan");Mr.exports.parse=cI("parse");Mr.exports.compose=cI("compose");Mr.exports.addConstructor=cI("addConstructor")});var jK=w((AXe,HK)=>{"use strict";var Fpe=UK();HK.exports=Fpe});var YK=w((lXe,GK)=>{"use strict";function Npe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ec(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ec)}Npe(Ec,Error);Ec.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[He]:Ce})))},q=function(R){return R},Y=function(R){return R},$=Zs("correct indentation"),_=" ",ne=gr(" ",!1),ee=function(R){return R.length===KA*Ju},A=function(R){return R.length===(KA+1)*Ju},oe=function(){return KA++,!0},ce=function(){return KA--,!0},Z=function(){return Uu()},O=Zs("pseudostring"),L=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,de=qn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Be=/^[^\r\n\t ,\][{}:#"']/,je=qn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),re=function(){return Uu().replace(/^ *| *$/g,"")},se="--",be=gr("--",!1),he=/^[a-zA-Z\/0-9]/,Fe=qn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ke=/^[^\r\n\t :,]/,ke=qn(["\r",` -`," "," ",":",","],!0,!1),ve="null",pe=gr("null",!1),V=function(){return null},Qe="true",le=gr("true",!1),fe=function(){return!0},gt="false",Ht=gr("false",!1),Mt=function(){return!1},Ei=Zs("string"),jt='"',Qr=gr('"',!1),Oi=function(){return""},Xs=function(R){return R},Un=function(R){return R.join("")},Hn=/^[^"\\\0-\x1F\x7F]/,Sr=qn(['"',"\\",["\0",""],"\x7F"],!0,!1),jn='\\"',fs=gr('\\"',!1),ba=function(){return'"'},DA="\\\\",Nu=gr("\\\\",!1),hs=function(){return"\\"},RA="\\/",Qa=gr("\\/",!1),Lu=function(){return"/"},FA="\\b",NA=gr("\\b",!1),vr=function(){return"\b"},zl="\\f",Tu=gr("\\f",!1),xo=function(){return"\f"},Ou="\\n",Sh=gr("\\n",!1),vh=function(){return` -`},Dr="\\r",Ae=gr("\\r",!1),ko=function(){return"\r"},Gn="\\t",Mu=gr("\\t",!1),St=function(){return" "},_l="\\u",Yn=gr("\\u",!1),ps=function(R,G,Ce,He){return String.fromCharCode(parseInt(`0x${R}${G}${Ce}${He}`))},ds=/^[0-9a-fA-F]/,pt=qn([["0","9"],["a","f"],["A","F"]],!1,!1),Po=Zs("blank space"),lt=/^[ \t]/,mn=qn([" "," "],!1,!1),S=Zs("white space"),Tt=/^[ \t\n\r]/,Ku=qn([" "," ",` -`,"\r"],!1,!1),Vl=`\r -`,xh=gr(`\r -`,!1),kh=` -`,Ph=gr(` -`,!1),Dh="\r",Rh=gr("\r",!1),j=0,wt=0,LA=[{line:1,column:1}],$i=0,Xl=[],$e=0,Sa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Uu(){return r.substring(wt,j)}function yE(){return En(wt,j)}function Fh(R,G){throw G=G!==void 0?G:En(wt,j),$l([Zs(R)],r.substring(wt,j),G)}function wE(R,G){throw G=G!==void 0?G:En(wt,j),Hu(R,G)}function gr(R,G){return{type:"literal",text:R,ignoreCase:G}}function qn(R,G,Ce){return{type:"class",parts:R,inverted:G,ignoreCase:Ce}}function Zl(){return{type:"any"}}function Nh(){return{type:"end"}}function Zs(R){return{type:"other",description:R}}function va(R){var G=LA[R],Ce;if(G)return G;for(Ce=R-1;!LA[Ce];)Ce--;for(G=LA[Ce],G={line:G.line,column:G.column};Ce$i&&($i=j,Xl=[]),Xl.push(R))}function Hu(R,G){return new Ec(R,null,null,G)}function $l(R,G,Ce){return new Ec(Ec.buildMessage(R,G),R,G,Ce)}function $s(){var R;return R=ju(),R}function ec(){var R,G,Ce;for(R=j,G=[],Ce=TA();Ce!==t;)G.push(Ce),Ce=TA();return G!==t&&(wt=R,G=s(G)),R=G,R}function TA(){var R,G,Ce,He,Te;return R=j,G=ka(),G!==t?(r.charCodeAt(j)===45?(Ce=o,j++):(Ce=t,$e===0&&Oe(a)),Ce!==t?(He=Tr(),He!==t?(Te=xa(),Te!==t?(wt=R,G=l(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R}function ju(){var R,G,Ce;for(R=j,G=[],Ce=Gu();Ce!==t;)G.push(Ce),Ce=Gu();return G!==t&&(wt=R,G=c(G)),R=G,R}function Gu(){var R,G,Ce,He,Te,Xe,Et,Rt,Jn;if(R=j,G=Tr(),G===t&&(G=null),G!==t){if(Ce=j,r.charCodeAt(j)===35?(He=u,j++):(He=t,$e===0&&Oe(g)),He!==t){if(Te=[],Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t),Xe!==t)for(;Xe!==t;)Te.push(Xe),Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t);else Te=t;Te!==t?(He=[He,Te],Ce=He):(j=Ce,Ce=t)}else j=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(He=[],Te=to(),Te!==t)for(;Te!==t;)He.push(Te),Te=to();else He=t;He!==t?(wt=R,G=h(),R=G):(j=R,R=t)}else j=R,R=t}else j=R,R=t;if(R===t&&(R=j,G=ka(),G!==t?(Ce=tc(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ka(),G!==t?(Ce=eo(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))){if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t)if(He=Tr(),He!==t)if(Te=BE(),Te!==t){if(Xe=[],Et=to(),Et!==t)for(;Et!==t;)Xe.push(Et),Et=to();else Xe=t;Xe!==t?(wt=R,G=y(Ce,Te),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;else j=R,R=t;else j=R,R=t;if(R===t)if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t){if(He=[],Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t),Te!==t)for(;Te!==t;)He.push(Te),Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t);else He=t;He!==t?(Te=Tr(),Te===t&&(Te=null),Te!==t?(r.charCodeAt(j)===58?(Xe=p,j++):(Xe=t,$e===0&&Oe(m)),Xe!==t?(Et=Tr(),Et===t&&(Et=null),Et!==t?(Rt=xa(),Rt!==t?(wt=R,G=T(Ce,He,Rt),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)}else j=R,R=t;else j=R,R=t}return R}function xa(){var R,G,Ce,He,Te,Xe,Et;if(R=j,G=j,$e++,Ce=j,He=ro(),He!==t?(Te=nt(),Te!==t?(r.charCodeAt(j)===45?(Xe=o,j++):(Xe=t,$e===0&&Oe(a)),Xe!==t?(Et=Tr(),Et!==t?(He=[He,Te,Xe,Et],Ce=He):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t),$e--,Ce!==t?(j=G,G=void 0):G=t,G!==t?(Ce=to(),Ce!==t?(He=Do(),He!==t?(Te=ec(),Te!==t?(Xe=OA(),Xe!==t?(wt=R,G=q(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ro(),G!==t?(Ce=Do(),Ce!==t?(He=ju(),He!==t?(Te=OA(),Te!==t?(wt=R,G=q(He),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))if(R=j,G=rc(),G!==t){if(Ce=[],He=to(),He!==t)for(;He!==t;)Ce.push(He),He=to();else Ce=t;Ce!==t?(wt=R,G=Y(G),R=G):(j=R,R=t)}else j=R,R=t;return R}function ka(){var R,G,Ce;for($e++,R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=ee(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),$e--,R===t&&(G=t,$e===0&&Oe($)),R}function nt(){var R,G,Ce;for(R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=A(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),R}function Do(){var R;return wt=j,R=oe(),R?R=void 0:R=t,R}function OA(){var R;return wt=j,R=ce(),R?R=void 0:R=t,R}function tc(){var R;return R=ic(),R===t&&(R=Lh()),R}function eo(){var R,G,Ce;if(R=ic(),R===t){if(R=j,G=[],Ce=Yu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=Yu();else G=t;G!==t&&(wt=R,G=Z()),R=G}return R}function rc(){var R;return R=Th(),R===t&&(R=bE(),R===t&&(R=ic(),R===t&&(R=Lh()))),R}function BE(){var R;return R=Th(),R===t&&(R=ic(),R===t&&(R=Yu())),R}function Lh(){var R,G,Ce,He,Te,Xe;if($e++,R=j,L.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(de)),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;return $e--,R===t&&(G=t,$e===0&&Oe(O)),R}function Yu(){var R,G,Ce,He,Te;if(R=j,r.substr(j,2)===se?(G=se,j+=2):(G=t,$e===0&&Oe(be)),G===t&&(G=null),G!==t)if(he.test(r.charAt(j))?(Ce=r.charAt(j),j++):(Ce=t,$e===0&&Oe(Fe)),Ce!==t){for(He=[],Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));Te!==t;)He.push(Te),Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));He!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;return R}function Th(){var R,G;return R=j,r.substr(j,4)===ve?(G=ve,j+=4):(G=t,$e===0&&Oe(pe)),G!==t&&(wt=R,G=V()),R=G,R}function bE(){var R,G;return R=j,r.substr(j,4)===Qe?(G=Qe,j+=4):(G=t,$e===0&&Oe(le)),G!==t&&(wt=R,G=fe()),R=G,R===t&&(R=j,r.substr(j,5)===gt?(G=gt,j+=5):(G=t,$e===0&&Oe(Ht)),G!==t&&(wt=R,G=Mt()),R=G),R}function ic(){var R,G,Ce,He;return $e++,R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(r.charCodeAt(j)===34?(Ce=jt,j++):(Ce=t,$e===0&&Oe(Qr)),Ce!==t?(wt=R,G=Oi(),R=G):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(Ce=QE(),Ce!==t?(r.charCodeAt(j)===34?(He=jt,j++):(He=t,$e===0&&Oe(Qr)),He!==t?(wt=R,G=Xs(Ce),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)),$e--,R===t&&(G=t,$e===0&&Oe(Ei)),R}function QE(){var R,G,Ce;if(R=j,G=[],Ce=qu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=qu();else G=t;return G!==t&&(wt=R,G=Un(G)),R=G,R}function qu(){var R,G,Ce,He,Te,Xe;return Hn.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(Sr)),R===t&&(R=j,r.substr(j,2)===jn?(G=jn,j+=2):(G=t,$e===0&&Oe(fs)),G!==t&&(wt=R,G=ba()),R=G,R===t&&(R=j,r.substr(j,2)===DA?(G=DA,j+=2):(G=t,$e===0&&Oe(Nu)),G!==t&&(wt=R,G=hs()),R=G,R===t&&(R=j,r.substr(j,2)===RA?(G=RA,j+=2):(G=t,$e===0&&Oe(Qa)),G!==t&&(wt=R,G=Lu()),R=G,R===t&&(R=j,r.substr(j,2)===FA?(G=FA,j+=2):(G=t,$e===0&&Oe(NA)),G!==t&&(wt=R,G=vr()),R=G,R===t&&(R=j,r.substr(j,2)===zl?(G=zl,j+=2):(G=t,$e===0&&Oe(Tu)),G!==t&&(wt=R,G=xo()),R=G,R===t&&(R=j,r.substr(j,2)===Ou?(G=Ou,j+=2):(G=t,$e===0&&Oe(Sh)),G!==t&&(wt=R,G=vh()),R=G,R===t&&(R=j,r.substr(j,2)===Dr?(G=Dr,j+=2):(G=t,$e===0&&Oe(Ae)),G!==t&&(wt=R,G=ko()),R=G,R===t&&(R=j,r.substr(j,2)===Gn?(G=Gn,j+=2):(G=t,$e===0&&Oe(Mu)),G!==t&&(wt=R,G=St()),R=G,R===t&&(R=j,r.substr(j,2)===_l?(G=_l,j+=2):(G=t,$e===0&&Oe(Yn)),G!==t?(Ce=MA(),Ce!==t?(He=MA(),He!==t?(Te=MA(),Te!==t?(Xe=MA(),Xe!==t?(wt=R,G=ps(Ce,He,Te,Xe),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)))))))))),R}function MA(){var R;return ds.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(pt)),R}function Tr(){var R,G;if($e++,R=[],lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn)),G!==t)for(;G!==t;)R.push(G),lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(Po)),R}function SE(){var R,G;if($e++,R=[],Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku)),G!==t)for(;G!==t;)R.push(G),Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(S)),R}function to(){var R,G,Ce,He,Te,Xe;if(R=j,G=ro(),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)}else j=R,R=t;return R}function ro(){var R;return r.substr(j,2)===Vl?(R=Vl,j+=2):(R=t,$e===0&&Oe(xh)),R===t&&(r.charCodeAt(j)===10?(R=kh,j++):(R=t,$e===0&&Oe(Ph)),R===t&&(r.charCodeAt(j)===13?(R=Dh,j++):(R=t,$e===0&&Oe(Rh)))),R}let Ju=2,KA=0;if(Sa=n(),Sa!==t&&j===r.length)return Sa;throw Sa!==t&&j{"use strict";var Upe=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=Upe(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};JQ.exports=_K;JQ.exports.default=_K});var ZK=w((pXe,XK)=>{XK.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Ic=w(Xn=>{"use strict";var $K=ZK(),To=process.env;Object.defineProperty(Xn,"_vendors",{value:$K.map(function(r){return r.constant})});Xn.name=null;Xn.isPR=null;$K.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return eU(i)});if(Xn[r.constant]=t,t)switch(Xn.name=r.name,typeof r.pr){case"string":Xn.isPR=!!To[r.pr];break;case"object":"env"in r.pr?Xn.isPR=r.pr.env in To&&To[r.pr.env]!==r.pr.ne:"any"in r.pr?Xn.isPR=r.pr.any.some(function(i){return!!To[i]}):Xn.isPR=eU(r.pr);break;default:Xn.isPR=null}});Xn.isCI=!!(To.CI||To.CONTINUOUS_INTEGRATION||To.BUILD_NUMBER||To.RUN_ID||Xn.name);function eU(r){return typeof r=="string"?!!To[r]:Object.keys(r).every(function(e){return To[e]===r[e]})}});var cg={};ft(cg,{KeyRelationship:()=>Bc,applyCascade:()=>fp,base64RegExp:()=>sU,colorStringAlphaRegExp:()=>nU,colorStringRegExp:()=>iU,computeKey:()=>zA,getPrintable:()=>ti,hasExactLength:()=>cU,hasForbiddenKeys:()=>mde,hasKeyRelationship:()=>eS,hasMaxLength:()=>tde,hasMinLength:()=>ede,hasMutuallyExclusiveKeys:()=>Ede,hasRequiredKeys:()=>Cde,hasUniqueItems:()=>rde,isArray:()=>Jpe,isAtLeast:()=>sde,isAtMost:()=>ode,isBase64:()=>pde,isBoolean:()=>Gpe,isDate:()=>qpe,isDict:()=>zpe,isEnum:()=>nn,isHexColor:()=>hde,isISO8601:()=>fde,isInExclusiveRange:()=>Ade,isInInclusiveRange:()=>ade,isInstanceOf:()=>Vpe,isInteger:()=>lde,isJSON:()=>dde,isLiteral:()=>Hpe,isLowerCase:()=>cde,isNegative:()=>ide,isNullable:()=>$pe,isNumber:()=>Ype,isObject:()=>_pe,isOneOf:()=>Xpe,isOptional:()=>Zpe,isPositive:()=>nde,isString:()=>gp,isTuple:()=>Wpe,isUUID4:()=>gde,isUnknown:()=>lU,isUpperCase:()=>ude,iso8601RegExp:()=>$Q,makeCoercionFn:()=>wc,makeSetter:()=>AU,makeTrait:()=>aU,makeValidator:()=>vt,matchesRegExp:()=>hp,plural:()=>hI,pushError:()=>mt,simpleKeyRegExp:()=>rU,uuid4RegExp:()=>oU});function vt({test:r}){return aU(r)()}function ti(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function zA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:rU.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function wc(r,e){return t=>{let i=r[e];return r[e]=t,wc(r,e).bind(null,i)}}function AU(r,e){return t=>{r[e]=t}}function hI(r,e,t){return r===1?e:t}function mt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function Hpe(r){return vt({test:(e,t)=>e!==r?mt(t,`Expected a literal (got ${ti(r)})`):!0})}function nn(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return vt({test:(i,n)=>t.has(i)?!0:mt(n,`Expected a valid enumeration value (got ${ti(i)})`)})}var rU,iU,nU,sU,oU,$Q,aU,lU,gp,jpe,Gpe,Ype,qpe,Jpe,Wpe,zpe,_pe,Vpe,Xpe,fp,Zpe,$pe,ede,tde,cU,rde,ide,nde,sde,ode,ade,Ade,lde,hp,cde,ude,gde,fde,hde,pde,dde,Cde,mde,Ede,Bc,Ide,eS,ys=uge(()=>{rU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,iU=/^#[0-9a-f]{6}$/i,nU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,sU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,oU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,$Q=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,aU=r=>()=>r;lU=()=>vt({test:(r,e)=>!0});gp=()=>vt({test:(r,e)=>typeof r!="string"?mt(e,`Expected a string (got ${ti(r)})`):!0});jpe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Gpe=()=>vt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i=jpe.get(r);if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a boolean (got ${ti(r)})`)}return!0}}),Ype=()=>vt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return mt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a number (got ${ti(r)})`)}return!0}}),qpe=()=>vt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"&&$Q.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch(o){}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return mt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a date (got ${ti(r)})`)}return!0}}),Jpe=(r,{delimiter:e}={})=>vt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return mt(i,`Expected an array (got ${ti(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=cU(r.length);return vt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return mt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return mt(n,`Expected a tuple (got ${ti(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;avt({test:(t,i)=>{if(typeof t!="object"||t===null)return mt(i,`Expected an object (got ${ti(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return vt({test:(i,n)=>{if(typeof i!="object"||i===null)return mt(n,`Expected an object (got ${ti(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:zA(n,l),coercion:wc(i,l)}))&&a:e===null?a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),`Extraneous property (got ${ti(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:AU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Vpe=r=>vt({test:(e,t)=>e instanceof r?!0:mt(t,`Expected an instance of ${r.name} (got ${ti(e)})`)}),Xpe=(r,{exclusive:e=!1}={})=>vt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=r.length;c1?mt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),fp=(r,e)=>vt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)!="undefined"?wc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Zpe=r=>vt({test:(e,t)=>typeof e=="undefined"?!0:r(e,t)}),$pe=r=>vt({test:(e,t)=>e===null?!0:r(e,t)}),ede=r=>vt({test:(e,t)=>e.length>=r?!0:mt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),tde=r=>vt({test:(e,t)=>e.length<=r?!0:mt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),cU=r=>vt({test:(e,t)=>e.length!==r?mt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),rde=({map:r}={})=>vt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;svt({test:(r,e)=>r<=0?!0:mt(e,`Expected to be negative (got ${r})`)}),nde=()=>vt({test:(r,e)=>r>=0?!0:mt(e,`Expected to be positive (got ${r})`)}),sde=r=>vt({test:(e,t)=>e>=r?!0:mt(t,`Expected to be at least ${r} (got ${e})`)}),ode=r=>vt({test:(e,t)=>e<=r?!0:mt(t,`Expected to be at most ${r} (got ${e})`)}),ade=(r,e)=>vt({test:(t,i)=>t>=r&&t<=e?!0:mt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Ade=(r,e)=>vt({test:(t,i)=>t>=r&&tvt({test:(e,t)=>e!==Math.round(e)?mt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:mt(t,`Expected to be a safe integer (got ${e})`)}),hp=r=>vt({test:(e,t)=>r.test(e)?!0:mt(t,`Expected to match the pattern ${r.toString()} (got ${ti(e)})`)}),cde=()=>vt({test:(r,e)=>r!==r.toLowerCase()?mt(e,`Expected to be all-lowercase (got ${r})`):!0}),ude=()=>vt({test:(r,e)=>r!==r.toUpperCase()?mt(e,`Expected to be all-uppercase (got ${r})`):!0}),gde=()=>vt({test:(r,e)=>oU.test(r)?!0:mt(e,`Expected to be a valid UUID v4 (got ${ti(r)})`)}),fde=()=>vt({test:(r,e)=>$Q.test(r)?!1:mt(e,`Expected to be a valid ISO 8601 date string (got ${ti(r)})`)}),hde=({alpha:r=!1})=>vt({test:(e,t)=>(r?iU.test(e):nU.test(e))?!0:mt(t,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)}),pde=()=>vt({test:(r,e)=>sU.test(r)?!0:mt(e,`Expected to be a valid base 64 string (got ${ti(r)})`)}),dde=(r=lU())=>vt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch(n){return mt(t,`Expected to be a valid JSON string (got ${ti(e)})`)}return r(i,t)}}),Cde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?mt(i,`Missing required ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},mde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?mt(i,`Forbidden ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Ede=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?mt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(Bc||(Bc={}));Ide={[Bc.Forbids]:{expect:!1,message:"forbids using"},[Bc.Requires]:{expect:!0,message:"requires using"}},eS=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=Ide[e];return vt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?mt(l,`Property "${r}" ${o.message} ${hI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var kU=w((dZe,xU)=>{"use strict";xU.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var gg=w((CZe,aS)=>{"use strict";var Ode=kU(),PU=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Ode(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};aS.exports=PU;aS.exports.default=PU});var mp=w((EZe,DU)=>{var Mde="2.0.0",Kde=256,Ude=Number.MAX_SAFE_INTEGER||9007199254740991,Hde=16;DU.exports={SEMVER_SPEC_VERSION:Mde,MAX_LENGTH:Kde,MAX_SAFE_INTEGER:Ude,MAX_SAFE_COMPONENT_LENGTH:Hde}});var Ep=w((IZe,RU)=>{var jde=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};RU.exports=jde});var bc=w((VA,FU)=>{var{MAX_SAFE_COMPONENT_LENGTH:AS}=mp(),Gde=Ep();VA=FU.exports={};var Yde=VA.re=[],rt=VA.src=[],it=VA.t={},qde=0,xt=(r,e,t)=>{let i=qde++;Gde(i,e),it[r]=i,rt[i]=e,Yde[i]=new RegExp(e,t?"g":void 0)};xt("NUMERICIDENTIFIER","0|[1-9]\\d*");xt("NUMERICIDENTIFIERLOOSE","[0-9]+");xt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");xt("MAINVERSION",`(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})`);xt("MAINVERSIONLOOSE",`(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})`);xt("PRERELEASEIDENTIFIER",`(?:${rt[it.NUMERICIDENTIFIER]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASEIDENTIFIERLOOSE",`(?:${rt[it.NUMERICIDENTIFIERLOOSE]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASE",`(?:-(${rt[it.PRERELEASEIDENTIFIER]}(?:\\.${rt[it.PRERELEASEIDENTIFIER]})*))`);xt("PRERELEASELOOSE",`(?:-?(${rt[it.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${rt[it.PRERELEASEIDENTIFIERLOOSE]})*))`);xt("BUILDIDENTIFIER","[0-9A-Za-z-]+");xt("BUILD",`(?:\\+(${rt[it.BUILDIDENTIFIER]}(?:\\.${rt[it.BUILDIDENTIFIER]})*))`);xt("FULLPLAIN",`v?${rt[it.MAINVERSION]}${rt[it.PRERELEASE]}?${rt[it.BUILD]}?`);xt("FULL",`^${rt[it.FULLPLAIN]}$`);xt("LOOSEPLAIN",`[v=\\s]*${rt[it.MAINVERSIONLOOSE]}${rt[it.PRERELEASELOOSE]}?${rt[it.BUILD]}?`);xt("LOOSE",`^${rt[it.LOOSEPLAIN]}$`);xt("GTLT","((?:<|>)?=?)");xt("XRANGEIDENTIFIERLOOSE",`${rt[it.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);xt("XRANGEIDENTIFIER",`${rt[it.NUMERICIDENTIFIER]}|x|X|\\*`);xt("XRANGEPLAIN",`[v=\\s]*(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:${rt[it.PRERELEASE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGEPLAINLOOSE",`[v=\\s]*(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:${rt[it.PRERELEASELOOSE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAIN]}$`);xt("XRANGELOOSE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAINLOOSE]}$`);xt("COERCE",`(^|[^\\d])(\\d{1,${AS}})(?:\\.(\\d{1,${AS}}))?(?:\\.(\\d{1,${AS}}))?(?:$|[^\\d])`);xt("COERCERTL",rt[it.COERCE],!0);xt("LONETILDE","(?:~>?)");xt("TILDETRIM",`(\\s*)${rt[it.LONETILDE]}\\s+`,!0);VA.tildeTrimReplace="$1~";xt("TILDE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAIN]}$`);xt("TILDELOOSE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("LONECARET","(?:\\^)");xt("CARETTRIM",`(\\s*)${rt[it.LONECARET]}\\s+`,!0);VA.caretTrimReplace="$1^";xt("CARET",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAIN]}$`);xt("CARETLOOSE",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("COMPARATORLOOSE",`^${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]})$|^$`);xt("COMPARATOR",`^${rt[it.GTLT]}\\s*(${rt[it.FULLPLAIN]})$|^$`);xt("COMPARATORTRIM",`(\\s*)${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]}|${rt[it.XRANGEPLAIN]})`,!0);VA.comparatorTrimReplace="$1$2$3";xt("HYPHENRANGE",`^\\s*(${rt[it.XRANGEPLAIN]})\\s+-\\s+(${rt[it.XRANGEPLAIN]})\\s*$`);xt("HYPHENRANGELOOSE",`^\\s*(${rt[it.XRANGEPLAINLOOSE]})\\s+-\\s+(${rt[it.XRANGEPLAINLOOSE]})\\s*$`);xt("STAR","(<|>)?=?\\s*\\*");xt("GTE0","^\\s*>=\\s*0.0.0\\s*$");xt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var Ip=w((yZe,NU)=>{var Jde=["includePrerelease","loose","rtl"],Wde=r=>r?typeof r!="object"?{loose:!0}:Jde.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};NU.exports=Wde});var yI=w((wZe,LU)=>{var TU=/^[0-9]+$/,OU=(r,e)=>{let t=TU.test(r),i=TU.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rOU(e,r);LU.exports={compareIdentifiers:OU,rcompareIdentifiers:zde}});var Hi=w((BZe,MU)=>{var wI=Ep(),{MAX_LENGTH:KU,MAX_SAFE_INTEGER:BI}=mp(),{re:UU,t:HU}=bc(),_de=Ip(),{compareIdentifiers:yp}=yI(),Bs=class{constructor(e,t){if(t=_de(t),e instanceof Bs){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>KU)throw new TypeError(`version is longer than ${KU} characters`);wI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?UU[HU.LOOSE]:UU[HU.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>BI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>BI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>BI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};MU.exports=Bs});var Qc=w((bZe,jU)=>{var{MAX_LENGTH:Vde}=mp(),{re:GU,t:YU}=bc(),qU=Hi(),Xde=Ip(),Zde=(r,e)=>{if(e=Xde(e),r instanceof qU)return r;if(typeof r!="string"||r.length>Vde||!(e.loose?GU[YU.LOOSE]:GU[YU.FULL]).test(r))return null;try{return new qU(r,e)}catch(i){return null}};jU.exports=Zde});var WU=w((QZe,JU)=>{var $de=Qc(),eCe=(r,e)=>{let t=$de(r,e);return t?t.version:null};JU.exports=eCe});var _U=w((SZe,zU)=>{var tCe=Qc(),rCe=(r,e)=>{let t=tCe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};zU.exports=rCe});var XU=w((vZe,VU)=>{var iCe=Hi(),nCe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new iCe(r,t).inc(e,i).version}catch(n){return null}};VU.exports=nCe});var bs=w((xZe,ZU)=>{var $U=Hi(),sCe=(r,e,t)=>new $U(r,t).compare(new $U(e,t));ZU.exports=sCe});var bI=w((kZe,e2)=>{var oCe=bs(),aCe=(r,e,t)=>oCe(r,e,t)===0;e2.exports=aCe});var i2=w((PZe,t2)=>{var r2=Qc(),ACe=bI(),lCe=(r,e)=>{if(ACe(r,e))return null;{let t=r2(r),i=r2(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};t2.exports=lCe});var s2=w((DZe,n2)=>{var cCe=Hi(),uCe=(r,e)=>new cCe(r,e).major;n2.exports=uCe});var a2=w((RZe,o2)=>{var gCe=Hi(),fCe=(r,e)=>new gCe(r,e).minor;o2.exports=fCe});var l2=w((FZe,A2)=>{var hCe=Hi(),pCe=(r,e)=>new hCe(r,e).patch;A2.exports=pCe});var u2=w((NZe,c2)=>{var dCe=Qc(),CCe=(r,e)=>{let t=dCe(r,e);return t&&t.prerelease.length?t.prerelease:null};c2.exports=CCe});var f2=w((LZe,g2)=>{var mCe=bs(),ECe=(r,e,t)=>mCe(e,r,t);g2.exports=ECe});var p2=w((TZe,h2)=>{var ICe=bs(),yCe=(r,e)=>ICe(r,e,!0);h2.exports=yCe});var QI=w((OZe,d2)=>{var C2=Hi(),wCe=(r,e,t)=>{let i=new C2(r,t),n=new C2(e,t);return i.compare(n)||i.compareBuild(n)};d2.exports=wCe});var E2=w((MZe,m2)=>{var BCe=QI(),bCe=(r,e)=>r.sort((t,i)=>BCe(t,i,e));m2.exports=bCe});var y2=w((KZe,I2)=>{var QCe=QI(),SCe=(r,e)=>r.sort((t,i)=>QCe(i,t,e));I2.exports=SCe});var wp=w((UZe,w2)=>{var vCe=bs(),xCe=(r,e,t)=>vCe(r,e,t)>0;w2.exports=xCe});var SI=w((HZe,B2)=>{var kCe=bs(),PCe=(r,e,t)=>kCe(r,e,t)<0;B2.exports=PCe});var lS=w((jZe,b2)=>{var DCe=bs(),RCe=(r,e,t)=>DCe(r,e,t)!==0;b2.exports=RCe});var vI=w((GZe,Q2)=>{var FCe=bs(),NCe=(r,e,t)=>FCe(r,e,t)>=0;Q2.exports=NCe});var xI=w((YZe,S2)=>{var LCe=bs(),TCe=(r,e,t)=>LCe(r,e,t)<=0;S2.exports=TCe});var cS=w((qZe,v2)=>{var OCe=bI(),MCe=lS(),KCe=wp(),UCe=vI(),HCe=SI(),jCe=xI(),GCe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return OCe(r,t,i);case"!=":return MCe(r,t,i);case">":return KCe(r,t,i);case">=":return UCe(r,t,i);case"<":return HCe(r,t,i);case"<=":return jCe(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};v2.exports=GCe});var k2=w((JZe,x2)=>{var YCe=Hi(),qCe=Qc(),{re:kI,t:PI}=bc(),JCe=(r,e)=>{if(r instanceof YCe)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(kI[PI.COERCE]);else{let i;for(;(i=kI[PI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),kI[PI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;kI[PI.COERCERTL].lastIndex=-1}return t===null?null:qCe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};x2.exports=JCe});var D2=w((WZe,P2)=>{"use strict";P2.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Bp=w((zZe,R2)=>{"use strict";R2.exports=Gt;Gt.Node=Sc;Gt.create=Gt;function Gt(r){var e=this;if(e instanceof Gt||(e=new Gt),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Gt.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Gt.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Gt.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Gt.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Gt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Gt.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var VCe=Bp(),vc=Symbol("max"),Ua=Symbol("length"),fg=Symbol("lengthCalculator"),bp=Symbol("allowStale"),xc=Symbol("maxAge"),Ha=Symbol("dispose"),N2=Symbol("noDisposeOnSet"),yi=Symbol("lruList"),oo=Symbol("cache"),L2=Symbol("updateAgeOnGet"),uS=()=>1,T2=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[vc]=e.max||Infinity,i=e.length||uS;if(this[fg]=typeof i!="function"?uS:i,this[bp]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[xc]=e.maxAge||0,this[Ha]=e.dispose,this[N2]=e.noDisposeOnSet||!1,this[L2]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[vc]=e||Infinity,Qp(this)}get max(){return this[vc]}set allowStale(e){this[bp]=!!e}get allowStale(){return this[bp]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[xc]=e,Qp(this)}get maxAge(){return this[xc]}set lengthCalculator(e){typeof e!="function"&&(e=uS),e!==this[fg]&&(this[fg]=e,this[Ua]=0,this[yi].forEach(t=>{t.length=this[fg](t.value,t.key),this[Ua]+=t.length})),Qp(this)}get lengthCalculator(){return this[fg]}get length(){return this[Ua]}get itemCount(){return this[yi].length}rforEach(e,t){t=t||this;for(let i=this[yi].tail;i!==null;){let n=i.prev;M2(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[yi].head;i!==null;){let n=i.next;M2(this,e,i,t),i=n}}keys(){return this[yi].toArray().map(e=>e.key)}values(){return this[yi].toArray().map(e=>e.value)}reset(){this[Ha]&&this[yi]&&this[yi].length&&this[yi].forEach(e=>this[Ha](e.key,e.value)),this[oo]=new Map,this[yi]=new VCe,this[Ua]=0}dump(){return this[yi].map(e=>DI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[yi]}set(e,t,i){if(i=i||this[xc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[fg](t,e);if(this[oo].has(e)){if(s>this[vc])return hg(this,this[oo].get(e)),!1;let l=this[oo].get(e).value;return this[Ha]&&(this[N2]||this[Ha](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Ua]+=s-l.length,l.length=s,this.get(e),Qp(this),!0}let o=new O2(e,t,s,n,i);return o.length>this[vc]?(this[Ha]&&this[Ha](e,t),!1):(this[Ua]+=o.length,this[yi].unshift(o),this[oo].set(e,this[yi].head),Qp(this),!0)}has(e){if(!this[oo].has(e))return!1;let t=this[oo].get(e).value;return!DI(this,t)}get(e){return gS(this,e,!0)}peek(e){return gS(this,e,!1)}pop(){let e=this[yi].tail;return e?(hg(this,e),e.value):null}del(e){hg(this,this[oo].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[oo].forEach((e,t)=>gS(this,t,!1))}},gS=(r,e,t)=>{let i=r[oo].get(e);if(i){let n=i.value;if(DI(r,n)){if(hg(r,i),!r[bp])return}else t&&(r[L2]&&(i.value.now=Date.now()),r[yi].unshiftNode(i));return n.value}},DI=(r,e)=>{if(!e||!e.maxAge&&!r[xc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[xc]&&t>r[xc]},Qp=r=>{if(r[Ua]>r[vc])for(let e=r[yi].tail;r[Ua]>r[vc]&&e!==null;){let t=e.prev;hg(r,e),e=t}},hg=(r,e)=>{if(e){let t=e.value;r[Ha]&&r[Ha](t.key,t.value),r[Ua]-=t.length,r[oo].delete(t.key),r[yi].removeNode(e)}},O2=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},M2=(r,e,t,i)=>{let n=t.value;DI(r,n)&&(hg(r,t),r[bp]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};F2.exports=T2});var Qs=w((VZe,U2)=>{var pg=class{constructor(e,t){if(t=XCe(t),e instanceof pg)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new pg(e.raw,t);if(e instanceof fS)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!j2(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&rme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=H2.get(i);if(n)return n;let s=this.options.loose,o=s?ji[ki.HYPHENRANGELOOSE]:ji[ki.HYPHENRANGE];e=e.replace(o,sme(this.options.includePrerelease)),zr("hyphen replace",e),e=e.replace(ji[ki.COMPARATORTRIM],$Ce),zr("comparator trim",e,ji[ki.COMPARATORTRIM]),e=e.replace(ji[ki.TILDETRIM],eme),e=e.replace(ji[ki.CARETTRIM],tme),e=e.split(/\s+/).join(" ");let a=s?ji[ki.COMPARATORLOOSE]:ji[ki.COMPARATOR],l=e.split(" ").map(f=>ime(f,this.options)).join(" ").split(/\s+/).map(f=>nme(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new fS(f,this.options)),c=l.length,u=new Map;for(let f of l){if(j2(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return H2.set(i,g),g}intersects(e,t){if(!(e instanceof pg))throw new TypeError("a Range is required");return this.set.some(i=>G2(i,t)&&e.set.some(n=>G2(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new ZCe(e,this.options)}catch(t){return!1}for(let t=0;tr.value==="<0.0.0-0",rme=r=>r.value==="",G2=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},ime=(r,e)=>(zr("comp",r,e),r=lme(r,e),zr("caret",r),r=Ame(r,e),zr("tildes",r),r=cme(r,e),zr("xrange",r),r=ume(r,e),zr("stars",r),r),on=r=>!r||r.toLowerCase()==="x"||r==="*",Ame=(r,e)=>r.trim().split(/\s+/).map(t=>gme(t,e)).join(" "),gme=(r,e)=>{let t=e.loose?ji[ki.TILDELOOSE]:ji[ki.TILDE];return r.replace(t,(i,n,s,o,a)=>{zr("tilde",r,i,n,s,o,a);let l;return on(n)?l="":on(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:on(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(zr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,zr("tilde return",l),l})},lme=(r,e)=>r.trim().split(/\s+/).map(t=>fme(t,e)).join(" "),fme=(r,e)=>{zr("caret",r,e);let t=e.loose?ji[ki.CARETLOOSE]:ji[ki.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{zr("caret",r,n,s,o,a,l);let c;return on(s)?c="":on(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:on(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(zr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(zr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),zr("caret return",c),c})},cme=(r,e)=>(zr("replaceXRanges",r,e),r.split(/\s+/).map(t=>hme(t,e)).join(" ")),hme=(r,e)=>{r=r.trim();let t=e.loose?ji[ki.XRANGELOOSE]:ji[ki.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{zr("xRange",r,i,n,s,o,a,l);let c=on(s),u=c||on(o),g=u||on(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),zr("xRange return",i),i})},ume=(r,e)=>(zr("replaceStars",r,e),r.trim().replace(ji[ki.STAR],"")),nme=(r,e)=>(zr("replaceGTE0",r,e),r.trim().replace(ji[e.includePrerelease?ki.GTE0PRE:ki.GTE0],"")),sme=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(on(i)?t="":on(n)?t=`>=${i}.0.0${r?"-0":""}`:on(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,on(c)?l="":on(u)?l=`<${+c+1}.0.0-0`:on(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),ome=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Sp=w((XZe,Y2)=>{var vp=Symbol("SemVer ANY"),xp=class{static get ANY(){return vp}constructor(e,t){if(t=pme(t),e instanceof xp){if(e.loose===!!t.loose)return e;e=e.value}pS("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===vp?this.value="":this.value=this.operator+this.semver.version,pS("comp",this)}parse(e){let t=this.options.loose?q2[J2.COMPARATORLOOSE]:q2[J2.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new W2(i[2],this.options.loose):this.semver=vp}toString(){return this.value}test(e){if(pS("Comparator.test",e,this.options.loose),this.semver===vp||e===vp)return!0;if(typeof e=="string")try{e=new W2(e,this.options)}catch(t){return!1}return hS(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof xp))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new z2(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new z2(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=hS(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=hS(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};Y2.exports=xp;var pme=Ip(),{re:q2,t:J2}=bc(),hS=cS(),pS=Ep(),W2=Hi(),z2=Qs()});var kp=w((ZZe,_2)=>{var dme=Qs(),Cme=(r,e,t)=>{try{e=new dme(e,t)}catch(i){return!1}return e.test(r)};_2.exports=Cme});var X2=w(($Ze,V2)=>{var mme=Qs(),Eme=(r,e)=>new mme(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));V2.exports=Eme});var $2=w((e$e,Z2)=>{var Ime=Hi(),yme=Qs(),wme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new yme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new Ime(i,t))}),i};Z2.exports=wme});var tH=w((t$e,eH)=>{var Bme=Hi(),bme=Qs(),Qme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new bme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Bme(i,t))}),i};eH.exports=Qme});var nH=w((r$e,rH)=>{var dS=Hi(),Sme=Qs(),iH=wp(),vme=(r,e)=>{r=new Sme(r,e);let t=new dS("0.0.0");if(r.test(t)||(t=new dS("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new dS(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||iH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||iH(t,s))&&(t=s)}return t&&r.test(t)?t:null};rH.exports=vme});var oH=w((i$e,sH)=>{var xme=Qs(),kme=(r,e)=>{try{return new xme(r,e).range||"*"}catch(t){return null}};sH.exports=kme});var RI=w((n$e,aH)=>{var Pme=Hi(),AH=Sp(),{ANY:Dme}=AH,Rme=Qs(),Fme=kp(),lH=wp(),cH=SI(),Nme=xI(),Lme=vI(),Tme=(r,e,t,i)=>{r=new Pme(r,i),e=new Rme(e,i);let n,s,o,a,l;switch(t){case">":n=lH,s=Nme,o=cH,a=">",l=">=";break;case"<":n=cH,s=Lme,o=lH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Fme(r,e,i))return!1;for(let c=0;c{h.semver===Dme&&(h=new AH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};aH.exports=Tme});var gH=w((s$e,uH)=>{var Ome=RI(),Mme=(r,e,t)=>Ome(r,e,">",t);uH.exports=Mme});var hH=w((o$e,fH)=>{var Kme=RI(),Ume=(r,e,t)=>Kme(r,e,"<",t);fH.exports=Ume});var CH=w((a$e,pH)=>{var dH=Qs(),Hme=(r,e,t)=>(r=new dH(r,t),e=new dH(e,t),r.intersects(e));pH.exports=Hme});var EH=w((A$e,mH)=>{var jme=kp(),Gme=bs();mH.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>Gme(u,g,t));for(let u of o)jme(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var yH=Qs(),FI=Sp(),{ANY:CS}=FI,Pp=kp(),mS=bs(),qme=(r,e,t={})=>{if(r===e)return!0;r=new yH(r,t),e=new yH(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=Yme(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},Yme=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===CS){if(e.length===1&&e[0].semver===CS)return!0;t.includePrerelease?r=[new FI(">=0.0.0-0")]:r=[new FI(">=0.0.0")]}if(e.length===1&&e[0].semver===CS){if(t.includePrerelease)return!0;e=[new FI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=wH(n,h,t):h.operator==="<"||h.operator==="<="?s=BH(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=mS(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Pp(h,String(n),t)||s&&!Pp(h,String(s),t))return null;for(let p of e)if(!Pp(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=wH(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!Pp(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=BH(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Pp(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},wH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},BH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};IH.exports=qme});var ri=w((c$e,QH)=>{var ES=bc();QH.exports={re:ES.re,src:ES.src,tokens:ES.t,SEMVER_SPEC_VERSION:mp().SEMVER_SPEC_VERSION,SemVer:Hi(),compareIdentifiers:yI().compareIdentifiers,rcompareIdentifiers:yI().rcompareIdentifiers,parse:Qc(),valid:WU(),clean:_U(),inc:XU(),diff:i2(),major:s2(),minor:a2(),patch:l2(),prerelease:u2(),compare:bs(),rcompare:f2(),compareLoose:p2(),compareBuild:QI(),sort:E2(),rsort:y2(),gt:wp(),lt:SI(),eq:bI(),neq:lS(),gte:vI(),lte:xI(),cmp:cS(),coerce:k2(),Comparator:Sp(),Range:Qs(),satisfies:kp(),toComparators:X2(),maxSatisfying:$2(),minSatisfying:tH(),minVersion:nH(),validRange:oH(),outside:RI(),gtr:gH(),ltr:hH(),intersects:CH(),simplifyRange:EH(),subset:bH()}});var IS=w(NI=>{"use strict";Object.defineProperty(NI,"__esModule",{value:!0});NI.VERSION=void 0;NI.VERSION="9.1.0"});var Yt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof LI=="object"&&LI.exports?LI.exports=e():r.regexpToAst=e()})(typeof self!="undefined"?self:SH,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var m=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:m,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],m=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(m)}},r.prototype.alternative=function(){for(var p=[],m=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(m)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var m;switch(this.popChar()){case"=":m="Lookahead";break;case"!":m="NegativeLookahead";break}a(m);var y=this.disjunction();return this.consumeChar(")"),{type:m,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var m,y=this.idx;switch(this.popChar()){case"*":m={atLeast:0,atMost:Infinity};break;case"+":m={atLeast:1,atMost:Infinity};break;case"?":m={atLeast:0,atMost:1};break;case"{":var b=this.integerIncludingZero();switch(this.popChar()){case"}":m={atLeast:b,atMost:b};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),m={atLeast:b,atMost:v}):m={atLeast:b,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&m===void 0)return;a(m);break}if(!(p===!0&&m===void 0))return a(m),this.peekChar(0)==="?"?(this.consumeChar("?"),m.greedy=!1):m.greedy=!0,m.type="Quantifier",m.loc=this.loc(y),m},r.prototype.atom=function(){var p,m=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(m),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,m=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,m=!0;break;case"s":p=f;break;case"S":p=f,m=!0;break;case"w":p=g;break;case"W":p=g,m=!0;break}return a(p),{type:"Set",value:p,complement:m}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var m=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:m}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],m=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),m=!0);this.isClassAtom();){var y=this.classAtom(),b=y.type==="Character";if(b&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),x=v.type==="Character";if(x){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,m){p.length!==void 0?p.forEach(function(y){m.push(y)}):m.push(p)}function o(p,m){if(p[m]===!0)throw"duplicate flag "+m;p[m]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var m in p){var y=p[m];p.hasOwnProperty(m)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(b){this.visit(b)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var MI=w(dg=>{"use strict";Object.defineProperty(dg,"__esModule",{value:!0});dg.clearRegExpParserCache=dg.getRegExpAst=void 0;var Jme=TI(),OI={},Wme=new Jme.RegExpParser;function zme(r){var e=r.toString();if(OI.hasOwnProperty(e))return OI[e];var t=Wme.pattern(e);return OI[e]=t,t}dg.getRegExpAst=zme;function _me(){OI={}}dg.clearRegExpParserCache=_me});var DH=w(Bn=>{"use strict";var Vme=Bn&&Bn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.canMatchCharCode=Bn.firstCharOptimizedIndices=Bn.getOptimizedStartCodesIndices=Bn.failedOptimizationPrefixMsg=void 0;var vH=TI(),Ss=Yt(),xH=MI(),ja=yS(),kH="Complement Sets are not supported for first char optimization";Bn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function Xme(r,e){e===void 0&&(e=!1);try{var t=(0,xH.getRegExpAst)(r),i=KI(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===kH)e&&(0,Ss.PRINT_WARNING)(""+Bn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,Ss.PRINT_ERROR)(Bn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+r.toString()+` > -`)+(" Using the regexp-to-ast library version: "+vH.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}Bn.getOptimizedStartCodesIndices=Xme;function KI(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=ja.minOptimizationVal)for(var f=u.from>=ja.minOptimizationVal?u.from:ja.minOptimizationVal,h=u.to,p=(0,ja.charCodeToOptimizedIndex)(f),m=(0,ja.charCodeToOptimizedIndex)(h),y=p;y<=m;y++)e[y]=y}}});break;case"Group":KI(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&wS(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,Ss.values)(e)}Bn.firstCharOptimizedIndices=KI;function UI(r,e,t){var i=(0,ja.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&Zme(r,e)}function Zme(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,ja.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,ja.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function PH(r,e){return(0,Ss.find)(r.value,function(t){if(typeof t=="number")return(0,Ss.contains)(e,t);var i=t;return(0,Ss.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function wS(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,Ss.isArray)(r.value)?(0,Ss.every)(r.value,wS):wS(r.value):!1}var $me=function(r){Vme(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,Ss.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?PH(t,this.targetCharCodes)===void 0&&(this.found=!0):PH(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(vH.BaseRegExpVisitor);function eEe(r,e){if(e instanceof RegExp){var t=(0,xH.getRegExpAst)(e),i=new $me(r);return i.visit(t),i.found}else return(0,Ss.find)(e,function(n){return(0,Ss.contains)(r,n.charCodeAt(0))})!==void 0}Bn.canMatchCharCode=eEe});var yS=w(Ze=>{"use strict";var RH=Ze&&Ze.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ze,"__esModule",{value:!0});Ze.charCodeToOptimizedIndex=Ze.minOptimizationVal=Ze.buildLineBreakIssueMessage=Ze.LineTerminatorOptimizedTester=Ze.isShortPattern=Ze.isCustomPattern=Ze.cloneEmptyGroups=Ze.performWarningRuntimeChecks=Ze.performRuntimeChecks=Ze.addStickyFlag=Ze.addStartOfInput=Ze.findUnreachablePatterns=Ze.findModesThatDoNotExist=Ze.findInvalidGroupType=Ze.findDuplicatePatterns=Ze.findUnsupportedFlags=Ze.findStartOfInputAnchor=Ze.findEmptyMatchRegExps=Ze.findEndOfInputAnchor=Ze.findInvalidPatterns=Ze.findMissingPatterns=Ze.validatePatterns=Ze.analyzeTokenTypes=Ze.enableSticky=Ze.disableSticky=Ze.SUPPORT_STICKY=Ze.MODES=Ze.DEFAULT_MODE=void 0;var FH=TI(),Ar=Dp(),Ne=Yt(),Cg=DH(),NH=MI(),Mo="PATTERN";Ze.DEFAULT_MODE="defaultMode";Ze.MODES="modes";Ze.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function tEe(){Ze.SUPPORT_STICKY=!1}Ze.disableSticky=tEe;function rEe(){Ze.SUPPORT_STICKY=!0}Ze.enableSticky=rEe;function nEe(r,e){e=(0,Ne.defaults)(e,{useSticky:Ze.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(v,x){return x()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){iEe()});var i;t("Reject Lexer.NA",function(){i=(0,Ne.reject)(r,function(v){return v[Mo]===Ar.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,Ne.map)(i,function(v){var x=v[Mo];if((0,Ne.isRegExp)(x)){var T=x.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!x.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,Ne.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?bS(x):BS(x)}else{if((0,Ne.isFunction)(x))return n=!0,{exec:x};if((0,Ne.has)(x,"exec"))return n=!0,x;if(typeof x=="string"){if(x.length===1)return x;var q=x.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),Y=new RegExp(q);return e.useSticky?bS(Y):BS(Y)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,Ne.map)(i,function(v){return v.tokenTypeIdx}),a=(0,Ne.map)(i,function(v){var x=v.GROUP;if(x!==Ar.Lexer.SKIPPED){if((0,Ne.isString)(x))return x;if((0,Ne.isUndefined)(x))return!1;throw Error("non exhaustive match")}}),l=(0,Ne.map)(i,function(v){var x=v.LONGER_ALT;if(x){var T=(0,Ne.isArray)(x)?(0,Ne.map)(x,function(q){return(0,Ne.indexOf)(i,q)}):[(0,Ne.indexOf)(i,x)];return T}}),c=(0,Ne.map)(i,function(v){return v.PUSH_MODE}),u=(0,Ne.map)(i,function(v){return(0,Ne.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=OH(e.lineTerminatorCharacters);g=(0,Ne.map)(i,function(x){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ne.map)(i,function(x){if((0,Ne.has)(x,"LINE_BREAKS"))return x.LINE_BREAKS;if(TH(x,v)===!1)return(0,Cg.canMatchCharCode)(v,x.PATTERN)}))});var f,h,p,m;t("Misc Mapping #2",function(){f=(0,Ne.map)(i,QS),h=(0,Ne.map)(s,LH),p=(0,Ne.reduce)(i,function(v,x){var T=x.GROUP;return(0,Ne.isString)(T)&&T!==Ar.Lexer.SKIPPED&&(v[T]=[]),v},{}),m=(0,Ne.map)(s,function(v,x){return{pattern:s[x],longerAlt:l[x],canLineTerminator:g[x],isCustom:f[x],short:h[x],group:a[x],push:c[x],pop:u[x],tokenTypeIdx:o[x],tokenType:i[x]}})});var y=!0,b=[];return e.safeMode||t("First Char Optimization",function(){b=(0,Ne.reduce)(i,function(v,x,T){if(typeof x.PATTERN=="string"){var q=x.PATTERN.charCodeAt(0),Y=vS(q);SS(v,Y,m[T])}else if((0,Ne.isArray)(x.START_CHARS_HINT)){var $;(0,Ne.forEach)(x.START_CHARS_HINT,function(ne){var ee=typeof ne=="string"?ne.charCodeAt(0):ne,A=vS(ee);$!==A&&($=A,SS(v,A,m[T]))})}else if((0,Ne.isRegExp)(x.PATTERN))if(x.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" Unable to analyze < "+x.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var _=(0,Cg.getOptimizedStartCodesIndices)(x.PATTERN,e.ensureOptimizations);(0,Ne.isEmpty)(_)&&(y=!1),(0,Ne.forEach)(_,function(ne){SS(v,ne,m[T])})}else e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" TokenType: <"+x.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){b=(0,Ne.packArray)(b)}),{emptyGroups:p,patternIdxToConfig:m,charCodeToPatternIdxToConfig:b,hasCustom:n,canBeOptimized:y}}Ze.analyzeTokenTypes=nEe;function oEe(r,e){var t=[],i=MH(r);t=t.concat(i.errors);var n=KH(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(sEe(s)),t=t.concat(UH(s)),t=t.concat(HH(s,e)),t=t.concat(jH(s)),t}Ze.validatePatterns=oEe;function sEe(r){var e=[],t=(0,Ne.filter)(r,function(i){return(0,Ne.isRegExp)(i[Mo])});return e=e.concat(GH(t)),e=e.concat(qH(t)),e=e.concat(JH(t)),e=e.concat(WH(t)),e=e.concat(YH(t)),e}function MH(r){var e=(0,Ne.filter)(r,function(n){return!(0,Ne.has)(n,Mo)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:Ar.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findMissingPatterns=MH;function KH(r){var e=(0,Ne.filter)(r,function(n){var s=n[Mo];return!(0,Ne.isRegExp)(s)&&!(0,Ne.isFunction)(s)&&!(0,Ne.has)(s,"exec")&&!(0,Ne.isString)(s)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Ar.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findInvalidPatterns=KH;var aEe=/[^\\][\$]/;function GH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return aEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findEndOfInputAnchor=GH;function YH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n.test("")}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:Ar.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ze.findEmptyMatchRegExps=YH;var AEe=/[^\\[][\^]|^\^/;function qH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return AEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findStartOfInputAnchor=qH;function JH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Ar.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ze.findUnsupportedFlags=JH;function WH(r){var e=[],t=(0,Ne.map)(r,function(s){return(0,Ne.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ne.contains)(e,a)&&a.PATTERN!==Ar.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,Ne.compact)(t);var i=(0,Ne.filter)(t,function(s){return s.length>1}),n=(0,Ne.map)(i,function(s){var o=(0,Ne.map)(s,function(l){return l.name}),a=(0,Ne.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:Ar.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ze.findDuplicatePatterns=WH;function UH(r){var e=(0,Ne.filter)(r,function(i){if(!(0,Ne.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==Ar.Lexer.SKIPPED&&n!==Ar.Lexer.NA&&!(0,Ne.isString)(n)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Ar.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ze.findInvalidGroupType=UH;function HH(r,e){var t=(0,Ne.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,Ne.contains)(e,n.PUSH_MODE)}),i=(0,Ne.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:Ar.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ze.findModesThatDoNotExist=HH;function jH(r){var e=[],t=(0,Ne.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===Ar.Lexer.NA||((0,Ne.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ne.isRegExp)(o)&&cEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ne.forEach)(r,function(i,n){(0,Ne.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:Ar.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ze.findUnreachablePatterns=jH;function lEe(r,e){if((0,Ne.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,Ne.isFunction)(e))return e(r,0,[],{});if((0,Ne.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function cEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ne.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function BS(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ze.addStartOfInput=BS;function bS(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ze.addStickyFlag=bS;function uEe(r,e,t){var i=[];return(0,Ne.has)(r,Ze.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.DEFAULT_MODE+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ne.has)(r,Ze.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.MODES+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.has)(r,Ze.DEFAULT_MODE)&&!(0,Ne.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ze.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.forEach)(r.modes,function(n,s){(0,Ne.forEach)(n,function(o,a){(0,Ne.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:Ar.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ze.performRuntimeChecks=uEe;function gEe(r,e,t){var i=[],n=!1,s=(0,Ne.compact)((0,Ne.flatten)((0,Ne.mapValues)(r.modes,function(l){return l}))),o=(0,Ne.reject)(s,function(l){return l[Mo]===Ar.Lexer.NA}),a=OH(t);return e&&(0,Ne.forEach)(o,function(l){var c=TH(l,a);if(c!==!1){var u=zH(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ne.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Cg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:Ar.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ze.performWarningRuntimeChecks=gEe;function fEe(r){var e={},t=(0,Ne.keys)(r);return(0,Ne.forEach)(t,function(i){var n=r[i];if((0,Ne.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ze.cloneEmptyGroups=fEe;function QS(r){var e=r.PATTERN;if((0,Ne.isRegExp)(e))return!1;if((0,Ne.isFunction)(e))return!0;if((0,Ne.has)(e,"exec"))return!0;if((0,Ne.isString)(e))return!1;throw Error("non exhaustive match")}Ze.isCustomPattern=QS;function LH(r){return(0,Ne.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ze.isShortPattern=LH;Ze.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===Ar.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+r.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ze.buildLineBreakIssueMessage=zH;function OH(r){var e=(0,Ne.map)(r,function(t){return(0,Ne.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function SS(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ze.minOptimizationVal=256;var HI=[];function vS(r){return r255?255+~~(r/255):r}}});var mg=w(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});Ft.isTokenType=Ft.hasExtendingTokensTypesMapProperty=Ft.hasExtendingTokensTypesProperty=Ft.hasCategoriesProperty=Ft.hasShortKeyProperty=Ft.singleAssignCategoriesToksMap=Ft.assignCategoriesMapProp=Ft.assignCategoriesTokensProp=Ft.assignTokenDefaultProps=Ft.expandCategories=Ft.augmentTokenTypes=Ft.tokenIdxToClass=Ft.tokenShortNameIdx=Ft.tokenStructuredMatcherNoCategories=Ft.tokenStructuredMatcher=void 0;var ii=Yt();function hEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Ft.tokenStructuredMatcher=hEe;function pEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Ft.tokenStructuredMatcherNoCategories=pEe;Ft.tokenShortNameIdx=1;Ft.tokenIdxToClass={};function dEe(r){var e=_H(r);VH(e),ZH(e),XH(e),(0,ii.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Ft.augmentTokenTypes=dEe;function _H(r){for(var e=(0,ii.cloneArr)(r),t=r,i=!0;i;){t=(0,ii.compact)((0,ii.flatten)((0,ii.map)(t,function(s){return s.CATEGORIES})));var n=(0,ii.difference)(t,e);e=e.concat(n),(0,ii.isEmpty)(n)?i=!1:t=n}return e}Ft.expandCategories=_H;function VH(r){(0,ii.forEach)(r,function(e){$H(e)||(Ft.tokenIdxToClass[Ft.tokenShortNameIdx]=e,e.tokenTypeIdx=Ft.tokenShortNameIdx++),xS(e)&&!(0,ii.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),xS(e)||(e.CATEGORIES=[]),ej(e)||(e.categoryMatches=[]),tj(e)||(e.categoryMatchesMap={})})}Ft.assignTokenDefaultProps=VH;function XH(r){(0,ii.forEach)(r,function(e){e.categoryMatches=[],(0,ii.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Ft.tokenIdxToClass[i].tokenTypeIdx)})})}Ft.assignCategoriesTokensProp=XH;function ZH(r){(0,ii.forEach)(r,function(e){kS([],e)})}Ft.assignCategoriesMapProp=ZH;function kS(r,e){(0,ii.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,ii.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,ii.contains)(i,t)||kS(i,t)})}Ft.singleAssignCategoriesToksMap=kS;function $H(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.hasShortKeyProperty=$H;function xS(r){return(0,ii.has)(r,"CATEGORIES")}Ft.hasCategoriesProperty=xS;function ej(r){return(0,ii.has)(r,"categoryMatches")}Ft.hasExtendingTokensTypesProperty=ej;function tj(r){return(0,ii.has)(r,"categoryMatchesMap")}Ft.hasExtendingTokensTypesMapProperty=tj;function CEe(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.isTokenType=CEe});var PS=w(jI=>{"use strict";Object.defineProperty(jI,"__esModule",{value:!0});jI.defaultLexerErrorProvider=void 0;jI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Dp=w(kc=>{"use strict";Object.defineProperty(kc,"__esModule",{value:!0});kc.Lexer=kc.LexerDefinitionErrorType=void 0;var ao=yS(),lr=Yt(),mEe=mg(),EEe=PS(),IEe=MI(),yEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(yEe=kc.LexerDefinitionErrorType||(kc.LexerDefinitionErrorType={}));var Rp={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:EEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Rp);var wEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=Rp),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,lr.merge)(Rp,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===Rp.lineTerminatorsPattern)i.config.lineTerminatorsPattern=ao.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Rp.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,lr.isArray)(e)?(s={modes:{}},s.modes[ao.DEFAULT_MODE]=(0,lr.cloneArr)(e),s[ao.DEFAULT_MODE]=ao.DEFAULT_MODE):(o=!1,s=(0,lr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,ao.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,lr.forEach)(s.modes,function(u,g){s.modes[g]=(0,lr.reject)(u,function(f){return(0,lr.isUndefined)(f)})});var a=(0,lr.keys)(s.modes);if((0,lr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.validatePatterns)(u,a))}),(0,lr.isEmpty)(i.lexerDefinitionErrors)){(0,mEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,ao.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,lr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,lr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,lr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,lr.forEach)(i.lexerDefinitionWarning,function(u){(0,lr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(ao.SUPPORT_STICKY?(i.chopInput=lr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=lr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=lr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=lr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=lr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,lr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,lr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,IEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,lr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,lr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,lr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,m,y,b,v,x,T=e,q=T.length,Y=0,$=0,_=this.hasCustom?0:Math.floor(e.length/10),ne=new Array(_),ee=[],A=this.trackStartLines?1:void 0,oe=this.trackStartLines?1:void 0,ce=(0,ao.cloneEmptyGroups)(this.emptyGroups),Z=this.trackStartLines,O=this.config.lineTerminatorsPattern,L=0,de=[],Be=[],je=[],re=[];Object.freeze(re);var se=void 0;function be(){return de}function he(Sr){var jn=(0,ao.charCodeToOptimizedIndex)(Sr),fs=Be[jn];return fs===void 0?re:fs}var Fe=function(Sr){if(je.length===1&&Sr.tokenType.PUSH_MODE===void 0){var jn=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(Sr);ee.push({offset:Sr.startOffset,line:Sr.startLine!==void 0?Sr.startLine:void 0,column:Sr.startColumn!==void 0?Sr.startColumn:void 0,length:Sr.image.length,message:jn})}else{je.pop();var fs=(0,lr.last)(je);de=i.patternIdxToConfig[fs],Be=i.charCodeToPatternIdxToConfig[fs],L=de.length;var ba=i.canModeBeOptimized[fs]&&i.config.safeMode===!1;Be&&ba?se=he:se=be}};function Ke(Sr){je.push(Sr),Be=this.charCodeToPatternIdxToConfig[Sr],de=this.patternIdxToConfig[Sr],L=de.length,L=de.length;var jn=this.canModeBeOptimized[Sr]&&this.config.safeMode===!1;Be&&jn?se=he:se=be}Ke.call(this,t);for(var ke;Yc.length){c=a,u=g,ke=gt;break}}}break}}if(c!==null){if(f=c.length,h=ke.group,h!==void 0&&(p=ke.tokenTypeIdx,m=this.createTokenInstance(c,Y,p,ke.tokenType,A,oe,f),this.handlePayload(m,u),h===!1?$=this.addToken(ne,$,m):ce[h].push(m)),e=this.chopInput(e,f),Y=Y+f,oe=this.computeNewColumn(oe,f),Z===!0&&ke.canLineTerminator===!0){var Mt=0,Ei=void 0,jt=void 0;O.lastIndex=0;do Ei=O.test(c),Ei===!0&&(jt=O.lastIndex-1,Mt++);while(Ei===!0);Mt!==0&&(A=A+Mt,oe=f-jt,this.updateTokenEndLineColumnLocation(m,h,jt,Mt,A,oe,f))}this.handleModes(ke,Fe,Ke,m)}else{for(var Qr=Y,Oi=A,Xs=oe,Un=!1;!Un&&Y <"+e+">");var n=(0,lr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();kc.Lexer=wEe});var XA=w(Pi=>{"use strict";Object.defineProperty(Pi,"__esModule",{value:!0});Pi.tokenMatcher=Pi.createTokenInstance=Pi.EOF=Pi.createToken=Pi.hasTokenLabel=Pi.tokenName=Pi.tokenLabel=void 0;var Ao=Yt(),BEe=Dp(),DS=mg();function bEe(r){return rj(r)?r.LABEL:r.name}Pi.tokenLabel=bEe;function QEe(r){return r.name}Pi.tokenName=QEe;function rj(r){return(0,Ao.isString)(r.LABEL)&&r.LABEL!==""}Pi.hasTokenLabel=rj;var SEe="parent",ij="categories",nj="label",sj="group",oj="push_mode",aj="pop_mode",Aj="longer_alt",lj="line_breaks",cj="start_chars_hint";function uj(r){return vEe(r)}Pi.createToken=uj;function vEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,Ao.isUndefined)(e)||(t.PATTERN=e),(0,Ao.has)(r,SEe))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Ao.has)(r,ij)&&(t.CATEGORIES=r[ij]),(0,DS.augmentTokenTypes)([t]),(0,Ao.has)(r,nj)&&(t.LABEL=r[nj]),(0,Ao.has)(r,sj)&&(t.GROUP=r[sj]),(0,Ao.has)(r,aj)&&(t.POP_MODE=r[aj]),(0,Ao.has)(r,oj)&&(t.PUSH_MODE=r[oj]),(0,Ao.has)(r,Aj)&&(t.LONGER_ALT=r[Aj]),(0,Ao.has)(r,lj)&&(t.LINE_BREAKS=r[lj]),(0,Ao.has)(r,cj)&&(t.START_CHARS_HINT=r[cj]),t}Pi.EOF=uj({name:"EOF",pattern:BEe.Lexer.NA});(0,DS.augmentTokenTypes)([Pi.EOF]);function xEe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Pi.createTokenInstance=xEe;function kEe(r,e){return(0,DS.tokenStructuredMatcher)(r,e)}Pi.tokenMatcher=kEe});var bn=w(Vt=>{"use strict";var Ga=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,"__esModule",{value:!0});Vt.serializeProduction=Vt.serializeGrammar=Vt.Terminal=Vt.Alternation=Vt.RepetitionWithSeparator=Vt.Repetition=Vt.RepetitionMandatoryWithSeparator=Vt.RepetitionMandatory=Vt.Option=Vt.Alternative=Vt.Rule=Vt.NonTerminal=Vt.AbstractProduction=void 0;var fr=Yt(),PEe=XA(),Ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,fr.forEach)(this.definition,function(t){t.accept(e)})},r}();Vt.AbstractProduction=Ko;var gj=function(r){Ga(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(Ko);Vt.NonTerminal=gj;var fj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Rule=fj;var hj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Alternative=hj;var pj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Option=pj;var dj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatory=dj;var Cj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatoryWithSeparator=Cj;var mj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Repetition=mj;var Ej=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionWithSeparator=Ej;var Ij=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(Ko);Vt.Alternation=Ij;var GI=function(){function r(e){this.idx=1,(0,fr.assign)(this,(0,fr.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Vt.Terminal=GI;function DEe(r){return(0,fr.map)(r,Fp)}Vt.serializeGrammar=DEe;function Fp(r){function e(s){return(0,fr.map)(s,Fp)}if(r instanceof gj){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,fr.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof hj)return{type:"Alternative",definition:e(r.definition)};if(r instanceof pj)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof dj)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Cj)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Ej)return{type:"RepetitionWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof mj)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Ij)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof GI){var i={type:"Terminal",name:r.terminalType.name,label:(0,PEe.tokenLabel)(r.terminalType),idx:r.idx};(0,fr.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,fr.isRegExp)(n)?n.source:n),i}else{if(r instanceof fj)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Vt.serializeProduction=Fp});var qI=w(YI=>{"use strict";Object.defineProperty(YI,"__esModule",{value:!0});YI.RestWalker=void 0;var RS=Yt(),Qn=bn(),REe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,RS.forEach)(e.definition,function(n,s){var o=(0,RS.drop)(e.definition,s+1);if(n instanceof Qn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof Qn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof Qn.Alternative)i.walkFlat(n,o,t);else if(n instanceof Qn.Option)i.walkOption(n,o,t);else if(n instanceof Qn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof Qn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof Qn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof Qn.Repetition)i.walkMany(n,o,t);else if(n instanceof Qn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,RS.forEach)(e.definition,function(o){var a=new Qn.Alternative({definition:[o]});n.walk(a,s)})},r}();YI.RestWalker=REe;function yj(r,e,t){var i=[new Qn.Option({definition:[new Qn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Eg=w(JI=>{"use strict";Object.defineProperty(JI,"__esModule",{value:!0});JI.GAstVisitor=void 0;var Uo=bn(),FEe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Uo.NonTerminal:return this.visitNonTerminal(t);case Uo.Alternative:return this.visitAlternative(t);case Uo.Option:return this.visitOption(t);case Uo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Uo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Uo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Uo.Repetition:return this.visitRepetition(t);case Uo.Alternation:return this.visitAlternation(t);case Uo.Terminal:return this.visitTerminal(t);case Uo.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();JI.GAstVisitor=FEe});var Lp=w(Gi=>{"use strict";var NEe=Gi&&Gi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Gi,"__esModule",{value:!0});Gi.collectMethods=Gi.DslMethodsCollectorVisitor=Gi.getProductionDslName=Gi.isBranchingProd=Gi.isOptionalProd=Gi.isSequenceProd=void 0;var Np=Yt(),xr=bn(),LEe=Eg();function TEe(r){return r instanceof xr.Alternative||r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionMandatory||r instanceof xr.RepetitionMandatoryWithSeparator||r instanceof xr.RepetitionWithSeparator||r instanceof xr.Terminal||r instanceof xr.Rule}Gi.isSequenceProd=TEe;function FS(r,e){e===void 0&&(e=[]);var t=r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionWithSeparator;return t?!0:r instanceof xr.Alternation?(0,Np.some)(r.definition,function(i){return FS(i,e)}):r instanceof xr.NonTerminal&&(0,Np.contains)(e,r)?!1:r instanceof xr.AbstractProduction?(r instanceof xr.NonTerminal&&e.push(r),(0,Np.every)(r.definition,function(i){return FS(i,e)})):!1}Gi.isOptionalProd=FS;function OEe(r){return r instanceof xr.Alternation}Gi.isBranchingProd=OEe;function MEe(r){if(r instanceof xr.NonTerminal)return"SUBRULE";if(r instanceof xr.Option)return"OPTION";if(r instanceof xr.Alternation)return"OR";if(r instanceof xr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof xr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof xr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof xr.Repetition)return"MANY";if(r instanceof xr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Gi.getProductionDslName=MEe;var wj=function(r){NEe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(LEe.GAstVisitor);Gi.DslMethodsCollectorVisitor=wj;var WI=new wj;function KEe(r){WI.reset(),r.accept(WI);var e=WI.dslMethods;return WI.reset(),e}Gi.collectMethods=KEe});var LS=w(Ho=>{"use strict";Object.defineProperty(Ho,"__esModule",{value:!0});Ho.firstForTerminal=Ho.firstForBranching=Ho.firstForSequence=Ho.first=void 0;var zI=Yt(),Bj=bn(),NS=Lp();function _I(r){if(r instanceof Bj.NonTerminal)return _I(r.referencedRule);if(r instanceof Bj.Terminal)return Sj(r);if((0,NS.isSequenceProd)(r))return bj(r);if((0,NS.isBranchingProd)(r))return Qj(r);throw Error("non exhaustive match")}Ho.first=_I;function bj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,NS.isOptionalProd)(s),e=e.concat(_I(s)),i=i+1,n=t.length>i;return(0,zI.uniq)(e)}Ho.firstForSequence=bj;function Qj(r){var e=(0,zI.map)(r.definition,function(t){return _I(t)});return(0,zI.uniq)((0,zI.flatten)(e))}Ho.firstForBranching=Qj;function Sj(r){return[r.terminalType]}Ho.firstForTerminal=Sj});var TS=w(VI=>{"use strict";Object.defineProperty(VI,"__esModule",{value:!0});VI.IN=void 0;VI.IN="_~IN~_"});var Dj=w(vs=>{"use strict";var UEe=vs&&vs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(vs,"__esModule",{value:!0});vs.buildInProdFollowPrefix=vs.buildBetweenProdsFollowPrefix=vs.computeAllProdsFollows=vs.ResyncFollowsWalker=void 0;var HEe=qI(),jEe=LS(),vj=Yt(),xj=TS(),GEe=bn(),Pj=function(r){UEe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=kj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new GEe.Alternative({definition:o}),l=(0,jEe.first)(a);this.follows[s]=l},e}(HEe.RestWalker);vs.ResyncFollowsWalker=Pj;function YEe(r){var e={};return(0,vj.forEach)(r,function(t){var i=new Pj(t).startWalking();(0,vj.assign)(e,i)}),e}vs.computeAllProdsFollows=YEe;function kj(r,e){return r.name+e+xj.IN}vs.buildBetweenProdsFollowPrefix=kj;function qEe(r){var e=r.terminalType.name;return e+r.idx+xj.IN}vs.buildInProdFollowPrefix=qEe});var Tp=w(Ya=>{"use strict";Object.defineProperty(Ya,"__esModule",{value:!0});Ya.defaultGrammarValidatorErrorProvider=Ya.defaultGrammarResolverErrorProvider=Ya.defaultParserErrorProvider=void 0;var Ig=XA(),JEe=Yt(),lo=Yt(),OS=bn(),Rj=Lp();Ya.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,Ig.hasTokenLabel)(e),o=s?"--> "+(0,Ig.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,lo.first)(t).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,lo.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,lo.map)(c,function(h){return"["+(0,lo.map)(h,function(p){return(0,Ig.tokenLabel)(p)}).join(", ")+"]"}),g=(0,lo.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,lo.first)(t).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,lo.map)(e,function(u){return"["+(0,lo.map)(u,function(g){return(0,Ig.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ya.defaultParserErrorProvider);Ya.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+r.name+"<-";return t}};Ya.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof OS.Terminal?u.terminalType.name:u instanceof OS.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,lo.first)(e),s=n.idx,o=(0,Rj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,Rj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+r.topLevelRule.name+`> Rule. - has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=JEe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof OS.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Lj=w(ZA=>{"use strict";var WEe=ZA&&ZA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(ZA,"__esModule",{value:!0});ZA.GastRefResolverVisitor=ZA.resolveGrammar=void 0;var zEe=$n(),Fj=Yt(),_Ee=Eg();function VEe(r,e){var t=new Nj(r,e);return t.resolveRefs(),t.errors}ZA.resolveGrammar=VEe;var Nj=function(r){WEe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,Fj.forEach)((0,Fj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:zEe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(_Ee.GAstVisitor);ZA.GastRefResolverVisitor=Nj});var Mp=w(Kr=>{"use strict";var Pc=Kr&&Kr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Kr,"__esModule",{value:!0});Kr.nextPossibleTokensAfter=Kr.possiblePathsFrom=Kr.NextTerminalAfterAtLeastOneSepWalker=Kr.NextTerminalAfterAtLeastOneWalker=Kr.NextTerminalAfterManySepWalker=Kr.NextTerminalAfterManyWalker=Kr.AbstractNextTerminalAfterProductionWalker=Kr.NextAfterTokenWalker=Kr.AbstractNextPossibleTokensWalker=void 0;var Tj=qI(),Kt=Yt(),XEe=LS(),Dt=bn(),Oj=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(Tj.RestWalker);Kr.AbstractNextPossibleTokensWalker=Oj;var ZEe=function(r){Pc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Dt.Alternative({definition:s});this.possibleTokTypes=(0,XEe.first)(o),this.found=!0}},e}(Oj);Kr.NextAfterTokenWalker=ZEe;var Op=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(Tj.RestWalker);Kr.AbstractNextTerminalAfterProductionWalker=Op;var $Ee=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManyWalker=$Ee;var eIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManySepWalker=eIe;var tIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneWalker=tIe;var rIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneSepWalker=rIe;function Mj(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Mj(s(c),e,t);return i.concat(u)}for(;t.length=0;ce--){var Z=b.definition[ce],O={idx:p,def:Z.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y};g.push(O),g.push(o)}else if(b instanceof Dt.Alternative)g.push({idx:p,def:b.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y});else if(b instanceof Dt.Rule)g.push(iIe(b,p,m,y));else throw Error("non exhaustive match")}}return u}Kr.nextPossibleTokensAfter=nIe;function iIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Kp=w(tr=>{"use strict";var Kj=tr&&tr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(tr,"__esModule",{value:!0});tr.areTokenCategoriesNotUsed=tr.isStrictPrefixOfPath=tr.containsPath=tr.getLookaheadPathsForOptionalProd=tr.getLookaheadPathsForOr=tr.lookAheadSequenceFromAlternatives=tr.buildSingleAlternativeLookaheadFunction=tr.buildAlternativesLookAheadFunc=tr.buildLookaheadFuncForOptionalProd=tr.buildLookaheadFuncForOr=tr.getProdType=tr.PROD_TYPE=void 0;var cr=Yt(),Uj=Mp(),sIe=qI(),XI=mg(),$A=bn(),oIe=Eg(),ui;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(ui=tr.PROD_TYPE||(tr.PROD_TYPE={}));function aIe(r){if(r instanceof $A.Option)return ui.OPTION;if(r instanceof $A.Repetition)return ui.REPETITION;if(r instanceof $A.RepetitionMandatory)return ui.REPETITION_MANDATORY;if(r instanceof $A.RepetitionMandatoryWithSeparator)return ui.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof $A.RepetitionWithSeparator)return ui.REPETITION_WITH_SEPARATOR;if(r instanceof $A.Alternation)return ui.ALTERNATION;throw Error("non exhaustive match")}tr.getProdType=aIe;function AIe(r,e,t,i,n,s){var o=Hj(r,e,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o,i,a,n)}tr.buildLookaheadFuncForOr=AIe;function lIe(r,e,t,i,n,s){var o=jj(r,e,n,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o[0],a,i)}tr.buildLookaheadFuncForOptionalProd=lIe;function cIe(r,e,t,i){var n=r.length,s=(0,cr.every)(r,function(l){return(0,cr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,cr.map)(l,function(x){return x.GATE}),u=0;u{"use strict";var HS=Xt&&Xt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Xt,"__esModule",{value:!0});Xt.checkPrefixAlternativesAmbiguities=Xt.validateSomeNonEmptyLookaheadPath=Xt.validateTooManyAlts=Xt.RepetionCollector=Xt.validateAmbiguousAlternationAlternatives=Xt.validateEmptyOrAlternative=Xt.getFirstNoneTerminal=Xt.validateNoLeftRecursion=Xt.validateRuleIsOverridden=Xt.validateRuleDoesNotAlreadyExist=Xt.OccurrenceValidationCollector=Xt.identifyProductionForDuplicates=Xt.validateGrammar=void 0;var nr=Yt(),kr=Yt(),jo=$n(),jS=Lp(),yg=Kp(),pIe=Mp(),co=bn(),GS=Eg();function mIe(r,e,t,i,n){var s=nr.map(r,function(h){return dIe(h,i)}),o=nr.map(r,function(h){return YS(h,h,i)}),a=[],l=[],c=[];(0,kr.every)(o,kr.isEmpty)&&(a=(0,kr.map)(r,function(h){return Wj(h,i)}),l=(0,kr.map)(r,function(h){return zj(h,e,i)}),c=Vj(r,e,i));var u=CIe(r,t,i),g=(0,kr.map)(r,function(h){return _j(h,i)}),f=(0,kr.map)(r,function(h){return Jj(h,r,n,i)});return nr.flatten(s.concat(c,o,a,l,u,g,f))}Xt.validateGrammar=mIe;function dIe(r,e){var t=new $j;r.accept(t);var i=t.allProductions,n=nr.groupBy(i,Xj),s=nr.pick(n,function(a){return a.length>1}),o=nr.map(nr.values(s),function(a){var l=nr.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,jS.getProductionDslName)(l),g={message:c,type:jo.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=Zj(l);return f&&(g.parameter=f),g});return o}function Xj(r){return(0,jS.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+Zj(r)}Xt.identifyProductionForDuplicates=Xj;function Zj(r){return r instanceof co.Terminal?r.terminalType.name:r instanceof co.NonTerminal?r.nonTerminalName:""}var $j=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.OccurrenceValidationCollector=$j;function Jj(r,e,t,i){var n=[],s=(0,kr.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:jo.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Xt.validateRuleDoesNotAlreadyExist=Jj;function EIe(r,e,t){var i=[],n;return nr.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:jo.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Xt.validateRuleIsOverridden=EIe;function YS(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Up(e.definition);if(nr.isEmpty(s))return[];var o=r.name,a=nr.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:jo.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=nr.difference(s,i.concat([r])),c=nr.map(l,function(u){var g=nr.cloneArr(i);return g.push(u),YS(r,u,t,g)});return n.concat(nr.flatten(c))}Xt.validateNoLeftRecursion=YS;function Up(r){var e=[];if(nr.isEmpty(r))return e;var t=nr.first(r);if(t instanceof co.NonTerminal)e.push(t.referencedRule);else if(t instanceof co.Alternative||t instanceof co.Option||t instanceof co.RepetitionMandatory||t instanceof co.RepetitionMandatoryWithSeparator||t instanceof co.RepetitionWithSeparator||t instanceof co.Repetition)e=e.concat(Up(t.definition));else if(t instanceof co.Alternation)e=nr.flatten(nr.map(t.definition,function(o){return Up(o.definition)}));else if(!(t instanceof co.Terminal))throw Error("non exhaustive match");var i=(0,jS.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=nr.drop(r);return e.concat(Up(s))}else return e}Xt.getFirstNoneTerminal=Up;var qS=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(GS.GAstVisitor);function Wj(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){var a=nr.dropRight(o.definition),l=nr.map(a,function(c,u){var g=(0,pIe.nextPossibleTokensAfter)([c],[],null,1);return nr.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:jo.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(nr.compact(l))},[]);return n}Xt.validateEmptyOrAlternative=Wj;function zj(r,e,t){var i=new qS;r.accept(i);var n=i.alternations;n=(0,kr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=nr.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,yg.getLookaheadPathsForOr)(l,r,c,a),g=IIe(u,a,r,t),f=eG(u,a,r,t);return o.concat(g,f)},[]);return s}Xt.validateAmbiguousAlternationAlternatives=zj;var tG=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.RepetionCollector=tG;function _j(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:jo.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Xt.validateTooManyAlts=_j;function Vj(r,e,t){var i=[];return(0,kr.forEach)(r,function(n){var s=new tG;n.accept(s);var o=s.allProductions;(0,kr.forEach)(o,function(a){var l=(0,yg.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,yg.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,kr.isEmpty)((0,kr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:jo.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Xt.validateSomeNonEmptyLookaheadPath=Vj;function IIe(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,kr.forEach)(l,function(u){var g=[c];(0,kr.forEach)(r,function(f,h){c!==h&&(0,yg.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,yg.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=nr.map(s,function(a){var l=(0,kr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:jo.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function eG(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(o,a,l){var c=(0,kr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,kr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,kr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(wg,"__esModule",{value:!0});wg.validateGrammar=wg.resolveGrammar=void 0;var WS=Yt(),yIe=Lj(),wIe=JS(),rG=Tp();function BIe(r){r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarResolverErrorProvider});var e={};return(0,WS.forEach)(r.rules,function(t){e[t.name]=t}),(0,yIe.resolveGrammar)(e,r.errMsgProvider)}wg.resolveGrammar=BIe;function bIe(r){return r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarValidatorErrorProvider}),(0,wIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}wg.validateGrammar=bIe});var Bg=w(Sn=>{"use strict";var Hp=Sn&&Sn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Sn,"__esModule",{value:!0});Sn.EarlyExitException=Sn.NotAllInputParsedException=Sn.NoViableAltException=Sn.MismatchedTokenException=Sn.isRecognitionException=void 0;var QIe=Yt(),nG="MismatchedTokenException",sG="NoViableAltException",oG="EarlyExitException",aG="NotAllInputParsedException",AG=[nG,sG,oG,aG];Object.freeze(AG);function SIe(r){return(0,QIe.contains)(AG,r.name)}Sn.isRecognitionException=SIe;var ZI=function(r){Hp(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),vIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=nG,s}return e}(ZI);Sn.MismatchedTokenException=vIe;var xIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=sG,s}return e}(ZI);Sn.NoViableAltException=xIe;var kIe=function(r){Hp(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=aG,n}return e}(ZI);Sn.NotAllInputParsedException=kIe;var PIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=oG,s}return e}(ZI);Sn.EarlyExitException=PIe});var _S=w(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.attemptInRepetitionRecovery=Yi.Recoverable=Yi.InRuleRecoveryException=Yi.IN_RULE_RECOVERY_EXCEPTION=Yi.EOF_FOLLOW_KEY=void 0;var $I=XA(),xs=Yt(),DIe=Bg(),RIe=TS(),FIe=$n();Yi.EOF_FOLLOW_KEY={};Yi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function zS(r){this.name=Yi.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Yi.InRuleRecoveryException=zS;zS.prototype=Error.prototype;var NIe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,xs.has)(e,"recoveryEnabled")?e.recoveryEnabled:FIe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=lG)},r.prototype.getTokenToInsert=function(e){var t=(0,$I.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),m=new DIe.MismatchedTokenException(p,u,s.LA(0));m.resyncedTokens=(0,xs.dropRight)(l),s.SAVE_ERROR(m)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new zS("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,xs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,xs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,xs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,xs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Yi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,xs.map)(t,function(n,s){return s===0?Yi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,xs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,xs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Yi.EOF_FOLLOW_KEY)return[$I.EOF];var t=e.ruleName+e.idxInCallingRule+RIe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,$I.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,xs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,xs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,xs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Yi.Recoverable=NIe;function lG(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=$I.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Yi.attemptInRepetitionRecovery=lG});var ey=w(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.LooksAhead=void 0;var qa=Kp(),uo=Yt(),cG=$n(),Ja=ey(),Dc=Lp(),TIe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,uo.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:cG.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,uo.has)(e,"maxLookahead")?e.maxLookahead:cG.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,uo.isES2015MapSupported)()?new Map:[],(0,uo.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,uo.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Dc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,uo.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,Dc.getProductionDslName)(g)+f,function(){var h=(0,qa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Ja.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Ja.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,uo.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_IDX,qa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Ja.OPTION_IDX,qa.PROD_TYPE.OPTION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_IDX,qa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_SEP_IDX,qa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_SEP_IDX,qa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,qa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Ja.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,qa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,qa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Ja.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();ty.LooksAhead=TIe});var gG=w(Go=>{"use strict";Object.defineProperty(Go,"__esModule",{value:!0});Go.addNoneTerminalToCst=Go.addTerminalToCst=Go.setNodeLocationFull=Go.setNodeLocationOnlyOffset=void 0;function OIe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(el,"__esModule",{value:!0});el.defineNameProp=el.functionName=el.classNameFromInstance=void 0;var HIe=Yt();function jIe(r){return fG(r.constructor)}el.classNameFromInstance=jIe;var hG="name";function fG(r){var e=r.name;return e||"anonymous"}el.functionName=fG;function GIe(r,e){var t=Object.getOwnPropertyDescriptor(r,hG);return(0,HIe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,hG,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}el.defineNameProp=GIe});var EG=w(Di=>{"use strict";Object.defineProperty(Di,"__esModule",{value:!0});Di.validateRedundantMethods=Di.validateMissingCstMethods=Di.validateVisitor=Di.CstVisitorDefinitionError=Di.createBaseVisitorConstructorWithDefaults=Di.createBaseSemanticVisitorConstructor=Di.defaultVisit=void 0;var ks=Yt(),jp=VS();function pG(r,e){for(var t=(0,ks.keys)(r),i=t.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Di.createBaseSemanticVisitorConstructor=YIe;function qIe(r,e,t){var i=function(){};(0,jp.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,ks.forEach)(e,function(s){n[s]=pG}),i.prototype=n,i.prototype.constructor=i,i}Di.createBaseVisitorConstructorWithDefaults=qIe;var XS;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(XS=Di.CstVisitorDefinitionError||(Di.CstVisitorDefinitionError={}));function dG(r,e){var t=CG(r,e),i=mG(r,e);return t.concat(i)}Di.validateVisitor=dG;function CG(r,e){var t=(0,ks.map)(e,function(i){if(!(0,ks.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+" CST Visitor.",type:XS.MISSING_METHOD,methodName:i}});return(0,ks.compact)(t)}Di.validateMissingCstMethods=CG;var JIe=["constructor","visit","validateVisitor"];function mG(r,e){var t=[];for(var i in r)(0,ks.isFunction)(r[i])&&!(0,ks.contains)(JIe,i)&&!(0,ks.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:XS.REDUNDANT_METHOD,methodName:i});return t}Di.validateRedundantMethods=mG});var yG=w(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.TreeBuilder=void 0;var bg=gG(),ni=Yt(),IG=EG(),WIe=$n(),zIe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,ni.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:WIe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ni.NOOP,this.cstFinallyStateUpdate=ni.NOOP,this.cstPostTerminal=ni.NOOP,this.cstPostNonTerminal=ni.NOOP,this.cstPostRule=ni.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationFull,this.setNodeLocationFromNode=bg.setNodeLocationFull,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=bg.setNodeLocationOnlyOffset,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=ni.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,ni.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,IG.createBaseSemanticVisitorConstructor)(this.className,(0,ni.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,ni.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,IG.createBaseVisitorConstructorWithDefaults)(this.className,(0,ni.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();ry.TreeBuilder=zIe});var BG=w(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.LexerAdapter=void 0;var wG=$n(),_Ie=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):wG.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?wG.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();iy.LexerAdapter=_Ie});var QG=w(ny=>{"use strict";Object.defineProperty(ny,"__esModule",{value:!0});ny.RecognizerApi=void 0;var bG=Yt(),VIe=Bg(),ZS=$n(),XIe=Tp(),ZIe=JS(),$Ie=bn(),eye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG),(0,bG.contains)(this.definedRulesNames,e)){var n=XIe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:ZS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,ZIe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,VIe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,$Ie.serializeGrammar)((0,bG.values)(this.gastProductionsCache))},r}();ny.RecognizerApi=eye});var kG=w(sy=>{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.RecognizerEngine=void 0;var Fr=Yt(),es=ey(),oy=Bg(),SG=Kp(),Qg=Mp(),vG=$n(),tye=_S(),xG=XA(),Gp=mg(),rye=VS(),iye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,rye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Gp.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Fr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,Fr.isArray)(e)){if((0,Fr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,Fr.isArray)(e))this.tokensMap=(0,Fr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Fr.has)(e,"modes")&&(0,Fr.every)((0,Fr.flatten)((0,Fr.values)(e.modes)),Gp.isTokenType)){var i=(0,Fr.flatten)((0,Fr.values)(e.modes)),n=(0,Fr.uniq)(i);this.tokensMap=(0,Fr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Fr.isObject)(e))this.tokensMap=(0,Fr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=xG.EOF;var s=(0,Fr.every)((0,Fr.values)(e),function(o){return(0,Fr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Gp.tokenStructuredMatcherNoCategories:Gp.tokenStructuredMatcher,(0,Gp.augmentTokenTypes)((0,Fr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Fr.has)(i,"resyncEnabled")?i.resyncEnabled:vG.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Fr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:vG.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(es.OR_IDX,t),n=(0,Fr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new oy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,oy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new oy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===tye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Fr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),xG.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();sy.RecognizerEngine=iye});var DG=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.ErrorHandler=void 0;var $S=Bg(),ev=Yt(),PG=Kp(),nye=$n(),sye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,ev.has)(e,"errorMessageProvider")?e.errorMessageProvider:nye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,$S.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,ev.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,ev.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,PG.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new $S.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,PG.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new $S.NoViableAltException(c,this.LA(1),l))},r}();ay.ErrorHandler=sye});var NG=w(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.ContentAssist=void 0;var RG=Mp(),FG=Yt(),oye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,FG.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,RG.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,FG.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new RG.NextAfterTokenWalker(n,e).startWalking();return s},r}();Ay.ContentAssist=oye});var jG=w(ly=>{"use strict";Object.defineProperty(ly,"__esModule",{value:!0});ly.GastRecorder=void 0;var vn=Yt(),Yo=bn(),aye=Dp(),LG=mg(),TG=XA(),Aye=$n(),lye=ey(),cy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(cy);var OG=!0,MG=Math.pow(2,lye.BITS_FOR_OCCURRENCE_IDX)-1,KG=(0,TG.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:aye.Lexer.NA});(0,LG.augmentTokenTypes)([KG]);var UG=(0,TG.createTokenInstance)(KG,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(UG);var cye={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},gye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Aye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Yo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Yp.call(this,Yo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatoryWithSeparator,t,e,OG)},r.prototype.manyInternalRecord=function(e,t){Yp.call(this,Yo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionWithSeparator,t,e,OG)},r.prototype.orInternalRecord=function(e,t){return uye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(uy(t),!e||(0,vn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=e.ruleName,a=new Yo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?cye:cy},r.prototype.consumeInternalRecord=function(e,t,i){if(uy(t),!(0,LG.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=new Yo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),UG},r}();ly.GastRecorder=gye;function Yp(r,e,t,i){i===void 0&&(i=!1),uy(t);var n=(0,vn.peek)(this.recordingProdStack),s=(0,vn.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,vn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),cy}function uye(r,e){var t=this;uy(e);var i=(0,vn.peek)(this.recordingProdStack),n=(0,vn.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Yo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,vn.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,vn.some)(s,function(l){return(0,vn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,vn.forEach)(s,function(l){var c=new Yo.Alternative({definition:[]});o.definition.push(c),(0,vn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,vn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),cy}function HG(r){return r===0?"":""+r}function uy(r){if(r<0||r>MG){var e=new Error("Invalid DSL Method idx value: <"+r+`> - `+("Idx value must be a none negative value smaller than "+(MG+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var YG=w(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.PerformanceTracer=void 0;var GG=Yt(),fye=$n(),hye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,GG.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:Infinity,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=fye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,GG.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();gy.PerformanceTracer=hye});var qG=w(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.applyMixins=void 0;function pye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}fy.applyMixins=pye});var $n=w(Er=>{"use strict";var JG=Er&&Er.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Er,"__esModule",{value:!0});Er.EmbeddedActionsParser=Er.CstParser=Er.Parser=Er.EMPTY_ALT=Er.ParserDefinitionErrorType=Er.DEFAULT_RULE_CONFIG=Er.DEFAULT_PARSER_CONFIG=Er.END_OF_FILE=void 0;var an=Yt(),dye=Dj(),WG=XA(),zG=Tp(),_G=iG(),Cye=_S(),mye=uG(),Eye=yG(),Iye=BG(),yye=QG(),wye=kG(),Bye=DG(),bye=NG(),Qye=jG(),Sye=YG(),vye=qG();Er.END_OF_FILE=(0,WG.createTokenInstance)(WG.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Er.END_OF_FILE);Er.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:zG.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});Er.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var xye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(xye=Er.ParserDefinitionErrorType||(Er.ParserDefinitionErrorType={}));function kye(r){return r===void 0&&(r=void 0),function(){return r}}Er.EMPTY_ALT=kye;var hy=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,an.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,an.has)(t,"skipValidations")?t.skipValidations:Er.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,an.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,an.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,_G.resolveGrammar)({rules:(0,an.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,an.isEmpty)(n)&&e.skipValidations===!1){var s=(0,_G.validateGrammar)({rules:(0,an.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,an.values)(e.tokensMap),errMsgProvider:zG.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,an.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,dye.computeAllProdsFollows)((0,an.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,an.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,an.isEmpty)(e.definitionErrors))throw t=(0,an.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+t.join(` -------------------------------- -`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();Er.Parser=hy;(0,vye.applyMixins)(hy,[Cye.Recoverable,mye.LooksAhead,Eye.TreeBuilder,Iye.LexerAdapter,wye.RecognizerEngine,yye.RecognizerApi,Bye.ErrorHandler,bye.ContentAssist,Qye.GastRecorder,Sye.PerformanceTracer]);var Pye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(hy);Er.CstParser=Pye;var Dye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(hy);Er.EmbeddedActionsParser=Dye});var XG=w(py=>{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.createSyntaxDiagramsCode=void 0;var VG=IS();function Rye(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` - - - - -`,u=` -
-`,g=` - -`,f=` - -`;return a+l+c+u+g+f}py.createSyntaxDiagramsCode=Rye});var eY=w(Ve=>{"use strict";Object.defineProperty(Ve,"__esModule",{value:!0});Ve.Parser=Ve.createSyntaxDiagramsCode=Ve.clearCache=Ve.GAstVisitor=Ve.serializeProduction=Ve.serializeGrammar=Ve.Terminal=Ve.Rule=Ve.RepetitionWithSeparator=Ve.RepetitionMandatoryWithSeparator=Ve.RepetitionMandatory=Ve.Repetition=Ve.Option=Ve.NonTerminal=Ve.Alternative=Ve.Alternation=Ve.defaultLexerErrorProvider=Ve.NoViableAltException=Ve.NotAllInputParsedException=Ve.MismatchedTokenException=Ve.isRecognitionException=Ve.EarlyExitException=Ve.defaultParserErrorProvider=Ve.tokenName=Ve.tokenMatcher=Ve.tokenLabel=Ve.EOF=Ve.createTokenInstance=Ve.createToken=Ve.LexerDefinitionErrorType=Ve.Lexer=Ve.EMPTY_ALT=Ve.ParserDefinitionErrorType=Ve.EmbeddedActionsParser=Ve.CstParser=Ve.VERSION=void 0;var Fye=IS();Object.defineProperty(Ve,"VERSION",{enumerable:!0,get:function(){return Fye.VERSION}});var dy=$n();Object.defineProperty(Ve,"CstParser",{enumerable:!0,get:function(){return dy.CstParser}});Object.defineProperty(Ve,"EmbeddedActionsParser",{enumerable:!0,get:function(){return dy.EmbeddedActionsParser}});Object.defineProperty(Ve,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return dy.ParserDefinitionErrorType}});Object.defineProperty(Ve,"EMPTY_ALT",{enumerable:!0,get:function(){return dy.EMPTY_ALT}});var ZG=Dp();Object.defineProperty(Ve,"Lexer",{enumerable:!0,get:function(){return ZG.Lexer}});Object.defineProperty(Ve,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return ZG.LexerDefinitionErrorType}});var Sg=XA();Object.defineProperty(Ve,"createToken",{enumerable:!0,get:function(){return Sg.createToken}});Object.defineProperty(Ve,"createTokenInstance",{enumerable:!0,get:function(){return Sg.createTokenInstance}});Object.defineProperty(Ve,"EOF",{enumerable:!0,get:function(){return Sg.EOF}});Object.defineProperty(Ve,"tokenLabel",{enumerable:!0,get:function(){return Sg.tokenLabel}});Object.defineProperty(Ve,"tokenMatcher",{enumerable:!0,get:function(){return Sg.tokenMatcher}});Object.defineProperty(Ve,"tokenName",{enumerable:!0,get:function(){return Sg.tokenName}});var Nye=Tp();Object.defineProperty(Ve,"defaultParserErrorProvider",{enumerable:!0,get:function(){return Nye.defaultParserErrorProvider}});var qp=Bg();Object.defineProperty(Ve,"EarlyExitException",{enumerable:!0,get:function(){return qp.EarlyExitException}});Object.defineProperty(Ve,"isRecognitionException",{enumerable:!0,get:function(){return qp.isRecognitionException}});Object.defineProperty(Ve,"MismatchedTokenException",{enumerable:!0,get:function(){return qp.MismatchedTokenException}});Object.defineProperty(Ve,"NotAllInputParsedException",{enumerable:!0,get:function(){return qp.NotAllInputParsedException}});Object.defineProperty(Ve,"NoViableAltException",{enumerable:!0,get:function(){return qp.NoViableAltException}});var Lye=PS();Object.defineProperty(Ve,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return Lye.defaultLexerErrorProvider}});var qo=bn();Object.defineProperty(Ve,"Alternation",{enumerable:!0,get:function(){return qo.Alternation}});Object.defineProperty(Ve,"Alternative",{enumerable:!0,get:function(){return qo.Alternative}});Object.defineProperty(Ve,"NonTerminal",{enumerable:!0,get:function(){return qo.NonTerminal}});Object.defineProperty(Ve,"Option",{enumerable:!0,get:function(){return qo.Option}});Object.defineProperty(Ve,"Repetition",{enumerable:!0,get:function(){return qo.Repetition}});Object.defineProperty(Ve,"RepetitionMandatory",{enumerable:!0,get:function(){return qo.RepetitionMandatory}});Object.defineProperty(Ve,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionMandatoryWithSeparator}});Object.defineProperty(Ve,"RepetitionWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionWithSeparator}});Object.defineProperty(Ve,"Rule",{enumerable:!0,get:function(){return qo.Rule}});Object.defineProperty(Ve,"Terminal",{enumerable:!0,get:function(){return qo.Terminal}});var $G=bn();Object.defineProperty(Ve,"serializeGrammar",{enumerable:!0,get:function(){return $G.serializeGrammar}});Object.defineProperty(Ve,"serializeProduction",{enumerable:!0,get:function(){return $G.serializeProduction}});var Tye=Eg();Object.defineProperty(Ve,"GAstVisitor",{enumerable:!0,get:function(){return Tye.GAstVisitor}});function Oye(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. - It performs no action other than printing this message. - Please avoid using it as it will be completely removed in the future`)}Ve.clearCache=Oye;var Mye=XG();Object.defineProperty(Ve,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return Mye.createSyntaxDiagramsCode}});var Kye=function(){function r(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. -See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return r}();Ve.Parser=Kye});var iY=w((Z$e,tY)=>{var Cy=eY(),Wa=Cy.createToken,rY=Cy.tokenMatcher,tv=Cy.Lexer,Uye=Cy.EmbeddedActionsParser;tY.exports=r=>{let e=Wa({name:"LogicalOperator",pattern:tv.NA}),t=Wa({name:"Or",pattern:/\|/,categories:e}),i=Wa({name:"Xor",pattern:/\^/,categories:e}),n=Wa({name:"And",pattern:/&/,categories:e}),s=Wa({name:"Not",pattern:/!/}),o=Wa({name:"LParen",pattern:/\(/}),a=Wa({name:"RParen",pattern:/\)/}),l=Wa({name:"Query",pattern:r}),u=[Wa({name:"WhiteSpace",pattern:/\s+/,group:tv.SKIPPED}),t,i,n,o,a,s,e,l],g=new tv(u);class f extends Uye{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let y=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let b=y,v=this.CONSUME(e),x=this.SUBRULE2(this.atomicExpression);rY(v,t)?y=T=>b(T)||x(T):rY(v,i)?y=T=>!!(b(T)^x(T)):y=T=>b(T)&&x(T)}),y}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:m}=this.CONSUME(l);return y=>y(m)}},{ALT:()=>{this.CONSUME(s);let m=this.SUBRULE(this.atomicExpression);return y=>!m(y)}}])),this.RULE("parenthesisExpression",()=>{let m;return this.CONSUME(o),m=this.SUBRULE(this.expression),this.CONSUME(a),m}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var nY=w(my=>{var Hye=iY();my.makeParser=(r=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:t}=Hye(r),i=new t;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};my.parse=my.makeParser()});var oY=w((eet,sY)=>{"use strict";sY.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var rv=w((tet,aY)=>{var Jp=oY(),AY={};for(let r of Object.keys(Jp))AY[Jp[r]]=r;var at={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};aY.exports=at;for(let r of Object.keys(at)){if(!("channels"in at[r]))throw new Error("missing channels property: "+r);if(!("labels"in at[r]))throw new Error("missing channel labels property: "+r);if(at[r].labels.length!==at[r].channels)throw new Error("channel and label counts mismatch: "+r);let{channels:e,labels:t}=at[r];delete at[r].channels,delete at[r].labels,Object.defineProperty(at[r],"channels",{value:e}),Object.defineProperty(at[r],"labels",{value:t})}at.rgb.hsl=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(e,t,i),s=Math.max(e,t,i),o=s-n,a,l;s===n?a=0:e===s?a=(t-i)/o:t===s?a=2+(i-e)/o:i===s&&(a=4+(e-t)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};at.rgb.hsv=function(r){let e,t,i,n,s,o=r[0]/255,a=r[1]/255,l=r[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),t=g(a),i=g(l),o===c?n=i-t:a===c?n=1/3+e-i:l===c&&(n=2/3+t-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};at.rgb.hwb=function(r){let e=r[0],t=r[1],i=r[2],n=at.rgb.hsl(r)[0],s=1/255*Math.min(e,Math.min(t,i));return i=1-1/255*Math.max(e,Math.max(t,i)),[n,s*100,i*100]};at.rgb.cmyk=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(1-e,1-t,1-i),s=(1-e-n)/(1-n)||0,o=(1-t-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function jye(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}at.rgb.keyword=function(r){let e=AY[r];if(e)return e;let t=Infinity,i;for(let n of Object.keys(Jp)){let s=Jp[n],o=jye(r,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+t*.3576+i*.1805,s=e*.2126+t*.7152+i*.0722,o=e*.0193+t*.1192+i*.9505;return[n*100,s*100,o*100]};at.rgb.lab=function(r){let e=at.rgb.xyz(r),t=e[0],i=e[1],n=e[2];t/=95.047,i/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(t-i),a=200*(i-n);return[s,o,a]};at.hsl.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n,s,o;if(t===0)return o=i*255,[o,o,o];i<.5?n=i*(1+t):n=i+t-i*t;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};at.hsl.hsv=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=t,s=Math.max(i,.01);i*=2,t*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+t)/2,a=i===0?2*n/(s+n):2*t/(i+t);return[e,a*100,o*100]};at.hsv.rgb=function(r){let e=r[0]/60,t=r[1]/100,i=r[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-t),a=255*i*(1-t*s),l=255*i*(1-t*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};at.hsv.hsl=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=Math.max(i,.01),s,o;o=(2-t)*i;let a=(2-t)*n;return s=t*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};at.hwb.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n=t+i,s;n>1&&(t/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=t+s*(a-t),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=t;break;case 1:c=l,u=a,g=t;break;case 2:c=t,u=a,g=l;break;case 3:c=t,u=l,g=a;break;case 4:c=l,u=t,g=a;break;case 5:c=a,u=t,g=l;break}return[c*255,u*255,g*255]};at.cmyk.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n=r[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,t*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};at.xyz.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n,s,o;return n=e*3.2406+t*-1.5372+i*-.4986,s=e*-.9689+t*1.8758+i*.0415,o=e*.0557+t*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};at.xyz.lab=function(r){let e=r[0],t=r[1],i=r[2];e/=95.047,t/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*t-16,s=500*(e-t),o=200*(t-i);return[n,s,o]};at.lab.xyz=function(r){let e=r[0],t=r[1],i=r[2],n,s,o;s=(e+16)/116,n=t/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};at.lab.lch=function(r){let e=r[0],t=r[1],i=r[2],n;n=Math.atan2(i,t)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(t*t+i*i);return[e,o,n]};at.lch.lab=function(r){let e=r[0],t=r[1],n=r[2]/360*2*Math.PI,s=t*Math.cos(n),o=t*Math.sin(n);return[e,s,o]};at.rgb.ansi16=function(r,e=null){let[t,i,n]=r,s=e===null?at.rgb.hsv(r)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(t/255));return s===2&&(o+=60),o};at.hsv.ansi16=function(r){return at.rgb.ansi16(at.hsv.rgb(r),r[2])};at.rgb.ansi256=function(r){let e=r[0],t=r[1],i=r[2];return e===t&&t===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(i/255*5)};at.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let t=(~~(r>50)+1)*.5,i=(e&1)*t*255,n=(e>>1&1)*t*255,s=(e>>2&1)*t*255;return[i,n,s]};at.ansi256.rgb=function(r){if(r>=232){let s=(r-232)*10+8;return[s,s,s]}r-=16;let e,t=Math.floor(r/36)/5*255,i=Math.floor((e=r%36)/6)/5*255,n=e%6/5*255;return[t,i,n]};at.rgb.hex=function(r){let t=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return"000000".substring(t.length)+t};at.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let t=e[0];e[0].length===3&&(t=t.split("").map(a=>a+a).join(""));let i=parseInt(t,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};at.rgb.hcg=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.max(Math.max(e,t),i),s=Math.min(Math.min(e,t),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(t-i)/o%6:n===t?l=2+(i-e)/o:l=4+(e-t)/o,l/=6,l%=1,[l*360,o*100,a*100]};at.hsl.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=t<.5?2*e*t:2*e*(1-t),n=0;return i<1&&(n=(t-.5*i)/(1-i)),[r[0],i*100,n*100]};at.hsv.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=e*t,n=0;return i<1&&(n=(t-i)/(1-i)),[r[0],i*100,n*100]};at.hcg.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100;if(t===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-t)*i,[(t*n[0]+l)*255,(t*n[1]+l)*255,(t*n[2]+l)*255]};at.hcg.hsv=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e),n=0;return i>0&&(n=e/i),[r[0],n*100,i*100]};at.hcg.hsl=function(r){let e=r[1]/100,i=r[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[r[0],n*100,i*100]};at.hcg.hwb=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e);return[r[0],(i-e)*100,(1-i)*100]};at.hwb.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=1-t,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[r[0],n*100,s*100]};at.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]};at.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]};at.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]};at.gray.hsl=function(r){return[0,0,r[0]]};at.gray.hsv=at.gray.hsl;at.gray.hwb=function(r){return[0,100,r[0]]};at.gray.cmyk=function(r){return[0,0,0,r[0]]};at.gray.lab=function(r){return[r[0],0,0]};at.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};at.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var cY=w((ret,lY)=>{var Ey=rv();function Gye(){let r={},e=Object.keys(Ey);for(let t=e.length,i=0;i{var iv=rv(),Wye=cY(),vg={},zye=Object.keys(iv);function _ye(r){let e=function(...t){let i=t[0];return i==null?i:(i.length>1&&(t=i),r(t))};return"conversion"in r&&(e.conversion=r.conversion),e}function Vye(r){let e=function(...t){let i=t[0];if(i==null)return i;i.length>1&&(t=i);let n=r(t);if(typeof n=="object")for(let s=n.length,o=0;o{vg[r]={},Object.defineProperty(vg[r],"channels",{value:iv[r].channels}),Object.defineProperty(vg[r],"labels",{value:iv[r].labels});let e=Wye(r);Object.keys(e).forEach(i=>{let n=e[i];vg[r][i]=Vye(n),vg[r][i].raw=_ye(n)})});uY.exports=vg});var mY=w((net,fY)=>{"use strict";var hY=(r,e)=>(...t)=>`[${r(...t)+e}m`,pY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};5;${i}m`},dY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},Iy=r=>r,CY=(r,e,t)=>[r,e,t],xg=(r,e,t)=>{Object.defineProperty(r,e,{get:()=>{let i=t();return Object.defineProperty(r,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},nv,kg=(r,e,t,i)=>{nv===void 0&&(nv=gY());let n=i?10:0,s={};for(let[o,a]of Object.entries(nv)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=r(t,n):typeof a=="object"&&(s[l]=r(a[e],n))}return s};function Xye(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[t,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],r.set(s[0],s[1]);Object.defineProperty(e,t,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:r,enumerable:!1}),e.color.close="",e.bgColor.close="",xg(e.color,"ansi",()=>kg(hY,"ansi16",Iy,!1)),xg(e.color,"ansi256",()=>kg(pY,"ansi256",Iy,!1)),xg(e.color,"ansi16m",()=>kg(dY,"rgb",CY,!1)),xg(e.bgColor,"ansi",()=>kg(hY,"ansi16",Iy,!0)),xg(e.bgColor,"ansi256",()=>kg(pY,"ansi256",Iy,!0)),xg(e.bgColor,"ansi16m",()=>kg(dY,"rgb",CY,!0)),e}Object.defineProperty(fY,"exports",{enumerable:!0,get:Xye})});var IY=w((set,EY)=>{"use strict";EY.exports=(r,e=process.argv)=>{let t=r.startsWith("-")?"":r.length===1?"-":"--",i=e.indexOf(t+r),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var Zye=require("os"),wY=require("tty"),Ps=IY(),{env:gi}=process,tl;Ps("no-color")||Ps("no-colors")||Ps("color=false")||Ps("color=never")?tl=0:(Ps("color")||Ps("colors")||Ps("color=true")||Ps("color=always"))&&(tl=1);"FORCE_COLOR"in gi&&(gi.FORCE_COLOR==="true"?tl=1:gi.FORCE_COLOR==="false"?tl=0:tl=gi.FORCE_COLOR.length===0?1:Math.min(parseInt(gi.FORCE_COLOR,10),3));function sv(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function ov(r,e){if(tl===0)return 0;if(Ps("color=16m")||Ps("color=full")||Ps("color=truecolor"))return 3;if(Ps("color=256"))return 2;if(r&&!e&&tl===void 0)return 0;let t=tl||0;if(gi.TERM==="dumb")return t;if(process.platform==="win32"){let i=Zye.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in gi)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in gi)||gi.CI_NAME==="codeship"?1:t;if("TEAMCITY_VERSION"in gi)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(gi.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in gi)return 1;if(gi.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in gi){let i=parseInt((gi.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(gi.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(gi.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(gi.TERM)||"COLORTERM"in gi?1:t}function $ye(r){let e=ov(r,r&&r.isTTY);return sv(e)}yY.exports={supportsColor:$ye,stdout:sv(ov(!0,wY.isatty(1))),stderr:sv(ov(!0,wY.isatty(2)))}});var QY=w((aet,bY)=>{"use strict";var ewe=(r,e,t)=>{let i=r.indexOf(e);if(i===-1)return r;let n=e.length,s=0,o="";do o+=r.substr(s,i-s)+e+t,s=i+n,i=r.indexOf(e,s);while(i!==-1);return o+=r.substr(s),o},twe=(r,e,t,i)=>{let n=0,s="";do{let o=r[i-1]==="\r";s+=r.substr(n,(o?i-1:i)-n)+e+(o?`\r -`:` -`)+t,n=i+1,i=r.indexOf(` -`,n)}while(i!==-1);return s+=r.substr(n),s};bY.exports={stringReplaceAll:ewe,stringEncaseCRLFWithFirstIndex:twe}});var PY=w((Aet,SY)=>{"use strict";var rwe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,vY=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,iwe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,nwe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,swe=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function xY(r){let e=r[0]==="u",t=r[1]==="{";return e&&!t&&r.length===5||r[0]==="x"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&t?String.fromCodePoint(parseInt(r.slice(2,-1),16)):swe.get(r)||r}function owe(r,e){let t=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))t.push(o);else if(n=s.match(iwe))t.push(n[2].replace(nwe,(a,l,c)=>l?xY(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${r}')`)}return t}function awe(r){vY.lastIndex=0;let e=[],t;for(;(t=vY.exec(r))!==null;){let i=t[1];if(t[2]){let n=owe(i,t[2]);e.push([i].concat(n))}else e.push([i])}return e}function kY(r,e){let t={};for(let n of e)for(let s of n.styles)t[s[0]]=n.inverse?null:s.slice(1);let i=r;for(let[n,s]of Object.entries(t))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}SY.exports=(r,e)=>{let t=[],i=[],n=[];if(e.replace(rwe,(s,o,a,l,c,u)=>{if(o)n.push(xY(o));else if(l){let g=n.join("");n=[],i.push(t.length===0?g:kY(r,t)(g)),t.push({inverse:a,styles:awe(l)})}else if(c){if(t.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(kY(r,t)(n.join(""))),n=[],t.pop()}else n.push(u)}),i.push(n.join("")),t.length>0){let s=`Chalk template literal is missing ${t.length} closing bracket${t.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var uv=w((cet,DY)=>{"use strict";var Wp=mY(),{stdout:av,stderr:Av}=BY(),{stringReplaceAll:Awe,stringEncaseCRLFWithFirstIndex:lwe}=QY(),RY=["ansi","ansi","ansi256","ansi16m"],Pg=Object.create(null),cwe=(r,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let t=av?av.level:0;r.level=e.level===void 0?t:e.level},FY=class{constructor(e){return NY(e)}},NY=r=>{let e={};return cwe(e,r),e.template=(...t)=>uwe(e.template,...t),Object.setPrototypeOf(e,yy.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=FY,e.template};function yy(r){return NY(r)}for(let[r,e]of Object.entries(Wp))Pg[r]={get(){let t=wy(this,lv(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:t}),t}};Pg.visible={get(){let r=wy(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:r}),r}};var LY=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let r of LY)Pg[r]={get(){let{level:e}=this;return function(...t){let i=lv(Wp.color[RY[e]][r](...t),Wp.color.close,this._styler);return wy(this,i,this._isEmpty)}}};for(let r of LY){let e="bg"+r[0].toUpperCase()+r.slice(1);Pg[e]={get(){let{level:t}=this;return function(...i){let n=lv(Wp.bgColor[RY[t]][r](...i),Wp.bgColor.close,this._styler);return wy(this,n,this._isEmpty)}}}}var gwe=Object.defineProperties(()=>{},te(N({},Pg),{level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}})),lv=(r,e,t)=>{let i,n;return t===void 0?(i=r,n=e):(i=t.openAll+r,n=e+t.closeAll),{open:r,close:e,openAll:i,closeAll:n,parent:t}},wy=(r,e,t)=>{let i=(...n)=>fwe(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=gwe,i._generator=r,i._styler=e,i._isEmpty=t,i},fwe=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?"":e;let t=r._styler;if(t===void 0)return e;let{openAll:i,closeAll:n}=t;if(e.indexOf("")!==-1)for(;t!==void 0;)e=Awe(e,t.close,t.open),t=t.parent;let s=e.indexOf(` -`);return s!==-1&&(e=lwe(e,n,i,s)),i+e+n},cv,uwe=(r,...e)=>{let[t]=e;if(!Array.isArray(t))return e.join(" ");let i=e.slice(1),n=[t.raw[0]];for(let s=1;s{"use strict";Ds.isInteger=r=>typeof r=="number"?Number.isInteger(r):typeof r=="string"&&r.trim()!==""?Number.isInteger(Number(r)):!1;Ds.find=(r,e)=>r.nodes.find(t=>t.type===e);Ds.exceedsLimit=(r,e,t=1,i)=>i===!1||!Ds.isInteger(r)||!Ds.isInteger(e)?!1:(Number(e)-Number(r))/Number(t)>=i;Ds.escapeNode=(r,e=0,t)=>{let i=r.nodes[e];!i||(t&&i.type===t||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};Ds.encloseBrace=r=>r.type!=="brace"?!1:r.commas>>0+r.ranges>>0==0?(r.invalid=!0,!0):!1;Ds.isInvalidBrace=r=>r.type!=="brace"?!1:r.invalid===!0||r.dollar?!0:r.commas>>0+r.ranges>>0==0||r.open!==!0||r.close!==!0?(r.invalid=!0,!0):!1;Ds.isOpenOrClose=r=>r.type==="open"||r.type==="close"?!0:r.open===!0||r.close===!0;Ds.reduce=r=>r.reduce((e,t)=>(t.type==="text"&&e.push(t.value),t.type==="range"&&(t.type="text"),e),[]);Ds.flatten=(...r)=>{let e=[],t=i=>{for(let n=0;n{"use strict";var OY=By();TY.exports=(r,e={})=>{let t=(i,n={})=>{let s=e.escapeInvalid&&OY.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&OY.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=t(l);return a};return t(r)}});var KY=w((fet,MY)=>{"use strict";MY.exports=function(r){return typeof r=="number"?r-r==0:typeof r=="string"&&r.trim()!==""?Number.isFinite?Number.isFinite(+r):isFinite(+r):!1}});var zY=w((het,UY)=>{"use strict";var HY=KY(),Rc=(r,e,t)=>{if(HY(r)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||r===e)return String(r);if(HY(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=N({relaxZeros:!0},t);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=r+":"+e+"="+n+s+o+a;if(Rc.cache.hasOwnProperty(l))return Rc.cache[l].result;let c=Math.min(r,e),u=Math.max(r,e);if(Math.abs(c-u)===1){let m=r+"|"+e;return i.capture?`(${m})`:i.wrap===!1?m:`(?:${m})`}let g=GY(r)||GY(e),f={min:r,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let m=u<0?Math.abs(u):1;p=jY(m,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=jY(c,u,f,i)),f.negatives=p,f.positives=h,f.result=hwe(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Rc.cache[l]=f,f.result};function hwe(r,e,t){let i=gv(r,e,"-",!1,t)||[],n=gv(e,r,"",!1,t)||[],s=gv(r,e,"-?",!0,t)||[];return i.concat(s).concat(n).join("|")}function dwe(r,e){let t=1,i=1,n=YY(r,t),s=new Set([e]);for(;r<=n&&n<=e;)s.add(n),t+=1,n=YY(r,t);for(n=qY(e+1,i)-1;r1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+JY(a.count),o=c+1;continue}t.isPadded&&(g=Iwe(c,t,i)),u.string=g+u.pattern+JY(u.count),s.push(u),o=c+1,a=u}return s}function gv(r,e,t,i,n){let s=[];for(let o of r){let{string:a}=o;!i&&!WY(e,"string",a)&&s.push(t+a),i&&WY(e,"string",a)&&s.push(t+a)}return s}function Cwe(r,e){let t=[];for(let i=0;ie?1:e>r?-1:0}function WY(r,e,t){return r.some(i=>i[e]===t)}function YY(r,e){return Number(String(r).slice(0,-e)+"9".repeat(e))}function qY(r,e){return r-r%Math.pow(10,e)}function JY(r){let[e=0,t=""]=r;return t||e>1?`{${e+(t?","+t:"")}}`:""}function mwe(r,e,t){return`[${r}${e-r==1?"":"-"}${e}]`}function GY(r){return/^-?(0+)\d/.test(r)}function Iwe(r,e,t){if(!e.isPadded)return r;let i=Math.abs(e.maxLen-String(r).length),n=t.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}Rc.cache={};Rc.clearCache=()=>Rc.cache={};UY.exports=Rc});var pv=w((pet,_Y)=>{"use strict";var ywe=require("util"),VY=zY(),XY=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),wwe=r=>e=>r===!0?Number(e):String(e),fv=r=>typeof r=="number"||typeof r=="string"&&r!=="",_p=r=>Number.isInteger(+r),hv=r=>{let e=`${r}`,t=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++t]==="0";);return t>0},Bwe=(r,e,t)=>typeof r=="string"||typeof e=="string"?!0:t.stringify===!0,bwe=(r,e,t)=>{if(e>0){let i=r[0]==="-"?"-":"";i&&(r=r.slice(1)),r=i+r.padStart(i?e-1:e,"0")}return t===!1?String(r):r},ZY=(r,e)=>{let t=r[0]==="-"?"-":"";for(t&&(r=r.slice(1),e--);r.length{r.negatives.sort((o,a)=>oa?1:0),r.positives.sort((o,a)=>oa?1:0);let t=e.capture?"":"?:",i="",n="",s;return r.positives.length&&(i=r.positives.join("|")),r.negatives.length&&(n=`-(${t}${r.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${t}${s})`:s},$Y=(r,e,t,i)=>{if(t)return VY(r,e,N({wrap:!1},i));let n=String.fromCharCode(r);if(r===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},eq=(r,e,t)=>{if(Array.isArray(r)){let i=t.wrap===!0,n=t.capture?"":"?:";return i?`(${n}${r.join("|")})`:r.join("|")}return VY(r,e,t)},tq=(...r)=>new RangeError("Invalid range arguments: "+ywe.inspect(...r)),rq=(r,e,t)=>{if(t.strictRanges===!0)throw tq([r,e]);return[]},Swe=(r,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${r}" to be a number`);return[]},vwe=(r,e,t=1,i={})=>{let n=Number(r),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw tq([r,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(r),l=String(e),c=String(t);t=Math.max(Math.abs(t),1);let u=hv(a)||hv(l)||hv(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Bwe(r,e,i)===!1,h=i.transform||wwe(f);if(i.toRegex&&t===1)return $Y(ZY(r,g),ZY(e,g),!0,i);let p={negatives:[],positives:[]},m=v=>p[v<0?"negatives":"positives"].push(Math.abs(v)),y=[],b=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&t>1?m(n):y.push(bwe(h(n,b),g,f)),n=o?n-t:n+t,b++;return i.toRegex===!0?t>1?Qwe(p,i):eq(y,null,N({wrap:!1},i)):y},xwe=(r,e,t=1,i={})=>{if(!_p(r)&&r.length>1||!_p(e)&&e.length>1)return rq(r,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${r}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&t===1)return $Y(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-t:s+t,g++;return i.toRegex===!0?eq(u,null,{wrap:!1,options:i}):u},Qy=(r,e,t,i={})=>{if(e==null&&fv(r))return[r];if(!fv(r)||!fv(e))return rq(r,e,i);if(typeof t=="function")return Qy(r,e,1,{transform:t});if(XY(t))return Qy(r,e,0,t);let n=N({},i);return n.capture===!0&&(n.wrap=!0),t=t||n.step||1,_p(t)?_p(r)&&_p(e)?vwe(r,e,t,n):xwe(r,e,Math.max(Math.abs(t),1),n):t!=null&&!XY(t)?Swe(t,n):Qy(r,e,1,t)};_Y.exports=Qy});var sq=w((det,iq)=>{"use strict";var kwe=pv(),nq=By(),Pwe=(r,e={})=>{let t=(i,n={})=>{let s=nq.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=nq.reduce(i.nodes),g=kwe(...u,te(N({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=t(u,i);return c};return t(r)};iq.exports=Pwe});var Aq=w((Cet,oq)=>{"use strict";var Dwe=pv(),aq=by(),Dg=By(),Fc=(r="",e="",t=!1)=>{let i=[];if(r=[].concat(r),e=[].concat(e),!e.length)return r;if(!r.length)return t?Dg.flatten(e).map(n=>`{${n}}`):e;for(let n of r)if(Array.isArray(n))for(let s of n)i.push(Fc(s,e,t));else for(let s of e)t===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?Fc(n,s,t):n+s);return Dg.flatten(i)},Rwe=(r,e={})=>{let t=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(Fc(a.pop(),aq(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(Fc(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=Dg.reduce(n.nodes);if(Dg.exceedsLimit(...g,e.step,t))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=Dwe(...g,e);f.length===0&&(f=aq(n,e)),a.push(Fc(a.pop(),f)),n.nodes=[];return}let l=Dg.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";lq.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` -`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var pq=w((Eet,uq)=>{"use strict";var Fwe=by(),{MAX_LENGTH:gq,CHAR_BACKSLASH:dv,CHAR_BACKTICK:Nwe,CHAR_COMMA:Lwe,CHAR_DOT:Twe,CHAR_LEFT_PARENTHESES:Owe,CHAR_RIGHT_PARENTHESES:Mwe,CHAR_LEFT_CURLY_BRACE:Kwe,CHAR_RIGHT_CURLY_BRACE:Uwe,CHAR_LEFT_SQUARE_BRACKET:fq,CHAR_RIGHT_SQUARE_BRACKET:hq,CHAR_DOUBLE_QUOTE:Hwe,CHAR_SINGLE_QUOTE:jwe,CHAR_NO_BREAK_SPACE:Gwe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Ywe}=cq(),qwe=(r,e={})=>{if(typeof r!="string")throw new TypeError("Expected a string");let t=e||{},i=typeof t.maxLength=="number"?Math.min(gq,t.maxLength):gq;if(r.length>i)throw new SyntaxError(`Input length (${r.length}), exceeds max characters (${i})`);let n={type:"root",input:r,nodes:[]},s=[n],o=n,a=n,l=0,c=r.length,u=0,g=0,f,h={},p=()=>r[u++],m=y=>{if(y.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&y.type==="text"){a.value+=y.value;return}return o.nodes.push(y),y.parent=o,y.prev=a,a=y,y};for(m({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:"text",value:Fwe(o)}]}m({type:"comma",value:f}),o.commas++;continue}if(f===Twe&&g>0&&o.commas===0){let y=o.nodes;if(g===0||y.length===0){m({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){y.pop();let b=y[y.length-1];b.value+=a.value+f,a=b,o.ranges--;continue}m({type:"dot",value:f});continue}m({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(v=>{v.nodes||(v.type==="open"&&(v.isOpen=!0),v.type==="close"&&(v.isClose=!0),v.nodes||(v.type="text"),v.invalid=!0)});let y=s[s.length-1],b=y.nodes.indexOf(o);y.nodes.splice(b,1,...o.nodes)}while(s.length>0);return m({type:"eos"}),n};uq.exports=qwe});var mq=w((Iet,dq)=>{"use strict";var Cq=by(),Jwe=sq(),Wwe=Aq(),zwe=pq(),ts=(r,e={})=>{let t=[];if(Array.isArray(r))for(let i of r){let n=ts.create(i,e);Array.isArray(n)?t.push(...n):t.push(n)}else t=[].concat(ts.create(r,e));return e&&e.expand===!0&&e.nodupes===!0&&(t=[...new Set(t)]),t};ts.parse=(r,e={})=>zwe(r,e);ts.stringify=(r,e={})=>typeof r=="string"?Cq(ts.parse(r,e),e):Cq(r,e);ts.compile=(r,e={})=>(typeof r=="string"&&(r=ts.parse(r,e)),Jwe(r,e));ts.expand=(r,e={})=>{typeof r=="string"&&(r=ts.parse(r,e));let t=Wwe(r,e);return e.noempty===!0&&(t=t.filter(Boolean)),e.nodupes===!0&&(t=[...new Set(t)]),t};ts.create=(r,e={})=>r===""||r.length<3?[r]:e.expand!==!0?ts.compile(r,e):ts.expand(r,e);dq.exports=ts});var Vp=w((yet,Eq)=>{"use strict";var _we=require("path"),Jo="\\\\/",Iq=`[^${Jo}]`,za="\\.",Vwe="\\+",Xwe="\\?",Sy="\\/",Zwe="(?=.)",yq="[^/]",Cv=`(?:${Sy}|$)`,wq=`(?:^|${Sy})`,mv=`${za}{1,2}${Cv}`,$we=`(?!${za})`,eBe=`(?!${wq}${mv})`,tBe=`(?!${za}{0,1}${Cv})`,rBe=`(?!${mv})`,iBe=`[^.${Sy}]`,nBe=`${yq}*?`,Bq={DOT_LITERAL:za,PLUS_LITERAL:Vwe,QMARK_LITERAL:Xwe,SLASH_LITERAL:Sy,ONE_CHAR:Zwe,QMARK:yq,END_ANCHOR:Cv,DOTS_SLASH:mv,NO_DOT:$we,NO_DOTS:eBe,NO_DOT_SLASH:tBe,NO_DOTS_SLASH:rBe,QMARK_NO_DOT:iBe,STAR:nBe,START_ANCHOR:wq},sBe=te(N({},Bq),{SLASH_LITERAL:`[${Jo}]`,QMARK:Iq,STAR:`${Iq}*?`,DOTS_SLASH:`${za}{1,2}(?:[${Jo}]|$)`,NO_DOT:`(?!${za})`,NO_DOTS:`(?!(?:^|[${Jo}])${za}{1,2}(?:[${Jo}]|$))`,NO_DOT_SLASH:`(?!${za}{0,1}(?:[${Jo}]|$))`,NO_DOTS_SLASH:`(?!${za}{1,2}(?:[${Jo}]|$))`,QMARK_NO_DOT:`[^.${Jo}]`,START_ANCHOR:`(?:^|[${Jo}])`,END_ANCHOR:`(?:[${Jo}]|$)`}),oBe={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};Eq.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:oBe,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:_we.sep,extglobChars(r){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${r.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(r){return r===!0?sBe:Bq}}});var Xp=w(xn=>{"use strict";var aBe=require("path"),ABe=process.platform==="win32",{REGEX_BACKSLASH:lBe,REGEX_REMOVE_BACKSLASH:cBe,REGEX_SPECIAL_CHARS:uBe,REGEX_SPECIAL_CHARS_GLOBAL:gBe}=Vp();xn.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);xn.hasRegexChars=r=>uBe.test(r);xn.isRegexChar=r=>r.length===1&&xn.hasRegexChars(r);xn.escapeRegex=r=>r.replace(gBe,"\\$1");xn.toPosixSlashes=r=>r.replace(lBe,"/");xn.removeBackslashes=r=>r.replace(cBe,e=>e==="\\"?"":e);xn.supportsLookbehinds=()=>{let r=process.version.slice(1).split(".").map(Number);return r.length===3&&r[0]>=9||r[0]===8&&r[1]>=10};xn.isWindows=r=>r&&typeof r.windows=="boolean"?r.windows:ABe===!0||aBe.sep==="\\";xn.escapeLast=(r,e,t)=>{let i=r.lastIndexOf(e,t);return i===-1?r:r[i-1]==="\\"?xn.escapeLast(r,e,i-1):`${r.slice(0,i)}\\${r.slice(i)}`};xn.removePrefix=(r,e={})=>{let t=r;return t.startsWith("./")&&(t=t.slice(2),e.prefix="./"),t};xn.wrapOutput=(r,e={},t={})=>{let i=t.contains?"":"^",n=t.contains?"":"$",s=`${i}(?:${r})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var Dq=w((Bet,bq)=>{"use strict";var Qq=Xp(),{CHAR_ASTERISK:Ev,CHAR_AT:fBe,CHAR_BACKWARD_SLASH:Zp,CHAR_COMMA:hBe,CHAR_DOT:Iv,CHAR_EXCLAMATION_MARK:yv,CHAR_FORWARD_SLASH:Sq,CHAR_LEFT_CURLY_BRACE:wv,CHAR_LEFT_PARENTHESES:Bv,CHAR_LEFT_SQUARE_BRACKET:pBe,CHAR_PLUS:dBe,CHAR_QUESTION_MARK:vq,CHAR_RIGHT_CURLY_BRACE:CBe,CHAR_RIGHT_PARENTHESES:xq,CHAR_RIGHT_SQUARE_BRACKET:mBe}=Vp(),kq=r=>r===Sq||r===Zp,Pq=r=>{r.isPrefix!==!0&&(r.depth=r.isGlobstar?Infinity:1)},EBe=(r,e)=>{let t=e||{},i=r.length-1,n=t.parts===!0||t.scanToEnd===!0,s=[],o=[],a=[],l=r,c=-1,u=0,g=0,f=!1,h=!1,p=!1,m=!1,y=!1,b=!1,v=!1,x=!1,T=!1,q=!1,Y=0,$,_,ne={value:"",depth:0,isGlob:!1},ee=()=>c>=i,A=()=>l.charCodeAt(c+1),oe=()=>($=_,l.charCodeAt(++c));for(;c0&&(Z=l.slice(0,u),l=l.slice(u),g-=u),ce&&p===!0&&g>0?(ce=l.slice(0,g),O=l.slice(g)):p===!0?(ce="",O=l):ce=l,ce&&ce!==""&&ce!=="/"&&ce!==l&&kq(ce.charCodeAt(ce.length-1))&&(ce=ce.slice(0,-1)),t.unescape===!0&&(O&&(O=Qq.removeBackslashes(O)),ce&&v===!0&&(ce=Qq.removeBackslashes(ce)));let L={prefix:Z,input:r,start:u,base:ce,glob:O,isBrace:f,isBracket:h,isGlob:p,isExtglob:m,isGlobstar:y,negated:x,negatedExtglob:T};if(t.tokens===!0&&(L.maxDepth=0,kq(_)||o.push(ne),L.tokens=o),t.parts===!0||t.tokens===!0){let de;for(let Be=0;Be{"use strict";var vy=Vp(),rs=Xp(),{MAX_LENGTH:xy,POSIX_REGEX_SOURCE:IBe,REGEX_NON_SPECIAL_CHARS:yBe,REGEX_SPECIAL_CHARS_BACKREF:wBe,REPLACEMENTS:Fq}=vy,BBe=(r,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...r,e);r.sort();let t=`[${r.join("-")}]`;try{new RegExp(t)}catch(i){return r.map(n=>rs.escapeRegex(n)).join("..")}return t},Rg=(r,e)=>`Missing ${r}: "${e}" - use "\\\\${e}" to match literal characters`,Nq=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");r=Fq[r]||r;let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:t.prepend||""},o=[s],a=t.capture?"":"?:",l=rs.isWindows(e),c=vy.globChars(l),u=vy.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:m,NO_DOT:y,NO_DOT_SLASH:b,NO_DOTS_SLASH:v,QMARK:x,QMARK_NO_DOT:T,STAR:q,START_ANCHOR:Y}=c,$=V=>`(${a}(?:(?!${Y}${V.dot?m:g}).)*?)`,_=t.dot?"":y,ne=t.dot?x:T,ee=t.bash===!0?$(t):q;t.capture&&(ee=`(${ee})`),typeof t.noext=="boolean"&&(t.noextglob=t.noext);let A={input:r,index:-1,start:0,dot:t.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};r=rs.removePrefix(r,A),n=r.length;let oe=[],ce=[],Z=[],O=s,L,de=()=>A.index===n-1,Be=A.peek=(V=1)=>r[A.index+V],je=A.advance=()=>r[++A.index]||"",re=()=>r.slice(A.index+1),se=(V="",Qe=0)=>{A.consumed+=V,A.index+=Qe},be=V=>{A.output+=V.output!=null?V.output:V.value,se(V.value)},he=()=>{let V=1;for(;Be()==="!"&&(Be(2)!=="("||Be(3)==="?");)je(),A.start++,V++;return V%2==0?!1:(A.negated=!0,A.start++,!0)},Fe=V=>{A[V]++,Z.push(V)},Ke=V=>{A[V]--,Z.pop()},ke=V=>{if(O.type==="globstar"){let Qe=A.braces>0&&(V.type==="comma"||V.type==="brace"),le=V.extglob===!0||oe.length&&(V.type==="pipe"||V.type==="paren");V.type!=="slash"&&V.type!=="paren"&&!Qe&&!le&&(A.output=A.output.slice(0,-O.output.length),O.type="star",O.value="*",O.output=ee,A.output+=O.output)}if(oe.length&&V.type!=="paren"&&(oe[oe.length-1].inner+=V.value),(V.value||V.output)&&be(V),O&&O.type==="text"&&V.type==="text"){O.value+=V.value,O.output=(O.output||"")+V.value;return}V.prev=O,o.push(V),O=V},ve=(V,Qe)=>{let le=te(N({},u[Qe]),{conditions:1,inner:""});le.prev=O,le.parens=A.parens,le.output=A.output;let fe=(t.capture?"(":"")+le.open;Fe("parens"),ke({type:V,value:Qe,output:A.output?"":p}),ke({type:"paren",extglob:!0,value:je(),output:fe}),oe.push(le)},pe=V=>{let Qe=V.close+(t.capture?")":""),le;if(V.type==="negate"){let fe=ee;V.inner&&V.inner.length>1&&V.inner.includes("/")&&(fe=$(t)),(fe!==ee||de()||/^\)+$/.test(re()))&&(Qe=V.close=`)$))${fe}`),V.inner.includes("*")&&(le=re())&&/^\.[^\\/.]+$/.test(le)&&(Qe=V.close=`)${le})${fe})`),V.prev.type==="bos"&&(A.negatedExtglob=!0)}ke({type:"paren",extglob:!0,value:L,output:Qe}),Ke("parens")};if(t.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(r)){let V=!1,Qe=r.replace(wBe,(le,fe,gt,Ht,Mt,Ei)=>Ht==="\\"?(V=!0,le):Ht==="?"?fe?fe+Ht+(Mt?x.repeat(Mt.length):""):Ei===0?ne+(Mt?x.repeat(Mt.length):""):x.repeat(gt.length):Ht==="."?g.repeat(gt.length):Ht==="*"?fe?fe+Ht+(Mt?ee:""):ee:fe?le:`\\${le}`);return V===!0&&(t.unescape===!0?Qe=Qe.replace(/\\/g,""):Qe=Qe.replace(/\\+/g,le=>le.length%2==0?"\\\\":le?"\\":"")),Qe===r&&t.contains===!0?(A.output=r,A):(A.output=rs.wrapOutput(Qe,A,e),A)}for(;!de();){if(L=je(),L==="\0")continue;if(L==="\\"){let le=Be();if(le==="/"&&t.bash!==!0||le==="."||le===";")continue;if(!le){L+="\\",ke({type:"text",value:L});continue}let fe=/^\\+/.exec(re()),gt=0;if(fe&&fe[0].length>2&&(gt=fe[0].length,A.index+=gt,gt%2!=0&&(L+="\\")),t.unescape===!0?L=je():L+=je(),A.brackets===0){ke({type:"text",value:L});continue}}if(A.brackets>0&&(L!=="]"||O.value==="["||O.value==="[^")){if(t.posix!==!1&&L===":"){let le=O.value.slice(1);if(le.includes("[")&&(O.posix=!0,le.includes(":"))){let fe=O.value.lastIndexOf("["),gt=O.value.slice(0,fe),Ht=O.value.slice(fe+2),Mt=IBe[Ht];if(Mt){O.value=gt+Mt,A.backtrack=!0,je(),!s.output&&o.indexOf(O)===1&&(s.output=p);continue}}}(L==="["&&Be()!==":"||L==="-"&&Be()==="]")&&(L=`\\${L}`),L==="]"&&(O.value==="["||O.value==="[^")&&(L=`\\${L}`),t.posix===!0&&L==="!"&&O.value==="["&&(L="^"),O.value+=L,be({value:L});continue}if(A.quotes===1&&L!=='"'){L=rs.escapeRegex(L),O.value+=L,be({value:L});continue}if(L==='"'){A.quotes=A.quotes===1?0:1,t.keepQuotes===!0&&ke({type:"text",value:L});continue}if(L==="("){Fe("parens"),ke({type:"paren",value:L});continue}if(L===")"){if(A.parens===0&&t.strictBrackets===!0)throw new SyntaxError(Rg("opening","("));let le=oe[oe.length-1];if(le&&A.parens===le.parens+1){pe(oe.pop());continue}ke({type:"paren",value:L,output:A.parens?")":"\\)"}),Ke("parens");continue}if(L==="["){if(t.nobracket===!0||!re().includes("]")){if(t.nobracket!==!0&&t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));L=`\\${L}`}else Fe("brackets");ke({type:"bracket",value:L});continue}if(L==="]"){if(t.nobracket===!0||O&&O.type==="bracket"&&O.value.length===1){ke({type:"text",value:L,output:`\\${L}`});continue}if(A.brackets===0){if(t.strictBrackets===!0)throw new SyntaxError(Rg("opening","["));ke({type:"text",value:L,output:`\\${L}`});continue}Ke("brackets");let le=O.value.slice(1);if(O.posix!==!0&&le[0]==="^"&&!le.includes("/")&&(L=`/${L}`),O.value+=L,be({value:L}),t.literalBrackets===!1||rs.hasRegexChars(le))continue;let fe=rs.escapeRegex(O.value);if(A.output=A.output.slice(0,-O.value.length),t.literalBrackets===!0){A.output+=fe,O.value=fe;continue}O.value=`(${a}${fe}|${O.value})`,A.output+=O.value;continue}if(L==="{"&&t.nobrace!==!0){Fe("braces");let le={type:"brace",value:L,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};ce.push(le),ke(le);continue}if(L==="}"){let le=ce[ce.length-1];if(t.nobrace===!0||!le){ke({type:"text",value:L,output:L});continue}let fe=")";if(le.dots===!0){let gt=o.slice(),Ht=[];for(let Mt=gt.length-1;Mt>=0&&(o.pop(),gt[Mt].type!=="brace");Mt--)gt[Mt].type!=="dots"&&Ht.unshift(gt[Mt].value);fe=BBe(Ht,t),A.backtrack=!0}if(le.comma!==!0&&le.dots!==!0){let gt=A.output.slice(0,le.outputIndex),Ht=A.tokens.slice(le.tokensIndex);le.value=le.output="\\{",L=fe="\\}",A.output=gt;for(let Mt of Ht)A.output+=Mt.output||Mt.value}ke({type:"brace",value:L,output:fe}),Ke("braces"),ce.pop();continue}if(L==="|"){oe.length>0&&oe[oe.length-1].conditions++,ke({type:"text",value:L});continue}if(L===","){let le=L,fe=ce[ce.length-1];fe&&Z[Z.length-1]==="braces"&&(fe.comma=!0,le="|"),ke({type:"comma",value:L,output:le});continue}if(L==="/"){if(O.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),O=s;continue}ke({type:"slash",value:L,output:h});continue}if(L==="."){if(A.braces>0&&O.type==="dot"){O.value==="."&&(O.output=g);let le=ce[ce.length-1];O.type="dots",O.output+=L,O.value+=L,le.dots=!0;continue}if(A.braces+A.parens===0&&O.type!=="bos"&&O.type!=="slash"){ke({type:"text",value:L,output:g});continue}ke({type:"dot",value:L,output:g});continue}if(L==="?"){if(!(O&&O.value==="(")&&t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("qmark",L);continue}if(O&&O.type==="paren"){let fe=Be(),gt=L;if(fe==="<"&&!rs.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(O.value==="("&&!/[!=<:]/.test(fe)||fe==="<"&&!/<([!=]|\w+>)/.test(re()))&&(gt=`\\${L}`),ke({type:"text",value:L,output:gt});continue}if(t.dot!==!0&&(O.type==="slash"||O.type==="bos")){ke({type:"qmark",value:L,output:T});continue}ke({type:"qmark",value:L,output:x});continue}if(L==="!"){if(t.noextglob!==!0&&Be()==="("&&(Be(2)!=="?"||!/[!=<:]/.test(Be(3)))){ve("negate",L);continue}if(t.nonegate!==!0&&A.index===0){he();continue}}if(L==="+"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("plus",L);continue}if(O&&O.value==="("||t.regex===!1){ke({type:"plus",value:L,output:f});continue}if(O&&(O.type==="bracket"||O.type==="paren"||O.type==="brace")||A.parens>0){ke({type:"plus",value:L});continue}ke({type:"plus",value:f});continue}if(L==="@"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ke({type:"at",extglob:!0,value:L,output:""});continue}ke({type:"text",value:L});continue}if(L!=="*"){(L==="$"||L==="^")&&(L=`\\${L}`);let le=yBe.exec(re());le&&(L+=le[0],A.index+=le[0].length),ke({type:"text",value:L});continue}if(O&&(O.type==="globstar"||O.star===!0)){O.type="star",O.star=!0,O.value+=L,O.output=ee,A.backtrack=!0,A.globstar=!0,se(L);continue}let V=re();if(t.noextglob!==!0&&/^\([^?]/.test(V)){ve("star",L);continue}if(O.type==="star"){if(t.noglobstar===!0){se(L);continue}let le=O.prev,fe=le.prev,gt=le.type==="slash"||le.type==="bos",Ht=fe&&(fe.type==="star"||fe.type==="globstar");if(t.bash===!0&&(!gt||V[0]&&V[0]!=="/")){ke({type:"star",value:L,output:""});continue}let Mt=A.braces>0&&(le.type==="comma"||le.type==="brace"),Ei=oe.length&&(le.type==="pipe"||le.type==="paren");if(!gt&&le.type!=="paren"&&!Mt&&!Ei){ke({type:"star",value:L,output:""});continue}for(;V.slice(0,3)==="/**";){let jt=r[A.index+4];if(jt&&jt!=="/")break;V=V.slice(3),se("/**",3)}if(le.type==="bos"&&de()){O.type="globstar",O.value+=L,O.output=$(t),A.output=O.output,A.globstar=!0,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&!Ht&&de()){A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=$(t)+(t.strictSlashes?")":"|$)"),O.value+=L,A.globstar=!0,A.output+=le.output+O.output,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&V[0]==="/"){let jt=V[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=`${$(t)}${h}|${h}${jt})`,O.value+=L,A.output+=le.output+O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}if(le.type==="bos"&&V[0]==="/"){O.type="globstar",O.value+=L,O.output=`(?:^|${h}|${$(t)}${h})`,A.output=O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-O.output.length),O.type="globstar",O.output=$(t),O.value+=L,A.output+=O.output,A.globstar=!0,se(L);continue}let Qe={type:"star",value:L,output:ee};if(t.bash===!0){Qe.output=".*?",(O.type==="bos"||O.type==="slash")&&(Qe.output=_+Qe.output),ke(Qe);continue}if(O&&(O.type==="bracket"||O.type==="paren")&&t.regex===!0){Qe.output=L,ke(Qe);continue}(A.index===A.start||O.type==="slash"||O.type==="dot")&&(O.type==="dot"?(A.output+=b,O.output+=b):t.dot===!0?(A.output+=v,O.output+=v):(A.output+=_,O.output+=_),Be()!=="*"&&(A.output+=p,O.output+=p)),ke(Qe)}for(;A.brackets>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));A.output=rs.escapeLast(A.output,"["),Ke("brackets")}for(;A.parens>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing",")"));A.output=rs.escapeLast(A.output,"("),Ke("parens")}for(;A.braces>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","}"));A.output=rs.escapeLast(A.output,"{"),Ke("braces")}if(t.strictSlashes!==!0&&(O.type==="star"||O.type==="bracket")&&ke({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let V of A.tokens)A.output+=V.output!=null?V.output:V.value,V.suffix&&(A.output+=V.suffix)}return A};Nq.fastpaths=(r,e)=>{let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);r=Fq[r]||r;let s=rs.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=vy.globChars(s),m=t.dot?g:u,y=t.dot?f:u,b=t.capture?"":"?:",v={negated:!1,prefix:""},x=t.bash===!0?".*?":h;t.capture&&(x=`(${x})`);let T=_=>_.noglobstar===!0?x:`(${b}(?:(?!${p}${_.dot?c:o}).)*?)`,q=_=>{switch(_){case"*":return`${m}${l}${x}`;case".*":return`${o}${l}${x}`;case"*.*":return`${m}${x}${o}${l}${x}`;case"*/*":return`${m}${x}${a}${l}${y}${x}`;case"**":return m+T(t);case"**/*":return`(?:${m}${T(t)}${a})?${y}${l}${x}`;case"**/*.*":return`(?:${m}${T(t)}${a})?${y}${x}${o}${l}${x}`;case"**/.*":return`(?:${m}${T(t)}${a})?${o}${l}${x}`;default:{let ne=/^(.*?)\.(\w+)$/.exec(_);if(!ne)return;let ee=q(ne[1]);return ee?ee+o+ne[2]:void 0}}},Y=rs.removePrefix(r,v),$=q(Y);return $&&t.strictSlashes!==!0&&($+=`${a}?`),$};Rq.exports=Nq});var Oq=w((Qet,Tq)=>{"use strict";var bBe=require("path"),QBe=Dq(),bv=Lq(),Qv=Xp(),SBe=Vp(),vBe=r=>r&&typeof r=="object"&&!Array.isArray(r),_r=(r,e,t=!1)=>{if(Array.isArray(r)){let u=r.map(f=>_r(f,e,t));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=vBe(r)&&r.tokens&&r.input;if(r===""||typeof r!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=Qv.isWindows(e),o=i?_r.compileRe(r,e):_r.makeRe(r,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=te(N({},e),{ignore:null,onMatch:null,onResult:null});l=_r(n.ignore,u,t)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=_r.test(u,o,e,{glob:r,posix:s}),m={glob:r,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(m),f===!1?(m.isMatch=!1,g?m:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(m),m.isMatch=!1,g?m:!1):(typeof n.onMatch=="function"&&n.onMatch(m),g?m:!0)};return t&&(c.state=a),c};_r.test=(r,e,t,{glob:i,posix:n}={})=>{if(typeof r!="string")throw new TypeError("Expected input to be a string");if(r==="")return{isMatch:!1,output:""};let s=t||{},o=s.format||(n?Qv.toPosixSlashes:null),a=r===i,l=a&&o?o(r):r;return a===!1&&(l=o?o(r):r,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=_r.matchBase(r,e,t,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};_r.matchBase=(r,e,t,i=Qv.isWindows(t))=>(e instanceof RegExp?e:_r.makeRe(e,t)).test(bBe.basename(r));_r.isMatch=(r,e,t)=>_r(e,t)(r);_r.parse=(r,e)=>Array.isArray(r)?r.map(t=>_r.parse(t,e)):bv(r,te(N({},e),{fastpaths:!1}));_r.scan=(r,e)=>QBe(r,e);_r.compileRe=(r,e,t=!1,i=!1)=>{if(t===!0)return r.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${r.output})${o}`;r&&r.negated===!0&&(a=`^(?!${a}).*$`);let l=_r.toRegex(a,e);return i===!0&&(l.state=r),l};_r.makeRe=(r,e={},t=!1,i=!1)=>{if(!r||typeof r!="string")throw new TypeError("Expected a non-empty string");let n={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(r[0]==="."||r[0]==="*")&&(n.output=bv.fastpaths(r,e)),n.output||(n=bv(r,e)),_r.compileRe(n,e,t,i)};_r.toRegex=(r,e)=>{try{let t=e||{};return new RegExp(r,t.flags||(t.nocase?"i":""))}catch(t){if(e&&e.debug===!0)throw t;return/$^/}};_r.constants=SBe;Tq.exports=_r});var Sv=w((vet,Mq)=>{"use strict";Mq.exports=Oq()});var is=w((xet,Kq)=>{"use strict";var Uq=require("util"),Hq=mq(),Wo=Sv(),vv=Xp(),jq=r=>r===""||r==="./",Pr=(r,e,t)=>{e=[].concat(e),r=[].concat(r);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),t&&t.onResult&&t.onResult(u)};for(let u=0;u!i.has(u));if(t&&c.length===0){if(t.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(t.nonull===!0||t.nullglob===!0)return t.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};Pr.match=Pr;Pr.matcher=(r,e)=>Wo(r,e);Pr.isMatch=(r,e,t)=>Wo(e,t)(r);Pr.any=Pr.isMatch;Pr.not=(r,e,t={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{t.onResult&&t.onResult(a),n.push(a.output)},o=Pr(r,e,te(N({},t),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};Pr.contains=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);if(Array.isArray(e))return e.some(i=>Pr.contains(r,i,t));if(typeof e=="string"){if(jq(r)||jq(e))return!1;if(r.includes(e)||r.startsWith("./")&&r.slice(2).includes(e))return!0}return Pr.isMatch(r,e,te(N({},t),{contains:!0}))};Pr.matchKeys=(r,e,t)=>{if(!vv.isObject(r))throw new TypeError("Expected the first argument to be an object");let i=Pr(Object.keys(r),e,t),n={};for(let s of i)n[s]=r[s];return n};Pr.some=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(i.some(o=>s(o)))return!0}return!1};Pr.every=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(!i.every(o=>s(o)))return!1}return!0};Pr.all=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);return[].concat(e).every(i=>Wo(i,t)(r))};Pr.capture=(r,e,t)=>{let i=vv.isWindows(t),s=Wo.makeRe(String(r),te(N({},t),{capture:!0})).exec(i?vv.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};Pr.makeRe=(...r)=>Wo.makeRe(...r);Pr.scan=(...r)=>Wo.scan(...r);Pr.parse=(r,e)=>{let t=[];for(let i of[].concat(r||[]))for(let n of Hq(String(i),e))t.push(Wo.parse(n,e));return t};Pr.braces=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(r)?[r]:Hq(r,e)};Pr.braceExpand=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return Pr.braces(r,te(N({},e),{expand:!0}))};Kq.exports=Pr});var Yq=w((ket,Gq)=>{"use strict";Gq.exports=({onlyFirst:r=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,r?void 0:"g")}});var Jq=w((Pet,qq)=>{"use strict";var xBe=Yq();qq.exports=r=>typeof r=="string"?r.replace(xBe(),""):r});var AJ=w((zet,aJ)=>{"use strict";aJ.exports=(...r)=>[...new Set([].concat(...r))]});var jv=w((_et,lJ)=>{"use strict";var UBe=require("stream"),cJ=UBe.PassThrough,HBe=Array.prototype.slice;lJ.exports=jBe;function jBe(){let r=[],e=!1,t=HBe.call(arguments),i=t[t.length-1];i&&!Array.isArray(i)&&i.pipe==null?t.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=cJ(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(Fy,"__esModule",{value:!0});function GBe(r){return r.reduce((e,t)=>[].concat(e,t),[])}Fy.flatten=GBe;function YBe(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i].push(n);return t}Fy.splitWhen=YBe});var fJ=w(Gv=>{"use strict";Object.defineProperty(Gv,"__esModule",{value:!0});function qBe(r){return r.code==="ENOENT"}Gv.isEnoentCodeError=qBe});var pJ=w(Yv=>{"use strict";Object.defineProperty(Yv,"__esModule",{value:!0});var hJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function JBe(r,e){return new hJ(r,e)}Yv.createDirentFromStats=JBe});var dJ=w(Kg=>{"use strict";Object.defineProperty(Kg,"__esModule",{value:!0});var WBe=require("path"),zBe=2,_Be=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function VBe(r){return r.replace(/\\/g,"/")}Kg.unixify=VBe;function XBe(r,e){return WBe.resolve(r,e)}Kg.makeAbsolute=XBe;function ZBe(r){return r.replace(_Be,"\\$2")}Kg.escape=ZBe;function $Be(r){if(r.charAt(0)==="."){let e=r.charAt(1);if(e==="/"||e==="\\")return r.slice(zBe)}return r}Kg.removeLeadingDotSegment=$Be});var mJ=w((ett,CJ)=>{CJ.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var t;t=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}});var yJ=w((ttt,EJ)=>{var e0e=mJ(),IJ={"{":"}","(":")","[":"]"},t0e=function(r){if(r[0]==="!")return!0;for(var e=0,t=-2,i=-2,n=-2,s=-2,o=-2;ee&&(o===-1||o>i||(o=r.indexOf("\\",e),o===-1||o>i)))||n!==-1&&r[e]==="{"&&r[e+1]!=="}"&&(n=r.indexOf("}",e),n>e&&(o=r.indexOf("\\",e),o===-1||o>n))||s!==-1&&r[e]==="("&&r[e+1]==="?"&&/[:!=]/.test(r[e+2])&&r[e+3]!==")"&&(s=r.indexOf(")",e),s>e&&(o=r.indexOf("\\",e),o===-1||o>s))||t!==-1&&r[e]==="("&&r[e+1]!=="|"&&(tt&&(o=r.indexOf("\\",t),o===-1||o>s))))return!0;if(r[e]==="\\"){var a=r[e+1];e+=2;var l=IJ[a];if(l){var c=r.indexOf(l,e);c!==-1&&(e=c+1)}if(r[e]==="!")return!0}else e++}return!1},r0e=function(r){if(r[0]==="!")return!0;for(var e=0;e{"use strict";var i0e=yJ(),n0e=require("path").posix.dirname,s0e=require("os").platform()==="win32",qv="/",o0e=/\\/g,a0e=/[\{\[].*[\}\]]$/,A0e=/(^|[^\\])([\{\[]|\([^\)]+$)/,l0e=/\\([\!\*\?\|\[\]\(\)\{\}])/g;wJ.exports=function(e,t){var i=Object.assign({flipBackslashes:!0},t);i.flipBackslashes&&s0e&&e.indexOf(qv)<0&&(e=e.replace(o0e,qv)),a0e.test(e)&&(e+=qv),e+="a";do e=n0e(e);while(i0e(e)||A0e.test(e));return e.replace(l0e,"$1")}});var RJ=w(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});var c0e=require("path"),u0e=BJ(),bJ=is(),g0e=Sv(),QJ="**",f0e="\\",h0e=/[*?]|^!/,p0e=/\[.*]/,d0e=/(?:^|[^!*+?@])\(.*\|.*\)/,C0e=/[!*+?@]\(.*\)/,m0e=/{.*(?:,|\.\.).*}/;function vJ(r,e={}){return!SJ(r,e)}si.isStaticPattern=vJ;function SJ(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(f0e)||h0e.test(r)||p0e.test(r)||d0e.test(r)||e.extglob!==!1&&C0e.test(r)||e.braceExpansion!==!1&&m0e.test(r))}si.isDynamicPattern=SJ;function E0e(r){return Ny(r)?r.slice(1):r}si.convertToPositivePattern=E0e;function I0e(r){return"!"+r}si.convertToNegativePattern=I0e;function Ny(r){return r.startsWith("!")&&r[1]!=="("}si.isNegativePattern=Ny;function xJ(r){return!Ny(r)}si.isPositivePattern=xJ;function y0e(r){return r.filter(Ny)}si.getNegativePatterns=y0e;function w0e(r){return r.filter(xJ)}si.getPositivePatterns=w0e;function B0e(r){return u0e(r,{flipBackslashes:!1})}si.getBaseDirectory=B0e;function b0e(r){return r.includes(QJ)}si.hasGlobStar=b0e;function kJ(r){return r.endsWith("/"+QJ)}si.endsWithSlashGlobStar=kJ;function Q0e(r){let e=c0e.basename(r);return kJ(r)||vJ(e)}si.isAffectDepthOfReadingPattern=Q0e;function S0e(r){return r.reduce((e,t)=>e.concat(PJ(t)),[])}si.expandPatternsWithBraceExpansion=S0e;function PJ(r){return bJ.braces(r,{expand:!0,nodupes:!0})}si.expandBraceExpansion=PJ;function v0e(r,e){let t=g0e.scan(r,Object.assign(Object.assign({},e),{parts:!0}));return t.parts.length===0?[r]:t.parts}si.getPatternParts=v0e;function DJ(r,e){return bJ.makeRe(r,e)}si.makeRe=DJ;function x0e(r,e){return r.map(t=>DJ(t,e))}si.convertPatternsToRe=x0e;function k0e(r,e){return e.some(t=>t.test(r))}si.matchAny=k0e});var NJ=w(Jv=>{"use strict";Object.defineProperty(Jv,"__esModule",{value:!0});var P0e=jv();function D0e(r){let e=P0e(r);return r.forEach(t=>{t.once("error",i=>e.emit("error",i))}),e.once("close",()=>FJ(r)),e.once("end",()=>FJ(r)),e}Jv.merge=D0e;function FJ(r){r.forEach(e=>e.emit("close"))}});var LJ=w(Ly=>{"use strict";Object.defineProperty(Ly,"__esModule",{value:!0});function R0e(r){return typeof r=="string"}Ly.isString=R0e;function F0e(r){return r===""}Ly.isEmpty=F0e});var Xa=w(Va=>{"use strict";Object.defineProperty(Va,"__esModule",{value:!0});var N0e=gJ();Va.array=N0e;var L0e=fJ();Va.errno=L0e;var T0e=pJ();Va.fs=T0e;var O0e=dJ();Va.path=O0e;var M0e=RJ();Va.pattern=M0e;var K0e=NJ();Va.stream=K0e;var U0e=LJ();Va.string=U0e});var UJ=w(Za=>{"use strict";Object.defineProperty(Za,"__esModule",{value:!0});var Mc=Xa();function H0e(r,e){let t=TJ(r),i=OJ(r,e.ignore),n=t.filter(l=>Mc.pattern.isStaticPattern(l,e)),s=t.filter(l=>Mc.pattern.isDynamicPattern(l,e)),o=Wv(n,i,!1),a=Wv(s,i,!0);return o.concat(a)}Za.generate=H0e;function Wv(r,e,t){let i=MJ(r);return"."in i?[zv(".",r,e,t)]:KJ(i,e,t)}Za.convertPatternsToTasks=Wv;function TJ(r){return Mc.pattern.getPositivePatterns(r)}Za.getPositivePatterns=TJ;function OJ(r,e){return Mc.pattern.getNegativePatterns(r).concat(e).map(Mc.pattern.convertToPositivePattern)}Za.getNegativePatternsAsPositive=OJ;function MJ(r){let e={};return r.reduce((t,i)=>{let n=Mc.pattern.getBaseDirectory(i);return n in t?t[n].push(i):t[n]=[i],t},e)}Za.groupPatternsByBaseDirectory=MJ;function KJ(r,e,t){return Object.keys(r).map(i=>zv(i,r[i],e,t))}Za.convertPatternGroupsToTasks=KJ;function zv(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patterns:[].concat(e,t.map(Mc.pattern.convertToNegativePattern))}}Za.convertPatternGroupToTask=zv});var jJ=w(Ty=>{"use strict";Object.defineProperty(Ty,"__esModule",{value:!0});Ty.read=void 0;function j0e(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){HJ(t,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){_v(t,n);return}e.fs.stat(r,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){HJ(t,s);return}_v(t,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),_v(t,o)})})}Ty.read=j0e;function HJ(r,e){r(e)}function _v(r,e){r(null,e)}});var GJ=w(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});Oy.read=void 0;function G0e(r,e){let t=e.fs.lstatSync(r);if(!t.isSymbolicLink()||!e.followSymbolicLink)return t;try{let i=e.fs.statSync(r);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return t;throw i}}Oy.read=G0e});var YJ=w(rl=>{"use strict";Object.defineProperty(rl,"__esModule",{value:!0});rl.createFileSystemAdapter=rl.FILE_SYSTEM_ADAPTER=void 0;var My=require("fs");rl.FILE_SYSTEM_ADAPTER={lstat:My.lstat,stat:My.stat,lstatSync:My.lstatSync,statSync:My.statSync};function Y0e(r){return r===void 0?rl.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},rl.FILE_SYSTEM_ADAPTER),r)}rl.createFileSystemAdapter=Y0e});var JJ=w(Vv=>{"use strict";Object.defineProperty(Vv,"__esModule",{value:!0});var q0e=YJ(),qJ=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=q0e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return e!=null?e:t}};Vv.default=qJ});var Kc=w(il=>{"use strict";Object.defineProperty(il,"__esModule",{value:!0});il.statSync=il.stat=il.Settings=void 0;var WJ=jJ(),J0e=GJ(),Xv=JJ();il.Settings=Xv.default;function W0e(r,e,t){if(typeof e=="function"){WJ.read(r,Zv(),e);return}WJ.read(r,Zv(e),t)}il.stat=W0e;function z0e(r,e){let t=Zv(e);return J0e.read(r,t)}il.statSync=z0e;function Zv(r={}){return r instanceof Xv.default?r:new Xv.default(r)}});var _J=w((ftt,zJ)=>{zJ.exports=_0e;function _0e(r,e){var t,i,n,s=!0;Array.isArray(r)?(t=[],i=r.length):(n=Object.keys(r),t={},i=n.length);function o(l){function c(){e&&e(l,t),e=null}s?process.nextTick(c):c()}function a(l,c,u){t[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){r[l](function(c,u){a(l,c,u)})}):r.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var $v=w(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var Uy=process.versions.node.split(".");if(Uy[0]===void 0||Uy[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var VJ=Number.parseInt(Uy[0],10),V0e=Number.parseInt(Uy[1],10),XJ=10,X0e=10,Z0e=VJ>XJ,$0e=VJ===XJ&&V0e>=X0e;Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=Z0e||$0e});var $J=w(Hy=>{"use strict";Object.defineProperty(Hy,"__esModule",{value:!0});Hy.createDirentFromStats=void 0;var ZJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function ebe(r,e){return new ZJ(r,e)}Hy.createDirentFromStats=ebe});var ex=w(jy=>{"use strict";Object.defineProperty(jy,"__esModule",{value:!0});jy.fs=void 0;var tbe=$J();jy.fs=tbe});var tx=w(Gy=>{"use strict";Object.defineProperty(Gy,"__esModule",{value:!0});Gy.joinPathSegments=void 0;function rbe(r,e,t){return r.endsWith(t)?r+e:r+t+e}Gy.joinPathSegments=rbe});var s3=w(nl=>{"use strict";Object.defineProperty(nl,"__esModule",{value:!0});nl.readdir=nl.readdirWithFileTypes=nl.read=void 0;var ibe=Kc(),e3=_J(),nbe=$v(),t3=ex(),r3=tx();function sbe(r,e,t){if(!e.stats&&nbe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){i3(r,e,t);return}n3(r,e,t)}nl.read=sbe;function i3(r,e,t){e.fs.readdir(r,{withFileTypes:!0},(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:r3.joinPathSegments(r,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){rx(t,s);return}let o=s.map(a=>obe(a,e));e3(o,(a,l)=>{if(a!==null){Yy(t,a);return}rx(t,l)})})}nl.readdirWithFileTypes=i3;function obe(r,e){return t=>{if(!r.dirent.isSymbolicLink()){t(null,r);return}e.fs.stat(r.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){t(i);return}t(null,r);return}r.dirent=t3.fs.createDirentFromStats(r.name,n),t(null,r)})}}function n3(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(o=>{let a=r3.joinPathSegments(r,o,e.pathSegmentSeparator);return l=>{ibe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:t3.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});e3(s,(o,a)=>{if(o!==null){Yy(t,o);return}rx(t,a)})})}nl.readdir=n3;function Yy(r,e){r(e)}function rx(r,e){r(null,e)}});var c3=w(sl=>{"use strict";Object.defineProperty(sl,"__esModule",{value:!0});sl.readdir=sl.readdirWithFileTypes=sl.read=void 0;var abe=Kc(),Abe=$v(),o3=ex(),a3=tx();function lbe(r,e){return!e.stats&&Abe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?A3(r,e):l3(r,e)}sl.read=lbe;function A3(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:a3.joinPathSegments(r,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=o3.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}sl.readdirWithFileTypes=A3;function l3(r,e){return e.fs.readdirSync(r).map(i=>{let n=a3.joinPathSegments(r,i,e.pathSegmentSeparator),s=abe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:o3.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}sl.readdir=l3});var u3=w(ol=>{"use strict";Object.defineProperty(ol,"__esModule",{value:!0});ol.createFileSystemAdapter=ol.FILE_SYSTEM_ADAPTER=void 0;var Ug=require("fs");ol.FILE_SYSTEM_ADAPTER={lstat:Ug.lstat,stat:Ug.stat,lstatSync:Ug.lstatSync,statSync:Ug.statSync,readdir:Ug.readdir,readdirSync:Ug.readdirSync};function cbe(r){return r===void 0?ol.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},ol.FILE_SYSTEM_ADAPTER),r)}ol.createFileSystemAdapter=cbe});var f3=w(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var ube=require("path"),gbe=Kc(),fbe=u3(),g3=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=fbe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,ube.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new gbe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};ix.default=g3});var qy=w(al=>{"use strict";Object.defineProperty(al,"__esModule",{value:!0});al.Settings=al.scandirSync=al.scandir=void 0;var h3=s3(),hbe=c3(),nx=f3();al.Settings=nx.default;function pbe(r,e,t){if(typeof e=="function"){h3.read(r,sx(),e);return}h3.read(r,sx(e),t)}al.scandir=pbe;function dbe(r,e){let t=sx(e);return hbe.read(r,t)}al.scandirSync=dbe;function sx(r={}){return r instanceof nx.default?r:new nx.default(r)}});var d3=w((Btt,p3)=>{"use strict";function Cbe(r){var e=new r,t=e;function i(){var s=e;return s.next?e=s.next:(e=new r,t=e),s.next=null,s}function n(s){t.next=s,t=s}return{get:i,release:n}}p3.exports=Cbe});var m3=w((btt,ox)=>{"use strict";var mbe=d3();function C3(r,e,t){if(typeof r=="function"&&(t=e,e=r,r=null),t<1)throw new Error("fastqueue concurrency must be greater than 1");var i=mbe(Ebe),n=null,s=null,o=0,a=null,l={push:m,drain:Vo,saturated:Vo,pause:u,paused:!1,concurrency:t,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:y,empty:Vo,kill:v,killAndDrain:x,error:T};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var q=n,Y=0;q;)q=q.next,Y++;return Y}function f(){for(var q=n,Y=[];q;)Y.push(q.value),q=q.next;return Y}function h(){if(!!l.paused){l.paused=!1;for(var q=0;q{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});Xo.joinPathSegments=Xo.replacePathSegmentSeparator=Xo.isAppliedFilter=Xo.isFatalError=void 0;function ybe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}Xo.isFatalError=ybe;function wbe(r,e){return r===null||r(e)}Xo.isAppliedFilter=wbe;function Bbe(r,e){return r.split(/[/\\]/).join(e)}Xo.replacePathSegmentSeparator=Bbe;function bbe(r,e,t){return r===""?e:r.endsWith(t)?r+e:r+t+e}Xo.joinPathSegments=bbe});var Ax=w(ax=>{"use strict";Object.defineProperty(ax,"__esModule",{value:!0});var Qbe=Jy(),E3=class{constructor(e,t){this._root=e,this._settings=t,this._root=Qbe.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}};ax.default=E3});var cx=w(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var Sbe=require("events"),vbe=qy(),xbe=m3(),Wy=Jy(),kbe=Ax(),I3=class extends kbe.default{constructor(e,t){super(e,t);this._settings=t,this._scandir=vbe.scandir,this._emitter=new Sbe.EventEmitter,this._queue=xbe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,t){let i={directory:e,base:t};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){t(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);t(null,void 0)})}_handleError(e){this._isDestroyed||!Wy.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;let i=e.path;t!==void 0&&(e.path=Wy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),Wy.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&Wy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};lx.default=I3});var w3=w(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var Pbe=cx(),y3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Pbe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{Dbe(e,t)}),this._reader.onEntry(t=>{this._storage.add(t)}),this._reader.onEnd(()=>{Rbe(e,[...this._storage])}),this._reader.read()}};ux.default=y3;function Dbe(r,e){r(e)}function Rbe(r,e){r(null,e)}});var b3=w(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var Fbe=require("stream"),Nbe=cx(),B3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Nbe.default(this._root,this._settings),this._stream=new Fbe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};gx.default=B3});var S3=w(fx=>{"use strict";Object.defineProperty(fx,"__esModule",{value:!0});var Lbe=qy(),zy=Jy(),Tbe=Ax(),Q3=class extends Tbe.default{constructor(){super(...arguments);this._scandir=Lbe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,t)}catch(i){this._handleError(i)}}_handleError(e){if(!!zy.isFatalError(this._settings,e))throw e}_handleEntry(e,t){let i=e.path;t!==void 0&&(e.path=zy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),zy.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&zy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};fx.default=Q3});var x3=w(hx=>{"use strict";Object.defineProperty(hx,"__esModule",{value:!0});var Obe=S3(),v3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Obe.default(this._root,this._settings)}read(){return this._reader.read()}};hx.default=v3});var P3=w(px=>{"use strict";Object.defineProperty(px,"__esModule",{value:!0});var Mbe=require("path"),Kbe=qy(),k3=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Mbe.sep),this.fsScandirSettings=new Kbe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};px.default=k3});var Cx=w(Zo=>{"use strict";Object.defineProperty(Zo,"__esModule",{value:!0});Zo.Settings=Zo.walkStream=Zo.walkSync=Zo.walk=void 0;var D3=w3(),Ube=b3(),Hbe=x3(),dx=P3();Zo.Settings=dx.default;function jbe(r,e,t){if(typeof e=="function"){new D3.default(r,_y()).read(e);return}new D3.default(r,_y(e)).read(t)}Zo.walk=jbe;function Gbe(r,e){let t=_y(e);return new Hbe.default(r,t).read()}Zo.walkSync=Gbe;function Ybe(r,e){let t=_y(e);return new Ube.default(r,t).read()}Zo.walkStream=Ybe;function _y(r={}){return r instanceof dx.default?r:new dx.default(r)}});var Ex=w(mx=>{"use strict";Object.defineProperty(mx,"__esModule",{value:!0});var qbe=require("path"),Jbe=Kc(),R3=Xa(),F3=class{constructor(e){this._settings=e,this._fsStatSettings=new Jbe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return qbe.resolve(this._settings.cwd,e)}_makeEntry(e,t){let i={name:t,path:t,dirent:R3.fs.createDirentFromStats(t,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!R3.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};mx.default=F3});var yx=w(Ix=>{"use strict";Object.defineProperty(Ix,"__esModule",{value:!0});var Wbe=require("stream"),zbe=Kc(),_be=Cx(),Vbe=Ex(),N3=class extends Vbe.default{constructor(){super(...arguments);this._walkStream=_be.walkStream,this._stat=zbe.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){let i=e.map(this._getFullEntryPath,this),n=new Wbe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],t).then(l=>{l!==null&&t.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,t)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((t,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?t(s):i(n))})}};Ix.default=N3});var T3=w(wx=>{"use strict";Object.defineProperty(wx,"__esModule",{value:!0});var Hg=Xa(),L3=class{constructor(e,t,i){this._patterns=e,this._settings=t,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Hg.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let t of e){let i=this._getPatternSegments(t),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:t,segments:i,sections:n})}}_getPatternSegments(e){return Hg.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Hg.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Hg.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Hg.array.splitWhen(e,t=>t.dynamic&&Hg.pattern.hasGlobStar(t.pattern))}};wx.default=L3});var M3=w(Bx=>{"use strict";Object.defineProperty(Bx,"__esModule",{value:!0});var Xbe=T3(),O3=class extends Xbe.default{match(e){let t=e.split("/"),i=t.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||t.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};Bx.default=O3});var U3=w(bx=>{"use strict";Object.defineProperty(bx,"__esModule",{value:!0});var Vy=Xa(),Zbe=M3(),K3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,i){let n=this._getMatcher(t),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new Zbe.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let t=e.filter(Vy.pattern.isAffectDepthOfReadingPattern);return Vy.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,i,n){let s=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(t))return!1;let o=Vy.path.removeLeadingDotSegment(t.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){let i=e.split("/").length;return t.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!Vy.pattern.matchAny(e,t)}};bx.default=K3});var j3=w(Qx=>{"use strict";Object.defineProperty(Qx,"__esModule",{value:!0});var sd=Xa(),H3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){let i=sd.pattern.convertPatternsToRe(e,this._micromatchOptions),n=sd.pattern.convertPatternsToRe(t,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,t,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,t)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;let i=sd.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,t)}_isMatchToPatterns(e,t){let i=sd.path.removeLeadingDotSegment(e);return sd.pattern.matchAny(i,t)}};Qx.default=H3});var Y3=w(Sx=>{"use strict";Object.defineProperty(Sx,"__esModule",{value:!0});var $be=Xa(),G3=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return $be.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};Sx.default=G3});var W3=w(vx=>{"use strict";Object.defineProperty(vx,"__esModule",{value:!0});var q3=Xa(),J3=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=q3.path.makeAbsolute(this._settings.cwd,t),t=q3.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}};vx.default=J3});var Xy=w(xx=>{"use strict";Object.defineProperty(xx,"__esModule",{value:!0});var eQe=require("path"),tQe=U3(),rQe=j3(),iQe=Y3(),nQe=W3(),z3=class{constructor(e){this._settings=e,this.errorFilter=new iQe.default(this._settings),this.entryFilter=new rQe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new tQe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new nQe.default(this._settings)}_getRootDirectory(e){return eQe.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let t=e.base==="."?"":e.base;return{basePath:t,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};xx.default=z3});var V3=w(kx=>{"use strict";Object.defineProperty(kx,"__esModule",{value:!0});var sQe=yx(),oQe=Xy(),_3=class extends oQe.default{constructor(){super(...arguments);this._reader=new sQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(t,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};kx.default=_3});var Z3=w(Px=>{"use strict";Object.defineProperty(Px,"__esModule",{value:!0});var aQe=require("stream"),AQe=yx(),lQe=Xy(),X3=class extends lQe.default{constructor(){super(...arguments);this._reader=new AQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(t,e,i),s=new aQe.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Px.default=X3});var eW=w(Dx=>{"use strict";Object.defineProperty(Dx,"__esModule",{value:!0});var cQe=Kc(),uQe=Cx(),gQe=Ex(),$3=class extends gQe.default{constructor(){super(...arguments);this._walkSync=uQe.walkSync,this._statSync=cQe.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,t);o===null||!t.entryFilter(o)||i.push(o)}return i}_getEntry(e,t,i){try{let n=this._getStat(e);return this._makeEntry(n,t)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};Dx.default=$3});var rW=w(Rx=>{"use strict";Object.defineProperty(Rx,"__esModule",{value:!0});var fQe=eW(),hQe=Xy(),tW=class extends hQe.default{constructor(){super(...arguments);this._reader=new fQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(t,e,i).map(i.transform)}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Rx.default=tW});var nW=w(od=>{"use strict";Object.defineProperty(od,"__esModule",{value:!0});var jg=require("fs"),pQe=require("os"),dQe=pQe.cpus().length;od.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:jg.lstat,lstatSync:jg.lstatSync,stat:jg.stat,statSync:jg.statSync,readdir:jg.readdir,readdirSync:jg.readdirSync};var iW=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,dQe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return e===void 0?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},od.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};od.default=iW});var Zy=w((ztt,sW)=>{"use strict";var oW=UJ(),CQe=V3(),mQe=Z3(),EQe=rW(),Fx=nW(),Uc=Xa();async function Lx(r,e){Gg(r);let t=Nx(r,CQe.default,e),i=await Promise.all(t);return Uc.array.flatten(i)}(function(r){function e(o,a){Gg(o);let l=Nx(o,EQe.default,a);return Uc.array.flatten(l)}r.sync=e;function t(o,a){Gg(o);let l=Nx(o,mQe.default,a);return Uc.stream.merge(l)}r.stream=t;function i(o,a){Gg(o);let l=[].concat(o),c=new Fx.default(a);return oW.generate(l,c)}r.generateTasks=i;function n(o,a){Gg(o);let l=new Fx.default(a);return Uc.pattern.isDynamicPattern(o,l)}r.isDynamicPattern=n;function s(o){return Gg(o),Uc.path.escape(o)}r.escapePath=s})(Lx||(Lx={}));function Nx(r,e,t){let i=[].concat(r),n=new Fx.default(t),s=oW.generate(i,n),o=new e(n);return s.map(o.read,o)}function Gg(r){if(![].concat(r).every(i=>Uc.string.isString(i)&&!Uc.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}sW.exports=Lx});var AW=w(Hc=>{"use strict";var{promisify:IQe}=require("util"),aW=require("fs");async function Tx(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return(await IQe(aW[r])(t))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Ox(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return aW[r](t)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Hc.isFile=Tx.bind(null,"stat","isFile");Hc.isDirectory=Tx.bind(null,"stat","isDirectory");Hc.isSymlink=Tx.bind(null,"lstat","isSymbolicLink");Hc.isFileSync=Ox.bind(null,"statSync","isFile");Hc.isDirectorySync=Ox.bind(null,"statSync","isDirectory");Hc.isSymlinkSync=Ox.bind(null,"lstatSync","isSymbolicLink")});var fW=w((Vtt,Mx)=>{"use strict";var jc=require("path"),lW=AW(),cW=r=>r.length>1?`{${r.join(",")}}`:r[0],uW=(r,e)=>{let t=r[0]==="!"?r.slice(1):r;return jc.isAbsolute(t)?t:jc.join(e,t)},yQe=(r,e)=>jc.extname(r)?`**/${r}`:`**/${r}.${cW(e)}`,gW=(r,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(t=>jc.posix.join(r,yQe(t,e.extensions))):e.files?e.files.map(t=>jc.posix.join(r,`**/${t}`)):e.extensions?[jc.posix.join(r,`**/*.${cW(e.extensions)}`)]:[jc.posix.join(r,"**")]};Mx.exports=async(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=await Promise.all([].concat(r).map(async i=>await lW.isDirectory(uW(i,e.cwd))?gW(i,e):i));return[].concat.apply([],t)};Mx.exports.sync=(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=[].concat(r).map(i=>lW.isDirectorySync(uW(i,e.cwd))?gW(i,e):i);return[].concat.apply([],t)}});var BW=w((Xtt,hW)=>{function pW(r){return Array.isArray(r)?r:[r]}var dW="",CW=" ",Kx="\\",wQe=/^\s+$/,BQe=/^\\!/,bQe=/^\\#/,QQe=/\r?\n/g,SQe=/^\.*\/|^\.+$/,Ux="/",mW=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",vQe=(r,e,t)=>Object.defineProperty(r,e,{value:t}),xQe=/([0-z])-([0-z])/g,kQe=r=>r.replace(xQe,(e,t,i)=>t.charCodeAt(0)<=i.charCodeAt(0)?e:dW),PQe=r=>{let{length:e}=r;return r.slice(0,e-e%2)},DQe=[[/\\?\s+$/,r=>r.indexOf("\\")===0?CW:dW],[/\\\s/g,()=>CW],[/[\\$.|*+(){^]/g,r=>`\\${r}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(r,e,t)=>e+6`${e}[^\\/]*`],[/\\\\\\(?=[$.|*+(){^])/g,()=>Kx],[/\\\\/g,()=>Kx],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(r,e,t,i,n)=>e===Kx?`\\[${t}${PQe(i)}${n}`:n==="]"&&i.length%2==0?`[${kQe(t)}${i}]`:"[]"],[/(?:[^*])$/,r=>/\/$/.test(r)?`${r}$`:`${r}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(r,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],EW=Object.create(null),RQe=(r,e)=>{let t=EW[r];return t||(t=DQe.reduce((i,n)=>i.replace(n[0],n[1].bind(r)),r),EW[r]=t),e?new RegExp(t,"i"):new RegExp(t)},Hx=r=>typeof r=="string",FQe=r=>r&&Hx(r)&&!wQe.test(r)&&r.indexOf("#")!==0,NQe=r=>r.split(QQe),IW=class{constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.regex=n}},LQe=(r,e)=>{let t=r,i=!1;r.indexOf("!")===0&&(i=!0,r=r.substr(1)),r=r.replace(BQe,"!").replace(bQe,"#");let n=RQe(r,e);return new IW(t,r,i,n)},TQe=(r,e)=>{throw new e(r)},$a=(r,e,t)=>Hx(r)?r?$a.isNotRelative(r)?t(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:t("path must not be empty",TypeError):t(`path must be a string, but got \`${e}\``,TypeError),yW=r=>SQe.test(r);$a.isNotRelative=yW;$a.convert=r=>r;var wW=class{constructor({ignorecase:e=!0}={}){vQe(this,mW,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[mW]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(FQe(e)){let t=LQe(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,pW(Hx(e)?NQe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!t)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,t,i,n){let s=e&&$a.convert(e);return $a(s,e,TQe),this._t(s,t,i,n)}_t(e,t,i,n){if(e in t)return t[e];if(n||(n=e.split(Ux)),n.pop(),!n.length)return t[e]=this._testOne(e,i);let s=this._t(n.join(Ux)+Ux,t,i,n);return t[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return pW(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},$y=r=>new wW(r),OQe=()=>!1,MQe=r=>$a(r&&$a.convert(r),r,OQe);$y.isPathValid=MQe;$y.default=$y;hW.exports=$y;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let r=t=>/^\\\\\?\\/.test(t)||/["<>|\u0000-\u001F]+/u.test(t)?t:t.replace(/\\/g,"/");$a.convert=r;let e=/^[a-z]:\//i;$a.isNotRelative=t=>e.test(t)||yW(t)}});var QW=w((Ztt,bW)=>{"use strict";bW.exports=r=>{let e=/^\\\\\?\\/.test(r),t=/[^\u0000-\u0080]+/.test(r);return e||t?r:r.replace(/\\/g,"/")}});var RW=w(($tt,jx)=>{"use strict";var{promisify:KQe}=require("util"),SW=require("fs"),eA=require("path"),vW=Zy(),UQe=BW(),ad=QW(),xW=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],HQe=KQe(SW.readFile),jQe=r=>e=>e.startsWith("!")?"!"+eA.posix.join(r,e.slice(1)):eA.posix.join(r,e),GQe=(r,e)=>{let t=ad(eA.relative(e.cwd,eA.dirname(e.fileName)));return r.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(jQe(t))},kW=r=>{let e=UQe();for(let t of r)e.add(GQe(t.content,{cwd:t.cwd,fileName:t.filePath}));return e},YQe=(r,e)=>{if(r=ad(r),eA.isAbsolute(e)){if(ad(e).startsWith(r))return e;throw new Error(`Path ${e} is not in cwd ${r}`)}return eA.join(r,e)},PW=(r,e)=>t=>r.ignores(ad(eA.relative(e,YQe(e,t.path||t)))),qQe=async(r,e)=>{let t=eA.join(e,r),i=await HQe(t,"utf8");return{cwd:e,filePath:t,content:i}},JQe=(r,e)=>{let t=eA.join(e,r),i=SW.readFileSync(t,"utf8");return{cwd:e,filePath:t,content:i}},DW=({ignore:r=[],cwd:e=ad(process.cwd())}={})=>({ignore:r,cwd:e});jx.exports=async r=>{r=DW(r);let e=await vW("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}),t=await Promise.all(e.map(n=>qQe(n,r.cwd))),i=kW(t);return PW(i,r.cwd)};jx.exports.sync=r=>{r=DW(r);let t=vW.sync("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}).map(n=>JQe(n,r.cwd)),i=kW(t);return PW(i,r.cwd)}});var TW=w((ert,FW)=>{"use strict";var{Transform:WQe}=require("stream"),Gx=class extends WQe{constructor(){super({objectMode:!0})}},NW=class extends Gx{constructor(e){super();this._filter=e}_transform(e,t,i){this._filter(e)&&this.push(e),i()}},LW=class extends Gx{constructor(){super();this._pushed=new Set}_transform(e,t,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};FW.exports={FilterStream:NW,UniqueStream:LW}});var Wx=w((trt,Gc)=>{"use strict";var OW=require("fs"),ew=AJ(),zQe=jv(),tw=Zy(),rw=fW(),Yx=RW(),{FilterStream:_Qe,UniqueStream:VQe}=TW(),MW=()=>!1,KW=r=>r[0]==="!",XQe=r=>{if(!r.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},ZQe=(r={})=>{if(!r.cwd)return;let e;try{e=OW.statSync(r.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},$Qe=r=>r.stats instanceof OW.Stats?r.path:r,iw=(r,e)=>{r=ew([].concat(r)),XQe(r),ZQe(e);let t=[];e=N({ignore:[],expandDirectories:!0},e);for(let[i,n]of r.entries()){if(KW(n))continue;let s=r.slice(i).filter(a=>KW(a)).map(a=>a.slice(1)),o=te(N({},e),{ignore:e.ignore.concat(s)});t.push({pattern:n,options:o})}return t},eSe=(r,e)=>{let t={};return r.options.cwd&&(t.cwd=r.options.cwd),Array.isArray(r.options.expandDirectories)?t=te(N({},t),{files:r.options.expandDirectories}):typeof r.options.expandDirectories=="object"&&(t=N(N({},t),r.options.expandDirectories)),e(r.pattern,t)},qx=(r,e)=>r.options.expandDirectories?eSe(r,e):[r.pattern],UW=r=>r&&r.gitignore?Yx.sync({cwd:r.cwd,ignore:r.ignore}):MW,Jx=r=>e=>{let{options:t}=r;return t.ignore&&Array.isArray(t.ignore)&&t.expandDirectories&&(t.ignore=rw.sync(t.ignore)),{pattern:e,options:t}};Gc.exports=async(r,e)=>{let t=iw(r,e),i=async()=>e&&e.gitignore?Yx({cwd:e.cwd,ignore:e.ignore}):MW,n=async()=>{let l=await Promise.all(t.map(async c=>{let u=await qx(c,rw);return Promise.all(u.map(Jx(c)))}));return ew(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>tw(l.pattern,l.options)));return ew(...a).filter(l=>!s($Qe(l)))};Gc.exports.sync=(r,e)=>{let t=iw(r,e),i=[];for(let o of t){let a=qx(o,rw.sync).map(Jx(o));i.push(...a)}let n=UW(e),s=[];for(let o of i)s=ew(s,tw.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Gc.exports.stream=(r,e)=>{let t=iw(r,e),i=[];for(let a of t){let l=qx(a,rw.sync).map(Jx(a));i.push(...l)}let n=UW(e),s=new _Qe(a=>!n(a)),o=new VQe;return zQe(i.map(a=>tw.stream(a.pattern,a.options))).pipe(s).pipe(o)};Gc.exports.generateGlobTasks=iw;Gc.exports.hasMagic=(r,e)=>[].concat(r).some(t=>tw.isDynamicPattern(t,e));Gc.exports.gitignore=Yx});var Rn=w((xrt,t4)=>{function fSe(r){var e=typeof r;return r!=null&&(e=="object"||e=="function")}t4.exports=fSe});var rk=w((krt,r4)=>{var hSe=typeof global=="object"&&global&&global.Object===Object&&global;r4.exports=hSe});var Ns=w((Prt,i4)=>{var pSe=rk(),dSe=typeof self=="object"&&self&&self.Object===Object&&self,CSe=pSe||dSe||Function("return this")();i4.exports=CSe});var s4=w((Drt,n4)=>{var mSe=Ns(),ESe=function(){return mSe.Date.now()};n4.exports=ESe});var a4=w((Rrt,o4)=>{var ISe=/\s/;function ySe(r){for(var e=r.length;e--&&ISe.test(r.charAt(e)););return e}o4.exports=ySe});var l4=w((Frt,A4)=>{var wSe=a4(),BSe=/^\s+/;function bSe(r){return r&&r.slice(0,wSe(r)+1).replace(BSe,"")}A4.exports=bSe});var Jc=w((Nrt,c4)=>{var QSe=Ns(),SSe=QSe.Symbol;c4.exports=SSe});var h4=w((Lrt,u4)=>{var g4=Jc(),f4=Object.prototype,vSe=f4.hasOwnProperty,xSe=f4.toString,Ed=g4?g4.toStringTag:void 0;function kSe(r){var e=vSe.call(r,Ed),t=r[Ed];try{r[Ed]=void 0;var i=!0}catch(s){}var n=xSe.call(r);return i&&(e?r[Ed]=t:delete r[Ed]),n}u4.exports=kSe});var d4=w((Trt,p4)=>{var PSe=Object.prototype,DSe=PSe.toString;function RSe(r){return DSe.call(r)}p4.exports=RSe});var Wc=w((Ort,C4)=>{var m4=Jc(),FSe=h4(),NSe=d4(),LSe="[object Null]",TSe="[object Undefined]",E4=m4?m4.toStringTag:void 0;function OSe(r){return r==null?r===void 0?TSe:LSe:E4&&E4 in Object(r)?FSe(r):NSe(r)}C4.exports=OSe});var ta=w((Mrt,I4)=>{function MSe(r){return r!=null&&typeof r=="object"}I4.exports=MSe});var Id=w((Krt,y4)=>{var KSe=Wc(),USe=ta(),HSe="[object Symbol]";function jSe(r){return typeof r=="symbol"||USe(r)&&KSe(r)==HSe}y4.exports=jSe});var Q4=w((Urt,w4)=>{var GSe=l4(),B4=Rn(),YSe=Id(),b4=0/0,qSe=/^[-+]0x[0-9a-f]+$/i,JSe=/^0b[01]+$/i,WSe=/^0o[0-7]+$/i,zSe=parseInt;function _Se(r){if(typeof r=="number")return r;if(YSe(r))return b4;if(B4(r)){var e=typeof r.valueOf=="function"?r.valueOf():r;r=B4(e)?e+"":e}if(typeof r!="string")return r===0?r:+r;r=GSe(r);var t=JSe.test(r);return t||WSe.test(r)?zSe(r.slice(2),t?2:8):qSe.test(r)?b4:+r}w4.exports=_Se});var x4=w((Hrt,S4)=>{var VSe=Rn(),ik=s4(),v4=Q4(),XSe="Expected a function",ZSe=Math.max,$Se=Math.min;function eve(r,e,t){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof r!="function")throw new TypeError(XSe);e=v4(e)||0,VSe(t)&&(u=!!t.leading,g="maxWait"in t,s=g?ZSe(v4(t.maxWait)||0,e):s,f="trailing"in t?!!t.trailing:f);function h(Y){var $=i,_=n;return i=n=void 0,c=Y,o=r.apply(_,$),o}function p(Y){return c=Y,a=setTimeout(b,e),u?h(Y):o}function m(Y){var $=Y-l,_=Y-c,ne=e-$;return g?$Se(ne,s-_):ne}function y(Y){var $=Y-l,_=Y-c;return l===void 0||$>=e||$<0||g&&_>=s}function b(){var Y=ik();if(y(Y))return v(Y);a=setTimeout(b,m(Y))}function v(Y){return a=void 0,f&&i?h(Y):(i=n=void 0,o)}function x(){a!==void 0&&clearTimeout(a),c=0,i=l=n=a=void 0}function T(){return a===void 0?o:v(ik())}function q(){var Y=ik(),$=y(Y);if(i=arguments,n=this,l=Y,$){if(a===void 0)return p(l);if(g)return clearTimeout(a),a=setTimeout(b,e),h(l)}return a===void 0&&(a=setTimeout(b,e)),o}return q.cancel=x,q.flush=T,q}S4.exports=eve});var P4=w((jrt,k4)=>{var tve=x4(),rve=Rn(),ive="Expected a function";function nve(r,e,t){var i=!0,n=!0;if(typeof r!="function")throw new TypeError(ive);return rve(t)&&(i="leading"in t?!!t.leading:i,n="trailing"in t?!!t.trailing:n),tve(r,e,{leading:i,maxWait:e,trailing:n})}k4.exports=nve});var iA=w((rA,Bw)=>{"use strict";Object.defineProperty(rA,"__esModule",{value:!0});var M4=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Cve(r){return M4.includes(r)}var mve=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...M4];function Eve(r){return mve.includes(r)}var Ive=["null","undefined","string","number","bigint","boolean","symbol"];function yve(r){return Ive.includes(r)}function Xg(r){return e=>typeof e===r}var{toString:K4}=Object.prototype,vd=r=>{let e=K4.call(r).slice(8,-1);if(/HTML\w+Element/.test(e)&&W.domElement(r))return"HTMLElement";if(Eve(e))return e},hr=r=>e=>vd(e)===r;function W(r){if(r===null)return"null";switch(typeof r){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(W.observable(r))return"Observable";if(W.array(r))return"Array";if(W.buffer(r))return"Buffer";let e=vd(r);if(e)return e;if(r instanceof String||r instanceof Boolean||r instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}W.undefined=Xg("undefined");W.string=Xg("string");var wve=Xg("number");W.number=r=>wve(r)&&!W.nan(r);W.bigint=Xg("bigint");W.function_=Xg("function");W.null_=r=>r===null;W.class_=r=>W.function_(r)&&r.toString().startsWith("class ");W.boolean=r=>r===!0||r===!1;W.symbol=Xg("symbol");W.numericString=r=>W.string(r)&&!W.emptyStringOrWhitespace(r)&&!Number.isNaN(Number(r));W.array=(r,e)=>Array.isArray(r)?W.function_(e)?r.every(e):!0:!1;W.buffer=r=>{var e,t,i,n;return(n=(i=(t=(e=r)===null||e===void 0?void 0:e.constructor)===null||t===void 0?void 0:t.isBuffer)===null||i===void 0?void 0:i.call(t,r))!==null&&n!==void 0?n:!1};W.nullOrUndefined=r=>W.null_(r)||W.undefined(r);W.object=r=>!W.null_(r)&&(typeof r=="object"||W.function_(r));W.iterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.iterator])};W.asyncIterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.asyncIterator])};W.generator=r=>W.iterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.asyncGenerator=r=>W.asyncIterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.nativePromise=r=>hr("Promise")(r);var Bve=r=>{var e,t;return W.function_((e=r)===null||e===void 0?void 0:e.then)&&W.function_((t=r)===null||t===void 0?void 0:t.catch)};W.promise=r=>W.nativePromise(r)||Bve(r);W.generatorFunction=hr("GeneratorFunction");W.asyncGeneratorFunction=r=>vd(r)==="AsyncGeneratorFunction";W.asyncFunction=r=>vd(r)==="AsyncFunction";W.boundFunction=r=>W.function_(r)&&!r.hasOwnProperty("prototype");W.regExp=hr("RegExp");W.date=hr("Date");W.error=hr("Error");W.map=r=>hr("Map")(r);W.set=r=>hr("Set")(r);W.weakMap=r=>hr("WeakMap")(r);W.weakSet=r=>hr("WeakSet")(r);W.int8Array=hr("Int8Array");W.uint8Array=hr("Uint8Array");W.uint8ClampedArray=hr("Uint8ClampedArray");W.int16Array=hr("Int16Array");W.uint16Array=hr("Uint16Array");W.int32Array=hr("Int32Array");W.uint32Array=hr("Uint32Array");W.float32Array=hr("Float32Array");W.float64Array=hr("Float64Array");W.bigInt64Array=hr("BigInt64Array");W.bigUint64Array=hr("BigUint64Array");W.arrayBuffer=hr("ArrayBuffer");W.sharedArrayBuffer=hr("SharedArrayBuffer");W.dataView=hr("DataView");W.directInstanceOf=(r,e)=>Object.getPrototypeOf(r)===e.prototype;W.urlInstance=r=>hr("URL")(r);W.urlString=r=>{if(!W.string(r))return!1;try{return new URL(r),!0}catch(e){return!1}};W.truthy=r=>Boolean(r);W.falsy=r=>!r;W.nan=r=>Number.isNaN(r);W.primitive=r=>W.null_(r)||yve(typeof r);W.integer=r=>Number.isInteger(r);W.safeInteger=r=>Number.isSafeInteger(r);W.plainObject=r=>{if(K4.call(r)!=="[object Object]")return!1;let e=Object.getPrototypeOf(r);return e===null||e===Object.getPrototypeOf({})};W.typedArray=r=>Cve(vd(r));var bve=r=>W.safeInteger(r)&&r>=0;W.arrayLike=r=>!W.nullOrUndefined(r)&&!W.function_(r)&&bve(r.length);W.inRange=(r,e)=>{if(W.number(e))return r>=Math.min(0,e)&&r<=Math.max(e,0);if(W.array(e)&&e.length===2)return r>=Math.min(...e)&&r<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Qve=1,Sve=["innerHTML","ownerDocument","style","attributes","nodeValue"];W.domElement=r=>W.object(r)&&r.nodeType===Qve&&W.string(r.nodeName)&&!W.plainObject(r)&&Sve.every(e=>e in r);W.observable=r=>{var e,t,i,n;return r?r===((t=(e=r)[Symbol.observable])===null||t===void 0?void 0:t.call(e))||r===((n=(i=r)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};W.nodeStream=r=>W.object(r)&&W.function_(r.pipe)&&!W.observable(r);W.infinite=r=>r===Infinity||r===-Infinity;var U4=r=>e=>W.integer(e)&&Math.abs(e%2)===r;W.evenInteger=U4(0);W.oddInteger=U4(1);W.emptyArray=r=>W.array(r)&&r.length===0;W.nonEmptyArray=r=>W.array(r)&&r.length>0;W.emptyString=r=>W.string(r)&&r.length===0;W.nonEmptyString=r=>W.string(r)&&r.length>0;var vve=r=>W.string(r)&&!/\S/.test(r);W.emptyStringOrWhitespace=r=>W.emptyString(r)||vve(r);W.emptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length===0;W.nonEmptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length>0;W.emptySet=r=>W.set(r)&&r.size===0;W.nonEmptySet=r=>W.set(r)&&r.size>0;W.emptyMap=r=>W.map(r)&&r.size===0;W.nonEmptyMap=r=>W.map(r)&&r.size>0;W.propertyKey=r=>W.any([W.string,W.number,W.symbol],r);W.formData=r=>hr("FormData")(r);W.urlSearchParams=r=>hr("URLSearchParams")(r);var H4=(r,e,t)=>{if(!W.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(t.length===0)throw new TypeError("Invalid number of values");return r.call(t,e)};W.any=(r,...e)=>(W.array(r)?r:[r]).some(i=>H4(Array.prototype.some,i,e));W.all=(r,...e)=>H4(Array.prototype.every,r,e);var We=(r,e,t,i={})=>{if(!r){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(t.map(o=>`\`${W(o)}\``))].join(", ")}`:`received value of type \`${W(t)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};rA.assert={undefined:r=>We(W.undefined(r),"undefined",r),string:r=>We(W.string(r),"string",r),number:r=>We(W.number(r),"number",r),bigint:r=>We(W.bigint(r),"bigint",r),function_:r=>We(W.function_(r),"Function",r),null_:r=>We(W.null_(r),"null",r),class_:r=>We(W.class_(r),"Class",r),boolean:r=>We(W.boolean(r),"boolean",r),symbol:r=>We(W.symbol(r),"symbol",r),numericString:r=>We(W.numericString(r),"string with a number",r),array:(r,e)=>{We(W.array(r),"Array",r),e&&r.forEach(e)},buffer:r=>We(W.buffer(r),"Buffer",r),nullOrUndefined:r=>We(W.nullOrUndefined(r),"null or undefined",r),object:r=>We(W.object(r),"Object",r),iterable:r=>We(W.iterable(r),"Iterable",r),asyncIterable:r=>We(W.asyncIterable(r),"AsyncIterable",r),generator:r=>We(W.generator(r),"Generator",r),asyncGenerator:r=>We(W.asyncGenerator(r),"AsyncGenerator",r),nativePromise:r=>We(W.nativePromise(r),"native Promise",r),promise:r=>We(W.promise(r),"Promise",r),generatorFunction:r=>We(W.generatorFunction(r),"GeneratorFunction",r),asyncGeneratorFunction:r=>We(W.asyncGeneratorFunction(r),"AsyncGeneratorFunction",r),asyncFunction:r=>We(W.asyncFunction(r),"AsyncFunction",r),boundFunction:r=>We(W.boundFunction(r),"Function",r),regExp:r=>We(W.regExp(r),"RegExp",r),date:r=>We(W.date(r),"Date",r),error:r=>We(W.error(r),"Error",r),map:r=>We(W.map(r),"Map",r),set:r=>We(W.set(r),"Set",r),weakMap:r=>We(W.weakMap(r),"WeakMap",r),weakSet:r=>We(W.weakSet(r),"WeakSet",r),int8Array:r=>We(W.int8Array(r),"Int8Array",r),uint8Array:r=>We(W.uint8Array(r),"Uint8Array",r),uint8ClampedArray:r=>We(W.uint8ClampedArray(r),"Uint8ClampedArray",r),int16Array:r=>We(W.int16Array(r),"Int16Array",r),uint16Array:r=>We(W.uint16Array(r),"Uint16Array",r),int32Array:r=>We(W.int32Array(r),"Int32Array",r),uint32Array:r=>We(W.uint32Array(r),"Uint32Array",r),float32Array:r=>We(W.float32Array(r),"Float32Array",r),float64Array:r=>We(W.float64Array(r),"Float64Array",r),bigInt64Array:r=>We(W.bigInt64Array(r),"BigInt64Array",r),bigUint64Array:r=>We(W.bigUint64Array(r),"BigUint64Array",r),arrayBuffer:r=>We(W.arrayBuffer(r),"ArrayBuffer",r),sharedArrayBuffer:r=>We(W.sharedArrayBuffer(r),"SharedArrayBuffer",r),dataView:r=>We(W.dataView(r),"DataView",r),urlInstance:r=>We(W.urlInstance(r),"URL",r),urlString:r=>We(W.urlString(r),"string with a URL",r),truthy:r=>We(W.truthy(r),"truthy",r),falsy:r=>We(W.falsy(r),"falsy",r),nan:r=>We(W.nan(r),"NaN",r),primitive:r=>We(W.primitive(r),"primitive",r),integer:r=>We(W.integer(r),"integer",r),safeInteger:r=>We(W.safeInteger(r),"integer",r),plainObject:r=>We(W.plainObject(r),"plain object",r),typedArray:r=>We(W.typedArray(r),"TypedArray",r),arrayLike:r=>We(W.arrayLike(r),"array-like",r),domElement:r=>We(W.domElement(r),"HTMLElement",r),observable:r=>We(W.observable(r),"Observable",r),nodeStream:r=>We(W.nodeStream(r),"Node.js Stream",r),infinite:r=>We(W.infinite(r),"infinite number",r),emptyArray:r=>We(W.emptyArray(r),"empty array",r),nonEmptyArray:r=>We(W.nonEmptyArray(r),"non-empty array",r),emptyString:r=>We(W.emptyString(r),"empty string",r),nonEmptyString:r=>We(W.nonEmptyString(r),"non-empty string",r),emptyStringOrWhitespace:r=>We(W.emptyStringOrWhitespace(r),"empty string or whitespace",r),emptyObject:r=>We(W.emptyObject(r),"empty object",r),nonEmptyObject:r=>We(W.nonEmptyObject(r),"non-empty object",r),emptySet:r=>We(W.emptySet(r),"empty set",r),nonEmptySet:r=>We(W.nonEmptySet(r),"non-empty set",r),emptyMap:r=>We(W.emptyMap(r),"empty map",r),nonEmptyMap:r=>We(W.nonEmptyMap(r),"non-empty map",r),propertyKey:r=>We(W.propertyKey(r),"PropertyKey",r),formData:r=>We(W.formData(r),"FormData",r),urlSearchParams:r=>We(W.urlSearchParams(r),"URLSearchParams",r),evenInteger:r=>We(W.evenInteger(r),"even integer",r),oddInteger:r=>We(W.oddInteger(r),"odd integer",r),directInstanceOf:(r,e)=>We(W.directInstanceOf(r,e),"T",r),inRange:(r,e)=>We(W.inRange(r,e),"in range",r),any:(r,...e)=>We(W.any(r,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(r,...e)=>We(W.all(r,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(W,{class:{value:W.class_},function:{value:W.function_},null:{value:W.null_}});Object.defineProperties(rA.assert,{class:{value:rA.assert.class_},function:{value:rA.assert.function_},null:{value:rA.assert.null_}});rA.default=W;Bw.exports=W;Bw.exports.default=W;Bw.exports.assert=rA.assert});var j4=w((Wit,Bk)=>{"use strict";var bk=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},xd=class{static fn(e){return(...t)=>new xd((i,n,s)=>{t.push(s),e(...t).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,i)=>{this._reject=i;let n=a=>{this._isPending=!1,t(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let t of this._cancelHandlers)t()}catch(t){this._reject(t)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new bk(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(xd.prototype,Promise.prototype);Bk.exports=xd;Bk.exports.CancelError=bk});var G4=w((Qk,Sk)=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});var xve=require("tls"),vk=(r,e)=>{let t;typeof e=="function"?t={connect:e}:t=e;let i=typeof t.connect=="function",n=typeof t.secureConnect=="function",s=typeof t.close=="function",o=()=>{i&&t.connect(),r instanceof xve.TLSSocket&&n&&(r.authorized?t.secureConnect():r.authorizationError||r.once("secureConnect",t.secureConnect)),s&&r.once("close",t.close)};r.writable&&!r.connecting?o():r.connecting?r.once("connect",o):r.destroyed&&s&&t.close(r._hadError)};Qk.default=vk;Sk.exports=vk;Sk.exports.default=vk});var Y4=w((xk,kk)=>{"use strict";Object.defineProperty(xk,"__esModule",{value:!0});var kve=G4(),Pve=Number(process.versions.node.split(".")[0]),Pk=r=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};r.timings=e;let t=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};t(r),r.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||Pve>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),kve.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};r.socket?i(r.socket):r.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof r.writableFinished=="boolean"?r.writableFinished:r.finished&&r.outputSize===0&&(!r.socket||r.socket.writableLength===0))()?n():r.prependOnceListener("finish",n),r.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,t(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};xk.default=Pk;kk.exports=Pk;kk.exports.default=Pk});var X4=w((zit,Dk)=>{"use strict";var{V4MAPPED:Dve,ADDRCONFIG:Rve,ALL:q4,promises:{Resolver:J4},lookup:Fve}=require("dns"),{promisify:Rk}=require("util"),Nve=require("os"),Zg=Symbol("cacheableLookupCreateConnection"),Fk=Symbol("cacheableLookupInstance"),W4=Symbol("expires"),Lve=typeof q4=="number",z4=r=>{if(!(r&&typeof r.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Tve=r=>{for(let e of r)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},_4=()=>{let r=!1,e=!1;for(let t of Object.values(Nve.networkInterfaces()))for(let i of t)if(!i.internal&&(i.family==="IPv6"?e=!0:r=!0,r&&e))return{has4:r,has6:e};return{has4:r,has6:e}},Ove=r=>Symbol.iterator in r,V4={ttl:!0},Mve={all:!0},Nk=class{constructor({cache:e=new Map,maxTtl:t=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new J4,lookup:o=Fve}={}){if(this.maxTtl=t,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Rk(o),this._resolver instanceof J4?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Rk(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Rk(this._resolver.resolve6.bind(this._resolver))),this._iface=_4(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,i){if(typeof t=="function"?(i=t,t={}):typeof t=="number"&&(t={family:t}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,t).then(n=>{t.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,t={}){typeof t=="number"&&(t={family:t});let i=await this.query(e);if(t.family===6){let n=i.filter(s=>s.family===6);t.hints&Dve&&(Lve&&t.hints&q4||n.length===0)?Tve(i):i=n}else t.family===4&&(i=i.filter(n=>n.family===4));if(t.hints&Rve){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return t.all?i:i[0]}async query(e){let t=await this._cache.get(e);if(!t){let i=this._pending[e];if(i)t=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,t=await n}}return t=t.map(i=>N({},i)),t}async _resolve(e){let t=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,V4),this._resolve6(e,V4)].map(c=>t(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(t){return{entries:[],cacheTtl:0}}}async _set(e,t,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,t[W4]=Date.now()+i;try{await this._cache.set(e,t,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Ove(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Mve);try{let t=await this._resolve(e);t.entries.length===0&&this._fallback&&(t=await this._lookup(e),t.entries.length!==0&&this._hostnamesToFallback.add(e));let i=t.entries.length===0?this.errorTtl:t.cacheTtl;return await this._set(e,t.entries,i),delete this._pending[e],t.entries}catch(t){throw delete this._pending[e],t}}_tick(e){let t=this._nextRemovalTime;(!t||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[W4];n>=a?this._cache.delete(s):a("lookup"in t||(t.lookup=this.lookup),e[Zg](t,i))}uninstall(e){if(z4(e),e[Zg]){if(e[Fk]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Zg],delete e[Zg],delete e[Fk]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=_4(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};Dk.exports=Nk;Dk.exports.default=Nk});var e8=w((_it,Lk)=>{"use strict";var Kve=typeof URL=="undefined"?require("url").URL:URL,Uve="text/plain",Hve="us-ascii",Z4=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),jve=(r,{stripHash:e})=>{let t=r.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!t)throw new Error(`Invalid URL: ${r}`);let i=t[1].split(";"),n=t[2],s=e?"":t[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Hve)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==Uve)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},$4=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(r=r.trim(),/^data:/i.test(r))return jve(r,e);let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new Kve(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];Z4(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])Z4(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),r=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};Lk.exports=$4;Lk.exports.default=$4});var i8=w((Vit,t8)=>{t8.exports=r8;function r8(r,e){if(r&&e)return r8(r)(e);if(typeof r!="function")throw new TypeError("need wrapper function");return Object.keys(r).forEach(function(i){t[i]=r[i]}),t;function t(){for(var i=new Array(arguments.length),n=0;n{var n8=i8();Tk.exports=n8(bw);Tk.exports.strict=n8(s8);bw.proto=bw(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return bw(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return s8(this)},configurable:!0})});function bw(r){var e=function(){return e.called?e.value:(e.called=!0,e.value=r.apply(this,arguments))};return e.called=!1,e}function s8(r){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=r.apply(this,arguments)},t=r.name||"Function wrapped with `once`";return e.onceError=t+" shouldn't be called more than once",e.called=!1,e}});var Mk=w((Zit,o8)=>{var Gve=Ok(),Yve=function(){},qve=function(r){return r.setHeader&&typeof r.abort=="function"},Jve=function(r){return r.stdio&&Array.isArray(r.stdio)&&r.stdio.length===3},a8=function(r,e,t){if(typeof e=="function")return a8(r,null,e);e||(e={}),t=Gve(t||Yve);var i=r._writableState,n=r._readableState,s=e.readable||e.readable!==!1&&r.readable,o=e.writable||e.writable!==!1&&r.writable,a=function(){r.writable||l()},l=function(){o=!1,s||t.call(r)},c=function(){s=!1,o||t.call(r)},u=function(p){t.call(r,p?new Error("exited with error code: "+p):null)},g=function(p){t.call(r,p)},f=function(){if(s&&!(n&&n.ended))return t.call(r,new Error("premature close"));if(o&&!(i&&i.ended))return t.call(r,new Error("premature close"))},h=function(){r.req.on("finish",l)};return qve(r)?(r.on("complete",l),r.on("abort",f),r.req?h():r.on("request",h)):o&&!i&&(r.on("end",a),r.on("close",a)),Jve(r)&&r.on("exit",u),r.on("end",c),r.on("finish",l),e.error!==!1&&r.on("error",g),r.on("close",f),function(){r.removeListener("complete",l),r.removeListener("abort",f),r.removeListener("request",h),r.req&&r.req.removeListener("finish",l),r.removeListener("end",a),r.removeListener("close",a),r.removeListener("finish",l),r.removeListener("exit",u),r.removeListener("end",c),r.removeListener("error",g),r.removeListener("close",f)}};o8.exports=a8});var c8=w(($it,A8)=>{var Wve=Ok(),zve=Mk(),Kk=require("fs"),kd=function(){},_ve=/^v?\.0/.test(process.version),Qw=function(r){return typeof r=="function"},Vve=function(r){return!_ve||!Kk?!1:(r instanceof(Kk.ReadStream||kd)||r instanceof(Kk.WriteStream||kd))&&Qw(r.close)},Xve=function(r){return r.setHeader&&Qw(r.abort)},Zve=function(r,e,t,i){i=Wve(i);var n=!1;r.on("close",function(){n=!0}),zve(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Vve(r))return r.close(kd);if(Xve(r))return r.abort();if(Qw(r.destroy))return r.destroy();i(o||new Error("stream was destroyed"))}}},l8=function(r){r()},$ve=function(r,e){return r.pipe(e)},exe=function(){var r=Array.prototype.slice.call(arguments),e=Qw(r[r.length-1]||kd)&&r.pop()||kd;if(Array.isArray(r[0])&&(r=r[0]),r.length<2)throw new Error("pump requires two streams per minimum");var t,i=r.map(function(n,s){var o=s0;return Zve(n,o,a,function(l){t||(t=l),l&&i.forEach(l8),!o&&(i.forEach(l8),e(t))})});return r.reduce($ve)};A8.exports=exe});var g8=w((ent,u8)=>{"use strict";var{PassThrough:txe}=require("stream");u8.exports=r=>{r=N({},r);let{array:e}=r,{encoding:t}=r,i=t==="buffer",n=!1;e?n=!(t||i):t=t||"utf8",i&&(t=null);let s=new txe({objectMode:n});t&&s.setEncoding(t);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var f8=w((tnt,$g)=>{"use strict";var rxe=c8(),ixe=g8(),Uk=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Sw(r,e){if(!r)return Promise.reject(new Error("Expected a stream"));e=N({maxBuffer:Infinity},e);let{maxBuffer:t}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=rxe(r,ixe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>t&&o(new Uk)})}),i.getBufferedValue()}$g.exports=Sw;$g.exports.default=Sw;$g.exports.buffer=(r,e)=>Sw(r,te(N({},e),{encoding:"buffer"}));$g.exports.array=(r,e)=>Sw(r,te(N({},e),{array:!0}));$g.exports.MaxBufferError=Uk});var p8=w((int,h8)=>{"use strict";var nxe=[200,203,204,206,300,301,404,405,410,414,501],sxe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],oxe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},axe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Hk(r){let e={};if(!r)return e;let t=r.trim().split(/\s*,\s*/);for(let i of t){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function Axe(r){let e=[];for(let t in r){let i=r[t];e.push(i===!0?t:t+"="+i)}if(!!e.length)return e.join(", ")}h8.exports=class{constructor(e,t,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!t||!t.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in t?t.status:200,this._resHeaders=t.headers,this._rescc=Hk(t.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=Hk(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Axe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!t.headers["cache-control"]&&/no-cache/.test(t.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&sxe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||nxe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let t=Hk(e.headers["cache-control"]);return t["no-cache"]||/no-cache/.test(e.headers.pragma)||t["max-age"]&&this.age()>t["max-age"]||t["min-fresh"]&&this.timeToLive()<1e3*t["min-fresh"]||this.stale()&&!(t["max-stale"]&&!this._rescc["must-revalidate"]&&(t["max-stale"]===!0||t["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let t=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of t)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let t={};for(let i in e)oxe[i]||(t[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete t[n]}if(t.warning){let i=t.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?t.warning=i.join(",").trim():delete t.warning}return t}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(t)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let t=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let t=(this.now()-this._responseTime)/1e3;return e+t}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,t=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(t-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete t["if-none-match"],delete t["if-modified-since"],t;if(this._resHeaders.etag&&(t["if-none-match"]=t["if-none-match"]?`${t["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),t["accept-ranges"]||t["if-match"]||t["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete t["if-modified-since"],t["if-none-match"]){let n=t["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?t["if-none-match"]=n.join(",").trim():delete t["if-none-match"]}}else this._resHeaders["last-modified"]&&!t["if-modified-since"]&&(t["if-modified-since"]=this._resHeaders["last-modified"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),!t||!t.headers)throw Error("Response headers missing");let i=!1;if(t.status!==void 0&&t.status!=304?i=!1:t.headers.etag&&!/^\s*W\//.test(t.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===t.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!t.headers.etag&&!t.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,t),modified:t.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in t.headers&&!axe[o]?t.headers[o]:this._resHeaders[o];let s=Object.assign({},t,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var vw=w((nnt,d8)=>{"use strict";d8.exports=r=>{let e={};for(let[t,i]of Object.entries(r))e[t.toLowerCase()]=i;return e}});var E8=w((snt,C8)=>{"use strict";var lxe=require("stream").Readable,cxe=vw(),m8=class extends lxe{constructor(e,t,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof t!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=cxe(t),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};C8.exports=m8});var y8=w((ont,I8)=>{"use strict";var uxe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];I8.exports=(r,e)=>{let t=new Set(Object.keys(r).concat(uxe));for(let i of t)i in e||(e[i]=typeof r[i]=="function"?r[i].bind(r):r[i])}});var B8=w((ant,w8)=>{"use strict";var gxe=require("stream").PassThrough,fxe=y8(),hxe=r=>{if(!(r&&r.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new gxe;return fxe(r,e),r.pipe(e)};w8.exports=hxe});var b8=w(jk=>{jk.stringify=function r(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var t="",i=Array.isArray(e);t=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(t+=","),n=!1,i?e[s]==null?t+="null":t+=r(e[s]):e[s]!==void 0&&(t+=r(s)+":"+r(e[s])))}return t+=i?"]":"}",t}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};jk.parse=function(r){return JSON.parse(r,function(e,t){return typeof t=="string"?/^:base64:/.test(t)?Buffer.from(t.substring(8),"base64"):/^:/.test(t)?t.substring(1):t:t})}});var x8=w((lnt,Q8)=>{"use strict";var pxe=require("events"),S8=b8(),dxe=r=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(r.adapter||r.uri){let t=r.adapter||/^[^:]*/.exec(r.uri)[0];return new(require(e[t]))(r)}return new Map},v8=class extends pxe{constructor(e,t){super();if(this.opts=Object.assign({namespace:"keyv",serialize:S8.stringify,deserialize:S8.parse},typeof e=="string"?{uri:e}:e,t),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=dxe(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return t&&t.raw?n:n.value}})}set(e,t,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return t={value:t,expires:s},this.opts.serialize(t)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};Q8.exports=v8});var D8=w((cnt,k8)=>{"use strict";var Cxe=require("events"),xw=require("url"),mxe=e8(),Exe=f8(),Gk=p8(),P8=E8(),Ixe=vw(),yxe=B8(),wxe=x8(),ia=class{constructor(e,t){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new wxe({uri:typeof t=="string"&&t,store:typeof t!="string"&&t,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,i)=>{let n;if(typeof t=="string")n=Yk(xw.parse(t)),t={};else if(t instanceof xw.URL)n=Yk(xw.parse(t.toString())),t={};else{let[g,...f]=(t.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=Yk(te(N({},t),{pathname:g,search:h}))}t=N(N({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},t),Bxe(n)),t.headers=Ixe(t.headers);let s=new Cxe,o=mxe(xw.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${t.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(y=>{h=()=>{f||(f=!0,y())}}),m=y=>{if(l&&!g.forceRefresh){y.status=y.statusCode;let v=Gk.fromObject(l.cachePolicy).revalidatedPolicy(g,y);if(!v.modified){let x=v.policy.responseHeaders();y=new P8(l.statusCode,x,l.body,l.url),y.cachePolicy=v.policy,y.fromCache=!0}}y.fromCache||(y.cachePolicy=new Gk(g,y,g),y.fromCache=!1);let b;g.cache&&y.cachePolicy.storable()?(b=yxe(y),(async()=>{try{let v=Exe.buffer(y);if(await Promise.race([p,new Promise(Y=>y.once("end",Y))]),f)return;let x=await v,T={cachePolicy:y.cachePolicy.toObject(),url:y.url,statusCode:y.fromCache?l.statusCode:y.statusCode,body:x},q=g.strictTtl?y.cachePolicy.timeToLive():void 0;g.maxTtl&&(q=q?Math.min(q,g.maxTtl):g.maxTtl),await this.cache.set(a,T,q)}catch(v){s.emit("error",new ia.CacheError(v))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(v){s.emit("error",new ia.CacheError(v))}})(),s.emit("response",b||y),typeof i=="function"&&i(b||y)};try{let y=e(g,m);y.once("error",h),y.once("abort",h),s.emit("request",y)}catch(y){s.emit("error",new ia.RequestError(y))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let m=Gk.fromObject(p.cachePolicy);if(m.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let y=m.responseHeaders(),b=new P8(p.statusCode,y,p.body,p.url);b.cachePolicy=m,b.fromCache=!0,s.emit("response",b),typeof i=="function"&&i(b)}else l=p,h.headers=m.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new ia.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(t)}catch(h){t.automaticFailover&&!c&&u(t),s.emit("error",new ia.CacheError(h))}})(),s}}};function Bxe(r){let e=N({},r);return e.path=`${r.pathname||"/"}${r.search||""}`,delete e.pathname,delete e.search,e}function Yk(r){return{protocol:r.protocol,auth:r.auth,hostname:r.hostname||r.host||"localhost",port:r.port,pathname:r.pathname,search:r.search}}ia.RequestError=class extends Error{constructor(r){super(r.message);this.name="RequestError",Object.assign(this,r)}};ia.CacheError=class extends Error{constructor(r){super(r.message);this.name="CacheError",Object.assign(this,r)}};k8.exports=ia});var F8=w((unt,R8)=>{"use strict";var bxe=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];R8.exports=(r,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let t=new Set(Object.keys(r).concat(bxe)),i={};for(let n of t)n in e||(i[n]={get(){let s=r[n];return typeof s=="function"?s.bind(r):s},set(s){r[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),r.once("aborted",()=>{e.destroy(),e.emit("aborted")}),r.once("close",()=>{r.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var L8=w((gnt,N8)=>{"use strict";var{Transform:Qxe,PassThrough:Sxe}=require("stream"),qk=require("zlib"),vxe=F8();N8.exports=r=>{let e=(r.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return r;let t=e==="br";if(t&&typeof qk.createBrotliDecompress!="function")return r.destroy(new Error("Brotli is not supported on Node.js < 12")),r;let i=!0,n=new Qxe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new Sxe({autoDestroy:!1,destroy(a,l){r.destroy(),l(a)}}),o=t?qk.createBrotliDecompress():qk.createUnzip();return o.once("error",a=>{if(i&&!r.readable){s.end();return}s.destroy(a)}),vxe(r,s),r.pipe(n).pipe(o).pipe(s),s}});var Jk=w((fnt,T8)=>{"use strict";var O8=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};T8.exports=O8});var zk=w((hnt,M8)=>{"use strict";var xxe=require("events"),kxe=require("tls"),Pxe=require("http2"),Dxe=Jk(),gn=Symbol("currentStreamsCount"),K8=Symbol("request"),Ls=Symbol("cachedOriginSet"),ef=Symbol("gracefullyClosing"),Rxe=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Fxe=(r,e,t)=>{let i=0,n=r.length;for(;i>>1;t(r[s],e)?i=s+1:n=s}return i},Nxe=(r,e)=>r.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,Wk=(r,e)=>{for(let t of r)t[Ls].lengthe[Ls].includes(i))&&t[gn]+e[gn]<=e.remoteSettings.maxConcurrentStreams&&U8(t)},Lxe=(r,e)=>{for(let t of r)e[Ls].lengtht[Ls].includes(i))&&e[gn]+t[gn]<=t.remoteSettings.maxConcurrentStreams&&U8(e)},H8=({agent:r,isFree:e})=>{let t={};for(let i in r.sessions){let s=r.sessions[i].filter(o=>{let a=o[nA.kCurrentStreamsCount]{r[ef]=!0,r[gn]===0&&r.close()},nA=class extends xxe{constructor({timeout:e=6e4,maxSessions:t=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Dxe({maxSize:n})}static normalizeOrigin(e,t){return typeof e=="string"&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t="";if(e)for(let i of Rxe)e[i]&&(t+=`:${e[i]}`);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;let i=this.queue[e][t];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(t),a=nA.normalizeOrigin(e,t&&t.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let m=p.remoteSettings.maxConcurrentStreams;if(m=m||p[ef]||p.destroyed)continue;h||(g=m),y>f&&(h=p,f=y)}}if(h){if(i.length!==1){for(let{reject:p}of i){let m=new Error(`Expected the length of listeners to be 1, got ${i.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);p(m)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=Pxe.connect(e,N({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},t));f[gn]=0,f[ef]=!1;let h=()=>f[gn]{this.tlsSessionCache.set(u,y)}),f.once("error",y=>{for(let{reject:b}of i)b(y);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let y=this.sessions[o];y.splice(y.indexOf(f),1),y.length===0&&delete this.sessions[o]}else{let y=new Error("Session closed without receiving a SETTINGS frame");y.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:b}of i)b(y);l()}this._tryToCreateNewSession(o,a)});let m=()=>{if(!(!(o in this.queue)||!h())){for(let y of f[Ls])if(y in this.queue[o]){let{listeners:b}=this.queue[o][y];for(;b.length!==0&&h();)b.shift().resolve(f);let v=this.queue[o];if(v[y].listeners.length===0&&(delete v[y],Object.keys(v).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[Ls]=f.originSet,!!h()&&(m(),Wk(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let y=new Error("Agent has been destroyed");for(let b of i)b.reject(y);f.destroy();return}f[Ls]=f.originSet;{let y=this.sessions;if(o in y){let b=y[o];b.splice(Fxe(b,f,Nxe),0,f)}else y[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),m(),l(),f[gn]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,t,i),i.length=0),f.on("remoteSettings",()=>{m(),Wk(this.sessions[o],f)})}),f[K8]=f.request,f.request=(y,b)=>{if(f[ef])throw new Error("The session is gracefully closing. No new streams are allowed.");let v=f[K8](y,b);return f.ref(),++f[gn],f[gn]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,v.once("close",()=>{if(p=h(),--f[gn],!f.destroyed&&!f.closed&&(Lxe(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let x=f[gn]===0;x&&f.unref(),x&&(this._freeSessionsCount>this.maxFreeSessions||f[ef])?f.close():(Wk(this.sessions[o],f),m())}}),v}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,t,i,n){return new Promise((s,o)=>{this.getSession(e,t,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,t){return nA.connect(e,t)}static connect(e,t){t.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof t.servername=="undefined"&&(t.servername=n),kxe.connect(i,n,t)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let t of e)t[gn]===0&&t.close()}destroy(e){for(let t of Object.values(this.sessions))for(let i of t)i.destroy(e);for(let t of Object.values(this.queue))for(let i of Object.values(t))i.destroyed=!0;this.queue={}}get freeSessions(){return H8({agent:this,isFree:!0})}get busySessions(){return H8({agent:this,isFree:!1})}};nA.kCurrentStreamsCount=gn;nA.kGracefullyClosing=ef;M8.exports={Agent:nA,globalAgent:new nA}});var _k=w((pnt,j8)=>{"use strict";var{Readable:Txe}=require("stream"),G8=class extends Txe{constructor(e,t){super({highWaterMark:t,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};j8.exports=G8});var Vk=w((dnt,Y8)=>{"use strict";Y8.exports=r=>{let e={protocol:r.protocol,hostname:typeof r.hostname=="string"&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return typeof r.port=="string"&&r.port.length!==0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var J8=w((Cnt,q8)=>{"use strict";q8.exports=(r,e,t)=>{for(let i of t)r.on(i,(...n)=>e.emit(i,...n))}});var z8=w((mnt,W8)=>{"use strict";W8.exports=r=>{switch(r){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var V8=w((Int,_8)=>{"use strict";var tf=(r,e,t)=>{_8.exports[e]=class extends r{constructor(...n){super(typeof t=="string"?t:t(n));this.name=`${super.name} [${e}]`,this.code=e}}};tf(TypeError,"ERR_INVALID_ARG_TYPE",r=>{let e=r[0].includes(".")?"property":"argument",t=r[1],i=Array.isArray(t);return i&&(t=`${t.slice(0,-1).join(", ")} or ${t.slice(-1)}`),`The "${r[0]}" ${e} must be ${i?"one of":"of"} type ${t}. Received ${typeof r[2]}`});tf(TypeError,"ERR_INVALID_PROTOCOL",r=>`Protocol "${r[0]}" not supported. Expected "${r[1]}"`);tf(Error,"ERR_HTTP_HEADERS_SENT",r=>`Cannot ${r[0]} headers after they are sent to the client`);tf(TypeError,"ERR_INVALID_HTTP_TOKEN",r=>`${r[0]} must be a valid HTTP token [${r[1]}]`);tf(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",r=>`Invalid value "${r[0]} for header "${r[1]}"`);tf(TypeError,"ERR_INVALID_CHAR",r=>`Invalid character in ${r[0]} [${r[1]}]`)});var eP=w((ynt,X8)=>{"use strict";var Oxe=require("http2"),{Writable:Mxe}=require("stream"),{Agent:Z8,globalAgent:Kxe}=zk(),Uxe=_k(),Hxe=Vk(),jxe=J8(),Gxe=z8(),{ERR_INVALID_ARG_TYPE:Xk,ERR_INVALID_PROTOCOL:Yxe,ERR_HTTP_HEADERS_SENT:$8,ERR_INVALID_HTTP_TOKEN:qxe,ERR_HTTP_INVALID_HEADER_VALUE:Jxe,ERR_INVALID_CHAR:Wxe}=V8(),{HTTP2_HEADER_STATUS:ez,HTTP2_HEADER_METHOD:tz,HTTP2_HEADER_PATH:rz,HTTP2_METHOD_CONNECT:zxe}=Oxe.constants,Wi=Symbol("headers"),Zk=Symbol("origin"),$k=Symbol("session"),iz=Symbol("options"),kw=Symbol("flushedHeaders"),Pd=Symbol("jobs"),_xe=/^[\^`\-\w!#$%&*+.|~]+$/,Vxe=/[^\t\u0020-\u007E\u0080-\u00FF]/,nz=class extends Mxe{constructor(e,t,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Hxe(e instanceof URL?e:new URL(e))),typeof t=="function"||t===void 0?(i=t,t=n?e:N({},e)):t=N(N({},e),t),t.h2session)this[$k]=t.h2session;else if(t.agent===!1)this.agent=new Z8({maxFreeSessions:0});else if(typeof t.agent=="undefined"||t.agent===null)typeof t.createConnection=="function"?(this.agent=new Z8({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=Kxe;else if(typeof t.agent.request=="function")this.agent=t.agent;else throw new Xk("options.agent",["Agent-like Object","undefined","false"],t.agent);if(t.protocol&&t.protocol!=="https:")throw new Yxe(t.protocol,"https:");let s=t.port||t.defaultPort||this.agent&&this.agent.defaultPort||443,o=t.hostname||t.host||"localhost";delete t.hostname,delete t.host,delete t.port;let{timeout:a}=t;if(t.timeout=void 0,this[Wi]=Object.create(null),this[Pd]=[],this.socket=null,this.connection=null,this.method=t.method||"GET",this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(let[l,c]of Object.entries(t.headers))this.setHeader(l,c);t.auth&&!("authorization"in this[Wi])&&(this[Wi].authorization="Basic "+Buffer.from(t.auth).toString("base64")),t.session=t.tlsSession,t.path=t.socketPath,this[iz]=t,s===443?(this[Zk]=`https://${o}`,":authority"in this[Wi]||(this[Wi][":authority"]=o)):(this[Zk]=`https://${o}:${s}`,":authority"in this[Wi]||(this[Wi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[kw]=!1}get method(){return this[Wi][tz]}set method(e){e&&(this[Wi][tz]=e.toUpperCase())}get path(){return this[Wi][rz]}set path(e){e&&(this[Wi][rz]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,t,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,t,i);this._request?n():this[Pd].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let t=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?t():this[Pd].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[kw]||this.destroyed)return;this[kw]=!0;let e=this.method===zxe,t=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||jxe(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new Uxe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[ez],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[ez]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[Pd])o();this.emit("socket",this.socket)};if(this[$k])try{t(this[$k].request(this[Wi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[Zk],this[iz],this[Wi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new Xk("name","string",e);return this[Wi][e.toLowerCase()]}get headersSent(){return this[kw]}removeHeader(e){if(typeof e!="string")throw new Xk("name","string",e);if(this.headersSent)throw new $8("remove");delete this[Wi][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new $8("set");if(typeof e!="string"||!_xe.test(e)&&!Gxe(e))throw new qxe("Header name",e);if(typeof t=="undefined")throw new Jxe(t,e);if(Vxe.test(t))throw new Wxe("header content",e);this[Wi][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){let i=()=>this._request.setTimeout(e,t);return this._request?i():this[Pd].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};X8.exports=nz});var oz=w((wnt,sz)=>{"use strict";var Xxe=require("tls");sz.exports=(r={})=>new Promise((e,t)=>{let i=Xxe.connect(r,()=>{r.resolveSocket?(i.off("error",t),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",t)})});var Az=w((Bnt,az)=>{"use strict";var Zxe=require("net");az.exports=r=>{let e=r.host,t=r.headers&&r.headers.host;return t&&(t.startsWith("[")?t.indexOf("]")===-1?e=t:e=t.slice(1,-1):e=t.split(":",1)[0]),Zxe.isIP(e)?"":e}});var uz=w((bnt,tP)=>{"use strict";var lz=require("http"),rP=require("https"),$xe=oz(),eke=Jk(),tke=eP(),rke=Az(),ike=Vk(),Pw=new eke({maxSize:100}),Dd=new Map,cz=(r,e,t)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{r.emit("free",e,t)};e.on("free",i);let n=()=>{r.removeSocket(e,t)};e.on("close",n);let s=()=>{r.removeSocket(e,t),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),r.emit("free",e,t)},nke=async r=>{let e=`${r.host}:${r.port}:${r.ALPNProtocols.sort()}`;if(!Pw.has(e)){if(Dd.has(e))return(await Dd.get(e)).alpnProtocol;let{path:t,agent:i}=r;r.path=r.socketPath;let n=$xe(r);Dd.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Pw.set(e,o),r.path=t,o==="h2")s.destroy();else{let{globalAgent:a}=rP,l=rP.Agent.prototype.createConnection;i?i.createConnection===l?cz(i,s,r):s.destroy():a.createConnection===l?cz(a,s,r):s.destroy()}return Dd.delete(e),o}catch(s){throw Dd.delete(e),s}}return Pw.get(e)};tP.exports=async(r,e,t)=>{if((typeof r=="string"||r instanceof URL)&&(r=ike(new URL(r))),typeof e=="function"&&(t=e,e=void 0),e=te(N(N({ALPNProtocols:["h2","http/1.1"]},r),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||rke(e),e.port=e.port||(i?443:80),e._defaultAgent=i?rP.globalAgent:lz.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await nke(e)==="h2"?(n&&(e.agent=n.http2),new tke(e,t)):lz.request(e,t)};tP.exports.protocolCache=Pw});var fz=w((Qnt,gz)=>{"use strict";var ske=require("http2"),oke=zk(),iP=eP(),ake=_k(),Ake=uz(),lke=(r,e,t)=>new iP(r,e,t),cke=(r,e,t)=>{let i=new iP(r,e,t);return i.end(),i};gz.exports=te(N(te(N({},ske),{ClientRequest:iP,IncomingMessage:ake}),oke),{request:lke,get:cke,auto:Ake})});var sP=w(nP=>{"use strict";Object.defineProperty(nP,"__esModule",{value:!0});var hz=iA();nP.default=r=>hz.default.nodeStream(r)&&hz.default.function_(r.getBoundary)});var mz=w(oP=>{"use strict";Object.defineProperty(oP,"__esModule",{value:!0});var pz=require("fs"),dz=require("util"),Cz=iA(),uke=sP(),gke=dz.promisify(pz.stat);oP.default=async(r,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!r)return 0;if(Cz.default.string(r))return Buffer.byteLength(r);if(Cz.default.buffer(r))return r.length;if(uke.default(r))return dz.promisify(r.getLength.bind(r))();if(r instanceof pz.ReadStream){let{size:t}=await gke(r.path);return t===0?void 0:t}}});var AP=w(aP=>{"use strict";Object.defineProperty(aP,"__esModule",{value:!0});function fke(r,e,t){let i={};for(let n of t)i[n]=(...s)=>{e.emit(n,...s)},r.on(n,i[n]);return()=>{for(let n of t)r.off(n,i[n])}}aP.default=fke});var Ez=w(lP=>{"use strict";Object.defineProperty(lP,"__esModule",{value:!0});lP.default=()=>{let r=[];return{once(e,t,i){e.once(t,i),r.push({origin:e,event:t,fn:i})},unhandleAll(){for(let e of r){let{origin:t,event:i,fn:n}=e;t.removeListener(i,n)}r.length=0}}}});var yz=w(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});Rd.TimeoutError=void 0;var hke=require("net"),pke=Ez(),Iz=Symbol("reentry"),dke=()=>{},cP=class extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`);this.event=t,this.name="TimeoutError",this.code="ETIMEDOUT"}};Rd.TimeoutError=cP;Rd.default=(r,e,t)=>{if(Iz in r)return dke;r[Iz]=!0;let i=[],{once:n,unhandleAll:s}=pke.default(),o=(g,f,h)=>{var p;let m=setTimeout(f,g,g,h);(p=m.unref)===null||p===void 0||p.call(m);let y=()=>{clearTimeout(m)};return i.push(y),y},{host:a,hostname:l}=t,c=(g,f)=>{r.destroy(new cP(g,f))},u=()=>{for(let g of i)g();s()};if(r.once("error",g=>{if(u(),r.listenerCount("error")===0)throw g}),r.once("close",u),n(r,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};r.setTimeout(e.socket,g),i.push(()=>{r.removeListener("timeout",g)})}return n(r,"socket",g=>{var f;let{socketPath:h}=r;if(g.connecting){let p=Boolean(h!=null?h:hke.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let m=o(e.lookup,c,"lookup");n(g,"lookup",m)}if(typeof e.connect!="undefined"){let m=()=>o(e.connect,c,"connect");p?n(g,"connect",m()):n(g,"lookup",y=>{y===null&&n(g,"connect",m())})}typeof e.secureConnect!="undefined"&&t.protocol==="https:"&&n(g,"connect",()=>{let m=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",m)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(r,"upload-complete",p())}):n(r,"upload-complete",p())}}),typeof e.response!="undefined"&&n(r,"upload-complete",()=>{let g=o(e.response,c,"response");n(r,"response",g)}),u}});var Bz=w(uP=>{"use strict";Object.defineProperty(uP,"__esModule",{value:!0});var wz=iA();uP.default=r=>{r=r;let e={protocol:r.protocol,hostname:wz.default.string(r.hostname)&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return wz.default.string(r.port)&&r.port.length>0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var bz=w(gP=>{"use strict";Object.defineProperty(gP,"__esModule",{value:!0});var Cke=require("url"),mke=["protocol","host","hostname","port","pathname","search"];gP.default=(r,e)=>{var t,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!r){if(!e.protocol)throw new TypeError("No URL protocol specified");r=`${e.protocol}//${(i=(t=e.hostname)!==null&&t!==void 0?t:e.host)!==null&&i!==void 0?i:""}`}let n=new Cke.URL(r);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of mke)e[s]&&(n[s]=e[s].toString());return n}});var Sz=w(fP=>{"use strict";Object.defineProperty(fP,"__esModule",{value:!0});var Qz=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){typeof e=="object"?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};fP.default=Qz});var pP=w(hP=>{"use strict";Object.defineProperty(hP,"__esModule",{value:!0});var Eke=async r=>{let e=[],t=0;for await(let i of r)e.push(i),t+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,t):Buffer.from(e.join(""))};hP.default=Eke});var xz=w(Vc=>{"use strict";Object.defineProperty(Vc,"__esModule",{value:!0});Vc.dnsLookupIpVersionToFamily=Vc.isDnsLookupIpVersion=void 0;var vz={auto:0,ipv4:4,ipv6:6};Vc.isDnsLookupIpVersion=r=>r in vz;Vc.dnsLookupIpVersionToFamily=r=>{if(Vc.isDnsLookupIpVersion(r))return vz[r];throw new Error("Invalid DNS lookup IP version")}});var dP=w(Dw=>{"use strict";Object.defineProperty(Dw,"__esModule",{value:!0});Dw.isResponseOk=void 0;Dw.isResponseOk=r=>{let{statusCode:e}=r,t=r.request.options.followRedirect?299:399;return e>=200&&e<=t||e===304}});var Pz=w(CP=>{"use strict";Object.defineProperty(CP,"__esModule",{value:!0});var kz=new Set;CP.default=r=>{kz.has(r)||(kz.add(r),process.emitWarning(`Got: ${r}`,{type:"DeprecationWarning"}))}});var Dz=w(mP=>{"use strict";Object.defineProperty(mP,"__esModule",{value:!0});var Ir=iA(),Ike=(r,e)=>{if(Ir.default.null_(r.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Ir.assert.any([Ir.default.string,Ir.default.undefined],r.encoding),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.resolveBodyOnly),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.methodRewriting),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.isStream),Ir.assert.any([Ir.default.string,Ir.default.undefined],r.responseType),r.responseType===void 0&&(r.responseType="text");let{retry:t}=r;if(e?r.retry=N({},e.retry):r.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ir.default.object(t)?(r.retry=N(N({},r.retry),t),r.retry.methods=[...new Set(r.retry.methods.map(i=>i.toUpperCase()))],r.retry.statusCodes=[...new Set(r.retry.statusCodes)],r.retry.errorCodes=[...new Set(r.retry.errorCodes)]):Ir.default.number(t)&&(r.retry.limit=t),Ir.default.undefined(r.retry.maxRetryAfter)&&(r.retry.maxRetryAfter=Math.min(...[r.timeout.request,r.timeout.connect].filter(Ir.default.number))),Ir.default.object(r.pagination)){e&&(r.pagination=N(N({},e.pagination),r.pagination));let{pagination:i}=r;if(!Ir.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Ir.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Ir.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Ir.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return r.responseType==="json"&&r.headers.accept===void 0&&(r.headers.accept="application/json"),r};mP.default=Ike});var Rz=w(Fd=>{"use strict";Object.defineProperty(Fd,"__esModule",{value:!0});Fd.retryAfterStatusCodes=void 0;Fd.retryAfterStatusCodes=new Set([413,429,503]);var yke=({attemptCount:r,retryOptions:e,error:t,retryAfter:i})=>{if(r>e.limit)return 0;let n=e.methods.includes(t.options.method),s=e.errorCodes.includes(t.code),o=t.response&&e.statusCodes.includes(t.response.statusCode);if(!n||!s&&!o)return 0;if(t.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(t.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(r-1)*1e3+a};Fd.default=yke});var Ld=w(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.UnsupportedProtocolError=qt.ReadError=qt.TimeoutError=qt.UploadError=qt.CacheError=qt.HTTPError=qt.MaxRedirectsError=qt.RequestError=qt.setNonEnumerableProperties=qt.knownHookEvents=qt.withoutBody=qt.kIsNormalizedAlready=void 0;var Fz=require("util"),Nz=require("stream"),wke=require("fs"),gl=require("url"),Lz=require("http"),EP=require("http"),Bke=require("https"),bke=Y4(),Qke=X4(),Tz=D8(),Ske=L8(),vke=fz(),xke=vw(),Ee=iA(),kke=mz(),Oz=sP(),Pke=AP(),Mz=yz(),Dke=Bz(),Kz=bz(),Rke=Sz(),Fke=pP(),Uz=xz(),Nke=dP(),fl=Pz(),Lke=Dz(),Tke=Rz(),IP,Fi=Symbol("request"),Rw=Symbol("response"),rf=Symbol("responseSize"),nf=Symbol("downloadedSize"),sf=Symbol("bodySize"),of=Symbol("uploadedSize"),Fw=Symbol("serverResponsesPiped"),Hz=Symbol("unproxyEvents"),jz=Symbol("isFromCache"),yP=Symbol("cancelTimeouts"),Gz=Symbol("startedReading"),af=Symbol("stopReading"),Nw=Symbol("triggerRead"),hl=Symbol("body"),Nd=Symbol("jobs"),Yz=Symbol("originalResponse"),qz=Symbol("retryTimeout");qt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Oke=Ee.default.string(process.versions.brotli);qt.withoutBody=new Set(["GET","HEAD"]);qt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function Mke(r){for(let e in r){let t=r[e];if(!Ee.default.string(t)&&!Ee.default.number(t)&&!Ee.default.boolean(t)&&!Ee.default.null_(t)&&!Ee.default.undefined(t))throw new TypeError(`The \`searchParams\` value '${String(t)}' must be a string, number, boolean or null`)}}function Kke(r){return Ee.default.object(r)&&!("statusCode"in r)}var wP=new Rke.default,Uke=async r=>new Promise((e,t)=>{let i=n=>{t(n)};r.pending||e(),r.once("error",i),r.once("ready",()=>{r.off("error",i),e()})}),Hke=new Set([300,301,302,303,304,307,308]),jke=["context","body","json","form"];qt.setNonEnumerableProperties=(r,e)=>{let t={};for(let i of r)if(!!i)for(let n of jke)n in i&&(t[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,t)};var hi=class extends Error{constructor(e,t,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=t.code,i instanceof BP?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Rw]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,Ee.default.string(t.stack)&&Ee.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` -`).reverse(),a=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split(` -`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` -`)}${a.reverse().join(` -`)}`}}};qt.RequestError=hi;var bP=class extends hi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};qt.MaxRedirectsError=bP;var QP=class extends hi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};qt.HTTPError=QP;var SP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="CacheError"}};qt.CacheError=SP;var vP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="UploadError"}};qt.UploadError=vP;var xP=class extends hi{constructor(e,t,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=t}};qt.TimeoutError=xP;var Lw=class extends hi{constructor(e,t){super(e.message,e,t);this.name="ReadError"}};qt.ReadError=Lw;var kP=class extends hi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};qt.UnsupportedProtocolError=kP;var Gke=["socket","connect","continue","information","upgrade","timeout"],BP=class extends Nz.Duplex{constructor(e,t={},i){super({autoDestroy:!1,highWaterMark:0});this[nf]=0,this[of]=0,this.requestInitialized=!1,this[Fw]=new Set,this.redirects=[],this[af]=!1,this[Nw]=!1,this[Nd]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof EP.IncomingMessage&&(this.options.headers=N(N({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=t;if((o||a||l)&&this._lockWrite(),qt.kIsNormalizedAlready in t)this.options=t;else try{this.options=this.constructor.normalizeArguments(e,t,i)}catch(c){Ee.default.nodeStream(t.body)&&t.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof wke.ReadStream&&await Uke(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Fi])===null||c===void 0||c.destroy();return}for(let g of this[Nd])g();this[Nd].length=0,this.requestInitialized=!0}catch(u){if(u instanceof hi){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,t,i){var n,s,o,a,l;let c=t;if(Ee.default.object(e)&&!Ee.default.urlInstance(e))t=N(N(N({},i),e),t);else{if(e&&t&&t.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");t=N(N({},i),t),e!==void 0&&(t.url=e),Ee.default.urlInstance(t.url)&&(t.url=new gl.URL(t.url.toString()))}if(t.cache===!1&&(t.cache=void 0),t.dnsCache===!1&&(t.dnsCache=void 0),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.method),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.headers),Ee.assert.any([Ee.default.string,Ee.default.urlInstance,Ee.default.undefined],t.prefixUrl),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cookieJar),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.searchParams),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.cache),Ee.assert.any([Ee.default.object,Ee.default.number,Ee.default.undefined],t.timeout),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.context),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.hooks),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.decompress),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.ignoreInvalidCookies),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.followRedirect),Ee.assert.any([Ee.default.number,Ee.default.undefined],t.maxRedirects),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.throwHttpErrors),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.http2),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.allowGetBody),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.localAddress),Ee.assert.any([Uz.isDnsLookupIpVersion,Ee.default.undefined],t.dnsLookupIpVersion),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.https),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.rejectUnauthorized),t.https&&(Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.https.rejectUnauthorized),Ee.assert.any([Ee.default.function_,Ee.default.undefined],t.https.checkServerIdentity),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificateAuthority),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.key),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificate),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.https.passphrase),Ee.assert.any([Ee.default.string,Ee.default.buffer,Ee.default.array,Ee.default.undefined],t.https.pfx)),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cacheOptions),Ee.default.string(t.method)?t.method=t.method.toUpperCase():t.method="GET",t.headers===(i==null?void 0:i.headers)?t.headers=N({},t.headers):t.headers=xke(N(N({},i==null?void 0:i.headers),t.headers)),"slashes"in t)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in t)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in t&&t.searchParams&&t.searchParams!==(i==null?void 0:i.searchParams)){let h;if(Ee.default.string(t.searchParams)||t.searchParams instanceof gl.URLSearchParams)h=new gl.URLSearchParams(t.searchParams);else{Mke(t.searchParams),h=new gl.URLSearchParams;for(let p in t.searchParams){let m=t.searchParams[p];m===null?h.append(p,""):m!==void 0&&h.append(p,m)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,m)=>{h.has(m)||h.append(m,p)}),t.searchParams=h}if(t.username=(s=t.username)!==null&&s!==void 0?s:"",t.password=(o=t.password)!==null&&o!==void 0?o:"",Ee.default.undefined(t.prefixUrl)?t.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(t.prefixUrl=t.prefixUrl.toString(),t.prefixUrl!==""&&!t.prefixUrl.endsWith("/")&&(t.prefixUrl+="/")),Ee.default.string(t.url)){if(t.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");t.url=Kz.default(t.prefixUrl+t.url,t)}else(Ee.default.undefined(t.url)&&t.prefixUrl!==""||t.protocol)&&(t.url=Kz.default(t.prefixUrl,t));if(t.url){"port"in t&&delete t.port;let{prefixUrl:h}=t;Object.defineProperty(t,"prefixUrl",{set:m=>{let y=t.url;if(!y.href.startsWith(m))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${m}: ${y.href}`);t.url=new gl.URL(m+y.href.slice(h.length)),h=m},get:()=>h});let{protocol:p}=t.url;if(p==="unix:"&&(p="http:",t.url=new gl.URL(`http://unix${t.url.pathname}${t.url.search}`)),t.searchParams&&(t.url.search=t.searchParams.toString()),p!=="http:"&&p!=="https:")throw new kP(t);t.username===""?t.username=t.url.username:t.url.username=t.username,t.password===""?t.password=t.url.password:t.url.password=t.password}let{cookieJar:u}=t;if(u){let{setCookie:h,getCookieString:p}=u;Ee.assert.function_(h),Ee.assert.function_(p),h.length===4&&p.length===0&&(h=Fz.promisify(h.bind(t.cookieJar)),p=Fz.promisify(p.bind(t.cookieJar)),t.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=t;if(g&&(wP.has(g)||wP.set(g,new Tz((h,p)=>{let m=h[Fi](h,p);return Ee.default.promise(m)&&(m.once=(y,b)=>{if(y==="error")m.catch(b);else if(y==="abort")(async()=>{try{(await m).once("abort",b)}catch(v){}})();else throw new Error(`Unknown HTTP2 promise event: ${y}`);return m}),m},g))),t.cacheOptions=N({},t.cacheOptions),t.dnsCache===!0)IP||(IP=new Qke.default),t.dnsCache=IP;else if(!Ee.default.undefined(t.dnsCache)&&!t.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${Ee.default(t.dnsCache)}`);Ee.default.number(t.timeout)?t.timeout={request:t.timeout}:i&&t.timeout!==i.timeout?t.timeout=N(N({},i.timeout),t.timeout):t.timeout=N({},t.timeout),t.context||(t.context={});let f=t.hooks===(i==null?void 0:i.hooks);t.hooks=N({},t.hooks);for(let h of qt.knownHookEvents)if(h in t.hooks)if(Ee.default.array(t.hooks[h]))t.hooks[h]=[...t.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${Ee.default(t.hooks[h])}`);else t.hooks[h]=[];if(i&&!f)for(let h of qt.knownHookEvents)i.hooks[h].length>0&&(t.hooks[h]=[...i.hooks[h],...t.hooks[h]]);if("family"in t&&fl.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(t.https=N(N({},i.https),t.https)),"rejectUnauthorized"in t&&fl.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in t&&fl.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in t&&fl.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in t&&fl.default('"options.key" was never documented, please use "options.https.key"'),"cert"in t&&fl.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in t&&fl.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in t&&fl.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in t)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(t.agent){for(let h in t.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return t.maxRedirects=(l=t.maxRedirects)!==null&&l!==void 0?l:0,qt.setNonEnumerableProperties([i,c],t),Lke.default(t,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:t}=e,i=!Ee.default.undefined(e.form),n=!Ee.default.undefined(e.json),s=!Ee.default.undefined(e.body),o=i||n||s,a=qt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof Nz.Readable)&&!Ee.default.string(e.body)&&!Ee.default.buffer(e.body)&&!Oz.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!Ee.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!Ee.default.string(t["content-type"]);s?(Oz.default(e.body)&&l&&(t["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[hl]=e.body):i?(l&&(t["content-type"]="application/x-www-form-urlencoded"),this[hl]=new gl.URLSearchParams(e.form).toString()):(l&&(t["content-type"]="application/json"),this[hl]=e.stringifyJson(e.json));let c=await kke.default(this[hl],e.headers);Ee.default.undefined(t["content-length"])&&Ee.default.undefined(t["transfer-encoding"])&&!a&&!Ee.default.undefined(c)&&(t["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[sf]=Number(t["content-length"])||void 0}async _onResponseBase(e){let{options:t}=this,{url:i}=t;this[Yz]=e,t.decompress&&(e=Ske(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:Lz.STATUS_CODES[n],s.url=t.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[jz]=s.isFromCache,this[rf]=Number(e.headers["content-length"])||void 0,this[Rw]=e,e.once("end",()=>{this[rf]=this[nf],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new Lw(a,this))}),e.once("aborted",()=>{this._beforeError(new Lw({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(Ee.default.object(t.cookieJar)&&o){let a=o.map(async l=>t.cookieJar.setCookie(l,i.toString()));t.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(t.followRedirect&&e.headers.location&&Hke.has(n)){if(e.resume(),this[Fi]&&(this[yP](),delete this[Fi],this[Hz]()),(n===303&&t.method!=="GET"&&t.method!=="HEAD"||!t.methodRewriting)&&(t.method="GET","body"in t&&delete t.body,"json"in t&&delete t.json,"form"in t&&delete t.form,this[hl]=void 0,delete t.headers["content-length"]),this.redirects.length>=t.maxRedirects){this._beforeError(new bP(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new gl.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in t.headers&&delete t.headers.host,"cookie"in t.headers&&delete t.headers.cookie,"authorization"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(t.username="",t.password="")):(c.username=t.username,c.password=t.password),this.redirects.push(u),t.url=c;for(let g of t.hooks.beforeRedirect)await g(t,s);this.emit("redirect",s,t),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(t.isStream&&t.throwHttpErrors&&!Nke.isResponseOk(s)){this._beforeError(new QP(s));return}e.on("readable",()=>{this[Nw]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Fw])if(!a.headersSent){for(let l in e.headers){let c=t.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(t){this._beforeError(t)}}_onRequest(e){let{options:t}=this,{timeout:i,url:n}=t;bke.default(e),this[yP]=Mz.default(e,i,n);let s=t.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof Mz.TimeoutError?new xP(l,this.timings,this):new hi(l.message,l,this),this._beforeError(l)}),this[Hz]=Pke.default(e,this,Gke),this[Fi]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[hl],a=this.redirects.length===0?this:e;Ee.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new vP(l,this))})):(this._unlockWrite(),Ee.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,t){return new Promise((i,n)=>{Object.assign(t,Dke.default(e)),delete t.url;let s,o=wP.get(t.cache)(t,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});t.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,t,i,n,s;let{options:o}=this,{headers:a}=o;for(let b in a)if(Ee.default.undefined(a[b]))delete a[b];else if(Ee.default.null_(a[b]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${b}\` header`);if(o.decompress&&Ee.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=Oke?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let b=await o.cookieJar.getCookieString(o.url.toString());Ee.default.nonEmptyString(b)&&(o.headers.cookie=b)}for(let b of o.hooks.beforeRequest){let v=await b(o);if(!Ee.default.undefined(v)){o.request=()=>v;break}}o.body&&this[hl]!==o.body&&(this[hl]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let b=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(b==null?void 0:b.groups){let{socketPath:v,path:x}=b.groups;Object.assign(o,{socketPath:v,path:x,host:""})}}let f=g.protocol==="https:",h;o.http2?h=vke.auto:h=f?Bke.request:Lz.request;let p=(e=o.request)!==null&&e!==void 0?e:h,m=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Fi]=p,delete o.request,delete o.timeout;let y=o;if(y.shared=(t=o.cacheOptions)===null||t===void 0?void 0:t.shared,y.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,y.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,y.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{y.family=Uz.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(b){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(y.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(y.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(y.ca=o.https.certificateAuthority),o.https.certificate&&(y.cert=o.https.certificate),o.https.key&&(y.key=o.https.key),o.https.passphrase&&(y.passphrase=o.https.passphrase),o.https.pfx&&(y.pfx=o.https.pfx));try{let b=await m(g,y);Ee.default.undefined(b)&&(b=h(g,y)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete y.rejectUnauthorized,o.https.checkServerIdentity&&delete y.checkServerIdentity,o.https.certificateAuthority&&delete y.ca,o.https.certificate&&delete y.cert,o.https.key&&delete y.key,o.https.passphrase&&delete y.passphrase,o.https.pfx&&delete y.pfx),Kke(b)?this._onRequest(b):this.writable?(this.once("finish",()=>{this._onResponse(b)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(b)}catch(b){throw b instanceof Tz.CacheError?new SP(b,this):new hi(b.message,b,this)}}async _error(e){try{for(let t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new hi(t.message,t,this)}this.destroy(e)}_beforeError(e){if(this[af])return;let{options:t}=this,i=this.retryCount+1;this[af]=!0,e instanceof hi||(e=new hi(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await Fke.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await t.retry.calculateDelay({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:Tke.default({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new hi(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new hi(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[qz]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Nw]=!0;let e=this[Rw];if(e&&!this[af]){e.readableLength&&(this[Nw]=!1);let t;for(;(t=e.read())!==null;){this[nf]+=t.length,this[Gz]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(t)}}}_write(e,t,i){let n=()=>{this._writeRequest(e,t,i)};this.requestInitialized?n():this[Nd].push(n)}_writeRequest(e,t,i){this[Fi].destroyed||(this._progressCallbacks.push(()=>{this[of]+=Buffer.byteLength(e,t);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Fi].write(e,t,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let t=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Fi in this)){e();return}if(this[Fi].destroyed){e();return}this[Fi].end(i=>{i||(this[sf]=this[of],this.emit("uploadProgress",this.uploadProgress),this[Fi].emit("upload-complete")),e(i)})};this.requestInitialized?t():this[Nd].push(t)}_destroy(e,t){var i;this[af]=!0,clearTimeout(this[qz]),Fi in this&&(this[yP](),((i=this[Rw])===null||i===void 0?void 0:i.complete)||this[Fi].destroy()),e!==null&&!Ee.default.undefined(e)&&!(e instanceof hi)&&(e=new hi(e.message,e,this)),t(e)}get _isAboutToError(){return this[af]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,t,i;return((t=(e=this[Fi])===null||e===void 0?void 0:e.destroyed)!==null&&t!==void 0?t:this.destroyed)&&!((i=this[Yz])===null||i===void 0?void 0:i.complete)}get socket(){var e,t;return(t=(e=this[Fi])===null||e===void 0?void 0:e.socket)!==null&&t!==void 0?t:void 0}get downloadProgress(){let e;return this[rf]?e=this[nf]/this[rf]:this[rf]===this[nf]?e=1:e=0,{percent:e,transferred:this[nf],total:this[rf]}}get uploadProgress(){let e;return this[sf]?e=this[of]/this[sf]:this[sf]===this[of]?e=1:e=0,{percent:e,transferred:this[of],total:this[sf]}}get timings(){var e;return(e=this[Fi])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[jz]}pipe(e,t){if(this[Gz])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof EP.ServerResponse&&this[Fw].add(e),super.pipe(e,t)}unpipe(e){return e instanceof EP.ServerResponse&&this[Fw].delete(e),super.unpipe(e),this}};qt.default=BP});var Td=w(Co=>{"use strict";var Yke=Co&&Co.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),qke=Co&&Co.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Yke(e,r,t)};Object.defineProperty(Co,"__esModule",{value:!0});Co.CancelError=Co.ParseError=void 0;var Jz=Ld(),Wz=class extends Jz.RequestError{constructor(e,t){let{options:i}=t.request;super(`${e.message} in "${i.url.toString()}"`,e,t.request);this.name="ParseError"}};Co.ParseError=Wz;var zz=class extends Jz.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Co.CancelError=zz;qke(Ld(),Co)});var Vz=w(PP=>{"use strict";Object.defineProperty(PP,"__esModule",{value:!0});var _z=Td(),Jke=(r,e,t,i)=>{let{rawBody:n}=r;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":t(n.toString());if(e==="buffer")return n;throw new _z.ParseError({message:`Unknown body type '${e}'`,name:"Error"},r)}catch(s){throw new _z.ParseError(s,r)}};PP.default=Jke});var DP=w(pl=>{"use strict";var Wke=pl&&pl.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),zke=pl&&pl.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Wke(e,r,t)};Object.defineProperty(pl,"__esModule",{value:!0});var _ke=require("events"),Vke=iA(),Xke=j4(),Tw=Td(),Xz=Vz(),Zz=Ld(),Zke=AP(),$ke=pP(),$z=dP(),ePe=["request","response","redirect","uploadProgress","downloadProgress"];function e5(r){let e,t,i=new _ke.EventEmitter,n=new Xke((o,a,l)=>{let c=u=>{let g=new Zz.default(void 0,r);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Tw.CancelError(g))),e=g,g.once("response",async p=>{var m;if(p.retryCount=u,p.request.aborted)return;let y;try{y=await $ke.default(g),p.rawBody=y}catch(T){return}if(g._isAboutToError)return;let b=((m=p.headers["content-encoding"])!==null&&m!==void 0?m:"").toLowerCase(),v=["gzip","deflate","br"].includes(b),{options:x}=g;if(v&&!x.decompress)p.body=y;else try{p.body=Xz.default(p,x.responseType,x.parseJson,x.encoding)}catch(T){if(p.body=y.toString(),$z.isResponseOk(p)){g._beforeError(T);return}}try{for(let[T,q]of x.hooks.afterResponse.entries())p=await q(p,async Y=>{let $=Zz.default.normalizeArguments(void 0,te(N({},Y),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),x);$.hooks.afterResponse=$.hooks.afterResponse.slice(0,T);for(let ne of $.hooks.beforeRetry)await ne($);let _=e5($);return l(()=>{_.catch(()=>{}),_.cancel()}),_})}catch(T){g._beforeError(new Tw.RequestError(T.message,T,g));return}if(!$z.isResponseOk(p)){g._beforeError(new Tw.HTTPError(p));return}t=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:m}=g;if(p instanceof Tw.HTTPError&&!m.throwHttpErrors){let{response:y}=p;o(g.options.resolveBodyOnly?y.body:y);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,m)=>{var y,b;if(h===((y=m.request)===null||y===void 0?void 0:y.options.body)&&Vke.default.nodeStream((b=m.request)===null||b===void 0?void 0:b.options.body)){f(m);return}c(p)}),Zke.default(g,i,ePe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=t.request;return Xz.default(t,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}pl.default=e5;zke(Td(),pl)});var t5=w(RP=>{"use strict";Object.defineProperty(RP,"__esModule",{value:!0});var tPe=Td();function rPe(r,...e){let t=(async()=>{if(r instanceof tPe.RequestError)try{for(let n of e)if(n)for(let s of n)r=await s(r)}catch(n){r=n}throw r})(),i=()=>t;return t.json=i,t.text=i,t.buffer=i,t.on=i,t}RP.default=rPe});var n5=w(FP=>{"use strict";Object.defineProperty(FP,"__esModule",{value:!0});var r5=iA();function i5(r){for(let e of Object.values(r))(r5.default.plainObject(e)||r5.default.array(e))&&i5(e);return Object.freeze(r)}FP.default=i5});var o5=w(s5=>{"use strict";Object.defineProperty(s5,"__esModule",{value:!0})});var NP=w(Ts=>{"use strict";var iPe=Ts&&Ts.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),nPe=Ts&&Ts.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&iPe(e,r,t)};Object.defineProperty(Ts,"__esModule",{value:!0});Ts.defaultHandler=void 0;var a5=iA(),Os=DP(),sPe=t5(),Ow=Ld(),oPe=n5(),aPe={RequestError:Os.RequestError,CacheError:Os.CacheError,ReadError:Os.ReadError,HTTPError:Os.HTTPError,MaxRedirectsError:Os.MaxRedirectsError,TimeoutError:Os.TimeoutError,ParseError:Os.ParseError,CancelError:Os.CancelError,UnsupportedProtocolError:Os.UnsupportedProtocolError,UploadError:Os.UploadError},APe=async r=>new Promise(e=>{setTimeout(e,r)}),{normalizeArguments:Mw}=Ow.default,A5=(...r)=>{let e;for(let t of r)e=Mw(void 0,t,e);return e},lPe=r=>r.isStream?new Ow.default(void 0,r):Os.default(r),cPe=r=>"defaults"in r&&"options"in r.defaults,uPe=["get","post","put","patch","head","delete"];Ts.defaultHandler=(r,e)=>e(r);var l5=(r,e)=>{if(r)for(let t of r)t(e)},c5=r=>{r._rawHandlers=r.handlers,r.handlers=r.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>r.handlers[l++](u,l===r.handlers.length?lPe:c);if(a5.default.plainObject(i)){let u=N(N({},i),n);Ow.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{l5(r.options.hooks.init,n),l5((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Mw(i,n,s!=null?s:r.options);if(g[Ow.kIsNormalizedAlready]=!0,u)throw new Os.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return sPe.default(u,r.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[r.options],s=[...r._rawHandlers],o;for(let a of i)cPe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==Ts.defaultHandler),s.length===0&&s.push(Ts.defaultHandler),c5({options:A5(...n),handlers:s,mutableDefaults:Boolean(o)})};let t=async function*(i,n){let s=Mw(i,n,r.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!a5.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of t(i,n))s.push(o);return s},e.paginate.each=t,e.stream=(i,n)=>e(i,te(N({},n),{isStream:!0}));for(let i of uPe)e[i]=(n,s)=>e(n,te(N({},s),{method:i})),e.stream[i]=(n,s)=>e(n,te(N({},s),{method:i,isStream:!0}));return Object.assign(e,aPe),Object.defineProperty(e,"defaults",{value:r.mutableDefaults?r:oPe.default(r),writable:r.mutableDefaults,configurable:r.mutableDefaults,enumerable:!0}),e.mergeOptions=A5,e};Ts.default=c5;nPe(o5(),Ts)});var Uw=w((sA,Kw)=>{"use strict";var gPe=sA&&sA.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),u5=sA&&sA.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&gPe(e,r,t)};Object.defineProperty(sA,"__esModule",{value:!0});var fPe=require("url"),g5=NP(),hPe={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:r})=>r},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:r=>r.request.options.responseType==="json"?r.body:JSON.parse(r.body),paginate:r=>{if(!Reflect.has(r.headers,"link"))return!1;let e=r.headers.link.split(","),t;for(let i of e){let n=i.split(";");if(n[1].includes("next")){t=n[0].trimStart().trim(),t=t.slice(1,-1);break}}return t?{url:new fPe.URL(t)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:r=>JSON.parse(r),stringifyJson:r=>JSON.stringify(r),cacheOptions:{}},handlers:[g5.defaultHandler],mutableDefaults:!1},LP=g5.default(hPe);sA.default=LP;Kw.exports=LP;Kw.exports.default=LP;Kw.exports.__esModule=!0;u5(NP(),sA);u5(DP(),sA)});var d5=w(Af=>{"use strict";var znt=require("net"),pPe=require("tls"),TP=require("http"),f5=require("https"),dPe=require("events"),_nt=require("assert"),CPe=require("util");Af.httpOverHttp=mPe;Af.httpsOverHttp=EPe;Af.httpOverHttps=IPe;Af.httpsOverHttps=yPe;function mPe(r){var e=new oA(r);return e.request=TP.request,e}function EPe(r){var e=new oA(r);return e.request=TP.request,e.createSocket=h5,e.defaultPort=443,e}function IPe(r){var e=new oA(r);return e.request=f5.request,e}function yPe(r){var e=new oA(r);return e.request=f5.request,e.createSocket=h5,e.defaultPort=443,e}function oA(r){var e=this;e.options=r||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||TP.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=p5(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};oA.prototype.createSocket=function(e,t){var i=this,n={};i.sockets.push(n);var s=OP({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),dl("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){dl("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){dl("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return dl("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,t(f)}function u(g){o.removeAllListeners(),dl(`tunneling socket could not be established, cause=%s -`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};oA.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(t!==-1){this.sockets.splice(t,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function h5(r,e){var t=this;oA.prototype.createSocket.call(t,r,function(i){var n=r.request.getHeader("host"),s=OP({},t.options,{socket:i,servername:n?n.replace(/:.*$/,""):r.host}),o=pPe.connect(0,s);t.sockets[t.sockets.indexOf(i)]=o,e(o)})}function p5(r,e,t){return typeof r=="string"?{host:r,port:e,localAddress:t}:r}function OP(r){for(var e=1,t=arguments.length;e{C5.exports=d5()});var x5=w((Gw,jP)=>{var v5=Object.assign({},require("fs")),GP=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(e){e=e||{};var t=typeof e!="undefined"?e:{},i,n;t.ready=new Promise(function(d,E){i=d,n=E});var s={},o;for(o in t)t.hasOwnProperty(o)&&(s[o]=t[o]);var a=[],l="./this.program",c=function(d,E){throw E},u=!1,g=!0,f="";function h(d){return t.locateFile?t.locateFile(d,f):f+d}var p,m,y,b;g&&(u?f=require("path").dirname(f)+"/":f=__dirname+"/",p=function(E,I){var D=xa(E);return D?I?D:D.toString():(y||(y=v5),b||(b=require("path")),E=b.normalize(E),y.readFileSync(E,I?null:"utf8"))},m=function(E){var I=p(E,!0);return I.buffer||(I=new Uint8Array(I)),Z(I.buffer),I},process.argv.length>1&&(l=process.argv[1].replace(/\\/g,"/")),a=process.argv.slice(2),c=function(d){process.exit(d)},t.inspect=function(){return"[Emscripten Module object]"});var v=t.print||console.log.bind(console),x=t.printErr||console.warn.bind(console);for(o in s)s.hasOwnProperty(o)&&(t[o]=s[o]);s=null,t.arguments&&(a=t.arguments),t.thisProgram&&(l=t.thisProgram),t.quit&&(c=t.quit);var T=16;function q(d,E){return E||(E=T),Math.ceil(d/E)*E}var Y=0,$=function(d){Y=d},_;t.wasmBinary&&(_=t.wasmBinary);var ne=t.noExitRuntime||!0;typeof WebAssembly!="object"&&vr("no native wasm support detected");function ee(d,E,I){switch(E=E||"i8",E.charAt(E.length-1)==="*"&&(E="i32"),E){case"i1":return pe[d>>0];case"i8":return pe[d>>0];case"i16":return Qe[d>>1];case"i32":return fe[d>>2];case"i64":return fe[d>>2];case"float":return Ht[d>>2];case"double":return Mt[d>>3];default:vr("invalid type for getValue: "+E)}return null}var A,oe=!1,ce;function Z(d,E){d||vr("Assertion failed: "+E)}function O(d){var E=t["_"+d];return Z(E,"Cannot call unknown function "+d+", make sure it is exported"),E}function L(d,E,I,D,M){var z={string:function(st){var yt=0;if(st!=null&&st!==0){var xe=(st.length<<2)+1;yt=B(xe),be(st,yt,xe)}return yt},array:function(st){var yt=B(st.length);return Ke(st,yt),yt}};function ie(st){return E==="string"?re(st):E==="boolean"?Boolean(st):st}var we=O(d),me=[],_e=0;if(D)for(var ot=0;ot=D);)++M;if(M-E>16&&d.subarray&&Be)return Be.decode(d.subarray(E,M));for(var z="";E>10,56320|_e&1023)}}return z}function re(d,E){return d?je(V,d,E):""}function se(d,E,I,D){if(!(D>0))return 0;for(var M=I,z=I+D-1,ie=0;ie=55296&&we<=57343){var me=d.charCodeAt(++ie);we=65536+((we&1023)<<10)|me&1023}if(we<=127){if(I>=z)break;E[I++]=we}else if(we<=2047){if(I+1>=z)break;E[I++]=192|we>>6,E[I++]=128|we&63}else if(we<=65535){if(I+2>=z)break;E[I++]=224|we>>12,E[I++]=128|we>>6&63,E[I++]=128|we&63}else{if(I+3>=z)break;E[I++]=240|we>>18,E[I++]=128|we>>12&63,E[I++]=128|we>>6&63,E[I++]=128|we&63}}return E[I]=0,I-M}function be(d,E,I){return se(d,V,E,I)}function he(d){for(var E=0,I=0;I=55296&&D<=57343&&(D=65536+((D&1023)<<10)|d.charCodeAt(++I)&1023),D<=127?++E:D<=2047?E+=2:D<=65535?E+=3:E+=4}return E}function Fe(d){var E=he(d)+1,I=Et(E);return I&&se(d,pe,I,E),I}function Ke(d,E){pe.set(d,E)}function ke(d,E){return d%E>0&&(d+=E-d%E),d}var ve,pe,V,Qe,le,fe,gt,Ht,Mt;function Ei(d){ve=d,t.HEAP8=pe=new Int8Array(d),t.HEAP16=Qe=new Int16Array(d),t.HEAP32=fe=new Int32Array(d),t.HEAPU8=V=new Uint8Array(d),t.HEAPU16=le=new Uint16Array(d),t.HEAPU32=gt=new Uint32Array(d),t.HEAPF32=Ht=new Float32Array(d),t.HEAPF64=Mt=new Float64Array(d)}var jt=t.INITIAL_MEMORY||16777216,Qr,Oi=[],Xs=[],Un=[],Hn=!1;function Sr(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)ba(t.preRun.shift());ko(Oi)}function jn(){Hn=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ps.init(),ko(Xs)}function fs(){if(t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;)Nu(t.postRun.shift());ko(Un)}function ba(d){Oi.unshift(d)}function DA(d){Xs.unshift(d)}function Nu(d){Un.unshift(d)}var hs=0,RA=null,Qa=null;function Lu(d){return d}function FA(d){hs++,t.monitorRunDependencies&&t.monitorRunDependencies(hs)}function NA(d){if(hs--,t.monitorRunDependencies&&t.monitorRunDependencies(hs),hs==0&&(RA!==null&&(clearInterval(RA),RA=null),Qa)){var E=Qa;Qa=null,E()}}t.preloadedImages={},t.preloadedAudios={};function vr(d){t.onAbort&&t.onAbort(d),d+="",x(d),oe=!0,ce=1,d="abort("+d+"). Build with -s ASSERTIONS=1 for more info.";var E=new WebAssembly.RuntimeError(d);throw n(E),E}var zl="data:application/octet-stream;base64,";function Tu(d){return d.startsWith(zl)}var xo="data:application/octet-stream;base64,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ACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYC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NgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIc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DQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABog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AS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyAB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AG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";Tu(xo)||(xo=h(xo));function Ou(d){try{if(d==xo&&_)return new Uint8Array(_);var E=xa(d);if(E)return E;if(m)return m(d);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(I){vr(I)}}function Sh(d,E){var I,D,M;try{M=Ou(d),D=new WebAssembly.Module(M),I=new WebAssembly.Instance(D,E)}catch(ie){var z=ie.toString();throw x("failed to compile wasm module: "+z),(z.includes("imported Memory")||z.includes("memory import"))&&x("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),ie}return[I,D]}function vh(){var d={a:ka};function E(M,z){var ie=M.exports;t.asm=ie,A=t.asm.u,Ei(A.buffer),Qr=t.asm.pa,DA(t.asm.v),NA("wasm-instantiate")}if(FA("wasm-instantiate"),t.instantiateWasm)try{var I=t.instantiateWasm(d,E);return I}catch(M){return x("Module.instantiateWasm callback failed with error: "+M),!1}var D=Sh(xo,d);return E(D[0]),t.asm}var Dr,Ae;function ko(d){for(;d.length>0;){var E=d.shift();if(typeof E=="function"){E(t);continue}var I=E.func;typeof I=="number"?E.arg===void 0?Qr.get(I)():Qr.get(I)(E.arg):I(E.arg===void 0?null:E.arg)}}function Gn(d,E){var I=new Date(fe[d>>2]*1e3);fe[E>>2]=I.getUTCSeconds(),fe[E+4>>2]=I.getUTCMinutes(),fe[E+8>>2]=I.getUTCHours(),fe[E+12>>2]=I.getUTCDate(),fe[E+16>>2]=I.getUTCMonth(),fe[E+20>>2]=I.getUTCFullYear()-1900,fe[E+24>>2]=I.getUTCDay(),fe[E+36>>2]=0,fe[E+32>>2]=0;var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[E+28>>2]=M,Gn.GMTString||(Gn.GMTString=Fe("GMT")),fe[E+40>>2]=Gn.GMTString,E}function Mu(d,E){return Gn(d,E)}var St={splitPath:function(d){var E=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return E.exec(d).slice(1)},normalizeArray:function(d,E){for(var I=0,D=d.length-1;D>=0;D--){var M=d[D];M==="."?d.splice(D,1):M===".."?(d.splice(D,1),I++):I&&(d.splice(D,1),I--)}if(E)for(;I;I--)d.unshift("..");return d},normalize:function(d){var E=d.charAt(0)==="/",I=d.substr(-1)==="/";return d=St.normalizeArray(d.split("/").filter(function(D){return!!D}),!E).join("/"),!d&&!E&&(d="."),d&&I&&(d+="/"),(E?"/":"")+d},dirname:function(d){var E=St.splitPath(d),I=E[0],D=E[1];return!I&&!D?".":(D&&(D=D.substr(0,D.length-1)),I+D)},basename:function(d){if(d==="/")return"/";d=St.normalize(d),d=d.replace(/\/$/,"");var E=d.lastIndexOf("/");return E===-1?d:d.substr(E+1)},extname:function(d){return St.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return St.normalize(d.join("/"))},join2:function(d,E){return St.normalize(d+"/"+E)}};function _l(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var d=new Uint8Array(1);return function(){return crypto.getRandomValues(d),d[0]}}else if(g)try{var E=require("crypto");return function(){return E.randomBytes(1)[0]}}catch(I){}return function(){vr("randomDevice")}}var Yn={resolve:function(){for(var d="",E=!1,I=arguments.length-1;I>=-1&&!E;I--){var D=I>=0?arguments[I]:S.cwd();if(typeof D!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!D)return"";d=D+"/"+d,E=D.charAt(0)==="/"}return d=St.normalizeArray(d.split("/").filter(function(M){return!!M}),!E).join("/"),(E?"/":"")+d||"."},relative:function(d,E){d=Yn.resolve(d).substr(1),E=Yn.resolve(E).substr(1);function I(_e){for(var ot=0;ot<_e.length&&_e[ot]==="";ot++);for(var Bt=_e.length-1;Bt>=0&&_e[Bt]==="";Bt--);return ot>Bt?[]:_e.slice(ot,Bt-ot+1)}for(var D=I(d.split("/")),M=I(E.split("/")),z=Math.min(D.length,M.length),ie=z,we=0;we0?E=D.slice(0,M).toString("utf-8"):E=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(E=window.prompt("Input: "),E!==null&&(E+=` -`)):typeof readline=="function"&&(E=readline(),E!==null&&(E+=` -`));if(!E)return null;d.input=TA(E,!0)}return d.input.shift()},put_char:function(d,E){E===null||E===10?(v(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(v(je(d.output,0)),d.output=[])}},default_tty1_ops:{put_char:function(d,E){E===null||E===10?(x(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(x(je(d.output,0)),d.output=[])}}};function ds(d){for(var E=q(d,65536),I=Et(E);d=E)){var D=1024*1024;E=Math.max(E,I*(I>>0),I!=0&&(E=Math.max(E,256));var M=d.contents;d.contents=new Uint8Array(E),d.usedBytes>0&&d.contents.set(M.subarray(0,d.usedBytes),0)}},resizeFileStorage:function(d,E){if(d.usedBytes!=E)if(E==0)d.contents=null,d.usedBytes=0;else{var I=d.contents;d.contents=new Uint8Array(E),I&&d.contents.set(I.subarray(0,Math.min(E,d.usedBytes))),d.usedBytes=E}},node_ops:{getattr:function(d){var E={};return E.dev=S.isChrdev(d.mode)?d.id:1,E.ino=d.id,E.mode=d.mode,E.nlink=1,E.uid=0,E.gid=0,E.rdev=d.rdev,S.isDir(d.mode)?E.size=4096:S.isFile(d.mode)?E.size=d.usedBytes:S.isLink(d.mode)?E.size=d.link.length:E.size=0,E.atime=new Date(d.timestamp),E.mtime=new Date(d.timestamp),E.ctime=new Date(d.timestamp),E.blksize=4096,E.blocks=Math.ceil(E.size/E.blksize),E},setattr:function(d,E){E.mode!==void 0&&(d.mode=E.mode),E.timestamp!==void 0&&(d.timestamp=E.timestamp),E.size!==void 0&&pt.resizeFileStorage(d,E.size)},lookup:function(d,E){throw S.genericErrors[44]},mknod:function(d,E,I,D){return pt.createNode(d,E,I,D)},rename:function(d,E,I){if(S.isDir(d.mode)){var D;try{D=S.lookupNode(E,I)}catch(z){}if(D)for(var M in D.contents)throw new S.ErrnoError(55)}delete d.parent.contents[d.name],d.parent.timestamp=Date.now(),d.name=I,E.contents[I]=d,E.timestamp=d.parent.timestamp,d.parent=E},unlink:function(d,E){delete d.contents[E],d.timestamp=Date.now()},rmdir:function(d,E){var I=S.lookupNode(d,E);for(var D in I.contents)throw new S.ErrnoError(55);delete d.contents[E],d.timestamp=Date.now()},readdir:function(d){var E=[".",".."];for(var I in d.contents)!d.contents.hasOwnProperty(I)||E.push(I);return E},symlink:function(d,E,I){var D=pt.createNode(d,E,511|40960,0);return D.link=I,D},readlink:function(d){if(!S.isLink(d.mode))throw new S.ErrnoError(28);return d.link}},stream_ops:{read:function(d,E,I,D,M){var z=d.node.contents;if(M>=d.node.usedBytes)return 0;var ie=Math.min(d.node.usedBytes-M,D);if(ie>8&&z.subarray)E.set(z.subarray(M,M+ie),I);else for(var we=0;we0||D+I>2)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}return E.mode},realPath:function(d){for(var E=[];d.parent!==d;)E.push(d.name),d=d.parent;return E.push(d.mount.opts.root),E.reverse(),St.join.apply(null,E)},flagsForNode:function(d){d&=~2097152,d&=~2048,d&=~32768,d&=~524288;var E=0;for(var I in lt.flagsForNodeMap)d&I&&(E|=lt.flagsForNodeMap[I],d^=I);if(d)throw new S.ErrnoError(28);return E},node_ops:{getattr:function(d){var E=lt.realPath(d),I;try{I=Oe.lstatSync(E)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}return lt.isWindows&&!I.blksize&&(I.blksize=4096),lt.isWindows&&!I.blocks&&(I.blocks=(I.size+I.blksize-1)/I.blksize|0),{dev:I.dev,ino:I.ino,mode:I.mode,nlink:I.nlink,uid:I.uid,gid:I.gid,rdev:I.rdev,size:I.size,atime:I.atime,mtime:I.mtime,ctime:I.ctime,blksize:I.blksize,blocks:I.blocks}},setattr:function(d,E){var I=lt.realPath(d);try{if(E.mode!==void 0&&(Oe.chmodSync(I,E.mode),d.mode=E.mode),E.timestamp!==void 0){var D=new Date(E.timestamp);Oe.utimesSync(I,D,D)}E.size!==void 0&&Oe.truncateSync(I,E.size)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},lookup:function(d,E){var I=St.join2(lt.realPath(d),E),D=lt.getMode(I);return lt.createNode(d,E,D)},mknod:function(d,E,I,D){var M=lt.createNode(d,E,I,D),z=lt.realPath(M);try{S.isDir(M.mode)?Oe.mkdirSync(z,M.mode):Oe.writeFileSync(z,"",{mode:M.mode})}catch(ie){throw ie.code?new S.ErrnoError(lt.convertNodeCode(ie)):ie}return M},rename:function(d,E,I){var D=lt.realPath(d),M=St.join2(lt.realPath(E),I);try{Oe.renameSync(D,M)}catch(z){throw z.code?new S.ErrnoError(lt.convertNodeCode(z)):z}d.name=I},unlink:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.unlinkSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},rmdir:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.rmdirSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},readdir:function(d){var E=lt.realPath(d);try{return Oe.readdirSync(E)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},symlink:function(d,E,I){var D=St.join2(lt.realPath(d),E);try{Oe.symlinkSync(I,D)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},readlink:function(d){var E=lt.realPath(d);try{return E=Oe.readlinkSync(E),E=Hu.relative(Hu.resolve(d.mount.opts.root),E),E}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}}},stream_ops:{open:function(d){var E=lt.realPath(d.node);try{S.isFile(d.node.mode)&&(d.nfd=Oe.openSync(E,lt.flagsForNode(d.flags)))}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},close:function(d){try{S.isFile(d.node.mode)&&d.nfd&&Oe.closeSync(d.nfd)}catch(E){throw E.code?new S.ErrnoError(lt.convertNodeCode(E)):E}},read:function(d,E,I,D,M){if(D===0)return 0;try{return Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},write:function(d,E,I,D,M){try{return Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},llseek:function(d,E,I){var D=E;if(I===1)D+=d.position;else if(I===2&&S.isFile(d.node.mode))try{var M=Oe.fstatSync(d.nfd);D+=M.size}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}if(D<0)throw new S.ErrnoError(28);return D},mmap:function(d,E,I,D,M,z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var ie=ds(I);return lt.stream_ops.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(M&2)return 0;var z=lt.stream_ops.write(d,E,0,D,I,!1);return 0}}},mn={lookupPath:function(d){return{path:d,node:{mode:lt.getMode(d)}}},createStandardStreams:function(){S.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var d=1;d<3;d++)S.streams[d]={fd:d,nfd:d,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(d,E){S.isDir(d)?Oe.mkdirSync(d,E):Oe.writeFileSync(d,"",{mode:E})},mkdir:function(){Oe.mkdirSync.apply(void 0,arguments)},symlink:function(){Oe.symlinkSync.apply(void 0,arguments)},rename:function(){Oe.renameSync.apply(void 0,arguments)},rmdir:function(){Oe.rmdirSync.apply(void 0,arguments)},readdir:function(){Oe.readdirSync.apply(void 0,arguments)},unlink:function(){Oe.unlinkSync.apply(void 0,arguments)},readlink:function(){return Oe.readlinkSync.apply(void 0,arguments)},stat:function(){return Oe.statSync.apply(void 0,arguments)},lstat:function(){return Oe.lstatSync.apply(void 0,arguments)},chmod:function(){Oe.chmodSync.apply(void 0,arguments)},fchmod:function(){Oe.fchmodSync.apply(void 0,arguments)},chown:function(){Oe.chownSync.apply(void 0,arguments)},fchown:function(){Oe.fchownSync.apply(void 0,arguments)},truncate:function(){Oe.truncateSync.apply(void 0,arguments)},ftruncate:function(d,E){if(E<0)throw new S.ErrnoError(28);Oe.ftruncateSync.apply(void 0,arguments)},utime:function(){Oe.utimesSync.apply(void 0,arguments)},open:function(d,E,I,D){typeof E=="string"&&(E=$s.modeStringToFlags(E));var M=Oe.openSync(d,lt.flagsForNode(E),I),z=D!=null?D:S.nextfd(M),ie={fd:z,nfd:M,position:0,path:d,flags:E,seekable:!0};return S.streams[z]=ie,ie},close:function(d){d.stream_ops||Oe.closeSync(d.nfd),S.closeStream(d.fd)},llseek:function(d,E,I){if(d.stream_ops)return $s.llseek(d,E,I);var D=E;if(I===1)D+=d.position;else if(I===2)D+=Oe.fstatSync(d.nfd).size;else if(I!==0)throw new S.ErrnoError(Po.EINVAL);if(D<0)throw new S.ErrnoError(Po.EINVAL);return d.position=D,D},read:function(d,E,I,D,M){if(d.stream_ops)return $s.read(d,E,I,D,M);var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},write:function(d,E,I,D,M){if(d.stream_ops)return $s.write(d,E,I,D,M);d.flags&+"1024"&&S.llseek(d,0,+"2");var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},allocate:function(){throw new S.ErrnoError(Po.EOPNOTSUPP)},mmap:function(d,E,I,D,M,z){if(d.stream_ops)return $s.mmap(d,E,I,D,M,z);if(E!==0)throw new S.ErrnoError(28);var ie=ds(I);return S.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){return d.stream_ops?$s.msync(d,E,I,D,M):(M&2||S.write(d,E,0,D,I),0)},munmap:function(){return 0},ioctl:function(){throw new S.ErrnoError(Po.ENOTTY)}},S={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(d,E){if(d=Yn.resolve(S.cwd(),d),E=E||{},!d)return{path:"",node:null};var I={follow_mount:!0,recurse_count:0};for(var D in I)E[D]===void 0&&(E[D]=I[D]);if(E.recurse_count>8)throw new S.ErrnoError(32);for(var M=St.normalizeArray(d.split("/").filter(function(ut){return!!ut}),!1),z=S.root,ie="/",we=0;we40)throw new S.ErrnoError(32)}}return{path:ie,node:z}},getPath:function(d){for(var E;;){if(S.isRoot(d)){var I=d.mount.mountpoint;return E?I[I.length-1]!=="/"?I+"/"+E:I+E:I}E=E?d.name+"/"+E:d.name,d=d.parent}},hashName:function(d,E){for(var I=0,D=0;D>>0)%S.nameTable.length},hashAddNode:function(d){var E=S.hashName(d.parent.id,d.name);d.name_next=S.nameTable[E],S.nameTable[E]=d},hashRemoveNode:function(d){var E=S.hashName(d.parent.id,d.name);if(S.nameTable[E]===d)S.nameTable[E]=d.name_next;else for(var I=S.nameTable[E];I;){if(I.name_next===d){I.name_next=d.name_next;break}I=I.name_next}},lookupNode:function(d,E){var I=S.mayLookup(d);if(I)throw new S.ErrnoError(I,d);for(var D=S.hashName(d.id,E),M=S.nameTable[D];M;M=M.name_next){var z=M.name;if(M.parent.id===d.id&&z===E)return M}return S.lookup(d,E)},createNode:function(d,E,I,D){var M=new S.FSNode(d,E,I,D);return S.hashAddNode(M),M},destroyNode:function(d){S.hashRemoveNode(d)},isRoot:function(d){return d===d.parent},isMountpoint:function(d){return!!d.mounted},isFile:function(d){return(d&61440)==32768},isDir:function(d){return(d&61440)==16384},isLink:function(d){return(d&61440)==40960},isChrdev:function(d){return(d&61440)==8192},isBlkdev:function(d){return(d&61440)==24576},isFIFO:function(d){return(d&61440)==4096},isSocket:function(d){return(d&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(d){var E=S.flagModes[d];if(typeof E=="undefined")throw new Error("Unknown file open mode: "+d);return E},flagsToPermissionString:function(d){var E=["r","w","rw"][d&3];return d&512&&(E+="w"),E},nodePermissions:function(d,E){return S.ignorePermissions?0:E.includes("r")&&!(d.mode&292)||E.includes("w")&&!(d.mode&146)||E.includes("x")&&!(d.mode&73)?2:0},mayLookup:function(d){var E=S.nodePermissions(d,"x");return E||(d.node_ops.lookup?0:2)},mayCreate:function(d,E){try{var I=S.lookupNode(d,E);return 20}catch(D){}return S.nodePermissions(d,"wx")},mayDelete:function(d,E,I){var D;try{D=S.lookupNode(d,E)}catch(z){return z.errno}var M=S.nodePermissions(d,"wx");if(M)return M;if(I){if(!S.isDir(D.mode))return 54;if(S.isRoot(D)||S.getPath(D)===S.cwd())return 10}else if(S.isDir(D.mode))return 31;return 0},mayOpen:function(d,E){return d?S.isLink(d.mode)?32:S.isDir(d.mode)&&(S.flagsToPermissionString(E)!=="r"||E&512)?31:S.nodePermissions(d,S.flagsToPermissionString(E)):44},MAX_OPEN_FDS:4096,nextfd:function(d,E){d=d||0,E=E||S.MAX_OPEN_FDS;for(var I=d;I<=E;I++)if(!S.streams[I])return I;throw new S.ErrnoError(33)},getStream:function(d){return S.streams[d]},createStream:function(d,E,I){S.FSStream||(S.FSStream=function(){},S.FSStream.prototype={object:{get:function(){return this.node},set:function(ie){this.node=ie}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var D=new S.FSStream;for(var M in d)D[M]=d[M];d=D;var z=S.nextfd(E,I);return d.fd=z,S.streams[z]=d,d},closeStream:function(d){S.streams[d]=null},chrdev_stream_ops:{open:function(d){var E=S.getDevice(d.node.rdev);d.stream_ops=E.stream_ops,d.stream_ops.open&&d.stream_ops.open(d)},llseek:function(){throw new S.ErrnoError(70)}},major:function(d){return d>>8},minor:function(d){return d&255},makedev:function(d,E){return d<<8|E},registerDevice:function(d,E){S.devices[d]={stream_ops:E}},getDevice:function(d){return S.devices[d]},getMounts:function(d){for(var E=[],I=[d];I.length;){var D=I.pop();E.push(D),I.push.apply(I,D.mounts)}return E},syncfs:function(d,E){typeof d=="function"&&(E=d,d=!1),S.syncFSRequests++,S.syncFSRequests>1&&x("warning: "+S.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var I=S.getMounts(S.root.mount),D=0;function M(ie){return S.syncFSRequests--,E(ie)}function z(ie){if(ie)return z.errored?void 0:(z.errored=!0,M(ie));++D>=I.length&&M(null)}I.forEach(function(ie){if(!ie.type.syncfs)return z(null);ie.type.syncfs(ie,d,z)})},mount:function(d,E,I){var D=I==="/",M=!I,z;if(D&&S.root)throw new S.ErrnoError(10);if(!D&&!M){var ie=S.lookupPath(I,{follow_mount:!1});if(I=ie.path,z=ie.node,S.isMountpoint(z))throw new S.ErrnoError(10);if(!S.isDir(z.mode))throw new S.ErrnoError(54)}var we={type:d,opts:E,mountpoint:I,mounts:[]},me=d.mount(we);return me.mount=we,we.root=me,D?S.root=me:z&&(z.mounted=we,z.mount&&z.mount.mounts.push(we)),me},unmount:function(d){var E=S.lookupPath(d,{follow_mount:!1});if(!S.isMountpoint(E.node))throw new S.ErrnoError(28);var I=E.node,D=I.mounted,M=S.getMounts(D);Object.keys(S.nameTable).forEach(function(ie){for(var we=S.nameTable[ie];we;){var me=we.name_next;M.includes(we.mount)&&S.destroyNode(we),we=me}}),I.mounted=null;var z=I.mount.mounts.indexOf(D);I.mount.mounts.splice(z,1)},lookup:function(d,E){return d.node_ops.lookup(d,E)},mknod:function(d,E,I){var D=S.lookupPath(d,{parent:!0}),M=D.node,z=St.basename(d);if(!z||z==="."||z==="..")throw new S.ErrnoError(28);var ie=S.mayCreate(M,z);if(ie)throw new S.ErrnoError(ie);if(!M.node_ops.mknod)throw new S.ErrnoError(63);return M.node_ops.mknod(M,z,E,I)},create:function(d,E){return E=E!==void 0?E:438,E&=4095,E|=32768,S.mknod(d,E,0)},mkdir:function(d,E){return E=E!==void 0?E:511,E&=511|512,E|=16384,S.mknod(d,E,0)},mkdirTree:function(d,E){for(var I=d.split("/"),D="",M=0;Mthis.length-1||ut<0)){var st=ut%this.chunkSize,yt=ut/this.chunkSize|0;return this.getter(yt)[st]}},z.prototype.setDataGetter=function(ut){this.getter=ut},z.prototype.cacheLength=function(){var ut=new XMLHttpRequest;if(ut.open("HEAD",I,!1),ut.send(null),!(ut.status>=200&&ut.status<300||ut.status===304))throw new Error("Couldn't load "+I+". Status: "+ut.status);var st=Number(ut.getResponseHeader("Content-length")),yt,xe=(yt=ut.getResponseHeader("Accept-Ranges"))&&yt==="bytes",Wn=(yt=ut.getResponseHeader("Content-Encoding"))&&yt==="gzip",Mi=1024*1024;xe||(Mi=st);var HA=function(Cs,Pa){if(Cs>Pa)throw new Error("invalid range ("+Cs+", "+Pa+") or no bytes requested!");if(Pa>st-1)throw new Error("only "+st+" bytes available! programmer error!");var qr=new XMLHttpRequest;if(qr.open("GET",I,!1),st!==Mi&&qr.setRequestHeader("Range","bytes="+Cs+"-"+Pa),typeof Uint8Array!="undefined"&&(qr.responseType="arraybuffer"),qr.overrideMimeType&&qr.overrideMimeType("text/plain; charset=x-user-defined"),qr.send(null),!(qr.status>=200&&qr.status<300||qr.status===304))throw new Error("Couldn't load "+I+". Status: "+qr.status);return qr.response!==void 0?new Uint8Array(qr.response||[]):TA(qr.responseText||"",!0)},Yr=this;Yr.setDataGetter(function(Cs){var Pa=Cs*Mi,qr=(Cs+1)*Mi-1;if(qr=Math.min(qr,st-1),typeof Yr.chunks[Cs]=="undefined"&&(Yr.chunks[Cs]=HA(Pa,qr)),typeof Yr.chunks[Cs]=="undefined")throw new Error("doXHR failed!");return Yr.chunks[Cs]}),(Wn||!st)&&(Mi=st=1,st=this.getter(0).length,Mi=st,v("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=st,this._chunkSize=Mi,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!u)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var ie=new z;Object.defineProperties(ie,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var we={isDevice:!1,contents:ie}}else var we={isDevice:!1,url:I};var me=S.createFile(d,E,we,D,M);we.contents?me.contents=we.contents:we.url&&(me.contents=null,me.url=we.url),Object.defineProperties(me,{usedBytes:{get:function(){return this.contents.length}}});var _e={},ot=Object.keys(me.stream_ops);return ot.forEach(function(Bt){var ut=me.stream_ops[Bt];_e[Bt]=function(){return S.forceLoadFile(me),ut.apply(null,arguments)}}),_e.read=function(ut,st,yt,xe,Wn){S.forceLoadFile(me);var Mi=ut.node.contents;if(Wn>=Mi.length)return 0;var HA=Math.min(Mi.length-Wn,xe);if(Mi.slice)for(var Yr=0;Yr>2]=D.dev,fe[I+4>>2]=0,fe[I+8>>2]=D.ino,fe[I+12>>2]=D.mode,fe[I+16>>2]=D.nlink,fe[I+20>>2]=D.uid,fe[I+24>>2]=D.gid,fe[I+28>>2]=D.rdev,fe[I+32>>2]=0,Ae=[D.size>>>0,(Dr=D.size,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+40>>2]=Ae[0],fe[I+44>>2]=Ae[1],fe[I+48>>2]=4096,fe[I+52>>2]=D.blocks,fe[I+56>>2]=D.atime.getTime()/1e3|0,fe[I+60>>2]=0,fe[I+64>>2]=D.mtime.getTime()/1e3|0,fe[I+68>>2]=0,fe[I+72>>2]=D.ctime.getTime()/1e3|0,fe[I+76>>2]=0,Ae=[D.ino>>>0,(Dr=D.ino,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+80>>2]=Ae[0],fe[I+84>>2]=Ae[1],0},doMsync:function(d,E,I,D,M){var z=V.slice(d,d+I);S.msync(E,z,M,I,D)},doMkdir:function(d,E){return d=St.normalize(d),d[d.length-1]==="/"&&(d=d.substr(0,d.length-1)),S.mkdir(d,E,0),0},doMknod:function(d,E,I){switch(E&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return S.mknod(d,E,I),0},doReadlink:function(d,E,I){if(I<=0)return-28;var D=S.readlink(d),M=Math.min(I,he(D)),z=pe[E+M];return be(D,E,I+1),pe[E+M]=z,M},doAccess:function(d,E){if(E&~7)return-28;var I,D=S.lookupPath(d,{follow:!0});if(I=D.node,!I)return-44;var M="";return E&4&&(M+="r"),E&2&&(M+="w"),E&1&&(M+="x"),M&&S.nodePermissions(I,M)?-2:0},doDup:function(d,E,I){var D=S.getStream(I);return D&&S.close(D),S.open(d,E,0,I,I).fd},doReadv:function(d,E,I,D){for(var M=0,z=0;z>2],we=fe[E+(z*8+4)>>2],me=S.read(d,pe,ie,we,D);if(me<0)return-1;if(M+=me,me>2],we=fe[E+(z*8+4)>>2],me=S.write(d,pe,ie,we,D);if(me<0)return-1;M+=me}return M},varargs:void 0,get:function(){Tt.varargs+=4;var d=fe[Tt.varargs-4>>2];return d},getStr:function(d){var E=re(d);return E},getStreamFromFD:function(d){var E=S.getStream(d);if(!E)throw new S.ErrnoError(8);return E},get64:function(d,E){return d}};function Ku(d,E){try{return d=Tt.getStr(d),S.chmod(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function Vl(d){return fe[Rt()>>2]=d,d}function xh(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 0:{var M=Tt.get();if(M<0)return-28;var z;return z=S.open(D.path,D.flags,0,M),z.fd}case 1:case 2:return 0;case 3:return D.flags;case 4:{var M=Tt.get();return D.flags|=M,0}case 12:{var M=Tt.get(),ie=0;return Qe[M+ie>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Vl(28),-1;default:return-28}}catch(we){return(typeof S=="undefined"||!(we instanceof S.ErrnoError))&&vr(we),-we.errno}}function kh(d,E){try{var I=Tt.getStreamFromFD(d);return Tt.doStat(S.stat,I.path,E)}catch(D){return(typeof S=="undefined"||!(D instanceof S.ErrnoError))&&vr(D),-D.errno}}function Ph(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 21509:case 21505:return D.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return D.tty?0:-59;case 21519:{if(!D.tty)return-59;var M=Tt.get();return fe[M>>2]=0,0}case 21520:return D.tty?-28:-59;case 21531:{var M=Tt.get();return S.ioctl(D,E,M)}case 21523:return D.tty?0:-59;case 21524:return D.tty?0:-59;default:vr("bad ioctl syscall "+E)}}catch(z){return(typeof S=="undefined"||!(z instanceof S.ErrnoError))&&vr(z),-z.errno}}function Dh(d,E,I){Tt.varargs=I;try{var D=Tt.getStr(d),M=I?Tt.get():0,z=S.open(D,E,M);return z.fd}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),-ie.errno}}function Rh(d,E){try{return d=Tt.getStr(d),E=Tt.getStr(E),S.rename(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function j(d){try{return d=Tt.getStr(d),S.rmdir(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function wt(d,E){try{return d=Tt.getStr(d),Tt.doStat(S.stat,d,E)}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function LA(d){try{return d=Tt.getStr(d),S.unlink(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function $i(d,E,I){V.copyWithin(d,E,E+I)}function Xl(d){try{return A.grow(d-ve.byteLength+65535>>>16),Ei(A.buffer),1}catch(E){}}function $e(d){var E=V.length;d=d>>>0;var I=2147483648;if(d>I)return!1;for(var D=1;D<=4;D*=2){var M=E*(1+.2/D);M=Math.min(M,d+100663296);var z=Math.min(I,ke(Math.max(d,M),65536)),ie=Xl(z);if(ie)return!0}return!1}function Sa(d){try{var E=Tt.getStreamFromFD(d);return S.close(E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),I.errno}}function Uu(d,E){try{var I=Tt.getStreamFromFD(d),D=I.tty?2:S.isDir(I.mode)?3:S.isLink(I.mode)?7:4;return pe[E>>0]=D,0}catch(M){return(typeof S=="undefined"||!(M instanceof S.ErrnoError))&&vr(M),M.errno}}function yE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doReadv(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function Fh(d,E,I,D,M){try{var z=Tt.getStreamFromFD(d),ie=4294967296,we=I*ie+(E>>>0),me=9007199254740992;return we<=-me||we>=me?-61:(S.llseek(z,we,D),Ae=[z.position>>>0,(Dr=z.position,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[M>>2]=Ae[0],fe[M+4>>2]=Ae[1],z.getdents&&we===0&&D===0&&(z.getdents=null),0)}catch(_e){return(typeof S=="undefined"||!(_e instanceof S.ErrnoError))&&vr(_e),_e.errno}}function wE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doWritev(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function gr(d){$(d)}function qn(d){var E=Date.now()/1e3|0;return d&&(fe[d>>2]=E),E}function Zl(){if(Zl.called)return;Zl.called=!0;var d=new Date().getFullYear(),E=new Date(d,0,1),I=new Date(d,6,1),D=E.getTimezoneOffset(),M=I.getTimezoneOffset(),z=Math.max(D,M);fe[zb()>>2]=z*60,fe[Wb()>>2]=Number(D!=M);function ie(Bt){var ut=Bt.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ut?ut[1]:"GMT"}var we=ie(E),me=ie(I),_e=Fe(we),ot=Fe(me);M>2]=_e,fe[Wu()+4>>2]=ot):(fe[Wu()>>2]=ot,fe[Wu()+4>>2]=_e)}function Nh(d){Zl();var E=Date.UTC(fe[d+20>>2]+1900,fe[d+16>>2],fe[d+12>>2],fe[d+8>>2],fe[d+4>>2],fe[d>>2],0),I=new Date(E);fe[d+24>>2]=I.getUTCDay();var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[d+28>>2]=M,I.getTime()/1e3|0}var Zs=function(d,E,I,D){d||(d=this),this.parent=d,this.mount=d.mount,this.mounted=null,this.id=S.nextInode++,this.name=E,this.mode=I,this.node_ops={},this.stream_ops={},this.rdev=D},va=292|73,En=146;if(Object.defineProperties(Zs.prototype,{read:{get:function(){return(this.mode&va)===va},set:function(d){d?this.mode|=va:this.mode&=~va}},write:{get:function(){return(this.mode&En)===En},set:function(d){d?this.mode|=En:this.mode&=~En}},isFolder:{get:function(){return S.isDir(this.mode)}},isDevice:{get:function(){return S.isChrdev(this.mode)}}}),S.FSNode=Zs,S.staticInit(),g){var Oe=v5,Hu=require("path");lt.staticInit()}if(g){var $l=function(d){return function(){try{return d.apply(this,arguments)}catch(E){throw E.code?new S.ErrnoError(Po[E.code]):E}}},$s=Object.assign({},S);for(var ec in mn)S[ec]=$l(mn[ec])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");function TA(d,E,I){var D=I>0?I:he(d)+1,M=new Array(D),z=se(d,M,0,M.length);return E&&(M.length=z),M}var ju=typeof atob=="function"?atob:function(d){var E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",I="",D,M,z,ie,we,me,_e,ot=0;d=d.replace(/[^A-Za-z0-9\+\/\=]/g,"");do ie=E.indexOf(d.charAt(ot++)),we=E.indexOf(d.charAt(ot++)),me=E.indexOf(d.charAt(ot++)),_e=E.indexOf(d.charAt(ot++)),D=ie<<2|we>>4,M=(we&15)<<4|me>>2,z=(me&3)<<6|_e,I=I+String.fromCharCode(D),me!==64&&(I=I+String.fromCharCode(M)),_e!==64&&(I=I+String.fromCharCode(z));while(ot0||(Sr(),hs>0))return;function E(){Ue||(Ue=!0,t.calledRun=!0,!oe&&(jn(),i(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),fs()))}t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),E()},1)):E()}if(t.run=UA,t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return UA(),e}}();typeof Gw=="object"&&typeof jP=="object"?jP.exports=GP:typeof define=="function"&&define.amd?define([],function(){return GP}):typeof Gw=="object"&&(Gw.createModule=GP)});var $5=w((Nst,Z5)=>{function KPe(r,e){for(var t=-1,i=r==null?0:r.length,n=Array(i);++t{var UPe=Array.isArray;e9.exports=UPe});var o9=w((Tst,t9)=>{var r9=Jc(),HPe=$5(),jPe=Ks(),GPe=Id(),YPe=1/0,i9=r9?r9.prototype:void 0,n9=i9?i9.toString:void 0;function s9(r){if(typeof r=="string")return r;if(jPe(r))return HPe(r,s9)+"";if(GPe(r))return n9?n9.call(r):"";var e=r+"";return e=="0"&&1/r==-YPe?"-0":e}t9.exports=s9});var lf=w((Ost,a9)=>{var qPe=o9();function JPe(r){return r==null?"":qPe(r)}a9.exports=JPe});var VP=w((Mst,A9)=>{function WPe(r,e,t){var i=-1,n=r.length;e<0&&(e=-e>n?0:n+e),t=t>n?n:t,t<0&&(t+=n),n=e>t?0:t-e>>>0,e>>>=0;for(var s=Array(n);++i{var zPe=VP();function _Pe(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:zPe(r,e,t)}l9.exports=_Pe});var XP=w((Ust,u9)=>{var VPe="\\ud800-\\udfff",XPe="\\u0300-\\u036f",ZPe="\\ufe20-\\ufe2f",$Pe="\\u20d0-\\u20ff",eDe=XPe+ZPe+$Pe,tDe="\\ufe0e\\ufe0f",rDe="\\u200d",iDe=RegExp("["+rDe+VPe+eDe+tDe+"]");function nDe(r){return iDe.test(r)}u9.exports=nDe});var f9=w((Hst,g9)=>{function sDe(r){return r.split("")}g9.exports=sDe});var y9=w((jst,h9)=>{var p9="\\ud800-\\udfff",oDe="\\u0300-\\u036f",aDe="\\ufe20-\\ufe2f",ADe="\\u20d0-\\u20ff",lDe=oDe+aDe+ADe,cDe="\\ufe0e\\ufe0f",uDe="["+p9+"]",ZP="["+lDe+"]",$P="\\ud83c[\\udffb-\\udfff]",gDe="(?:"+ZP+"|"+$P+")",d9="[^"+p9+"]",C9="(?:\\ud83c[\\udde6-\\uddff]){2}",m9="[\\ud800-\\udbff][\\udc00-\\udfff]",fDe="\\u200d",E9=gDe+"?",I9="["+cDe+"]?",hDe="(?:"+fDe+"(?:"+[d9,C9,m9].join("|")+")"+I9+E9+")*",pDe=I9+E9+hDe,dDe="(?:"+[d9+ZP+"?",ZP,C9,m9,uDe].join("|")+")",CDe=RegExp($P+"(?="+$P+")|"+dDe+pDe,"g");function mDe(r){return r.match(CDe)||[]}h9.exports=mDe});var B9=w((Gst,w9)=>{var EDe=f9(),IDe=XP(),yDe=y9();function wDe(r){return IDe(r)?yDe(r):EDe(r)}w9.exports=wDe});var Q9=w((Yst,b9)=>{var BDe=c9(),bDe=XP(),QDe=B9(),SDe=lf();function vDe(r){return function(e){e=SDe(e);var t=bDe(e)?QDe(e):void 0,i=t?t[0]:e.charAt(0),n=t?BDe(t,1).join(""):e.slice(1);return i[r]()+n}}b9.exports=vDe});var v9=w((qst,S9)=>{var xDe=Q9(),kDe=xDe("toUpperCase");S9.exports=kDe});var Zw=w((Jst,x9)=>{var PDe=lf(),DDe=v9();function RDe(r){return DDe(PDe(r).toLowerCase())}x9.exports=RDe});var k9=w((Wst,$w)=>{function FDe(){var r=0,e=1,t=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,m=15,y=16,b=17,v=0,x=1,T=2,q=3,Y=4;function $(A,oe){return 55296<=A.charCodeAt(oe)&&A.charCodeAt(oe)<=56319&&56320<=A.charCodeAt(oe+1)&&A.charCodeAt(oe+1)<=57343}function _(A,oe){oe===void 0&&(oe=0);var ce=A.charCodeAt(oe);if(55296<=ce&&ce<=56319&&oe=1){var Z=A.charCodeAt(oe-1),O=ce;return 55296<=Z&&Z<=56319?(Z-55296)*1024+(O-56320)+65536:O}return ce}function ne(A,oe,ce){var Z=[A].concat(oe).concat([ce]),O=Z[Z.length-2],L=ce,de=Z.lastIndexOf(p);if(de>1&&Z.slice(1,de).every(function(re){return re==i})&&[i,h,b].indexOf(A)==-1)return T;var Be=Z.lastIndexOf(n);if(Be>0&&Z.slice(1,Be).every(function(re){return re==n})&&[f,n].indexOf(O)==-1)return Z.filter(function(re){return re==n}).length%2==1?q:Y;if(O==r&&L==e)return v;if(O==t||O==r||O==e)return L==p&&oe.every(function(re){return re==i})?T:x;if(L==t||L==r||L==e)return x;if(O==o&&(L==o||L==a||L==c||L==u))return v;if((O==c||O==a)&&(L==a||L==l))return v;if((O==u||O==l)&&L==l)return v;if(L==i||L==m)return v;if(L==s)return v;if(O==f)return v;var je=Z.indexOf(i)!=-1?Z.lastIndexOf(i)-1:Z.length-2;return[h,b].indexOf(Z[je])!=-1&&Z.slice(je+1,-1).every(function(re){return re==i})&&L==p||O==m&&[y,b].indexOf(L)!=-1?v:oe.indexOf(n)!=-1?T:O==n&&L==n?v:x}this.nextBreak=function(A,oe){if(oe===void 0&&(oe=0),oe<0)return 0;if(oe>=A.length-1)return A.length;for(var ce=ee(_(A,oe)),Z=[],O=oe+1;O{var NDe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,eB;function LDe(){if(eB)return eB;if(typeof Intl.Segmenter!="undefined"){let r=new Intl.Segmenter("en",{granularity:"grapheme"});return eB=e=>Array.from(r.segment(e),({segment:t})=>t)}else{let r=k9(),e=new r;return eB=t=>e.splitGraphemes(t)}}P9.exports=(r,e=0,t=r.length)=>{if(e<0||t<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=t-e,n="",s=0,o=0;for(;r.length>0;){let a=r.match(NDe)||[r,r,void 0],l=LDe()(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),r=r.slice(a[0].length)}return n}});var cf=w((Bot,q9)=>{"use strict";var J9=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),wot=q9.exports=r=>r?Object.keys(r).map(e=>[J9.has(e)?J9.get(e):e,r[e]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}});var uf=w((bot,W9)=>{"use strict";var zDe=require("events"),z9=require("stream"),qd=Bp(),_9=require("string_decoder").StringDecoder,lA=Symbol("EOF"),Jd=Symbol("maybeEmitEnd"),Il=Symbol("emittedEnd"),oB=Symbol("emittingEnd"),aB=Symbol("closed"),V9=Symbol("read"),iD=Symbol("flush"),X9=Symbol("flushChunk"),Nn=Symbol("encoding"),cA=Symbol("decoder"),AB=Symbol("flowing"),Wd=Symbol("paused"),zd=Symbol("resume"),pn=Symbol("bufferLength"),Z9=Symbol("bufferPush"),nD=Symbol("bufferShift"),_i=Symbol("objectMode"),Vi=Symbol("destroyed"),$9=global._MP_NO_ITERATOR_SYMBOLS_!=="1",_De=$9&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),VDe=$9&&Symbol.iterator||Symbol("iterator not implemented"),e_=r=>r==="end"||r==="finish"||r==="prefinish",XDe=r=>r instanceof ArrayBuffer||typeof r=="object"&&r.constructor&&r.constructor.name==="ArrayBuffer"&&r.byteLength>=0,ZDe=r=>!Buffer.isBuffer(r)&&ArrayBuffer.isView(r);W9.exports=class t_ extends z9{constructor(e){super();this[AB]=!1,this[Wd]=!1,this.pipes=new qd,this.buffer=new qd,this[_i]=e&&e.objectMode||!1,this[_i]?this[Nn]=null:this[Nn]=e&&e.encoding||null,this[Nn]==="buffer"&&(this[Nn]=null),this[cA]=this[Nn]?new _9(this[Nn]):null,this[lA]=!1,this[Il]=!1,this[oB]=!1,this[aB]=!1,this.writable=!0,this.readable=!0,this[pn]=0,this[Vi]=!1}get bufferLength(){return this[pn]}get encoding(){return this[Nn]}set encoding(e){if(this[_i])throw new Error("cannot set encoding in objectMode");if(this[Nn]&&e!==this[Nn]&&(this[cA]&&this[cA].lastNeed||this[pn]))throw new Error("cannot change encoding");this[Nn]!==e&&(this[cA]=e?new _9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(t=>this[cA].write(t)))),this[Nn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[_i]}set objectMode(e){this[_i]=this[_i]||!!e}write(e,t,i){if(this[lA])throw new Error("write after end");return this[Vi]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8"),!this[_i]&&!Buffer.isBuffer(e)&&(ZDe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):XDe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[_i]&&!(t===this[Nn]&&!this[cA].lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[Nn]&&(e=this[cA].write(e)),this.flowing?(this[pn]!==0&&this[iD](!0),this.emit("data",e)):this[Z9](e),this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Vi])return null;try{return this[pn]===0||e===0||e>this[pn]?null:(this[_i]&&(e=null),this.buffer.length>1&&!this[_i]&&(this.encoding?this.buffer=new qd([Array.from(this.buffer).join("")]):this.buffer=new qd([Buffer.concat(Array.from(this.buffer),this[pn])])),this[V9](e||null,this.buffer.head.value))}finally{this[Jd]()}}[V9](e,t){return e===t.length||e===null?this[nD]():(this.buffer.head.value=t.slice(e),t=t.slice(0,e),this[pn]-=e),this.emit("data",t),!this.buffer.length&&!this[lA]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=null),typeof t=="function"&&(i=t,t="utf8"),e&&this.write(e,t),i&&this.once("end",i),this[lA]=!0,this.writable=!1,(this.flowing||!this[Wd])&&this[Jd](),this}[zd](){this[Vi]||(this[Wd]=!1,this[AB]=!0,this.emit("resume"),this.buffer.length?this[iD]():this[lA]?this[Jd]():this.emit("drain"))}resume(){return this[zd]()}pause(){this[AB]=!1,this[Wd]=!0}get destroyed(){return this[Vi]}get flowing(){return this[AB]}get paused(){return this[Wd]}[Z9](e){return this[_i]?this[pn]+=1:this[pn]+=e.length,this.buffer.push(e)}[nD](){return this.buffer.length&&(this[_i]?this[pn]-=1:this[pn]-=this.buffer.head.value.length),this.buffer.shift()}[iD](e){do;while(this[X9](this[nD]()));!e&&!this.buffer.length&&!this[lA]&&this.emit("drain")}[X9](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,t){if(this[Vi])return;let i=this[Il];t=t||{},e===process.stdout||e===process.stderr?t.end=!1:t.end=t.end!==!1;let n={dest:e,opts:t,ondrain:s=>this[zd]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[zd](),i&&n.opts.end&&n.dest.end(),e}addListener(e,t){return this.on(e,t)}on(e,t){try{return super.on(e,t)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[zd]():e_(e)&&this[Il]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[Il]}[Jd](){!this[oB]&&!this[Il]&&!this[Vi]&&this.buffer.length===0&&this[lA]&&(this[oB]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[aB]&&this.emit("close"),this[oB]=!1)}emit(e,t){if(e!=="error"&&e!=="close"&&e!==Vi&&this[Vi])return;if(e==="data"){if(!t)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(t)===!1&&this.pause())}else if(e==="end"){if(this[Il]===!0)return;this[Il]=!0,this.readable=!1,this[cA]&&(t=this[cA].end(),t&&(this.pipes.forEach(n=>n.dest.write(t)),super.emit("data",t))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[aB]=!0,!this[Il]&&!this[Vi]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=t,arguments.length>2)for(let n=2;n{e.push(i),this[_i]||(e.dataLength+=i.length)}),t.then(()=>e)}concat(){return this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this[Nn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,t)=>{this.on(Vi,()=>t(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>t(i))})}[_De](){return{next:()=>{let t=this.read();if(t!==null)return Promise.resolve({done:!1,value:t});if(this[lA])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[lA]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Vi,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[VDe](){return{next:()=>{let t=this.read();return{value:t,done:t===null}}}}destroy(e){return this[Vi]?(e?this.emit("error",e):this.emit(Vi),this):(this[Vi]=!0,this.buffer=new qd,this[pn]=0,typeof this.close=="function"&&!this[aB]&&this.close(),e?this.emit("error",e):this.emit(Vi),this)}static isStream(e){return!!e&&(e instanceof t_||e instanceof z9||e instanceof zDe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var i_=w((Qot,r_)=>{var $De=require("zlib").constants||{ZLIB_VERNUM:4736};r_.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},$De))});var fD=w(as=>{"use strict";var sD=require("assert"),yl=require("buffer").Buffer,n_=require("zlib"),Zc=as.constants=i_(),eRe=uf(),s_=yl.concat,$c=Symbol("_superWrite"),_d=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},tRe=Symbol("opts"),Vd=Symbol("flushFlag"),o_=Symbol("finishFlushFlag"),oD=Symbol("fullFlushFlag"),pr=Symbol("handle"),lB=Symbol("onError"),gf=Symbol("sawError"),aD=Symbol("level"),AD=Symbol("strategy"),lD=Symbol("ended"),Sot=Symbol("_defaultFullFlush"),cD=class extends eRe{constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[gf]=!1,this[lD]=!1,this[tRe]=e,this[Vd]=e.flush,this[o_]=e.finishFlush;try{this[pr]=new n_[t](e)}catch(i){throw new _d(i)}this[lB]=i=>{this[gf]||(this[gf]=!0,this.close(),this.emit("error",i))},this[pr].on("error",i=>this[lB](new _d(i))),this.once("end",()=>this.close)}close(){this[pr]&&(this[pr].close(),this[pr]=null,this.emit("close"))}reset(){if(!this[gf])return sD(this[pr],"zlib binding closed"),this[pr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[oD]),this.write(Object.assign(yl.alloc(0),{[Vd]:e})))}end(e,t,i){return e&&this.write(e,t),this.flush(this[o_]),this[lD]=!0,super.end(null,null,i)}get ended(){return this[lD]}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=yl.from(e,t)),this[gf])return;sD(this[pr],"zlib binding closed");let n=this[pr]._handle,s=n.close;n.close=()=>{};let o=this[pr].close;this[pr].close=()=>{},yl.concat=c=>c;let a;try{let c=typeof e[Vd]=="number"?e[Vd]:this[Vd];a=this[pr]._processChunk(e,c),yl.concat=s_}catch(c){yl.concat=s_,this[lB](new _d(c))}finally{this[pr]&&(this[pr]._handle=n,n.close=s,this[pr].close=o,this[pr].removeAllListeners("error"))}this[pr]&&this[pr].on("error",c=>this[lB](new _d(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[$c](yl.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[pr].params(e,t)}finally{this[pr].flush=i}this[pr]&&(this[aD]=e,this[AD]=t)}}}},a_=class extends wl{constructor(e){super(e,"Deflate")}},A_=class extends wl{constructor(e){super(e,"Inflate")}},uD=Symbol("_portable"),l_=class extends wl{constructor(e){super(e,"Gzip");this[uD]=e&&!!e.portable}[$c](e){return this[uD]?(this[uD]=!1,e[9]=255,super[$c](e)):super[$c](e)}},c_=class extends wl{constructor(e){super(e,"Gunzip")}},u_=class extends wl{constructor(e){super(e,"DeflateRaw")}},g_=class extends wl{constructor(e){super(e,"InflateRaw")}},f_=class extends wl{constructor(e){super(e,"Unzip")}},gD=class extends cD{constructor(e,t){e=e||{},e.flush=e.flush||Zc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Zc.BROTLI_OPERATION_FINISH,super(e,t),this[oD]=Zc.BROTLI_OPERATION_FLUSH}},h_=class extends gD{constructor(e){super(e,"BrotliCompress")}},p_=class extends gD{constructor(e){super(e,"BrotliDecompress")}};as.Deflate=a_;as.Inflate=A_;as.Gzip=l_;as.Gunzip=c_;as.DeflateRaw=u_;as.InflateRaw=g_;as.Unzip=f_;typeof n_.BrotliCompress=="function"?(as.BrotliCompress=h_,as.BrotliDecompress=p_):as.BrotliCompress=as.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var Xd=w(cB=>{"use strict";cB.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);cB.code=new Map(Array.from(cB.name).map(r=>[r[1],r[0]]))});var Zd=w((Dot,d_)=>{"use strict";var kot=Xd(),rRe=uf(),hD=Symbol("slurp");d_.exports=class extends rRe{constructor(e,t,i){super();switch(this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,t&&this[hD](t),i&&this[hD](i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,n-t),this.ignore?!0:i>=t?super.write(e):super.write(e.slice(0,i))}[hD](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i==="path")&&(this[i]=e[i])}}});var E_=w(pD=>{"use strict";var Rot=pD.encode=(r,e)=>{if(Number.isSafeInteger(r))r<0?nRe(r,e):iRe(r,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},iRe=(r,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=r&255,r=Math.floor(r/256)},nRe=(r,e)=>{e[0]=255;var t=!1;r=r*-1;for(var i=e.length;i>1;i--){var n=r&255;r=Math.floor(r/256),t?e[i-1]=C_(n):n===0?e[i-1]=0:(t=!0,e[i-1]=m_(n))}},Fot=pD.parse=r=>{var e=r[r.length-1],t=r[0],i;if(t===128)i=oRe(r.slice(1,r.length));else if(t===255)i=sRe(r);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},sRe=r=>{for(var e=r.length,t=0,i=!1,n=e-1;n>-1;n--){var s=r[n],o;i?o=C_(s):s===0?o=s:(i=!0,o=m_(s)),o!==0&&(t-=o*Math.pow(256,e-n-1))}return t},oRe=r=>{for(var e=r.length,t=0,i=e-1;i>-1;i--){var n=r[i];n!==0&&(t+=n*Math.pow(256,e-i-1))}return t},C_=r=>(255^r)&255,m_=r=>(255^r)+1&255});var hf=w((Lot,I_)=>{"use strict";var dD=Xd(),ff=require("path").posix,y_=E_(),CD=Symbol("slurp"),As=Symbol("type"),w_=class{constructor(e,t,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[As]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,t||0,i,n):e&&this.set(e)}decode(e,t,i,n){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");if(this.path=eu(e,t,100),this.mode=Bl(e,t+100,8),this.uid=Bl(e,t+108,8),this.gid=Bl(e,t+116,8),this.size=Bl(e,t+124,12),this.mtime=mD(e,t+136,12),this.cksum=Bl(e,t+148,12),this[CD](i),this[CD](n,!0),this[As]=eu(e,t+156,1),this[As]===""&&(this[As]="0"),this[As]==="0"&&this.path.substr(-1)==="/"&&(this[As]="5"),this[As]==="5"&&(this.size=0),this.linkpath=eu(e,t+157,100),e.slice(t+257,t+265).toString()==="ustar\x0000")if(this.uname=eu(e,t+265,32),this.gname=eu(e,t+297,32),this.devmaj=Bl(e,t+329,8),this.devmin=Bl(e,t+337,8),e[t+475]!==0){let o=eu(e,t+345,155);this.path=o+"/"+this.path}else{let o=eu(e,t+345,130);o&&(this.path=o+"/"+this.path),this.atime=mD(e,t+476,12),this.ctime=mD(e,t+488,12)}let s=8*32;for(let o=t;o=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=aRe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=tu(e,t,100,s)||this.needPax,this.needPax=bl(e,t+100,8,this.mode)||this.needPax,this.needPax=bl(e,t+108,8,this.uid)||this.needPax,this.needPax=bl(e,t+116,8,this.gid)||this.needPax,this.needPax=bl(e,t+124,12,this.size)||this.needPax,this.needPax=ED(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this[As].charCodeAt(0),this.needPax=tu(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=tu(e,t+265,32,this.uname)||this.needPax,this.needPax=tu(e,t+297,32,this.gname)||this.needPax,this.needPax=bl(e,t+329,8,this.devmaj)||this.needPax,this.needPax=bl(e,t+337,8,this.devmin)||this.needPax,this.needPax=tu(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=tu(e,t+345,155,o)||this.needPax:(this.needPax=tu(e,t+345,130,o)||this.needPax,this.needPax=ED(e,t+476,12,this.atime)||this.needPax,this.needPax=ED(e,t+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=t;l{let t=100,i=r,n="",s,o=ff.parse(r).root||".";if(Buffer.byteLength(i)t&&Buffer.byteLength(n)<=e?s=[i.substr(0,t-1),n,!0]:(i=ff.join(ff.basename(n),i),n=ff.dirname(n));while(n!==o&&!s);s||(s=[r.substr(0,t-1),"",!0])}return s},eu=(r,e,t)=>r.slice(e,e+t).toString("utf8").replace(/\0.*/,""),mD=(r,e,t)=>ARe(Bl(r,e,t)),ARe=r=>r===null?null:new Date(r*1e3),Bl=(r,e,t)=>r[e]&128?y_.parse(r.slice(e,e+t)):lRe(r,e,t),cRe=r=>isNaN(r)?null:r,lRe=(r,e,t)=>cRe(parseInt(r.slice(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),uRe={12:8589934591,8:2097151},bl=(r,e,t,i)=>i===null?!1:i>uRe[t]||i<0?(y_.encode(i,r.slice(e,e+t)),!0):(gRe(r,e,t,i),!1),gRe=(r,e,t,i)=>r.write(fRe(i,t),e,t,"ascii"),fRe=(r,e)=>hRe(Math.floor(r).toString(8),e),hRe=(r,e)=>(r.length===e-1?r:new Array(e-r.length-1).join("0")+r+" ")+"\0",ED=(r,e,t,i)=>i===null?!1:bl(r,e,t,i.getTime()/1e3),pRe=new Array(156).join("\0"),tu=(r,e,t,i)=>i===null?!1:(r.write(i+pRe,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t);I_.exports=w_});var gB=w((Tot,B_)=>{"use strict";var dRe=hf(),CRe=require("path"),uB=class{constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=t||!1}encode(){let e=this.encodeBody();if(e==="")return null;let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new dRe({path:("PaxHeader/"+CRe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:t,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,t,"utf8");for(let s=t+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};uB.parse=(r,e,t)=>new uB(mRe(ERe(r),e),t);var mRe=(r,e)=>e?Object.keys(r).reduce((t,i)=>(t[i]=r[i],t),e):r,ERe=r=>r.replace(/\n$/,"").split(` -`).reduce(IRe,Object.create(null)),IRe=(r,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return r;e=e.substr((t+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return r;let s=i.join("=");return r[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,r};B_.exports=uB});var fB=w((Oot,b_)=>{"use strict";b_.exports=r=>class extends r{warn(e,t,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),this.emit("warn",i.tarCode,t,i)):t instanceof Error?this.emit("error",Object.assign(t,i)):this.emit("error",Object.assign(new Error(`${e}: ${t}`),i))}}});var yD=w((Mot,Q_)=>{"use strict";var hB=["|","<",">","?",":"],ID=hB.map(r=>String.fromCharCode(61440+r.charCodeAt(0))),yRe=new Map(hB.map((r,e)=>[r,ID[e]])),wRe=new Map(ID.map((r,e)=>[r,hB[e]]));Q_.exports={encode:r=>hB.reduce((e,t)=>e.split(t).join(yRe.get(t)),r),decode:r=>ID.reduce((e,t)=>e.split(t).join(wRe.get(t)),r)}});var v_=w((Kot,S_)=>{"use strict";S_.exports=(r,e,t)=>(r&=4095,t&&(r=(r|384)&~18),e&&(r&256&&(r|=64),r&32&&(r|=8),r&4&&(r|=1)),r)});var xD=w((Yot,x_)=>{"use strict";var k_=uf(),P_=gB(),D_=hf(),Uot=Zd(),sa=require("fs"),pf=require("path"),Hot=Xd(),BRe=16*1024*1024,R_=Symbol("process"),F_=Symbol("file"),N_=Symbol("directory"),wD=Symbol("symlink"),L_=Symbol("hardlink"),$d=Symbol("header"),pB=Symbol("read"),BD=Symbol("lstat"),dB=Symbol("onlstat"),bD=Symbol("onread"),QD=Symbol("onreadlink"),SD=Symbol("openfile"),vD=Symbol("onopenfile"),ru=Symbol("close"),CB=Symbol("mode"),T_=fB(),bRe=yD(),O_=v_(),mB=T_(class extends k_{constructor(e,t){if(t=t||{},super(t),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!t.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=t.maxReadSize||BRe,this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.preservePaths=!!t.preservePaths,this.cwd=t.cwd||process.cwd(),this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.mtime=t.mtime||null,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(!this.preservePaths&&pf.win32.isAbsolute(e)){let n=pf.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!t.win32||process.platform==="win32",this.win32&&(this.path=bRe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=t.absolute||pf.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[dB](this.statCache.get(this.absolute)):this[BD]()}[BD](){sa.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[dB](t)})}[dB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=QRe(e),this.emit("stat",e),this[R_]()}[R_](){switch(this.type){case"File":return this[F_]();case"Directory":return this[N_]();case"SymbolicLink":return this[wD]();default:return this.end()}}[CB](e){return O_(e,this.type==="Directory",this.portable)}[$d](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this[CB](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new P_({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[N_](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[$d](),this.end()}[wD](){sa.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[QD](t)})}[QD](e){this.linkpath=e.replace(/\\/g,"/"),this[$d](),this.end()}[L_](e){this.type="Link",this.linkpath=pf.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[$d](),this.end()}[F_](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let t=this.linkCache.get(e);if(t.indexOf(this.cwd)===0)return this[L_](t)}this.linkCache.set(e,this.absolute)}if(this[$d](),this.stat.size===0)return this.end();this[SD]()}[SD](){sa.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[vD](t)})}[vD](e){let t=512*Math.ceil(this.stat.size/512),i=Math.min(t,this.maxReadSize),n=Buffer.allocUnsafe(i);this[pB](e,n,0,n.length,0,this.stat.size,t)}[pB](e,t,i,n,s,o,a){sa.read(e,t,i,n,s,(l,c)=>{if(l)return this[ru](e,()=>this.emit("error",l));this[bD](e,t,i,n,s,o,a,c)})}[ru](e,t){sa.close(e,t)}[bD](e,t,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(t=Buffer.allocUnsafe(n),i=0),n=t.length-i,this[pB](e,t,i,n,s,o,a)}}),M_=class extends mB{constructor(e,t){super(e,t)}[BD](){this[dB](sa.lstatSync(this.absolute))}[wD](){this[QD](sa.readlinkSync(this.absolute))}[SD](){this[vD](sa.openSync(this.absolute,"r"))}[pB](e,t,i,n,s,o,a){let l=!0;try{let c=sa.readSync(e,t,i,n,s);this[bD](e,t,i,n,s,o,a,c),l=!1}finally{if(l)try{this[ru](e,()=>{})}catch(c){}}}[ru](e,t){sa.closeSync(e),t()}},SRe=T_(class extends k_{constructor(e,t){t=t||{},super(t),this.preservePaths=!!t.preservePaths,this.portable=!!t.portable,this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[CB](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:t.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(pf.isAbsolute(this.path)&&!this.preservePaths){let n=pf.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new P_({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[CB](e){return O_(e,this.type==="Directory",this.portable)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=t,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});mB.Sync=M_;mB.Tar=SRe;var QRe=r=>r.isFile()?"File":r.isDirectory()?"Directory":r.isSymbolicLink()?"SymbolicLink":"Unsupported";x_.exports=mB});var SB=w((Jot,K_)=>{"use strict";var kD=class{constructor(e,t){this.path=e||"./",this.absolute=t,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},vRe=uf(),xRe=fD(),kRe=Zd(),PD=xD(),PRe=PD.Sync,DRe=PD.Tar,RRe=Bp(),U_=Buffer.alloc(1024),EB=Symbol("onStat"),IB=Symbol("ended"),oa=Symbol("queue"),df=Symbol("current"),iu=Symbol("process"),yB=Symbol("processing"),H_=Symbol("processJob"),aa=Symbol("jobs"),DD=Symbol("jobDone"),wB=Symbol("addFSEntry"),j_=Symbol("addTarEntry"),RD=Symbol("stat"),FD=Symbol("readdir"),BB=Symbol("onreaddir"),bB=Symbol("pipe"),G_=Symbol("entry"),ND=Symbol("entryOpt"),LD=Symbol("writeEntryClass"),Y_=Symbol("write"),TD=Symbol("ondrain"),QB=require("fs"),q_=require("path"),FRe=fB(),OD=FRe(class extends vRe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[LD]=PD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new xRe.Gzip(e.gzip),this.zip.on("data",t=>super.write(t)),this.zip.on("end",t=>super.end()),this.zip.on("drain",t=>this[TD]()),this.on("resume",t=>this.zip.resume())):this.on("drain",this[TD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:t=>!0,this[oa]=new RRe,this[aa]=0,this.jobs=+e.jobs||4,this[yB]=!1,this[IB]=!1}[Y_](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[IB]=!0,this[iu](),this}write(e){if(this[IB])throw new Error("write after end");return e instanceof kRe?this[j_](e):this[wB](e),this.flowing}[j_](e){let t=q_.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new kD(e.path,t,!1);i.entry=new DRe(e,this[ND](i)),i.entry.on("end",n=>this[DD](i)),this[aa]+=1,this[oa].push(i)}this[iu]()}[wB](e){let t=q_.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[oa].push(new kD(e,t)),this[iu]()}[RD](e){e.pending=!0,this[aa]+=1;let t=this.follow?"stat":"lstat";QB[t](e.absolute,(i,n)=>{e.pending=!1,this[aa]-=1,i?this.emit("error",i):this[EB](e,n)})}[EB](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)||(e.ignore=!0),this[iu]()}[FD](e){e.pending=!0,this[aa]+=1,QB.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[aa]-=1,t)return this.emit("error",t);this[BB](e,i)})}[BB](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[iu]()}[iu](){if(!this[yB]){this[yB]=!0;for(let e=this[oa].head;e!==null&&this[aa]this.warn(t,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[G_](e){this[aa]+=1;try{return new this[LD](e.path,this[ND](e)).on("end",()=>this[DD](e)).on("error",t=>this.emit("error",t))}catch(t){this.emit("error",t)}}[TD](){this[df]&&this[df].entry&&this[df].entry.resume()}[bB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)});let t=e.entry,i=this.zip;i?t.on("data",n=>{i.write(n)||t.pause()}):t.on("data",n=>{super.write(n)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),J_=class extends OD{constructor(e){super(e);this[LD]=PRe}pause(){}resume(){}[RD](e){let t=this.follow?"statSync":"lstatSync";this[EB](e,QB[t](e.absolute))}[FD](e,t){this[BB](e,QB.readdirSync(e.absolute))}[bB](e){let t=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)}),i?t.on("data",n=>{i.write(n)}):t.on("data",n=>{super[Y_](n)})}};OD.Sync=J_;K_.exports=OD});var wf=w(eC=>{"use strict";var NRe=uf(),LRe=require("events").EventEmitter,Us=require("fs"),vB=process.binding("fs"),Wot=vB.writeBuffers,TRe=vB.FSReqWrap||vB.FSReqCallback,Cf=Symbol("_autoClose"),Aa=Symbol("_close"),tC=Symbol("_ended"),or=Symbol("_fd"),W_=Symbol("_finished"),nu=Symbol("_flags"),MD=Symbol("_flush"),KD=Symbol("_handleChunk"),UD=Symbol("_makeBuf"),HD=Symbol("_mode"),xB=Symbol("_needDrain"),mf=Symbol("_onerror"),Ef=Symbol("_onopen"),jD=Symbol("_onread"),su=Symbol("_onwrite"),Ql=Symbol("_open"),Sl=Symbol("_path"),ou=Symbol("_pos"),la=Symbol("_queue"),If=Symbol("_read"),z_=Symbol("_readSize"),vl=Symbol("_reading"),kB=Symbol("_remain"),__=Symbol("_size"),PB=Symbol("_write"),yf=Symbol("_writing"),DB=Symbol("_defaultFlag"),GD=class extends NRe{constructor(e,t){if(t=t||{},super(t),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[or]=typeof t.fd=="number"?t.fd:null,this[Sl]=e,this[z_]=t.readSize||16*1024*1024,this[vl]=!1,this[__]=typeof t.size=="number"?t.size:Infinity,this[kB]=this[__],this[Cf]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[or]=="number"?this[If]():this[Ql]()}get fd(){return this[or]}get path(){return this[Sl]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ql](){Us.open(this[Sl],"r",(e,t)=>this[Ef](e,t))}[Ef](e,t){e?this[mf](e):(this[or]=t,this.emit("open",t),this[If]())}[UD](){return Buffer.allocUnsafe(Math.min(this[z_],this[kB]))}[If](){if(!this[vl]){this[vl]=!0;let e=this[UD]();if(e.length===0)return process.nextTick(()=>this[jD](null,0,e));Us.read(this[or],e,0,e.length,null,(t,i,n)=>this[jD](t,i,n))}}[jD](e,t,i){this[vl]=!1,e?this[mf](e):this[KD](t,i)&&this[If]()}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}[mf](e){this[vl]=!0,this[Aa](),this.emit("error",e)}[KD](e,t){let i=!1;return this[kB]-=e,e>0&&(i=super.write(ethis[Ef](e,t))}[Ef](e,t){this[DB]&&this[nu]==="r+"&&e&&e.code==="ENOENT"?(this[nu]="w",this[Ql]()):e?this[mf](e):(this[or]=t,this.emit("open",t),this[MD]())}end(e,t){e&&this.write(e,t),this[tC]=!0,!this[yf]&&!this[la].length&&typeof this[or]=="number"&&this[su](null,0)}write(e,t){return typeof e=="string"&&(e=new Buffer(e,t)),this[tC]?(this.emit("error",new Error("write() after end()")),!1):this[or]===null||this[yf]||this[la].length?(this[la].push(e),this[xB]=!0,!1):(this[yf]=!0,this[PB](e),!0)}[PB](e){Us.write(this[or],e,0,e.length,this[ou],(t,i)=>this[su](t,i))}[su](e,t){e?this[mf](e):(this[ou]!==null&&(this[ou]+=t),this[la].length?this[MD]():(this[yf]=!1,this[tC]&&!this[W_]?(this[W_]=!0,this[Aa](),this.emit("finish")):this[xB]&&(this[xB]=!1,this.emit("drain"))))}[MD](){if(this[la].length===0)this[tC]&&this[su](null,0);else if(this[la].length===1)this[PB](this[la].pop());else{let e=this[la];this[la]=[],ORe(this[or],e,this[ou],(t,i)=>this[su](t,i))}}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}},X_=class extends YD{[Ql](){let e;try{e=Us.openSync(this[Sl],this[nu],this[HD])}catch(t){if(this[DB]&&this[nu]==="r+"&&t&&t.code==="ENOENT")return this[nu]="w",this[Ql]();throw t}this[Ef](null,e)}[Aa](){if(this[Cf]&&typeof this[or]=="number"){try{Us.closeSync(this[or])}catch(e){}this[or]=null,this.emit("close")}}[PB](e){try{this[su](null,Us.writeSync(this[or],e,0,e.length,this[ou]))}catch(t){this[su](t,0)}}},ORe=(r,e,t,i)=>{let n=(o,a)=>i(o,a,e),s=new TRe;s.oncomplete=n,vB.writeBuffers(r,e,t,s)};eC.ReadStream=GD;eC.ReadStreamSync=V_;eC.WriteStream=YD;eC.WriteStreamSync=X_});var nC=w((Xot,Z_)=>{"use strict";var MRe=fB(),_ot=require("path"),KRe=hf(),URe=require("events"),HRe=Bp(),jRe=1024*1024,GRe=Zd(),$_=gB(),YRe=fD(),qD=Buffer.from([31,139]),Hs=Symbol("state"),au=Symbol("writeEntry"),uA=Symbol("readEntry"),JD=Symbol("nextEntry"),eV=Symbol("processEntry"),js=Symbol("extendedHeader"),rC=Symbol("globalExtendedHeader"),xl=Symbol("meta"),tV=Symbol("emitMeta"),yr=Symbol("buffer"),gA=Symbol("queue"),Au=Symbol("ended"),rV=Symbol("emittedEnd"),lu=Symbol("emit"),Ln=Symbol("unzip"),RB=Symbol("consumeChunk"),FB=Symbol("consumeChunkSub"),WD=Symbol("consumeBody"),iV=Symbol("consumeMeta"),nV=Symbol("consumeHeader"),NB=Symbol("consuming"),zD=Symbol("bufferConcat"),_D=Symbol("maybeEnd"),iC=Symbol("writing"),kl=Symbol("aborted"),LB=Symbol("onDone"),cu=Symbol("sawValidEntry"),TB=Symbol("sawNullBlock"),OB=Symbol("sawEOF"),qRe=r=>!0;Z_.exports=MRe(class extends URe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[cu]=null,this.on(LB,t=>{(this[Hs]==="begin"||this[cu]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(LB,e.ondone):this.on(LB,t=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||jRe,this.filter=typeof e.filter=="function"?e.filter:qRe,this.writable=!0,this.readable=!1,this[gA]=new HRe,this[yr]=null,this[uA]=null,this[au]=null,this[Hs]="begin",this[xl]="",this[js]=null,this[rC]=null,this[Au]=!1,this[Ln]=null,this[kl]=!1,this[TB]=!1,this[OB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[nV](e,t){this[cu]===null&&(this[cu]=!1);let i;try{i=new KRe(e,t,this[js],this[rC])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[TB]?(this[OB]=!0,this[Hs]==="begin"&&(this[Hs]="header"),this[lu]("eof")):(this[TB]=!0,this[lu]("nullBlock"));else if(this[TB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[au]=new GRe(i,this[js],this[rC]);if(!this[cu])if(s.remain){let o=()=>{s.invalid||(this[cu]=!0)};s.on("end",o)}else this[cu]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[lu]("ignoredEntry",s),this[Hs]="ignore",s.resume()):s.size>0&&(this[xl]="",s.on("data",o=>this[xl]+=o),this[Hs]="meta"):(this[js]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[lu]("ignoredEntry",s),this[Hs]=s.remain?"ignore":"header",s.resume()):(s.remain?this[Hs]="body":(this[Hs]="header",s.end()),this[uA]?this[gA].push(s):(this[gA].push(s),this[JD]())))}}}[eV](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[uA]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[JD]()),t=!1)):(this[uA]=null,t=!1),t}[JD](){do;while(this[eV](this[gA].shift()));if(!this[gA].length){let e=this[uA];!e||e.flowing||e.size===e.remain?this[iC]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[WD](e,t){let i=this[au],n=i.blockRemain,s=n>=e.length&&t===0?e:e.slice(t,t+n);return i.write(s),i.blockRemain||(this[Hs]="header",this[au]=null,i.end()),s.length}[iV](e,t){let i=this[au],n=this[WD](e,t);return this[au]||this[tV](i),n}[lu](e,t,i){!this[gA].length&&!this[uA]?this.emit(e,t,i):this[gA].push([e,t,i])}[tV](e){switch(this[lu]("meta",this[xl]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[js]=$_.parse(this[xl],this[js],!1);break;case"GlobalExtendedHeader":this[rC]=$_.parse(this[xl],this[rC],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[js]=this[js]||Object.create(null),this[js].path=this[xl].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[js]=this[js]||Object.create(null),this[js].linkpath=this[xl].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[kl]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[kl])return;if(this[Ln]===null&&e){if(this[yr]&&(e=Buffer.concat([this[yr],e]),this[yr]=null),e.lengththis[RB](s)),this[Ln].on("error",s=>this.abort(s)),this[Ln].on("end",s=>{this[Au]=!0,this[RB]()}),this[iC]=!0;let n=this[Ln][i?"end":"write"](e);return this[iC]=!1,n}}this[iC]=!0,this[Ln]?this[Ln].write(e):this[RB](e),this[iC]=!1;let t=this[gA].length?!1:this[uA]?this[uA].flowing:!0;return!t&&!this[gA].length&&this[uA].once("drain",i=>this.emit("drain")),t}[zD](e){e&&!this[kl]&&(this[yr]=this[yr]?Buffer.concat([this[yr],e]):e)}[_D](){if(this[Au]&&!this[rV]&&!this[kl]&&!this[NB]){this[rV]=!0;let e=this[au];if(e&&e.blockRemain){let t=this[yr]?this[yr].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[yr]&&e.write(this[yr]),e.end()}this[lu](LB)}}[RB](e){if(this[NB])this[zD](e);else if(!e&&!this[yr])this[_D]();else{if(this[NB]=!0,this[yr]){this[zD](e);let t=this[yr];this[yr]=null,this[FB](t)}else this[FB](e);for(;this[yr]&&this[yr].length>=512&&!this[kl]&&!this[OB];){let t=this[yr];this[yr]=null,this[FB](t)}this[NB]=!1}(!this[yr]||this[Au])&&this[_D]()}[FB](e){let t=0,i=e.length;for(;t+512<=i&&!this[kl]&&!this[OB];)switch(this[Hs]){case"begin":case"header":this[nV](e,t),t+=512;break;case"ignore":case"body":t+=this[WD](e,t);break;case"meta":t+=this[iV](e,t);break;default:throw new Error("invalid state: "+this[Hs])}t{"use strict";var JRe=cf(),oV=nC(),Bf=require("fs"),WRe=wf(),aV=require("path"),Zot=sV.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=JRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&_Re(i,e),i.noResume||zRe(i),i.file&&i.sync?VRe(i):i.file?XRe(i,t):AV(i)},zRe=r=>{let e=r.onentry;r.onentry=e?t=>{e(t),t.resume()}:t=>t.resume()},_Re=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||aV.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(aV.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},VRe=r=>{let e=AV(r),t=r.file,i=!0,n;try{let s=Bf.statSync(t),o=r.maxReadSize||16*1024*1024;if(s.size{let t=new oV(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("end",o),Bf.stat(n,(l,c)=>{if(l)a(l);else{let u=new WRe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},AV=r=>new oV(r)});var hV=w((rat,lV)=>{"use strict";var ZRe=cf(),KB=SB(),eat=require("fs"),cV=wf(),uV=MB(),gV=require("path"),tat=lV.exports=(r,e,t)=>{if(typeof e=="function"&&(t=e),Array.isArray(r)&&(e=r,r={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=ZRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?$Re(i,e):i.file?eFe(i,e,t):i.sync?tFe(i,e):rFe(i,e)},$Re=(r,e)=>{let t=new KB.Sync(r),i=new cV.WriteStreamSync(r.file,{mode:r.mode||438});t.pipe(i),fV(t,e)},eFe=(r,e,t)=>{let i=new KB(r),n=new cV.WriteStream(r.file,{mode:r.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return VD(i,e),t?s.then(t,t):s},fV=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?uV({file:gV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},VD=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return uV({file:gV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>VD(r,e));r.add(t)}r.end()},tFe=(r,e)=>{let t=new KB.Sync(r);return fV(t,e),t},rFe=(r,e)=>{let t=new KB(r);return VD(t,e),t}});var XD=w((sat,pV)=>{"use strict";var iFe=cf(),dV=SB(),iat=nC(),Gs=require("fs"),CV=wf(),mV=MB(),EV=require("path"),IV=hf(),nat=pV.exports=(r,e,t)=>{let i=iFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?nFe(i,e):sFe(i,e,t)},nFe=(r,e)=>{let t=new dV.Sync(r),i=!0,n,s;try{try{n=Gs.openSync(r.file,"r+")}catch(l){if(l.code==="ENOENT")n=Gs.openSync(r.file,"w+");else throw l}let o=Gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,r.mtimeCache&&r.mtimeCache.set(l.path,l.mtime)}i=!1,oFe(r,t,s,n,e)}finally{if(i)try{Gs.closeSync(n)}catch(o){}}},oFe=(r,e,t,i,n)=>{let s=new CV.WriteStreamSync(r.file,{fd:i,start:t});e.pipe(s),aFe(e,n)},sFe=(r,e,t)=>{e=Array.from(e);let i=new dV(r),n=(o,a,l)=>{let c=(p,m)=>{p?Gs.close(o,y=>l(p)):l(null,m)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,m)=>{if(p)return c(p);if(g+=m,g<512&&m)return Gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let y=new IV(f);if(!y.cksumValid)return c(null,u);let b=512*Math.ceil(y.size/512);if(u+b+512>a||(u+=b+512,u>=a))return c(null,u);r.mtimeCache&&r.mtimeCache.set(y.path,y.mtime),g=0,Gs.read(o,f,0,512,u,h)};Gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",Gs.open(r.file,l,c);if(u)return a(u);Gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,m)=>{if(p)return a(p);let y=new CV.WriteStream(r.file,{fd:g,start:m});i.pipe(y),y.on("error",a),y.on("close",o),yV(i,e)})})};Gs.open(r.file,l,c)});return t?s.then(t,t):s},aFe=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?mV({file:EV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},yV=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return mV({file:EV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>yV(r,e));r.add(t)}r.end()}});var BV=w((aat,wV)=>{"use strict";var AFe=cf(),lFe=XD(),oat=wV.exports=(r,e,t)=>{let i=AFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),cFe(i),lFe(i,e,t)},cFe=r=>{let e=r.filter;r.mtimeCache||(r.mtimeCache=new Map),r.filter=e?(t,i)=>e(t,i)&&!(r.mtimeCache.get(t)>i.mtime):(t,i)=>!(r.mtimeCache.get(t)>i.mtime)}});var SV=w((Aat,bV)=>{var{promisify:QV}=require("util"),Pl=require("fs"),uFe=r=>{if(!r)r={mode:511,fs:Pl};else if(typeof r=="object")r=N({mode:511,fs:Pl},r);else if(typeof r=="number")r={mode:r,fs:Pl};else if(typeof r=="string")r={mode:parseInt(r,8),fs:Pl};else throw new TypeError("invalid options argument");return r.mkdir=r.mkdir||r.fs.mkdir||Pl.mkdir,r.mkdirAsync=QV(r.mkdir),r.stat=r.stat||r.fs.stat||Pl.stat,r.statAsync=QV(r.stat),r.statSync=r.statSync||r.fs.statSync||Pl.statSync,r.mkdirSync=r.mkdirSync||r.fs.mkdirSync||Pl.mkdirSync,r};bV.exports=uFe});var xV=w((lat,vV)=>{var gFe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:fFe,parse:hFe}=require("path"),pFe=r=>{if(/\0/.test(r))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:r,code:"ERR_INVALID_ARG_VALUE"});if(r=fFe(r),gFe==="win32"){let e=/[*|"<>?:]/,{root:t}=hFe(r);if(e.test(r.substr(t.length)))throw Object.assign(new Error("Illegal characters in path."),{path:r,code:"EINVAL"})}return r};vV.exports=pFe});var FV=w((cat,kV)=>{var{dirname:PV}=require("path"),DV=(r,e,t=void 0)=>t===e?Promise.resolve():r.statAsync(e).then(i=>i.isDirectory()?t:void 0,i=>i.code==="ENOENT"?DV(r,PV(e),e):void 0),RV=(r,e,t=void 0)=>{if(t!==e)try{return r.statSync(e).isDirectory()?t:void 0}catch(i){return i.code==="ENOENT"?RV(r,PV(e),e):void 0}};kV.exports={findMade:DV,findMadeSync:RV}});var eR=w((uat,NV)=>{var{dirname:LV}=require("path"),ZD=(r,e,t)=>{e.recursive=!1;let i=LV(r);return i===r?e.mkdirAsync(r,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(r,e).then(()=>t||r,n=>{if(n.code==="ENOENT")return ZD(i,e).then(s=>ZD(r,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(r).then(s=>{if(s.isDirectory())return t;throw n},()=>{throw n})})},$D=(r,e,t)=>{let i=LV(r);if(e.recursive=!1,i===r)try{return e.mkdirSync(r,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(r,e),t||r}catch(n){if(n.code==="ENOENT")return $D(r,e,$D(i,e,t));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(r).isDirectory())throw n}catch(s){throw n}}};NV.exports={mkdirpManual:ZD,mkdirpManualSync:$D}});var MV=w((gat,TV)=>{var{dirname:OV}=require("path"),{findMade:dFe,findMadeSync:CFe}=FV(),{mkdirpManual:mFe,mkdirpManualSync:EFe}=eR(),IFe=(r,e)=>(e.recursive=!0,OV(r)===r?e.mkdirAsync(r,e):dFe(e,r).then(i=>e.mkdirAsync(r,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return mFe(r,e);throw n}))),yFe=(r,e)=>{if(e.recursive=!0,OV(r)===r)return e.mkdirSync(r,e);let i=CFe(e,r);try{return e.mkdirSync(r,e),i}catch(n){if(n.code==="ENOENT")return EFe(r,e);throw n}};TV.exports={mkdirpNative:IFe,mkdirpNativeSync:yFe}});var jV=w((fat,KV)=>{var UV=require("fs"),wFe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,tR=wFe.replace(/^v/,"").split("."),HV=+tR[0]>10||+tR[0]==10&&+tR[1]>=12,BFe=HV?r=>r.mkdir===UV.mkdir:()=>!1,bFe=HV?r=>r.mkdirSync===UV.mkdirSync:()=>!1;KV.exports={useNative:BFe,useNativeSync:bFe}});var zV=w((hat,GV)=>{var bf=SV(),Qf=xV(),{mkdirpNative:YV,mkdirpNativeSync:qV}=MV(),{mkdirpManual:JV,mkdirpManualSync:WV}=eR(),{useNative:QFe,useNativeSync:SFe}=jV(),Sf=(r,e)=>(r=Qf(r),e=bf(e),QFe(e)?YV(r,e):JV(r,e)),vFe=(r,e)=>(r=Qf(r),e=bf(e),SFe(e)?qV(r,e):WV(r,e));Sf.sync=vFe;Sf.native=(r,e)=>YV(Qf(r),bf(e));Sf.manual=(r,e)=>JV(Qf(r),bf(e));Sf.nativeSync=(r,e)=>qV(Qf(r),bf(e));Sf.manualSync=(r,e)=>WV(Qf(r),bf(e));GV.exports=Sf});var t6=w((pat,_V)=>{"use strict";var Ys=require("fs"),uu=require("path"),xFe=Ys.lchown?"lchown":"chown",kFe=Ys.lchownSync?"lchownSync":"chownSync",VV=Ys.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),XV=(r,e,t)=>{try{return Ys[kFe](r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},PFe=(r,e,t)=>{try{return Ys.chownSync(r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},DFe=VV?(r,e,t,i)=>n=>{!n||n.code!=="EISDIR"?i(n):Ys.chown(r,e,t,i)}:(r,e,t,i)=>i,rR=VV?(r,e,t)=>{try{return XV(r,e,t)}catch(i){if(i.code!=="EISDIR")throw i;PFe(r,e,t)}}:(r,e,t)=>XV(r,e,t),RFe=process.version,ZV=(r,e,t)=>Ys.readdir(r,e,t),FFe=(r,e)=>Ys.readdirSync(r,e);/^v4\./.test(RFe)&&(ZV=(r,e,t)=>Ys.readdir(r,t));var UB=(r,e,t,i)=>{Ys[xFe](r,e,t,DFe(r,e,t,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},$V=(r,e,t,i,n)=>{if(typeof e=="string")return Ys.lstat(uu.resolve(r,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,$V(r,o,t,i,n)});if(e.isDirectory())iR(uu.resolve(r,e.name),t,i,s=>{if(s)return n(s);let o=uu.resolve(r,e.name);UB(o,t,i,n)});else{let s=uu.resolve(r,e.name);UB(s,t,i,n)}},iR=(r,e,t,i)=>{ZV(r,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return UB(r,e,t,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return UB(r,e,t,i)}};s.forEach(c=>$V(r,c,e,t,l))})},NFe=(r,e,t,i)=>{if(typeof e=="string")try{let n=Ys.lstatSync(uu.resolve(r,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&e6(uu.resolve(r,e.name),t,i),rR(uu.resolve(r,e.name),t,i)},e6=(r,e,t)=>{let i;try{i=FFe(r,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return rR(r,e,t);throw n}return i&&i.length&&i.forEach(n=>NFe(r,n,e,t)),rR(r,e,t)};_V.exports=iR;iR.sync=e6});var s6=w((mat,nR)=>{"use strict";var r6=zV(),qs=require("fs"),HB=require("path"),i6=t6(),sR=class extends Error{constructor(e,t){super("Cannot extract through symbolic link");this.path=t,this.symlink=e}get name(){return"SylinkError"}},sC=class extends Error{constructor(e,t){super(t+": Cannot cd into '"+e+"'");this.path=e,this.code=t}get name(){return"CwdError"}},dat=nR.exports=(r,e,t)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(y,b)=>{y?t(y):(g.set(r,!0),b&&l?i6(b,o,a,v=>h(v)):s?qs.chmod(r,n,t):t())};if(g&&g.get(r)===!0)return h();if(r===f)return qs.stat(r,(y,b)=>{(y||!b.isDirectory())&&(y=new sC(r,y&&y.code||"ENOTDIR")),h(y)});if(c)return r6(r,{mode:n}).then(y=>h(null,y),h);let m=HB.relative(f,r).split(/\/|\\/);jB(f,m,n,g,u,f,null,h)},jB=(r,e,t,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=r+"/"+l;if(i.get(c))return jB(c,e,t,i,n,s,o,a);qs.mkdir(c,t,n6(c,e,t,i,n,s,o,a))},n6=(r,e,t,i,n,s,o,a)=>l=>{if(l){if(l.path&&HB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new sC(s,l.code));qs.lstat(r,(c,u)=>{if(c)a(c);else if(u.isDirectory())jB(r,e,t,i,n,s,o,a);else if(n)qs.unlink(r,g=>{if(g)return a(g);qs.mkdir(r,t,n6(r,e,t,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new sR(r,r+"/"+e.join("/")));a(l)}})}else o=o||r,jB(r,e,t,i,n,s,o,a)},Cat=nR.exports.sync=(r,e)=>{let t=e.umask,i=e.mode|448,n=(i&t)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=y=>{u.set(r,!0),y&&a&&i6.sync(y,s,o),n&&qs.chmodSync(r,i)};if(u&&u.get(r)===!0)return f();if(r===g){let y=!1,b="ENOTDIR";try{y=qs.statSync(r).isDirectory()}catch(v){b=v.code}finally{if(!y)throw new sC(r,b)}f();return}if(l)return f(r6.sync(r,i));let p=HB.relative(g,r).split(/\/|\\/),m=null;for(let y=p.shift(),b=g;y&&(b+="/"+y);y=p.shift())if(!u.get(b))try{qs.mkdirSync(b,i),m=m||b,u.set(b,!0)}catch(v){if(v.path&&HB.dirname(v.path)===g&&(v.code==="ENOTDIR"||v.code==="ENOENT"))return new sC(g,v.code);let x=qs.lstatSync(b);if(x.isDirectory()){u.set(b,!0);continue}else if(c){qs.unlinkSync(b),qs.mkdirSync(b,i),m=m||b,u.set(b,!0);continue}else if(x.isSymbolicLink())return new sR(b,b+"/"+p.join("/"))}return f(m)}});var A6=w((Eat,o6)=>{var a6=require("assert");o6.exports=()=>{let r=new Map,e=new Map,{join:t}=require("path"),i=u=>t(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(t(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>r.get(f)),dirs:[...g.dirs].map(f=>r.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let m=r.get(p);a6.equal(m[0],u),m.length===1?r.delete(p):(m.shift(),typeof m[0]=="function"?h.add(m[0]):m[0].forEach(y=>h.add(y)))}),f.forEach(p=>{let m=r.get(p);a6(m[0]instanceof Set),m[0].size===1&&m.length===1?r.delete(p):m[0].size===1?(m.shift(),h.add(m[0])):m[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=r.get(h);p?p.push(g):r.set(h,[g])}),f.forEach(h=>{let p=r.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):r.set(h,[new Set([g])])}),a(g)}}}});var u6=w((Iat,l6)=>{var LFe=process.env.__FAKE_PLATFORM__||process.platform,TFe=LFe==="win32",OFe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:MFe,O_TRUNC:KFe,O_WRONLY:UFe,UV_FS_O_FILEMAP:c6=0}=OFe.constants,HFe=TFe&&!!c6,jFe=512*1024,GFe=c6|KFe|MFe|UFe;l6.exports=HFe?r=>r"w"});var hR=w((bat,g6)=>{"use strict";var YFe=require("assert"),yat=require("events").EventEmitter,qFe=nC(),$t=require("fs"),JFe=wf(),fA=require("path"),oR=s6(),wat=oR.sync,f6=yD(),WFe=A6(),h6=Symbol("onEntry"),aR=Symbol("checkFs"),p6=Symbol("checkFs2"),AR=Symbol("isReusable"),hA=Symbol("makeFs"),lR=Symbol("file"),cR=Symbol("directory"),GB=Symbol("link"),d6=Symbol("symlink"),C6=Symbol("hardlink"),m6=Symbol("unsupported"),Bat=Symbol("unknown"),E6=Symbol("checkPath"),vf=Symbol("mkdir"),dn=Symbol("onError"),YB=Symbol("pending"),I6=Symbol("pend"),xf=Symbol("unpend"),uR=Symbol("ended"),gR=Symbol("maybeClose"),fR=Symbol("skip"),oC=Symbol("doChown"),aC=Symbol("uid"),AC=Symbol("gid"),y6=require("crypto"),w6=u6(),qB=()=>{throw new Error("sync function called cb somehow?!?")},zFe=(r,e)=>{if(process.platform!=="win32")return $t.unlink(r,e);let t=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.rename(r,t,i=>{if(i)return e(i);$t.unlink(t,e)})},_Fe=r=>{if(process.platform!=="win32")return $t.unlinkSync(r);let e=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.renameSync(r,e),$t.unlinkSync(e)},B6=(r,e,t)=>r===r>>>0?r:e===e>>>0?e:t,JB=class extends qFe{constructor(e){if(e||(e={}),e.ondone=t=>{this[uR]=!0,this[gR]()},super(e),this.reservations=WFe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[YB]=0,this[uR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=fA.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[h6](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[gR](){this[uR]&&this[YB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[E6](e){if(this.strip){let t=e.path.split(/\/|\\/);if(t.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let t=e.path;if(t.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:t}),!1;if(fA.win32.isAbsolute(t)){let i=fA.win32.parse(t);e.path=t.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:t})}}if(this.win32){let t=fA.win32.parse(e.path);e.path=t.root===""?f6.encode(e.path):t.root+f6.encode(e.path.substr(t.root.length))}return fA.isAbsolute(e.path)?e.absolute=e.path:e.absolute=fA.resolve(this.cwd,e.path),!0}[h6](e){if(!this[E6](e))return e.resume();switch(YFe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[aR](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[m6](e)}}[dn](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[xf](),t.resume())}[vf](e,t,i){oR(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t},i)}[oC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[aC](e){return B6(this.uid,e.uid,this.processUid)}[AC](e){return B6(this.gid,e.gid,this.processGid)}[lR](e,t){let i=e.mode&4095||this.fmode,n=new JFe.WriteStream(e.absolute,{flags:w6(e.size),mode:i,autoClose:!1});n.on("error",l=>this[dn](l,e));let s=1,o=l=>{if(l)return this[dn](l,e);--s==0&&$t.close(n.fd,c=>{t(),c?this[dn](c,e):this[xf]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;$t.futimes(u,g,f,h=>h?$t.utimes(c,g,f,p=>o(p&&h)):o())}if(this[oC](e)){s++;let g=this[aC](e),f=this[AC](e);$t.fchown(u,g,f,h=>h?$t.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.pipe(n)}[cR](e,t){let i=e.mode&4095||this.dmode;this[vf](e.absolute,i,n=>{if(n)return t(),this[dn](n,e);let s=1,o=a=>{--s==0&&(t(),this[xf](),e.resume())};e.mtime&&!this.noMtime&&(s++,$t.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[oC](e)&&(s++,$t.chown(e.absolute,this[aC](e),this[AC](e),o)),o()})}[m6](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[d6](e,t){this[GB](e,e.linkpath,"symlink",t)}[C6](e,t){this[GB](e,fA.resolve(this.cwd,e.linkpath),"link",t)}[I6](){this[YB]++}[xf](){this[YB]--,this[gR]()}[fR](e){this[xf](),e.resume()}[AR](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&process.platform!=="win32"}[aR](e){this[I6]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[p6](e,i))}[p6](e,t){this[vf](fA.dirname(e.absolute),this.dmode,i=>{if(i)return t(),this[dn](i,e);$t.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[fR](e),t()):n||this[AR](e,s)?this[hA](null,e,t):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[hA](null,e,t):$t.chmod(e.absolute,e.mode,o=>this[hA](o,e,t)):$t.rmdir(e.absolute,o=>this[hA](o,e,t)):zFe(e.absolute,o=>this[hA](o,e,t))})})}[hA](e,t,i){if(e)return this[dn](e,t);switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[lR](t,i);case"Link":return this[C6](t,i);case"SymbolicLink":return this[d6](t,i);case"Directory":case"GNUDumpDir":return this[cR](t,i)}}[GB](e,t,i,n){$t[i](t,e.absolute,s=>{if(s)return this[dn](s,e);n(),this[xf](),e.resume()})}},b6=class extends JB{constructor(e){super(e)}[aR](e){let t=this[vf](fA.dirname(e.absolute),this.dmode,qB);if(t)return this[dn](t,e);try{let i=$t.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[fR](e);if(this[AR](e,i))return this[hA](null,e,qB);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&$t.chmodSync(e.absolute,e.mode):$t.rmdirSync(e.absolute):_Fe(e.absolute),this[hA](null,e,qB)}catch(n){return this[dn](n,e)}}catch(i){return this[hA](null,e,qB)}}[lR](e,t){let i=e.mode&4095||this.fmode,n=l=>{let c;try{$t.closeSync(o)}catch(u){c=u}(l||c)&&this[dn](l||c,e)},s,o;try{o=$t.openSync(e.absolute,w6(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.on("data",l=>{try{$t.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{$t.futimesSync(o,u,g)}catch(f){try{$t.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[oC](e)){let u=this[aC](e),g=this[AC](e);try{$t.fchownSync(o,u,g)}catch(f){try{$t.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[cR](e,t){let i=e.mode&4095||this.dmode,n=this[vf](e.absolute,i);if(n)return this[dn](n,e);if(e.mtime&&!this.noMtime)try{$t.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[oC](e))try{$t.chownSync(e.absolute,this[aC](e),this[AC](e))}catch(s){}e.resume()}[vf](e,t){try{return oR.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t})}catch(i){return i}}[GB](e,t,i,n){try{$t[i+"Sync"](t,e.absolute),e.resume()}catch(s){return this[dn](s,e)}}};JB.Sync=b6;g6.exports=JB});var k6=w((Sat,Q6)=>{"use strict";var VFe=cf(),WB=hR(),S6=require("fs"),v6=wf(),x6=require("path"),Qat=Q6.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=VFe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&XFe(i,e),i.file&&i.sync?ZFe(i):i.file?$Fe(i,t):i.sync?eNe(i):tNe(i)},XFe=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||x6.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(x6.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},ZFe=r=>{let e=new WB.Sync(r),t=r.file,i=!0,n,s=S6.statSync(t),o=r.maxReadSize||16*1024*1024;new v6.ReadStreamSync(t,{readSize:o,size:s.size}).pipe(e)},$Fe=(r,e)=>{let t=new WB(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("close",o),S6.stat(n,(l,c)=>{if(l)a(l);else{let u=new v6.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},eNe=r=>new WB.Sync(r),tNe=r=>new WB(r)});var P6=w(pi=>{"use strict";pi.c=pi.create=hV();pi.r=pi.replace=XD();pi.t=pi.list=MB();pi.u=pi.update=BV();pi.x=pi.extract=k6();pi.Pack=SB();pi.Unpack=hR();pi.Parse=nC();pi.ReadEntry=Zd();pi.WriteEntry=xD();pi.Header=hf();pi.Pax=gB();pi.types=Xd()});var L6=w((kat,N6)=>{var dR;N6.exports.getContent=()=>(typeof dR=="undefined"&&(dR=require("zlib").brotliDecompressSync(Buffer.from("W1YWV8M2Bm73erNK/X8Ao59vhTJuj9A5ts0kuKSIx2QXjDzsGUs8PbdVZG5L6XYdVdXEZDLGumN1mwNUlCz73iKPJZC1igLZRK2zc13JaeOOPfeI2pEQlNZxCCqfcByDjjBMiKtBg7utoxYaTXZNuOE10KOQ8BnumEiaeYZZ1yOG2/yN3T9Q6UbzsAqJzf62LV/qfysaEstGqsaGu18PWSv9ilJB+HenKQgyx5MHJk6bcH05DqofPku3C5V3rL8N/hZQYNx6JTAkU5btGjpyS8/xyie/f75Ov36pjkul8GI6pmLhjLV9Q4a6yM+q9EAONZuZ5uu75Hg4UCXZgJzjYjowVu5wb6e97Ti9aFQ7qZlDPY1de830PV3T4NfglBN12SWPCeLe7jdBQJmIbojYfPmS/FfRvt5S639/voyaC70MjgvNQ3TI0EYiVdY83TB992jFNvsxWXaziwaK0ngRXD97W/b1a1qWUx0Xzr1H9Txa5lwyp4A9vcjx4p5JzxEj2mRFsE01s6r1CQYtQ5eGlDYULOTFHrBF/fGiPoeBf1padjprg5Y/vGbuEl8U9qi22qHbIVM43DYHsb9+5enaSelrwkdWlJHM+KmmBJaKKLDwVamvp6s+y4LQwmOy88wfbKHoxLN9o6iQqJAc4rL9pa9V9a48W6XLXYiJ5aNnTgENiA2+ai86rTkjEI7264UiqX+ZQ4c5o6P+PRd7pdU0fX0DpeOEqu7YKoRAsaicay2Q9A2kBF8f27QhzGmSEnqj7ZexnzXjUViEw19mfh2vvayvygcsIZuKQA6gfKe7Z+T7qmscWxkdqgz97hKkTV8y5eHQGjy+lavj1V3p9fjlMkSdYlHo/QbMQ1bMHgbHOWzN/+Phb5q8jWMmkgkulKVkRm4or2hhaPv0iwDPU+J1PDjoUiuO789Mkkk7bX81JW4EvwSxYg38+MbW8dDBX1mLxzfDAKNCDUhFN8L8Gm2ouPsli/K3+OPhfUCXddljdU/PZPKlM4QQb4AyxIiI6Ma4mKn1fOylOumxTwAEJdqSE4hhE+fXehoQomyldWZk2o8SZ/+/XLz3fgRwZ5zlOdUluYQsUzIi4+wc51Kt+GcEyEmL+FLifDoedne/C/kt//ik0dia2AY5mRBzS02RjSmhdYqh82u//peL+z5gMWdcQqlJyR0wMd39ZiDF0ZMfwoF1Ua1cmyBEwM8BtP7/92ba94cRMAlK5Sh9Y8yo3ZojAZCq+t5M5ohj7iaeiRDDACICyBQTmVQrMymWkpRYhlV1z733Rb54EUgFgJQ+Ekmpkknpy7VhiW30jZWqqr2dDdp/N/zDQUrtWG3c6A+GPexh//++qdVGe+77v1AogBIboBy1zTbGxgWQ7Wy0zgShFd679z/hv/d+CVW/CkQ5SFWF4ggoEqfLANtkgf1/Ad1TBVGzRVI6A7LNgGrNHmos1aM9h73rCYDcESm1lTSGWmNcbIzNrQuiidYE2YbJnk0SmySbBJtmxvr/35ta/fTe915EAAJJUSpKWenU1g6GEQGIsm2sHRffPefulXj3vtcJhOkmIgJdJMwq0a0lEmIZKfPeFwHyvQBSGYCYVQGI6gYoZRWlNItSO7Xxabq/cXYyLTfq9cd/9WT4B0N9r8r+3g2G35fWem1BuFpRx079myT7CgDGV01w7rjAmoX6wtutq//vfquIn06khW3/NhbDt4dLpELS6lKaWMiEnIicEU8//Z8Ne8Sbe9QvCoTjG5VBIXUe9YYaUKjqEA5XmhAaIw3XbFEF2zQ2suJjMIidpxdaJh9kP4BuFf8XlehQ5JXdtVE1lNaTUCTUFpCm0KVEpVl25jVQynv/DzCn33+TYPJrGu92m2Ya3QyNY4E4QNSIE8QBuEAUBy402W3fvqHf1ne4suXL0AaxiVIExEDM2NB9UR9f9x05AzPDNaRjIZcOP3jxooOKiIgoObMuvr+dJ3DwYGGqLjAQCAQCgUBDIFV/CBrkr64+3s0s/UfZ9cCAAQEBBgEBkWpVAQYGVuVWBgEGBgaROu0Nz5vr/+F9u0eY92l7KVesWEoogaYQEWjEiBRGhBJoRAoREREjpjBixIiI0/793OL/wbf3Ctm2X1yxYpMiEAgEaRAIBII0CAQCQZoViBUIxIgRR4xYi2zzZ4+Y6OH7YrAhR9S70EE605KKgXdb/5A4H8hV00qNkGpBRtQQF8QC2JqYcvXxC7p4Mfy7Wf83WCl65b2Z7kwCwSwBLxA8QAVCBW0JUqyCtUVGVj5+jlRc1+SfEt2s8Vmm+TAPi1+qxLn+PXGSNjp7HQChKNGoFvjYOwFFFr52fMXI9tgoJXozQG0OilPul5dsgikHOYWK6PNUrDqGdpTfxvcyvOX/Lj7XH7FZqT3QTRbWgLVz8HcqltO+berFSnrpNubwPvbYnm5s+IC9Q7UBfrbMwROJlnYfG3N2B60DL/o4V3hZ2A4JRrqlIzUP/pCIJ778GKjnM0ETp793edX4ZATp+1gz2ZeoCH9NNHhBF8VBBtp6KlpNMvJ9UpYMTdMUe6rb8QzJEmS6DSh7FtRcPyEPAyqtYh754XUkEnN9xC7L4vP785fVmWkQxo7SrurZ0tgtB9/oAxUUAI45CcOiKJh4HYRdz5d/rMZRnlH2NpRQyYNnO+7yPmMeg9oTXD9DrP+8pkoHdRmfnZwro/kMVXwtPJX8kwIWCGL3H+nOMCV7Dq2n6lgMe7w3e9rab3lvSdPcGnZe+PFVfEPrGPjHOx+bOH3+kd0em3M7/31Q45WivLl6zv5VfFTlF5eOah0yCWQhyP9yfvpUBKwE2jtP6KO8M1j16vpVWTQizteBynkHPHB+ebqSURn+/aexQd+AuRLCVQ9BVz2S624kRHGLzRiI45ZXtjy/3xWtzTlVnFMKV2KRjapziO5C3d1zzXZnQLdfr+Nz+X25c1V+NrgJxdaoFTASsOhRYIqV9L9hq+9POrnHzJ/nDoeUeytC+ADCyzewtuLJ0bHMB9j3RY1dAZGS2fAw0dwx+MkSKevMHwBJwwnrTyMZnmRS4VHBLHhWkNpC35Stx8VlbOFsC2dbPNvw7Mn3bEiFh5tkeLqmmj4/ZWnlKLu0Zq8dYwDsT+BYUAnaG1tyQnVkHM/S1avUkXIvLV2d99OlrT0zY5aIQ5ZSXx4gIMyiZAU99pwxCy32z0GdNVqTNkSw4Pb5Q/LMEL2ml5eAwDa9gUDTlIHz9hi+Pu2d/5Ir9pCXicf2NqhgdlSheTSr+EBXyrxFDQHc+tkVnFQN0dTm5HBjB4ivxpVhBOlOzaDjWeUa27YZX7GiI2P8zG3J2C0M66ynEqar4mx19VXd5wehI3GweV/jTdnSH1yKOPQSfrxdHE55UgpRiDDtLoQLHzy0XZEjuHEOLzQDVqRE2HU2lxN5G2DTuYSZ5E2Io86yZrIcmvuIhV6GMj+IookKUR/U2hAVpAIzmbAGUsPFMMeFiiInrTgmQJRDYriITHfCjLgI1y9R40CFKMxzyoqkIKed+1DEpAXL8YxInKx/+yV410/NTbtUQORAvoZsdD25ZzgAQoudlEkKlyWKw5cwS/jUY0690vf27fqKAMOsd9b39XyJS8kVsDTX9oUszCHVKfoYg+7L3pcBXPIrHQF4RC2Pcrz2zq50vqnirPBlNrPnxss9r7qoXkixr8/zu43ttZyXDFvOLRn7WB5b72YYetj992bElhxEMaEmfawj55rQX0DNvbNutjX0cavTr5sZv6/RPtfuI7pWElzcPfGnhXua7DtAeZ+fpNp/RtFmq1xE79dHuxBs7er6Ci0zCGKP18LpQMvRPQoP4q3Ehj1r4jsRo9lc/xUgkhM5kPAuTXIviCAO5GTLGy3e2XzEZKt9OtFkPco5b8xWXw3k/dsAbs1JHBwJTT4YUamEGejooimdEiTUs5QRvFiww0BqTOEKHCGiL7ZAB3ctJzsZ39BMS7O9dq/o03e8npWHPqdEoe+u/R8UwWeMz9b+L+xTCU6T8ubBZVbDtxUvHsWJJ0bH7rkzwtajoNOcjH9hAf7cyy+E3BOnBTGpn+4If97hVxV+uezshKgeb+35j6+wz1XZd6jpgt8fDctNSwu/GWYgUTL5cLXBlbNwBODU8+3FhYscf6Sqq1ckBve+CQGgX/uYpl5YPU+o/Eni/RsDyRo1Qv58niyyKAQP4ML+LckND0SxQjKbKN3JCxevKi4u6iWgIeqK2LxOi5KxO4w+peT08PMZxBgN7lZiuIcY/iO477N3s03zi4TATaF6g4sRYmgfHsMFmj22NTscveBLH/NEpSQmPVYQoAbc6YYI9xGrW7FDB17jG45jzDnCTv1C73Lpd3FWu3H9CWJLxLQSYVlGQFGjxeOwnnWO6gVtbBni89rNxvQaL6LkvvFLSR5xKFox18nHu/4XWfdAvexgt/eQcFskU5lK9XWDsCDtj7YWhxB2hK9PWg8s/I5jvEY+PdzOkT2i/waXE/IarTJEVLKRnnmEdQYhC9G9tczVmm16I6D4WPf5+hRKSo8dsY/uB20yFwbvx5C4n4dG9rR2h2Ru5lUMb8JB5VtQe+TvVJlQDX5+kmkJVle0+UD+l1qYvLKceGduGEd5F0TAo2ESO8GIofXQ5ewytv32OWZtRisntPmkvHMcUn+pvdsDoUBPUN6a5CFOLQ8vx7lkM3HsTtDigICO4JCMn5oTgrtucpG/0qlvFwqkOxQ8gd1f0rK2z1SYOSBZXScRwbpE9dudyyMOll3R64cIzQAXlAa31Cx3QaXpgkTwwn2dwHDCrM9dT5banqepsDqu5+SXIZRnU6xEl6HRQuaEp4cYUbogaeulGBh3Tzq4k/QByLzkebCVdWuaOdQwMMPhnVzUUDP52+E7Ti41SF0BYp2hbbchtsoENe/BDcZUjceTA1fZE6sNHNmkE4KFwFererZNtxCSzp6aXMmwXK+fPvtVHrqq+COuXr369qd+Z1I0I4WVo1YdhmbglaUe80GOaLuzj+82+jbrS38sI2gOYh87VV1xLctVC32YgmzV8qwdrnigNpkupw2mdTPza+SHdqbWwr/yIThnHiCxVYME9E5tZ0zePosxrFq0g+ovLS8oOAbJi8fEz47LVotO+0DctM3qPqkKg0DidKXJrhix5DoSRu/0wExQeJt6xHHyYiPl+XxitTSerXqaG0UPzBFmT3vzo1rR71CXiDbfU2IuffcAKMKDqoBRjnh+RFGSi+7XDGA41hLfwopMLxGz5XFmi5ydJPrgEvPd5xIiIMO+AQtBnXdiWGLEOGip+JClbQr6x99AAbMmGsIYOWYoCjebWtSPqRIvJ/pBM9r4fdlZpY3Z8Ja7ylURGS7palZJ0DvW+kt0VpBId5ZKNpOzRJg5+Rltcbs0KM7fF9UnwfvMtJu2jii0vKfQuMb/ybGv3af80gMdAWAeh3WRXz+PIa+SF7pLi83QL4uwdF+doOL1eZ20Bt1CODxDDnMjpIXnrddkTVc8nWEmGsNkaCw8UkWe7JTcp4yd0gddffQQwOuJgPURfJofkxVAsSXFUHTUKPoJOCZJIQQHFI8xlXV7BNZOaCIVwOmQ8xArV5f4MXsIb1aehRst1A/Zs0f9AyEvBXR5nktvoMsrzmAJ0VJcocFcvFp/06XTnZZrf0WuvsS0DQA5+/7rAH1EhOLkdP3KcWVHIjwpcZ87/A7TZz2NngqDszgaGv1ElMeuPBTER+3oKTs70j3QbcUm/YRZ5r5PJQz3MxSCpLAz+7igOAwn6h/PQhdmDb5X9poTxphOOOm+DVMPBSOMwewPTvRhNHiMRlI80560FEsKJyrLIgLlPBteg1+cW1zAgxgoe0qcbdkjnJ3hV2hn3O3fqk7c3w+bHDDii1smoUe2PL7zIkb3zm1cS/c2ujMr3j2SYDltgAsqEXzf4QxFRoLXER6IL+PcLrH4R3ed9059MFRpaifDSLA2wBdxL6Z8xJYdNfo1Mbu9XRcJEJn4vAlobJK7Hd3fm9YFgbhXFm0T8eMvgtOCgFph05unaIvoPs90NDzTkU6MwSPapcOWxliCQe52CMdUVU5EHjV2/EU865kMbNnpCEw2lBYnqCoxHccaPy5bwjHsdHq86muWsY0hHF5H/TTPMMFBR+PdVqOZFI3xa1BfnlH/p87GwVt7Vw2BU5dpxnbHrfKiD6VkdF712uc/vIWiY/D5khmpI4WNXwtICaUOUU4WGOKqUDcpj+8qyQDJSO7Tp4rwZdLLo4kHeArAIElgCvx1bKHLJMk+BL9JFI7Q0K7xx8vx9sWcaKpvS1mCIOak2B6+fva7TcqX+ktKh+uN246dKmqP5BBSlE/L61GLjgF5w+afnVbK1X+lNHWEIdWsxa4XEGpI0KEZoQAo+bqkDjBfrWOMwtXEDRaCDuuwDzfr4BqfGWwIH0F0HtDKgarBLYIqMJsJRsSokNggDZC3BxpM0pITcTsy8ZreNNUWdYhLVbBoUNrWsXFLkt57tW+a2tEvIK0xie1qKGnk/Hh2Ea42N2alQeqpDB2wnGLViBbMnaJJLM+o/uk2ZGF55xv4ppq6vY/ZWqkZoEYAyd3RMm48UxdAJX4OLB2/voiiOU+4/uaDDToZ9tjT2B02eognvwkVP+vZLoCLIHXWgSrPXbC5mwPphY1ChHMinJVRU0qMt6SuNVmLAzPi4QNolZFFmcckuYdH2SjXwAGGnF56+37ujl5B3KV2azlPeSnO8EUPat/WfHt/ZjxYYQCq1Z4Nqt7j+AKd1Czjc3SVeFtWtPtyRS2pOxPXEJ70QRMzdXVSIlNU/9ZSHDr2XOVTFWkTkKmrUXlxNuLKRlHhRhMK9Vq4W+Sjq44MiTdEAgJfmu/+mIw7Qcf81KBKsvqhylMqw08HibrktGD6epm5zAU6JcXVhM82Z4BorUG9K3UdQU5Opm6mAWAIOvxE0DtK5U7ADwO38A9F5OvnTAwKrys64ScP1LMhMiiwC2EBI9V0Yl/AGffdM+951wfi+g3weqBny7qcO6qZb1Bar/71COgBjoAVmsF3hFOThCtQnfpUYQV2c9QuujW7aUpIWnScaKTLFVcVvRbKruoVoxWGXcrmInUkGPcObrLFyQCtdI2hqPXdGbqSkhKtOm96pdJyIwAPe9fuuA29UQaj77/3nHlZQi2elDOPFAS5OfMzRq0kpT4yXRwmngXhpme00oJgX2W2TII72AtZ9vVYINCXVvf5jELb9Rq9iYOlarpmBpL4AkI0pnfA+ss+7QPe3/fSntiT0Enn/+sEk+NcLQ6GsTnvIm3P1IURyibKgDQ5DffJpru3C7iWjk+JNVmqhac9gh0/IF51I28tCRE0cStHcS+h1f42Eeh86rgzqVdiRGXih3rVyKWa5BDCKcVuaZUrI56RR1NOZICNzkX4krHY47b+XfC//n/v3GtzfNUFbWzSb53njnOETw8NyN3DjJfWejCI8Emvm7NASuyzScCjosd+co/Ycm5af6CvgFShiiqo32WHdiWoPx+mSR5kun4hJTVBCPdy04I5TeGINM5bI4KRCEt7pOrkVEsHiYYpHl9QJM4VpBE1Z4/NM4Wiv3MEbzWEKhBkFA0Ogp4Wud4yvnl8I+GtPAwIhJrF5cgVWOi37j8TYbbd//KIhqtE9ljkLEirv+gIsR/Im70HGryvsULUVmvbECelyrtCCICQcObbmWn3E0x5izqBUT3Jo8WFzeRIwNPSl6qQVHM4lHc5aeNRQGaCTAPNwWaxk7q7Q2NLzau89ibBpWNzGafIopk68YqIQaFYK43KJhR7CJIfFj2cyJmtksT/SMnqmsakSmDiCgEBC7f7m7GDa1/W5vdmf2NYIHaOGwJdkznoFVD+FkXiwg36A/zrPkeDMyg/4PnzzuuUz5i3DIKTvxzUMmkmj/0FAAP1qJq71Vq42IdVWUJCH6+f7S9ECB9Ubz5XVgpu4Fbg0zqkV6hsVPrkzLKtNqIPO/98q2p5qZgb3179cfdKh2hHBrWt5mmam6hsX7h+/Ncz69PK7eoH83Xrb1ntYIeKRH/wivRMklkFXvHjE21Gwe4XvW2gBqVErsqteJbAky8OBHTki2gC+phz5BoiIsP3rFpT2OByvPjDPiFntSTJUerND94Y+NWLtylAueHT9LhRcyj0IcJZWnF29++tOOCMMSYzOJVeoVFfVSgtc7VbfiqvyQ/2/z0aOZvNWaRYrYpQg23eASBz+dFyJlWodhVzluql6Di3Ec+llWkhxUMDMtA+/qWAqzw9yPAuXg1MlaNoJIE9nAW6mSRiFWNEjhvtxYnEgj2mH2Hc9JXKu1Hdwm9G/0ys61lPZVKDGR3yo5Rphvp2DCZfQnr9x325eQrP91+3hr7S5q5k519X1uzxtUx+KvTqFbncem6V3wZupe9KvAJ1e8jR5fLBcCoOn1/C1QtalFmwpN2VfD4C2cToOF78+beNxo9NuBiuzoJlDBwKURO/Q2bmodAn4lto0tN0rhg5z1LXSXIqTEQbgmw+r/09dW9ED/ymqFZMt2lFMGo9wcKqWWXZUa/vGoIjq7rkdUW6qhatGjiL1VKkSEHcg8EFgZlNE3uoaiCoEnEanHSbgDEikiXIDEFzgfHfeAN76V6ZOCmPUc3pxg8SQyqfUDhWkOm+hyPISD+HCkRxIycSPakJDxskLUQjmoyGLOMPNg1bY4zCtd2IkCA5ZWECE6lMQKyLnGJgLhC7s8i+AWKIAp5G2OXHXcdEDd+tTATekPXKO7fayRvPUHpp+Wu1gcDEjOFYuPAJ2rOrWAd70kI20DKTVCftb6QgIRawNqkRHCQfPPSBCHm6KW4kEO9cuLRrLxABPAlnioali5qG0EpJGfB2YtOccBqSPWEBbM9oj/GY06aoyXpOGQVIFAQ+DoXiHwUAdR8b8glO/tHmjPMCNOwT7AvPNQOzT2SBU4Ht6TRaVnzc8pgRKPJOgA/tiX6L4OQPJw2C6TuzwgeP8TBiWgnzpPMoWSd0sPvoKRcfrElvOvLpRmcvDlFCzebKKtC5Z3W1R3FSInz/FNaihsmI5kbRqVHSNDCD6u88qDBKmms7fZ1g5gx2iAoS8LA3wPUC7A50wUUYK7u+BLQjzxdjIP2w+4gevpHKgRqw6ztgzw3YVwMwWD6i6GAwOIxElm3GizzLnoRx6BEfjSjVkgGnw8SBis8XbEKzi6AMMtFZxtQ5ypvAix+STAwmaorc3l65iyHH06+zVx4AZCrGMOiWR23yCqzy0GQyXaDDrILohWIMVjqqUK/7zcZM1ggZE7spkWB4V0k3uzB8NK+FYstwGsYqbPefIVc5PPiAf9p2CFu6KfmPoh4hyH7SntKfYH1enwBdfQpbwyf0iQxoMzGM4Gm41cqeo41tWMsawK8cVDMxnEEmPlMmx4eiWskRv1pk43bnNvF3JyUuA36iYvQ6zOoqA21NOXn27odcwbgX/aM/6Mo9um1i74yz3jC59z4g+4SDBo0NSoCciyzszyPCpbHRcrCjGAdCMIS1o7O4AbbSBihej2mLEJSBBkCqN5D7OFbOl19RNg5IYhjmwhE2pPFTWBt1iimWo0pTQRIy6fmxjk89mTWBicah+JdpFiibswgaHh5IA5SZoUhaWf0r4+T7J3AvMsSh039cGgAPuxr5CSrMFJcr0n97S/OZXNPTNTY/aNseq7rUEXO4O1RDaD0tKVoE8JWfqdv32oEtUaj36FJpNIGkLKqIUREklXHjuEIBE/08tAtdvCk1wGPcgJPjVpcj7ioSDUxwhlT001ncrK1mzYe+iRyQ5MRm+Vg4Nq97PZ1osc4O4pwag6LcEQUHRymQ7/5Vj32DOoynh8KYgjih/E0WdVQgSM+jPZ4HkX9yGf738D30BVag9n5+F9loRyy8ha2pVzyi/FemmQHIBW9fZujcNsS6sgsDYpRbegW+UCOmuXBAcv/PuCMArMlGbhbXH3amvOIAZ6Tf3ATav7ULfuH/PegIAEOSc9F2oyd7J3VLd03cceSLd1v/mlb1vRpMrdO2/ZhCycas9sLPtPouZnVFrZvgXSxzw+8Jp7daeRvBnUZJAi83JRFkF81j54JGnqtvKuuy6xQmeUhULI5KmrqRO96Y8hVJQNwY8oOW/NzwUPMh9WhZvlIGSkPtKQ5BOEHUqqvgCwvby7TCxtfpTll+tC/jOD40zWKR9pVFZdpzNbzYPjigyEmkXZerJ2pUIgxhKnSFxkG3TohaqkUSMYl/Vspzi6cFD0n7l3lvo2Fr8+gsoXe8yPH9JJ2nad40g6eIuhdI2Cekxl4y2q644FufadchmJZlGwbaZZrbPZKR0fPfEqmZ3D4Fqr0AKXOajYZ+0jpnHeEBiaQ9uaEU7uJldkHdNTyt7s9tW68u68GNaeUl2qYnDyz7LpR5heb6VsjH2crvMk+TWFoU5RJ/JfkpRpWiTzJjGbG490vwlT9bsi+GOIeCLb9Sh1MI4wW5Mf//VKDQgpdxkPSBUVUNOTXGj/Wr5L0BUcbAy8o549Fup1314PDoK/o8WJJT05Th6E4anLq1n1WFpDYXrwdhfC2/mbAQW4hFGWKqKzrPEom4YjOhDqgnT2ZVpfJbJJ8xFxRx0meXF3S25X2UPXbiXu+euNzfxVlhc5tmcWZW0APk1PJWjjrU7F7mCk4n4Y4nZTAztHjFNzwdBCbVRfWs3kJsjprI3vwVESeIqctODxQu0fZPdkbRk9q1rJytIJPxEOpulEhBdbNrkcVD13LPw5fAkrt8dZ/hD8nXpfDumFSGi64G28VyMC9iEIzwODfmB7K6hGdBrcPMNrDErgp3AJtN1NSdYIxr1H628CziQ4BE45NknJxxq6hofIbYGFtF1KiFwi2x5X8kplx/3zH4UQ/q60L4tJU37I9NAYim/M04dXrv+IilrC/+9tMaZ1kDlicw5ygB6s3Zfy7HeyrUrS19vnZX3tJGZjUj6xoz5/JZ4+hAXQr03AZN0iZH2rT0j8A8OIGT3gjtD99cMJ4knP4YzxG7c6zAF+oXb49OQx2VYfu0/q7PXuvqt6H2ia6aHLhBY7AFQfBmbb6IGZt682UTuRXHVZdckrlCcTFvM2+NoC/eRA1KLrbFa+V6Mt4FL5b2v/NJltNG+bvAYQBnzOmC0hyddOryueIm6hmjoyY9yt1FpWZagbH0uAg0wwUdUKRyvRy6sEd8XuJqbuDE8wBPA/Rd+eCPFS0uc2m60dFJPYvJhj7SyAptiFeiPUyb91NzmPVxwsunqo57P3EUbA0VVZsnfYd1/cd56A8o27hb/HzfPNvaHBksoqgEMP2bu/crFSS/2Zj+bLWTN6AqqYg86DSNGytiLHytitwt7h9Vcs+QAzVp96Pd4qn9XF6Ecm9NmSyZaMDk4Yh+VIZMm3HQeFBqhLh7YuYt67cUG/xy6o9f71cJXizpyd9pgxz6scqmkIOpvOT3C/xNjVB9Lw/xen2tfESlmLbpI5BQP2ByqSSdqLB6UM6dzwVHC2eEAnN4k/WvfbuL+3mONCtMO075bDDNgkMyXQAxBrFmDa+NtCdodAHtsqpKsSjonBLgZPl7SMvYkfRXKaJlXGSaOazr7yl7n0pZMy8Fr/ZuYzGWD+3T0xdrWx42bmiOiSgsDKUL8aQLoUhuAKzGSYv6U3FDMJhOITwiqv0ntQ/UFK2KDbLPX8iBdGMZP04nrg5CIWaoq9haG1w8HPbP9AffjYhHcxYIUYUuvxkX3l7bBd5yRIuRdE2ltraUnmiycXCEisisXahptVGNgbmQJiRKUzbkilgXT7bv7cCRWOE94rp0J/Z7yh06ADCwXo3CjETDYsfqiTYYBCuymJ5wJf3ZppLv36b5y36QY9K3TX7qp9H2bsl34AvQyed8bGWco55f0deEqdsaUIuTNLQxJVyqk5FUMwjGysD0GN7YUpR+MAxrRu6BY1XNQW64S4WI0zZwD4RGKiFrqOqbhSI5yJoq3PdPE7mcckPU2P7/gY87rNpfUngiVRMMpNtCyANC/78IQMc/NF/v/H+z1KBK1WaJuRwc6yFbX5L3YiMnKF/C4eHyOxTTcyKw854grh/CjBh4+k7R0/SI7c022jOn2otynu/4bI9j+/3uDvmtQb8iyteyxrTA7tPEirQUsYL4Iefb0iGBEYvbRYvo5Ha5piUtbMmBLiZehj3FyLNN838vYkohD3vb197vBMrRUBl+vqNrQaTQT+ybhnejq1ul2d8V/3plk2l8SvFtmfEpLRzk24ocETClAwKeNBCE1oqu9z3dL23vpC5CNmvrjWTUhbKeakKgTNPOKNbaXpdIZ1NnB2oBGw8+qXUKhJFP9UCgoe4RCHCJhjeIMxzveXpqIhTqCp+C2T19Qn+8oVx1ij9m2jELWuFaWJIUoomTg9T4GJa5uXGRsTyBwn7EfXL1sT4K2qIrpbI83pBnGA1WEIRkKk7gR4iNZFBwOrtZONnOkkmhYC6wvHLlBuTLpm4wFKwsIa3qYzpUaqGUJSKCMEJbusKzDCwVvF+RoGCG/iTTT3Jt/hlFh107IjLnPAlMoEIQbY7b2HKdXbsrB4bNROZWTZwsH1Zdj09Zx3VMsKdVuA8+tu5ZjWS8PcYVIK1jgwG9Squfjinb+qmfnMtpYU+nJeow/OjI7GHOspjPHbWbyPLjtuTalO5KignmftabHPKanlqKOKd1iZyGkqszNifBcIhBCBGA8eyizvd/DlPPIE/ar6oGb1XcaYO50C2ASxlnb3AYwm8co+FqavH2p8f9iqjXJ88PP43J8hMOEByhxzQ6rb67vLLZnma9VUL4rKA4QZgQeGiWQB3gyMokZrcj2bXNYf390cqWHnIqTDwcQQvn6RN10ZVyd+4GIbinGD8NY9cBJNgRhfg4tOmJVg6l/Y6e7q9MIco8Ojp/olTCszl3JQDADq2B5uKbrlkrk5I+vOhiJvk+W5eJXcQLIZKweh1yMydBelpZDkUySzbnEFrnnUw8XWn9zRmWse3w7HkoPW1a40Ana7BmuncffjhHtFq2MEMjjcLjlD4AdekEP3GpUAQ4Y5AHNaiZNDiT9Gm4QAVdqGW995w+d3hnlcITsGUofoJn5HPsVPKe8M6HK6mLFHSe/lxL+xzPZ4Pg0Ds7rlwIXUM4Eqphnpxc7XQL2lAWIhLmOFrEITLjsNVekN6i2PDKc20pfHbkFwJF1RpxiFAEP8qyBz/x8om52qxJSWCP3OJWtBpaTEujhsCMhrk3EJ6K81Kwy8A8GMF5MTLteMdf+utLevLh/UMmT6A8CZ+CMNE884dOTtNDUNtfTfkXBJUyy0Uh2Q1eFhKo6kqRDB0vxQ+cYMS66c/CtwDiEuuzDM6s65xBIEEnRjSnqIPmc3ayzaIJ4l08EMcXBq8SIzZpbMC4S38QhovQfV/D5zHETGMw4PESBDjlcXUBPPBYjWQtGwDDNrzsba8g4dOZ5A0IKK5e7J/v5+39fIgn4ZLNY/lhC76hA6SeKur/WKzZ1nyrNr2LQN3Vyyb84MzfgKkGvEfeAU33wP+tGzp7r9wDx74HZt0DsAEN3RA1mOirbJhF0/zWD8upN3svlOa7rG+8NzSZG0/6MwZ+EVrriDnrMBT6JK4XGU4shZkvMX8Qmo8rdig6i4LW6iU5V4bSbQGTVsM/EQBTvV5VDfANjGcmDhc2dx3W03fHjaTlJRjibmGOu4bptHvV6abtnQcLTad5TbXZmStt9dvi2eQ+a78PpUs/HTXtp8J47v2+qD8HxdHKZZj4d0/6GBmfwStMpSa+MOt9XbL6ciT1x/PyULQ4dUtWvk3mdEJ/mLws3CVMRTK3G7UnqF9JWW55fWZu12fX144qpyFHm3SpMHD99ZaZd3rSnL78OdfLTl5x5mpAw51yaPWd6pQuFZf5cFWUy6zekbjGE85vKChnsr56kh0K5Wmh3Nhv3u/UNRIIpK7hEpS4GXLcwZ2Ibu606SKCCfJZRlynoY2IBi3qAzV+HBgG5sHD2DRYxs329p12C9enu26tV0zIe7LjnbIsykQu9X6MPvHIMCoM7lEGvO95FaXVMozLbzwLtm/rj+s/XR/kR7GGkjwuoRINw1GofnmUP6cfUYLojvdP6E76pkE/nyftoSIKIgVDcC/a5y3BYTuXYRHrMjBzsS5JGIQjbS9/fSSaniC3WNDvLMB7UIUZYCc8yuZnBhQccimS5ncvEFaeUL2raYyBRU0gYOCxzZkoCwdFF+PPtCKjgomEC0FATNUYDRoOw1V7C/Y6At1EZ9PKTsJhS9GKCEtjmA739eGmsttgxkRiE2ce1F+cfcZUwJrMJUojiKYY7Nh1QoIHbAqrSz1UHjkFhg+76Qvb1VTbpIrswAHnkExYt5q/BvGuaRFKo5MVOZgR9+ZJ3Il4yxAFSqII3myUQ9k5dz4cYbWmFbd4s4na0zCkIwY0PbGtMq+EAcqilbirjq2wRDpgpC9CrWfeZxu7PobsOMB4K5UG03xBzK8a/A57E3KYEIqXhtQoTBdqp5dvFiUIj+hLX+qt3il7FAWUxCmW2a0i1sDJxFL98oKIJaXsCWgNNR2tIYJOKomwuQ+u8shlKwqtIifi92TdLYkRf3naV33/Lba//CZREZO2kOH+B1n0Xug9CYTZTks845TYvs/esrIg92RpVdznMg5teApj+Sxc+YXR64VBneTsXNF2GMEPdZJmEYWRlNGunXo4xUMxjCfSfIzDlkzteaX8gIwBjFu1u8ZqPWjjj3xhu4ZiS1Ytap+lKQCl5Ry3+88Y/feSL4TJKSk2NaNRSqwJQo35wE0Db3/5SN/CK79DWCNZdhcV+VTNResWUVPwsjTomqgxBEM1lsf6DmJn+Zuvf7nnEhkCG4w05T7/hxm2DHhbCNJdiiZqpXDjBszkPYGc+orb4pdcpvU/QK+E724tEQrmk9QKAQbc9p8m3iGJ7WzR1GoqkGRB5eFUCmpi0STydjD5o2MHu+QyVvmZNoHXMj7klhIkzkPlestEc1er8uzPZHdmqoynnD5tQOr9jUQvVj5BpWkPUln+GeKBCdUGxiNAacTJOWdMk2Obf8h/8LZgHvhCWHZ5zz9W215svZC8zFszyCxTrfRkHgO0q5WLPD0rlP2dx/jMR1bvUmzzA6/k4vXuigJlzpF224oE64WPBqLlmRhf2Yyjl1VGpfuwqL+Xa+QUH9pKUb2R4fm5OTGnlSottB3bsFp7hkYb2wFYEUB8CUpoNm1YxuDgrsCSoFU98gax7JVKUh/sxDP1deALHmMMmsATDODcTJu0iWrllaehDL75+sjioiO5t+Njb3vTZbtKH8q7tz0+jiKyhj6sb9JetVp9BrFsiVXXv6icH7/ucrldceFxgRyaGzy2UHhlRbJ0beDxjTID16r5lD7vtmsZ8LaSpRCPpXFpfyp+NWvNcpm+8tV392or6VxFqiBPkGSrTE1PJBA5bSGE7cYJr5kzzDKqMKa+9iYqyyzdT1aMopG5W+EO+QVzJdrQabTvxbx/px19yUUnpEtpt6VCRRUdeoJaa/11r0fXl9cHjjcF0MS9s3uAM6BiT6BL1rl3hOZVgD5tYCvu9hoTDgkSAKZnUuEappY2SfWK07kAeKp/cy92jPvdf2WKmqzCmm7Q+tWScph8fdL+LNKYRX5ysobhxVNusoiX77Tga4fsfoSSrnXQQ8HxHEfAydIB7eKywTNS1Aj8LhThJ8zKHtQgj/7w78pRNNWH3+gotD0Ury2j+qCEJV+w+7KLmWb1DikYv1tobpv1HtUBYlnYQF/hxLYn9fCCu3up5Ozeg5XdX3si75ie2y0qzvS/7qdPHIfsfr9oDZIRnW9Tq2ylBvg+e2ftMi23e9QkRu1ZMy1eqv+ShDavrQT4c/peKrpJMR1p/10N61F8f2cmbICrFowGEwKN6/D+cnOsRRvm7KW5p4WyctlRcZxM6CRxRJDqhxT0ZXef83zJy5DHVCIev1h9KrdUA1ISJJqddFsTKAoiBOcTWknii7UfjuElHKL7NjGXKpXT4jiI8c0FF5U+b6Akn+ajHBWKecuURBAxAtNr+nmLXCkisqwxOw9eroRC8RA0bMXgAgY/JDzKrGZRON4emNGAe/oO+IzcA2j2ppi9a1JMRKjkTEhB+xL2Dx/rnXt4W+q4XyjrbIz00S7JrWAdpYamb5tBzVVfRoHY1k3fVEKRTr9MHzRXRMU0k5Cih13pYMFaTvppCsLie3XJGy5SSYRdTuAUTix9CKfxiiE7uFuWTQ97HycKFt0GKqlj2joX2H6QSVxcCe/yZ4UqJBTDgAGyPWB4I7oypNdrAAvTPUJFMxqk0hbSdLaxbzA4tskcaytumYCVVjRnYB4iuTo+8EvD6IEevarDhp75PSGZsoiU0AyYJhW5pi4lAoRm7YrgEh8San//ZdmVg0gb1azckeyfHnrm0MVKRK1uElv+mzPuHIbq7Fmy//FipYGlR9XwzzTO+M0QzNf0f1GTyJR22tldu2e/q+LT5hxEfdOpd0uXxBnaT0gK7Q1EamtbEy8+eRNyC/FWIR6qcwpTU+WtQnCtkrsUqHhoKvkM+6n9oBNs00yspXL3p/F7J3dvYoSFVz2fhqa+T7zPw3JjyKxol2/1ZWaQDWy9HrpYberY/1WeKk0LQHiXDICTZLgXucpML+tyFhjRHlB/WQ6FqnCh9xp2EdfSFyWFrxyD6tyKS8oru16unI/4SluQUbqz68FMyN+4jxZxyH1FtWAXGNscuovjg4F08rn7Wdeq0JAjw11qq6c/5Enyl8diOJCSc3K5HvRATaQErj5Ma8MWF0vdYx90a6i6FZ0Xo3o8DU2QwK+KHknh1YK+U9EQjf0kopqwq6LqGxex+6C1cPUMODoSocISRcZGKjIoJNhNi3RPf7onZsfCiG7M3sL++XJFhIt6wXu2I953WGgnyvV2rnvdl1gheWs3EvvgXKrmnOJx9gW90HMyhdfloE13bl9k+3xPlyQ4gaUkeEtoSRss4Y5o9amk3F9plSUcTgxsgbWT5LmKho/hmZHqSODexFWyJb3Udc2ezxLb+vhYhf3PnIJMEUVt0eOlZvZf12V5hHvnvbSUy6/lGmVWtyETfxgqvPjLtj+qZyz17Hbb3ZDMRDC2a+WOFvBA2TkednlB4LsYMy3KpDBlC5klflaPTE9EdPiYruXLSkn5EWjZnRKgTbGJEN6uTF620JTVGe9PdSzi36faFfhJqdWp/CpuWe/YaxwZtnZ1Y/DHO+n6bPA8BmcV4ew8ntda/51pNUwLK/o7o512wqQbz874vP/RL21wHh63VN5C47QTo0LbslSdjL62TBY+hyp7AkaLRJXoedb/kNQ9NbZ2984WdSt00YvpJVoevutT+cA+BIuHFd3cD751rSoR2Xp5iUWtP9eaF1zMAXXQ0o87fR06/GCZ8l2qDFbLVHn1zAO38regOur4RtkPmk32XK4XrwhurZ6bOedQf6yNAOBRxR856YclX05l6qHBq1XtTFRE6KOCdRb8Khky9u5O/zJWrNw84SdmXSQs9Ie9FPx4lbiFIdfsvDQd/ujyD1rU+YTbf7uA9ryeBEsf3dK+Xtai0PbDtIf2f41VAZTv/S5w2N8uKHad91HXEKh9JpiP+hhST8mcPSG6Lobt+RlpYwZ9lEyA6BT60b+LCnqiNrw3MyldKIjmUUimns/NxYVzG+VX8y1CvL24O2NaVJDoQRcP2lPdS0nyVRdfrylfMyFH39QTl0rFrDY5v8ijaDGTmRsHCnlE6UfBKjMsCXSHDZOMJ9VpXgLXsyUudqb51elo2zka+uTTzz6ijmzTdM6xwJI2NyHrJq4FsFPMF2sMdt9eLAcZuRK5NfCs9JMhc7brlTC+MGD2oHeQ2l3f/hAGRcitMS7Dq8XTBbp5NBAP3/s3VeU4n735e/+KL7nnA3f8k2+5401FRXqwFdMn7eJVufxrJZU6KgzxKK/7bc3sUJRxySxP0+c1oHnHYSvwU5lyNdV5albyoUmKTweWr71j8nb869xNt/l5Esc8q3x2V+cebi2fKzr6kOhuet6arE+30Gud1NBbnF90ruH2xzU5YrsWSyAwTp5pkwOTnhoyrmvQpdB3jx2UVW5N52vo2ycXoQoLa5BI7tSsLSXN9Kf30l/0nPMXVHEnUTJpVk4koFQ6OTmQ8bTPkrS8nk7znnGWVXgRi4annYOuxW2uPYnBfPjnq8B6V5piEXhQe79hiOpQbsI9L/PHb5BWE2+WksLnmpi1bbeeSSKmkuubB/4JiDGdCMlxpIy9UcoMKiBxoPKbxCfH5Mqp4n93COX42lvUNAdFKMu9oMWEWzLBZ0qUMBKOfEqUc52UMBa5lSrfQY2MzN5W0UVxIlpYswGnjmT7+K7JKqf5a1xLSk3y1D0wKmw2mZp2cZaKDZN7ARTc1w8nCpnAzTOfM66vBB2mbZh1iquX57kvgqecquXXjDWlcnJ/2XEkfnfy+KKgHHMcTNpImphgZid1qYktNEkJ7eV3XWsv75Z863fXLRU273k/jaUT9MLPNUsciQdNBPo+SkjFsjJxlJNLjSsT0HXw/aVXBq4G0Prt66tlxji1IcuNL9kfgP3eZeCJb+K7Z/sgx7fffs+N+Ybul3wI2Dg4+U2GGfDaZCbIKX++b56bzMGP9NP87e6fDEy/jj5af899BJvhvqgC3Zf/sn6tfYwR76RVJMqs70Y/1jU93t/8KnEqinuhH0aT7/5rTbf76SOhWf/iK0t9M7QtvG8gev8x5L1Pev/dGtozWE7PM/eTX3xBwPk8b1wLlc45qi5x6xBjYILrMed3gqrstmB6UmLz9l75k3j+aT0Od3hOgLz0RqH78gzfqWiHQWS4g9ydyZhAZ90KGtOcIvXocQ5WO03X4ukB+Ua13dwQ7xuBeeFF6j0WNOyRz/jX9PmpdTR82j7XqDpv/GFYCav7PzI8PXgaGf1+bbXvit/412bwdw/7Bw2Wv3caAOQF/9ZRHsMXxq+L47tgj0/I17GIezyN5PHk94V07I8dQW2/gVMLmdQXRweXbUiup74+JOvMHKnxBW9isXoSW+EVRkalN7HYDzF562zfi/hHfbS8M59IwZejthZcExepvV5+u3HDIOEpM1ivLMAhhr9p0cE+moRi12cYQgkii6m3b8x3+KXn7mGr0ml5APEXnizg2UowWB28WAFeLczbBqOFeT+Yf2vgAyYrwKcF/Lda87VMXub7BT8W5nfB7D8QxptlYD1jChocRinMg+TIHHIe8gwls3tA8sS6tqxYNOTIKBH6aKUNYsBDcJhHO7BIYhzLHIgc1zyxEos2aCr5NnJEAWrR0CHjJRqRrD5uQ+QnOghCTsTc7glao9MeTYimALO7Ms9IYOly8p4MMkmjScBuQYMTTYIlD30tOTIWz0GnyEyBdWwwAABDCW0pGipyV4m1QawTtlEgNmKQNwgtcBpCpUPjFCAFZyOiUQGwYMgIOpYwxylBtMzUxaNoL3Q4i3BiAz1mK7OFF2xKvswvuW4dlCdEhOueIXt6wDyj5RmbIFyPzDWIqle0dKRCaBO/JrTFJ7QsSZPQdvxokG12l1gZaYKjHXjJni7NLbByyXoQ2szCAu3UH9Byjc+yy75AS2UzCPvAEbG05jNa7tiMwl6ZE2Sv7Nl3VJTXpF7YGz8a5Er9I1reUs6FfcGpBmnwA9ocOvU92jx16u/Q5rlTf4s2Q6f+Bm1eOvUd2rx26q/R5q1T/w9txk5djzbvnfortPnXqd+jzUenvkWbqVO+OP/ZQ5O7exX8mPDdiXBJkzsN8FYecL3rXwWzHLg/Ef4S3H0VmFng+6vARQ58/yq4sMD3J8KFBvdQBc5y4IerwJkFfngVnGloVAOqYVlPRgPZinHOz2RLPnp60kVk7PlgWcmoznLmGAMb+TFvczq2+pz91wyPSQqrv3ie07nWE88Tuf9H6jqcEuTxp0C38hFjMkznvMNHwglmERO8siiRNBKzqMMviOnZzu5hRCZj/7hB/neKy1+FJ9SPOSUipVcMP2ICAIuehjkFEaXjjMJIcX4+eJyieMxQJKHO51BEwnWdxCaOCreCQr3+MO1p0Y7MoNiZowKO56GCEGw33SB6gQwqDLLdhhsr4fqsJgw0K+7MB8L1QF/tyF077hQ04LemUukH2OfVHqnqfxZdUNJugh/v9AqOAesSMLDwNijEMR2ZsQp7tvdqDRsjWKFk0pCsUdVN8ZQXyNLyDjYeGq0sT6aW5b97BQUULUk5BOYCVglGBBaKITUKOKx0CjuQJJ9CaQWFupdgkJV0MlFH9CKsEgy14pEIDQNLcBj3sCUUjUcNSVjZbOn8vfrkeQhhL5BejCEKuYJDIY72GTdI1ZBmDD0jDipWmmfvIoxQ7q9viqul3MKXQERZeDskimUUdUDKsjD4kB+jE8C5r9kly4yeP3aIJxJkpv8sTRK6kUMZKtjn+IYItN5AkR0p3vSvHRMjKIhw1Cu4RxBCG0DrDUJYAhV+EypogWqpBRJGeF1BAmdTRQk+xpEQzbiWR3MHJ0XtSN0JwhYGTqEu0LyEhbofIahtPYrt+LPUdWalmn9X4KZTHOgGO4eJx3mEwlsorxEZs1Bg4Z9P5oPNWYjAFaoZVaHGiEi/3iRhOymbFc6b6YznY+MOUB5WSr2YNFKo6cHxGHubB5Ptavr2obUC+9WCwYtjKTFDGazQLNQJCfZWZmXbHRI9vPmk0M1+4r/Ghx8LKrt+4z/j+/hxjL0jOS7vhx8gTzg2KFpshVCxJQmnngFkbw+F12PQ/Py1ngxwBUevIJplV5LAwZDicMVQAWmmnx+RcWtxvNiBlyQhIVAizj/buh5YyRNgC1WelBRw3I7MDG6vqQQqYMgDzXXcdFZGGYYzjzuMUHA1Oz4ukkt4IRFnDYtXa+Kbzd0rpXonzmTymTHIbvRbi+C8VxhyCyPE8PprXZKS4vujRwR3Ezz8XCaS0FYARaTk9XjrllzPFz2eolAFXgbKUy5KW23r16ivJsKGBMykxxLiqrbegbfiq25MYgJpXsmo8gOATHPBoTH+WieCyIMiEY7vZ4NEmTt+fBdhhZxRZEgBhUzCXkimUO58JfL1vjV7RLBZ4szUySCz8noK7aykk19K922oaUiu5I/RTKY3AjZgLaxocU4dqxIzxB9iT6OgiB2E7MPCdp02VYdUyisY+vWF+3GC4ywafO+jAYerwJJZnEhSjhPRoBCL4SjLDQnYrhh2MAyoBbC9zKhrYmOlRjjwJINHaYHaghnlrIA6G8RVKSgU1CXVZijMhQdYqDe7vsk3/3DMBXWxBvgTS9ShlSsXrP8ZgeyXDQzYzo0myNDeaCVqLHXbVmwzu7RusmA67e29eU24ViPKvi3+0Pi0DNLJtCdc+4FU1q/wJ+JSnHJ6CAqzJuI3KP5rqLKJN9G09+enjr85nojsieCJC+x0pSUIAwi6lCp2j0TSiLXnCUE8OO/37u3GHBUihgQzdZy9hwUKOp8nUJHc+eBhBkd7WV2TsykULM32otIdPG8nRbOXO7f9agrF2RQReLAlK1OcqEl1Db8TnZFGjyaMK4/vhKNMdIDH+TkHjYateNh7hQhVpFhjvImGORsKVpmNiKqM4S5vOmoABU8CA1hPE3NlET1FAYV5EXwgbATD/jIpRiuWUh+NkIhrOhdhbGnoqq13NkpnIc+MRfC6CTZCiujM6+9BB08SeoLpQeEwbcdYMiIqhTGcj5AJs+bJt5YLrWWApcEsDSg6+4y1d5Vl+wOBUbarmvXLEWB2vfWSrjSn6U3UZxJ4IfNaerqFWbLf5RjsPomY5Pb3zYIO9LkWFzdmVKCaBkOCQs9kGJzFGLyCZnXa2KRWoJmbMNk3OprLRAahnPiHxaQpVre7v1DcEHmBNubkuzVHlgkoqvQkuwYl2sUddF45OGiBFJxw2a4LDUkOZhSxBvNIYloaDT3KIydIoCuxKIALGpkxwvnPHgrwhM4MV3AMHK48fmhQEP2/+9zFJiU3zPD8/Wqy15r//2szWwY9DXWSS71+vn/v1oArcyh7fTMYOfvWi1t60AAd0serKoj84+LTba+yvWhg3cjjlj08MR6kWwzuGDXhUfluK5FjJwOaTsNAeX+h4QGWQ/v4lXBMJq+vbzKZtz1EyspTEIEaGtiFYIFiVO/AIXpw6beNiFGCRbD7FM6BZtODwWrmOZmz1h2DQkfAmngCdXXey4TuhzKSPE7kY6x8lePeAM7vJYNAU2Im22oFDkuAIMPgN2HFwZnzvx2B08pctjLBucUnRHodr8TrQN/tgm24gAU8ATpzJLMTVxDLVSXctXUFpZM6BZz8YYxYRqSc+RJvR3mujj3Am+58RFezn8riLo+kjzB0StsERVmcvFdao8I82RFAkHoscOXMPpam3aBAC3sDzksHpvzOACSRWEtG9kdwp4yH/WIcnGptFQrcX0L0X2fADIURTsPQSnomIfpj3GLDspvzPBovexIQF22zkFelms7HSnb71ciulZsUUs81JKHLEnwuV7T2kVq7Kbt3squsmPgo2cHBbNanu8moRw0jRhb0tFl6VKMjbMbZfTcOW+Z3c2RdzvTj4wXYhA7WHT44MaavP4J3f84uyiX8A8ONQPE9VkZfl2oSadpWj+exa07XL1du/cCIa6OU4Yof5r2g1g3wLPSZwKB2WNcdPCvG3tiRb+1SnFkX0xRSew2jgtpQVLRFbBFfr+xC1bFr/L9FPwBElElLtisGZ+4OxPpKBrR+QhHCFG3oVnKbp3RwiDe1LsUwcVdlp5Awn0hxtvVVo47ZpsKwZKMzGkERr5RvQEGSOgkGNtz3VXiCn+k2XsW7EX2V+uZwubICvNPCEKxDg6KpeoL+muvWsXWdR7bng4IiZrFJw1iCAWU70HUHH2339/6bq0JV1zUSaDA3dWyUWIkCdpbPkHbVsQBDbUMng0MRG9F1jXZVCYjt9LrappVOzGhRYUCHtGHE/+jbYrtDkojzr0eBERKMnEJxOKubn2bkWgG0EBpi2BogtFEChk6txdG5CNwiNq2tzUekxfcsqNEdDumr+/pvdpzbzpg4Mv4V84RAv0zD10twqtotJKRHFPJ1SszS413VKyQSfQVlK4iilM13DTyr3Ix6k7OKgr7xzlHRYZGS95zW6FXqDsXQ2gsZNv4GAm3KizdILCSmgSrL5TBkiGvs9BWf15RXeNr9sdT8X1UYqvuBVMl3GoXDKIgPhj/vaJp8L6VMUfOb3QxAjoWsp7WiLDbU0toTrbrOnj4zqE1adSNDEYnTI+lev5vyA4q40GuHJByXWBxtuqxka7hDqvIVpFdqAzkEEXXphxvP+eKE8o+9wecyTxyCAr1+VPbmg/dX0n1NYFRm+zfX7dpMBqdQg0/uxGdZQZJwJAKn4TrjFDvvefPgZ8VAvh2pnVwzoZGq52A1pEVFqbhWBgszWbJWAuvLNkZlip2toeYI/uJBwRha8wSoDY3Zfh3UkR190UGz+KJaCmHIwkvuSVheBQvI4Ekx4ukJys9MERe+0Cl0qxg1WF/qhSGdEf/2dYWjaDg17brh8810VGGkNrRth5IiO+dHMamin0WVL0eGVOFnqSliaxpJfc9nD3xGAY1H3n85eBqvHCz70Lh3m10C88ZFPtcycmzhAaXXRfeYuj62/K2ytGw4zY7qgT3nAKXjcMUzRIlJvLMChQDcTNLRhmwtkrsp2thOU/b6YGg2qWCCo42Yhiu3K2H6TPwxyf2weVTbWBHoNVq5YjFya+mdJxsVwcWBJ4TOHPw3DN29AWcUlnJ8wLFgUGwJPaKJjzHtscFKooSh3ctwSNO7GcDpxz254LcYAxFIFSSwVU86cymWCrN8rINsc8KAa97SeT9XBrDi0V4d9NMkwQXKuDRqtBbxh/TEdhkLY9Um1o3pAAMvtg4QwHPV+QKw+33sIa8noCGx0ydjMOSHI+mjE8DuPjoB8AKMizhYsMFm4HGJAbQ2/kA5GLTBREGEnKKwI7Z6hnjCTiwgdv8jsYcH0gBFCTDWnkNlDClKEbwAjqqZ/IjmGSVd0A/cVH+3Bo/xNO+2wSvWyfl6mNPRc/A8lqIDPtBcQtYfx28ijs0rszgrJXQf9ysUsJQirwadiMXNP6VS87B4N6jw3m2Hepwo+hOeTXSGaVuJ3+KO2WCt6nBriLHJNr51/FhX65JxcEghTQc9JYlcGpDGXmkSB4s4wQVxyoy4AqNb5Vx1GH9QXUid98skSgbWRkNCop8WPziGLvmYxANl0XoAdn8LgTRTdaye0ei8YRj6cQ0niIOQRW/ax9oiza2EaixPsLveNefx+EAk2p0ELpAjZ+SBzldUkDcdiIGkGgQ2oDFjBG0UgZV9jEj+XH459zScrjzlQ+CMfmRHVN3tlFdnefw+FbwdR9vvxIpIlCUn06ieFwddwpAcgZ2RPkzzhiWsDpXuNZqMlF4j0L2lGYbHiHPoqW+QBveLp5BIBWr/DFY3T6CBoetiMe0OFSl6iAxuB0ETyLsM7xeAYYS4DhhM67BpOQO3aNb2cdgjyQpsNYyAVQygPYkNbAxR8vgtxz9HArcIBqaNuimVEAIpJ1MHn+L3lgOJSA629yml/3AnNvpi2igm7RaWwNESedTHqxXYM0PZdYkTkpYtjKvHCC6kQBSvRxDvQjRuYahZIU3RZw1OEboPp8CYNdL4MIavWhu+1MpqX5WVYLuNSxbxoW/ccPNmwwQ1E+sZoxRZnjSEKjPd1YuuK6me62ihbagPCYTXogw1qbfHIjiiMJ4Om/cJITdCLCVI9iLMUAiiSrVse8RFmHd6YW+BVI2R1GyOg2fBlT6qwzhHUxHB4VKPp5FP0DSi3kJbxkyeudPVmjiqlDRP2PG8FZ1dJqUkTnI6KQLer0bFtoH1LDj7zNwBxaHUIbIKnyZIpGcILDQ0ghvQNOEMxdZn9hzoj7D9dAjg+U5gxSyaRB7jszjbFGp8nT1tEnuzVrG2MHlV5H5pktCdsmJGVYHR7itmicKUyAOfuv/9ozU6IAx4XzSmkaLoK8HSjiGO007rbV1H54MX6wA7c6DLUSJOob4KlV8IGiO6d47IJiP5oxdV1kQHJlGJZd89OuujB5ZEs5ixe4LN0cKywRXr0c7W6MrKaBGbYvdzsBv4Votk6Zh4vKims2mqKdAghsWbHlZMZkC00dLiiqJb+jmU1DKSWYWjZiqgilh5fnBDvhwOfosLQL4C8glrAz85qMr+3vfnEKu4nScQLGcRDAggQ1CtNUHiXB42XBni2AXhnQ6ScCzxAQRJPXaTC+YR4YWz8A085Vl4N4FziFVZyohk44O1DQK3iiCBjORgC+0AfUTkR5KnwCDzlYJloakbXfjUjiKA1s6bCQGgiTIQAGA+k3Z3NpqHMzmVM2VRVTuns4AuPJN/hiPVlP0xBT+lXr1HKfuusjZAkX79uGE36u+Qb9rBsTeIiD7+23ujgkdGPpLPzvA0zg3scljRKhKIwtXkLVE6OCCMqc4s/SNw2fnp++1lyDG2vWxncKKbTUO2J4jwVuo79OZbrjES559jtr+dZz/k+HNG+S9HGMiFGJDmjaF/lYFIbhRvOS2THtHOAV06UFdA2Q0lDRr7+p4l9ZpEgwIdZz6Ds/divz+iKn7PfxT0ooEoHY3nTwh2jXk7Svq3VhDUA8YHyERGTk+/LVQSEa7WwO7pyvlFUkJyammCrA6OAD1NQefjOVwNK9ea+AZd3ERT6Z/zZ9sS/1j67bqvTtGgWef02+YyQY68CQUqFt0MLXcf29YEGWo11GYBXioRJgd3ybEGU0YTBbTXCmBwV2Ecd/9v4FbfZ1ZOhI2VhzWnKMk80NdzZkLJ2L/8YeQPPb3TN9Rr3UFnnA3Qf0in4+7DTZBvRMXLoZ+05skq1vtsTutV/ZiOq8nXaXYDoe1LmCKxo5bjZT8yjvml2+RQRglUPLXIpWOGZ4b6D5TwuvkBFmuH4RLI/dOYTylzklscVTatoOtZhShKTpwFt9PoTysnTWgN+owIjdHqJs+v85WzLR04qHlISq1HbGYv+ZDS2nA2iEzSSkb4YBPsTiynBYxFNjLu6xqhFmZ/SG0A+8y6wlcNLmo0faCWKo0kyXG699LGAckkJiIhG0LDtoF9f8C1CLXHI5fI7mIjp8Nac1gQXXklRGFWm9KA5STgKPRjAUnDA/wpS9+sEHIxmhBWRU0bDKSHJQTL/B/YQRNCGDEb4YSOy2fmFMh1mM0FDu2EvlyvOQGN4FWsvCzclUNacUfsaG3iOR5ZcvoRTWVLvAOoPsvpeCXoivcun5xGAZZ3ca4qCJYDw8+3ge9AOC4QDfUsykJzQhlbhJ65LRLCSONNn/oKn4CBeBq7pj42ly+weaeQd8ic+0jZAnh/hZzFxqsGxtGw01d9wxUZMa6ChHbDIbnGR+ZGtl5xgJyRBcUFy824OexyCuqTVNcvxhqFPrFMqT4Rj3D5xVdHykJv5kZ72D06gA/3QtPHW2tncJtGRSbQCFPOcK/hYtDh0XKZIHA/n89bjjutoqhK8sQ+TnZ2VJ5WbROH0IoWGEegUtaZilFI8TV9hzRTUTLzvA7aSr+0d2BrGEEvE5I0DLNklv8cT4UsHxa2zVuem/R0OigXYdc94eYlx7l2s3dcs2AXb1t/H3dzg+762rcUp0cmIhAyT0mzVdhdZoiQY2SW0mHHCFCwxdjgGbK1Xs6NbLQTyS1ClxhDsBmAavbXWTcYiEDLXh06P0BFbGAfdp6nnpqa5zrK4JRmszKNDc0Lidx2vsLobSDmM4nghR4iib+QJjNYcgR151Nkn8HAChGykLPmSfFI3CW1fFTmv/Md5ZEJ+OQNT5+W2QpMR0RwsNgKx5t3zb6OjAOXr3Tvo6WeWYO0KTBDUYJIEtE8yRlNgyJ0kiyp9FKbW4T6ESuAREQgeF85HUC3X/4BA7UBVlHsEtcfYYBUcsrj1U+tmE47rzi6SVH7NvDQrCl6Ft1WVbHTycy8OOb+/s+BVoLjQHCsbRSqoR/45XMyKXEauUuhT3hy+mbv+9FWcIlryxtWeXMt3anyl0FazaK0S4cUlk9gGfpTNveUo7/aPLZn07FQ0tSR30ES6heroykQVbR5cW/eLBOlwVn8ScBVpZRecTOIieGuVBzII5jWeL7GLdJU8Qmhz0BNfQk2JfBzboD3QSfWxtrZITa5Xb14dlfZYLeZWb2C9tGmMdhbdItpbSMvSBJnW4TqJsando+3GVyTNDbJCZe6wBZntcHrJYF+x4RoI+utnKI5ouIO6zABEz4HB4k040/61EzMGlNR5HUARPYcwVcEO4Kby0Mturi10bX4lwfTYqvFu8hwUZYdwAoENDnZkwXQczpCEPRl+sxiZEYrUU3mD4PKEfQPMF4jtguhnWg2N7M3vREMpb3TmDcNwF/spCmNkwdoMtumzFf400eknbVrNypUNCmJTn9Uwz005JBAfWewTAKmsII54j+4rS7TOjRLdB+J3zhGClwFMxEBn2E7OcWVkBKYQwU0Z+9GG0jDtmtfCXSDI/v3pMo5IiDliMkdumU4lcg9LG4xrrPywDMfT9oNVXyu8J21beXDgmhRdrmxgM530+SP98Hx2zUrbLv6JA/Y3XDwspW9lKfd0fo7vkg9yIVlaylDfZ7tOQArk4lDSZEWPYIienTesitjk9YW+2/7pfwO0ZpsZe7HVyaJbtsLkc5thyWgr7di9Do57f3CSeYri/QP5eWYSGx0wiQApUa2bVbN5SANgs87ulxdj2+uBUF02eEnkoPSXexb1KJnGjcxufMOJmSygw+2vFI9LKd26bmpnLfqKhEzmW3gvQV5s0CKJRVzPZ7OziDOUH/dZnOZjgK6nMb+6BqQl/LCNLbn3XV5oo/qatJuc2gWXQVZbPHTDK39O/2Tu+r8Y+FXnt9HIv5D6XdJ9RCzMFTVOC/f/LAWEjxliKShF7AaZ80eA/RyLjFaXJWenQsVsFVNymUu7HgaAGYFNDs7LoJ9j+H4IqfV+A3f4zr7eVtsI9e44SNz/2UuAOo/Dwq8N2tC+PnaQWMFZNNbOe0RFhZT9E7PxP/nIxymn8wfYw8u7dFh/7rmr+K4cQZmoPcp8zbrKc3ma8QvnoAPfXA6jBSLu7W7+tko6CXMF01wCXtNI8MqeKX99IaJXJblk8y5+ORgQiTPj8zpt9c4iu/fnyiUs8W6WLbMlPLy1seHZWcalWvMgqKm8jxiR4iQj/J96wm900N0mK4isQmBiqxK0i+EicmVyXeBqLhen6OWDgk7snjPicrgs9VM0lk+YlZnJlenullT0M2wpL4f4oCd2lhJSfi5aJ7fWlespBAyAOFqJtHsRqLxxtidSppDTSxG3h+hCJGbcJKovxEkUJlMrfTMx3I6ItbFRyJCRAJikqhPJZqsvNlcBJoZ+tdUEYuDb/dXRGiStMcR37zWQmgUW3q4O8h4UCcRSgWaTHxXyyr/+nk8IAbMqndmvOvMEiqtSXIrQ+/jIHRBsg2UmxRqSSMHahIch79ebnCKaP/NvsGLWDshJdVS/31E0LqZFI6TNSXRsPJJEGgbPeaOArI7KQcPmEnSY20v2xHBNau7T+Dqf8Hz17Nun4WcFd/HSySXk322+mm5nP1fX6PFmmUHi4kPzMJFAnMb5JdXUkW1M//0nB02zXVrwDHHaDteQ5qxobvLD8rdJYUve7WwwWRma9kUcfJLUmxaC1Kellm84oHGLXQ/J4HuTxCmD9TiTnckQCvuK2vcu5VAqwf5DTCNkttFTdHrD9q/TBwccRpuGSaH0aekcjXbmNebQ0X7ORtV2PiOubxvm8Axcguxj8xtsk0fXjSOdEkYc24W6srxKB0w414lof9uljdFP+G8pb/VSG2UbMZi0UNtkI/oBfCf33CZI3Q5si0PoLNm4n0N1+kNCMaJldaShC4xN34ijzt8lNaGu92OnljrAzcP+voUy2hPk/cHfR/x4QDlx7bhGHrX2FQbuNLQEmflKU7mmoYgOeADGikfI8CfNVanFLEbvd12Tm4ce62fzR0+I1ArXLBj0oXqJTmpZ7+YL3DwVZX7cM8d07SHXxpvBh45p0xWDnWKLylTV+PKg7HNGUL7H9/8Dbeib8N3e+DI0yR4qMZF2goVxA2effYF3ZtcnXo07ZMq8naKGt6O5l83MWUNAuCPS4yYi/HUmnxFqOEnRyBNEoYJmLaJqWYNLa7Zfd22qQg9ORpWCE8dsGQV6F0c4Evn5NR1GkJU3SfGsfwIh16zmyWOo4EcefENKxPlPnESjYkvhlXduZ+5lbBKEGQrURyQRX184+/H00iKTSzQ2zEYj1njjrrwvVTqGcc8koAxMeoa5ieV/xv6PwWw+0Ip/Skgi44yy2ieAYbNan8AjtM855DfC3LcarwYt47Tv9vX5MSDgTGSbfUvnw42PsY3zppePObR4vTwUkpiU3y/OndNiqxES0IiNqzRlz0/+HrWz3DWpLxHfj+PLfyYyY+1TWJDrWi1TyKuOdrxEdasF4CMOOeUT6ZKG2UXgI8RneXhSCEgw4jTKiTiRAbNwciOOQa5bNuxkmZVKBM2UlOYtYwGV1YzYoiwME5d04rKlbZQCC8I8TsKCUoZoxxBO2EBX3vIs9PJv0f502lkVo5TSmHhRgrGWUZW85flzkeyM3D4NSBKu1L/B9c+YlDTwEz44Z0RajBbCC2ykjYY+vD7s7w6j2GTpxsrK2v+t4C2YwdqP8hKH6K+K+IDsLt4n91OWiyM6WP4NVagjMWJy8ldRQRir7eilbHf51D4tTRCCO8x+cVJ5jFInfnommJXKhOBm9iQC6Cgxf0Rr6hslzBOu1Stefk5p+NfoP2pj1Mm4tOnLFA9EPWQVvdeoEZkiMXxtXMCL1wz96Oj8uAbKyjqDm0TYdyfINBk2uGjNErbBJltWxNc1pdifUa+6QUrF8s2psPVdBeR0jAujo2chlfkV1Wnu/C4lYnTHCS4fHlwiOu5t5FhDwaa3+f0jXE+86/vNTEx8moabRBg9+iePHVsQoF2MUkewHvGpHGl0ObEb8Xr/cffOlBuSWVsI36PO/L2p7UXMsO+yYuEGLtNvsZHBCJi8rFUnOsu8VOtI4yf0VCBlaJvh3Jmt+sZiXMsBtZqn/nVXQOeSxSnL14UZEw6WaYwK09HRCAGxiRFT0VOSiIV1Ka3PJtNgFGq8pn2DaQkBW48L4sO64jZ2dFmKTJKrsC54akWXjYzCwv2IsyPI8OWtsBqePmokHlxB6vjhUk6wu0yIziBQm7STsCGRmCZxry3dTY454g8MZ0sV90bLdY7FJsiLpA5Oc68wXI1GxFYDsh2o0RKDHFqjpAxOKuIoYJTaqA5aK+yReoCjRGRQfI6NzimWPCVShEeeaf0GnMrmWMcaZM1VsMPDmBZM4FVoio9KFqm9bymTWEQYS3UoAkPwBccVdnHGTbWGeMIqQcfL8ebcTSysG8nwreSGkSV6fFK16cs2KG7mcxnDCfRZ8dEiXaut09vFvvKxEc244/Nz5R4f1bl4GKjNu3vcg7eXAg+qWjNtNFJEjBsYiiJqe4tZoSwECSVce+B0QLz5r55HZT3oXpE5sV6igSI8DQuU5pfKx3eAEQefhn6hjyvxHVfwLQZtXkzrPhl4PCu06n0QIlwOAT+veaIVz8AG6qu35rvIlxBVP/8JJ6Dm/pj5a9Sa2J4lwk7DggJFMYA5fFd1iLj34ih9dA+oe0NfQApKC01EEGE7HwHtHwWtjOg48fd5WeyM4CmJQVi9Q4iXRoVFaEjNeGRy+xN/mZ2McquDoT5vOj1ZlZksU0MiGoiU5fm2uRHxsWvFxEqfYV1kjYeKbN+e7yOD3I/C8i3TTLICGYlm8Wmtnr7A1VKVLgortNVmfUoBbAuPj6y+PFv+Ia91l/eEK6F6FtmXoY19d70zyNCY5cDc5ZF16YrWVOk2Vx9xxkZllHUaRE59mYGW+JdjZo+UxlJTX0YVQ3nEaTr/AQ0bc5kGevF2IedXhTUXMOXl7dV0zsHCKC0PwFgxoy7AGVFDFSTBRtrGW6VVcuxLQ7c2KyjK1/zrVJ5bC729AHcCC+QcQwQHokO6h4ph/v9IsnvZz2VciBmu2mQ0vQ3UDxQvoK9pLa0Vqw/VQXeLehsVGkqo5nTfYwNG87EmRfM18vRjBUDzwEkn8tmnEdOiUmZ0PLokfCayO8jAJtfWk8V9+ZxcL7Zm0NQt/W3nNkwSKT6gdMzLecUQ1GCJklBNNpTNdm07eNK3NRmmZlVsml2awPQMZNha8uXTXpRGuJ7Oamun0L6UXPM0s/16UNV/4T5c9tuO0MtWQfUz6slufMPI6RR3c5SL34gnOhXGxlerpsUeoWUaNoB9TqF2IGm+kOISNrL9BgypdafHAOTzSjQB5l1Hp2rrkijfII7Zh/4M6MF2y5/i8kJijnzjycsbf8ESMU4Q2RjghWt1t7G9lh2wFTRQa50+ro0BhhwJo8qYIkb5DEDE/CMm4ANrpAXDqC75kAywucpPc5bskwJijFJpbuoZ42l+xjPHwQdUBwRLbHRzeRvDAkO8rA7IK+Da+QRHzCOAfa4Cai4WR4fgDVulRcq4C3opiFiJZXw8ttqHVdpSGOCJUSjoUPsGB5uSQK3NvT6mX17qFhVCV1gCW2TrWVZO1kuKu78UnxLCoeLEG4uA0UYF1u0SxCtshckkniSv8tb1P1HIBMCPkWumhQt86oExUWCFuZ1DNykYqQEmKkbFMlARxR04cs6+oB9qvkSllSznyaBlIr9FX1CvYSNjowBXZZlyspCd3EHX3y0/um0en8YJARekFxKft9NGjjf8fkFOy45wZUdVCyHVZ6gT7LdkrLy9ACVuW2xNpmy5Pw+0z2Ykjg60h1gKetjkTFDd62MYdZ5stM5c8vQYyfbBpj60wyZVQXXemtxxOt4vepA2A8gOddKTXwXXH5DkuW56E0ogYhbtPOAH5y3XQNcjj2GlMkm63CRw0UOZuA4OzT9Evtzvh5ckZcKI8Jtk3A/rfhh5Ma9lbgiJuIveJFvhKjPkIZsIsJ9PSQ6CNwawew8K1ZRKrc4ZLxqcIzKHDMCNGf11YFZ7M8jLWJ1cvoR7CBnjesDvow0TQeyZEyueSGWO6O+zbYG83GHD+Ji4BqtYr/maQ0b3g68hRtBoskSrTqW1NDAeooKAsy/Ifgz889/Pr9Wup6Jt6T93x3KR4/mOzl3yKtBYtTC3e2EDqzi6iWhlesfTx1Fdx+TOrPjcgpTm57p9hFFdLMA8hCpn5lcnsonweB9/aWTV+QxWB65Zg/0nBemW47P1FbTE6M/7k2iGAu2ofCIn4VBz3tEypdkpobc6iAfRrtZ3b+MrYs/hfC18QUwKNeJlMCRfEBDW14Z0X4tzevlHhtda9KFKp7i6hpsUpmsuy1TP6n1QndBSybX1GyTTYLWtOhvhQqInI0DpXQmfU3aOBmYP0HWtyER3BJgwCSlQqFWY6EUJmds9f4g4KV9kWQhom69YyFEW1+1BlSRbtU93jVr+nyFQTL3QDWP0U6FJ+PmzhERcDJe+8IBU0X1DK821NMSWdJ6+WAkFh54jNFrMr9JHco4JnkLuB7HkgbZcH8gBEvTnprkHSS35+761gHRFyTE/yz/Pdpe9O08dsBRvwKdef1msXoHaoLTO9AYJWzes5RwjCmUivNT1ivP9Eol+Yvp5ys939cZzERP+qnW/+mrNhEpxnVBec6l3VaF0xu74B6Wws8w+rVA2l2DU8DPzwOF35hJuL+8UXF0p37BzGzWBuQu0TYzjwGw2kGsqbUFdOfUIOjSeymFpQEzb6BUmrDAF219i5o6YDRogZuIG6HITTVqT+9d/rOk8l5x3gzOHOLp4SSqk1XNJpZ9a/WfYqNQ002vZHbYilDXFM+y+0P7vCx8emy+F7QSt2KOsrk+Mv3zl2QjwG9Qhzf/a2Jd6uNLY8LoVLIP10lDrEaZdNwDYJ4EmcJIESz5QUiDbNw6muhrCAN7btbNNXSNx3DOsIm9JoHAC4a4ThVkKPl4PIl9wVsnSXziOKRwhfjlT7WXTJk8iW7MA1ngYngoGQQ6IA1nWuCeTCpu9lPYkKQUPaw2SNJBU12oiBqh7+HyuMDOnjPuk9irCI/jzi3gvfIcBCtI32hwiCBioYQIqxmhUkMWEFbjCC5lnwlfKTlqbB7aVb6aWWWzgT//aPwfrOkk4JbvG57j1rAbvbU6HqZXplQKwh+MY4PJ2Bhozp5n4UhTxB3+BquMG63phCytjNClgp2oNaYL5CO8MWMZ2PtxjVk8P6d3vlFJiJjQq3mGGT08vyop4RAwV2l6OQwGq29UuBS6YEQ38lHUxQkUM7LQ8K2cTR9qggEFzQ/zjj0zRxjgMXjOMSRf2plshiJkj5jqRauFoNXl4E1NsQ7EOSyF8kXEyd39WVa05r4OS4R46c1zYJKz41PlQ7FMF19d4mCFyKaVBjgRy4sZNROuftBRNfO16IhCdd58d30EFSD83ZICX21d3y4GVD35LYjUYFIpFrrvNa0MZ9xVjAF3RojAqhsEJSf0LYn6Z1EYcDRhaBFI4Z9KjvHVL5Tb0VKFz0J4rfaR9QhJqijagMnZTY7rlj4UA7t8CpjDiN58w8Xm0EkFdKU7Du1MSziSRUGElGoQa5yOk4jKdNKZi2xe0lRc3QzOoQHmS49xdhL2PqwGuUweYbDi4awTxsnU0vTwK9UlitW2C9KJsts8L5Oq1KFVSlrGLBxLK64GD5PrUjNye3aeNxhOPaIGTX8H9ddcY9dg8HvnBiNBjSTrrs8jh6rHhFe8EEdxvrWEV9vAXaubC3VFqDO9ijGOtmliDVSVQcopYBtwnvRiopwcomuuaCtzspaJ3IwQwlqvXtG96UZHiotcFKQSDZPIXO+Gu9tR4YG6VY+080BgYTOMxEWNXbU7uDKbaQJGBFch1mC2vCYVR4MR11PATj2Ul5Q+27k6YFYp6Uqlo93m4GyTknEJcGQ4gOY9cAazbxDizJ7s+uYJXSQfwLRLzHgaqWwfRu3HXcIDHFXNQZGbslwRtiyizzUvHOHBdrfMYbCnMeE5GLDt71swxt0g810yRSrbbxDZJ4w6foj3AR8zxOtASAxqLonz2DcmMWwVTRBk3uetB5TdRanOENUDdb8piYQnezvXFFb924NiFWHumL8AXfI8vUScDpc8AYX8JE0WEzE9AWxz5XMGzMpzaXUt4Vq/e/OfaxuHqrtntk6veE0PgFDt1EuCFTNeYQjtUlwAmGSneoQ/OxIti0V+RaXVGRFtU4bn+zO5Hep4guN5SbBkRfyx+oaueej/GN875eyYsQBWm0wmwVHek8RYO3MJlb6Al8TTgIq5W6svXBrTakcUNw5226qbkQjJlLZ79IQheGJmhU9FFHB01SEZ4THAuGMcTRW5MogwtS9OvgkSLRoyYqXUQZ+fVuXdjOhI9NJGg278gDBL+GZGj7fWp1l96Qc8rPCUAVH5FLDmbam3WKs7smWJrNfZd7vqg5EZl4tI0k+1sPyPWex/fYczSX2iC4cVwzRmRYQ7Uxv5OacgzDTpZ5VjCRlXoRzz/A4W4wpUY+Z36Eku4H1Sk6Jh+nBDbeZ5tA3hT3G5uwPBf9KL80yfZoUU1h+zx3g4rhcRttcEBh+Wr0DvXF7O5Gshh/xEwxfYcMaqA63bI3EnjU71DhxwvoUu61M6e9dSQoG9z3fct1tH6h9Mw7iyL/e9byWyJ9DB/QdkOKkO95EXvB8E++wHcCCK5cyqcw8X4j5Z/OUkCNQD98UdER1qBh7J1il7SvBNAr/kto9n1ReRMEx4C7ZkDLXhFZ4wdy/31BpkIWGgeERqtK7iAWW1ZYqU+FjOMhEGZ7mn8LvwDpZ01elgDUxAQYsKpSMB1JXlytlRYbqnGw1HR/hRWlr8F8yKvyqUdRUNG8IQXrDgPtvwq9CgEeuhD/AoDbjzeSaTGWRUb9fQ5Hz6il915dfaBnsJ3WB+6rBcYWSxwzN/kzuDe0S4yEHabizq2BK3eANyqC5BqESs58DOUKyvNUJrwFG/wTgfSo4Z4JK097Gx+HQhBw5be6QS/FOTx/t21U3WylHzZlJLEpKSgEQFYSih22DykCXo+IqwNyTY6R3fl+RL69j9AVxETZdaPsCBHaXlURLCWyeI22QWXEL3jsuJuB5lAJt+FpvRGmN2qXhsr6LGYN5DmbQAW+iT573O9LfH12AGob3AyKGUOHqES8q0ZL3pDRWyFt55SYjQcJzL5H/EITn68lpArjXi2JUa/Z7lw2Y8KFavlfQTydhxjL73SQS5pJ+Q6ZEFCOnMmBWG+BcVKuw6dP2lXdS6BJvBYNAR6WsDSVQYzMF3p9iUGuPB+7K39QfDKl7vpRAhQJibV95xy0WAP4+Etq1R+5qMONjLpuEvcOoVwn2+3tLZBJPAqRk7qapbJ7i1cWKZRI6v3eihbdYJ97cYRcRwqEieXH0YLonIt4oIC0WfF8qFznqnmy8I5WUPte949r3IK6TDFaN1zrI8KdvqvxmZdShe1ID23BSdvSwnB9CODdrzJm7Apkb5H0a3hvIo+R7vpthgLoGvyH4Ya6muWrb3OvH/I8Cr/nQ1s+qe1ZJZXvO6lfTqTCtXE3/TOmhgh5Y4bJUisijuf6r0Qhm22b9hGwx4akCKaxI80dC1C0ImU6Pxn/UFxFOCdOG7mwktitJjJC+y9znb+KUI7SrvfxcT+k//hxNZPHVraA4Y8XSEdajeb0wiXNd87/X4Z6OsBGEcNh3uX8dArTHmO5nP0v1Vu5hwLPm2OAtWPuwrRgPybEhy4F/X0TRj5rjCAPJEevIFDaU9PXZ7Qw6reep7F+iqPlndtYfMVdzuowZDiblZk4BMWBxi2gdm09RVRabPV9zkoIPRd1h40yiuBRGshj/fc0QjPAHfVlzVkD3/QhfSjA0Sn0x5rsUJxQOThMMAo8PLDu5ioYzIf/8Klsk9hnycBBisD0G66Z0SsTC8aLS8wjx6vmKTvlFbFZJYXzg/ZL/k4QYJpGFaqFmiAHkV4gLXCuIEh+KhQNrILN08CIh5teoyaSqLiRKIXXrTgt0NSULT84H59AFQ2NhamWl87ye3BHELJ6CST5glT0uy4bQKa4vLwdebgOfl/y5usAvREyPdoeqrKREDIxCotWEIBYlt3Ns8JiRogWlFiWeo8R5aUOTB7FamqYgpwdE7ITo8zmwiQf+v+TLQSZAAunxWJYB0Eu52eeykV4ED2d9VQDVB0RQTtY66ySe+iyQoSGmJikzD0MRMJQ6rGC9H2HQWbmaU5ItBz3RkI4FMsKhqnl/QeslKKhyJGze9t3uZfoXxWixk+dmli1PnB5ixPNKOCFjhdzPyN6IQiOtJABb+/NQTTLSXLekcK6DbllTelJyMwC8vTTIbpFdRJv6F1kQM0v3jKe+wjQz6G1cK/niBesq1sk9iUTPhuLOL86M3afFjiXehR8NOy7/z4gM6BNMIdsNJ6Q334A7/MNTrD+PuIqO6+R1VTnO8bo7zPCTmR6Lh7TWEedeNya2Sr1wU0JvRDPBNQZv3Za8TDz+lf8HfWt4k0ST095l7zXjdsMHHbbTdpyarqszYwELT83beJj3pnOTM9+pa9jUt9N6yMn7we1FeO1jZ4HtZhLpBojpBYXofImPfNaEbeQenHTVElDcdUbGmnspYG1yXsX2k2fuyMeKPhPkKgonYdl6Wk4KQG2zwQ7qR1mK7tXS1FqNPaBFuW5VSDkb0QDiK6LEeSWhHdCclfpViisgyMwHt5Hozz2ekuYTnw3XLjGO3MWlL9LZM1D6fHFWrai2zMVIFumYULezeXCwaYbHP97JAuMIhS4iirpYMPELx061ArfLOb8xFaoj2AzopK1pfNKkLBpV+BEQfbBAY+ZkhNjEw5lL8EXNF7efzwYcn5Ul62yZnJq+TdzeZ8CRxoiBWqJVRVAWqed/F8kGloRwPer6oferLr1rJC4/ZCz1R4tx6YBSsYLJocslflBAGupD0IE540nOQpTKKxCxlMrLFcavJWqsxvHnWO0IDaPCC0CVJmclKsqhKA07svNcgcdw9lYuQOn28UTzb4DD+aGVDFgPXOAFDXeAIQsMCgHURqj1xmAG+Nx3dHdaAuqT+Wp4+3/9cVBZDNo5/Li/5v082G6W3OTKnDhlUPfwOvB7hOHxfIkStqUwQpWwahSUDV31Rk6q1f4IiSeZBqGz83D7xRTjKpo5JsyWYt2VmCU/xrJWp+un7YrVj4OZQxRI2YhkFlGlnzQ2TFCr0Cj05/pmTWtx5RaSKpq7PMIqLNsZEAy+Fek3CYqZOpFLcaLMKpLhCVnyp1yIOErQ8S1cMXY2Ogz/wnLLtuNAYX8AouNZwJV2kVWs53AyCi6aK5nibe4bIKK0BYhkH58nXCRFQrh8JLdTSsnIBiYGnR5Do9DRcerEkC4jNEdpu0T2a0bgvgXSmFWybNiS1vsEBOw3GGCbe/Qh0bOLmEBX/Y15Bbf89sAnvzB+CYmngZIu2G0+1E9HoWT0PH7/Lp1UF6zxs0Y47YZ/hXcPt9Pq438mkUDnM5m7x+kOuVZuOmscwETDnt5D09hfXw6eiL1x18zkwXzg15f8IAeBdKW1hzYtTzk5xAwlLyvNZZ+hE81PrKoTVfhlE9ccEadavhxm5YTOW1/fZLmzqaVWRBo0jS8KsYkvpy6Z0SMyBL+rNEndK0kUbJKTCiTxX7CurR76LhtfNhx+24d6dxK10NEi8H8vfMMkFVPVRTE3AQqHYzHJUOortvUhPINL4BNwuv50C7D/TxOGTCcMins6xk4f9pWxd93okik30w6dy/lPukK4MPrLgiNZDw1UoQvaf3R1XUXmQYCLpdTFX57vdbU/ShIdaifixGxindSUJshDYLeG50Gbl7wJRqKJDFDR0qcyW3onyFFBzE9CO0aWS+VWssyi8WOpEqGai9SVKnwGtKRRgSYA79ds/m6Tk4GPdU+85NikXyvtsbVPMF337gMBqsesoo1qwxR3wOX2ro8x/72Ylc9mMypSHFHCxRl19rLJKThC5pvR01OKuWaPMgZ+P5PEvOuK8scdbn4WnLyH/eErcWIDZ7qBsyE8Sx7TalgPc1US0xR244COVk6BYgLzJ3fthzIS413od08OfvlEU60T46+pORBqkEDsTdjSWhv5ZMvD8mFBQWcZSjrByMUsH0yVHIyHspK6ZrVoRjx3UQpMsWqH5cjkrWyw9PVXS2RlK+TYy8TwF11nKJslU1I+UJoOXmy7JZgbxOUqxBpsvmUh4PRTwdC3kGBAvtLG3HSC0LdBW3caw1u5OBn5by7hiJc76zey2lgsvCj2m+RT6uMSHj1cAZUSPgir7ovhxoejUkxCQnGwvvosDXcpKCKh66HG2wTiJxCcQgvThufFmG9yOPZKBeXPHoB6bBGjMNVBPR1D1OVaWj0SeW8fGylCOU24S26Fi+mrXKOAyEnYL21XxfrE9IuQ6yhCVz3rlb3cYf5IYUtJ/SMe2ba2Awl+DC32qtNVMyjkKvvOVurYwH1yRLvTb4joyMoIXe++wOq8jPK+t9ize2qUQqxxGqEii9JXP5y9cBtML9Vbt39R536Y2/N0rI6aeixsWD6YXAsigQID5kczfINmLLMcZmkSShhaz7rCDMY1XwZVsNZsL+Q9FxbhvKc4LnXJQcPvkBlbChVAYSlGTLItUhH7MQXKTaxy0B7RlRP2K6jVbosuQz9LhiXmrgwbbgDBELP32aDb0ppH0nsVLf1KoyBRPjr25GgSGjtCW7ezlevkCFFlyyM7FEuk5PC+B6GlEKnIVMkItdFaC4JzHQbdOwxdVuE8BC3JF9NHWTBBe9z/PXlLG3GdYB60GJQAJk1I7i4MNNxP4eCKP8A27xnoLFDs4teyJhKdLkOEv0Bhg+WFhHiCH0i3PXpkrf6HPVh+ZMFAbvrsm1+ZhJbrkQMa7RWrF4uHIBR0XzkTErIlJfu1TmtiSoeyJeKYwRyqNi3k6cvRekn6B3cxmeWD/py2R56jQrWbMHRq/N7N76BnMIpAZSjjmjaHLN2HAkEanVNjaPfd2TP4aL5MLuONysd4wkuBC5UodS1MIrW432zf9cWOGFsEfC7GyMSYun9PD54v2fBcqULT91hDfVbzWrQ0nu0fsGzBj9V0Tx0Zo5e82QiSs7BoJ7Af6YtT02ZBgHxGyltAzGZoA42sM9xzjfX/Tk7W9E0V8yyd01sYdY+3YPHkwgEQZkO0JotusiPzNxBxWYxZHPOkSBofKnQ6AA0dCMkOb8xlzVb5czM17L+6w4u7O3KbdJC5KfwipDE78pXiSBGkJoO0Ugud6jGI2CtWhXmP5LtxGwqQASSTGd3oVu/x++NnopSy39vxgFgWkfiU9SEHI8qmtlMiRWSFGkPPc5hLDFBkgvUxX+jAAdrbjo1whDS9IEiL/BJzNFOrALTZb06UK0VL1BV9RGqqp0pvfEwMl4rVh2fTFbE9wmGeT7smr04PN3U7g5lHxlnnSiXqNfU7J/Y7QTBEFRAftWMPZN2ZgiRZXUGop6FF5gt6p4CnO7NxqwOR+A5ZA7R69SvTgvqKJwtc39UU8NjzypE87V2ZzmqpWsDOkkQgOofK0aqxebqS8xe1UVocbRQFpFDU5jA6Yf7fjiMyI66BxQJu8PeAnaTIihb3iG1+FiFIHfFK/2I5Ie6h3l0dd4GshsDyUd+ElSYbkqvhW7B0HygKaoIsB0jw5BFVZJFU+oGGI5rgY+/OwZlsKWT5eYXnGmDRARZC4A1YLRSm3TeGxFimoQOBo28S84Ev3RiO3Zc3Yylz3H47ubMQgMt7GVvafs3LkLD28CKx4NtpkCh48AqfapTJWE3uxhc7bnr+Frigw6lgnPbiAuUC90Ia+2/Mtw4mdPX0Vz+oBW6ji4EARXLVhm4zkvxusCIP0LrxXO/TOLVPIcXnqOxmg+R0XXzDuFh+bR6bIy0Khl+i5gk86TS4k9jRlCnL734mt5f7lOrQwgSbc5v2fb0l+yh2+5NStR/uG1c2TQ6VM79yuGHJKu/bkFy3UDLZ0BFzmXAIIY1LwFTZB5V7QMUMC5K34C/wO28IIElUu17APsJCoxbWXeGoh+Tk8AXO3FIOELA5IkPpWUgfdVSiMbs1yLUgMpgeBrUN0SjGJLWyfl4IFfZoPPc1rQ7WUPIL0xLnZvgzxt76i8rK69LrF8oH3jDtE4MCSORz74i6k9CKAifgXcl9sESNZgoyNk8QM46QL2iOC2yLQLyNCAy/nNlZPRZ94UhbOXBZ+bhSaalJDDQUlJ+4u7EppNuE1qTCeiJfua1uG3Nr+5603Yefv1ncy+6NHy+St8M5k/txYHaaHb3pEsWoLPTySAA8o8f4Gha1vYXPC372rh0oCbmFUnEnCaTzSXC7Iw2fVXDcUQ0MRaEQibFLBQpBWSJpAjGRPEjpU+glpiySeP9hhx4i0qKqcnOgxUaech1VtZcQ2UABDsxHZtOtu9LRjHinAvQisk7oUUQ2plDmfMVmdPj6wYxGORESlMbDBnj7Hnlbuhs3si08CUCMQUuV7Nx6RspVhqBTV9EBlQ+2dWKjq08tW0nfkKehC8NCr5b0qOY2mB3F6CrWufSOLkVjzJ67xgeogWc+MphIGlCSIqqo3wl9mn24uIkn896Jrx37vfosKcvyQrKRNJronLHd+wgj69A5at+YIyBZUscDD4z4kjrtIUpp3hyKlne6aZ/+zXYIIDAjyBAFWXho3GVC24KW9LQCXJwEHApZT/oW2GTTRnYuRAlCiEkM67Cbc/XChpp960iKoteOpdY8H+YSp6+2NCW9oEi95QVUhyaIvlAFLoJGSjeRBRZIVMJoM7VXJMYfoVOh1Ef+FnjkMs8Bo/IOvFVLz3YV43QhxUMxrr0o01m2tKQmBBmM7twgwjzXxpCEqzMo7KUMW3C52ZrfQ5SQCDConZ0DNBqJQaV7L5Xg/sWo7EeQ6Anq8lx/g0uMZadUxk22DHanvIOIbMWeFtJBGA29hr479os4CEzSdP3L5ZnqUdGmIKSSBy5A4WL8+knLYllkGGu6Ky1sLtk3BKu8FJTRzKQwVD1tC5E6/C4bp8BZwCu/SytGVdEDU1iLYHyhwFtcVUINWZkSmvhrYXhYrEcVNVxMvxzLM6hLLW2mCP/3c5ECTwyloh2UzWRksyD24JAEiiVLWJHxZdN7WGjmUquJ+4FE4z8B8zA6X59IcygNgRkSIFlTkyYeHXI3ZRXaB7DhB6yaGBbZkhtpPYHwVU/yUUrKilxTIUogaBPYyZz1MP5zFEOVa0cEQy4vU7JTKAX5GLDHfleTshye2qbfN9s3G3Acbv4jRPurjtkiNYIcCtmvMFyaKL+8LUUmoVW7SjavuPnQvcjic2qGmuf49X7NWanKepaLIfEJKDyISlCTTG+3cCqZfx4UvZUTtgZb1cDxp2hpKbNGqlyy2EuAaVhUsoqYZB7RPQy4AHVNPUBNPg87E2AJ7una7MSBqdx4CI6Y8AWNzWbjjd3A+U8oCiJSnF3K/6fEJXBvYqjKLLfeIAZBlPQ19NJNRI8isOCXY2r4gGxr2Fkx1s4x0TOb/xuzVxgAUppQksS0JOyEUcDJILUUrgaoRwoSNadMJnrBrSTwGk5RtYx8T47ywUwqfuLBZ30LPhsK8LwSHYrF6pqP0OV8mdBpFoOalgCYA6msvkzb1ambifPNehiZ1Xk4NIqa9GKPzWOEBUXoZSfwphpd3IyUVoZ4Bo71BKKHypZr576skkV9DlHitI4XlGHHjanP9ACRaTrY8rQHiSxm6kx+AbdJt4S0gh2u3Fs9H7MU7STuCtrvU1dw+z0TFmRlGTQK1wQGdAvZ5YCUPjv6kJdakW8BeL2Nrb4uH2BICY9sO3SlGxh0wTCXU4Ckd6Bd40l1H76+EeE+HbFmTuleLokvteIHWfU5mS6pjQ4LiXF7rl7oeH42hstypA9IRPJVZaSuQU9sC9xfy15GhAbMC2kqH0Bpym4Q6EwsFuf5kJC1NAMqigEE20rOUDmObhkkhS1j/YmX1f85gaPknfLDeWzRVjnKw96I+CeBVDCNjX+r3WvDVY5ZLSEUoL6zykkaiGDf/PgW1xicWUvRei3751rzzz71RGwlgLc2Ss+u+NYZa8UBSHAtMtKW5RvEfIRs1hij+I2/JHDoXEJ5wjZyF36MV0mhPqpTrGLnclKWtVCXZ+tbxcxLS6Uc8VJ5zK0SgM6c8gZ4pP2idGs5B5hkOt8xBQe3Cd2hOE0TNt3D/rrTyaV83x4bcJjNWfIua3u7VEUGy6WejRZpOQCX9blrTHeic+sIyWvzLJR/EN03s7/fix8cbR/joZLQtaNr90MXjRApO5xTPe/bl4Ll+YAmkagPpC7Yw8AS/sgLalXSE7gjYfdEZI1+VsX+CWwYIvpMYxjZZdMvKaKVsMWoE2Dw0KUXVc0wMKYerRZ3XT+YaGhn39PNY/AWgEQ+OE71jZozYmF9K8UKW5ZtJ30tDYSjZLoDskFJ+Ao6enefB0CdlzVmyPUDqkQPxCSakt0rvurHFWGoq8rr+/dgrQKnk+Pa4T4xs/uC1M5/QcSKwNUGLT7Srj05m6ld/pyPym8mCmEofo0mTRgT+bY2DlqYuyFH1Y2U/vaZoRsOc7P0NHEuIUtVEsbHADuoSYIrHd0WOMOxuqGjMong7sU+ddzdnFUY0D60TN52YLqkIoYxzaPnQQCqRF3P+k4zs8oNHgkp1Ghb0d05KsJKl4gltXWJOd1spLpScxQzwzvJ1jKiDGcbk21u3Y7+EBOTMWfDkyby4NF5scceGxPUo2TYOHvLd9DvBSLId6V2VFtlbYzppUGwyexDKAsyBEQYzb7v1rVCswk4x2XNuQFlWSuFGEkuC4bwiZyjHc+GeTR1ImK7mcWa2j+ribV8fQdhgEzd8r40JQ3etta4++DXUZK7Ysd4GQ3I+s3i/P1XFSEqHKoykEOf9HKRFDudeI6E/vOnJxtTPPTti0SOd84mK0drovF2yNQUbwOvtEqHJ9+GgiKtDJNJR9hPDrxK636i6PZxgW2tioMpteWBHiCaxRRDA6scDRf6NBi49W0Xal8hRut6jffRYK3AHXLv1zrZ7tS5SX9oY2r3uWIokZ6brOEVpCeGhGbOHZz2HBNzuaJxmN0RmbBUeMsw3pqrCsH4bEu4Ui/sJsA0cEap4IG8gw4qTAVHOaBT/EoSfBnBOeBDWWCbB7Fv7AgroewTC9Tz26DSTElvZJkvMMHKMf4HUYQm7gzqz5GzQTntlZidRVB2U9blG3ZS9IHGmdX5LRuiEGFywPs2vQc4Z7q2niXbYDHUsvDai1a5Z1tiedvF4fjuTSwWBTR1oDVrXmGaCEZajJOp96yAvjcdnNGsxaNiaKTSu5tXdRNxMMu20IIkv0XCGeKi8jFnuWIaTZH2aQM56pF3jjiI8gdmF4MjErlcqdHZ7YUFcvXTgUGxB8inID9/71ZgW9s9LXO4k6VdSRN4fLiusEOx3Nlu5OfSwAslr+cjwRY9b1ePDZmte9H/OCU5ihiIuzRr6wtzM4rsEf9ZkZMjN5+QERLq6ZTLmz5jwnVGnBCPEU+UN4YPCJSQ4ArxwT8N0WTmg9YKwkEkJDOkmNYlHHp9LwOvQGOhXxpBC3BNpCy+7Mh7UhD5fkN9D8wCzyERu50RFs5hormmz9wVB9JEUSiYPLCmLUZEQ0urMaEbbHX2ziGz3bc5t5XcExDG5ZBMNc2Jdfj8oHkjl7q5fXo73TGqOdMCSgT4U8VOW4j0869oBJQ4l6ewhlhP9SGsGgmNahsYiWUXjA9ITVgckAk94+ifF+jJ/LOoyfwqz3xSGy4e2n50SFUXr8PT2NJcSWQY8IoBlHIK89uSbhFvEukA8lM32JA8jMtro9qA4yZK7wwd+FhEFZL13JG923ZIviXaA3jk/kDph6HCxHgx03KD4C3j8Q/84GEc6yENvnn8gSJ5qwRilwKQsd5XLViqtonkjbp5fkEhDq0IPvRmmGncgQnRYouHciQKu3Av4p3DBM5Puw9ovnoV3sAv5nXI3KkR5Ic0DGrofeJhI6OVmS+kvrAOUJn3GCZ/UmWyx+NfaZ5GQYw+LqWWxlUH1FAgi+aDzWzBKd+u5jw8Co0WgNzExnGbXJKmMUBHVGjMcdvI1DVsgDDwzSjP5itgHIfr1Dmy50HvyPRnURXOZ+7bdBn6EE6EhFFTpEHVDxWW2C4uDiFSdbW6L4AoGMKjGSIPLgV+0solX7wFSxgngzE2oyuruS+oKhUR14IABGTCwGqzEB3pREKICknx1ICiE3GAFcOtb9ICTyWFR7X07D7rPJzzL8ZVgKbW7pPql+0H26I3Jowa9swEXRTmyQHkMcO4Klnp0i2zTa2U5EubhMBJTtmVvQBSoST52n5GQteHds2ie5/lJj1O8A9E4++aiU/0e3pIEtXPe8JobEaNN/wN5RhkwnjZBCT33hqztMJ0h5kU4gZLQi38QCdNtstIPRbXkvCfInzggcwGEfcV3J+EcHtFItgq8MYkbrrA6G6yJA9xenC+t+7U2M41w8XxJs/5RAnT4WIVCGJ+c4jlwI4CEurvHRT687pxB4qU1psAeXaY/Myapn8DccU1u3et85mzRM/tSpIbwu6qWpKU0HrSrqV96HZFEaSsWtCIFfwLvDcvnmMyiAO7kbp2fjjPPFpUpUfqqLZw/Hcb6UIPJMpwiJRa1MLL1NMvaXFitDboPbaDXhSdq1CTqmH02pJdE1Vtn533nNNi0TvnL58BXRN/AG/K4FAPvWEgyvxfEWt8MzNLjVu/w09vo7fs+PnhYAf2YrzpcH4+/qg4TvorLXuDT0Tr3mmbHO9DpAYLWK7iLJZBIthp+0uxdqnz83bqR8HlMJo7NHX6Oc9lBmR2gZQJ3CIydnxIffh0O3jnm5/5MFVi9sve5a920IjLeuZPSt6tmmFhF7P0g5NRiLUoJZSOtjqLETNRPZjSDG6JXNLXusqoxZnReV4NSu+u+tmA+z5XIsvzFN5LErtJhLGS1sUpuVAzbOokGTumjVA1FHFRz442Ofgo9obfeSu2RHAOJu0vswtyhK7gnPH4KB+W0as2hu1aVjUHm0XTtc1cFEneKvd9pJO3O98mBAOe+hoBJwNU+tnHEFDIopijPwbBK+QtIgedBqSga+DSoJlJRLFwmN9y4cb1vfB2/wrTuPUrlj61hBW7slY89LVq3pjuvtezyNLY2oUCy6JBOj+yMYsJPqlDn4dbWix+dKqhjH/TX703Uo3sicjTd41E50yKLVIQIvXzt8TMNHce5jDtjBPm3aznOIirmNyeyvhaHH+4oyGdM4Uizb21VCVIR15jmQmw/ZOHLZ3UHLZhZjYkFRcJyAA99B/lzD+TRF/R7NOTZ41vrk/1Cx3+Ck7mLK0SNsAfzUlNyBl6+4u61UmjmTPSymKXIYXUiHHrBdGB+hPwUFauOjsn2Gon828SO4u6wq5PrfaslpC+wCzp0u8D77A+l+fX0+3CyXX3ePguz6gmrOIZNltaj6lsGfypfdnyfJ8nJ5ObmbHmZO6gR8cvrc9k/nOFxxVOi3PSB5UesUMyX8bxr28b6PNvk+u4/IVUXCD9qD//zv829H8JVq1MW13XTOxd8P1V8S155L3upRz7MWoP3xZivH3S6U6vYREuQZOzFomKHqSE3iI499ovvJ3GRb7fbEZdwIW8mJrfcGCOnhTsjydd4ybBbQMS73aysff6Sd75CgNSfuTyMnC1XqJ0mWM7pylXYTjidOx7crjtrnfJqgnjG20Wf1JHKStlsMrG25waRSNQzaz7wwvyMNnBaHvFOcoLpYqcrDviuxfeVnqBxxVgRL2qGK4YCfkZzmrFk5oU9E65RVISodK2Yev20+GlARhKFCmswz1zBrUtIBSevs8VA7+QnWXHFgICBE+PLXJDO9E2XB9S2EuEKnUmTlYf2S2EzXyuSoy92BCy5AqlQHVWgu0eoKtCp8HHsR6rerdUYnGBJzXNbw2IwQRbDwg716FytsdtdEn8V1Fgz9oozjy3lkmdGEmgB1uJHQ6+iBfBB3ihQL89xR/RQQO2oQ+0gX/RiNn39ciyb6t8tmGexNnnRizTE2LtgcfCRtIGA+qE3Z1MUBRrxtrOr2OcVeOnM3zwX3nrp3MiI0VEXE87eyT6STj1NQsx5G2/wiCOApGM9UUHE8u4z9gfUWKlsvjVULgR9sxXhJSlsEGDytjsbzptKycbEkM6v7xA9kcCHHb+6N4V6NTqtIqW0aTvndlVyDDha2wzlyEx0kMQtiasC0W93SCskVZ8Ze79MzPfTm54cix8SRbOz/4xDUwZCuPbVkUsn7m16iUtMFCawZG6QeGbzuzfNnbh46WLUu/KLv2Dzdwhg5imxOkjSnnuPmTkmq1Baf7HpRPuwIIUAA4xDenL/7qozK3Dhrk83LbcHLgr0SiJ36Bxs3PURnEg6O2xQ0lMkSTjsE8tWI+65CYzk0HYGxbM0VkHJP6zQ5SkCNaNf1SmewPvY+oTOfhYAF//1O9vLErYElJkWL2RqforZS5m9yqRtTzfw6BpP6XgB20939q3BYOoXABwz6XEx3c7yDPA2jvtZB1zWIHF2zQ/StVisVMS1QFFIJXAX9AVtvFmBEW5YhfZ2Zq0TEvWHZwZsbLNSGMc5sFRR+w0rpzFXGdavxlKs+758oYJ4o5Kjh8xDyzN4nT1ylhuW/DyOEQv40TOfK9VD5orhoTgpcnBHMbta/mhCb6RxhJaS9HCxSFXaYVMdLCW4R0ICK9+Z3+HWq2Y5zy44cKmdbGsIPc+RVyFIT/IHgVOoOQ+tDurWHqQsdAtuKugOC1tQV5tQuBHDWMgpj5rSo9QAEDxFbdpnaKdq22CIDhfOc3jtmUdVoJVhORH6o5WsPrIFqh2NAVgJONERksC5xxKYB6dxaEPMbO3Q3H8NxZhIT3tIIAvXg7FWpkzQgO1jGCn7Dcs+pRMhbWuh3pJIjpafM/Gxuz+WNuZB+rXAajq3gKNs5YeyuxczkJIQFwlCO9xr8oRmeswkY7ZQ+t0VZRPAu8T7XoRS7dUlWj5xj4+I6QniI0nkQWpzwyEox5lKAkU8c7zaTtG5W0dHgxDRIi6zLB96kjnoLFjQk5RhK7Pk95uyPv5Yns2KfAEMLjwU4/4GE5ngnamFSFbWt9tZwJKhX3kIjqWUEXPVS3mz7ZurWNo/fIXkpkvbMCE9J6YbASJ+h5N3r3reA76POJCu6MmR0uMPicF7f200SxAqaeCja+5A+UrHLt8EiRHLrWHnx6HV9ejaSkYc9apjmvLY6qkmwV618bl/PCf2MWCOj/yjNA8qwJ6PAUvmswNvKD8ho5wvxFCcYKeGBGdKnGl7w3ZDa7YtehC5dnihze3512In5UQnFnmUqaXtBfn0N8h2GMjIe9fq2xreUaN6AUmhBawoBZCcgvlef1FHnbzH9VZ1qMPTqrUl04vAk/sAHCzf+bs/FR7eqjus6KOkfUCvxEz7PQgpgwcObfz+gQk1r3YXgvb3KgUFw3Z8MSgvL5O6Yxu2O16W5A3k4LuuCdBrNObT5vBNJiMhf0bdYr88a+igcA4y5BmsnN0eNVYg34wAr9mzfNxKMVZfYcidZN5N0P+4Uj9pNsZy7kmfYEBR4JgBH5dzncrAEVA21zW3js/wmj0yg6+YcRr0yYlWCIW2rCxmt61P/gIew8rpTZ4IvcnBGGH6G1ImfLhAjYS7bH4pOBu0bvoNbh1LbS2k+4xCtAu2XiOpR3zhYimi6po3PrC3g+r/6cD+lhpC/WAKMXPwTbnKQEU2j8ZgsCEkdlGYc9GVrhdUF3xV3dPQ/Aqh2LaoYqNmiO0HI+HhFHgb0zt47gUdZNOkW9AkfWN8Hns5Dz1f/rWwg1waLz+SEeCVIfuAcr4vc8Q8HlmApYpuhWyBvtA5+NT1xd94UhNMfqjWvSuPXRJZVJrNRh0xTJ6ex5j+FXm/gG+rwvyVvhqOExJMWEulymU1VHVNV/8K/4NUF3WNxOnVuJRUwdRVL3iW5GK+teik9DauBNlSsit1UO4kU+bajSADAodsAnIrV30lkf/qvJ0OCd1fkRqKxmszIwLhBLTjEZuAlbIjOxSxiuYWNcq4ccYd1IBFjvl91/iLDyTs5jLvPij12T0bgZ9jkLZRBIJAnZeALkNktRDlqL9DtSNDTVvrcbGH1QAmNNvQp4IG9/F0PggSjV+/RgTH1FQjOOHkt6OBCh747h4oekFXu4vL4aYuzKK4t3KucFmQ7cN5w3kwkhRH/kIg6TndHDAhec8B20cDy86on9dv6PT94vDkGPtpCP1dOYwV0om5o1ABK14VQ/TVq9GQ0skxWVpjItG0uF2LN4xQlJqoQVJ7R/27sXngx8iGhie3MWIkONdYEuP+QOPYaILRp8zU6AUckedgYM4lyDXgRS+10dJn3AgyPqgv1/e8YGR6cDpPn5egXEvZ/opy3aXUK0jZaBZZAGPu4s1/jA+ket6Ga/gAkNSU6BJ6icBadqp81fUmzRjZ7xeyxG/oBu1UjAfamps8cYZd/5NGn3zLsD6q3D6EpndEH36rHwlBkp7NdAMZa6xIBAtY6rElrTeVMc007tNrWw8yqMLJuHbDYv4ztB+iBO6ljtHtrldwik+8X3yb+TGIYkSG+uqjK2VPjr8MDpT1+ndVhtuL+7087Ah0O21W2RNrgxXj7RmbR5wGkqI1WJ9u1q0ivObAUHARasU2dLobXO2gkBQLkgHI4NDnTya6ZocCttNou2P4Q/oBy1gRKEtZfRTZt1B1bXjUXWHsYnHrlyjZfP7ZBYYyvD9JcucfTa7Uk9CNXcGrhk3kM2Isbm8XXUkqgW/YY+WsNXAhXPYdtILA/06bkfnhQQ138W8VaSq7tnxtyMkrIBZai6BkU5lpS9OVvKYz8bYHsU2dpCExgQj7/dciaXvZKgw1v70OejEvhmK81Lqe1afzk53jje+ID+T7w8rsD/8Wm3O1xn+yV9wS/I9ETyiXzlU2edDSBOoaDRW/qTuAywX9sV/vrVKSNB/X1dPVpCnPlp2PYu+1X9UevV8UMXFwQpf0R/p4tjyiULKJsEBHXbZ0KtBZ0ZeMxjX3N3aIZLWFlw3hQ9A7VeNp2QGxwzPv7b0Cmp2jXKj/XCIkaIb5EscoBj85SCTts+yQ07ANQyruxIkKVzoASIKkqhEbWEzF0MqJfdIchSMvGVvAQbYffgE1p92V1tFZZSo17hd18ihZXvFgCG6dLNaxiNOr27FpyoexI66xTlEp4+4b8Kswv4+M9qN0aCFKkoS0a3FJwOT+XsPM4smOgwDHi8hYa1km2fD47lBYmaSFhnW6BuG3IfWVk7ntS/z6krGw+gyf7DYKap3iR2wfGZFaS1fQ1FytEQkqFdj/ZZqtT/Q1qrDObjMG3KLtUXgfemzJQ6rdGW4I9YtTgD+4NeqWmRyfc9U5kcLzEJ0HFMS8jJ4czGHB9PXQIXed7svLFiw8FWA3SW5rkU/5hitKZiDA9J6QQ281DYPsPuh+z1Eq4nVemkns8gwFhOoMA8s91zyozQV41hbRIctxl0pGNBObnRMkGDn5Nxx+aenqscRTEZOhGgkapnq7bbRGAQFm9yUSZGQPOusVCMgGnHGOMEfbOzNGj1Xt952jg4H0LLf5adN6XQgH7Vl5pwefPc4oaF2Fg4Db4nRFhTRGJTflSAdg9xLCR4cPokw1AzyUv82Amd6jBslNB0+sjkD35aGPNft7zEQeK+f3BRtb3Apc4PEPlzAG/hVgekx17KuVh/DIjc9V2rdQvQbicKFVWJzJgFomzlEOAISp1I4zLmqJv/p5hi4YUGt9MCxxaYv/58Oya1tDY7Tk8Uog+rslOEbb3+cd45LIbdaKOVDlkADNJYouqFDI9x5WF6V+MkIsQ1XQAitu6aKkKQqXuGuXhVSBV/fgBglaju0t2gdkFMHigOCEYY+QchPH6/rXF4z4tYwA65rMKN5A0Frca1hkQdYhCxO7eq+lTnrdCoTvMt3g3X+DmTa9HFwynhcSni8Ha3J+WpUTEZgo1abg9j4fyqNN+up2S4KsCz/A4rLvQIYyXTzQUBfeITYAKdIbyml0MWXsJQr2yRIaVGMOVgWwLslB2umIQ4k3fZQWA2XO/EKanq71osVLFrLplJA84kzBLbIiP+/RGDDe3Cx+FhU501jXkHXa+rhf9WUysefwN4THxBZi9i1KcoDKNGu4IGoW19ez78pBdJKk9/HnPEOub5FZ+O9jkXobICR9UWFrc4TklkZxpbB3w/Odfvw3MdIdvDVGmWj81TwAzGDlYeNZZ5F4zizN4aWyYOZ6Cg3QTXo9Xe1tPaV0k+wegaB9a9Dxq9E6eR7sui8q+sSWcYCIGp+LGX4hPS6tFx/bJFHL2P6pN7U567KNhNe8EC4WNyWkYhRH3ry+oAtWxU92yXNnLOqxvh9Bay72oi9wWeOjpqIav4Rrn9GTPpbGPc65DMuyvRdVa5eEFg0Za6ajJiN92eupbBDZ9aocHwSq7MRN3VnDAlEGYzHdfArtmkvvK/Kd2tcEPfn4SlVETbPsS67h+vMIFQHw4k+vQt2OOUvknUTFpOJMl4RQWCm60gTmiX2D8WvZDMuqjI0J+7HUTpZgHIU6sQYOHjjOiqM9my+6ypfzUXQfbURvppxQoSLNSzUJbfkRPSGO8oMs9W0wncqeczO6rgCljTGZfySkg8KqQKOUeUtbUesQvgTlmHA4tfFfsuWITHh6iv2QGu8+Wka4XPugUJE4NUaT++qysYR3nc3onqv+DzK4Cn3WQkl87VR50StFtFoudGK0pLJ3/AWo6uDZ1smS2cs8urUn8UPjmmMM3HqM4DcYxhb0o2x8L5aMijwUdIFPD3PI5lqh/gJM3cn5BvzvctCH9s1cWhObKM9jiUUDUE3qe9Qutuez3kON6byrLWRXnHd2NQCOWkyUXsnMKlZPr5ACRzvnP8eJ4a5yOTEgMb28liNyoXGSvHNIhT8s6UFLh80kevrkN+ybE7Z+8shrPjm5Wg7X3/HU9j+thd5kr89UTwQBG1qqO+O9U7SYc89h1vObTqi/uM7qiCkZTsVzsmReivfrmkfNVPKZsRrg/Ja+LIjIKz3rWjhJX5ODrq7DuRBN/K/TrJfTueRAHg7cUhC9qBsXeOG/5PoAlZhevOYMm8i/KO5t5RYT4jIzyO4FUZjgoPU6mhJls5efN2F9jDY8eE+NdzwYx2JjzUoBmGUBHZ0x7chhE15du3H/HpPNfDlTrgHhWZIWPCJhB/fZa3nYpaPRDmDJOiTY02pj7/qZRcJ0vZGbgo996ZkdMHcfsVfYwHE6hkn4XF2Z83AOp2jmr+CthxYG3ZLxh/WFOCdjxTQSbSk9N38mJ1VMw59Y7YzucXs6Biq4VI9rcED8dvwtkQWAfJAgwL1E0txstIlzLwwF4UUwuwW14EYGgkDbciEfNvzcq854FgJwr7MAasTTc1/I7YYyWh3A5EezoDutVbP8sz0GB+y+/OrJAQedv+BbP123QPqND7hgvn5PxjvKBXBD6czcchd08LoWq5gx8tgyZTN8iQOTOuD0SLkMObDWzsFPOSf3yHAq/GadXm5VKHJSJKY32HrVrQ7D4+yMsHvNqt//mPgcNnOvhBPbvl2NbKTrg8JPEGGfQSNWyIz6Jcw5Z2UZUrbe7ATWc+nhzjZhjrrrDZBkh2fpSBfNF1kEVTxahsMoaJrESTeUi8mylHBC4k8pOhwk6iUz2OsM4mQ3XcmI+ZFvjunXscGhkRvtoC6GNBNnev24033y/AACMogQtSEXL3Y3EyrQrF3Dw7pPuhQjUQrzG2soCQIo/9KlT3lpKNzj9loOqe6UpwLvinBdGhPGiAl0YLk/X9PdHqzOOfHRnlF3/Il1aaLqCF6gysS+PzLgnBFf1Tr+Yv7cEyLaM2EXV4+cKYqro0g+A2M9cWj+Qa5yQEfbs8yGhxkwqrxWI8YLQNeyZl/iqpNaeNMLsMv8/V1Q/APZk7Mmh12IdfkLWIK6nLmwUdDSlqR1VltPLgrD0hLZjWmzNN95oLddGsoijXAiX9ARWtwRGEbYTIjh9COviGDEYz+FNJbR9MSxqO5EWEI5gAlTEywcKO25UTYPRXZR/vv9HrOHZHqG+YxUWrQYD6xneTD3upjGjDD0JWJ7Erp7IAIezQ10/e2IdtZqtAlO1NRiX/OZL0vrW9lKCwf1cDUUDyTYyeqR+XKfucgaoyp1kW1TjZFpjmnP5J0npbHgMFNdln39d9zMq9WOMZ1mrcmVtoAgGTkFkxe2VeTgZm4z1MwcxG7qt1+uppOQ7HkjSgqKtA0kukzG8Wqg5DrIMLsHB4F/CO1/dIHeJwe2x/E25V4X2eJ040XYwO4JFhWn6kX2IlQjtqrLkubsoLK01Tt75nfHDLaUKdO2DgdbKNs0bPqkpwMC02fMuKws1oUZyFvhFNQCLKRtG2888WJcrHYtKQ2lV5jUjogoUH5kNEjWOBFU9EM0balyhx2eixGddL/33SIz8Jkx5gQmO6i6kXTI4XjXEKzokGhBbKZsjRIsNUQeisvpCKQxC5uLRwBcE6AsBkbpDmpUleMIEM8t2GUr9r3TeaFhnnO17lbxzdexFhZ7rEFf8CV//OZX1/PDyBIFT7RSqcIcOXljIHx2rBM2O6znKNVd5uu5L3D29DVsNL65nwMojhNR712gRp15omm8Zp7rIGz/3TDG9ZCl32yavnIMSTwLjjrCHr8xvJsnzAZkkM6gnQFSKeJa4HQDetN9OBrey66hJ/LV3WxFsB1Ard+fSBrQIWRUk/aKGAs9iOXANgwUUG3kAQS29CNjotUL8FCrhJl7+yFdGWrSF+GC7Sn3qzqiAd9BombZvLS5jzhGd9f24MGmGN/LYPMi9dwtQHRQFBCLwxYXINb/IUBE8sJ5JI6bRu1py0MJdVicFzUqABwocwMxC9Yk9qccw0uYEhIImC+I0+bkKhY+fTB5DRIXX6IzJnkOKm0wRvX0lgAZgfALLE6EiUA3LBCBiROhu9wv+oCSOW2/ploYUHspKVyJFjF1sm+Hi/1zu3zQgzvOFlxvt/YOx0GZStbXrvO0IRyaHMvMiqD7qO0xI+7At8Gwm9+dc3ChI4W7RjB3Km0KsFojObgdRkuSN4ilNCkwtu4+cbhbtJsLBenlOhsTA3gOx131ydTLGgfLcczqRCzqqnwi16cYJqCLlqku+ZnmWDBMmn+BBSwLLaVx8etMgZ1jLGzUxn/IalO5qPXF+jPBQtl+K4GzrwbB3TIY9vqJFB96aKW/I/sUrC79XI/jJ9avfyncSQH7BNjmWlt9ab8gr7DuPCjiVrZImhJ6ORcrnX1xQLKRlueY/UVtQfb4l8cdCtK8HQ7ATf98Hhh9sriGcVLQnfNZKcMgnkOSQkFLan/bQmFmk3TtnBSuuFEXESDb4DITx+HKDPPiUZH0Cn+Oa5Ko0GDZyoME2SWputzkA78xQMfNyquBtnn7mrAbh4fQd6zIdlQe02JqU6YLaxGTkQw2WO61vhuZ32Hoz5HW9LZhLzibDOpUj06rVhdnj+ifNr72pnqrXt7BHXQxoTgcGiRGeoyfU9mrbrdNzfwlX7LY4MT9ABJZhvHLCsRGipr87OlrWXViZc7Y/CaCX04cRkZzudiYJytlJWT8rBqnXY5hCyqkIp/VvpWXb/KxuydlH1azKe68tOfHPQ590Iersko4RnuHoNJiXzhqkoefo9+yeMcWPGTwSa1qe/Knt9soFO5YZUTROgXdcqDis7FO2JlkfnO6UYQtEynXmLQ1988uItYM0mia9DAV/WBDpLrNY8Qlr20/QQGNQgaF5gMSzkEPanOJj/hb1IZMSQ0qdrFbB+aSQeebl6yHI72/OYWvP32+wxe81Aqz/ddmMzftzCo/kSCVl0W1MBB6/SfyaYans3oQiRQ/43MOohA8m5oezC//NxXZLTFa9rhbq1A7C1Ef8oKDhbz/jfiFiKjn8TLl8DUNksfooaVLAyX9cUwgqwlnXyTvYWl7DKZIyS5LVWmyfTIvU5kzxi3jOfdLJmCZgSBQR28k+FeUFYNaHKbgrTeBjlCnSGeKEIKP/eRluoolLI0YqSTlaYfA4o8ly/lqv26ScyM/Hgmrn9q/rx/qKeAgx83UGnXkHIWZ2ewMt8wzTccONXHFVy/YFOCIuwiBgp02M/G2KYGr7wdOs12Lzq6SE3g5EjogdV9yVr6RunU0Tn4h5Sg2r2uskK7ZJ+WjpfsXx7OJuSx892tP/1jtNg5YtroaFyqWBH6/CGS//bmUPOrb4afJukutSQf0xr30Vng6H4CajhVL36YUD33dmZuPhLUFBIlNeX/8KPxJbjps/o1mgMi17a9C6GaZKkWZ2gzrgCKrC0VVT0fgROorkvqSEBsMf9PzAwDbSvv36bSWpI/zs3ca/sIVMKczUZahKyZN0GbLkhwz2cNJ1JlXdj1E/IQ4159ERJlQW678G7zFT/QtVaguX4wipu+U3aKU0DTPF00n8Ft2Ymr7+9mljvf1GPF4jnIXeD3DY/GjpRRsEXeubH6sKEIulJTsi5IRFsjs3aKbFwEdhF58y2+Oq6sh7RGIipS0VVjUyFudx2Wr3+tuWaoqRPxZOIN5N4FLeQT7pbhsnn0FOBRiI8D40nmvrngyPaYEruUKclPYcrDbRYKdcWF6P6JfEc8qzntjR6w+blK88yEhgZ9MPPd2XZE/vIMDpLLv10sZxo9D9VyRC3CLBgo094GeCiwVQK+wfNOlAilMOGnZGTCXfqS6igGtfjZcdh2osdUBnhGTmI2u6/WHLh8LTvBNPBPhx2kPulP+/hZk4O++c2y7PfJMmlBgynfQkRiHvH7gkLFwFhNpFNtqA54n6W0A/G2YUZRz5PQVHMC9SmJtj5QXSjmQ+AWJgAD0zkGu8VnRJBY2V8N4+c0HIO7Z/mLPHuzfrbyZm9khmqwjyVnMozm5Ec5pTG6juXucfsO9//O2G5dfUAAYJr+4XJ9uHG6b1908+9r5aFvJLGo+B8FpuUVa4eVR6f+czF9qadGCXrlfYSH6x5sT2tY0c27t2LDTqHYycRgOqaV4ISqcvGmeHL3SXTpcRo+9Cccz5BdGRIkRdjSX4NGR6ZJpT50cj8y079cF1NU+62Y7LrqoU9sFerZj37o1fWq3zyjhhej9S3tPTLm1Csl2z0MbNniqX3LwXqWgW9qCU/FqEyWv070v8RIIvzA+VolQYZjsHAlBROeUqj7sZXBRN04NPzXXc0nRhSRZfn+ajylBWcyEheYjMJLECrZX5Dn4N0Ui9+mb37qO4L4uaL/vq5u6mM2A43CxKpW8n8I0VbHF0fcvO29Gc8UBeetjb9QEUh+FALRa5AHveyl5AQo2niWe1xRii4wMnJ68qkQo6loSELn1AsTtvAEUeML76K+L5if8+aVEH2aN+6KRKBSUoAy1m7U+hX86u34Z1dGBvKvCdSz66KdQxE1PrivDBipdaLkQ2X6X+1qc/BTPaXDQa1kdAL2hSn/pHenrdSpiINuhRCGChL8Rdair388r+zaTtrQOTjcp0z6qrzjP0FIAMnCtd7m5GQ2r+2fIspoY7XXZsBhmq6JluskQl//emzkIThG98GTnqh63mS9oeAKi3LRhTRvWYvb2RNEUX2aPv59pIft9uxwFwSU/UhmY43x9whHSpC+uCVoCmWTIuZA9iDIHlKIDWDKz2QMFQpvzEQUDu9ROz0LhHax5iLyhYYdazFgJzy1Z8m8v590WsyGDJqLP9iAjbdvTik3SzLjdQ9qw0Ky9VDXHxsQ46+H3pH+CbiAxbwShFYsURkudPKalpUYga45yZUjnunL7tClz2gpsTU452Ou5lDXiHCtSpJt9D9u3zXco+dO4SX0zSYpzj7kdvkzyVPS7k5eccI9je0IutqrqFCBmonmHf4VyIAHSJmtsbyYEWKCJkEATEndgD82W0z4TIhbhYdcBtuaIrauP470GqTadzHHTPNe4O025CaGujsMBFNZcRV/x/q4WutniKy2GNgYwHRbD9ADgc5R608vuF6V2BBpSobXRegUQoWGxbP61uSXBgsgOWvh6lReJAl9mpvJtkE2e19YPklTC1GrYqhmasGSd3qiPdLyGXbHXUcOsB8JLkxlKoIxuUlk/dT9tK6lrpLCZPBZhu6i0l+Xxe1pR3+ytwcRKHtMsuhc9bz/3IKh/YuoBMVxj7SVA6gKInMWVM8QLLgXSop7w1liIjaH0ypCa0x5gtgTEOHvUoX7QRKNZM7dtXe1nfeUubRTYZwTQcZ0s3OqdtmfWyGW628QI2vdvBIhz2/TTc1v5aEPh9IoWaElymdVMaXf2ZXPUZHzQMorjJrH6SYnkwaLMg5W8TCppzdVHhT+2fk03zy+SyyGOHhOLAbfh3xg3feWtUVUx94SROst/Y40pD9YA5wVvc/+oACg5zGm5mkTzkKDqpL2EG+FHucR8oQ3DDecSlFxaUl9kRNVk/kq3Z8mcr52iq/36lVnhEHzevLw7/whbkJ6UykuU89HfbkUDJu8rpNg2fWxZEL99XtAzbwgAdyEKGmTsXmf7Ym0A2Be025WLlmf09w5zmSlstKariKjifYzktq4uNeeMRrDL+9IqW0DRtZhWF3Y50egExVkgfMVyM6tMHsHUxpyDtonBtvSVx4j+0NUN8BYJS8eKo9qyk1ke6KU7J6wClRYUMtEjEFDRbvv6+XWmHmRl3/Z7u1UidOeg+d/wBdgXAKdJMi55yPa3V2P302YW/O76hyJ52AZIpmaO2IDEqLoL8soResD63AbIwLv89cR7SIjWj6R82twj0cA4OH0GTed0jfiT1GyklJEQsxxBNuRu43/o/CLFZgSZVcxlyLyjXeEDDoNKd6KlBROpWFrYhZG5+tRt9QG7x8i6u8Z911IOT9z2M8uaHn4lrJbcX+LH+3aeISMx2q9uR8JcckPpzxgNCpRoPJPlvoMytTQnA+3/f7IiCOHKY/mdoUqhPnNIM3qQSfmjBq4ByFapNKI2NRAIAf6E7N23Qn5CK7JToHI+YWno8Ncg0uoqPenRr2h7MsDV2c6g2/dUBJeJDpBqDx4SjeQ26HvnYAYjVrIGOvnwg7IzeR/sug6tyiYFax8mL0by8JOporhum+MvkCVQGvBaI2bafi6TvfuCNWv0aYcJiuNl0u3tF4HLzWkOVzygJZR3T86bet7K4QkOoTitwrsqqfwGV/KVD3cnuKzUBq4yt/n5fPo584ksqoMNz+ckz1lFHlKh9YLJSARJv27ItAgsqqg7gVV02P2Rx26b1saWexiIW5Y+FEQNBEjpKZiixFLlX1BXMEjYG9tcVu+Y/LxdTL9Ne6mFjLX/Xyjf7Q7s5JwGhEziyRbYJlFT5E5pkRpD/yJdkze9pYmUnOQvcvsA0BK8A8HteE8PI8m60mJ6KxCeB9pBAQKnwwbgIHYcTtOwHDtoIbe3Da4F5B7SoSp2BMNomCDPfwLzjKKolnuwGor0uVcrPnENzgcaE1m+sZE2/icpFkG9ZsRe36ZSqLy/C7S7NFop/bd/+Wckz4OlcIxiNo3sQrrqm1kp522K/wquCamaZZPfz4McXUbIJWVptGanKifHjvF5gRcdHxEyCuwTxXV3LBwjWJ3kfA4RIKIC65HgLVtGRWqxWdXtptzn4QIgejLHybUVhnUAS1DAUdqPASgOZ+xw4kE0bCoRpylmt/a3ZAiJEAc2968b4IKP5F1YE7Qzqf7KkNp+/wAIY3VL/mxkw0JZ1gUkxweIm8/Qk30AXdpPnRepuDSZ797bPsg+GT5IpeP+5qoPEIjIJ++ejXZP0a48iBk4XD89l31Vgd5NNFZMmyfOcrSatj/VLWWBNPpMUnDRqH3ezkd2cF9qfjDHyMfFNBClaxx6cYOtQ1RD3tr3c1dL3HmB+TNv9z2x4/wj/jnszQ8BlYdF0JElR+gQfR66Wfn8iUEZm7BJaX9dzihm+KVU4qnRWrtlKn2VugfP6PUEgp04lxVIuuBHB7blY8BMG8JiVl2wfyZo/MNuWUJ+h1Ber/URmWJxFpk7gKJnlNsLI3M5Etan5ka0hkEpr9bcbGelJqTWjdXLyuWd72zuzORM+nUbuyGCH66FkS77sqg+E2yV0Ad5X5CabxLzGTaO2SFj8TC0F8W7zSn1RRmJtuiXUPoCE28kmYRrj+4HDuvFSc04ZMpalfAYCINCFXrZlvxs/rtIQFGbTQjdh3F17rcj8hqHg1KXzlLFUr8d/QxDtPBq4FzAgADLo/rkxA96eIyuBC4nxuG40sOQOW5GT03/opSI/3iNLGfvCUrGDm1ZMhB720k/tN1/VBlj8zfi6HxFZTvnosVorLH0GJyOK1BSeNJobc7Iqn1p3NOj3e3hQBoidsN0qpL8p8hhtKh0CO0axMLUtzmkm6CFb+R6A5HprzDACxrrFaCZhsOjUESazz5l6GPBlUDnkbmdXvLnvAfv+RtB5isjrvsHO4MxkpzL+NFrfI0wB8efq1G0Yf99onnc4V84DM1omAuf2s5hwTR1hd/Ui2T7E1Raz57O4vI4Ui02kOcc/MKLOQzJj2AJaXzvt5NuEMHpWU2zekXLv7RY0lBU10u8+bEE0XcER0k6ZfB1g34WFS/+rCnyGyCk+bofBgeagCftHhD3A+dNCJisSOS0vO0JkeQHeIJHFFrPSH7l0I0tAOQSJdwblHgwR27/UygMYaPHAWVcNBxQAEVl/MNxJqJnRH6NDd7jPbyFxMU3bEwdpgLSLs3S0SGlgrSTIq9jfetMPESFrZBW5+0kPjOuQ/3gRtlZxaNjhQiFBj/Lqv7xPgujC1fiKF8hJkuAe0Yo4dAri2RyEkYvZl2BiOTwLCWUR+cFkmSGwLKq9Kvg9tJ3XK+ceY49X7rce7MHpvl8+B5aVEErJ2THNBHSaZP2U53YXFjCxIIgFU9Mt4l1BRBMrLe1CbD0FQe+B66xXjhHEdo9TOIf5cvJI2exyJl+YbDtZFWWXkc9PE9eUIepi9Yz/cBynLVFUypio6kU1GBqyV7hZwunNSghJ7krlccKe+ezkydLXrFWh9CuwMMdWU6JwpusdAB8rjP1hToRjEADSG6oRBOMWCEBBl818B1Lt0AoDhHZ4kdkgTcoDa8HhPJwZjPHAxyOyMnGemOgXNrN56hlEdssrzN/fT/PFD+holOAIs7MvtYobzGTAx42i68GfwFKzRjSpWTfSdHhe1yUgaAWtS4B0ValGiGfh2Rz3r2bb7ZE+XAJcNovgCR67f50uYctTc0OUo1AOo49lDwqnYIUzHDrlYXWdS0FAVDZVGy4ByOEX7zw3uWHmbgOgUxiGBfEziVVZucloSDQjHnVnEmmxaJyTlVDBcpTA7KVBzJAQU2Oqf4nePTbklAHIjqmBbb/KHmREpRC4LTTg+yif5BgLAz01syBd5IYhHPtTX20KxRVP7AMQeskqNi5KtsR1voGAf6+8UYK+Kg+8Jb2PTPZPttnsIuso61WpxvEq1qcNStow9eqcY8AieCtY+fwyYRI3RiCSvwOK6YUyYbQUJW8AeIduD1ljjyaje6OaL8iDTj620VjyOth7THYpmrlq9Zi/RU/fuKq+OoEGOrnubEZPHhiI3K/uaerrbeTk50yrXbdMYgxdRM/k0rOW3zbHnPD8YF/sWbnr1zV5JRBfT7qWUgvLLRHrH/OqqlA7lRkDyLmHXTGA7FM8pp9JEyzqroDsRjmPOMKvqXU30a5ofC8gIeyq8fqrG+IiytvD82QrFSL488i/vKu3e+MOwDdvO0WvzLGZOKYgEo/Etz8FQQHLVdz/mT+6ICrgIBlbpRI1hLyKoPmsCjfGO46V5y/Uxfy0kTaM5OSysLws0FiAjU5xRQ+giYfXa+YQXauERt3yY9uYQzGvFQ+X32wnuS27Fe/Xkub7Zz3aImviIlUNrs2romHfyHdX5bc+uR4UehNJ9MkfFIYrHD0psz8gp3iyUrn66dWSEwlXzHbHra855me/7hdFxMTIU6oFeiVuD8q/MeH8abR0wwaJIcrwvgI1lFTkDjAQIXUxKTdDd4vIBxqLS+/ohImxM5QO1hIxkZBj+yDcx1MeMisR91UhswIPV18nb1ii5tqkT+gzVFmlBXz/RzKtEWGYffJHBkrNJzYXmVVnrEdt22CrN0EcBCM/CMkfxcdzo7xTdL1al7ZiO41MHCgazPnUp0U7+LmL3xVjGGgQzK2XmWfb6JQPfIOlMcB7z5MHk7jDXbgKVrmKhhnxfDmXMoUP6+cZ9TKHEupDcnihOyIjje8U6a58QhupO+307wUi7SbRZUKIUVhF0wWLo6+wD9nSKyfXt4pW1f9oWsNuRJBJK5pfMmxB2bXajA0y1U4ZTpxoirKryJRJZdj3cvNDktgt3K8fl4UavXUyR+6dlTBH6yz0lEAFzoFtb23H76Si4RYW6dV3016dsh5xNqAw25HsRzIsbrVSrk69KBBWbfY7mxCiC6qrSibjcUUzhcJyvdreXDSr4SCoOE7OFnV5fbidDAiWtT8f8SuxAsy1dO1bTZEURvX0idGWk0v7zjKwtaMlAwCWOp0Sqt+iKXRC9g37ITOmO2Z0FwbnmIlYbBJvBURp1wyuPFLIS0LoXternPZbVmvhY4QMZnKsy1Cz0kVvlGFYWZrClIVCWItE+YtsbzpRaOMcrFP4E98wQqZVyK8phXQMXkwa/gPYVWtcoKJQ6DwbLLOtRrb1B565w0WkaB+ka6k17GJU632MUIFdmBBadiS9Ex2TrUjQ/VtWf19Ja6XGfjCtDeSbYZ7Hn6NadZSYl04+Ui20H2aUZWiyHHYHq6V49FFpedNqcnTrq1oN2PDoj3gosLhEZMVzth+2WJbIhlWO0Cc62gncngEVn5XauKvKQIbfRG9PH3owXnXeerCok7MiV2V6HSWFYz/2TufwvzIXgGBOTY3WpHQTnMweuvdMclUdz4PpO/SC1x/do53u0cA1rWEBEbss7910IHEmEeDVRoOm8Bee4EUjFW2MWzPqzNGUYXGqG0uEI+vkGAXKmW7g4G0SHbeNdjOvhQvzj35fQtokmLuJxQ8ta/rT9nDky8LSxqKyc8kwMHdK8hLXnmEQsX+glsin3gaBxD81cQoSRxTeSygmCYP7yXlROYa40knz1m2Ul1L4yltCk3PrYt7k7hNdvxIS2FK/0SeHmZP7MyardvQNcJV5kELTJcWtX5VeDkW1EhziomDa6XjP9cq1esKA77sbi7tBxKk7ODkUFnOgqnkxPdoLo10+DUdOydInM0n056cQ1cco5zYa3W4xXzTLRZ8SMe1mI2WcsDQAq/youz2K1DMU8Fg5/g2XQumXY3qGjHWSm/ffK723Gt0NnPe3CiVNrXtR3U5wI94T+qS6gQPRbNxx1uySlUSCxHlpmJ/Om7+gw/X5TIuyjNdiKDUjLE4ZuxJgYxw+sbktPl9BEF4mqElNDzBE9nLCEUiHQSoToOYvuDDAL5yUryngyfmWUx+wXeOe6r+SI2dMS2awaXWZSamsdXo1pD0+NF+vOZxeC5L62EVt52dNX1Ek7UnoZILPgvj+yZQ72N3CS9JxYlM1CTY6PDaCLlzR6E4X1j6arBZFmnfh/UKDY1bvdOQWqVf5EctjF6fFPqmEG1Tj1aTQIlM6BpXM+iOkru+0LjdEOlHCHyX8GeAPVRjXaXy4kN2npNscqKLjLXC5BRQjTtfHUrOLSQCLCdm+vRwXvYxvzqm7zarGHhysidhfrU346/7fVerCahd7XZy3HwabpNnQSo8HFyLtBuZtufPauSUpr8ofoObiVdZJiIIxal+VH922oHRvfC2IEhkYdnL2uCiuiTJzaqZoSpUNt9pzSAxKCQGFRb9wYhm8fBofxjGR62f4vd4CXU1gwNDOmaASXbaZnzLGtrGYsueHEd3KCe9DNulVNeKp0ikp0tbdwBWbGtGMFR6YgSB5hPPRy7TE3ApfWx9jG4gArvzUEDVJ1N+T5jj4LN/0IGDTVM/FigwwzGDWtmzYlRkGHxYq+wzfNhjzkFn96DQ8g/RNJxGDdOz+pW9lRNZDMEv5YTFcOj+L+tjwVCnYq1FB6V+zisM6TQndEpSFHMiO/bNoLDH3JRB3mzrkLCL+wC6ugHA/I3WkL2o9fvbG6l3cKB0WFW0vBwCu2KUU9Iq++6Uv+zGPzzffMjQ9IbtgYw6cpij5qg9EUsuqinKhJ9tV2sseX6hG5v/lAvRKPmvlU+fNK7lLnne1V38SddVa0nh7Vnlm1c2zHSYUMmOsNRGmgGjqF1hl1VMCs/+4GdA/qSZFedSsgEwJzPVWt3RNrtw3OUntOVdlnljp6EtRFTh/g/umDTqLfipIxcZBbJIqnD3B+//Lvnj57G8uNwuSb441iUionD5gxvIaha+dXQizlZXLcIK5z+4YgzowlZ3ErS9gz5MkSTtcoVezOFZ5tWmWWHflYPcq0HbqCO3j5a9ubsyFUtzcUixnqufejQHaRve/oODKymDps88hVppsK4AagXuM5jitIXtI8ekc0z2V40PenRs+HE60wiVidyoo2S+pmihrtB5qwsod2EkzSpxWpNTJwc1NVPnJuHaRXF5D4aBPUi977My9Ng6cKEIQCTg9s6K6pKljCVA584QJe5cYQ2CGNCC1MVKEAMpT1kF7W0bC+GX1GtE/7lhLljcj+KSOb5K4r64pc8DuEJ8Hdg4Vgd8T39kD7DON23YTn+zSXHNpJPZNqL2jkgbcs0auOqNVvEVPQ2r928fvK3WCu35qSZVL+VQnHforUO+wJXPNYWCP7f1s5O6BLXdBsXMu2WavmyOODfzbCzJRixLdP1JDaMVj1/ZhsLV7yMLTvayl3pDUbRomhoW8w3zDY3D2UnzDA27szTsYtdN5ktPPjUfTIxYfEdvI4aEIaDpxBYU5xY3Y1bOZn+ezdu3YtoUETrL/MM2DITfTYz8W3j8O+t2tpr8MGGV37qqab5Gm/1ivG1lWF+YVJ5/FnM1lQr1GVvP4y1dPLNqMS/0HYYw/EGwsTcvaI2kzBu47Gk82+WlLx92mM/eYHeWdoX0ub1JQrfDB0Hg8HzzIVPT7+HZqG62mfOmPSK3Aw26Hdgn+bxhpE2dJ1oC2TBC/iNrCPX94OB1/PC9MezpnXfR2ND4OOXVwPMY/Zl5iOqGYiHyLVz+zrqdBRvJWRuaZh2LLRcUBo+FtNRmtSii+ktQn8G3iGeZNNZ4nW7BeVfjPtc8/0/w6M+6ngVTQpebb73gNZW23yDNYc0K1b1Sh+Z5ZTdU9TWCJsBuEOe3cPyddTxZQnjbrfKm9N7HX3/gypBNuNXr2LqUPuPl4jmLWDOfm4Cr4YAZDomVhhWj1jE+eP7gNOAxBPcwMqNWscqy2diiEFvCOqBMSxw1Ld6RyVIo2gDniD2grjdc9+8ZIjjiseWSjRzy3Naf0Vxua1jecXv8i1CuU/IrUVp9nuZOffADN9CeCEK8o/8bgCkX9jSgdXufy05DgSDV+eoQ9JeBsFwLgsnCWtBGQAFF+Yfhr8vGPzXuf63tysjB3ExPa9NwlYff8Aq/yphTiHvHTv2V4UMm43aZsBW8wj6PvmEMhGciSEm7FfGCPCnkwJz00YLA5JzAHV7mM5NrXNqNgQ7EWQEKvO9tFQ9VFOdKhEHz4ufSjBYsnkLOQWEOU6H5pu9MxnEy5r2jjL7dz3gWdBFRjRL04GINkSWgt5QfzgT5r63msTMMEb5xiyCBis9zT5eXWGLFniRQY77I3Ge5ZxPgu0ULx/wzKoqBnfDlIqZz+oJEJLKPEOQrhvd3yMpt2iyS+yvU0oUCNBV/yRaUYL/wlUx6emzg5lp7i3Idg7MeK85/cQ1h/3b29YHenBtWHsVYlTBkJqKDHZOKwxNjn9RjtcqloQ88EgDijYCBA0j4nveI9c38CAUAzv4CEADW5MHdtHJdQfNJwpGeguBmRwnsQkPmRQNjJ9YVJvmzquUW5MZh/F037MTMerHn7HlHtoxH9AZqwHExUzDCNdGGSJsqIFdE+MjqQwkH5/QdOf0zf55vR4SAppcl0TlOIeraG5YGqp0Uy0scgfDniI9Fo2JjrNExnbsU5mc+XLAzGNXnHV0a2Josg42oAAxAlAWfC8iuhDd5z78vnS872PtMhuIEle19k1iZLKJf1OEOSFyEumkkaKxpLZOEwnVdUA6HrIDF1TB/4bX65V2cMu96/sjGAGnHRHsmai8HkVulIljNF/4nKQuTuvEsdFDCl0OonqWm10LZcYIb+kBOoQmbJvJ+veIhiU0ZqGWqTCJ8iG25/UPkj23EBb1+TY/CDKXZB2lIYR8hcrKVuWjClwiBiRDpY4aLQLZCz1SQ0ODmMjO2vBWHslScU4oxVZaUJC5U239lKvhC1UxWvSZu4OmwwEfp6yyv6zXlmYiu4GNHiAULsMOTgDYvnedjK77jDiLV0psfrcmXPToeaUsqp838ccMCqapaR8oJvBJ+XFEyMzZJ7hISpSblFHkhfUMqctLH8nGK0fuevTzHJuLAohj6s6KBVWlOuJ6r/JxoABGf8iyguT4rmwZ5MrHOz4ddLumYYiBtbo6QnPXsKBB9uYkeEGiDaw9PwirHxyS9yER4V7WqI9rt3RTJmbfCjwRX2lBOIp42MELJhAOqQyBQ8yjFK9UdASE2SthTNfCTyWx/K+2VDf55jt68Jil4nWF+mduQj6w/Tjnk8rp27ra4jemGRB3ndvn2X8PRPCLYypfT94ti909KWTpU6MI9Lo6lJMVLdGWIueqIhFPqDxEq3ceHgBOoDSeRKqVazqgzDL9cNZZRaFiEi9JpgyutgvKj6MyaEVf0VEUSOD/kRWIjhLCwOaR0rZBXh3i1KDVtQIJbDfZDNvqLD9gnh/kCKqnBZUCZd5zSew+6wijjBzfE6mr2fyHufG0mcd1tkZXo0PHG3n/4W7FcgJ7g45b9vPmPLTiv2S9Lrw947Azrw1LjDRnyaaAeJkevWNkzjChWp+0K6IYTDjwjW+4VDWPdrV3gmRCmqjbxO2h5Y/ePVRlNd7/wb0ZAa2TM+ZYEeZHzW7On3rYw2T5B+BNsyBFZLTmsWWdCP2CAoj6DOS1MKke0IqfYUuE6sQSl/WmzN5pvD3Ig4pqGFdqiuc7AeYIwyE58+Ud8G3dYga+UPYjfAR/WarOlxH0zQqYmnY9BvqVazvselwK2mswludqwVeaHo7UHhLqgw+5TxoaF2HFBqh6S3jD7mjihcj/xlT7Iv2brREieZ+oVTnIscUxno1MiacKvV/l3JNldVrykD48wGFlM0UlF3Xbg8IN0FAHCnb+dOSwTb6+NcEzVAEvnzN55ED/sZNQ4kNTmybNTqKyBFx5Reekq+Xx8wYnFuGxkx4Y6ksCPYHwXqFwMYlWBtS5rGg75RuScRx7mi0EYjpusiYlVXmrYOy1S3/RfhkMOXvykVwReGfk+JufrCOAzBzvBE8QJb2Hkp7EE/1cCDqugFI2XwPTOSaRIYxmh8LdCxPFsiXB6v/69YkSFt88ZwFD5DyKHgFhCMdHMTbY2NYSLpN3TNuVPy7Fs8db1nL8Xq1ab1tXrPYdz33LM/naMSw0p/c9SB3du65t6q9cqVJ/I4mgS/iNJ+wRwEOh8AJ/H4Hm2iAqWat7JqribAJF5IqlPm4ODQceyPIMBRXkx2F68z24vCAqzK0zjd9/gVhHfX4Hrzq68Bl/rRwr8vhHVUxkD09y9KlEzO6hh8ARDVNi4Shb14zOR4DPYNM3zxLqDDevWu1IxGyKIMNx0wwTW0svYC/NWCUPo21jQY/wN0zECgMGkqA8zlIWArnGs9XVXSQ7vRAoCTs1ss2iAYhLjIJDgU2iHAepUnIwhGjju0u6VqOxDLSmpE1R8iFxVs8zHoCsPmpeACGqnIoZYP5zmD5PrYjrwSJoF1xt9N+JvHCyG0x6BIq6SVZKqfvp6znaehZ9DrZvUfVP/tgIUt6/yvVH4WflnSPw2HVh1elSAM+u6j1D27X2jRTCvpppUBgeHly4pKW0Mn5gyzqxrZQAl6WYRraVzmaz/7iMrGEEP2L3MtxTcN4rqgE0HfSog2APjUM6Xxa9z745PxfIKaWriech2Djbd/BH1xOjf5k2u/a4CX4pk4DGPyVmmY2O0ULqAWq/YgbbTDWQ4lbdgabEOnGMKmTAbtcEaK99cUpd0NmUeLliTA1Wz0idOBKHKH2OjQHVZpXRw/xu1hCNZWsD9hvYEA8Sw1JMuaWL3FtZBMVxZ/JrQnExBwH0AbEw4x39Z8Q+/Z9TL3q+wC8YoipgvREF3teOMBG4PXhO+g2fH6VF0RHFeNTxPV1O/8zdON5UEhnFUPmuTCD/JEP00D7UI7nxYj2TOrcspa02TGBkwN+VQJVZRRRNqJvPJvH19VkemKSWUrEN++GhFU06xl71WuupbjuHOvWJP0NGf0WJyqNm2yVNyB0loPD9Gimx/XWpxxcoVZxk3t6SA+I5TjdFafOg2Xk6lPPstpSTlXbIbVR5C6hq3PBXqQ+RJiRs1xViuIg5+nRDH1M4j+XVUnr3hA9CZwHIGtTH1xTkohfEJkkHOowlwoPgw9z3iSnNWFDIw/Tralg4QeX8EwROIguK0bpJr+6z6cEA4PLS0lZ5m1oyu2ILM2ZDMCFSMV94Y/ABoYrk7ktj1G3kPcoAWu9uT4G3IMHlbWTBQd4qJu35Tqz0mS97JarNOj9S467qPpLiTBocdLaMm7urvZ7n0yPx3ZjEemGXpEc3Tgz/DjgrF0BDHG6FaaAS0hyLNJAs7DzYWR2HYJOUFMcXmrYfFf4QJ3030zf4fVWBWkDcX/Siuf72Xckp4XvAO8hd8OnJkRZj8OzqomKgbammJNDq5e7uCAh3mT3LytOZnNQZ/E0YUPQvfb1ADtr9T4EwTPJ7gm0wqnYQRwXazDs7Y0M3fuTWKwh38lnXnuPj/754AzyDglOpwPngkwAFLAwYSUBPwDPiTUTS3FsLZ52xT/moi1iHCw+hHtOo2crdSzcGHb3j32vK0GAuFtCuIkejZo53pwYMUtjmCxCpJqSwetTPslWksvXSm0xCuLLBLZvBh0Z66gyOvEvtBgsXkUY9i0CfWMrjeJmaQGXghHHK9TUYBC1tMxqy2uzpJHYLisqSUft8RFiToeHnOR9IcfQN8kDrsAcDl+V6Qz5jHd3VwT5DKggOuL44piF0SraR5jVFE2270c+iWFve436dCADbSLh6H66McDwWfEXMHVrsCJspABcKnztqlXmyGHS5G0ED1RBpaEDTmYrQdvL+cRBDvSLCJDjKF/WzY6hNN9QpyjXsk/THffy8J9Zm+pDS18RY4QVbHjMoOeVmDJBiSednQ10pFAVBK+/YFoTRNIp2cuKmLZoqfzBV9aNaq6YgSLLGcxjQg/bBluzg5eZ6aGa5ahlHNBkD9U/jSKcwBH1220Jm2ofgJZweU1hwIE2AVmw4yESzJ2iYnT3crLY6AdrtTWHbSspF+C8RWw2yBLNTKY7hpTzI73ALgQy0sJKtDvfobgqY0WG5C0dVk9vzWzwXrODXksskcS5WBrOgGZcicyyUpHJGCaQ2iRp1tKBPQDK2buw3SA5pkpGYQ8nHbHpqXQYDY5d5vC4fNDRaE/4m/QfIFclsTO76jYlD/U73aJn6uhJHT9JZBgmgRfKUa2SyGTHnI5Lh7hyXURZct61z2M4xWbMK6eA+N4rib+OH+vUMx3OFDBKC6xkH0ucm1Ya1GIHNXzD5Q1hQBQF5NgEcVusO4tSvlqn+po9aag0R0B1wiSkgUBrKjEiNrufhEbBgDG8fIRB7hqIUyn0AnyrV0jRih3boEpALfgJgIvz0Owfi4ZQD5q8pSU9DC3f9fAaa1LTQYGvycyYDrM5DyZR8Nqohtd8qDIMoa3hKQrnl+umFxkINxWN8JET9vrxhVnd9hVdO3fM6m1+VdiQltmWbhdVkqyQMpp3G/FQ0hSsaTgIkGsIJDOUqSDsQaQEiZNAPGvxqChVRv9ygKu0J5rOPwlUeIofHcPk//P2OexORnxNaAWkA7n9S6ij6XWkQZSAc9QEp7WyLcfrwPaDU8QsDj0jWQdsDwXGgITGTvVcrmva/gpz17Cd5QqPp/P1fU95ZH82ln0mdo5uZIFPhtfZJv9Cg4Tn8Zpt2+kNLsT6kf9BtXfMYnHRPDU5rhU1p9tu0FXISzNLRSqXnf3Rd4q6BtPTRwKQXAYqdWH0x8lp2wxBZF4JuJ7tMMssPxICEhwu6koTR5ZxYXddPwSbOPVEAlkE/vBIgEOm4emvhbSCqnom6ncnR5e3+DJIQY5mAGYg8CxaJLpdI0y6ur6BN0WmOMpHneLJpGI4aHUK0UgIJeB70PtUE2nH0wdE4ON7k3Fz3d0QkKGAsGdZcDr6YXkYcZbjKEcbZA2w4dfUbx+sNSmPcIlr4N/aqyypLLI5qv0WQaMCn+iSvIY04yuLmU7r0K2xxs9BdJDkAdVEjh6THwtMbzjuQ57jxzmYX6xnRMEvlm/iI645O0w7N/h0ZowtWFXFwSa8DgbTLVqZqq0iBrY4tuGGX9x8Nt5XMcr0nKqWCRMnAdv48hfsFO+EqpP1Jg6c7MeiTAB48PNVwldqA9ZqiKniqIwtTptoJVRSGOiOL2IDYj5YD6LtaBeNWzXFTNcmM0eByljpCZhCyiMExz1+l9CbYtjEUocPFUlFs5FQWV6QNILAIaAHRSWK6QjQwDpO8I/wq81k15QaEWlqfOjhmckl9C/b/gdr3+0GA3wRy8AQesn/wKdpQ35K2CzHmfWquczNq33XKmC7s2guKaiFqRTq4Bat2GpgOlC96WHYgUeRvQAN0CqHzMv9StLwShK+/AfGTPYkfWRZGuFHwnNvtvoOI3aMGAQ8tumBBs3YrQ32XgOLnnAGvNdw2LGugNcx9A3zVgdjGilY6kkvfRkTvvc4nFGyhBJctNXBHBcOchVqYQHEjPQX0rzeyWPsEF+rMV91PIedPVV2cWat+p+kZoetfyZSlWgnVn/kPqzA5xtq+3rddfP37SzzkJudfXteHCjY/LxyLstMSYESzezSUwbhoNMi3Eyu3cBrI/liCylkxLJ7HIWb1pH7BD1Ub9pEKdn1YkqeW2GXleqvv8hK4MK9eJYiPZqNWNkmYKdqid/g/YOaUVsFIIHruiCDx//xLRtdGvB1zOnhzmaM1BZ7xdSn95v7F1Lkb5YsQW1YELCLv4taBGcOMDOiZPm7gpiDldrw3TgLx6Mg2FKXXoos3ic8fksHvcfsSBtlqDh5Y8ZXr81XZspaQACQUYYj9571UGpTD1rmOOHJCJMhYDQjH7BFIp2M44hezoCuxzWIfYJyWJKh8ZvURZ/h6/cHaUNnzoHESBl4GXpEpXrEaaZp+BOhZFZWw/HPbCnQupzMpTq3zUxuH2l7zfwC2plqvK3qtpJqTiwqoExD6UJBCycoK7QXlPl4j/I4bWsA4PCJcOnJB9sgBP2ITXFi3LNQdYJKkDtTqB7/Ud3zGyJ5yqNhF/Qp1rhkbyZbuAYzzZneJ/OZA9uGp/qOGoHiMBr7pfWSYNrW5hFDdk60jPNDqUk8aZVxXlZXBgJkl+ykOeuU8Ccrs/iF1FcD7U07KzJYKd8xsJK9AZtHqSOhsvrLaERLdOrHkbiDcPw4q0DH5niIM1lyeuuFeyhfpuz5+BwsTyNFqqpEnngmy6/1UyjYRsWETAwTrm7rjklxmYgtHgGWfuH0JlnWZuGZrVZQT2C8k2LapWCpRRP2prIeZqY4ROl+zpbGIshcz0ygKvNUDHl/a/K+2W/O8P9Z2gJ7JD1f585vJVUNjeT8W1y7rwuhxtdBrziMPX1oqsqVhoWHmUEDi+0Vsop7dyROMX5fggWUfeIFxat+dANSlYKlzM7BZDl5R4t8RKBHUCJULvs54cjzFsfZ37MubKWAK91V7crEcs3SFgtkl8EQ0Jj6AJQm+Zsd18XKHLIxWEwISufAEX1p84bPUBnHBebvZM3rH9wj+HXUL2MzVSPr/fn3PjghE12pvvg5JGWm//g54xK7/79s9ig1+EntfM/NZiVHIG2rTHW+01vsVOdIASJvLav6xTBaZ+6bqIr5ePWVroumtM7i7a3hvubg/fGeEXXoso3Cs62O5fsWGJ+z8ocZCkwW56RG3Qf2Yjo5uUM8Cb0FP2iG1P22AEFRu+tMV/jte6m4PEZzeQXnQ3WzX/GzZs291jbahZ0B64EkTfQxNr653n4OH9NuGmJ9D9nCrtIwH7+qt6mbgtZEZYNiuKcWGVqJjsRScwIK/nN8pdre0essGhkMtrPIjnkpm+cMXKC9dDflLBodHNBWCGjWkMZ7ZTk6W7YEEQgYA0ug5bUA7uJPxJD+iLN1reD2tBcgDLprpdfdiSEK0vbPgrEIiwCNXghfAUMWtlSZfBEssc3pISrN4a4uz4xDOKc7pue74X+2aIvTm2Mqy36eBkSFh8iokKcYRVPcv9SJgrvbeZLL5dCTanbNjHXvlkth4+YYXYSGDtM5EXHDyon79BI0+XB6yA+LrCv/cSl7pp7EX6MAtofVxxaGWsfuNKzGZWiIZd3vclvKNZOS/m6YzCxDomfzEDrWlD96dD+6ZquDoxpoytU7Z4TGUITIECYicdJxVedwaWNoB3tuNKqIW4KiIXUU5IM2dlI947lEr9nDYyqqDz1co9wpeRNQWy/so9xEA2bPrbQ1piY4ljVwM8FjQcf5qTAqdHcESPECFR9t7c9EhYFKn4oqtzvRP8+Dl98U4QM6sdxCOa2HDTjhgzrrR3O/PdxDiFTb8d4A4OyZVzBAWrh/jUdcRA4UoN04cw3ElwvQ7sGtAowmJCkUPXhyNPBjyiBX/jtc0sLO1QGoaHl9c46j9rnzykHfgWHPOMD8Y4NVEnOI8bXPAsq+JI5/DaKYwUKYcc3OD2fH3rehBvnmenXhzj9J6T8t14tNvUuHrPtwewbz5t9N3z3+8qOM+m34XCdLdiACqgVAAydBqmRlzAMRSJ0l5b6+rwIqkOpegf+XS/QFgMKYFEoOS6fYmKqY0mT2ZMzqTZP2dOd5I8SN9Q9cmEkRKetbeYuvg5Wc/l7dJ1DvYzxY/fQbp9r4j34kmSBbkdXRZbsreU1Qu51F0sD1HCeSiRSCqYUvjUcqGQJ+9tpKFt04lkYF9/hxjxaHbx4c6KrHPJM/phXInIAu5UIJzNLxFkG1QvpGbiSJ33KQ6t5AqOAYybTWuzZmLpmBU9YmAFzmjvOwUuHISToWT3T9QbXsC/6YhUab43auE62XHdyKJnTxtUs4yIcbgWvAIu863xMYNQOrvjqniLiRAYSIZU3z5LNy17gC6DlrjrjChAKeXy3qMhqUuiQYdOSHkLZNx62rGwvzwBIEc0PC9zX86GPwOplfrCok+GTlqfLIw6xkyMGiLGHm6rqbTA7Qpa8jCwp4Pr7KwQDrs2e0udgXMTmfVV3wzUuVWpox+3qF3cC91vZDeJz3zcWynqwt0fdWhUTzsTmtFuQCf3iY4RWESHOuIxCcAC/sSX5sgyV51N8i5E/ADpTqitCct2mt+OfBVSkLsjWhofjxUFwckZNjJ2GBn8+Oi0y+dX8cnDmSqLmRaSOw221LPzyiHrMVwYoprnAZGHuE9EcP1OLfX4WZr0SntQsfu3BhyvU7/t2G5Y47mQWN2ybiEGvOW8r33mDFYd77JC+GG3JxmJqtVjN9NKJg/3k/akNnjEGGqtzDeeiEOB2Z8ShZ5CjpkKUuswLu+7tMtO+walle/0YzSdI+x63qNci8x1QiQ/nVt5qvSPMiM+GCPwtFmhFM2p3UJKtZhZo/UZ7iCsA9YGvNrh38eH8o07GPBiRSd1fovvuFtaREXggvNbDMD4ec3FyaR2j09QPpHx53AbyG4w8vwZtMaMFffg+ncC/dShUFBNlVmRNqcRV+IyaoXoPwcr26iNsJzRyXm46OZDjIkvaqucsWz/NeMnkh5J3osh8e8A3URJbKcxB6WNjU8v3S/khqwzZUJP3LRDAV6mTURg1pGY9HRPdSTD7xS5xla9ps9CnmtV5tzP1OPK5CauVFEf4zxnY653ehQywjNA+I5rw3IkplhHIgbgkQNd15acxoVHW9yfMyf4hzxVI9+h7zqIidw9SY47AROqQcu5QyBQ3/EX2uBsdmL8EJgVAuNpD1lYR8R/76cgbn5QLDKVIvsHlqpJO4WMIFSSu7OR8rANjHJU/lz0XqhHEx7Wi0rdcDoSYQgcPFKyH+0OdHJ9mTzxfDItX4gXNX+DLH47c9xizmFUiDag5vcQOkDJDSlJ4kYtFyx5x3jzgxVD/jdEzyjIMUIgvKT2NWHapYGONdIkYbbIaJPANbXJtOady2kmHsQ2RRTY9RGaTFLR7uqQnf2WzkwRuw9ETVBg6VeJrz0Lx9RZJ9txe/68NQdzqAeyte9Q8Y+VJr4lUeDpDuy+BzDjYVSx/Uh+yZuLo5HdVWqXdv3nR5u2lXvpNpCPVYaLvdCorHnh2CatniPDCZb8pAow3eFQDCsP9rRE+04TaY5H8OpLpX38nEI6Syz9dKpDAEvC9PR5nnOr/qlw//UWr2Q9JvCiaMMFWL4ULI/G/CCGbmlCfAll4EWhdMnNcVh5ZeQSrRma2kxCAAn/KfLjnxm0dI5Crnnea3jGHveKKVI76+ZcWnJ7LD4nYhK9Y7praAqXJvwx+jHM/mzXs2f3XWhy4e9zVgOljL7p0/7El3cqmRPPZ1p1khIkkrfMP1OEP/KkwL3jI/qQplMfJZP/aCQcAFI1kF5UNX2KBuRDhxbIaQF2xso8MuVR5qvA30lS1VXKEjwg4dnfdg3/X1dQtETxSDrg7NM7NSIQjabjeoQDAkwAtmAlFVUgLUWSGcGasO1UvWjrTjIFg5F2c7FUHAYJjRK4RaE/SKzVfkRZqSo4zYy/Tiy6vtdusDuXFiNwNXVnhuZ3A9HZoOVfNa63qZxborCuc6KuNjSasECSVJ8VbrJOIuKw8n3ERCCQldqfYt30DwGEfcepfJAXZfCvaCuPyBLMCsIOwWzbuAnOykWTvmnCbDTzcq/NaWqxZypTnUqeXLVeq4yiAHU5FxUPuDu/FhKfX/5+fuirZHb7fkT1IDiGiWI6zQsBo1wpePExojnLpRHnjRH4M+B8pQTMpKkdqIl7nrdEnxz2OZ1/Hhf6XduHe9AJM7PaHXzwzAtIOANyOqcRQgpbsY+PsAvKczunHIIw8gx1LhZhtNJUKxprbRmAKW2/heG4X8RtJRybPdaXzcABIdI9P/ece7h3AgyY1k7hhlh7V26dBt1clWGv6KnlRgLopm2FlgVwYUHcjNfc9g1AiN25yKzod+EO26DsAaeavwlBq2YsQeGmVKDIiD4OoUegs/wsu27ZUpiLGsA+JAZRpcjHhmp6zQYyxvNVFW4mmoYaudGnqnE3xAojtL3geFCFwNd5ceH5ZXmh1voMfFj6ApjwhIUPxeeHxFGbRpV21XFMeYi523XmbmL/pCdKa+dNJX8saTiYDCbdebCNSAj7FC3mgrajaZkuTX8+1ynVNUQVIpR617GollDT0vsHYDfsDLwOnG9uQDXz2IWajUcaXU2LlFV8s5+vRB0Squd3M6F2AtvLmEkGHvufc/SUpG9OXWNnBHNsNyygg+9BOLOiw8RTBnXhk1UchxtC9PGLbLEFOhycWj4visl0YrNiY6uVmo5owtUs2pPwThkEi9NJdX3BQEFLQvSa+tBwkwFYGI7ZhXQPw7EQEWHoZnaohMvOnIfOEi6Doi2neggJJBiImZOPbFB5dQNk0GmEvDLSQmNNca/O2MXRP6+lQTwt4SOGm1+MmWst+rRGC4/g1ghQJEG2Ehn7gdTTPae02qddmULJhAeu1CwPSYqYqLykWSIyRReRSH/fdaQFKcylUdfBJnAm89LWivk2TWyMOqTK5HW2NOQheeMo4xparIkb/iJxA26wvzigD/pXLI+UD+BOwxFtznj9UM96EuJgBoELPq22jlNjED+78vJihF0Q9ecPxfVn17cPAFWoFNkRAQUcaflmqpKWhkKnAXFEMJQ8iRgc2mUyJEGwhhd0YD/Hk1lJiSWqwROZoOfXMJykKEpBoELRqjBpRO44Z/NsYCKpK+ncwl372CG+jPBy0cpL5eXiRty+89wQiEtPeRE4XnIk8tITUGfajutSfnwz0RyO7TCkMGdAT5UOvkagIE5hSonO78CzqY8eT6Q/uab9QGLcTs5sxKmUr243345QMNihXIG/G/uHckSXIj2Q+56HGnhPtlkxLlmQh6DX9FD0HUpY1NynopQtx/BmrVBMGeDxFWx4hndAOZKZlmam46AO9dSgXK6LYZMAJaxLPc469VkSmtz31/Aut2fEY7SBR1fmQ5/4kiN8sUxQ26q7nNSNuy64nBgrDLWF1Uzk5lGmYKhZN944pMK780oANPrzlStCpWWefct1ZTLB/j3ucoNRQNbF9ReoyFKO0tKpvKjX+4N0rsMgUJiZ4Q6SBjhOmWACI3DMKem87TrEIm27ovTNugI2EO8qTfqCtntJ4Dt9iKTxBhhk44lYV16Bcu19gpycXnIGPVbJQ0gVTdnrJZ+Q22LVYOEmQingAxLu3zJ9fO3sJOfsm6BXnu+5kHmP9HMzDEtxU2EURYzsRqwxxN3YMY7yFDYTPbAhyjHyCjUd2fTmdGtpXZYGkyFCk5mXJZbmr2XyOJHRn8iPkuxKa6Zk3OtFKW8Eh/b72Rcndc0aLZPWgGRqkovGsOomCPUZNuqu0MD0/JiRamNkR0DRWOe3iST3JS0jezsmGdcZv53D5yileRxRJcm7eg64vPyIlJLjFNUB9DfCF6Dy+ykki6uPebQOCW0vs38UdGnD+kN9o8j1A4QoA1ZgaIsydeNqOhCEJN9hBhJDRVFh9BOu74vz7S3KRH82K8LbvKvCJbRUtOpj/6yoct0u8NErsCLoKe7XoCES9wWzhKQqVkWNNZ5FLTfm+nUlZ40tCqCDpCaxk9nLGL4bolnbyuP02qSc1z0QM45NhXna5AOyat1uz1DuZSHtSRfkfJ4GBKxXMc8WqxYF8kJqlRfCVDrheA5xrJTii5fKkZiAG5YpNAfBeDZGHHDWaYYwxY6LYhJjRZoWB+DPee7GGuvavbyurWZwnq7vphESvJQd0u1nzewNb5FLhaGnUQLike5sUkdPzwWN4jwtE833yMPZ9JwEcHE+1tBg5R4Y1VAKZhdTQmVGdtIxVmI915yMABywlKDbaZVWeD0yVy49aSZIXoePu3l3CwIwxpiTPsvHD+Diav4DtDXNC2L7DysmxqCoBmmjhiIfaWCRwmNw7O7ciCw78C3uhnP9j2dIK3SqnlEOQMRTuBrpfle80uit6Nmo0EUH0rFp23P2jTgpcuKgbJ/1GhMi5H9uC7kSOpHcVdwhGYJHqLaVyTlFA5iyF+pIZNWW1I+IMSvzLDA07W2xUPqJJGNFFwbY9ozhCUjpaXoML9JBL64xUmJqHaGF7H4BboLpkYuuhy2DcGvDFIgIEMKVdiDFUePCP8THNdkOgn4TDqrkSFpAwffV3VeUQRFkMw3AZuC3wjB6cQ85+zuYKZFdKmvfzjQnObH7tax7pdapid27VvMGUPzo8ecRqZzrZwiX3mzCMj/rfwd/oSuBT7h9VF8ymu1Oy/ZBp6sZN7jIfVj+2wiDvOZO8+43rvt67+li6QYd+fbG4mnAYiBCtvF+LMsfSCLIIdUzGnoKpqbD9sZmcZSeTeVMB6TLaf1VRqKfe+5GR9BXie9eedjqJK8QmwOy11XBEsTPJrjgCoHoxh2mQ3NJcxAxeldyc/D0/dnQsVe0rI8zjwo/pzQYjw1/4a8PyyLCbIHTlaUf5mw4hd6wuMHQuXkFRmbaFqQ1UExR1HDwm4edQN3uLA6DzTdmJ1Kgp2rNafKYvyfoh4tfHjp3l9p9cB2mF86M2s8nJJbFoJNP/J9NBDV1an8NHR0fFwUOvoJ5ZBhsX+LfPgzsPbuHzD0YQRcdZouZmf7yOUDtIEEqzFBwSYvCD9OaApD2+IpoNZ3ej92ec3vtB2JEVdUewRPrwSkSBYDj+d/bpFuBkzBRXJ7TkRtdpWsTlZJuMGuyGa5Y7SE+MZGlp+uUJZhHpgYyesuhDbQcYr2CL6YPGEB4guxYPFPHEEYA/nfEy2pt1Dwpn8t1MBq7uVKwq7JL9jqVos85HxAW6rb1872o9+yPjGMO9N5P4g4fQ4audfcNOXU5PfAzKTBHpqJIURjdI2/rOg8Q2L8e7/fyXpb/YEV/Hg5JXjeyi3ppK2nEeDa9XEBIZiB++eWn/wff28/nf0iIsJOdtR9Nu9zjdQh+Vnnv4O9la2Cd1zCTUUvzLSz7GFLbh3trv5qiIxxlKnnJWhHLSo4cWijtk8le1mlPxM2WsiotbdGsOJlWb7xROP1ccXH37ZW0/tNy+xhjma7e21+vfCk3/Lf1jmtttjX7K/EBy5h6aXpFhTRhcukJ+bxdXSbPOUP2tEym+niweZkc0pivYmib1+mENSjfw8Y0PnQaLQ80d2qAqI1JbRookTxpOZTCtvmBstdxykgbAesvpCYaoqBu75KlR3Cm7AvnAzYGlz9x8W+m95ljD8Ugxw8juOtpThUAD/s7BTqVukLEODHTAuJ1A6zdbuafovli3V1vrRqJEczX9mlR3Nst3VkmdYohs+dB1zNaU1+CYmH3ybaU1WGuvLVSXJiiGN7fcdYqxtYYPGUuN41CO5+UUSr6Wzi06RrfJGE6ZfQ25Obr55Ki+F/p+G/1P86KMErekaVfSxJ4MzQX57s9vl2xyTphH1rVJsSS5ZekpbJskuGiYpY4ryxjbGp+VHBT22B0lVKte7QhxpNtZNDXtun249AvaCTV1Qzt2i5qqf6C+32tBcy+74G86OTbFo793N4TdmGANT7rPb3fmS06M/W8BYOL6fjEGFER1LqkjErR7EomtfFQjd7TKCVK/7fcZkFi2pkHDOaSh8gTUYXnyknD3um0c/9UP6QDy8kESGHwp+kFNGbBEhKQVtDF8P30jCNQl4+n+rvpOVID4DlPq3gcZ+VbwxfEYhzLXccKEZyHxxbft6OBcasYNSW37wW2L+xzK7Nja4zoAUgZx3gX7sHlPzozbzqy/RAJyHpLZVBQDDH8Cn2cBpJ93mI8sDOjrPtym6hoFf/aVly/30e2fwFpye8ifoSOZt9X05V49SiNrKemPExsbevcBr0ZaXn3yih0NrklH4rDDNWIxux7OQ0bzLYPHqyPWswiCpKpW/agyMoDdLrn/w7plMSxuZ9mRvhobtM8V1J8IaVD5Altub/WxkgAAAA2afGLv/m4//FRsKcv4bNKxfOUkjvza+Mm9Ir/unTSH1v8j8uE4hL4aV1E/v3tu4mwMY6xwbVWgMhlGCsonU46Do7XoULGSAGd4r930+UWDkXE6SmDGnNQFIGKvo1y2qEl367Pd2if9yJUW12Y+0g7dNNhmjcMC3vBugjtDBEy3DM7W5n1vWNNKXsH6v1fdEKkzjlFgbe1VTlmxqXUkr6gbSbMUF27TxxLBqtSAHSaBOTupToc5E49CrN40e4DO/v1JKdlkp6uOtDZ2+XhcPAhndC2UXb2tuBuwqXTi7js3BFnMs1jBXvrdp8Law8X9P4l9Eo1mMsR/kGDCNSuAQwzVhrPt06j074FDOohqT5jyepUUKmWkyOzhAWUbOJ/S0Sd7mjz8EoU0r8GCK9azrQvxO3MaJVO5hQNMHJGBnhluBO3u/muDdqmFVLjjD07qn2Gwblv7fJkO56wU/z34UqZdhjNWp3UH3xj3RHEh4g2x6is68OoSqiezzK5Hyc2s+NufzGElaxlm5Q26IBiHgPDtw0GUlYJjjxXqAPgJHH7d0UmzVFJLx7GYOIMjdqpQ6vtpCe2wdg+vJbBGQHSfCSq8hsYe0UXmCrmP/i9f82biRkEv7j203gkv+nIxP+KeQjjdnddJgmiKOBiagajErFdcC2P8qY0mOxHh3pkifk6YZaKrm7enO89SdBVCqdCPpAKBVeOauEAqxOIfwDhdm8O7BRqjdeUW0yAbY/BTEwnguLyaExcBsUKBV3zOjwWWyvpdBjjCSjwQOdXeSNX2Jp9W3uFnVa+jpk9wWxOtTDf9PhUqYcU5/qy2xTPYJHn6W3R0NMyaS04cvlmUkfBtoM9ZMH6hloNbWepfFPUv0a4zbpXHBTNnla5SrHOIP18657U0S82TgvK6DD94y0m6vAP+I2QNdL30oMD9zyg8hI8F43a1fKSIb4pqYA6s2uOLLTn5Tr8xmM1j4lZohxOplw+xsHPbeF1gCm9nJV6sy99MkZsA17p0abbvC398tyUNrcYPDX9Y/L3kiW2KKlht5QaRYtkuPaupIKxiT2UjufljfBBxyEwbEH6DA6OmANXPimUreIpz98vlRs5S6d4Eny27AQ5xUNJxOT8bnxD9kH1kpGn6CZszRZvJs1aaUl4tZz6xpSR7gvDd/RA8d1cFLISTNVn5KuOIA/OdPley+VbouYWmylPaB4jbsgxqTWc4Z7YPiO/SHC+DZSXv+qgJK41JL5GklserkQe9hMCmuUAHWZFEy4oHm8s+QOtd5EgsuXpfKcVaQEts2LDpoAtVON1YUaS7tJwcKnbem0HT+5C/JwToint9xh8vMVHDydfJjbl+WO3VWzSBmVZCEJGuSovoGmq8Epo/cs2r++ulOYLJ0YQVg98sr5aiRX4uyhNGdjTVWG/UO2XjrAK/oodkcMRtv14gYwNpKpfi/YppLY9mPK0dQv6YK+v0knG5NhP2hh1n98AW40FOeVA6JRFki+TEOfyFvZOLnDXPiceROl0ofKcu8VJNRsYzMR1Xiv9/DtH1imckp6u6jEQHcDKVtFkoI6yJZQXuv7yTUtDswVDIja5iCC/xJLwuAUad09oeZgK1DGL39kyweLnZ5+/18Hp7PWxdXdL18OAMUPAfXK552/poxpEiPJsnM6rsg3AwhLuRNPh/yyYcYEXq47Vd5gRnn0+k8XjFQYZwzj7VmR+9JyGMHQLsCspzRv0sC3/yy/g24Az9b2FrDOyvv3LBvlLx21D+xEp+K16C7Kd7/EWkSvibroqPE48r2KtTuRo0VrsxGtTGzZ877sH1dCpnQPnd8CPYpjJRvegh/9pcSf6BMgURki+P1oXWFFjJR0pWcA1aNhNX4MGBUfVWhD19Vz6wF0Puibf8XvQdbvDfu0KbmKGqs8u1PzB1CjYqODhF7jmwRh40SCsvdBEny4Ewq7fM15C6HSf/G8lS5rrSOHGlGGqeJRzDW6K8DUJ81MK5PPu0yjSrS9Pl187jLqE/xFVwJ7dIiQ/MUkj3V36m+evK36oeCGgXRyJuqKF4nNS86O4YNKT2SJpNQvxHEiw8HA1A0q83vVk9tEcYCwpD7fs9kDpLWpsQmelQ7BdB9HzfK6Hl8nJI7bhgjmxe6uuKgKgaxcHo2WH668HqUcc7B4rduXp6JI/rC7nSJ91bFX9jmJPogaDUPlgUgSGI+eTn1h46kP+ZBYjgynL9nLTtjUaYC+jbsEyS440ta8q408L+4y5h7zIJggz/BWS7AP8o6giWyFpdigRfKbaWNFiuIA8LMFyz4JmS7gsDqkrI/y2ScYAuMdUj7yRimkZ4g9tncltsEEZqv14WueRwTw2sO2VX5bioUQXPMkC++SokWt9EQav+fv/n9gvyJkrGGjEP7NZ/2Adt+7Ty6IOoVFkSMDHw06jWGNvjFQ1gJ754cZ7BZgGsub/lVweDOEhOehSlXj+KxCNw+6Vgp8YcBNjM9DBjESSNRZlEoQyrnc6szlPlzOsRobpjEsmWUv7kCRhC2mOJBOAQEi8sJHm5B7hZMNz6360YwiqFFiNKoQll1IFmzJVqQvF1/AB+DKdij0nEc4JmFUUVu8nmmXrE6U7poa47XSIj/ao17PcK9QMVMDALYeKxSIC/MRibUxF0JNCSeRFiGFymZn7xBtdDinBUx9DkZ0mGHmmZaxVZ8sAsPvWwuIOs1EdUomQZpLszzyzZs0h9MxY8OB4738xpiS9fbR27CihEuliubpKB8UBt+pu7um63jCd0LOBY/k3XfffVilw7KPNsNG0h/0yrtwV0K7gEuuvsEKSxHUvib/KcN/C7xU/kx9TOqZnJnASObvhRojm4UXx8L1RTge+0C85IX2+PYI8rE+SLGHfyUDD8iYAFk18yI4jkFx75UXJLpZwmUhMWVl+uPAdY/pnVKV58Tl6zpCzWfeVcpypZbx//bVHMIng8dyD23yW0YQsqVIgXJypBiEET5moK/s56w2aE7tLlrGjMiJbOB5XIOjD27Q2tBx6BbrIO82+t8q7YkLCiKaqs7rbT/NiP8o3tSte7+C3v7G34WyYaIwn/vgfQOiVHs0SWlBhu0HRXWFXogblm0XwQngGfLFyoUY29xFFAhMdkJpd/jW5eahJ/ponlDmGWl7kxvEKmCw5+fTj3Am9DPBjiVXChLC4hmifv0cU24iGDI76zcVeKO/WEwHS14CzRuFf/yMKIVyjRdsWeFMu8k/kns2bN+tnsI/9Jr7B5mMEbu0KETuQbdVk5q9/71iEiIC39ScceKtAGnVJABKLWouMGfjhP78uVQq1Kmq1hZCR9b13gBs0Cgn8fQCalQRV0LxpMykh0IZPUnPkn2xURPNaEeVKrPxBTb8tGw7k2XjDD5qshcQe10wNE6guu+kiuAbQq4PECb7ZSjOg3LbdNpYZ1ObIrR8AJr9BtPuBowOLkkHkjPunOfV5BA/9xRnz1XtyQQd4lthZx8L0zcITtstMwnoGqa3ZSn8O/26wD6CtcrLTNdntr+/F/tJjSVwLjhdIzjenhbzEweANITaiWwcAcFxO9CfR2yC8XtKB/gasCr71dJN//PkKliq2BnsbvXgRQThEhrMovqY8ajdHeSFnBguUwVqjgk8piU7Rx6RzmmYFQdkHs8rSC2DQanDJArULRLso+blSPFeWvLtczOF00zM0zgX6GaaC4bB04uN/odJXmsOTT5Q+XVvJPal/eQUWtOEeJlcTafSK6P+SV6/pTmW56KXMq1W4EoQUvUrom0RWZU6Uzhj4vCTKJcu29OhdXOCADgqHCIN/ffY8Ex1NGyQLuk+U8F4WIdVSQI94Hd1qbb8b+WTvvTBFIwSxLsr4aNPgpAV9uIS3qmhEIHUoRK8y/acfLTIj0+WZmsa6wFXqaa7gZDc08N31hltnjair4ZRwo4Ea9JYnZEJz7bRU17W0oxulUM4jlvAcwUmKqp1rh8Rs6V/LQYvJmwGJJJI3/pfwE7mDZjD5g03o8uY1idnMKUZU1bwqd0x+JQiYleXVKBpNLFVfsMBLV4cXYLmdMSKEjF545UMivv90lvtbh6iPHxHXvTxVylSLRJj09UNP3pz+SEBm8r+J7zIF/+FZQz9M0CX0wzNY/NBaEY11DDJXzAGS/IpxK2xYFaV9rmcQUq3BucOYU2vtKqEf8tLE44FjQ8sruZ6ZTBdtMBG+qQk0yqIx4eHHvHE0jaDSVBEID5HtN1zLBQbWDzLGsTR5GFJMWrmPs0cfUgqb4ge8FG27uKa4FbDCx1jlsp/uGEZaIY2D3VUSTxfplFot3t7KEt7PajxR7KeZflELOzm3PrQo8R1HSZCPJ0gwec92qI0hiLt+UpfUg36KJKi0bC+5GRbVzXIvzP/Mt5xvKKVEVi1j4/lNCC/0kpvaPUPZ/McVCUXQSBOLuht3aKPs4WhFGDTwQWvcqUe++S0hP/iNS4phXNIEmnmhAj1xQHljm+cHUric/5xn7IElU0/GzmMXnOlxwklJ676Q8Xg9rXVXpnheWHtSFA7EV3mOcVU7P7cg9U+mad48t663speMr7Gr4HSM9YBnMWYmuCFOdwr+7M9rtJCvXIOhztMvga7PrusCDJIw3+/5HoIcKreAOyIy6W5pQy50Cfj8sk0glNveJFJB7h2aqdvbizFSMDS5G3U3uaEmRqC68/Hu6fnSaZzjku5/rdC64xqj3z6d0uewsXcXqIj8lHmCU2oAoBOg1ZbCE6TNm/YSw6WUsUZENlVzELMtHWEtWdF3lTm6Oqd1EVk8ZiJ5yL5ztPUu+Q4BHCL53sUhTOrU4pxlKSLX/caHaZtj9bsA6mxPIhmSJPqBXCAShvd8zXf27/uCByOncYJs/lt8S9O6v7wNE75tSJhEdPYvcpSn6JYhyI/gddPZCkx+ICq7uHbSATkDZ7s3UbxlV5JCWIMLcc/BcEMh2ZXp3vIiE6o6rOl0Sb7Yi//7rIh0Dqfk+OHA46iXrlS5S/2Jy3EGV4szA90XW31wSU5QHzCcBsGLy1Q9SMLCx9Un/Fug3f/ntr5T108ZqgDKv/dWOXXWgVLmeePmw0Wq24md3jCpYSM0nGS4VlDg5KTNmIvzho+2DGEjI+oyH2ZXW8a8kDmszkndi8ukrY0cccLGUjOuseqhuHyZZY7xf2BXrK7rp6bYaywFyI0sLY/olvX+SwedxCx26pnHDRSZNE2ViNQEFtAgjW6sCJzXQRyid9gbMkoMfYvvMO21PY9uqPaxcxzs/uT2oAhc3DkNFnvMggAlhRkII/YBvRvPP0hkNyjAI3lnlykECUgRTFcuuMV31ApN+oo+tVmeDUdB5roOO0fGpctKoRN5VYVeOdfa4wxnvPgNnSapTFhCp7icTAOVvi9GlC9Ca8NeLf9CkxDIxblLnk8oEFhNRww+xYKsFjOxHl1YKO5F3TVjQa53EPWCvCyjZ8xg8UY6QauOSxKz7xjZHdAicOCp4+G6Dwqe7l7OYW0paUio1SZZqHWGWCZOrNfQEB23CNQsiojrwNFptsROGvlWhaOQWmosK9wgPPEmwFF01My1IsxanL2gnPz49yJYwU+2/gjgS9AfzDwj6AZ9x6tROJtNg51T5QC/pfeSZvk89FR8efGfynLc9iL3YKEUMfOkM6jBpue6bL5z7dzcwnMTa8iaG6qEJyeko41IOyeOF3O3TB1OI80cOIs24DGsieYidp3B1dZteiE6uHZLXIF9wXAaQl422YsQVoR6Hr5cUdgjdXwfPNdPGVVR7DbGlNrmYuArOfmRsL0v+MP1UvNxxCIsKyo27dCw1kCEd2i2zUBYja2/5bLd1XcGkQNCoqW+M9rNexLL2CO1AEh4dCw+8eFKpg1xEMGMhxk4JaWAO4KqhA9umTapuNTazSKlWeaj+I1ELwmfPQ6GMI+SUGQOe8Gir5X8EiklR1ijITSRRKXQx3toWAeSgyfK0dgphyHP882HpKY928+wquMuXDUQKDPhwvRft+V9Ulk9Au+QfjuGpE0KOZm5JVK/VzD+7WaI6Ft38/dLXdcnZy99jAcool0OCwY7MBrjcWHwh73dqH2gR1x3cWYx1wq3l6yjYFTp0jafdQXw3FrWhUTtub90fQwZb1KLQLlplk9GJVcWxF5JV97gIzOuGDBmeePy7BR3SjvkyJR2Xr6NZDjcDNMV4brYb9cqvaA3kqZ5mMHYe5tvsBjWvPvrbR/XnlrzvN7uu6us/rvB4uq0mn0wIvhtrpmC7w+R9NvJWW6lI9bXyLzwjfJ1lZeR/f7ejFb59hKN17xwznc2WMxAfp4oMOilacS4p0Jc6M8H5eusWZMX0VZXpXb+x9uc3+E1CQhzwme0h0prar20+8Q+Pt3czG5KZl36z10NNoB6gJEUPfEC3VswQyelKrKRq9qzgCynniOTBwpmey/mEiE4kA8X/fPDEE+bOO67R8h/X5qMMT9wKL3xG5dO9wnV98k1vrr9ct7W8xeZDAoNCtRlUnhcAF4K7qIARuxYpbqpDDauxD+Pqghsfc1Kg6oonMXNwdowxRxUp12ggFGML1+Eg22gJtxHh8s3/n5zNfTAfcM5iVuoM587mR7mZoiMj6Q85sCY+K3tXk2cC7StW6Ab11yy7lharq6f9CmFJz/+6aw5YEpC5r46KRzTBLG7+yNiHZHQweHxC1H1ObPTkuh/N5vJ5P699y7OmedpgAmrdanK2eOuUK29fNeNrO2fdc+zbBBOq7zzizSsyOnoG9Idls39E53v1WT9hoMzmC13J4/4qhW528Tna7Oik4h2dhOnacDPtd0aMWxlNlJhOpkXP2ec75Tse6ZcXAP6/2nu50LEeNU8ZdQeEPlbvU+MXHw48QcvXEY2CQRCTm9JtAI66MQuDChyVh328/AiApZHZgrS7GYoxpYkNRfahIvc8kAZwbmomGFsMLV3BMOM5l1X2ZqBduvIkRjvf1EjjkOi0oXQv/y+nwhlfbDMuSwwk2TGveS95ZOOYVDKVP+FTXGo+xYfa5vvzcXaxahUSXlDkDo0cvbBCAsJTkQMQ2GT4aQst/ke5+Osa9TIgE7SyfJ+xBz8d7qc/2n6ToSrvS/PcgKLQemGdMiR45LNslBKv3gRAedtesAVXcLhZkWcMqF3FNlB6+ZOsVRF9GOIKyWWa8SAf2JEJSPKbSX4J3zK+90lSDo0j0CHp+Cr//pFSKTdXsMTbqdeyoHTJg+XhUeixrSqCKgsqSrMYPeuKo7GkaRKHZfo/ClWUkj0PEXUG3dxMD22MbnStCdOndDgzzP5xmvqs4DS4JSR0dDiQDis8svUmoFJ5cWRU6vAbtrHp0af9DyGfpmGqCD6kIpd/hteoF1Spd1XS25TGr7ppIz8iFV6206JmvbPJcUaDXDrh9/zcqPhMcm7pknXnJvRrG5Saio9TJS5DIqpFN9bV7soLw6EIxqhwEgVSflQODY3oIokv91QTuyHt10mcOeYqRRr5YJ+C/dKMB3yP7igKb8JIWddZSwGHpTpnqTnn3DkBzI+jXoySbGovVjW8NjoXa31/rlkzUqTeYKnF0fzSyaz4/8AWiCrX5xFcSrZp082/5+ACmhiTeTDefq7s9BmIVt5wcsUDdLYGvFvuvqT4h1PVTRy40OMffu+acrlSzbEvpx31+33l3TW7EXaSer/YEXLEkSQdmA+FK7zn3pCnT5M91RuIEQR4/W/R/S0c7dPbaPNfVuu+tU8q/qbncLnqO1p/N8JK0jfDJtCQbs27SUOMxKqCJb9XIZOetl9sX80I1llNnZNl52L7Zfec8WZ+vkHorovkgfXZu9pXNbg/hqiU0R1vOr+6RKvc3WM7utzB6r8HghUt/Ym4SdA3SqNkHsKTvEZBy8tNw/+0IWExQaDxhdYOlj6bZUOwbosK9TPF6QMG2f2gpwi0qm2+86bBTrVJt5Bs7dhMXpxY1IZg7Oxy4Ek5DWs//BSBhtFT32sPF9ubIf9jIkiO+FeJnkKqelruNxMZOtYcD24Xb9HUojUzH657S6K4sOc/IFbE13VvN/PaI2BAvlVtmXXDZQL34zSOlJnPVmxBqW7ryx9dYik8rhnidpHORNFite6sjx6VpallZWoaMDaoG5QjYuK/v7qT5UMc7eRNUOgtvpqgFn/O4X1UNeVT3vWYSR5puk/1MOfTsWLk/uavKeNUxvuJRK3JWMozTkV1C8Xa1m9uhd9YEFZH5tLmLrNbDn1XIJFa7pvO2Um/Yj5q1EtpDowQJtObjEZWlBzhb3tom/wEQv9Q6p/HNUWutcR5v4ddo5T9Jom+/iKo7c6b+IJLatx+2j3vgMLUQtNr0WBNlfXi1NHiqTCSZVOUZ9kY08Sh/xmo3Oy5Jnfdic4sOdKESSaqDpABEdnmj4RQJ/+1d89aIHDSbv6oamAIfdXfSqXUNCNq7fa9c17YE5PsU/q6tvTKKYSwXqV7ZyTPJ9vn0e5RFLsjjqTn3+mn8yl8AN9I9qIqPM4BhOJcWMFkkvKPWmnpkLhd+h0lw6bZ6SRwh0T0+rMBZR4hlWRvtvA8h5ZuC3RD+34B52gHbQdDi6gZoj8FOrh//lUz4GyzkmTlgZuX2RzoURlIYun26Upz+En1jteVgc1q5N0l8F3fQ/C1WtL+XBWf9CxfU6r43Tp29dhZvA/77Z5qF3l+21K31L4D91NYrEOLK6LuzmFW7J0iojBOIYXUvFwx9rNT/lNwl8R5mHr4RoDze3O+X5Ld8tJJB/rcV/EHh60Dts5JTfYX/Vu7E/iBl3w2538nfe+om4InarTqkHG84pUgth0KIdAs8e6EUgjw4X4PXjntq28E/vkuP01/9ybYXqYzgu3FdHIl3EcMqJMhpmYc0KMSXBPv/ruAY6vgz1tsBbtLrmQB/E4Ykdbjc2NjN3pcSxGpgbUX4a0BHLPMaIVAqrXHwcE9owYFGTeALKOyFohcybwERs9g2WC86lPoLOKCF5a4DZB7d1u5y/ZC9G9KOizS6DbuVweiF4v9eoaSFOt9pQgVlbrCK12Khg2rOl1meQ9nStm5iBzaVd82HolOL23lRtZlgrd7BQNkDcNF6kNq5kZT59sNtVCJyOd02ZqL7MJM8P+NivJX4KQ9KCz6aIlCQ93AAQap+rq5TGAyhROTXa4R4aHD1OfGaamnwBbVeFyMvHER2F5fjA29yZNeWhaxe6tJJPYlGw3qfV0rWZbyGwonSXGdSbXVozlXPCzSGF6DqoF2y7itWaWDMmGBeeS4SNBowx6VHmdu+4J/MlmJ0+0e9aM9JOtejHcAj8qZ8z3xMfk5MhrFJeOPDFxL11Wb41tv5abCDgE8x7Df2Ilo4F5+laLb99Bwr8l3qENwmgRL4Bh9gEI7QNn2sWSloXS2SJtKAPdbj3GZutBEfm+f+6m4xjJAZpN2+GiG1z8V2bWt1Jtbw+S6uuNBw6Ls+L6blEzUrq2IewqVsUdzefIlDSPKSsVTW3WXgq4pVkI3Hn0qxZgBPDMnswgif+UF79+EgqEFnjhY1hRGBzJjX4wDdc44ugMnsNiy5D/4++1OyH05iXVYzWe1EjJZKQoUSApyhGPmaeSqlBtnTkjr3gjgOoALe+l80sx+K85Re51as0lFDdkw3e7/9g7L3bczYbzdHsjzVA2wqmot1OPt9u3YBNS2V4ZyfDPf/9QOL3twVod8djTWiZmRD5QyN4uhzD9gcuLUQwfFPjEnVBIqqil/mhrlWjVipVZhzHGeWFRhla6o8TLnXf1XdeSUj8YIw8hIy0dGYG3Uq5hpRCmS0e1XbuCgGAJmmOEIZsmE2x56v8nthNz+8G5rUQsbfq1MRPmUonbuDQr7kNUZvilwtTQLOTl+L3kgOb3licynQjrAErGkcfonCkQXGvLhiijYEZPk3TPDueN8whhuaEpL6TXlY4SOVwp6zuujnBlty+SZ02/xIYb+d27nf6LDWG6RmpoNjfCblpHvK6Q89DHZw8IsjSEtCpkK1He6KRXvWj3avR2qbt9ephQ61wPXuJOQulvEer8wRuF/7tq7o+tecJzsTY4+qEzvXspfWgoxTCOwcUYj0Np+OETL16APbBXpseZyQF68GH7k/WSet92Wbkz9X8tDPf7E2L/NW/5DPxuG1NiIuOl4/4fvCkdOo+OfG8NFxDb33RKT2997Hw7AbC2olJKy7hHncqdIo/WKoR071gjcQZT5OY1+P/FB77wV/3g8yzO0bjZ08VKGfshBHcQUc5dNBK/8lo+vPGXn0cOYe9EWVVPvaOS63Qxj7wu4jD1UZAWdLnW9m6WAiPxk9jVpdyhyw9N6MnqkJft7rbTls8PE8QYSgU3H9ruC3KYGFNecy3iCt2/iTbQmE2gyH7MYobU1cf9m66YwfK7lsvKou05ov9vZJD0HwvP/5z4PfaBCBaZT8MtDkwQTbORAPyva4CLhiHllvplOqKmDdR7mSi+V0TEfrT2MuJyiXMg3kj5oBPnpxhZCEYuf66PKFU9qOQiB+u52FFyBY8krPwovPvQmduG0CTRU+0pU0iI0rbj4ZL/mkxHWh6Do7DuOQUsHILqWol6kzuIOOE/Mw15/qv0sbkVm7aD09hawOcFkcjDwZbBainZOzl3K5vXrWXhA0odo1oIDWh02OZ7/OBMQ2NHFfR2aZ3dG8lTbP9bCKbKUcuF5hl66hy1IjgSDsP/Q08np448fKwnd0uZLIZQscl6K2LbCQMwP3wqYKhvVYezWx9yG1ZciKJ+9BjvKr1FLFnuMe8K/FuaICO2k8kM1GM7Ds8khL5Vt/0I70iqpAIz49RRFPTz5RP+k4lILffM8o6gpIengzLldlK/TtF78kpdL0QXbK9r3Sd+YExDx5/jzgwE5H+XafqDk6zkvOav+ubja1FgyBzytWI47YfjLq03d54mcZ4+ikTDipzsTQOCPVNqwyA1krCRZY/DJyViAXDy3gYq4vgMMu4i69o6juT+99fpcioxoRD2g9VZPokUOMgD6TwHYAA9SbMNPSTXGs5fibVDeVVVix4sybro2ATR4sCU62XKzUyErr+I1cpNZjytg4UVyrLwtKuWbRY+w70U7/UVT4ppU2mSbFfHB9TbTfPWMwVztufwuNXNLopZkb7/AFaWb1Eo7hx5qa5/KHiMDyPiko20JdkA38M+lL3FaQXQ0pkNV543tWqRCavWJLqYyL5iW+34R5Nbx09R3mXG9RI3pIONwYtIJ9CkrI/M3deVdllgRRzFwmexUJ46aFqW8ooqBLq0vvlaJRNJwJFOMYd6PuF+q5w3JJf1pD3HmKxOQzLSPR4P6gPwp8psHF+jIshR0swCv0PFA44pGAoLs5L2n4uKw0iWW3E5T0kTuayMcMG0TuPfPdS57pEUxv6KfaFtcRbSjFBAi6x4OdCBzgk9cyyDIzQ5hi1hbJvtXhhFEWfZZT27T9I0zskuy2irliQYD4W7KMtrGxYbdr0KQh2pKcYjfCQCWHOhDcCaWDA1/yXXrJW7wyqoneUeXR4uMBg3ksAmT/CcosRwGxBEbnW0UN/F72qIvQ4af+LsU4ZN3O0zm3N5kuoyiuydTN497s+pw58/METK/LeNiqKD9FIPHkuAOgoEH4zTW4LIDpEioG+3XO/C1FWHOrwFx+yfthsCJfOAtQ0XocfZhcIlfJLNKgu8xbD6GFn1GcJa58uiMrQqxDt/DUPEAHbml1rBtZhdDjEAiwynzDVRAowycOeJ8KQyvEmKrmsseaeSOgmJXNkyKooAQmrwEbLytxsNJAZelSfIkFWFsXGb5BL/0wDHIqKSKiGf5GdT/wR0lSNiMqJXQQ2V2qZ7Z6o09lIX9e50T+HxpJIciPRdRIH+BpCbdGiTY+j5KrMm/Y+UcQEQ3ay/oQaw5EzFPqikX3Aa88gON1HrBPmXLtH2u3p+cxS+ztCmotOm6Odllz1iMpEPq0Umetqw0ZfiuNG8Ka6SJBWUvmbvXM+sfsy4OVK9C71c0+HuBrDU1dSPn9mbfT9sehENSuQui1IMtYVIH8MOM7Y9VZ9FPkUq7AHZeUNsZAoJErT9wrqvyUEHI1PxKGuG4vjtciV1tUcFcxYxNkTI78Nxwxd0hh6LkPp5aMRO9FbrhNQcTDyCkH9yJfXT6/daWTsFkhw6GwR0IgaznZjlGz2UrOmmUmov0CSG7LNc/Jtmkke/uI7kInx5CSMMoyV1blLLLMuMZ3SxekFfECRB7aRg+SifnRanqPJhMve0UpyDIPMoUkrrefr7aso7c+jGwxMvPu9PnIYSxChR5hD1GrKCPSwOBWK07wgHHxlboOUOXoA602WrQAujTJtpKef7pnT+MyCeoxvSGalj3N923ZsdqwHowC//VCb8H756KXzcz3yLNKUOdjSfygjvZWCdL2DXh7OQ0K7oifoqKjjE+hjGcN6QMok4S+7qBfQuKvnsoMScEghzuQIkd07vbMkVyuuCUqFjjfshtXtZIebdPfnvgV9+1PXim4jjHDvTFG3rJc6LfVLV5FPtlYZLIpMatSu3h6rVBCUVD3Q9Y94PMC43/cI39Mp5H6H1D7HmEdKXj/ZSnqrDRfv8caTva7P78md5V/pQOh7vJ9X8rmCD3zYAkKk3UxkclXpORqECtZ2q1FBUKudqwywf3BVzqV3klN91YwY7MPTUWp2keZu3sg7tTBmGKfntRWCVt0jNUHDHH4CdE94WveG6eBf/f8ojWdu5o8Pf8gRPcXpl3H/DNxFJekM92Fa0e9plLy99AHMWX4aUZ/q2f5H5dVa4thDPpcbkGT+j6F+YUsXi00I+QkCO+J9a1EzqDknrkg7eUeXD3VG8trkcOgWncI2Qrt8AmTpAJFOAVdvs24P8rMuynsMy7+K9AUPmXqFKX0V9YoLZHrRWv7oMKokYAdsBPbW++xJyqTM/SkLoG3DVJLko5x7TWqGvsGxYlMB6pmOc9os9n6vdYcLm0oScQf8ax6DnSPRWzyR2TJFSOmY3hWCEAbPU3nfr9nLaNOoPlHM38YluoZ3RSSR57Iblad17qFuuNHWqlOA4iXkczHn9T3vWTrvYRk9HEW3Q7cgIAz0dpBqLia7NN6s81GSxy8US70M15DBU3NQrH8dY0cj5jIIEd3gMmrK5Z2QGzrw029ZzI/9KDKqp0AK32pLLG6sEpYzSksjySvnMC6CAGPVTSifUvbCIUnGy5g24/h1npaX26c/lRAvjZ3pMUzSsttORsAFWsKAEmIt975oOV0x3hrzUxdMZOhWiMyMnNGiQs5FGT4tUeBLrOH1lz7s/IFQyCgbiympQ5cTaGa8vZQIxEPEmRFqkZ8Fq8InQpdDq13HO643u+PEaTE4z86VQget1BGB/K1NKo+3wWYSNj3fUY7chlvqOp4IFRJllp5orFSi35V996ETduF31oelmnOdPDIQdj2GH6gWQuF/MOwVCq6a8pb0soVEW+zAVVnXCIifSYCM5zGGJjkLrsgcEyhtj15xb8WzhXLJa353Ccn2vzEKPcS4E3Uqz3a6XZF7/tAIo21ogjeJaqyeSSkS32tBW1bGMMmFiXvN9ghi+1326EVh8Jb7xkAF9+AnUvqvUKNL+iaLkgQghOrotEf45Nn9AcR27+N1ibbr0+JDRAyCX0HxOYQmXx1xf1ub9Hs9S5KlmimwnCffGFE6pga4NQ6Iyb0iNkXSleSMNxu6VXbDTvmNZ8iAp0e2rpaihV4sWJCzXqjOr6JaxX72zSqxjsmzTn6CtxTrqGajkPWX/Lgk0KWrEmd+62mJvsUb/zbl6DDazpbBhTgsL77pi2/SENyFTkqhf79G3EvJJR2/cSK8p0AvKL1PdLuFWbU9RQZHlJbr/Sn5x8VJsr3axyIdh6zPYG3nhn7e7JGIdPgVfkLBjF28w+Yd9Xmna/GSP4ETM9tAGHfGdCq7uf4Dp899WCgzC2qkENtECGZEoXd6gb1wTLLat8kTAdRzgMv2tJclRL7RpFlrJwuqdX0446MAhrIkLWYySuPnic48dI3J5QjdL6xsY3kDdtcvmwBXfX1YAfaRWWoGmJLTemltpANnHpmlTq9P5rGbNObQmXKdOwizCJN8cKy72PLsRr9uJrrgrbEmFS8j7AHuu/gX7r9hRRcKSsIGGp4TYuzRji84teT7mg1ShWVTzIfLHCKiHgGwD8crX8iGgGW5RKfJAof3G7Yy4NMwoIlaCPmaUefwo2a5sVZtTzebjOmqqETfRBptHG0pDqqMPnOunCv4haWRZY//Xyi9jLXhomwXycG4dbUp5adsna++TuiE9G7TJiRb6lC+pU+avuZJWNrRFLh2aUVbxbcU+aSOERSxZ1Jlo+BBBoEL1/AghRChUWIXLXEW7uRwCjSS5rhf6NNkLa2BhC+JfCQHbrzy/9PmEL9+lhjT5awtYhei9XWS/4QSdOH4xDVpUDxzuuGk6xdNr7yClUfgH3O6IRoT33hmedBztiYToVySIw+ukJu2SDWHHjQYtsZkP44hVP72DXWFcArKr1zCjuEOUNHZhnWCcgt7ZNXjNHj7okNoQqg2O1P64+Z2V7qmnp/RxePsZKbX/QyZTY4/wGjw1WbHnrokvtdfU39BHKiEEf9Ca8JMnXL1tf5HCZyOtQOY6M4j4A+f6rGOUt+gcgxIg66FRfP4sRcyxvL7JYy0mV5Z59viO9mr+JYQT5F5/UJQGdzyI7mvD/RyOk7OfahE+p43wYiskjH1nWKvaBjHgE0uKm/WMwvk/up7A9MwWV+q3dlbRfb05RSEulr+SaAKePBZEo3vtPGaiurnZKy2QK9IJAKK0imupdj6YBj9BKtpMG/9Mk6VX3Ll5u5SDVVw8sOMyvUxEf2eRDleqlDDRZBM+fxxpX47P2y3aDEyL76rMYjr73/m7S6oOHvQrqV953NLBbskEmzaQEmrBuA9TMEIwSaRqaUGqV/fpoXsn9QFTsVUmdeh7WcnS48BYQDJbAxlqT++J28xqTiWjHd6ykaexIHfTfPoWZG3q3GYV+sx6TR3X8sKEu8fDMjPKtiAxtkBr+X528VsiZKEPuUsK4TpGlGBeMgT4LHpuUWwnlII76v+KurByGVcFK7d6T/J2olDIw/mqBb6Z8wvPjIRRtD9miY0247wrKaoD5P6TC8pei6wQZjwh5VTlaYLBgVKgkG2A3QxDOyfHryLRvsr4fmK7aV99FRIz+9kDHW7/5+VvmPzIl5OUFn3/OZEI0hq7stGPogo/Xl3FdlKZeyLBGPjkDSCoNmscR4e/CemlXjz+fGvuQuN30smqQ9TEh0vitwyQQiAfPw/11qYy+Pdug81I/iwGlrDfAOtl4CsemJTEqwM7hXkSBHoNZM0/vAugBxkkrmZlxUZKW4E2xw8NxEelNCc86tzIwvbKEZ8enySPRHYZ3Z84p6CB6Lt0LOyu6Mro0Zwop7nrv+H21KbQlpx9aI9TdX8E8rrCeYsWfKp5e8ykZps1CeCyzZGQBylVwuOFROJGM05pGh8ou5B88fs5cg4Zn0N021Cx0D752eiPPjkhzHv1jeHM2eQ9zNcsgQ67+RXpljnflsGOzMkduQHoPREVuy8zBTgTQUHBVw46vYsUL8W1NEVgjl33WfevY8iuMw2/t9hB5C+YutKVHT8AQtYeXzh8G82ccIoptkTXRU1nMl0ypPkBk25uxrGEgZe5ErvwwE+rnBPF/4m8FVhBjpLeYA4hGJC7evQJn/Z8xiNHSbZemU9IXIIbUpPKekctV7f1+yMmQY0duylJqu/TjeWXRnOmhidnpPfi2TsTMYicixWmKYSfCW9ys10wQWJYyAYvy3n6ojC7mxL7aVGGjgRCYuggIl53p54LgDVL+fORWAdFYzm7jgNAUe2iYpR4Mu06IItWgQS7bvT1cKgwVceMVPZhm0Y+69C/h3z4hQ5+Cd6LfaAIxruCWeJfP2lMmHYr175tOWHOffU7CSNkwsbboMB292Z7BgpFLCxBavs1/W3b7cRoZRs4vIknmbB3s8z5KjEEymhPLSWVlqa1GMqhK3ulTLInCDk8l2P0Atjx+SbRlM9yGC8VrJ61SaJbTvUKHi3Xdp3pnnmo63zNMsGWpwzMybM62idkhl2tNULnkgnMyVnih+m4lGxzXJbgbsykGFRxMOcUG+ayaIldtjX+eU7YYI40CKGPimykCVciwQlXhP3QkgKko2SS5rfRFHIyKWnWpO4gi+ii2FcEM0PeK0DA5TiFG9QkZe4GKEX2D++9jnidZkXMEErjt2zCVXyFaxE9NLlMQZmRfajCPzQWWQWHGfqSie48pyjVriZVCTop5MurhRjNUctVZE3+H1iOAQUhkl9Nu5ojVonG/pBDg1SHyDEgS6vpyS/HkZNUlhptmyT0NSS0zp3r0SJ8kY2ug6XevyU7JUQnhZFuyveSFfqkHOGry2e/aYOKiqDbCOnRfp6eanAKU0lDYebW7bwpXTiosC4nODtf3X4u4ib0KqJyI9GY5MZImHp0OecGdaGOEmRKpn11RBI1fIaMSacwzUZpLIy3u4aoUUv21sKmrjm+2Ar+YPfNrGEQoVeTAJtACl50/W5JoLzpXaKB1JCZRRp67ybiNPPLWzjGaiA1N3t2ye2eIyBi2Tvz0WeHAOjmeLXKlYwo9rlFSqYsDwlZ5LAvXAiUVe2AztuEol0DXu9PZNCfvxxCaEM1GsoHQZuhPSNRqsE4z+pOxTYtTG06d8Rs85gL2s+3+wl0CucxSNAbs6PtuQ2EFSwpaukvbjZh7zGkHISdQhc7qRgEJi65skAPKWkOERGVGn0cBUtQ1JHEhcdxXDzeY7uwZCqsKnN5yiq7yq4uqmxfDr4GpI0bmJ8tBvYh+5ksXd6r/DuFqbyKYQdzJxSYxso1vFY0Gqv1uzZ477nLZ/E+vDU9SIPSArJfolW+gv6sr8QoXW5fryavtZKgJs1iKUXtbf3kA+MYKPxWeGbFcIn5+fr/Bc2a502BXQ5roDzXRtysqu+7Uz0opZMQAnEEDShyKYdVSPaEYmItJiikbezNPp0XicW22pAjPgFb2flKFtvKApvs7frbGpsMVMpGMdNOcXgtUzJB0gfG9NO0MBhzk+bIK/L3rrZEm7TrugqrG5gw1hfgsE7wvWsxOCZ7OWFYRYvRZliEOa4O7PwPhg5KGMJ3Pkm7qroHZUoCfJGrKrS5OirFoAWlIyxnpvaReGZMrvD69jQkHQxHnsq5cjhInqZXxqDdQPRxz5xgOJuozveLmrXqlfbgxYbFOxNCbn+vNmCzK/TKKShy1ElJ9kTrJ9T7YdCcW3E3pVyZFptJ6AnpDMVeYb+imD4SY3NYAlJYDjLYFQYbtw/r4KW+f5/p4n5rmIASpg46xjKSM6xw97beFGyU7/r9zF7LXL4IpTOJXHDtveHCvJZhOQErpZsFB57zGuCwkl8htGNc5ZCedx76N5uj8hdDB6pqO0tJvPJBd6VoDYg0OvMQlN7tIB0T6qFA6e/VgoUQTqbZBDl3dWzqkz/0KRlZvmpnEt7dwigU9sKxYqXzUc3Ki3fQ1AkxUKe5UwydTki/hI3bgTVXgiEo0n11MJpqJ4UtSWmLAWtO0863XkHtmI5+/XWnenzf7k5SPHyGRfkzG1fuKL5AoTmVXdyVfhjUV47R5hY0+Wl3tj/isGDKh43LV8JAVT2PCZpz4uUuOWHF+VlPKlEi7U9c5qRdAjvOC9R0Kiyk+pKA+g7vqK/tWCnHsBhGjpmiGMLjY+6Fa9RcQRODK0gL3PMHQ57BwlOLWvKtzglv6nBnFrCpq1Ixwo4aLs1Bl2YLFXdnhC0m7tZXpQhBqJlfU4Lm0aJbWWWKld9LTmBd3/8/6facINvA4IQZMj62g44XEqYT4dYXYnFaqLzM9UsxMYR1t5j6xNem5sVvGaYEQ8dK71oJC2Ghx92dwUJTUOYc3w/EX6/Mqwh3Cv5xrLNxmFocLqcr3IXFCMUVJALxhcGmC5uNxSCGnOtXaE3CYkp+3LDeFHMqYWROFEtZaKiXfIshtGEsLkrf++kQsn3VuQp3QjZDM/NMJ9rzOr/wRC1XV/9qakPSMkcaNJzruViVOQzkN4EIWksyMJljsAu2ZIOWeWqEjl3euRy3VfGB/VInZra78p1YonLkVVXU5GO5YU1CQhan0Xw1ZGUfPH0GH7+4K2ZXwTzn18ppvicP/EBMgMhdFdt7z4ZnGU7So+u/t57B+tq/+ru+ZgZ43EQmj2CP+BohWHem3VQ5zGiwshTr0YSpEhO9zK2buYesFcHo/f+RZSzB30gGH0TQhAjOicI7DcRZCb4UhbscAa81+HcBGnpAqsF9icJcO0hTBJw6QLUH5RiAOxMDfW5ACAHkWjK4woD0Ebg3MTA3AzZ9BP5YMvjJHVRWghfJICLyKroMGgAEAAUIAEKoipKpAbihegTJijw9R/q/+KcBvY0b93cb1k/defPanm+ebp6bV86x913TT6/31d41A+dbe/1onvP5y15Cc9MeNs6dsOj5cFdjfAyHYXKX8YZD/bNo4118/eLW4EA0XmClUV7hngze4ZEsc4NnLI1/GEjKDyaxgj/4jlVmgR+ojD/4zEo5YlOgiBAimiUQWrYmNcEIKgvCxBpZEebssihloDXZUSp7lSvKnha5oRxps/TYGdcmjzjoVJ5wiRvkBddxk2XEDeyMPnCZvcp/XEEPfZNE+kwz6pZ7o1Nq41nlL/XEEbqgnsPTpmaTeVD/RKXM8S9UPQ/mP6iMP9n/p8p8Y0rSwG/zFRvlwvwPq4n/mD8m7TjFPZEl3tW9xTTKXP0nq8SR73xTBv4Z/2VZENx6Ip/xBR/IJr4yNm1By9is58rSlBsu5TOGwpSl7GIITDmXbQw20/yfU8HN0GZzLGw2Nvuk8mhmc9nEwI2WYYiEzb+Vc6QmNzb0kTJTlbKgMjb/c/kn0pjRZgktVL5YSmiJzcLSO0SfuL9mBn8kZ3t9WeOEn6fFyxF/9M17OHzTjTfL5DCRtK7HHAzJ5Eo20fTfEMrT1QboV/fJNDR+q2Nnu9gEgzHGmBa20M3xmPtME3ldo6BO7izkTmXT0vqYWdgTmRWmKvZ15mGtel9ULrnCFacgpRZr0IdwOUwdMSbreT8PLgIOkuOcL/opOrt5soRTNM7ei0vD5pIRgF/moQTDti+3pcWHa3sIFLdkiEsAkU6Txjh2A10wrp/mTNonP8gG7sDkFFRRJIyMW3b1LZdNzPAroqqDKoe3hTpghZtuHdTLyEBb6205/fCYdJWDj4lEIB6/tV+fm81Xhr/aLSgTPt/ULqV95/lU7RcGHSUmKGtFnGTnJmPo5IT+1c1oSiPi9wDjnXfVxSgLpzRiTOopbyQD4Vxvi763/opGJna7HMms7cHTubIsKidSUR7szfHexC0OXAFqm4uvTEYIu8XDjVM/WO+X5RjkivdxhgGsjZkiSW0sLD/MbKZOO4KUEXmHwRGLBMihIDr3ZBIP2WyeNAktRtI/Mg2kXL5Gxr1Zmum4kHJsusjTQwodIi88Yu+ADv2Uq/7Vcgl3nodmYm1SEPaOvumTkSR9foG7p79CjP71WM+RsCCNKLTHY9nQeeG7q31D8GluRDTyoDleppApKYE6l8RnxQcJrhWUzM+sfWbbvvgxUf992ZDbHEeZBZbR7yVpeGMYz6iNDyy8FWYO0n2qcUm2+Huu4rVXEW/oJpN7Tq2P37egD3hi+dy5LPijTwI+roNpGrI/z90Cp+bXnY2VQbsIWUEdEhuNQisUquchNG9eFK+iJ4AlWIgX2NN68lmbZfOi/x5ymGtKHb7qYpjtnZuSdlXDpkyt55RyoRqhAg9FykI4Tu5aT5GIKfz0kKpCyhAckWgfwLjb78KVQFre8E54zmkAB+r5vhecv/cihhPiSayuh88UGGipfQ09sUT9QyHwTcnbTeGKWk9IOn1aN3dVQbrDRIQn5zYQ8eR/1XmQRF4Ep7DvxKRDFKkWEsMvI56ALMiMA5F1aTGnW+O9/AsQbGq9MS6MH2PKHHnhYqN0+peIYY6R1xEsHIl8w7hB2uNuB/zNIF1zRgE6Z3JViPeU+4nnh6EO05d/CfAVC7LC3GqezDZIXPqAZkPubVTIRWvGDBNx3g6Eorxh2IbtR3xgEpkYE0Z6Q4MAcBWhJP1SSgnmHO17EJZy2Om/gG6XmUTwSAua4k6w0Zfh9CWih0SjLlkk+LgoncxuPAjurCedYuZghRqo0oRe90nHIJDekyC2czbFsGZryFMxYdjjWYHkjsfAEy+dV7CIEpM1XWRUEbS87GHdoIwsojNP0+auHZshEb709/1b35Qg0Rm0j6FeQTJ4ZFuj72TnrmN5BtL0182CVCZAIH3z2bM2tbCuQp2eEc+4qin7XcLavoySZyISaAi1mSSmn5pk8YaRo0+Y9RXF6Q7DMAzLGu6RNpOCGIfp694hvNE7uLWL1kk2R2Muj4Noc8qefsJEPqekERZIfPQMYc9rn9lr1hsB9x3CzwdVTErpCoeqCZydBrT50HLnORXdhmV16a0/nX4dn2lTjIvHs+GUSJiSbA6XI+ByHuqum9tYxnE9ydJ7gDQFOqVX8eNuLp0njJURztjTuLs2J3G13lveErY8Q7a9qIpdPUj0veW27SNcEjgtuVxvZAi9gjGL7NPxWhWdaR1zcE6h535TCLeBuCfwsTAqFaH7kD47ZqCPUt9GnofyLnPkysoALUzlAORXi+RmtgyOo9swWhbw2TaNU6gFeFa71e4tOv6zoWMj+uj8uDLeEUlx+pQuyaKfM8kSjgJH8gvCE5w1PeeA3Q8qLnxr0PrR9kQVcQcR9a6hMsZbeLwcu8nZAROpBYCIhiJCXm14LJod2RiijA8RDSGXwDTmbsVPhu69JVVbB+6wgBH1k6sUz2gCDgWubgU6jVjFEtuhFx0wK/hmmCCht7NyB6N4iq6UUp1ZDxEHgwSi31eBxVZAkzjZWH9mA+bPtgPCsFekY5PO2bxaneuK2m7H4BnzJoa2owUpAKgWTSsdqXzqPqFmMGcn51wI1lpFoPbX90jL9ET1QacQNyoaSGzyh18V+NwoUKuyA/tI81E/wlw2/noqd5rb4NYFPM2qxcM73nq2deJ0FdgDtTOuSxDokoQpK7dd6eeDaZ481jO7vDDuP6YzWeIQn9yQGCeuE5cukPHJJz0hxdPhxlZx8pvdNCcW8wtel8lqUYee01xcKv+DwhjFEF59TumrS5lhAKHhkis03obgnGQjdCi04KHNRdqEY9oChVGrOZKOIqTO15uprk2BihO5KyN9NvLbRDIe9297lcI0bwlGMb1bJawSEHTKGpYKwQT2l5BTRwpCR4pUuNXQVgmp3JZnpkWl1ksjRdyeavSGiJ9tRxWILj/y3beEp6NdS+1mqo+ZwlrtelT2OSg3kE1flbQW/5U/QT4t8fHs2MlgAWmglChJtUwgMgaOw8Yv2fvpsQEkiAADrCas2c19lnke7bOoiOrkl+COUM885WGxu2C/wds6mKUJWuIjBb+FLvDYKx4msp4MT/36HRvfTj+pyMzvdjG20SY9bICHy+uDX5pMeoyIJv5rSxsLxqi+V2f00LiineInKX63QGewX5Gpysv1gg6SMRJpm0C8oVwalNcQtIdOsH5ZNYjQbyv7DH02OgPHnaP9ykOVVdEadFSPJPmQObO2bDSm/3Rqk0zIOjv0RhkFAAXJ0fZmfQrSCtPGLE2diW/wAVw12QdgYz3zTwkfVKIE4fyMzhG13aw+ApQL7avsW4UmpYvL+2d+tdagHrCbdVpVDYZhGMZEdo6JyKBlzPQeEg7VGpUFbu57sq9WIKF1U5vNW1d4CNuiBRteopiv5Dt03gFwFzXA7YRjlnNuFtqFH73QjEkWahVnoaoklFpz4UbeHl1/rzypoOw5gV2yIzhzZ4XqAw/Ee1QgkulwJdeXDUcUF0r0jAdsXaLfm8ivXEIEWMn3+1hXKLxfddUiZ4z7LRQ5OCCHeZI9KsTDv2PAKHTElpU50fTMF8hDLzCTDYmpeGD4k35wGjzEdPvGCbGCbzl4dAwrBqxqjb3kV6vRB02+AHcKeswLp3RTlTRibQyK10EVt9TovuzuxFNaLGh210OyLJwPmv10dVdojziXvrgfBckKu54jWboiF/9Nvl0U7TMOaLH7sIgUtxCXQpTDcYihygj4ZKrXb6LwMdQmB02tssdUqVE5c68tjEuAxS5VJHPd0ie7Mn6i94LlwOQAE360e7hHwItmjeoZUQNbtrlyMnAnPRXmkTlt39kGhbwmph+vU9zfkTtcjdGlC7xiUtF8dKmIhBB6AVYH0ImXqaiBkl351KHKAuGd8GqsJZL4aZe9QnZTTCrTA864hTA0gysYB8wWcGM73D55gVL2yskHUv+GUsEZcADcchhzZYaGy48BRIvc+tXDWpcKzBC4R3mxKjVDYaOJsPxMx+ltCTcxVXmPHZvUwjdzI7rKPeCMMSY3Kwkt6rohD+DFzmksALM4fr8po2cA/6nzZQUiH++DJSwT+VANbuHRvOlHUrsNWfmdDvR+Z6Fr12c7QcJFVu3Pxdr0S+suqOLHCBIrO8agzjIZ0J4EYp/cq5J4meEFIPQrY5tgQ+mf2iMCxYqxe0uB48zQ8t06XW9hX9cmCIFIIsIYEhbodTZWV/8yqzIAhPzBRUnoM2nXUCfDaBXqJv1LeOmOSSRb4T1PSNpjjw4NWc3tIN62FlPcCiv3Y3cZoJYH4iOYR/Un1N2evcPISEZthGPNAb8vfAiNgygpJFiZ2TTa/HBQ7KldqqhZoVxB/2JHdo2Xz5PclE6b+X0Izhw4M26AW4LvOXA4p+FKqlmTP/PENG5nkKr1R3Ra+CZ8M9q9fKugvcdENbYGNmsiDqzQkJNRIjwhOgUbaaQnDdVWZvCR2jtl7WFvhTmIlSW33QNf2Sh7TkOa3gyD0OVB/y6dkqobfz940lzZIy+8i5wfGxqf30rWFCQBIbGVzMd62G68g21TfHXc8mvcabvHa9VOqrKuy3uVdX+1Iyeg8d2QQ1Lkd/3A3SBSJIyjwfEBdC2cFdD4n/Pb2u2GqQVH4nvTnYLyYPwdpFMnZkfP1F+iobx5m0d/vTxpdjw0vWEU6YfUdDB51h4bEeyd+hcvFUM+Qd1JUA3AFHe5VtEOnqbaAQzDMIwUzrfe6R8zbeQGwMJYxclCfZSJoahI72o+YDCO3prui91AKXXkN3dEse0jx5cORt6JJtmt/EoabMKW7SOVjqWQJwwtXkSVcoBZxnZBVx75rvesllPIUIo5mHKKNAsZOEc3SAQPJU/CAeeTSdqvXn7vyvWo1e0cLx3GKFdNA+w/rYmozpL0cLae3WGU6sv81tGftybVuqPESWzxerRLSW6nCML4vYwGwP79qMVAK0mw/A1DyyRo0IQM2OWGZWypm50yvHqEms3g1MyHqwq709uLAZ+zY7nOSgZ2ewaUYAtSKVgji74vgmRcgab+llkKavqan8ZxNK8HHYcGWmXj4URUz8Qmmv5cmdIobXRJxu2HJgFP9NpuCXJNEkJiGBI0c028F7FspemlzZBtUqGvxPNzyk0j4yvfgXqFnEpJWR3/oPqLdG/xzTIricai9ymdtrer8iAEvkAg5Zf0q7NwgObLwRaHiZD3Ap5VsxSefbLDvNiaLmcrFTGouyEZIXwGLCYLyZxpsRT7A1wy7HwtdBtXd14WbAyUaE15320qyw8U14Euby53KuIJdriCq48L6p+ixG7fGJ7GnvOwKsUE/xobufEXs30RaZAnVuxunnUTRod95NtY4MFQwMbJ6pEC6/S9zW/zzTFHUYTZK4Cbc2rCE9lKjNKdrpuO2p6YN8hznM/4lMcwZ4FAqEOp+oE5J5BJM0otvc+EryvNQliF6VWk171AKDkxnA9Nv7wRv/FcAsz4hP3kp2fbBj7XfoNXS2TuQpJAJri1YIi9gYR30ESUXouElNAqHdsnFk3Hj9W/2sX0DVceg2HBUhvTQdxkkYhodMC1AYjHlS6pW+hxJ0gzCG7qs4b7U+xw4ELQkfb6ZuZMYIKrc5QYqaOU/OcQvVx3Ch0lP7YFyqRjVXybdmS6nTp5HAk0JwLaQ0Pl2CjzZ6UEv9laXUmqyBLCisL+lYMzbB2wc6skuAOmoNnYyOH0no3DxGsDbqRdrLdaUEtHZW7s4klCEgO+16gRt6LIXrhZTpZKFYSpDn5BCDKWiiKugwMkryaL7MIUkGA0Xff63tOv10SRQxSLYgc5C772HqXcNg9ExRx4SrUosLFLXyc85HIKvbpKmMWyl4sI831L77N1gyZNCOLJfoymSSyyXOUGe20kFm86qkZ14vGQ8gSpmV4h8clgOwj9PYDVRDHMicEo9nI+3y21nH8ReexCTidl5GzvUsmD3Pq/Jp4Wjy7X77U+fq72WJO5y5+lupEYcJsKPB1ClTmQhU+vwP2s9U2n9lBfpMcOdKIOL5/90eZYlplCfO/eChrM5cWuwz0V+1R5PRwvgLIRBJimISpdmZien7xbvOwFST5OlJOIaMMwDMOi7I+LyAZvdXVQg3yR88JJC2mHemDsVz+qUjXq+fNSjHkuLs1v4GqoRlpPO2ZCfO4EjvijcbI5WZwD5VQoz5cdsp1pqNvCi6AT7kGupHMP6ggtceuGYD10G9oS39c8JjEdMqJnwEjHq2Udv+oJmPC1kyc9kHqx7cgyOQaFLQRrPuFdBZEME0Eelql8i/7hcVPUWdOVoQYRwSzQzuiAz6wnnF1LcvMivzI7bntkjLM9MCiuYzku4Aa1N1qgIy9PDe110YYhPrN0Gx10EjdpT9uDw90WFAogxnTC7iywNUbD5pESO6aXeHP6DudeVY6+a6VMMuFxn0goNzKddB9GUEFymPJ82bX3FP13wy6zFbkkdk6GnC5Q34A3EnofGGgjf5liM/YAjc209JdgTWwLZg1CchJE66k45Go9JfDDZsjp0ux7JJEmpj6fUJPC+NMjjRWUM1lINk0PPXVgv2I5HuYsCXu9BsoFXNZOXUlLJSdUom+c6cFkQOjvB9CukQbIl4QNcYaytZAPU5oeaViqhhIha5ddCBO++0qoD98+6SDzmvXuhdTfmWKthEwcBgmOoMfGj3nRcWtWI6YhszZGh40FSn1UdtsxXWB5lec4KUQ6WPXYu80tPD0d9TfJwwyTFeBgK1JMyWFyiXLU8aa76fGDYn13zCav6Ji/mWv6TjLveEXdwINM+PNSjFKXvenaQ/c3ldBc3ax5TGJsF+Ji98lzeKPkkC0Dn1mPE9m4LThD2hxuqCAOaYyGzbVTVUfN2APkyZxme3Ijf5k0SM9NoslYlo0Uzt87HuYsXtmTz+Dp5OUy+xrAOMi8ZikNaz97wlEEsO4LxEWyAhyEe/ozjuDNXpZS8uu+T57DtVFQ9aD8nKkso0KkAE8nLz1dQTy6MTV6u7n2NMzG1OhBEKqJrxML5DeprkNfvPqLlrIcxz9E+vX6OzXvMua01gRT35nHY5R4RHJQwSuNEl1hIKodKF79BRw7pGvcBUWrWhzIIjxnDa5k7Px+woGkhB7RxCWn5/Ds/JGAylRGWz8z6jk8W8E52Uo8GGKjipxigciIhT/mtNZcGla1Lnl418XrSW6putev9wjnmFmbv/t87hz9JAmi9YAq/c6Z+vIAmxpZzKvJsehXZ7g6nvch162kl3KJNUp05SCPrE/aJOTXCiwHf3aakiCA2pVF4g7SRpQbtLgwe1eZhQlduMUqZmA51u/ZylmdZCdhc9SLRtn38aukrwuKVg0p0wwV+JpDEhTh72fLvyugCXI+Qvk4aNDQY5DIEZpqf9p1aFpAWr7BedBCZATEJ+KvLKQB9qvwG3okqsADSQn9cFtvb8uMPThtovZRd/S7r3leIdqoiWvpgzgSgxiGYRjJPV7HV5BkUXY9tPlU+omsDKO0EEbRVkk+JEUv1add07vPfqrABS7dZUNIcR1nQBlnhgN+SvB6QsgT+7O9Q/GC0E6Vl8VomfeTimaHjrhgOEDPKglktYPhJ+JbNeMkvE2nh1slnTmB81rN48rwuSzjmj5y9hc4Plj/wsWa10hQNc2Y37hfSVVSdGItEfklLGkibNvBKbtqPj97c3WMQ+TaBleagfPOqGcpZ57O/OHNCKzRxv3mnkLVWaWwJLR2+/z3jpB8XPATyjKUIcFzffuPJpT32TNVVkV4YKrGZKv6tg+rVRBCzeaq8r+P/LU/Cp3B7GqVe5BFCYUTtFsoSh5tthq7evA5/0NkBHaKd3XCrpFMfj+ZtbOXhqQwpFCwxQhMJb8hn9miFaP8Ps2t2HgYLohjI2gvYNL0EhD9b9/IOPT6RXrCToFAeJUifq0rGG+dl/pWofq1wKnDwHH5xaTHsXTieAszoR5XUQAI85tYwtjYomekKt8+SA/1TnqOYHTNtZVm+FjrnBdaEN8OTCpdy9tpM6D8Vupptf1HJxo0YBkA2TR/za/G60miHtNP9Thvh0QjJO4TcLu5S+Ny0X80TvfJ4OlFybknxLLKZganf9uq5ynIr4riqpBYgPzJM37bAPhAuZuOnSH+GR/B0A22IMC6uSx5vbfoYptWjpZ/8ZNwdJM2aFweE5/LXR/W1iQM2+7tHvyEpjYFQ09DGBS8eA6wssqjs7nMs4hcso1aIDBUWXqVSKvDwW/+5K3ivk6yZJm4kRFkooTaZrk5p6IH23LzIPVIzdKHFHbDFGg+JQyrNc1P9DsC7wZVgwNaLmkjiF4LhEIAtCvuI0iah3tTUUReFH3WFUaJ762339qx7lWF+oXQHYAI5TkgSlqHT2iftzUVyIvoL6FkmhQSdMyu/3D3Wp/NeVpVnLUUaNTLF/e9p9EVxOHbNqwDXMD4YrbooqZczcBcqzmf2Fu+BXX2GQ4+kMVaqLQh+difiBZQ+2C562Y0D1dDxpuTWR5zrQNnaUGXPPHgbJzFr4Exz9zxxPP2zFSeq1xkXmn1k+0co4+DJLOkRzbcAHy5xuKXcPbxlqtHb2XgEAcO1kiOi238XpTxpqdF4sdvVbm1UYRaYcCwN+X/xAxG1G4qcDygWxULqDiwVyCc71hPw+7H/gI9QTTh50UXrNQX0LnsxqeQiAMU8MppoZ250Ln5HPoLRxFCny/KM8ib0wyhtLg2EuzjVuK4AlCeFg2De053smwqqOu3xe+QgrSPjVbJOU/kZwS3JdF8Vjsgl2nNjwKHXAUKkxmuaNbFuuXwISEjEEar8x0zMhbrcYfI0VBNsFQsOcO4jHgXV6spZQF/vOWrNvwxDMMwjMxlfcG3pnsxQwZETqFu5iN9lL6zCkwdTWiLS2AJsITxtED2DxK3ZWKEFdhy7o6nTJ8MsKHNHaRx8Cvb7jMtKFPixijLhIrKLd7I3pDrz3VIF9xOb7ejlJJmeQwLffx9rI1ONuUeXjYJsmkMbkBFrROAPdOLe2dVbUngAoT5Qd5YCXXAv1sdFozgwA63If+yeUJqmYN6+NWzHdVJ/bQS4QadZfg2y503eyfZHOENSUAw1Dg8frqfActPcORSle5x4KK1J4qZ/MmA2sH555mdHzzdwpWkYmWp0gkD9QZbpTuLRu6V/M1UIiSL3ayvHgsFzX2/8jAuuugy/Vd1e8xlfcG+kVWjxYun+6wXBj6iwxcU5SjaGurEVKzCcHqK9TIXlUzr50DTvNNEtUF3SjwxpeZiTkv4VeM133xL3w0fN0c8eYwLLUJhwIlfwMqvGRlJubSipHguRqhwWW1gZqTd9dP2uRuAiXft6cSvTyiO61kHqeTRGJJ0DLnOmDSZnlnrijCEi1vqwUtb3irCVQBWCfhaMjPrvrihw4AkaBZKr7ol7pM/OxQy/p0KTeezTgF9rsDYkWxyXpVsDnYZcui/mciGxqPOIRpR9pihcDP6gMEZQb9tF8xSoqW690yG0aXghHg0AU2n6YVIkebJR4jug+8WWn3w8USL0QicOoK2pnsxmF2+J6C9P4DsCyJO8f77xVYNINE9XlLx4fJishU1eX1/4Rxjk5pWhRfc0JK86IA+EBWiQMC1m8u+ZeFHg66FUfbPhY4aGJGvAuFA2uolE7gfichLDqSk4Nxtsc/xj7FGhTo0vgY5wfby1x0Ll2ZGdrRjXSNstE9jgh5AcClHLI745OrLGLk/lT8PAPvNVVFHFEpadUejsFLqhQndI4wcBmJma3qBAUl3COwhX1Oy3cr47mJgPwhIn+xUBmlExfjGnFf9ApXKM20mZUlg1Wcso59hhbZ9sxCmdQ8rL2NxmjvRaz0V1Z8xku8x6EItGy5TQr8kPR0KZKB3t5h9OIcMiByVPUG58jRIuQZgWKQ0m+z1i1PR20dP36jVbxojqm+jxuaZOH/4gwl4VgLz1E56eKvqiLKulRv5qU237dYJopo+Z3gwJfcN2sYLaHfIpDUqenSQjiLYIHiJprydBTf4OnSKmvA7wMg7PzXlL4MSz/+Jnhhkad++RWIteVg0yIqdXLNxHDES68QaxL5KJL5fJ1Zr1CoM15kTj7drqKRm9du43WQAx73KYVhuEWpDUgNws7D4K08RJgVmW3evVXkW7g/SHUmqKsTRKuDEdLPLdRN5vh9PCuQRDHayc3oaRiT8qcvVhkpMtj7dZPiQPu9tEtqpQwWmWGA0ktm9NhDpMAzDcNgtlePWzEr3avAOEHaylrFJk4/RhXtMfyX86/A3dxYShRQfW++7Ygf4kWQm2KOb7L/s7EvMpFEDbntBTB0prGpCCx7gXpz5dbndbl8UvZlPquWVgOGiaflfgd/qGp01ypyC24Q24aEAViSQimU/oJmX2bKdnZcU7VGqoVYXXrvttrM+8dAspIKPpWAgjnYsaYpJkTLacH6wHh1HrBzbpXZRf29OA7B9eEWNrwGJy3HaUU1KwGTIsjEBUQIzm9kBTVRGHBSiTnm0S6tCiAa9CEReMFAGOmRWFD5Bg0nMFHT8BerP76rHthfVbwUXfafdd+Acj6UE27OHrVUIu8pFsaEVogEjXigHPVOXuvZFObez7adtDAC8PXXLHmbTikRTmPoksxVKaxMWBU+I/n7uc1ViFhMMJt+6/pB8CbX790D2MltvZpQtaxQrkneNL7j3ZMcUBAI5OaVOPeaZ+R7W5ZXm2YSMpnkPSSUFr3R9U16P1I8zjFI7NHfugGA1zR8T/Vj8tLLT4FFgx01+ZCGQK7EBbzey4eLmZgITVQAEuOo1KSTXpYzB9JYzyZUPM8uPp9+qz4EVAk6MIZkiDoe7TXAFhNkyUAhIxpZ419AfLkLoB//aQMOt0KYZ+uoSNSP0TjYiE6AiVlEZQH8AFYdawqWGKQwxJ7kbmKB+sc5rZDghFhyPUIjLgUw8IDClcKSQSvTLWihRP15fcZSz+kVZyJQMBlHGj0QfwpEiIl4gVoxSm5f65VditoegnP425TnMYJkjgkrOitCw6gQI+8PyKXP+61bMHddmv+emGemhrGxf9ShW2TvSAx2ZyQZxWusqitvX1voRj1MgGoGgp2rVzN5BpMsSSKyygxK8Rvd8f5rJCuYNJvxyYYQ8hfSnvZW+NqrlSeDMVs4cT9J1mxtHvrOMvh+ZRTQEyvsk5JjRl2PVmrbY0moArbDE5am6LVXFQQpo23VisdjBdRduLDs7eacUTuSFFWTd3m9SK6gpDwn/VS4qGYea3v1pdV2x+smpSTa5RSVjjwrO1Ec+5lQ9rqOj66RGZYrGdJT7Pp0ZeICzRDinuCRPSjF4twTvyv6+PMgJQf3l+bhqqelhFzgyU6hP6Xz1Fai8ZeEqEOam6OYn16+VNC87eBtIxQuzWMWymyFO89hOfK8aU7AWQ3ttj6ZJWpjHW9fI9N+2AiYx2/BMs5ZE8uoIU+Uy/V5jv+BxKOEJbJdc0KjXqXDhWqpE8D9kjje0sI595pbwYesjwWdtBhrOCacqQBY+0fv2dfMlncStAJBZ5nQJrHTV969gUFlFfo68n8bMML34yA8PqxxaATz7vCIPXREw54OoctfjezaXhngDJ9J9bEcTm7a0lK/QCPBpB6AeG3A3onCVW7AcSwABttpCKkqQv05FZvcD+LxTNHpBS9GuEutqyX3isMhYZKxxOgz86MeFM/7O/Wnk47eGJ6ffGiuvs/9vzdferP9vPftcWC8AGhp8tp/tO7Wl6Oltu4+rGDAe++63yvf5+FVsh5vfGuNte/i18T3t+QlzHyT8b2s7u7dK+p7yxgy5lCcTRckRuh4EHehuQzPqWVosxuwUC/IAYR4gMBdapA9gm4DgfHzwDfC9syYg+Lbrn7EADyj4DGiYgdOV0vuIzDm14ZPCCY+ETNbP/4f2EIkZRhIYPzP+Brm6yd669N6U8VaWlcJsEOvcUJPKk4sqnmgql+Z83Y+DTVnoRxjjZRaVfx5I3a3Wqvz1pY5HI3aVyjdX9+rRulx5VcYrLSsn/g7mdWtrqfz3oYqXaCoPfvF1R442RUbUEUI8b1E5WJC6rcaqfLup4/GIQ6UxcXXvdtblxlkZr7KsnPnPoK0r1VJ58a6KZzWVvTu+7o8nm7LyMsIsXm5R+fSH1N3bWpUL/9Tx/y6ZFEni1O1gYMiSUiacyg4dmK9gVX4VlnW/Dup4y8FUlvoRp8pSkOJlXN2Hq6ry4cG63HGaujutMt49X859WVbOPdvEo0FfVzuN0Fdq31J5k1rUvXlUxftNyrVXTeXaxipeyded+lRXTv21KRtmxKJuYz1CEe+HK18+LCpf9tbxElL36E1ZefTLqhxbWdYdO6rjzbbj7pssJ9rFv6upVFENX8l4BCsXO1LpVOoi6sOpMrAt1dzTW9KX5GwnYFnKsyxtasvvKKno0m4oquUrmRvByuiWVDprdQm2h9MVDMqWaua+ZMmyVda7/qx3/l+96tzUd2s2irubcbJ4+ZQer/rtpp61EQg7GV7e+o/1y+MMfqz5rcbskOrxhfabrBo0dWa09Hw/l7Ou1A9zht77CUzPDMX6wv73fxsML3lwztpcyN5rXKMF2u0+wed7pMrec581sMLCh+PmNo4zmzLLcrAeF4JQqJ0ujE79cA2pwrmRP1hks5ze56Oaxa4JN9zbV68j1CI+oB2kiueZ/E57J3OKGzE2w21buyJ0BwmlgyQ9H5FVQuoFBmM5bqeAsixOWRBEexCFBVHvx47B/xfEhBQTdPzAjjH8C6ORwwyfqZFEmdlDBTHzgUmss3jKRJflF58Ys/GsE1gAAKAIhBFXNd0AuIRoGaTRzBrLuC2w5wc6pwXYqTcWhtBhFhcId6UJVe6AeSZ03QEfyCm63V0BxKkczLpOHCHlACrXFKgIV0dGYpNMxAJXbhcJ2P4gDQc3yIAzdtCEyxygTKLcb1K0QRCpGLtA5jrciQ0mUaIhCY/c+Rr+hvfPruV5W9oBNXRQN+4ov2FdnQjWHwFiD3Ae4A0ItTPgKgAzgGYs2dbTaFTcBy+TfdXDrpQ7GKdelR5VrzNwtWn85Jovs49b+Q4MxrnAfpfBjPB0BFPyEFrqFq2v4jyzlp+JzKxu9gbRfuXmcErnDM4kHodAy987Ktn06nnjv+N+B4/1eelux7rMrfKc1P4/ArJk10fj29qNSKlPz4miH9/Nk6cRrbfK1UzMIBvnLZaXO63Mkr/Wx70KtD5ujYxmdWa0yIXW1UVpcn7oOvof9N50S7oOtdd5zYdONbbWh6zJ9ZwzbKfJN3VH5o6W0+tL+fbfsnfZOs/mFwWqgjC3Bjgsayh8H0kxI4PF0SkET0UF0rnp3LTSGSPgTx/U4LJBDd47mUEzLymPgv2UE+97c2wPWWj96Y+ZeWmjRmUPqvWvDjP349Xyx0U3arTtnZr5W69mVj1yye5myGxcSl7aZ0kVJ3nuu0l8NevUvcomV1GT8/6xM/k4R6h33b48AcimnFD93dcEIvQ35VQ2z0bW57+sV/fcDHmUzfMsKzykUvjqlymykS/m6AIW3nH41dhrQD6yMhh3A4QA5MCY7hg0AqZ9DsyAfQuwfIOJLZSm/QJ7tzbA/gHQNJQa+k9pAgyJkN2klRU9UX0mGJIgzzOULM5L7OMF4Ez7D7HZYl+CiXlhItcz1eeWzRZ8H8xon2D0r59q3Bdg2pTsokMvgCTpnPRXFXllZqmYLp/U3MN405zkiJllz8xzwcytnxzjoxuAbJ8q/TuCCisv5CALEbpK1LDaGXJ2ynmnUhpqWP1ql/0m9EVA/tDVRLX5oNqUp5x7upqo2erOLJ+yWVZ0Ncm30n3PXsrvKedZ1sfL0urNlLtTzrm86mVTTmVTlqec63tlWb/a6PMm61PLq0JWrB4VOT7lfMmKbGTFf/sYoES5Fg0SclsjU8mWrWhLpa2ItKUq96IlgdYjVqKxlctATStRYumUW9EQS7sSAiWgopEyXwnbVFbKnWjogrY1MpRot5erQK2tdEIp0IkGX9J+Q7lkx6XojMpa8tKVWQVRCMoCCdug3JfKCW/Wboa1pLZ7t1AswltuyWMHAaeTnLLYhBt4cb0qKhsW0K4K/xXRy9vAzHa5A1uAu3FY2svHCdX5AVmiGe0fOvy9J53azDBiUUuE+s8G7jxDVcLSG3U1sIZ1jPXt1ddBY1uG7/77D47RbDCgRgfYpUtlSYlQ/8jkrPw/0hSXl/4W/7dX9vkQXWDac3tUDTsToVF2w/Pq+0McfXh1B/72A4OcdvF35duT1a/9trbx27CvCAvAEdDXIOhH27P32pTyDK8an38/LjMUNPhr6b9aaP6ze2IblyMW/cml9oeex/cHBrgdY39ILz/Xm7BFcsomytXAieLZv4RvX+q4SoRetz54NxDQn0dfJCBxk496d71WMX0uxk05pvRou9ivXmOUShxE+DmJb8/Fd1p3nrlW4UxIUduplCn5dgorqwyLyF+YDEsmuL42LWe3sIK+E6wbJzfdgkPM5uTv9vFcEtB2+1DVImhg3yb7eCITLfcWVpguysW29+FbmZadWhiIypTvyEJOIk6sm0xf1x0Wp3QkTxwUM6YTLMi2pEmk3g/CH7Ac2jenSjlGG+F7eZZ2SLBkLOeYhaYDyZgkmuBrBobBLTjPcDndCXwJ6D/Jit6Zap5tzlsG8xJP5xThwJzbVDNjmN6FnjxDTGi2hI4x7EAdTtjVGTYTNys9P+KLXJlJuuzyKBRhkNO8hpJGJ9g0dbTbvPYSrqXh3Ex8nRvykbMrPFn3wj1xCgCkIsNEztVvFKXm5iz4npB8SbTuooLr/XjkRPwCLsQIx5XKXkxgVD+PD9twTsqI4LcAx2nk725hshl66PZsYn05a66UD8rpuxMKO0X3BFaY56InAUdn+JxZN6/3jX/jQ5VcyfMy1TT1v/CFecY7Zs6rqhTGQtiLpwDu5sPtEeJmviU5wLmvXiFZyk64YrTp+D6clQ/9TDzeq3gsFxbC707oQJ0ja+08qSQq60InWi6N9OHgy1lYnoZgXvNykrOpDuZ0lJ9Z6VD36BluUL4NsbUWViZIdYrtHPQbHNFa863QEcA9nCjdpGlWMhWWcHTnzx+anTWdzBebjYcO3SzV0tzWwphiThlA/RY3wonFp3fCXJnfbqzkbhPYIueKS6qJk5WePwhm+is5yerXTwVyayphVvr+sqlfQXfy1K6znYRiPhvKBXSqq3w5eYtFS63yoX2iHdU5Jzg7CNqT+Mh5alj5DCuGZB1xnSShWct5/1DXYR6rjUcx/lSBlZwq4YaGdNkJDLMQNBgL3nHoLlmm9tFDJt7YV8mV++Fa54SWkVwdh7qh4NxiIEFHSrAEbtQzcIdwZDijLIYeNUkj9YLWwe88SbSX/WpnGdyC2OU9LS42wzyiMif4DidEZ3IKOFWaBl7ZEQcttml/7gqry7DTmRiKujbqXmtrSz+M73ujQFmyU6p4JhDGpyfklV1mlcmliFRZfM8J0FT4S7RyGLyRr0JlOLvQzTHqoOyi1bQJzLqsJAN0bApFUM4QoJBqVVrUvaMrCHM93RhozsMiL9qZOQ1ry7W078NePxJDQ5sXJjgNubPHgiXPVNKfrwTqV7ahTMpIsK2rBpXuQ7niQk/Seao/Nci4by9nuZU9f8W0xOVytW/ceuwqLA71G30Rqnn5bjjshaNion6E3L0y2rPC8SWGJ3HQsY30kidv3q8AU1ElCgntgsqlHFkDmUaqBBY88W1udC4Ck77tmSJSFzC3SYFYYLx71a6wiEh5WvM7o9Jr23F3SEPjTOtk8bf4ZSbhNo/wvcy7ENZvHbbKY+FJIxj45S8ImpcaYr9cKdfj7kJiclr1H+CruY+SW0C/VAe7hP6g4pdYSHkWfoS03vxpV+BbK3Ygnq+XfjpmM0t1fb6vhxH5sc6Iad0qN3HDvwR1uNXdchNc4rfJkyibO/d/tf4v1wIQ7Qt7tMX+Z1rkyZ/mMED/Ndtf78H5fS1OtrHg8fOskv+rnk6XeifJ+JsMh891ca7Hf10v3D3Bfz9fP/LOMvxA1+6bF1++l/8/rsaPx57TnLy/2Ukez+3qOUXgZPq79hJW0bgfX9+27rI2q1f32Xz+/dlHPx3D5ZzSey+pDptd+r+BYf1PAiTfUrL/H/Wf6HF/euv9P7/pS+M4kBCCHh75/vMvALj/4yDPCHjV9Ay4wJ36eQVnLE+I5kT2GTitAhUwlQkpgQjo0RgoejLY8ygssJD/wPEAzUtXC7C9vud/wFPPf9VxFCj7fGKSnKj3626XzY94xJLdWY/gtHilwheXHTRY5ESnYlxIZdn0cm1Xfnk6+ek6ZJ8aC4I41OTb5g6Y64R54kOGUCP5jl4XfKuP7HEounUhbKwE0d804hAD6We+8JH0txUEl4gg/fj3HOYMXS0PojwLsrYpaQh/uJB/CIbD4MovsuEkRUgWxsPQK8XyLIc8LQFgzd16SFs0BYEcnwTCHdDAGgKHHH/7e0lc01quUHzJpjJMaCujbVVHtS1bYuJaCA0s96hTWMjnIpMaBklbPJTsI25nWir0WrFhAgy3fF1BrHtQdH8MErsTT4HBEdLDe7hnfU780uSG0z7UMURD54gHL1gKxr6R/eg/hFfHVbzhzLfqYOBW0PzxifpG3gNyDgu6+k/jOUCsHD/y9xHb/PlUPpfUL8o7/P1m/ssn9vwK+6TPZ4rRTZp7+cBEvqORkxCaBWvk8syEwaORH6pMmL9DGF/8mtWaGnO+JuNdvkdXrIhxK8IzkBKiQqcw41T9R4noLnIqvh/oBa330TppC+zB0UI6j7RYrq919tLjCSuP2/Ndw4QX1ZNTgJGRFcUwn+mT4U3/i39Qcfrb1KqiJABjxY8Lp5K4b8/B0oblh8XAbzTB7osrkT8wkTbMkPz+Iw8ziudGGOWH3BPNhMhBXN03B73F7Omn4Wx7uT3tOPa0brTPIZ7+fKS8A+DKD64gyAdk9wyMA3me96UuoEDKa3PBDLLENw7bKg47tQ9b/m2b9QwRU33vAY8geHL8SEdhKT0d6b9UGOsqOAeKIF4LQo/Yf8o1/vqSsg5NqtKEKQ8YEAPpn4BDUYCal+fhyqTLVB/N/q7QMVX4NQj+JZlE1cvJ/7QRIhEijhkPVoyhF4WiJgSX2NfVXGkMh7loMIfG9mPMvUWrELAC5LaYeOC7g9F67P2SvKFPeJAJ1SBeMIu7Vng1O0sFDK56XTPsaoR1V0b2biVGZxHnU7RWoBdEi7qIdxa63F/QwubpNKYEDXuN+mg7S81UDcXnKK+Guli9L+96F/uHVhOtV6DuN08n01jWyy8WGsDd5PkyuXi1QHTcg8FgL/YYWxffWSKh6b37RwvuxMZPHChsfvCCk/m47w2ZnxcODKSGQKvjjZ8Wf9IxheB04CB63mzsxbvAawr2SBUDRgxUwC9NJmAgd75ba0AxdjcroRXThwWiIjqdhq499alH5/RtGMPWxF1m8KwzXUl9z33CRgx7qAt5k4E2wQrYIlpasZPCTU3jRLwXj5smIqXo5QRmJq82wd4idYJzk5+g06GsPwSmyCORJ5c9v/gHpE1wvfnRjlD6Ool07VprmReELy/XXpX/Qq/aiP0VQ8H0PzeL4ijHOhSfqtdnslamm9j7WCb15IILFSST8AyEFdiutZPjKcUFT/T8SfQlysrACi294eeS1DXk7X9HqGGp2ynI5gO5enL7Ox6Zn49E0pM2w6H7ZKAj91Gn6gihHPIF/VuI75Vyo9dvfA2iRqoTD+ClyXWAGoJcd0rvOW3i+rKEC8rIBAqBhBZvTBQmM7YwwH2+TnL4rRlDR6dKWfQIIuCuzWhZMmoI+otWFDPfmdlryMrFvJwy1ua0OjshJSWigYCQzhvGcx1dBdeQqRyWaQacOGfwEZbRpwWv2JpgX5iX678zivg6vXAtkyRnsG5LNLau++UgL+asiiEwoD0/0x1XnwI/sNX3CsQHaY2UzgIxwPjo93Bb1EaIlpiQ1X4f543tAst1aLu2a6gmmIrV/1yMU2tpA5+hjQy8Fq+XP7aTe7s28o12xvII0hHu3J5MfZLpW5BTNu4OWqdMoatkcMoNzBG7InqTf1gjRJr8uNhqj1mZQf7ZqWSQA+PR8rjZ9W9PX9m9ZiNonR+YIwk/vF6ybXcL1lS0DDUQdA+zIc2i3JECxZWm0e+Iz5GLoeVDc9xt28g4LDj7OAJsONpJvCt5bdy6bwPSFPQJjiTiXoXNB0UknAqXLLPnbA1xx+UV8YnjpIKoQLcX7+jJ1OO9f/vdM7j1kf/lFMUFOrqpUjC3P9JlAhbJ3wa3ivvaRuCbiAh+wr8lsobVL42RY30D6Ha9vN69gXlYymsoweXO3s8oJBPdV46Y+1U6IYczc/9thKGHLteWEMmwhGcYPi0SGaj8PNPazYm6Wo/CKfdJTTEtvco6KfpAR0i6Uy274mSZGHi0v6ai9iCcKqg/lFnqWTznrgZhdMzJo41K8gt89wI2nakBT1cBNiLJBQSOqc2USM7BC2rTOZGXsWCmpj6e548vNSrl1vBXy7K/BFdySSLfl4fj3pBbxV00U3Vp3BQvE5e66ATSOTWHSbW5YnBZXwvurpW9pOQ+3x2KhtI5ddwbm91Fg7kxxva4H4jdfDTXz7uiJ8LGB6lOldbKy2HvdzUecKUxiMHlxnSZwt9KQchg8THRwIVNYdjsRMCZI/AWjOfT3BF7CJllIPXvRULFlWqyqPelxsCFGCHc3DuPr8l5RNm8Kuv9P8crxSfqqFQKXEop/3xif3f/voZAazel3weruz8HM8Fa+gCrQXH7hahodfj3w76s8cYpyCTVXtTf9FPXRk12AsT2Yq7Zr/DqQfYYTX2EIuCI03R8fIFikWxaASQ00ZCKSoRYUMzccY3HdL0cSLy9+GbArQR1+af3v0+RN8DcsdVU8t317jqRFNzP+/GIh0O2BG3NZPDUTeo6E/GNStN8WrrBrYEcnmQrWv+GBiFrkizAa6Bf8PrABSDxXiAs7m74LyACCfLesCnN1P8y4np5WoaclMS/pGZGAKa32HXi3vJ4/c+ECWNG0wp22vpolg7hwSVTcQNWZqGY9kBhQaZQeJTpPFZBlQ2Ayx7Pc6sQhGphpJbxpqcgi98wfyIJM5IazhM1jXQIkUxMHWOyE9h63zpfPb88NYCSBANivG2dKNIbMndavbaS2B7mE3UEN2y0IgZqyqKACXowKxJMpi1D0rfjLQm7OcnnPLvCuyirmd7WjVIlv1s+fU0oTm16exXZK8Y3nGApvfkKlcUW0/QQPRjUG7NOQLRknidFlK6wcK+kT/z2IhtDaZvT3bMEoubFHnBg0ZvL+0ia7r2SGV8AhPURRVT8HdkLqEykFlR9CLU9Z8j80M1fXHAaUKTw3jQ+X1vTcbp3MEeWeua8Z6kStsSR6ebmJkQMjt96r6oscR28N8FAz2xTEQalTkB8Y5Md7FWyfERc8StPo5V4KJ7b3PEKiI2dY/i4ITz1pNlsb12rX0ZDf6cu7chLDl8kAlPQw5GfMvzZXsXIx4G1dPc0yDwaXoGp+rq0fRvCuJAM9GVpWVff6HQ/Cwpw+K6L5OB1OdGxz7b6DVVH99i6Jr4j1Wc9A1g5b6DvL9/8l5UIVDVENMkYNZa1Thh1PcVeSQSa3l4LHd96TWU1ulWQx1ZDTQPih0MLJNs9BXN+QuxnyUHfTK9SD3MSH7zF/ZLpSEXcLhHNrjmwOe5i1mmPdo0nnCvWeBowsERFQfGOXzK/Ar5fVF+AB/jGYgvnP2AlaXzp1WfCSOXPzzCo4F8pKUaguV62Tj0xh91Be2Cbz0VCA+RLxnIco3s2bmHDmkUtrvK3fS1f8DZqgmAmlyl8M5w2UHi5TlccM1HYFumH+dTCTMwm0dnlU9Zh3DkMzKOB96/0IT/R/PRlKUrOd1fZLzpr+ebDe/MCGeH7VXwUOczk+vtWFDWIBpIVOaV8q+aX/fUwM30JpNO+RUjOgQIt2Oqlznzd+X47SLq4raU0HzPEJ9vJmxM95+utQ955N4TFtDCLSTK5fR1x21gNi0XRutgVrQBw6q9Z2HHDy4lBXLF0cOLKADeu3TLQGffLazmAcgdvLgzqmJ1qw4mLZJMjAAWeTJbRcUP+pCCVySSaOqisAKeNSuEAI9jhU2Cl9bn3B5D0zIz3S4dPxJbBDELfyGKKk58MWxwqqvUox5WglJQ/+KLO4HysNekMb5WeaJW6K98Ae8m8c483xnGbUUmSvjeugqJ745IrNxnBJDuFVq5i5eQUBCI31n68OhQ4cZ3sYLTcvUPjgK2X6graMiNux+Nkx+1fvsXbClBxd3/90BOHc4Z/BTvaisBeYhplOQEk75kSQl1UJMpyW5cqU7WbsO9ILw/VbTLJEaXXzMHujeaTE0zYsJlsAGmOqWeZkNuNmqPpj3JW2tuwHNFOM5EOQqd7KiUx6GyKClXDxCnRElPGxWHsyPU4GJG42X8Ydrho0Zhnhupr69IFXZUXo+4pQ/XFLX63jxwMSpA1Zd05LqhbP5t1FMBeyG0vBN6b0+TJ0Rpu80g14kfLeXA73ys7lTLZO7JT3aUcjWI2RpVum6K/a/SikXgH0AlA2ztmrLKkjBKV88MOqF3doSlQQqJ24hPg3HU1TtjJPjF3t6kpM5Kt1HDQK++zBcxuYp+wJUJT5tAj3w0nqXorcqfGlbxWxo1zZh0fBjglEMLAT8y5ve+pLtb5EMOLaR+evHllzmnkVpmFM4KVcd15N98xe+FMjIrnCCmKMVmSt19GDEUqXTiCwlY7Q6lypBIl5yf6TFLj+w0oMtTEQKMnu8wb2ZM209OELWwkvUg6rCdakLdmUuIsB6WZxNtsKbrma1Oyt3MLwIg7gz0AV0o+ZzS5oV25M8a53Gk8yt8i2bXfwZnrpAc/4XYS8ysv0YhbyAp3U+JMRqQMP097Zwx3gVaWfGBl0RSmfBLZCSqmPxuPasnrP10FJBiRhyJfLD/Kn/UYsZ4VjUNbGYdQNg5u/ymAi+tF4OVmlUMMMuO7+0Ra86tz16/KGo+QDi6FubmbkPlTslgItHRLpLcf+MmAltx5ApJaQNl1UikOYmN+ECbibOIf9+46M99dVPwKKNfU+IruDgrFaPIbu7OYLeEwYOC6e/3vn5U7OMx6T4gSED12DL93CpBh2wc3IOM/4ISG5u1h26Z5t1TBCADhIq6UOb1EtQXv7K4h0/V5DhV7wsd59fh6zarbEBV4CumN/eqERd3cnNOl4vBh8SnNex6/gbys7r6D4oNnXZcfTjr7KYeovjlMCyWcqaEQvaaL6ybh2+PFPH9On7aq5CMpz9QIgbq9yiE6syTAU+Vmw5sJmidx3zgCx6cMvMe6mroLueQlAezHVSDs3D7MjS71z4VpvOIXjhzzzJ0KLdfrXzZd3xZzPO64lZgU3wbWzklF9Ijt04/FpLbBR2XJEpGeO9ALA+NDtLvvjyvYwftIRP3YWHwcX9TZPnlNV+6dXbR1vOd4wwNNrufImFQJlvJ5KuFfKaFk1a8liKFrg4+tgbb2m92eWJbimAJ9i3NtJL5Znn5iMRSAK1PrLX4oWl4MWF/aoLPvFVHMSgXWJ6tcKcEjuHNY7qvXy6w56srM4fksd/mZoyfhSp1FLXRTIuTdxUM8jsAtKpm3KtHXLZhBlDa+u3nQcDMaeWZ41zA+uLXHKZWVgOL55LQkUJSjNSW9+ZT3Z411EucxQ3wfwoah732a8NACsWe79SS1rlY8vP56Yh+1t0lJr1YEj3f/IQM7ZcMS6L237JBJhHMFiVBNzvZybqlggVsHiVGPw/ATVP+OLA789sTAAOkU4CcNwoFgPvGMcfgnzZqKO48OLI4trCGqhpMnKVvp+PWKtaUxuNHoSasxk8HqNh4/Q2rc5CuQtvHUEO9tIzdzFCN5ggpSmYnXFkmwSylVElmUnPrnurAUqRQ0OBMpudP/dbTyFeURTs4um3hcIkB5ya5P0ss0uouS+b2liFgP8zJGFenNoUDbKHSUfq4nmc5ktt5AjjjgE26bDM7+ckFTJaTj7jMVq9PvHuJJskfdMypyVzLOdOBJ4P+/gwnyD1gRuwnz3PExdy0SyhKmbv9fukHzs5DbVbC8FEG98nzS+4W9TrAkf0rPEFCQNKfksFTrsxmqTDel6VuGIs5abmaJOHxQ0MMT5T8MbErY2QzqdgT+nfhCW2KG92PhbiCfDKxueddYwTK2iIedlfKCClN/P8oAt2GVbA8xHMp9Hn4RgNx1cStwew+iUHFktwastQEoK18RQVbXYaAW66pa2VHxBK2ADXRw8YjbgcZqK7tlrBuu2T03vwKt0gbxiBuAvGoDuyVTtcJbE0oynjYwBuJongngLffmHZuZpqZWwck1Yd14A8huqRQv14RvZM0YXMBdi3ma+1r2ySuTsPj1OAN30cTTslhwLZrD6zPM6+MXwB6N2bAITZonZRl7F9fEhvz6kv2N7Q1vhyQQOy36uCFkIamKuebf1cCtpCXVaeS2va/JQYKky3VjL2GqawjtIQ+iD5Fb9aGJBFeaO9RZHbHHXZIrB+z0HUhBa7gBTbQOGTy4jlEwR+ydGPozr1AcuVqxjK3xwOq01DqyidlUNWruvawRA0oaCpxcegrnXS0VsFdFThr70GyUcTeSuK39CnGYziSRaOSD9IeFF+UnUk+C02iSJWEgY6P1lzKANSOpqOufnoh1SfV6T4ANMJ+BBMkggBXQZFaT5IqioDbwcRMLjsO0rXRXkViNzmQ3s7mkYH7AQbQw66l9RVI7gmri5A1fIO6/JuImW9E+l7HwMzxt7aJqeSF/kxULBOv/HIzuMqNnDxoU8yXy2++A5NRuJLRUCzAx4kyrXJ4iZco0fVKVPp+nNLyygG06NcL08akYN/l9UILOVYgHPJD3ZVkLHvsOpxe+79dZR5HEbpl5KSZPa9wU4Soq79H8o1ZpIpQ6iuhj8iNpvK86PNKAhLgT3P8qIGlGMAjMzNcb9kl4KxYlyJSX1Up5lpN1Xbj/cRmnxc21WtPyYl4Yrf9Xo4/PF1G2ZJru4ri/0bft+KkTAd/w3d3In9HYOEiVWPQCJxdVbH3KJdD1WQbOCi+hJ5H/K/KZcqm0Me8U2jdVJt5BpcR7C0eCK5Mjzwiy63yz7miSk1F81Aw74/Yrmd0Pq6qmdVbiFvl35/apGfZWSikc4aDckzNcS3CtPg/A9dQKer8cc/tWKsfa8cDpMZRYbnXo1g17Mdz9czz5dP0l38YTNpgVyTSobZk1kVa5MDzlOydto74LkYId/q/Xq9SNcLz9A9279xpv4MFssitGv+e72+MiBSq4esl3Hu2TskcK2WnnxkrfbuYTcVhWE2rbf6GDW+avz2gtUZ+73z2TPJ8jQpRNNR+729dp8NGIJOW3z7W+oT1TPbn0dXmaabOHRDcU+SlLodsUkiCW8JDLsHBN0WFyd+NvuUU25sf2PeTqZy3AytrIjA6TdV9jKI623r83L1WuxOLBAbC+hbzFGO+Penq/+lt3iUuE984T8OXbapGNNhcAL0rLvsIHl58rA7k6U4o1r1DKZ+f+QCLjc74/8mZH1+RCVOGrkOFS83JfT55LMvqgRvOCXW/aByHcFjSIByrMXSLdMi4Wt+C+J00x7M2W4dkNdcMeolg0XtYYTWPvW63SlIccEGUlamVd02T9C3SM2lj3NFmDE62K2t96EZuYdKN13PDVa0slG0UUOykr1uS0G1I8yH6Lycif2EDwMlHsSHzhW/URwfkg1/hMCXsxBB+e+xVb1srn2qaVkfVi3swxE4YAJHBBgf48+kePCrU+1cr9YjQjHV2LdgysM2uFLDAXNoZBSVbiIilttxMuP9m9V/10ErjHRccjPmPkYuBdDycoy4aBzQKd32v/YRTuLR2hOdLnLde/GstOj1dtbICl8EdFlpfa3VM1va5hX28gTkJNh/KwTyCmem5JEBaep7hzMl848ZLwYWkTkU1G51nz5iz4jWZlJzBOiJDb8BwvVQyMLoPBnzlkMroWy8EqMVmGkoCGMkwH2MacHgJyYHHSBsJQ2A4IimZ0VofV94gvgK50vKf8STHvnsQbkceKaLyl5HiFm1HEH6/OpUcOkCEwy6c0pfQG1m0JBObvWtHmsZdVehT/bhSntnlTb/r+CTRd3pEXgxRcUKgIfDKkbyEklZsJafaneu3K3Gvg/k71Bh+0wP7U6KfBgi19CgneJzq4WWK/G+sQJtDqeHIT3/MdwWEaWzz57p7kw1At/1M+FhcNswHltcFVzsxENrPwHiuMSZAINykxXe+O2DK4DVIAlBVdNvCJW0+ybTXm+fF9T7Ix/sQL1+odVUxuCcpk2khi/ijo2HwqXG8kbHgWj2hoWCkJX3cBKgmBvxQgVse2YZko6bZ1OG65ui59WLfY8mVkPaATzJtTMhlPJpSenojzHoHkWJnQkD8RQWd9RhVHe17Y5m8jvxcFb65TChzDYOoQhjj0+Eby1xdLGzLFIjQlIWfIkphfgyRMjvKK5sKG58CMmc0X2EQL1D9Pl1MciGx+appmaZVsoUcm+EXx3wfE4Lp6OELSTLFovB+Xo6riiKnfYwDxQ2o9Ft9xRppcB6P9fsKqP6oI24iE/dWht1yfuw+RLqeT/xlF9FNgnP57I91OxRo1jFVPFul7vT3lHAKVWBJeQYouO1Vht6G6N0I4Z8PhRi87IMRSZQ5VDacaU2DX6ScCvNc6kqSWaM+C1x3VaSvKF1SFRPWCD0mQ9jrziSKF7qJ97WpcKwWpCeB0XvLzkAgqLHGGRxGAEb4b46tIVSOT9+gg5ZO2sBp2vFTfiZdumtSUyBAtBshPA9pAQ1rJEx2xOQ0NYQLL/ZtSjsETicGunxlZ6jJbamdfAoXWe068W9zUSHG8YjKeYo/K6FlkxyMUlqr5VGR6mOu3vJeN6hZDHa8aty01adeSrnezQGQ6KBujkNNW5FbQ2JRdrtqsyG0/JK5+CczM9SnsPaNr2qtKlNOFWSDXReuMj0B2St1CLoOm7OETPLS7VBfkpufPZoWFLKeKNUJm+U6kE900K9jT/oyUh5Cn7v7brnHmWfT0MKrOV4BJINqDIg0mc2iixCuV7bzrF314oH1nuHM7Y/4s5vTGw90d8wbiLuUIE7tqUU1NaYeudHliWh1BIEqQi+5QvIRKnJI+mPkxrT/VCh3Y2W8kaNceVcNUY5WlBTBMVI7zg2cx/qqORRlvkGJ4kxsvKYAGB93HdtN9J1ccfuQxnu5nQKtrzSdxVBG1kb5z/IGczKlkXIs31nzEqZKnIpA4Xae7eRsKn8R8fjK8f4wonWqlEhLpAlYNG2cf1THC7CKbyJTUs8nQtt5NxCB0PIluypq5I6qhreL0ricaCz9bJ1rKyvZISEr0TLAlin1MRU249Bbq1amlhtRxT1JKqeNZxf5/TCtrVroH9+uSTRKUIe36wHv7khbsqSdJtdZSaGrfJysGC/6BKbfEmuQLIWK8Nm7JnD4gIdhUG6GcTO2qsYzOkghHKIsXGWXnGRKdb2Wy7Q24769MfWZn4DiogAOGNM43J1/MAR5UDuE/YJR6tFzJUIW4LNhKe0u1cqjgnXswgY4U9DpeRoKGNg0aM2dSTJvbkF4AhWTB1U/SupqkhNkIZDln6VeF9NbO1751Ye95qBPP/zAfverjP06Q9Qsf4YtnW+8Qd8bngzvIA2rdjGYEXVHzG2cIE7OLqRTheriAT2xLUhaejiUKEdHf1ATXxqJVSzzAJC8Q7G5cxCQsxHJcjUZNHNaicp9O4L2KXUkWbvUhfJ1yWifaG9IR/wrNVjIMe2IgtbuzrQvhcJZaV+s0WB5SuSEYd04r1NlWLfaqSV4g2EQvwOs5oemK1+qCLUNjS12sYWyPhNwjsY9+B/WAZ5cko//9zobK+C5vmwDoGdCvhNLZvqGJVBaw8NB8n0YC7pZZRH1IAudzFB5O7Mr3RqcCclV4X9/JwfAIeYLIbB1fbSgqFc8Erur49Fx2S40r+Zi0Yq/KeQlNLaoWqNnCjMgkAmjx2wrZho5TBIJVD7SSsb+7HxUdJQoQj6Eqa6TgM2/8GgKn4849jm7fcxeABKQ+FkHM43EeBanZZ88/JGkTb3laFUbTL3ZyFxdUY8S/2De3LSckIm1BF+p3ia2db6eU97PHDwmapdQVpgGcdhKFtGCvVKr5bMrC0SbWcstmsDW0KNsKpHUqbAy4+x1G5RZina+U8/SS15IYBPoZpBES2mC1Bo5DHNM3jGxofhUXY1DOZfmhomqEniJRPXzFYfC3ONLaCX1u6z9h25tQmMUhjkJoI+NADqLgQ3qEIgi7rh+MLZ5Dh4Mp5pBYUXdAp5HLMrxWmU9VUHqA6LOG588tReA/Un9a1lPZskveLm8xGS93QOLee9IpKo2VRv7zSqKVM9oy5SAqPZzikaAHWeN4homTL0r7WcrK7HBECV0yX47ijgx/FSVRA6pZyhulbRuOYonaBGrTNj3aZ2Rf/yIJn/jYyFlJgih2Q6FP/5xKS8BHD/WhUWMb480HVstoyYNB9YycaMMbPx1NoHkW4svVMZF/je9IQVkNeu5qnUT9uWSgKaZdKuu299EBu8x7+qWXwhAPlbJO9bRPSQIS65Tch2P6PREH70Gm4HF+PCJwL2NGzzLTF8YSAUTbPhyD9PzzysEoY9MIZQgZfOOrwtUKz82cBJDQS0QJNN03NCBzqzuqHbYywfAdrxJJ9VvuAU7wjBVxvV8OnFFc4Ik+KEeEy20UW9UH6lCIlA1Skyy0COy7rsUPogo/aiTN1npCkciPAeT0od2l3r+iYk+xRPXsCkiduA0PKFVMSjZffT7LMkY00Yqqd2P11hnhfHav9pgEGhQWMK9ksBJQsoTX0Bs29SbqXchsklJTVND9MyfJr/+LsjbQL7z4Fxc23WbE0aqKszWlxvxQp6USynVg81hTashugXbzToIJs671bwxqV/VX8AirklZsWLEJMHAsle8HtSKYd3cHyUzN9s1K7s2Tborp+1IYjG0y+0KEW6hWQuKrQafmWDitrap7b+y365BjLv04jJgEJlQR93g9wM5aF5YyWnnPjHBQW6jKgo6BCV8MM6yzH/6MiAKOs2G2oBouJftNs/3AWYuERJ0qChqjILiNgYUaYAh9YnZgKGmCGr4edfT5bxwoleI6WpziFd+XiPWKbBK4/ek/1G+Lvor0A9NU+GoQ9I+lDyumYBCRndg2LZmkMybjkdj2vlAf0zPeN7xeMiqjqpTgEjT4u+zkb4OvQ1ES/0KxVhTqxnXF+8jjH6rYu6HHWprWKleOSymeZ4lomQyimourXBbFOzR6fok8m0/CjftvgoroHcrbS/Hb3Ny7VYd+fDMmTngbUGt2Jo4Qir+CdPT2GYKYh1HvTL96l6iaZom1ZdUySfjaflkmbc1C/rxNuERQnOwaklH1ImKrRoLGMPyM1T3jg4nhpTQa2cRRQcBsGwN5HkBjoHJJOa3d4nQtwklfyt8BK9E3DcPxulfie1JXkGHzzeHvnJcaD7JBySgDcVISHS2G0GOPySDMzd8QdTghHqFiRr7EHQKw9VPpHFOMnGr2ph5PUyR0TiA9JhvjM0Tf0ENq0wA2OS/emUNZ6ZjOiutFL51+Z146172oUXIRzxG3oOZTw9AVKccCinGdH1oxoE5ZEdaNm4oAHnxyIZTUFx2SnY9NTupePLR+S/z/U1JA+JuamS14fOTN9+dd1MKgieamCn6tYnsmuUtdVX4hn4+/+Z7NvSdqHb+5zVlRBtymhUMWppDs0SthPB+yetYTXUO+Xyy7pV50pCT4P1MKNNdVZvOjsPWFrzgLqsFmiu1FnLqFUWEjx4K967Uk8HcRTm9GzSyPVFjVbb4Kf8DyXLZt8BUjhd+rOtKOU6YDyVcJXMj85poZRSx++orqQYgK8Ws4tf3ROXcQPzCIU4Kh+86sQLvi3m3ydTrRR0vQ0NkQF/MSi6pv88Aj1CM8d6Emei720GIjnLQrakQFDuIHVEsuXqdgnEEnLuj/s8Lh3nPc5INqkLgvTAXMIOmqeqTUZKZhz/gH6hJYwcOPs7sYvXpRx78ZBBu+XDwhxO6stV/He+uZB6OVHkpKecBAKwVvyglaic5LsQXzku21MdoMWTuYtJGkyVtijN154RkfKfUKfy+QvxWWN3vN5FndQTCdV+5SaShUYP2SfDxl8MoCJPECu45MYoH6FR2Q5gzuGzoOIbrujGKNDygkW+/EH7fspWSspFH/yLu/uwPAMzMHe0yIlL+moZtsUAlvdKGDsncJ7ynA1ApoywvI9Y9D816cVRHc/4YjnuRE6Nu4s/yKdMGbCDck0QSdkums/eDrA6+C6n2T63ZKFolQgH2AmBTvFw+3xmRRaPD30AGV26JS+gcNIWn+wkNNHmXeyJ2HgOWLn6uC7x7dGaC6cCb9APXbgjAeqZpIA63DmvipOYqjwsDLJnYkUmJdXPZ5CPJhpZdRQdkjMZvKLEtAHchIzlKW+KMZgcouKJDVhVSzu9V6X0W9hrggZmJNfoppYFPY+cb8FAvvgQunpIvn/dIqJ7ywuEIOjXBpW8mDerJ84nFxGgW4lLCwjR+EiNjTS4Od4/+g5GSIyoAarPktNHU+fDklBz3m8XOnkAuS3AraF8gwIWvMCWw0j8Tr62OC+jQe9PgrOD5tdMRgl78TM+ZhPapX+n0ce3FLmNePSnpqnDOvzewsr4IY9mb8wFdmnpWyuP7ATLoUOm+Dl2jNfpy9QhltZYMGJbHlTLJBL6vfeOOExqXFBev/WEFfIj5XcG5kcH/WFPe/mKYHgsbmoTOQIK720zhesjmkwy7xBYKUWeKYjC09aTNEc7iSHPeR8uVHqXDC55rht2qs5GeeVvNyetpiuZSfUdpKsvmUX+ex5LIzdBF+E8cEf1rGM/LpNPsfOqEB62W500+MiMkWotZIM+h3/Ca6Y4wMBMfTJzy2VjKiTBbri6TXaeYD/mlXTkXNiXbluuBOWZTetKrlGC+Jvxv4HHlxSLk8axp8zHf4APYJ1JzruF/KCS1OkLi7VAXdq1/zsDwLx5DrDeUcdLkuZD0cfm2uwaMvNT+kxxNCj03Pks8QtagpqvqMeiNKn7zNQrBi8Mm1FdTLZudWhdQXc8cN6Nz71kl9NCsdiDif0ZIYjTqpa/Uif/FWHkOaF17yTKRFDN7cuVowtkRi19atlVWCnTWsDlzU9Tox81s7v5yPZcir/q4MrbfQrhW1x3pddaILyGEz81hCmn0Mhan54hCSIKEIAkvCPsyRK47VEbjsS/IfHaAw3xwaIrQ4SQ2PyD89OwYoP26cwyqsyMuRBOoEfgQ+OoHkb/fDf4Wns7NDBwLITqBvS9k4v+SHCmKY8IPXWgzPZSgOlHcmAzPbYnOjHKT494IEFHjU3xnu5/2riAFehnJGgMmDSseDRCKy/QEt3BIFwUhg4+JtnJ4+OGsUiBphb7Qb9fHdFsvDd3OZ8ydPSye9VXZ08PweRjhH/PxLU/tjXT5XP8C1Om79UsOYPeubsWTfr5nCyBciLPMA4Rr0Vhw5Yk7zGuic31jCcGvKI1B2xZYLaFIxXOIlPj8JYK27FFZf6iQ0QdJe9mIYWYIoY9rTaPXgaNHKTuDJzlQTV7YuwEbeYPfYoyRoX6dKEUwMNogaONKALlzEXlHBzvgs8QEzA1mOp9LGp0KwSILRkXNf1KQm+13SFNlD3kSSd579A3hyqx69L6G5VTCsvAhQ2oPLqURt2VIxgDCjRfHm0PHeOqr7WFoy2dOtP9mUjpI5qx7wqZGQrmf6gpwEqdxXrpmfr/e7Gj/dA/IBQm/V6jxBQNMZiQi1HCU60mA7Ti0u7dLOm00r47OQ83RFSSwL4XKk7XHuk9GnenIoQlW9fag6cLtfKgUPuMH/vpo4qot/i0w/861KXDvDphJbqp9iSlQLyuTREryAojrChOhvWSOt/gwP18o/LSbgYRtk86b4DTsW4y2ReZsQxOMlR8fEPHW6d5yfzNuNxmyfXr7lTCWMxRS69Q1svajiAzgYhtMjd9Vu27sxO7teWRK9Xp9GvNwqx8uD+HV6Zvz1Vwk3sSf7nUvxgAWJrw6LYW0XNkKXU5nbWoSdhe4TL4+a8szyF2ttdDt48siMUFczF0FWf1/HB1m0YtUuwbHuut+jucgP/ho3gHzBIMpy0P4mygCO9P/m9BjoN8zV3R9PuxviqufVj3Ao72/x29dZmrVcpE8Z3/cTyetH+v9/rjes8U+2vz0kWGYfTRdJzsXxQaQzZyRZh39dR6NVW+1EQ2JslpTH3NLnKLJ29VheyhhAVJ9iZXhxEpSSusbxRA/r6/edytZ44TSnNecsVET6jlZtdLb+LIunzVynk4tU8Jf3e1I4AohjAXQmEXXWMtfm8iltaROpXiL7njMQQ6FrHWO/deuBIVtd9kQjHl+oRuBQQhcpVZXMzZr3b7TKCKtk5VORUhlTKa1W2tABUUJP9F2tJ3hgmRKNkgNyiqhw5XF6YITLPJ5alFctokzcJL87q/xfp8smf51PtHiNu000i0bo16rSQ883r2pWw4o/zfFZUDxpVfHBG1RxrSyR3g0sMgenQXfMwIBR01tT2mGta7fPGcbvhXqVqbVdT73Peyftw2k1Cn9/sKRnA5c6d3+bNA1d82XW955Er9t6GLFFsSW6LlveumP/OR4MKJSdyMY+0+EpWS8maBV59KR3zOcCu7R42TPzcYdmrvRwnvFY0icwfFwfT1aT0g/TT/iUXOUegkx+SugJOSwxcvgOqZ9iNxrlQ2HilsyMKh/4hrCkJrWMz5g/miIVb0RsWTWEXMr7+ckWuTL76VrK9jV49LkZOI/T67FgeYoqDoxkJ68Q34fDmhtT3ZNV8Lo1KS6lFREn+ke6f6M7hasYh2FBf3+Vde0JZ0DcsKOhLp1fMevKc7hocMcSOe19L27RqzvIkBGMW7vxLnJe+WF1zs+Rm0tv5b0W9pJN0Xu5P2kMAuXe4m/I+jmk9vQjCtKPVuADLv05zCRp6+aBCWFjg2khg3NT44vd+8uOw214DUir9bcH7Qannz6t/bv74KsH1WezfM/Cfh3z2EGmPOT2sDEPo1ejw5AzQ8cN6CyTHBRd5q7AVxhi7jVR9XXmT7yAY3GQoPysLsjHK2mBiTjFIxliK2hlE0M3bTDUUdt9zPGO7VxDVLkw1lkKOm7N9lfG8RIvrxiJN6MuDLuHYnOn8/U8hZ5nvpfz6yOrBbP8/RnNG8wfICuuDzyqt9vXgvtcuJTe40QCTxta/VWLBeb31VhJbloFegH/uT5EZWwjPFOcZdxj6zZW7cHQ1jYFxLYcO0NM/OWkB1ZfbRevLz6cEWG7op5GZvP9E3//KjWKH+rrPr7WbeT1j5pqx/Znu90d2lNeuSAnhBlTUtgM3o2gcaXLv6PRWOSan/ej53lc6/+BQKKkLQvYDSMMCajzgH6FFkVwil1rK2GrvT0BSYu/6RM7+/eG9oimbvd93ERc8cW8ysOySHv507yJc96vaH4FLpe3BcLgpyxu7suCOHKTpRtTB3uMFzXjaKxV9reP3eM7+meYmd3epXoRnPaAKOGSTFdcbTq7evMo9rO+dA8/B610G++2q73BpdMTChsXTjxBTa/cMCi7RrZ8GXUq37M+kiBNc2ekXolJ/7SH1/O/Ia3e6NzJYtSJ3Hfx94CH0f3++7yftUZsxYvr7leyn1S1rtiNDxeu/1dUHtPOGe5APazxexHh5nhKYXgNL+nSKKnW0rEhVOyejJLz3in/et06Jm7921r6QZHXxTX5QZzXlbX6g0Rrpv551nay+3583IbX/daFKZuroCE7oXKFnpplz6NKg7icmfeN9iyNRW+U6gMtbdtzaPc/uQBqbWx5LZo/hpahwLHFE1KIz+4fcsu5y5KAXkwowyk+RCf1ExLVe5Mryrr0LXXT+q5PVsW5fqpQdevyZu8daO7NdapEaoP3DgTBvbjlBvrEnyR15DGz/B6xNwQPUdlY976Ugu0X5b3yW7NrHa1Y1WwV2S2+KbZ5rkgzXMBhe6LvU/fp/emoX/m6rf0Gu4HuNf3ybb5Qf0tc3yKBSMw5a+/c1Ry5+QPOdsd5bwRJugv07iuH824NmP8KedIvKQSBKNGp3BSCJLDChQJ9IXf75PBk9/C3yxatrs3C0n+OyAoX2nyfdTC+ctpPk5Bd7q26tXuvmGaGxCuIx1Y8qxYqNuqTu/SvE8v2XqnR3PiwgB9spS4k9/LefkoE7XnwP0TRV8wltibJinFrUkT+tnJ/XHb2W5WwOYm9vb+bpkb0Td3WvfqAtRNde9Tv4N7rKVcuupf16goYOgtNvrTsNKjLY/zDQaS8+4zsipf2+z3x6vVbGmSe9WuXWwCtlqbXbHLd9figtF5VaGG6MnZ+e9ozOHnQu1PltA3xEkNY8m1NemeyS0esmI79Xpn6rGZjI+NP2m7F1wH2Xcp8w9tc1rBL6q9atv2rukvXAIB2lHjvHfyrGO9ofYHxfWgPIl3NEj2K5Z3hjZmA365e8Atr9+VdbE/lOSpzfvO0g5SBT6Iqo/I+XRfX6bCVhGdajTWw7deH3TjYWZQ39AQPNMvyPjVwzufHKFi4f4SGinNGPF+O835R0zTMspRZlj4O8slexTLdtF+7KDaVG63HWaYPLrGdSw89MvKJFJlSkDqspRB+SNZXX3lIJ0vrQWS2yZddyzf5MaoEkuVmDI+3IPVmLN0pJelmHA0jsnQzfp+XQrGBwGlLus1EjsMsSZ2lIh+ikbWZsp9XrbbRnUuRCJIg0sGqmqcNCKJe0mSHhqRe028Vl5I7v2QoHhORdtXU2NIYuywtRxxxsnbJWkROhWa7BMC8wfH1amyO6LkuEf1pzzsN75I/Hi+lrTwQHvn0yI4AqAyZ3ArJ4PLLFWg3nUFGlqMo2Qqa0HjRW4p9Ol1SSTWdhGXO4Onm1DpKUu8/c2qLEfXyP15x3cuUTl3DZLiWLyCX+YZCf3irU/QNIclpZTomx+5SxayEO8xwrXaRnG6oWdprpz6SjUstHa/E24f1RDpo7GIhlSRp5+jNb6S8lFFqHGyhXDSNpigNjZPqV9Vc2o1mxLNxIWyhNW42CE6SSHppR401fVC9LB2cqYQetcyS6yHn1+6PRz621lpqMb7o/Dwo0ra2urjSkSCStOzSGz9NOC6bC631XisUcV3psOXWXNecIgu7XufeqpGTn7Bt9P1V342wDHZxjSe947W/SjTYuTapidHf+9hfflbHJ+hAew2t+DG8RKYZnt2kIKlRO3R8H4lYdOr+9VleVPuC+dbPE5Bjr+2CtYVEnOxh8+3qVinHY0sLi411U9R7/HqlLvH499/99cfwKzyuJD+63i2D6N3v4mTiQFT0TVSiEpVIjUoNodr0xdKLAgUhB4riT9WUJY0ofCKOaSfrdUCzysQlxcyyOmLCuotZhKOxgunCqVAyHJ7PhXt7ZCGS8fqDsHM5+np074dBLPQAXiI3rlnwcIfW6XpXqfzjoFGi4rnfdtz8Hg5tNvOo2ST9sBqszEVDQGqD137UNEuFnwknMGjTBYFHrn/77WM5av2CW94llGmtl+lLDyt7ZqXu934y+dJu9XPBVl4cTP1pLrjACPnS29YXfq+kA+s7wj9flw4KFSEG/Piu8s7n/ip23j6XOIJ3xnjiV/sN8aY63qTzNInfYU3U8p3UqhK1SP1fkgFjuX/Q68blyBDkJaHp/Qi8jZg3ApgX5KuGtIBryo5zWnDpeukn801R63KU9xNK7t8u+Mvo/ZCv+LgjyGWJTbUs31KHBE6D9w+BhBCUuYx13jfhRzRZJRprAC3Rbe7bGhxt1IGaolOEtxtsUoGcqHpVMD82y2CUGqYjqlspIEnT8JKdg60JkFNjfsPLNgoxSNN07nxs5+p2nIGW5pY3WDnc1h3IaW7kw9+zuyGPYZjkiteuHW6Qgpzm4iD1OlyiNU6M/0e67HRZICfp9NehbPdLNoYpWgDb07ZeKmucqN4dusGMvQ15bi0SM/nDo4mlgVGajjcxsq2Xjk9NzfPOc7RBDWka4fDffGHjAWipLj9ahgUuwRimaeSD7fOLlmiINELeVz/PVbYka5yYuleseM68nzYW6YRuIHG7ulTGMDWzf9hFER+1tdagpWkZ8s/d4dKELVLPN8Rx6cCkiob3XbmtltanJp6qt7n3TcUC5CQXPvTm8ENI2/klxC0d+vrR/cfADNGbZnsOs2HyCKZCzBxMTN79j2XzlO9MJp92Lr2yOYh5GiK//ZYyHbiDrYIROcYndOLbrDfAAZxTKYC0nO/SwVBzU+sQX/DNiXYERB4XY3LJJHjsGAQhVsv5dQTSaJ5UDgpVarkgzL00whACupZ+iHzPS1dJhXz/g6AklxWJ8vIOufHL49ZllQr8pG+OE6Py/6xPKRAmkrR3lWsTtxLjCpOWW9nsSa8nX/N4jLyC4/kHTWW4LZcoQFIONkodUkl4SUef42tm50Hj++clySorMIk++C2zH+e49y47JSr04L5f4WEYQnq605ruuU6Qw5PBq+6WHOEB7T3edYTv8YERv8dPhoN/BFQuSeTbeW7Avyag9ZpAYx5fAaBx05Gh0EURaNVl2Nw47CIbaPG9R8AklfbOFnUor/GHR8j9/ZodGRrewI30sRlaocmSUMrNhM0uhhpdaxG/BIeoNIEepIcMTqXipwGRSrGzu55UVFzfuP/RYMLGKddNrGJoGtXXxPMfsNBjeYluG5/pq39GUSfC12+44UsyzMcQ3ngxI4saNRhS16HhGxkW8LSWeCV7h5v8byfLdpZDzBzPkAdde8xxGKD7t7jAce7YLHMnkA8FPz4rvz+4mJ90Wa0Iw//3/V+CVzReiOgfrT9XDHQB0kH43cjVfvGPJXpXFuyyUoG5Q1amBr5R6VlZYOtKM/OHRVCFu1yQ4Q7XJ7FUxVqFiRfLurH01ysWuis/d5qAIUkWvQtfQjoIX0RfXJ20kHIB+IyzVd7mUtfo3vW0DQv4HprUI1DBm4Qp5MMNAjgNV6BtwMmXNHrZRaANVPjeNWkkDLhumET68gEdSripDte2qHZ853GtLtc8LHpEbGOWgW/aXIMwBVutHW9YA2CqXLPPWcXZD3uoOoImcSROKmnCHskOeibBG2ZBqpxXwK2gqBYj0VGtXdj2nfd4VI7GYAzev+xc+/wJjaOanGy3lptlQyFQVswpBvojl5wbxgydh3e2MwSFW3W3r3q119K6PIvGs0TApe5GWOG94gTPhIsY1JbvAGE/6K1Qebb7veQedWLv3+0Db16GvDNgCpOxSPXBW0umKuL4tO3y8FJZjOf6l6DNJmx/Rije16oztcdUB2B1e5FNMoqI9oUilx0v4ZAHk/atTFYlAz7nFuwQNn0LDD0rc0xkVO0fDT/lUJnwV5jNuJHBST6cBzXB3Yy5+eAeO55XDr4zg/RZM1lWs8vttGHtIdraSWLN6jajDs8DBt8+kft/WVL/Y/DAWVloGGH5KvjZUua92oPAfqY45aRDQyalfACZ9kPcuPWNs7RByeQuRwq6/RFt6Yn8/Dvcvh6QQC3MkWJ1lDf+mcyz9y1+/roQ55MBhpjuxk8A8nopZhIdHAIUX0ClxTturFQZ+FAhRM3W7+7Jpq8XgTmMbmEVknn0giRud9I0NxO274cBSdzxaqDNewWtHRlm29+OMjQ/cs1/NNb5LzguG9p4KY2icvIymwK6ZQJJ6KOEgjYWdR9kp2/IyiU3dWcskGpXTZj+6rm4OYVCRIk4PJKmxmJHeplCp2zg/1CkStgOIJjtdmQrdoz3nkIHw0WvHjxCmIqSJOIbERILMY1LxJcACrZQMTM8NvV2V0aksp56iYg052AguuZrFFCIqc3lViwpLR+BECSO/XUWoBT2xXVOQklE9Hr+zq+HIOn/amCsk2mg883x6KmCiA4zCM9vSE4UU4wicxbKB+drfDANfb9AvE2LsrLMRfKuq8aYFih2YxpxNQ8YFkr6mGIPGaK6LQBHhK+NvI6NCdPDggWiSEtscY/zz20aBHCB4XtdUU8Gs1uw1HjxjvrEONR9k8NERvww73L4AmsUJsGTXQ4XRZ+0AKVVnN1ujQksClPH3eDjSlI3NlkdWMNCg6oQmwSyisKVeUxMjGbjGwIfEqGT6W9E1gA0wIQ1Xlr6Oviqp7v+pAEVfdfoj5lm0eTIdy3RBxglxHHy45YHxR7keUjNciJg9MRlhC403EMpNFiTb1BI5wAwhgAoiysJJcBSs5wItD0x/MQMqrG3fRxnQpAu3kbe+HvNQrC8nSKFMKCcG+zrLbA2JsdTQIVPk92l1koPXWFQuGo0EM8OMbo6ovT7cGopwxKIReRsC6MADNIAod2agx4xz71LqIPIryuYg1V3ddTopAUOTqSFAxyIEnp8d4OgRm3VPLDNxzNg6bJrK7obIh9WTBSHwlpSWH4/LUbgyuSjZrlVnZAMTCe0MR/FxhqbItGW7lfs6WBBJCWcJPwUy/zKv3GvnCF6lACyfHQwED3leDyOKU1QGJ7VrPeX2/E4kzv/XEVgitQ8m6qnRlwPrqAgKhNw8oQQqOHNCRSWxGuSp231KIeql5TBspUY4ldIf44JP/D70lQ0fIYL0plpTFDhqG7rQD5NODbIw3QCXEklLo6LP3NkkqkJubx9eNTGpmg3QidWNsCsrAHkRaEt0E4MsAW6Agze0ZHQiQn5a2UQLAKjU+ECyRzeZXJc+MYv5AXB7qyDJV1qXO1TeKbNK3gImYWc++6ZbsbsJDsfgUOtja7SRBD/gINwsLRcaiZKNL8WNxoVeNy2OpLRgJN/RCTZSD73aS0T3EXofkkptZY83jil+jNBytR0KlpO7JdRh5TsZKa/6PipAW71kGnwv2f7ntJIiohEGuBf6WSzlndKZZ9cgyBMCywltWc9oeGqCSy3I3kvX7Q6K5i4GDbqwc26XZJ1bfCKvsNoOOAz4+uy/6vSmIwIDhG+bdrfdAsf7cY4KPiR1rjVNXXBjMy76M7x5Z27tblTyNuKRMHl5rWcrvkNOULz6O/czAFe/pvaP154EhqsMKJP/i1264pmqJXQP8iQDnfK7nzr9OHFS3uRkyhV1DIbGFYc3DdmTFtG1BwA/byOu9LW9S6j8fOfnPprcFa3K/OPy+nX4yXhoJUfCvfM1k73vip70sk8oBvVT8mVz3Q4d08PXMix/mWz+f/X7+pGFNOrO/w1ex0T6T4QVLAhw6qyBBIc9Z4TCM25x6+9goGWPyRn8LXtUHljUREQhkEiyzzv78iT6YgAWPmhBNIq/90QOzuk0iF8fkyxx9Sdf/3s79sn+u6q6QVg5I762agaaAPx/M6sCEzOTASsHHc7+m2l3B9l0XNpLhg2q29zVl79mLzOUHv/tcf8aFXW+sGVg8M8NJcqhbrlfX0n669xS67tk9+eZaeLIgnpFD/L7nwi3hmHYOzwKnbkzlsG64JRxUjQ63UpIjNucGOqU468iFd7f954V9DbygfgiVoPWKImtUkAP9QCirIo9delGiJLcYeKQNt82l+yC6NLaYypa0XJHEillKcZdmRtreaN7M7amvQmwFhZea+clh+Z08vTO+BCxY4hphpvFQBN4on75k+7nDqXn/IqBFedHrd8YWhpEICeWqo9L1MdnLC1FXAtyJCnihpkJEXTM1p8y/aUY1OteHcLI76wE5eCIetI7qL/sKqiyGB+RfqdFVbIjGdaAM/URNTAC2bTWTxlnVF1NlbGP9C6fyOPM0aSOJdiJljs6l0BGjLgx97EHoHvFniijjIQfBXUFJwK/ncgQaZl6+aLzfTvRnic0r8+k5ESRb4TaV38VDXZaPNItJ510oZPyyC5ow8djyhiEWW/2Ecyl50wPK6SsEUjLlRSFxqgOVwZhvaTAHjSgiCP8afYAverBcVdB9KTjCmS8mm/6mnghQEDyjMpHovraS98suY76RcIlAiX4iheFa6+O7umhu1VbiHEy3AZpoNRjMnpit/O7fjWq1mp8tCSZStcN6x2ho1enXHY8c5SYTqXOxOnIbIKJEPRy1f4XD8bPj9cPLTplduNrEdOePWWm4F9Gdd7QFFzoBP2KKRwng/bbxLCW3jjhHHOBr1OkRCrn14dLRtFOztUs/assb8Z2V915MzoAR9cDes3Z/BmRX6Jf1CISwHgmhgSbIPRPtvDrmylNJ9tAZw8NzCkBpvuB3n/U2XirPAhgJJMKexmcQ3ocDGTtsThHNFK8J37IskGgXpiDUUbKJNXgcC3IMp5uqkJwICyFhAuabL/U5BxFW3g+L2JtPQeSA+NQMIeto7g8WllHyLkV9tMglPCZ2hGPJ1Tar0/yJSdti5RS0n1GrTEKYALCZd90tCHF4Zb5BdAtaQasU70AKE5V9gX1Ev1OMO5JZ3y4tQe62ym+knFHmdAy9bWf2uYzujERYkpK3gWV5GcOVr0ZkRODGR/gldxxCFz55JsVKmj59gswCXRqGwKsF3NUKuBH6LhoAOMEGCTq1Lo4k15y8dvO8Wum7hrk0lpzNYJnE4IMt4KqxqLpXXMJOEcVea2DOC3eZNOM+FoZ/8fP0cefOj1SZwlY5UwlvKaO9lTd8q+2/2RKwcCV77QxebIn4o9J1PVgP+icNummz8RYA/GrlB9zff2zij1ufqMdG4voaF+pDv+KOtg9s0L33q7pB2UGtdCWsvmVECLEp1Q7Cr4JSSradTplM1JjYJroH5KIVE46DsFTwQvYWCgvy6MEUXa3z3LC4XyzTOsuauI5EA+XYy9SCOfbavG9VSgfmTSnfQcjORsAHkbz20aAxV0qOd4mcbnMvrjzPkcDGiGhdWM3oGV8MM5DAMVrDaIwmV72smbIYhgzcs3EoYMcU3ADErTvrZ1MEXRtYRb8j7ZKs4KbZtIW1BcK4luUZFUCSF2/hAT5oG2dRPFzjJcHMQnNcSMRerxyYiBFFO5im6jKvSKUBOgR6J/S1RoGZqCQjSC9Fi3QwOJRjC6AqqcODsyUxIQivx5iXKMVovKIwyKLg/h4x3O8nWo46Rez3WnkWblsmvAK5L8Wc1p1+gKN1g54i5leBiZxRuE0ZODwsHFJQ40n/I5wRZl0BrPStr+gBbMbCTT/PdS1LzUoMYayK9V5myVxlzR2NW3BSXwPYwGjyK3h/uAVJjlyazcAIZE6duI1/YGGBRAa6tAVd5SlSA8JECjLB4hBOljqOs8lHyLkNgY8XAhM/sbv0jPkPgS7K7SRhu44kFX3xMTiBU99rhz1BRtoCm4QtUA0nl2h7CsDwK5jAdf5y7tpi7R1G4Vv0uFTl11rQ124Xg90NGL02/Bcgzp9Js+3RXw6m3Z+VNpEcEHPXmGtg8LntjVdhDOM4+WneHLqwVy7VpoSPFUFecF3seBPy0Bf0GdpATHgpWP8u3DHNhQDo0rWF/zvnBG4NhxTG0E/VXkYIVREmGupH9dWKaqXfmLhPWUQeTrcjrOsYTMk6VuqfwUulAC7T6fBxeTzBBNo0FqQIPYchl7znyyOrVqM9N12HfGUROHenVMfHkGysEUburgRCKvnX7bVT8vDpfEe/ojf60RH+zYTnS8ohFFTan4TDTKAJW+UV5fA1ZTG6OteIJDuwytkbgL0HiAu5OPig34yn9mR3NpOcSf8Agl2hC8GLgMc3Hc3MpgeYDp3iln5p+lN/n1pi4crBWbPxs6HnRRuqzd22ZT4VE/4iJtnSXWMwiM7dBbvdpjMlmqDJWKmzS+OodZ780yojLw2pF0jPx35hJhaUZM3sz4I4AnS6XGgx31a+fYqi5pvEBNTkqqFtjdxhIh5JBTY8OBYhUbR8M0rWxHBJaZTcWKnmXsGELzZAVx905E6E13jlxxMZNB2BHb1TD7DqOJn8Mxcn/UOVtTsjVXjUhOwTtzRN+r0UjvnE8EQxEZ856UER/tj4n6Pe//yAXZ99OOPDtacPpAHRLJ77DVPvHaR3ZZzdsMjtEwm0hGQcVWkuHvRYYkjuF70N2PiqSK3VooA26zH6DtXg3O4dEnt2rMOwwXp1RIjG54Q8AtyDZ1QSuPVJTdh/KIEtY0sXhLMZTrTUV2OtIcJTis0TLbTLU0Kq8pJ/HgLmSN6kzlev+WSWAwoY8kg4QCHf+SYvhhgD4Onjnu+vYm82k/QPepgDdhUz+ni1V4xjcr/X6a3/gMYQdduQ6VigdA+snviQY5zzXQ9W3sBINuXSdIMwHGSFhA/3w/RqQkaFLDNEg7rhKwqJr3y+yor/ddGQf5tbrYgajQrxH+8DrNPzRRyiFNfENbbpO/pBHZ5MZYyMfEzDsTtdNZrHdomVZK86QN/biWdYa4lmvM18TS4ZzCSJVU688NpMONFOJY5n0KdPlmNrvU3xcO4ehGMycc5fuxcbxp8ayYuKrJEr+L9U4z+9tffM+dnSyXyb53rjTiHtz7zYGuOZVZi3CAH1uXfIrNcK3gT87DR3bO6rPmjwYp17ZeHy5dvnBRSW65wVadbH1wHh3QtT4zZ9ulLR8996Uh+OH1ufAsbevL/SPl+HA9dMJbh/fWfeiwLdNUgx29denHLY2O77OHNe0vWy/3Vn7owObtH9O1ZSOX2+ukN12ds/Kq1PU2f9hWvxdMPuWtoCQnW8atdOb1ZoAg6VZpSk+HbLVsRbTzuX9Wuv1lq6NljH5JN0Wfkvh7odSftV3QeX0x0L2pmwMyqQSLBc0Y2DWEQrpBzo4huWRFZhd+JtT/1/hKrH4D4XUI6mj47+LNDLry7qjLSJsrweUTsUwXUVQxzYA/ds/xq2Yww9I3HjFhFSGFtRp8jTpFFmLKzwLBTiZ9zBrN8WUKtuwlas+RdrmLhzzc9HCONZqtfIX9K0ClAJubXa9On20+piveU89+tHM94sDPisMdZcS3q6AzMPsotkUKEYkgG5en69L2YWEKKtmRfv7muVVY+PYfdjPPCjWBRjZxAgdiQPRBqTGGWo1IfcFzCnIhi5oxtww6prAnBwGpIJQggjFL1x/nzEa2qBD2+0HliqbV49c41HhS6toUv38Jc5Drx8oDAfp+PKiU+EnaK9LBG4R2x+JROZe3hxIyZGdnnSeSoyMLYcc35D5vsS5ZJJs7c+f51y80jdhbEEodOdBwFTXs6J3zj0dPEZu4ZYQ4Jap4UCaMQZFowP+mMXxGxHpi5w486aGQwxFICx3IgBGiak2kmzM4EKZTDkaOnpseir+KUFE7B/zLqSQUxYkxUT8QIQ0id277kxfzepyYrqbjF1NvDFjg7K1voYIq2P3ial5gVOcJlrJGfcNnSGNcZkUTU1gpsU0oms0q6SUOaVEInNLSnywCkO1C3RB5Ds+qrD6bJoqnf5hsdyLGQUKBPnsGPeKBgtWj6+CyYleuq1hkDFHcWVU8yv3uBHeEYUswaOJ6ytPvuRZwA0sRYMYyhT7dKI0hfE7NlCCdrsCPiHAKhiMRvep7lU5lF8fhqgCDdlVOcz26ooxMP9OZng3VJDr0p7WUPBckFPBdrdRuJL0+T9PTWax9Sj+0xltaZ9hLXvh1o1NeR37O0qvNDI7/tbupdHc0xqZTbEHu+lYNxhvC0DGZp5Tm4SR0txVTUhfsqzOuzO7yGSGAolRSzbhr4GLH5mjt6jaedhdBc0UMe9K+N6mOpARHa9Gmcor+ZnEhdRe6+PKR0NBsIb37XvTY8suBxS8foIGPksbhCzQai6/yd83STwMfBFHY22LjKsKalACGb3IbQFti8dbEHRN0fB3Rzgv9wmC4aPrvP+eWinUDSiizjPE0BnDd9ZSR9Ikrxih3AtOQol6fzVHToCSE+YDWynblfvDc4RGa1Sd0Wg5BcNJjp83nyn7y4QcOf9K2g0NCYDSXQUWT+S/Aix+VDYJsu5YLWPF9RfQzAx05TSiEPJ7SQML14TegfTVrndJJGvTtTIUZMusL8+KIySHHpA3l1BfiisIhPBj9BNlA4hP36PtENNzK/j9iODT07KvYpIGO6rVt3JeJC9+EEZVAvN3Cy4i/mKWlXcBlMAO/sDtSsIRHjNQOUom2lFJ96oH79z7/SQ2egTpahvees7TXAh89L68V1vDVJAI/OPMN+ed4+UOMOx0LxoasyoY2RhJ2b4CTl1Kwihrx/X3pCMQ0kQ3nms2VGLakiUu6PkYvdgo63jr/HT92Xng4mziR+aVAR48clOZrCXOn5HtSzfKf7U/dt1dc8rNDrlpjabADs64+v+cOMjhs3wKtjYbAYZf1bUyRZhfGUzjss7KmTdBvoGRSm/Q/hTOvNNdyHbFoN/J4skN6aoGVYbbSfmNmbeZbeMuY7d3BcLphm3+jZAb8Na18Z7Ot8H5TmNLWCOOpBR7+bh76MjdxpZ1AsINN9K5t2TWiP5ivugi0hcnVB6X58tD2cg/QQ2G7HRISWguMnfvJKWImwbjuMf88K1d/OZs2D8+YXNeVQ9vIsfgnzQXaVVcti53aFwuxiUO/8vLRhqPr6mV/Obr9yoE05oYBFEzvP1aFz8rwfGitP6mO7AwoJQmjnlt8YRoFvwCuQvaocwDONnJpY/i4fvQsyvPvsyR/zpuOYcDeV+AOfRYYiNXCHcjCSyGsPL3ZHP+4AtVdqorDdPaYYCGeOjghebDQ1Hcpk1DlHFSwBqlKBxXMoApVqHJtqSrB+IPasrbWJnl9FRqkghvobTjiPlZvh44gVZAOW458M7l8B6dz/4eNyP/448XJAXiMkhRWCH5RDFD3BGs9cIa/hWUZl5An9ixwobyUdQ2MNhZ5ZAjbHBfKukrraJXXcdlcYg+4noR2XBsq9cf5fPvvILu8sYrL9LoiGLTR4b55Gk/3TcJjwZQJop/guXzT2mi3HfE3w2KbP4JPu5DNmrhcu8/TrJeAF/Ok97OFWrLFxsHLoOPKFjWEfP50sKBFXsZSRdiVJEOloAJr9K9rUni7sV9tDAFgIaLX+f7pLEvinTsm8yCWM9r4z0+n8KJeADHQug60//j2GvC3SMCKrdjXjg3qhzrZwkBAx9uDwmkPe5QP5zR+h0Yw2LEvKvF0Udg4AMTmyBRh7IAWG5jzptkYsIFO7FhjxEIsf468nlZSHmz7v1fZrcvIE7WbvjIw8LYW+rj9xyGdNFGyfrBbXUaKcGj2YzfxmEJbZy3z/75vQmy23gGLjhYlQo1jqstdI0fkZtfp49hbOLRTgyv1feOQ6l8mPwWdS3nkwcI5WDf/Jhx00VXk1CK8CDlep4vuzaPebgdJNb2hEJ5fp/S26aGHOjQRnwe+pNzDQS5tUh4zzSttJNb5Z0jDUVfeglRnG1Bn8bGJ/pAFidDgvjQ1ruz0l3Omg8r0oqHnrIzOsZJ20vYoLa1V1rAJlYe26aZS9INTrJH+3+60QOuUoYfrA0iE9x7n3nCstyULLgsdqbTkf9gYfaPFGYHUI9gjDzz6nYXe9c5o/wKzAW/AqXMk0glz6NC51b61vhKS1BUSapotCGZU6IOD1AMuRSLck3FOrqHPbYmabr6EY/2Hl0P6hsa1ePWOWjYKDzltoswaMuPBlFlDGRHn+iydzidfAuJTPQZVKdChB2SFeftSmRobhyovRJ8+20b4Jluev1R/EcHv99hIOsBRrPuDsklTFn2Sj3firzIqp3RTtauZF7o6l24p6CeVKlMmVLz6fsknZSORMDnLTrTPvvQuIQ95JZGsxaFwh4NdLvoDYzVPdPwTJSYI8UoEtP0CLhJGYcpa3QTvjxnOGKSMxZAkh6sSFBGaIdT3azbOHFLgB6xKVL2NDWTJLHlj0AKmF1nyNNkznp0QIIEnBSx1Qo2fSDLBPtirvxB7ITmWvm/4vQZWo9oErIbpRXGlfphlUm79++cbZh25SGM71tbO7URO3zoyKp/xkN1ILYJ3ceK4MwH1/lbM/RBygQOT5sQIIEGo92uhsDPDagNeKWmmL5uo4i2zhO6lDYGm8lLmYOOqnmQZnlIu6bBxWVS/zeTVfkguET55pR75XaZURC9XVVHfsQNmr8jDQwxe+NSdL4CRjASRr7VAMFwt3IsoOz9gttSXE+lS7o8xGOR2MaH6RIGSCEM5kJveG4J3uyhvnLlmjGVCrrt35tzcc52Fjk75rRIo9y4lmAnglp8LvAcH1zt69sZ1mREzs1PveWf9iL46yz90PTnNK3Ycw6E0+AUlhINMhKaVRVsqMG114aA64FkCMLAXRFcRHwybPcwdFj1A8/r1GeyZMW4r2SgeIQdCxbAqmluzRwXB4ZwXaiD481IB1cweDhfVsatKDmNMg1EndvRDtPy+eAyGjxeRKsoGzfM1ORA8h2mflbRC369cGa0QCvvBdFXROAewGRe6KUp62P0Mf4AgFEogXfLYhNfThQtAna5JQ1+ORZ8IRMi9TkuDX6NpCGCRsHpJbY0vmUr+0QyJmaTIl58F5flGsSNlgPBzx/L+yxew+gfpUeSlSIFHmmrBT+r4EDlMVA+gi4e6fkiNLL0L58cds3u9ynCBNUdMbi8kZ4kkdz3m0IsR8yvuUuJW4yKvU7V/A3LcUkdvnJXNhkBcr7KZ7zdf3e+Yjarv7XNn/+WnYQ8inO26oKD0zJB8nPnEm47p/leNFGrhVKtNeVo8qu28rjRW0Kh6u6u+avIvpu5EY3L/S7DDwLyBuv3ASMjQtgwJLm/9rETqkwkECyx8Xwf8hXUc43VEKklVeYrc+nCrN3YvI+Wod39AUGbZpWGkOzM7X5hXWUjhyU6zbCPfkbV8MbyN1XdfYTIa2dyq/nEOCW++kc7/Ca/XGzrbQ4tAmFVRaT36wUBPzoryCYn2x6v/jCsuSLypt7bVsHTSL1JtTS21iIv+SkR5LBmzhuhjp94PYm5omzycyLudcrzBITRJd9Kgu14Sz/DqIM9jnl9PJMIau+j45fLUVsa4RwYF9c1Dtu58xcSZ8/3XPiV9yzVFBXK+jeUXU8l3PJ1IJCr76Itrzt289M2xqIcJzEpAofzbxyeOvnd/2b/gg9gjwfZgve4kMD2pPnFYpyxQUPWwS1k5UkLsCkaNuY6zsoFF2ZifIgYWurITD4cR/Lr6DqoczWeHPvxypTeKMZVlaM6Hi5PuOz4WJWkp0Nd5X7Wx1rqIlFWYXvXCm194F1cGQtfs6BYUsIDKuyGjsgUcwWoNcCaUj4BPsNzFHKskK8FW2oBqy4Qshxpqw5TlkuuAfyyrLkd/4wg/peYCF+BEmWcf6izZZcVCay+hcNFW47a3yhkW2s4jRcIseanHQfAB6UH30rNpy9n1f0e876mcmywlpY3aePHY0Od0Xzj0K865nLjdhotPLfvBmzDwin6EhZx5IYykMRC/0qZHzOgRj4TnC4lZPVfoCliDvqgju7fcNS7Pb2buO+48tnqyKTDmoJYufQa5t8qkLt8x1mkNks4fSLx8n8fa1mDrqXZ9ax3v9cLYhB0Ec3wcnEVBBX1nGciDmCtL4zqIywE3odSeqsbrVblbe6ZnTJyswzhla9nDdZ6Df+SqNnwvxI80hInTlBwHHj4p+g67VpzmPDxOn682LyFgnDLPTBcrs7o5tD9YH/+zUKDUBszefHeiofy456ONayf3ZM16LY7KtG9b/PX981Lu006GmHFHVVVqvxsPiiTL5FYgGiw7mSLU1n4WsUtXG6ydH7Pz9eubTYjakn5Mx6SJBmenjwqVGx3DFoVtryP0fVWUqM2RlCTovAQYhT3MWT8PqSJJiI2Ov7yIRpelSAzh0hGNl2fpYmRcUXR3VDFYp6IzA1GF+SkFPxFX7EGdgQlZDWRUUfQtkI2PrFsHKpwhQnpyJL6OdYtxGz91os2HOjeimVzCftAyCYRKRbdrh3HhmOvY0rNUsYWV/f9THo1RpMVI9Cl624Q+NdJuzJoeVllaqKbKBelhHn+blunsW06bqWiwuUvF9rrxHXa7n4r1kh72d99C6wcdLZH/c42IL7fr+Mv5nPi16mvqsa9Eg7ej+9QCCTIs8sDNa209ulSgOVIf/0MEN/PfcSmmXI8ve4rVZdr772sIuuiC8UDDRlam1xspzjxMRJ++3GFvsYq8vNpJ1w6+aKN0wrXqdpRF9YdnJLIdy/aYzvmkGcGz+qYmzJJntha4GGiNpIditEP1NSVrrSnTSuYNTQP+ZlMK2ITOQ4gv7VE7+VEyvPK5IAJohhZbL9NkKuEnX1xwKC3oPmb3ik3cIJcGoP4JKtCA1yL4l19R6JhBoPMJCjA8dUIc1ezFaI7xAvzMGxw5u1zuIzf3p6w1GXKbNJZ8qcpBalcB2KAGGJu7aGGqXf+VRyNecj/n42Df7phagJNqizUDoZvrlAPfzo43Z7nCiTC9dEGcgnmnQbCp3zrtv/+k9I371HKCrqt5ibe9WePT2kQrmYwtj7Iu/g4y3SzvJ3a5lCIxo1m2X7NQD8yRdxTfnAtwks/sDNiiYPzb2Mz8j8Tl2/mH8+lKSEane9y/KiYSfSuw3fGJPT4PSMytoxEFwd/y+jlHxkYq9xjx7nJnoamnIhPIQhMyGyp0VwEisIccwuMxfnVII8mRo1491dGV7Alx2WGC8rozQg432a0RhHb5XqjBVzi47AE+czzGwA0/r8RwmeY564HO1CeYtfmn9jCMVo/VHmcmuPN/pOVTquJQw1y0HrnaOGWQ2/3+MUun3o0CXmd1SiKkPVoJvuqdI12T+j1bFDdK5iuUj9xTYlrseOLlVuXbfdzTTScZ/GmQliQIx0HATrxAjGmYEYH1IfBkxyVMMjESSdZrR0g3FbETF18JWcc0IDS5MfnryxXvwa1v1YugO3gXezhOSTSWfGXeGY0lh4mEM/n1DXW26xe0/9NGNIJQUmyQAwt3y/hjdPM9pBnznj/LQZaVq9Gyn7bzJq6xMPvgWQMOGn2AO7qRO789MKiSWVTj7ildDzsC6OrSufmI0ZQBGlqdPR8ihT75OUl0K9xU1F1SJtMDErHPFUzwq03weqCra/+lKp/1TsZf1su+CkSgvB5WndX0DUJkKS+wptGyAw0xT5NRwh8OmbQ8Qcl7K19lPVrS9S3WisO3sNbOl0W0Tf90GkbXzFqwUZYspMcNYxFg7nMAP6pp7s0WDTzQcJxyVFKlYtJTHFtgAAhEj2xhnwl15xPql5sHOBQ/sLimbB5ueSJaBf9QPXRL1zhWqBq/GyjtibnvU2RjHqHTqOMcAe0IsqpZAkH3gfApUiZTp4gSrwyKQ3cEWc7qtaDUL6FaVSCuV8xjixW94ii1EDxaHu6jaApakfIC8MXitqVT2yBU8VmJBSVZMJoRraEuxAmjj+eiKxRZVdCn2KzGjXUb81GhFwquEuVhfp8lXEMzML30GFfQpd9NO42GbKcNLpP/ZnEuWoKsoFXkLzS4UiI00yp7iC9JadWRDV4AUjDtmA/aayVcOh2aIQkfme5OWLy59OOOT+dzLp0v8/Nwma2V77K+4aQx0WnaQVLR5+onpYkdbulCJENt8w3X9jBJnRDKC8kQkbik992kI1EPuscKOlw+HvcnG9zLxYiUiFekDVEDKiCp8BhTkSeFNJ6sNSJ+IesJOfspo/2DCnitr06DDANYoiQfDI0Ug03XBfj4678fLzEOVuMDRTTGqXwHYw8JKbYUgaQWesjwLU7KBRynWUR7igKaLaOIGwxAM8qghVDsCxzc/RGkB+Cz9mB7oeodmMJvBVfjNLublaFJrAjCM7Y6yOseX91eOc6qdQME87bfGGa1lfDPS/ewMNvGWkF316QI+ksKWNHVAp3G1BySrQtyldKGvpk36zVB9KBAR9/k2McQxtPOhv0GjP6mAe59s8l5SGU8HSGp8AAKjNQRJl+geGGEOmwj8cfH9C2xt314Of1pOLd+g8OQvxAjA5JP8gfBaJd9m8OyhC7jaUT5qRHFp6b69F3c1CULqZdnrj1gW79Un0Vp2n7zwQvTX+9zv0Q/wnkkg2YBQW0Sw3hzbk0SsthzgJRe1RECEAIOua3Pg9H7JrPAlkVf5W04vqJW9P7YtVtleIUsNN2jvRhFK6b4JUJDNwUmtxTI63iZJ5I9lOcKRpLh2M1Gm3FpLAYMh10IESHZhopzKegg9OFZ8Ht9RA2ypIytBZ3pYQLPpr9LHadIsENSx84f7I/6jgQnhSSiB+mvRZu7eW7107AhhycLnC0mXwSUKwEbf961+t6AVtGDsm3Rx3j7vNhatNT1zq2nd71z85FeV5DdstanpVv9OnmHWzqznwj2lbIfE/Z5ptoNj8bRSdqyL4iDyyErp5GySxOyeMHPdSJfJj3vWmB3Uv6rKLjb5Nb5dkvgtWjTP75QAGgZzqPlcv8665/M9Jfn8YlHIhOfzjAj5z7n0sM8boCCRZcy3qg5V4u7U32mP5fdT+bys/l7hNjI5Cd5I6ufpHm5fTiXT7kHhoNh7sPqEsN/qfMC0aop9bdDl8lvoD9SGM2UEEyJmrxhp34cIAU5kWiSgdl13ogE4zT4Pe7TJ4cUiaaztUSaG7ag9LpsOOXQt9x7qhUlR9ZS76ZWfGxeB71Q5ezQxxT0iCaoX7d4+mz5KZIG/cMeZASrR4SNPc08NvzLt4qwwic+rZhrvnlK5y2EpPLzhm7yA/N1oE6elI2u9/jbtBF8iO8aXViD5Qp5IHuoTw6ckXti6h9rShM1tt6IVpaAHhSHqqWL9Qnvmz+dTwj1Qp2zowH5leS8waF3hB54lyDh4APoqiw/Bnq75k8Q4pzHh19/2H/9+QOfLe+Yntz0Yz4Xdtrrf8yv/amhLm/hLmWKk0B/IZvrNVmdCLiYI5KubMiRrG0VHqQsxNW0IKDeSMrwcRdk0Bbfn9vav9+WBjRnmHVcF/TBv/q3VgdMrC9DnZ9LdGQPkbKJ73G8AwLYkF+ZMC4N1CGFqTnHFo9bHzQnU0etAfK/VI9AuZMyORvA/05Lc79+sWZy2FSlNachTbVynGk1vD7s3hJsJf1lSMhRbcrIN23Ol3F3PuGkV2RQv9j1OWDPGS+rdQg3WDvgmWJrUDhUvmCJ0JsK9KoLlonmEraESwjnPDdi6rNPp/S2g+l0G3uuF06ZawsScdryKDNu+xotIKlBppRgmfsiVCEeVGgzEg1E2NMSyKGikhH7hs8lQHmdJauvm5YhM/V58kKBHMJB0Fqc5CtoFesK3Y521K2WV05s2DAKPyEgkSD0OpiPX+P01hG6UHYz4RX0btdeUj03R6yIRiDTc5DDFaUgvSsdaBAwxhFfPNjxqNrbPuteYypiLDbapnbUfNGTue6xFXdZRukePqlr+EapOo16wzgDVAwqP0Cf1AQ57BhjkGzQWtdeXNWTRyk1glN2O7p7Uy8q1CBm1lBXhMlScuqFWXx/afYbHNyDgtD8BsI/fjPl/57VNqlKko5NiWoUScmDOFg7WRt3zk6uN55Tkm2jM9vgGRGSROtH0uoxEm4COZQdKmvAn+qiuAum2JGnfnhoXTS8h5zYlOk9ZaxXx6vA8fEZSch0LIYDajGHuf5tOKGkUgM724AJgCkCfjFRWAanXOQXs5Ub4I01PEGsU4Q30NdTa30WJBhvScsvDd8IDlPh4kyNqjH+P6ehwMlMkVchxRpo/YvhRpmzKmbmglwtGUUB5fNkc2KP3ZoQGmAD141Zg5JoVmtqtlHGN8zIbstT8SVAY+s4fshmP7unrBa8aPdui++Rga6QXU0HPWaeCEl1ytIvmlzIR+q5wdzb6rIIfRuP1+oG5REBHJbZ155bjYATNlPDw33hSv0d0zXbaOsSvjxFtS97KiiLZlCDnMJ7TSyLy8h17IMOdIuyqbXpJmQECC6a8sC7zeqcQ3KpUZx+PQj/4GqCF+jPQ00VOhhGm+s67ZgEXzNO8DDHTI04Aa1yBZsrG8zHGOZunurIDgPih+0ROUFduiupwbUPmzlJDrPnzs99vPMBRa+g1quSJ4xzU4IRmXmVnf/uRYWz7okKAMSvejmn3bEsfM7vygLVkotZXZYmtnkj9u1VM1Jf7PgXC2j+yB35VnJDPCSc7EI7Ru/gSgHUgps4KIEztcLV8FTOcokuPrHludGVgCrPeDtHq5Fg46IFu+R9kKtoI7gySnRI2AwURh0s2m2E6U4sJ4dwRSgqfgNsS88kVXZC6yiPYrcR594+G2pSMTMsSmFxo8Pq/k23+7ghSPBWSjT2zZf47ew86pmkRNHR7IvJDGjOhuvA4ogVMCWad64wTZcfZ1i0lbbXeXJ4NZ0jmmA1h20U5TEXpc9t54Dbm+6rOtHSH+4XLfEkiebQrSFCj6QujWqdbEKGoHm7gfG5ujTmjdwLA6ffmlbaHOHoqJSJsB62hLQsEflO5Q7JAYRL9cDvcgg4N2iW6rWQ/5TxCAgMCO7dIYc+jXhQPIFyFTfrMyVPWx4fu/LA59MO6ePBsz+uXnKr2WPhnT5/Bu0UlE3WGPkyqWJewRWXwVC82nTZn6+J4yDBfLIjyW2TuLc+/nKjZr5cULqIIx5Scfq3u8KC4Q8ByhHdqe3OOpP3/EdfiDILnWckCbqwYERJHMmR9+xHHvgLPAwHCdr/M01tBwIcI99dMG0mYmIydeCUTYttcNtjlVElL3dCFYo8sgWqsgk3BR4AeiwAuyEojpEpVkYHkq8BlZmYq2aORwxE5cJ+AMJCQMAwDiyf0gWggFl5MDqCrIxCnqqtjdj0fPpZwfJZsZCpAWqVXYBbNdFAYYcDNRzo99b7qbeG8dVVW6yFJ640wTZsui+RqUgNud7m427eDn13U12Z7V8+IXLsrBjBCe7QIXudP4qGJy4FUt3Dy02xbceVJc4i+YcmLiBi1Nm2e18K5QYW2B6xTiLWJjnBZ7EjQzMoD6uoNV1jqk2M3J2FTGnJL2OFSOYm6zE0WJmW4G1D3GN0TzJzU6PRaacV6mHupMWKrrUm8KURBrJUNWVRTwvUoAwwjjpsRkMTycF5XmdK7YpILCaKBeskeTV087O0sYaLqCEcQrEAPLCCKj8KIeDVlAo2ppo64r5h0LAbHaAHFmCXiwboYJNcbFsbE83Zb+QxJZ6nbdMtz3r6AEIVzlnIdJu9gmzKRTF9kDqjB6Kom8iJH8WU2x/srnELOuGYkajBe+g+h+A3xkMAC7IUHgU5k9DIrwsCRmTVB42WYy4kEmC42eRmrBkVOdFITF3OIsqtdQR4I8uTdHK9lxv2mmmQZYHzLNtprVnpaEbffI4wDLo1RTd7kMAjtJor0FrOH1dSvrDpmT8MilbFzL24hHXS0NAktooCBrnQdszj5yrMrdoZc0hBnTZ7NcGEoj0wC8kXxC6EdzFNXUvoHY5W8/1rVYv7ZsIbRnz0m3q66r8eQDq5avfdf0LHKX5UOhqJ+6cR9HLfYT95vG1k3JAxJ+b3ZAxYHj1gAVNLGBxJz2MGKvg/q1icU46gYl3g+PidXDIoOEq3DyKJ6rFLcu9xr7X5kK6YaHqEtmeUen0BHmLkxduSa6fGmeZlldqapb2AwncladG0vhZJe5rnbflDRyFknU3K0JqAcxWqD745Y1vCrjRZeKPbJgQTdz/NEsXYgOWwx8/Eo2rpEGtS46KTS5xEbKg/BMdWq1ENOuMOO8G1EfxkEm2bFnTU2uGfJ0XaR7KCTKH4gbUcHRbc+psmdNwTV/MzGONYeGRz6EqFuVyaYmw8Z8nM0j8+0rd51WqcQ5tRgiqD5c8LfHV6QKvV6tb2wqvCoFWNK2qCQwm0iwUtOWoyo/WaoMhzT3nAKY9N4ZPJSVEDAnEENVkiKGBOTjYHwwZ9SKQMwynCRdghLFzBuCnBLyqotPQCHucxVkl0CV+MGcuzb+g5HKqHCQ3scOgai6Uds1yD1n0CAmP2DPN3UqlQAyVvkBfZvMBx1JgxEks1NUeJCXmD78gEto3dw6k83IlS+OwknKarjqkDr7N+90JiVGqnB8lYdIdYivT/CaCElo9hRO4oXAPzQL0K2Mc85AnSKXx3tYUFfU03wIr2MjgncKwfM97ZpmlKYihLmh0vKFqK4m1V3kccThxzLcs+1HA9m6EYbx1gMdA+nNZxE+MHKX024MK5/tdMvHCKNBL1G49qK5wuuhr7LNJeIo7mz5dAFZdH10JV+QoXTeoHKumigyo0xqYuzgjkhtseSHUFxSB2PKtv2JxEdNpm4+BpIE27Brqx+rlagxh8QHPkP83b/caE4xAANaRBNzRH30tvgIay19rz4gUERk4N8KPJ+IBCz9jUiVvbO+S3yIoxFenQJKRds/EAiHrmGxHGj51+YrmHShO3Aoc+/zzjpegu2CqMAdvtKRd6agU9nLbnX+fWmf+iLQQgROZOcz1esCMfULoC6E/O0sThQUPDePASsth0J/XAHNmxMcEIN03vyBi9R6hh0yju4cb1AyaAezd7/GlQ2kb1o6aeXL+sVyWIJ4CIY5/CQBZCEYHUobmMG8fw7d4MUqTkB/pr5iMEh48P1gyIp4u2wO0DR/2+OXkIPDvtla54LnxiM/GmwkQSfaCZLtmCVPnl4aAvcQlE9v8dzWPZjEt32tUejfvwou71/0NwoWfd232ZQTfJVzk8mKhCUQhbfEuDLjEMuM4Qoc8JjpEyPr5K0MUQyc3cwxi2GayndjyZcFNiQoVqY6M2DToDDY2VW/yQ78S9Iig2HMDeoHieXRYSCDv5+Y5SphPpjYSGFxTFel5OgEMuw0v9oQcEAo93R30MM06+Tn6SSK1fAgqzEUVvP6h9CsoMfleJwY/7BWRKQnfIFLqCmuax2wxyw149G43MnjrlsVNWhws4ZCmYXXAzU9vtaQ3AFoonN9mvT4NXkGSJmUToHTKG0saZsjlaD5xGwTUMA73cU5Lz1zlCUK5NRml/s5Gqk0fS+ZUvt/C4XV+3U9c3coYnZmvy3KwKVtgNAr2+NIcslj4nHNqev9FwwieEAfP/tuSU8BFMHAyojECapjvz5DmKjcPekGy0RHtxrxZL0TZx1mF076ujF/4KJCfqibmPWZYkooOUnhomde5P4qHoVFKL2SKNcGns+iBQ8KQ8Oo73BEkRGvHDlUCw1YT6LB6Px0wRkl1TgIrYCNmgU6/W5mxX4x+8NbBVNpFzla41W3fxddaCvVZgIJymdNns5Z4dgbKgYCRQaxEICrJUHsuhwpFIJ/wh1o/1KrAe7p3WUivLMi6eXXCghxmHBVD7V7VXIHzOBH9YZGRLjA2eQRskHBWW96PJaSQa4HYLSKl0rmVsW2HErKyPwv6wMoJaAvEAakLD4ym2FvWdCvWkS/l7cKMgCkFJSAdZjpmqy4/P0DU3Ozml79FMk9HxqRgPAtN3sk9/RQveWvYzFc3yTQK14dtbMLPFN3XNf34r1GjHhyfDwE3efF27JmwPOpDp7I5+JCUR1OV9U7raMAaHGpUAYQ2aG4YMkc20gkUN3vwzmQ1l7hHnVZHJvjrfSFHvveOrnHUrOY2uVFVlCQX9hN+hQCerkxuzArDolfef2s5OoKgXd+02VHacOlEGRHCpUuYvSGs4wWk6QMfuMuVJXOWhj4lBH7Gh3o6T44mYuNpIZaSrX2lTv++GDXWTXDuT5+LBAzs7TKhhkurBKjWGRFTmB+MsoWMusgzswCsoHHpkEIpbwpGRtEa2YW8IopCt4WqhyPqhCgEZcBvMBfkvala7wHOF6thYoUPwiBB+5O5RHc5QKfFGNuduYg+hg1VCsmQJ4pb20mY2PzV/Zq/Ic70JwZjb0fSPwQdJw34jKt7IX+Ejyh8xYFPX5xIGVURWG1GMVxtqig4xPinIXy6P8pN2w5jUtYe6kMOKGoPW241H6ERMh80AvccHY5EsLWd3CBuHQ2cX1ZoF6q6K1atHsZx+8HFl+iikPnDDfaboB+9tGI7TAlMW5RmupA0036Odkl6J5gwxQN05NtrjGUkMJOV6ylwmIROxI6AETGQYvM84lYybGl19sxCbuT60Gop2D244+dezsnnfLY4Mz02H2AgNJIPDrKInunY6BQMLkf4F8QxXVyn0miNgxm8h3eShJuzeOCIDQQRAhlWbjEHFmCzwKxCUIG/UtufJoqYQrnlPxpxinIe+0E/DUzszTBg4vYMp8IVCDdMIa+KGbSFsTzUyg7kXQrqedveF2r8vZoaVRLblagTTuWIjPIrd5/lrTwtj1CgcMFxB1IS0o9hO/RtEKkrY2ke+gn24BbNR+k7nmfcjj936gII9wn8Qfq4En+CXfPA/jriONvnLrebk54M+H0QMMFMIdEnFihESfpU3JogA6RwiOplImLOjHf8w3tBUyHWkd3l7afrZleyLTd7i959cqALUwn8qm509POXyDjfrS5y9MlL6q9lyXxiyU9IbTSk+v9wvFCCUwn/whxYL5qZl9bkFIv2tGDQFxguJ7xFh9IoQmw8DtbHNaI/Wuc2pdnwCzHPwUQK3Z7Fii/Qh+WhWoN2Iho/kx2UjE1dJQn8cwlK6iu8snRfZI6lAfKhTsbwt9m0ZDWY5HnaF3xl1LHV2Wy3qFRMGFBvJrAt6a9v3UMEHt3io4SyYOh5XzhySeQqbTjFKunvmqvMDEa9Cj/PiCcudMHyWacwTHK0Pw4zVNLWm6JrDzUNr82u+uYqP09gVy6yZp3jt2GDnN6AKIwl3OQx7V4ZcH7qTaBbHqm7T3nN9nn8C1Jba+KWwkh8vaHnAo/rPZC0pt08Yj7LWTjQySMkHcnjGu+3Id6kuDtfHsFkkdddkW7IQKksH40dx0iU0YikCGxW3q23kBqwVjWZ6B83d9JZaLFdwE0seIivZXW/iDoB46qpJvpBA+BMxEuFjDAFBI18SPU0v+h0meGc6S202XGPb6TDsOO71XBjKbp5kc11UiT4cqsYMP8Uc0CMCzOdchXCjgp6LsFbp3rGF96wGY2u/5kmnmi+OJj9NYD4Th+UVRDDqo3vIQ8pr5q33wymXqdjn6mlE7IYQLmgTFLLOZRHOoHgCB8VTjHKZvbW+6TzO0Ghm650UWsRp6ZO9vH8Qv2TN4M8BXs8La4dhEzD2AC1cnvJrr/5VX/p9f4MJA7KRkj37Xxf2n1C0Ii7m0fbQqXfbrbPiRpIvQdjoBhFPQO74vSro17t+4O3wLY1Wr6qkwKrrSrMbCruvdXEExYfcNrGdV7xMuvyU9dm7hkEcKoK63kgbW/BkLaxY171NSniykS87h3BMmzYBJpA7Sw1zT2rbLrz3P0gYMj2svEGtzYdhY4E+sVDcd7TxTXcuRixkwEZXTjnOavrojX2hDVpQXJdkoRul9UWpA+pwjAxfi2sve9uEcWBIyelgNTEAJ1P6UJ+i+3VEcV0FY6xnRe3rWy20GNKyNqMtkn+LMBl8Q1Ukh6cGvSqTHS1VoZg8J3NP4gZDmiYJ1zhEzmNOjQ4ceH9xn+do0Ehi87LlorUcFSyNgeNxhsHGy4qgMiFEJG5b5qhBOBXDxkRhsmD6/bqlvo4dUYJeDSXF0E9kJASXDcVFJRhXrcmjKKMGzc59lSsdJgFq0nOX9ZT+OyX7fiDuXfBHNaYxL7HBH631stT896VBnqUgOioSP3xFElnXcsMT59lPLOGDzBF7kVKduZdQYGwo+kaz3uQLiqjHQqr46dKPFYIfh/MbKu6riOMHyuc/x+CPjHG+x6SNZGf2NWlUkSfyhhG+78p+XZ8RFV5+7RYRws4SnIBCTcMTyUJ+ZVOJUPHdSlRi5glt7bSSOw86sSJM8mHUtK84uTMW/nM9wvejWF7CQkIvkx7v1rMt9r5MaN5tf07niFXn03j99s0sxqNuO6Qraqhx+oskOqo3989T0m9AekTudoMHX3Ib9RZ+X/SrEB5jbdERmKY/Ph2wXLxHCZ4PsdgKPUB/ZznZrN1fLuHqyvcK1Tu+SpnfsHfzMd/I/Bdl2zaUJ3MLuIDiLp0gRe/5Eb90JSwQYKzm6cWfqC+UQMsV4tVOokbsHvxUslpj0uM6008v96oYJ6aMj+0+QSDgvQOJhSnQvdNM9TN5g/JNuveg0mTpTGJthYzcrbAxa/SP61dJEpuGgLl+VHHj6p8C596hSHEr2uqd662op/pVJcCujCujLFUfYMiz40GE4n1m3OJcefe2NWZijUQvB0SI+1njX1dzO61Yq0wX/yRsSOO2aFMsAzI6/4r6G5MCPk+bk7sb+MTAy8oviPKfJwEMmuGJA5JASVfKnm2RdLYFnD4pdVcY6aok9/7XFf7D/l0KVClF1DSl7nw+pkARBadTJhw52TGYwXfqu0cxZ0sSwWSXiw6ddqL0M+aO5mMwVEYXsDGeLa0cFF50d8gIZED00wDEsyXF+e19vr4fn/o6cCv8DMjZcZc1oYm2f3ruJjEcBXGda2xps4eL8/H9s9jbbSbS8v7r0BvVpXgaLyK0C1BEmNXunOhE492u6rOrVMEjlOgqF6SaVDrG9I5XAdM5yStxwTX6uusN8RagZKpgJth7SbfQx7D8IzLJtZAJUEFBeYTLkTls9q5FNrCIjACczlQoboxJfLFgcxPdUOdvlUAD9TXumfTbc0uowOjv3c6h/JP07cO04NCdKW7bPN3sefbuM9Dm4ETiTm++3+3cLQXTxjtScyw0DlcECU1Ko2pnWFhiTUpFSP2DK0p8iibM9tG8skOue+2xzAxpD442FsUA/rAprybFt/1y/d/m42ft4sO2+TA4hxxlfg2ZS1nIxTxYztFEY6oR9RBW8bYBHe7wMGIhPquZ/RhDnZ4gBZArAN3zl9bVi/vvq3vxorS+5Zq0G1dGfmhaGt47B+qB/ouk2U8FhwTqyvfZNiOS9fMNy6wlmnYABqVoYFcQ35Pu/BI9lKDnHJ+3ndM3/7vsn6InrFabCo1rD+qmalEnVOxE7KSju6lJy1ljNIj882wn2zokEin2++zPiVjzgL3ue6XbQeQAIbdfcJYbwTelYkMkfIqNFRWtr8XhaBA5bBYulkIK/xW8ftLhMBatywV7nvanyQOmocjeT5UFIND5VkN+P/dLz4TqXmmgzNBtz5MaPuKuAGYNIW/wc5QcetOAn2DjdLvdi87gdjUOibUB6x9wVA5nGC+uaX4P/MCo0p2ihs7bV5bhGK1yyas+RP04GssqrG0mGQVy15FUTX3tRnCCPQdwjOr7jI7IBxq2BoGhsO5niHlCPrJCIIR/twF8oa8gYV4Y6BmCwgFrTCdJDicKxYZhn4+WHl5Ff4JvBzZ6lIvweek+u6cwopm+e4vMQVUf1SLl062JxNgppiL0ChzPIzhHrVnjKWzB+TNg6NmG3DqDZgNsAlAAbA3SFcP2YAXYaIKKPGaXNL9O9btC8o5W+BczuPKTeCoFS3Ujdw5s/nAk039PYIkSJwe3yWtzpI7EvqaIc97z57r12feGwPBc53t9dYKH1SEw5KImNi7x3u97iwoDv7jZ6IaEwlriwuk2pHCMKg27jEil52CoSW2FNAJ3yC00dd1DgtulczkNJszW3deDhhLmKBhShMOGcFDgmWANBBp0hBZeoNodoU1K+MIClKKB2M5sqhlOQgpDY+ZSStDRxGgkwagD9rBaoO0qLcLVPzUo32PO6TH5Y2sBX18eWJP4vKtoABg3HYDKxh6CZpuEDoLywBESAT+kuVLCFfTCijnz4H1bz3e+vn/u1xbkKa7PGDC04eKXqCWoIHrpBSOQdOwEax/03k1G/XFJueghbmTEX5SIw0huvhmv/f3tu5vY1Re9mQ4rnh/nn9Pnc3luW6ELPy3mh/6kce1tDm1PVuXbSY5U72dr1OhdgiZKlb4sxbqag6PVbZdBlLSmBJZAeUe1RBsQ8c5hweGQoX5UTUPPmIpRC86zt1yjpU4vs9NtFesM1MGworxY1dN3URucnstr3GhHkIdNrlxOKmWBZxm+NtXwKV9u//7h57RowlefGlxVUq3HESvYKLZTJx/dFNWsMysrZ0Iya8kRRo5RUncdDE4ysTKPO1yqrlxMWOpx30sqATwSAth9HyGpEsTXzUpd+bGbaYUloaMOrKahlcUJJeSF/1kxdMEy5kKO+2xrecx9JYsX+KqRLmxzw2NViZfqrtGpdUc4d/RbEi/rIb3ovEqGqrRKDf3KnsgS2YMfIiJUJhzC7epDrfKsP3cVmA7yBJc3mBxl5cL3mmK/t8MSisYw/tbjti8yAr+xkLUqqWXG1TnXJ5VtFj1t+Xcizavd6+IRUGKIekVJxPsCSjw8FULecTgEEtRLojULS6aLgSMEoge7qy/4YU/cSyE0DZruMrOoBIjdjgDYAQSNozpUe6rbR5uupflLTnB9lUMz/fcj5JeckIi8UsL9VzkuNTXnWZvAqyZqFMzLIfjmtMTM1k2U6MIQOqSDLivQhA6HB7xtulbl6O7PUs5dnpTReMzCP+r3ItQ7C5j9Vv/5v7dBY/19ofi/1tvL8kF+AfSv5z04RT+BgdXSFLaxh9g5qyznbPfpNc8G6las9tPZdWp19dv8bRWP2PphEcnva3JYBM7IXTnPSh08ZmWhkLn+lMb22e/9rUwV5tbiEc2kqWy8BKP1tZ6z4eG2jB4mExr7BB/U6gdln01P1ey1w0E8wQufWgxYjx4sjhMlFi4+NBvp14B4WAnMAydXSu19zvEwhxfpLYfHKkBIp2D4Hey7MzvLxXFvDc+MpFfmbBCshIWOEfcQt/amCojATg+zd51i2YapWAJrgPEJb9/Qee10k8S76HRlWzOifw5nIoNPT23csM1mlu/aKfffYkvnwMhM+XqHSljh1ezE0Gh006QxVlH0s5cUL+k7RjdV/rnZ7VpWnTRldfK0X4bowBEp9SYscFe+HdVr8frXIONvnQ6ZOo6WNumtQjfRsZh3LQNTr2TP1NZpR5UC1Ay9hh4fnDjy8bmPbmqr2jSmpNRONgIkDByyi98gCswJfU1nK1yPDYHklOrGEnIQMKkJWUk2dV//naf3lZr3/ALGUfP0ncbG+JgCJzbqjLF6nAiSLrNlf9pmWa2raZOyWW2njevG/WV53bQ2rg79Wc1w6mMw1FK3JEZ62ZzdfjQJt4CBEN/K+eq40bhuLobHkPRLvANhdeFGWfq0wnZ/TsI1MWXqP2LOX0Nh1QnqG/tNhmm7lg0nGGo3C/O4EKD5gIk2G8hExTY569Vy9VbV7oY0rJ/vi7zceVbyyKR3sbKWyB48+CcyRxJvYKvtTqUTLckmMedAyLCGjYZNsAEs+IsH4BddI3wQ2pnILQDCM7C/+yNwMFLvoYDKckyMH5ZuPvr6MPiLRa3f9wwHF2zhVzvcMlClna98l3xhqU7Nzt7XESnQ01W2qP5ZCCtsuvYT1H6JXZSTK9n3g1gF788cxFu1TPPE1mNirwIf7ZLs/sMy3taTURajiYTGTk7dPF1gjoZ6C3GXYhje0ImzdD1jK4iwqVl2Xbc0ezs4jFuctVyprWbojnkx32uOEmF3P6pinjFyhmZNPdt0la+57KBQZy2D5w9BWVD+Q3qJw7M8WSlbk5MPy7lp7HnFW8nZ7KmUjWl72hsuwi2W0ZJDIz5EYplg+yOKLtujPfD36g9WuzNg/KrRttgkx6AV09F1X/G3feVwgSDzfkDWJPR4+mmOLVqlO/pxTtMMbQXWE1P4ulWSCs2pxZ6xEH9jku6fTtbdSMgHWeTIGYM1yG+ofze5zR5Ze2Vd3/KBpZ9f/xsWbrdjM774mGgSozAjvi3k0+F1R3ght2ly6rQQT7l0GlQE4jtxv6UnY64D54JWJf4qGzYRc6d13GWZp5NDBMK/g41PblxNsvkaeCFnDtwl9yJ1VEnnoHTua2xuiT6K+l0dDjXbCoFfwrKu0FTL+7y5kcZNFCU06SJ+qNSoNOwvn9Oime/u8vly3WfHdZ8cd999/0ps9v4Njn8M1DhC3KWa9yqdL/PNb2T3SagpfEjYJieeoXln98nx6WbzysjDNYZ4l7tOyl1n3V1HHJeMlanZNov2tcDVhr2sVNeqQMP+cJVh52HjrXRwQiOziqLaEtn0ZrE1bIxjas2gJqSgOUUtaU3Vx4nPTxM3Dca5MxAJX4B3lz6+d5vavTevPN1eJm4OXxbmATR+Je18YbfsOcL2mryg0adQG838Ykg8+qauIDWNGMZkcv60cb/GQToDqGc6fbHUccBGwb3vL3uMIej+N3vamfoxI/KZVNyNqspV8aCw03S07unfsRcLLd7vNd4AdQh/5bZnrEMhQ3tCk372Q6B2EQ8CYD2aG6KXDpNDgLS9VFE38FI9CJvu23Y2hjSvn8+yclZ/wbw8kffT4CHwJudD5RFZje/t8yEVI9u8lKQEw0mx0IG1wfzH0fXjv9DC6/80wa6+9B/syPaSUP2wHaF7FLlq08TkOqKP/v/PsOFuYMLAx3WYymO77//JH3GCpcSSyerDHzO2P+4vwajb5oJlAXSjMWkgsNE4f0ZF82rQBDU5FDyPeF5BImVSMywh6os3L5qW9ZL2XF8NL7ftekGXsDJIwwxDFpbHnvEbVC97HuihOlEb2PEz5vZwryRIbOe70S7Twadub/B8usp91atfV8JXYArlU88maxOZqE24AEMnIB+704L9JkvPM4m7fEpvOTKeM+0aPaiRLYocRA/lZ+FOvl/XrHi7ul3pMjveKv9eroMi4H9ID57y3gFt9dkqX8qrU2ZdjNB8sb2KLxUEUTX6CeKHLHRWIjaIqZJa/uFJBZOcwYkFzwqJpzVOadGjh6c6A63Ikx0t0ajHMdxsVYfxge+atOwbPGzwIHNdz7HHAI2N+szTPMXeZ4UPRg6OJFfCQaswRmS+rDLVncrjPFIsR4Bee5NLkvQZHg7GxptkhtG4bnHElxd0ROekUk0YlQs5BRspwwwEbuEs7UWzyKhhibzkmhzn3QZWXn6WG4JWS6906hEBMCiEndQQuhu/SPI0yiUmCncwKcSjeP3jEiMF75j4uAaVGCsaZD5FDtlN8C/3lA1bqUT3yRkN5ap8SuuhD0q4rhkDA8FGoFRT60hoj7ueSLuxeQsdSz7i8/SK2fRFC9kPETwYtQk5o+q7s4VRkajXYAhLV5fwTgnjbw6aWyypjbPG8L9mgP3qwXRcO9mGqdPfd6XROzhZrJ3luy0G55V/pOgj60xUiKh7VE1MOnCGjgF6TSu8XFuCg+v55cRjFHLrnpgJ7m3dYAaxWQ/zOS1vKjmDrvPwZC/r7cD+fiKsDpBFcG6YJhA4jWJbVRnWCHKrOfOoR9eFWcWmEJLEBVAmpMDo0TYwATbQtR5WsVky44r7c9gPesDYCkJ9sgNvHpvN4DTewb5Uai/zZyFyJobxNyUELXl6zJotlu5jq7+4oXlRQyufnyGVGaKWp8yk9sSP8n0JJyjNnjBJ0blbf9iFl+2q717JafLg3XAqwsqUv0XP/K5ScWp5Kwv7QhY1TrwEoi3v9kaL9iIplnNhUpRgGYmthVtjbj40OG0aOzA+Gv16uhzhaM7XjC0rlJLRBFEoXTgHJNF3E9mVW6xZklLuImxjtBazNMlZuXQWXF05iF1DXM2v6k/fn5NNSDavd3qwn/L2qM/p6hZfLGMjLC+otCcwqoS8haPrc8xLtfidpV0GM0mmYvkSUFrKoGPvLoRz75HRR+WzBk5bZ+8rgi+TEebdT8vc1bzu1qoQ9C4SENpmnnXupKy3i2Vyv5nKzK3kgVxnZmGR0+H7uEhAdKkpF6HAqnyj95NV8HegF+kqGWnhq6I7IbU1vbyLOwigR2aJkvMvyw6Z8HJCtInPMqeeLFEc7LrTQRrULLjVS0Wb+ymgOfNQL+aGC1Gvo5prQ88gWW4lkvM/rQ11SQP5ekV5sHHZ1yGvaaWHjptQAf1R7qT3SpqyqUpXQ+OljVMWwKSeK15IWtQiVAmDgpBrtuyMcq10MciF4OsxR6IIv2bHYt24s9FfBGUU/JrgEG4OxeBpPtkigAH5SAn0CcZ65ztSESwKWYLRmS/yvOFKlE7hkidMyt3aE1BfdldvHAlT3jXD2Ts2f/KsKE3myfUqPS40LdkEKc9pAqhuN93zN/2ptpn47TPXbTFYdsLtshVGEAKm9fDzdkV7JFGEbId6F41Vt5W358bQDXN85KLvSGIxZa9PE0FbCuK42KQhF7ZpM/h9EHisMZyeMrg+oUwSrPZ1KHgwC2DuQ3Uj1PsAzNZFnnoyPpRRX+t9eQB2VgMKpCi1wMuJZSEpob2O7I6WfWKFoeGRzyM6DEoKuV5pk9yS6hQ3ALd0aZo2bU94cC9JJHOotZwygR35ymHgTh8IGuAwVvOcZ4SZE3RFMupCfgNIlssrEq8uQdtr447/XoijUTZDIf9RV66ietYgPtV+GeeJUMLZA2AL8Kw8zX4ISc/tWPEmbpIncTRYwowiyTX6b/Iw5EJe/ZIi0eH9psUzMi0mU9hvnnuvrInTv7TYApnkCQdYvzrps9FpptBTCuvgq8AypfjfDQTq+QEYcoSO9ygRkQBjTGLbNd9j+u01cXc8CsxrA7cJrCFexm8Gbx8H4/hdaqa5y2wLSpd6klmJUo9tLNNLqDOlwZtJZuPNOzFpG2iXOIguWQRWqHAvhG5AfUcN5kjq1ATtgFpwuYzqKdjV+qzVdm2shG3BJjwCCKad8AFfz2zQwjLh+VewVq5USc6MVM6IQE96pLSaPjp6ywGJE9/WIQQe+Sa8OYtSOXsimuGogoHAL5m8z8N+5ceaXRPOSag2ozSpZZ8Q7C1ZohPF7LV6ZsBv0xR35Ij9VM8YGLn9aAZGDy3FkVcH5rt9sVQkjGhGLA60u/Zm9GCDitJN3Fw95C0dR+tEkr1IXHpWYJYuBHldISaAIjCHSOpcOwkM13/aMgrTQuu710g+/z0IdKB9roK6kEcBqNxKAejuOBHK4o/i46v75I+286HALzT8B1YbobPjyH3IftoMv5NBf+X2OTtbcy109QdxEUn+QC4rvmqS1miQHiPuB+CJG7CGk3RKm+TRkwzCZpyzxTxKeQV4cFrkZnIZ6299bkJw0JmM7+bOy3UarhchQcuLh86hv0I8llN7v5V/rIDlK6dXvQgpgoEVmMlGCSKA/BrqyBJzbMrcfCc8bW7Q7DMVmFmJOuEbO4tqjsWkNnCwl9bB/b/jQ+m36BWVYMvCW0ZY23aXg49nJpEFxBdQGB2x3kfusK/b8pZeutoZHlJD17/cjdbtpewQ13lXF+r8w6vCk5Ufesuvxdd7Y39AnwbX/x82CZ62PBxXDuvIeHkpGKXxeTX8kHB7P+XCKIHXA8PmFikziEayllbaGbusHuW7Uj+SUTJzGbg73Y1rOPIFBHXN3TKR3vMpSe/f4qByOUiHiu2v3eX2K6HDw6CubIjTWcegd4jrnB0JBmFs5DsuhaECGGZuPmzehBN/k9aWEumRri9OTq4eKdMblHfMHl+zYm/rnfsaMfrCn6cPQaww6pRZqaczh0nlc47knl275CSZqa4AC36tfNi5UgfElE71j9zBe8nSNxc/30BjHOno2TBy2yLRBTGU67MbgrakI9Nc6UzZiulkcUplQ+r2u0UorF/+uFYcg1JqQQxL+SCZolVnEo7OXLA3KJl4IpJiX1Up01UMergU33jZ+AFDD6B4rA6ks7zKN9rypZrur/Irg9su4HU0X1350bx78XZPSDdj7yOEdmBc4P3RDIQdCXuyzIMGdO0U6JCh4x29+M3qqyk9WiacrAYMbJL5hLZ2btP7t24bkgwEa90QYJYl4vJUWudD0DaH5Wte5gn2ZqDctkApy7rlu3KE/ubBTIZXAZeFEn8koEeByEv3LvtlJvYlnloP6/rQABjtRBaN8TIwjOnLuAdS9C86mlynYodmcMGS/5GJkURj/Pph8+jnexT4/cl6UhovvUXGj/3x3ACa3iuRzt5ymw88MI9u9l+vlJhVFfTpRypm3XmJhUjcvgOzzXga1tbwVXdqxJXUYpbFAC1PG9/6z7Y6RwyAPE0k/M4AMfsEbQMK3X7tf+ZQkIOq8rzqaIqKOQyPDM9TczvNiYfiXWrUNvpG5Mcf6c322pP23FF44WZXSVU2jAp0Kbck2qiQH9wqybuUFC1jxf+he2bfl2AL2qrVvsJJHdToDC6Saai+zP2RQ/Py1u1Oy83eJyioYh0Y6LiA09BZwuh3j29iNcA1xFohYJw1hHWedq3ZNT/8bNX6vHPOiIB2F/gSvVQETPnezLFtP0eRxtbx9Jrp+8cFyEEEu57oPrd3kyXPHhngcS9IUKgXbcWnl54murpkuJkaKZTPFRh1Sz58UpQ+AraYHYveL8W9926eUre+/Jy31WcGZ7WE7bpn4bM9B3ZoV2KeEHt9UVWuvCz3pL2VTw+GXej1LrhCL/oTePGZnIFK7x940pZJCiSkdnZrO0FOHUAmmMUWiySUSwEbgTcKiOwnH4ybfmHxa8iOBK6qa3IdSUQPxvkwnkw3nkeRlC9Kbf0SzIHqKnT2xiLfRT6L/M69BnZ2VwVm4lutq4ZP1dK4tzm/APPXoJwdtuz1OrCwVyJlV7gRb/NmpPxHoljNMbVjqCzjvHqDGS/Cn0LUA2dVOzaKkhL5N9B33eyEtqV8vM/4K2vO5PkomHVGiZyAJLVWtf7gyR0lTEUb7XYqrE4R+iohZP8aAdsyIcoji3KoyTCrSMC9J38COmsg6bSw6SET83/Dnnui0yzuCN/B3WYDqWlSKrizhX4D+Qr6eBACSDC+9jeSJH8lu9FS7Whenx77XO37/bhG7NSh7YWCF6GL/bY+PtZfgS/4g00JFECSKtxyHfz5rScHByxCbMGhHbgjKFEkb4WiBZiMMb1ag6xCh1ROtI+FXfEdQ5QwhFlJ7YXchQ5e255+AdCdX6Z4mdo634tKYctuwPxfYKOIOkw1VYLviiDEd1Nxq9FXaycVTUNQYqcVLaDBVLtLJ11iEoHBjXQgniJWbaW2EmQOmuAGz+Lh9GJtkvLuySutYvgTfF8n21KxGXBZ+Z8w2dF57U7lwYnO2y8p0/ubz7N5t8i40+pLkTcuCmJsYDttm7ApH9aiuuROXWhAKEFaHmnYsm6wFfF+OAorWWogQUjPNd4NUupFDlNU0RvBKs65sjRWdc/NlEOMUErJG0k7OPmQGeUteXSEpbvtaZSshPSyYtqBR/O1Z40+sGzYy7fp4mz85gsNwPtxKNvCJCL4jOogD4IsV/v18MHLr1LdDVtb3tCxlbO+Hvj/XMS2ZZgb6/2rSjWmKK7KjuhmLySis39bXRxOIO7FIJr3rw1o51yKnyxNa6s0vFYcWLq/tnF2toHZKstvjStZm+mSBqr79E8oVy8p/fl1dr/0I0qNS2Qxl4Wrsz3kn7sG3efTqMgrH1k/eR9xPbxRdsq+ttToqjv6AId9ayUT11pZG/mffaIKRE1PqKKcOqrwKgBCkhdIRQDMFXgj3ixthUHDCTXX79vF6kS01o/xX50X2LJ8eCbjv6ft0WtmOBo6t/GUfAMSwddSOKKVGLfDlTXT/alpOvQlE+xb1q2shensnKoQtMADeKnsRC3P8tT5+VP11VNnTgzE2u4e7Xjzm8nQA4YJUxT1KLoVN/fs1YE0WBKiRsvkc2GvX+eEfIshEaf1bylEEAZ4yUPrZeyP/jH7DYWPOlZGSXWPyNqPOFzzGDu49/iTh/gztKdyMpT3d+FQdksd4pllymZD7m0+46Um8u1ePZOUoNW3lkM8zlEXoQaZZb96PASHyMWPwptfZmIvxtDdVn/q8Yb4P1AXwgnOSHK1nIL/uWxoszqpHldYxl/At51yvwz19qrLWb0A+k7Xsf43C+HLdXwdP0hG9t90iwrAjHwIBOn/NQU4fENesBfkPm23D0ZSi1JgVzRVJS4IXU7CbmNMZ76Opjw9rLVmr9NUzdUueLfbujg2D2rUhy0m0n+JZcizEQl4vzz913oXZptfV1d/d+7f09dvQ54E/ru24Ybcd4S8EDy6mH5g4KHrlznZkOjysITr1gTzqFUx39mii55B7SGbZSQcek3vFITgdLxxeZy05Gf7y+66nXbWnkvo10o9V0475v8ExadLC5kCqaFXZh3zVKL/c3DIYetBJt96o/jJfUkWdQ/379oFCTaVXYpUtpQm7NowwF7rO/3dirzUQAby46V3grC8OrMendmblCSTHvBEVz+mmIfcnpQz/xs34tJc7r9kQ0FVf8aUKntaOn1mHEtjkab1gMx4PVHz3csHDQ5vI/wvAWDMRDNJmvJFy4zaN71mGAj+8fuTFKLVltZgL8cUpBu8+xbHdjFpqt5X+n4ty2BOCKpwacTxn2dUj0P7r9zgF9aNlZEUIRHlEAsVh/wogxFLPxSla6PExbWHv5n2e+Gp0htwXjpX3Fl4vK4bSs51VRMP4WBjnbC/5Ph7KvIjaYnMGpGrWXHhnOvFOCkQ+/ey48IGQOQwaTPiaSFzfr3HGNtLn6xy/pf9tz3eRXThk1hDvHjYLtqhqBmxgui7xxHpziaid+gU1pDrX1FPzgtlnoR7sf5Q1WsZ3IcLQoDnpdO6BoEkviSRv7pw5g0Z6plfdcD5KIu5FRntfZkI735ZO0OmV4d5Q6wPiPjUU/KEFJ9HLgZDIAsndIy8f10DXkqK5ybamcsZcgsOvtWwcp1xc2giSWHCeKmhSLfTG0fvjC5vPOr/h6b3ArV/CaopOIpRIMFGIQnkisJxDEv9ljki8LYuM8AcMQDCLEDb3uRGtJxVBQBQIAWAJACpwuMAJbvyOG+Had5sBoZgjyfVsjRxyeGgN062jlfVALOanXTJjv3DYvC0xjnykTpQh7+kyAx+EkoFZSWny+xfSTwKbRojLes1UWbmE5M/zg8aUIkPwZ5GFMS9fRlpiEfeB59Zw/5s+ne2lxdiGTxeD7uN8KtrT/sds1uZ+cslretixK0DFeEr3VPeU3dz0FtAej5jzcVttz2rPjStHjBWwzgvh3vkJbIG5SCSBl3IQn6tfyedrN5P0yK4b4tBgyDVF9XchdHwghKuBzUCbxUb53yBN9QvGhS5wx3qEtuhsM9yYcpAKhGlMA3GbL+V5rK9y2RHOebyaEXNbynsOz+4yYstdXveKYU6slho9eUihnBgVIfcFJjNXc/CZiz8Z4oMURUDecie5q3mWLKsG5PJmf0dLVOWU+5n1L6+ybtgKQAb0+ZUpGFMf/Uyqnt2xLt39R/i4utrP5wiacI4MP8VriCD9irNKNhX/Yw55YaK0UIIDqjwHbMPLXWBv5IOrSY0CPf3XSUd7KgrB3GBaFOajRkPSJBJdbAY5a227MRfz+Lre4Djwy+P6erDM9jMgmK11XRIcB1EQx0KoHCEj+JHGOM7GlJpnzSqWJagzM4bJWjfk2CjyEIJBb23Yn/SEnWUwtAb+oUqs6MF/1TG7y24us6mzghYOnHiZoxKhjyIsy+iwS4FhnSLP5WrI2ieKPvva8HffUEYJQoAohLAkD5wm+10tlPPuYkjhJ/FAL6hBUCwT/EMj/glH/sVpyYY1GvPNv+RE3m2cVBznf4+bxGYd4DtbLa/fD11g58Q7tsid2m7DlFLUkmm5667/YbpBwqq/V3UP2605E2yz8j6XMqKluTz1y6cWhEt64ER0+s7d4wbsOzDRu2vJ+Rzy4zHNJPX+uQBY2Vn4iFh2g7fQdGXkdX7uJHcEBuynHTQrKfdzwkPKTS0e2dVvR+dUoXt5QxHfmHkafOD/cQtQjX30vU2S7F9jVx+wLigOoBpAt9fUI5SACDLkHEEo/QuPPBuWCAN+c5wzGW/sN1cjejEk5VocurCi7jpSO7tLBkVku6FZ01jA5in0nt73L2eF9cFLjF/jAHc9EwPJFfk1uXdNB1okRN0zGVJZZ3s6tWjWl2VNzl1ot2Ns7hDIWxTewLDd0cbelOv6+5VPtifbasExDqBGBXXYzwNBvl0pEh/sEPU2JT9oNbvZ4/VZWehyQAUYN5Eq6Io6H222H+Sr5us9GLfoihMiW4Z1Q46m7kOTTVYhqNDqrg12ijaGEQ9Y5Iaw1Umph7zrGqXTIP8KTKyo36RSz4TpVlLsxjnROaiIjF5xv3jlv/EYs2rxxOCwWUP/WZajh8/1Q183FGWK3dhOvCTGtWtOOsixyDOjKnMmUwQ4nw3JQ7me9dinIpblSbMeOnKHSiLlEC/EOwyRDl2cA2Wa+vBxoeZG/ll9klfZYliVtsafpsn1jZdto1MoQwvghpoq26oohLVLZ30WMtzS1q7NBujHUT7PlhS2oBBe1NNW6ptlwzILZsASI+nrFS0H1+1L0k7fJNf5EIlLeIYms0TplF2HjncPoZTUYGBL6m7a8Wd/d+qCMvSKlU2q9Ga8cHplQK2zGU90ULzVdt1/2maTqvpghXvEL5QqtpV9+xlmvKzVsNnOes53CB0dXGK9bfPN6hNNTiU01Oya3TSna5zCxju0kmj7YX+sbLbV3bl5DIZlrstKWwSPuThkFFpjm1vdEEPwN9OvILCUPAULpH6w/42veTWaZdV5SIBnZc9GD6NnyNuZrHoHPL4XAvrwNDSQ12McWYkjttc5SEaOAoM0jEEEbs5YKLkfxwlN16fqY14dS5X6BwMfM4ATcJ8v6EnrDp3R79SfUXFMjkvmbyj6Z8A5dKR1VTrMU7bPrbEfFg+vupoYbaUtfH3XHB1/P6C31uQAQtcGtjMMWBlYD4M8FWHMNXCwxo8+08I5AoTPh425tFTlt0P4B6FdAKGEIqvG1CI6qE5eL50ijjuTaJWPSj1+l5Pzp1YY1II1P+BB4jCPm9S3LAEnORSb3IscYJIfGdq99za3LLbLWkFQUbf4YNshsgRWmQ4nFahC6XZYxUEcV+B2Vz7NCUxcSVAmwHh+gIeiq0IujPQPzG1guC9mEjovUxcV4/5IuSp67u30RYbrJQd82De0TLJRrxD5PWltd9EV8vK7dKegBCwPueHcNULndcdl+X8QGIRIRmnzYIzncG6RukWqZNZ9hDtco1L2VWKAsv79fuBv40oyHKkazZYB0badMnqi1WScFGPr/neO+26H2U+8KUGKdR2/bZFm+/WAfd/uoZXybqWADLksCWT8V6aZF+btOu5ri96PXDkbwnGdfoAd9OB1NsAstPAkSeSrdnS1nJrHzr2gPV75B2SC/ndNvpGpLY0onzh+roHdsnA0XSXnkd8ojmBZd1IX7m20u1C4KTSuukuHZ/yHfrXEt0vBRJJfb9bLvsF1w/d9jyMrGQbOzZpf+eNvavGRVd+V3GUb7vdyGEyzxJZurzR3hwleT/y+5dXhzmooHWthZjoYUfCR6Mao4lzDXJe6jrTpfUxjAzlMeHK3oGHFZLQKF/TpOCM5qUTmPLqoMPKNhevPZlX858eDKunO4+peBdxY6LzpVJ0RhqYncz5N/U2FBd9mdHQ1wAQs+HOnSq1zFtpuhDiV07eJSyPICa/VTv+IzY5vnKgTB2uVzbQ2lfdlL8GzYf5ZFi1EzSeD3aki9+fUetHhci0XdvezoIO0HZOb57jtZBh3+HZpm/OxOsOsxxP1N/mQ5sXZ9z/VaeT/xekQLoixdd/Jb2NPL85Icv7Nw6pms9xDzfrd8/4v/Z6tc0yBjuTTPQ7R8tdavv7NUNLdbZ+H+6XJuYcdPznoReRHmqxVfoT1nrpYDjcKc5UwVIdPt+oNyn6OfqGPXEjMPgmRWeRYSQ4U+p3e1cPkscinvhegpTPAhF4mf2HSK4fHclIbydYViiGbk0pXoyVFN5uyJui8EbMrd5LqGE68Qogl/duAEJeRoQE0AUAVh+1c3Pbmm4ANux81//0c46uyy6bAxcgixhQXtQHACGsMy9wkhYjrkbzr99wEQjZwiKcRd9cPil/VfDU6lQ4syVDfUOHGNViMNgivQaRGX7VR2hJeaTcD51MCvcfXABDrrmgqlEWGlz0mKIR3mK5c3hrze9a/t7kj2niJtZ6omaHPaWo54uMCxaoo7y5utebIB0WVH2Vv1s0+olCJG0QkBj6qBquYh3vR0LlfHS9SnsQL+VY8/vvqTXD60WHgT+HkduWF2opyQr0HXPUqOaAON9AdssJCmdx/oLJWqx2cgiyhNlQNZCKglbafNRtj9VWmONYtCfDoFsZ7avvhFD/n9J+fqv3ZoZRxzfDimXErqkQ6eDwe6+d0af+dB+8D5/PhzSG8NQZlmd1aFzXxkDS/M1c+ewXhw1+79zy7uks9pilWOqeMn4CYvlbg8sXFxHu491eeOJbP1YhhT/HNIJzBxzssrE/I04JN1igeW5IhE/w47pY9JoHIkq1KQ9tdqko06ca8waM6lS7ihCnKYVde/5AQIy71AWFVS16QRoP62QmtYqD7+BROg1/46TzHOm0BiYLGn5ReE08aBFgCG3xkWas79AOFmNhTMgovAXJYFiqkDMDgLs9IwX8T66g3y9KJya5r1jzL+ZTLqc82rRgdkm/4mEz3uilB0i3B4UXgnfs2KROMloe+J19ZgKTWoKpPb8C7B3+N9Pj5Xq0WwsZLx0VhQrm8Lzo+t/o2teqtHTR2eKRP7RhBqBBgdIR7bVPyxGTFcYCwJyaiYY1LmlHVcxjRKwgcgp2UaqTZDQc027EiEs9lWSRQM+OykufNs0pL0UZzWNS6iWWVEVvZWyz9hOGzwB86/9ANby+I0X84dLoDAUIbqqePU3R7znGnkF4rlPj/lovoIzKcSWZtuuaVOiRIchGz+2j0Mmh87PCa1eEMi0FkTcoGO+BZkpjQpV0hti4+x2m7LCy5aG+BHW3OjBMjc9yRmJddk0GfdTWO0oJ0ELGVCDijMfYmcjTjE2XU8LA6Mo4DvFTkk4TojYEdsHtMiXIlmul033kvLKfDDLFiNrzWZdIizPuJE6oLQZOeLeJwiQbn3OiB1jVFcMjeUl+KD7jYL8chyN2GW01Pe+Gfp91/9g4emOoFC7uvKs1pHW+31TmvsPD/IL9t1W7x6c0dmPT3KvBq3bgQqKvhc0GvYYnM5HcT1Tt5RroxdNGF8/zpJYX2/2O3Wu7ZCnzZYdmi6MM+hQpEabIRskQJ7tjTcaFakGkWK2p8xySyq7qjt6mBio+b9yBwSS9SbOAy9axEY9xQsYjHdYnXKTEJyqP6yN4iNcoFJWZTnedN7w8rDm+qzrdlZDXhz2ma/RKV43QLZzFLdX9cz0G91DWvc5INeSJ18gFhHHfq+po1I5IunbF67z862HhyiyCOn3cgiAcLjluaPybHwfGt24MKKLoTbE7Nf5o41RcrY/OlLj9Fkm4345Pvf24/+pwxWY0ibV6GIqGiC2IRJ3et/TmbKSH+oHWXWcL7bJ8hT0BWWTD1DIhSTFSNW//W0xjPGF4qvD04BlCYridnADeo3kA4PfP+V3lrZCFgFMYfYIc5r4qJGxCCsHLMgp5oWK47qivudUXpFGzUUuvsBQIhyJeKUswQNcVxA8rxmxYQ4UpWDKhdUSJUSZf7dqLuWxxkwkO8hQneaENUvfk7/OS5NSwn4Di40uTtfZ5yQzsByauJWFAdPTnQFN16TU7Aw7m/1DuraX422UGub2urXPBFe18Gc+G2DAhR1tkAgIEHquKwHR6IH21SKs4+rdP3t/7LH92nAhDYH4bYhldGTdMm+6mhdMOyQLuvxSu5yUWqnFCM3Ebo7H1lDcqsQP8JLRrYMG83qySKHwnvZDbOj7UmDkkv/cB7wFwoz4JytUFxGOpKqEb0jy7cD12ZLqVn8oNXug+X3kgfRNstmfgt+YhjAt10OrN2YdWILoqw2XMgeArHL6EMUioqhHwzx0Cl3H7S64jpIjPcSLzMFwWVpD01je5RqfjeFkYNzBqYW/zqgd+lkdY2lea1cHmtTZ5UUMGb75MQ1gK0460Ibi2Juuid/ts215Ebj+sJ45O2AezG8cMAjlxBCj5A6wEKXkLRwHgsdcrc2Dm2YV8U+T1L8fmxfnOW2u3u4Tczmq3vDqNVp3xNRWQGCJDHIMGi1tpI2OrUuxs4zTE7ZYD4Z0XFX6MtO24rhy8dJPAgOOyi0EwWcuP3VOtd2DyZsn2r66rBwCC2Q9/Ob5uH0mkjbz5n5CXOXXkRHRm6GSWEoMLNcCLsYFrvftFaW4Vob+e9rY+qzbFzqhCSFRgCJ50awW+RRJpSh/Gm07IbSEuDoAHgDDqU4Yo7tlIkAAwHNQ2JJrjGoc1bJ6YhgxCwLoCGxfoDYJxdKm0/LJCdh9HiLwK5aBtgcWpWg5JQrmUGy54xmVvSDAER2aglTx15WLK1afjrMLUupS7IdojwKiQdMPiPGzghSpO+mharQ7CmtLJEFydHDZcMCSG32iVdQXBbSSkDwhwwX5igIHgMAUkEQAKclip90rztwwPuJIwY2iSdF4Esvr3FLyQxJR7IGEdk/LOG6g3j54gFQaPauaVw0f2VYuG3yq4/Fr9bSPkMDmMhJYP8/FloiQORL+9rpTTL/A7ztNx4v0kzi2aHD2qAFOILm8wiRg/4bh7V95HMFQUIdYdnrmxKDzRne8UYRBUskiHKbEjWKUtIpK7QfU7sK20x1VMYQoNUOCqr5T1mXYuM/AUWUD3kBtwaZ0DlBZXiUg9TgUPUBWFwvk97jW1kNU88TNNUakBkU6OujFppF1udP2Namqz3c8rdHXBHvZXBt4Nzvr1rK5T6cjYC44ZXLUuYKpchsEQgDDV0LsJ8wBbWAEf/nRnFLjvTaq2R3LjdU98Z2XIJxe9tHr+Yu7KnpSNf2VDOPnhudltmJPR0SKIY2HP5dA2R9GMZCf8BwYo+7B7KwL+jZGozMN1zGEzQbPVknWW4DgqqAPkYNUkq7CoYXhg4H2G4x2v+5f7uyAgYpATo12ZDaCJWlrXBQd9r6txIommrN9bkGkEyFXsqzmD+VFwua8kkOIUOwbm2sE3w0j//9oU+8okyCsVY5mOuUuag6BVIakfDtuzhj5kYYc3pUOT7LACw8YJk7YfG/S9cfKb3W233v4xn7kaqPVUPNqk+dor1Xu6cOrhAZbRKiKxM59rcZHlWhCaRh5fnWF4DgS6NYd/aPPQrtFGf1E0JLGW4c3RjWHjuIxqXNabTRgcQj+fPCxd3bQeosTaowWtsHqDy1Ab9hCH/Th5fkSjuPteWcbXCBgTKRZ5plkuqTYyhKi1GR0F5KpYCGUDSlJRlA8ZeduIWepwWub61vW6dJFTYkCddsXpBJhQ+xNOONdCx3Ke1igcnV6wsCfQn/POuKyzcAY5/KMSNuqlCPsNJH+aP6DvthU+GXXk34Qzq7M+pujm8abxJvGG8Vmu4IMtHgpP5qvGUo0qUsLaovQiIahBSEr/OS0wvpFVnqU0CHOwkOV4CmdLsVF5k7LxaPN4C/Emo41G5o/p+fRhmd6t8PiwUsToB5F+PI2nSUzMFe6d6rFThtpiYHzdow2CxAJBPOKlrHCde+mUMq0OxVyo97jSxzaJaRkgVEVQEjE1CCoVQLSMGFKfL+HKqFlF3rLXxkI125gKT+0pXyHbcrVIHbzwQza/fEMfnTIakcEsW6D1RoNZ32p3eJfabVTULm1sc98ePK5yVfvmerXJpS7lyWalN6D+KTrep0zTcA47uQ3awLXxGDDjibmn7TQlUrEwD7G655aYPlvA8hvopfIHsOCHtFQ+2Ux/aEEcRYANsJLpia5lkFVoT19eIQHMiRblknz3dEYZOc5M6wTIxGze2A4ycsWFcQ44RtYndgIPQ6Zwtg11TdXrQxBzeHZNm2MjpWi1EowgMA0KP8Tr9vZa0qN+5MnXbuvy4qwLdRExQDUceqpcd23I0NaLmi6RK/BLLnFNlUBPI2UW3M5VuoLwt20fsYDrsw1m4pZdVC/ipbxTlF/hAj08YMeF2yw2eaTXQ5IO8Rhs8LdqnGIOlDiF2uWrBMGCLJTLA5IfyWepa5DfIrkD/dhnCtVRNxdc7j6x+gDtEqS+olFjjc4SN/zIY0fwCUACpSWkgrJI3KRYsNYSCh+AaD5CSgM7Ey21lFhrREJSJ2P1X3CQxD4Xxfh5Lp6ySEP8l/bLWtZyvBYntwvM/rEfHeo2/H7ttpjG9qly+SMhh3trGW+rj+Pd8a2MTV23ooFAXr9BvviS/OJJWuHyuMfDU3uN0yMLNgfSo+WhMK5KqRkNlwiP2BpvMoOHf3p+7+/ySPsmprYylnR7baAQejwY4W5tzK99dd+XnWzTuUTkfNssUlLTC+E0lYo9B02m9ZHl/1yGzXuUOEjAENSj1neAQ6U7NnAzyvrjfAcUMxNajaiWxcuHhoNsPrjZXsC1eHm/vEc48X19eDk1Tzp1U4WW5nzTYl1SHWWqmCUAjigZBAZ37nnXKfhudONRQ4tpltHbgV1nnWrU6rOobboAUy/yH3dfk9oyx+GxBhswEPjSm4WNgccLOV4fnAqjZFbXP5OzTqImTh7QfiGAWHvbfoXJwND04wXQxIem/nN7n1///MdoJ0+xT9OFvaGh+lqhuAixpd0qGGWHNWmIuLjEs47jxbBaj6RbUrMD66rymlVSwLFmbv8eyOVdvw/gbp5QHD4+1lve9mreS0EPIwSjARP+e+F9FC48sIfDF7aHyd5pnVy2Rq/ow0feMEigEq7EC7ReW7zBknNSJrwzJ+XiQhqGkXLgrrX0Ejkx3g16sOHqFe9Ru/SQHohpMcxRQzaYLeEMjQnNKFA2HB7ZLmhNG6pxpFkszm94hsUVlFTi/ZyDB4HHsOYwYExpz1D3LakS6MojJ0+0DxKCu6naEMo5N6kwwbIe2Kv2nMHh4tPHmKcKpLDIDePBDw0x+tyVWqkyZuFSpjb7XUjjvjsryrKzlewl9zKCEjS9JMS9MG078fp+6x3+ZIYX0qzVKS1FUw/XuWmDkr7wdYcE7nUmCiao/hxV8MbVU23JnhcgerZkuC/WBnnseECzbZpFUEZeTSDpIQPF6s4Ws1mRLeUt59U8NAPRxDOHshUtwvFLpXrIH53QcdLl9IZiG8GHcqpIYHUTrGHMk1w5DL1hnLmNv818EDZjlAMmwl2Ux6zOoKJKZmk2AB7MoOfDPsxGPy7mY4eYKvdhG0NKl39ZgXV4E3Q6rjKtufWe8FEKb5eDvTPZ1Id82NqwtWFtWB6qeCyAWg53hLyS28PGFXjHBOCZ1ZMNPyS5vjOjT8vmFJlRcEJqdEconnxAZ7GzMi7LO89jtnjI7Zw9EPGd2vAhQdOzcPIS1gkdNvEkX/nP+oNwH4ZXYB1utx4DK30itLGcl7aN401jSd9y9E84TL5UTd1uYnhyJcWxwe0aT+ZgQ6cIUnXHnLJp50bMLP6gM+SwGjEpI03RgoddlawLutxMr3s2+S0yJtVpverxYffJA1sCPX+Nk77whtx+BIiJenweQO9SP947zSJy6oH1w686iemFRudeaomQVWE/+QEvTPNErQX8aIW9dAkLhD9d54gPxKlMtFCjhYdYd3a3uqa8GN5x7nS8I7rXDw1uDJWblveXe1voiBEv+Q/dctK8b3kcbEaHigmdf8xZBxWm0r+trU6/kp5cQXotadyhvVlGgR5Mo+m3/s6/cvzb3roMxIU9h30sFd8bSFrp9FD2vKQV+L8hjfhOTJUXPUb/x3Rr9K3FptBbUMlebm48xSmRFpMhhPmGkVF8cuVUuIjJnxJXa1ounFi40T7RMOczN1pX+SMc7Oc+2tJHYTxi4s0QhbDMug7Rk9COX9OadF89oQP5xO1zejgM9nru6oZYKMQn5TSbh3y8I8KVEpMBBaQRotTk+gnRJ/6oPqojCeFs+Pe5LzBCeNxrT4re7R9UsVaI9etNh3pcVjNMnn5peAD3/k0TdF7zpDG8SKIV1YHpgVh2JP9dA83MntXqDzwzI+v13PKZ5STaY/jLEBqfzhTENzkj4bgDFMJAYbGNb8b9683Pp7LvAurNcZnYwZPf90a+nU7JdWUyE4+ys+7oUhaIMbZvPU1o94CaHDgZ8B3K4+NKfM1r/ePUhP7HrHcC0o2gWI4CVW+RWgv7CqIZ/9X1lmAPXI+Y+XtanZQ9/YnC7qAGxqi+QazGaH3BKVB7iCi6P2sGBfHBtyKI7m4fmOCOJ1bPebG250slOEaXVYUmmkS8qL4qz18G78fW/38Iqdd92DSWNioJz4vLl8hmIrR+itRWzmQP+5rk3ASeI9XfTEC22qejk7EQU8SJGPk4+blgvtg7WB6x1yh4CNF0+XEXL+NlLFLqcHJinFlqmjd0OzrSnFjdb5nm2+tDjuQwTKBQ9l8=","base64")).toString()),dR)});var H6=w((CR,U6)=>{(function(r,e){typeof CR=="object"?U6.exports=e():typeof define=="function"&&define.amd?define(e):r.treeify=e()})(CR,function(){function r(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function t(n,s,o,a,l,c,u){var g="",f=0,h,p,m=a.slice(0);if(m.push([s,o])&&a.length>0&&(a.forEach(function(b,v){v>0&&(g+=(b[1]?" ":"\u2502")+" "),!p&&b[0]===s&&(p=!0)}),g+=r(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var y=e(s,c);y.forEach(function(b){h=++f===y.length,t(b,s[b],h,m,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;t(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return t(".",n,!1,[],s,o,function(l){a+=l+` -`}),a},i})});var _B=w((sAt,X6)=>{var ENe=Ks(),INe=Id(),yNe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,wNe=/^\w*$/;function BNe(r,e){if(ENe(r))return!1;var t=typeof r;return t=="number"||t=="symbol"||t=="boolean"||r==null||INe(r)?!0:wNe.test(r)||!yNe.test(r)||e!=null&&r in Object(e)}X6.exports=BNe});var VB=w((oAt,Z6)=>{var bNe=Wc(),QNe=Rn(),SNe="[object AsyncFunction]",vNe="[object Function]",xNe="[object GeneratorFunction]",kNe="[object Proxy]";function PNe(r){if(!QNe(r))return!1;var e=bNe(r);return e==vNe||e==xNe||e==SNe||e==kNe}Z6.exports=PNe});var e7=w((aAt,$6)=>{var DNe=Ns(),RNe=DNe["__core-js_shared__"];$6.exports=RNe});var i7=w((AAt,t7)=>{var QR=e7(),r7=function(){var r=/[^.]+$/.exec(QR&&QR.keys&&QR.keys.IE_PROTO||"");return r?"Symbol(src)_1."+r:""}();function FNe(r){return!!r7&&r7 in r}t7.exports=FNe});var SR=w((lAt,n7)=>{var NNe=Function.prototype,LNe=NNe.toString;function TNe(r){if(r!=null){try{return LNe.call(r)}catch(e){}try{return r+""}catch(e){}}return""}n7.exports=TNe});var o7=w((cAt,s7)=>{var ONe=VB(),MNe=i7(),KNe=Rn(),UNe=SR(),HNe=/[\\^$.*+?()[\]{}|]/g,jNe=/^\[object .+?Constructor\]$/,GNe=Function.prototype,YNe=Object.prototype,qNe=GNe.toString,JNe=YNe.hasOwnProperty,WNe=RegExp("^"+qNe.call(JNe).replace(HNe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function zNe(r){if(!KNe(r)||MNe(r))return!1;var e=ONe(r)?WNe:jNe;return e.test(UNe(r))}s7.exports=zNe});var A7=w((uAt,a7)=>{function _Ne(r,e){return r==null?void 0:r[e]}a7.exports=_Ne});var Rl=w((gAt,l7)=>{var VNe=o7(),XNe=A7();function ZNe(r,e){var t=XNe(r,e);return VNe(t)?t:void 0}l7.exports=ZNe});var cC=w((fAt,c7)=>{var $Ne=Rl(),eLe=$Ne(Object,"create");c7.exports=eLe});var f7=w((hAt,u7)=>{var g7=cC();function tLe(){this.__data__=g7?g7(null):{},this.size=0}u7.exports=tLe});var p7=w((pAt,h7)=>{function rLe(r){var e=this.has(r)&&delete this.__data__[r];return this.size-=e?1:0,e}h7.exports=rLe});var C7=w((dAt,d7)=>{var iLe=cC(),nLe="__lodash_hash_undefined__",sLe=Object.prototype,oLe=sLe.hasOwnProperty;function aLe(r){var e=this.__data__;if(iLe){var t=e[r];return t===nLe?void 0:t}return oLe.call(e,r)?e[r]:void 0}d7.exports=aLe});var E7=w((CAt,m7)=>{var ALe=cC(),lLe=Object.prototype,cLe=lLe.hasOwnProperty;function uLe(r){var e=this.__data__;return ALe?e[r]!==void 0:cLe.call(e,r)}m7.exports=uLe});var y7=w((mAt,I7)=>{var gLe=cC(),fLe="__lodash_hash_undefined__";function hLe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,t[r]=gLe&&e===void 0?fLe:e,this}I7.exports=hLe});var B7=w((EAt,w7)=>{var pLe=f7(),dLe=p7(),CLe=C7(),mLe=E7(),ELe=y7();function kf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{function ILe(){this.__data__=[],this.size=0}b7.exports=ILe});var Pf=w((yAt,S7)=>{function yLe(r,e){return r===e||r!==r&&e!==e}S7.exports=yLe});var uC=w((wAt,v7)=>{var wLe=Pf();function BLe(r,e){for(var t=r.length;t--;)if(wLe(r[t][0],e))return t;return-1}v7.exports=BLe});var k7=w((BAt,x7)=>{var bLe=uC(),QLe=Array.prototype,SLe=QLe.splice;function vLe(r){var e=this.__data__,t=bLe(e,r);if(t<0)return!1;var i=e.length-1;return t==i?e.pop():SLe.call(e,t,1),--this.size,!0}x7.exports=vLe});var D7=w((bAt,P7)=>{var xLe=uC();function kLe(r){var e=this.__data__,t=xLe(e,r);return t<0?void 0:e[t][1]}P7.exports=kLe});var F7=w((QAt,R7)=>{var PLe=uC();function DLe(r){return PLe(this.__data__,r)>-1}R7.exports=DLe});var L7=w((SAt,N7)=>{var RLe=uC();function FLe(r,e){var t=this.__data__,i=RLe(t,r);return i<0?(++this.size,t.push([r,e])):t[i][1]=e,this}N7.exports=FLe});var gC=w((vAt,T7)=>{var NLe=Q7(),LLe=k7(),TLe=D7(),OLe=F7(),MLe=L7();function Df(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var KLe=Rl(),ULe=Ns(),HLe=KLe(ULe,"Map");O7.exports=HLe});var U7=w((kAt,M7)=>{var K7=B7(),jLe=gC(),GLe=XB();function YLe(){this.size=0,this.__data__={hash:new K7,map:new(GLe||jLe),string:new K7}}M7.exports=YLe});var j7=w((PAt,H7)=>{function qLe(r){var e=typeof r;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?r!=="__proto__":r===null}H7.exports=qLe});var fC=w((DAt,G7)=>{var JLe=j7();function WLe(r,e){var t=r.__data__;return JLe(e)?t[typeof e=="string"?"string":"hash"]:t.map}G7.exports=WLe});var q7=w((RAt,Y7)=>{var zLe=fC();function _Le(r){var e=zLe(this,r).delete(r);return this.size-=e?1:0,e}Y7.exports=_Le});var W7=w((FAt,J7)=>{var VLe=fC();function XLe(r){return VLe(this,r).get(r)}J7.exports=XLe});var _7=w((NAt,z7)=>{var ZLe=fC();function $Le(r){return ZLe(this,r).has(r)}z7.exports=$Le});var X7=w((LAt,V7)=>{var eTe=fC();function tTe(r,e){var t=eTe(this,r),i=t.size;return t.set(r,e),this.size+=t.size==i?0:1,this}V7.exports=tTe});var ZB=w((TAt,Z7)=>{var rTe=U7(),iTe=q7(),nTe=W7(),sTe=_7(),oTe=X7();function Rf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var eX=ZB(),aTe="Expected a function";function vR(r,e){if(typeof r!="function"||e!=null&&typeof e!="function")throw new TypeError(aTe);var t=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=t.cache;if(s.has(n))return s.get(n);var o=r.apply(this,i);return t.cache=s.set(n,o)||s,o};return t.cache=new(vR.Cache||eX),t}vR.Cache=eX;$7.exports=vR});var iX=w((MAt,rX)=>{var ATe=tX(),lTe=500;function cTe(r){var e=ATe(r,function(i){return t.size===lTe&&t.clear(),i}),t=e.cache;return e}rX.exports=cTe});var sX=w((KAt,nX)=>{var uTe=iX(),gTe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,fTe=/\\(\\)?/g,hTe=uTe(function(r){var e=[];return r.charCodeAt(0)===46&&e.push(""),r.replace(gTe,function(t,i,n,s){e.push(n?s.replace(fTe,"$1"):i||t)}),e});nX.exports=hTe});var Ff=w((UAt,oX)=>{var pTe=Ks(),dTe=_B(),CTe=sX(),mTe=lf();function ETe(r,e){return pTe(r)?r:dTe(r,e)?[r]:CTe(mTe(r))}oX.exports=ETe});var gu=w((HAt,aX)=>{var ITe=Id(),yTe=1/0;function wTe(r){if(typeof r=="string"||ITe(r))return r;var e=r+"";return e=="0"&&1/r==-yTe?"-0":e}aX.exports=wTe});var hC=w((jAt,AX)=>{var BTe=Ff(),bTe=gu();function QTe(r,e){e=BTe(e,r);for(var t=0,i=e.length;r!=null&&t{var STe=Rl(),vTe=function(){try{var r=STe(Object,"defineProperty");return r({},"",{}),r}catch(e){}}();lX.exports=vTe});var Nf=w((YAt,cX)=>{var uX=xR();function xTe(r,e,t){e=="__proto__"&&uX?uX(r,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):r[e]=t}cX.exports=xTe});var $B=w((qAt,gX)=>{var kTe=Nf(),PTe=Pf(),DTe=Object.prototype,RTe=DTe.hasOwnProperty;function FTe(r,e,t){var i=r[e];(!(RTe.call(r,e)&&PTe(i,t))||t===void 0&&!(e in r))&&kTe(r,e,t)}gX.exports=FTe});var pC=w((JAt,fX)=>{var NTe=9007199254740991,LTe=/^(?:0|[1-9]\d*)$/;function TTe(r,e){var t=typeof r;return e=e==null?NTe:e,!!e&&(t=="number"||t!="symbol"&<e.test(r))&&r>-1&&r%1==0&&r{var OTe=$B(),MTe=Ff(),KTe=pC(),pX=Rn(),UTe=gu();function HTe(r,e,t,i){if(!pX(r))return r;e=MTe(e,r);for(var n=-1,s=e.length,o=s-1,a=r;a!=null&&++n{var jTe=hC(),GTe=kR(),YTe=Ff();function qTe(r,e,t){for(var i=-1,n=e.length,s={};++i{function JTe(r,e){return r!=null&&e in Object(r)}mX.exports=JTe});var yX=w((VAt,IX)=>{var WTe=Wc(),zTe=ta(),_Te="[object Arguments]";function VTe(r){return zTe(r)&&WTe(r)==_Te}IX.exports=VTe});var dC=w((XAt,wX)=>{var BX=yX(),XTe=ta(),bX=Object.prototype,ZTe=bX.hasOwnProperty,$Te=bX.propertyIsEnumerable,eOe=BX(function(){return arguments}())?BX:function(r){return XTe(r)&&ZTe.call(r,"callee")&&!$Te.call(r,"callee")};wX.exports=eOe});var e0=w((ZAt,QX)=>{var tOe=9007199254740991;function rOe(r){return typeof r=="number"&&r>-1&&r%1==0&&r<=tOe}QX.exports=rOe});var PR=w(($At,SX)=>{var iOe=Ff(),nOe=dC(),sOe=Ks(),oOe=pC(),aOe=e0(),AOe=gu();function lOe(r,e,t){e=iOe(e,r);for(var i=-1,n=e.length,s=!1;++i{var cOe=EX(),uOe=PR();function gOe(r,e){return r!=null&&uOe(r,e,cOe)}vX.exports=gOe});var kX=w((tlt,xX)=>{var fOe=CX(),hOe=DR();function pOe(r,e){return fOe(r,e,function(t,i){return hOe(r,i)})}xX.exports=pOe});var t0=w((rlt,PX)=>{function dOe(r,e){for(var t=-1,i=e.length,n=r.length;++t{var RX=Jc(),COe=dC(),mOe=Ks(),FX=RX?RX.isConcatSpreadable:void 0;function EOe(r){return mOe(r)||COe(r)||!!(FX&&r&&r[FX])}DX.exports=EOe});var OX=w((nlt,LX)=>{var IOe=t0(),yOe=NX();function TX(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=yOe),n||(n=[]);++s0&&t(a)?e>1?TX(a,e-1,t,i,n):IOe(n,a):i||(n[n.length]=a)}return n}LX.exports=TX});var KX=w((slt,MX)=>{var wOe=OX();function BOe(r){var e=r==null?0:r.length;return e?wOe(r,1):[]}MX.exports=BOe});var HX=w((olt,UX)=>{function bOe(r,e,t){switch(t.length){case 0:return r.call(e);case 1:return r.call(e,t[0]);case 2:return r.call(e,t[0],t[1]);case 3:return r.call(e,t[0],t[1],t[2])}return r.apply(e,t)}UX.exports=bOe});var RR=w((alt,jX)=>{var QOe=HX(),GX=Math.max;function SOe(r,e,t){return e=GX(e===void 0?r.length-1:e,0),function(){for(var i=arguments,n=-1,s=GX(i.length-e,0),o=Array(s);++n{function vOe(r){return function(){return r}}YX.exports=vOe});var r0=w((llt,JX)=>{function xOe(r){return r}JX.exports=xOe});var _X=w((clt,WX)=>{var kOe=qX(),zX=xR(),POe=r0(),DOe=zX?function(r,e){return zX(r,"toString",{configurable:!0,enumerable:!1,value:kOe(e),writable:!0})}:POe;WX.exports=DOe});var XX=w((ult,VX)=>{var ROe=800,FOe=16,NOe=Date.now;function LOe(r){var e=0,t=0;return function(){var i=NOe(),n=FOe-(i-t);if(t=i,n>0){if(++e>=ROe)return arguments[0]}else e=0;return r.apply(void 0,arguments)}}VX.exports=LOe});var FR=w((glt,ZX)=>{var TOe=_X(),OOe=XX(),MOe=OOe(TOe);ZX.exports=MOe});var eZ=w((flt,$X)=>{var KOe=KX(),UOe=RR(),HOe=FR();function jOe(r){return HOe(UOe(r,void 0,KOe),r+"")}$X.exports=jOe});var rZ=w((hlt,tZ)=>{var GOe=kX(),YOe=eZ(),qOe=YOe(function(r,e){return r==null?{}:GOe(r,e)});tZ.exports=qOe});var hZ=w((uut,uZ)=>{"use strict";var GR;try{GR=Map}catch(r){}var YR;try{YR=Set}catch(r){}function gZ(r,e,t){if(!r||typeof r!="object"||typeof r=="function")return r;if(r.nodeType&&"cloneNode"in r)return r.cloneNode(!0);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r);if(Array.isArray(r))return r.map(fZ);if(GR&&r instanceof GR)return new Map(Array.from(r.entries()));if(YR&&r instanceof YR)return new Set(Array.from(r.values()));if(r instanceof Object){e.push(r);var i=Object.create(r);t.push(i);for(var n in r){var s=e.findIndex(function(o){return o===r[n]});i[n]=s>-1?t[s]:gZ(r[n],e,t)}return i}return r}function fZ(r){return gZ(r,[],[])}uZ.exports=fZ});var IC=w(qR=>{"use strict";Object.defineProperty(qR,"__esModule",{value:!0});qR.default=eMe;var tMe=Object.prototype.toString,rMe=Error.prototype.toString,iMe=RegExp.prototype.toString,nMe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",sMe=/^Symbol\((.*)\)(.*)$/;function oMe(r){return r!=+r?"NaN":r===0&&1/r<0?"-0":""+r}function pZ(r,e=!1){if(r==null||r===!0||r===!1)return""+r;let t=typeof r;if(t==="number")return oMe(r);if(t==="string")return e?`"${r}"`:r;if(t==="function")return"[Function "+(r.name||"anonymous")+"]";if(t==="symbol")return nMe.call(r).replace(sMe,"Symbol($1)");let i=tMe.call(r).slice(8,-1);return i==="Date"?isNaN(r.getTime())?""+r:r.toISOString(r):i==="Error"||r instanceof Error?"["+rMe.call(r)+"]":i==="RegExp"?iMe.call(r):null}function eMe(r,e){let t=pZ(r,e);return t!==null?t:JSON.stringify(r,function(i,n){let s=pZ(this[i],e);return s!==null?s:n},2)}});var CA=w(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.default=bi.array=bi.object=bi.boolean=bi.date=bi.number=bi.string=bi.mixed=void 0;var dZ=aMe(IC());function aMe(r){return r&&r.__esModule?r:{default:r}}var CZ={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:r,type:e,value:t,originalValue:i})=>{let n=i!=null&&i!==t,s=`${r} must be a \`${e}\` type, but the final value was: \`${(0,dZ.default)(t,!0)}\``+(n?` (cast from the value \`${(0,dZ.default)(i,!0)}\`).`:".");return t===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};bi.mixed=CZ;var mZ={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};bi.string=mZ;var EZ={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};bi.number=EZ;var IZ={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};bi.date=IZ;var yZ={isValue:"${path} field must be ${value}"};bi.boolean=yZ;var wZ={noUnknown:"${path} field has unspecified keys: ${unknown}"};bi.object=wZ;var BZ={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};bi.array=BZ;var AMe=Object.assign(Object.create(null),{mixed:CZ,string:mZ,number:EZ,date:IZ,object:wZ,array:BZ,boolean:yZ});bi.default=AMe});var QZ=w((hut,bZ)=>{var lMe=Object.prototype,cMe=lMe.hasOwnProperty;function uMe(r,e){return r!=null&&cMe.call(r,e)}bZ.exports=uMe});var yC=w((put,SZ)=>{var gMe=QZ(),fMe=PR();function hMe(r,e){return r!=null&&fMe(r,e,gMe)}SZ.exports=hMe});var Tf=w(o0=>{"use strict";Object.defineProperty(o0,"__esModule",{value:!0});o0.default=void 0;var pMe=r=>r&&r.__isYupSchema__;o0.default=pMe});var kZ=w(a0=>{"use strict";Object.defineProperty(a0,"__esModule",{value:!0});a0.default=void 0;var dMe=vZ(yC()),CMe=vZ(Tf());function vZ(r){return r&&r.__esModule?r:{default:r}}var xZ=class{constructor(e,t){if(this.refs=e,this.refs=e,typeof t=="function"){this.fn=t;return}if(!(0,dMe.default)(t,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=t,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,t){let i=this.refs.map(s=>s.getValue(t==null?void 0:t.value,t==null?void 0:t.parent,t==null?void 0:t.context)),n=this.fn.apply(e,i.concat(e,t));if(n===void 0||n===e)return e;if(!(0,CMe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(t)}},mMe=xZ;a0.default=mMe});var WR=w(JR=>{"use strict";Object.defineProperty(JR,"__esModule",{value:!0});JR.default=EMe;function EMe(r){return r==null?[]:[].concat(r)}});var fu=w(A0=>{"use strict";Object.defineProperty(A0,"__esModule",{value:!0});A0.default=void 0;var IMe=PZ(IC()),yMe=PZ(WR());function PZ(r){return r&&r.__esModule?r:{default:r}}function zR(){return zR=Object.assign||function(r){for(var e=1;e(0,IMe.default)(t[s])):typeof e=="function"?e(t):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,t,i,n){super();this.name="ValidationError",this.value=t,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,yMe.default)(e).forEach(s=>{wC.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,wC)}};A0.default=wC});var l0=w(_R=>{"use strict";Object.defineProperty(_R,"__esModule",{value:!0});_R.default=BMe;var VR=bMe(fu());function bMe(r){return r&&r.__esModule?r:{default:r}}var QMe=r=>{let e=!1;return(...t)=>{e||(e=!0,r(...t))}};function BMe(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,path:l}=r,c=QMe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new VR.default(o,s,l)):c(null,s);for(let f=0;f{function SMe(r){return function(e,t,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[r?a:++n];if(t(s[l],l,s)===!1)break}return e}}DZ.exports=SMe});var XR=w((wut,FZ)=>{var vMe=RZ(),xMe=vMe();FZ.exports=xMe});var LZ=w((But,NZ)=>{function kMe(r,e){for(var t=-1,i=Array(r);++t{function PMe(){return!1}TZ.exports=PMe});var bC=w((BC,Of)=>{var DMe=Ns(),RMe=OZ(),MZ=typeof BC=="object"&&BC&&!BC.nodeType&&BC,KZ=MZ&&typeof Of=="object"&&Of&&!Of.nodeType&&Of,FMe=KZ&&KZ.exports===MZ,UZ=FMe?DMe.Buffer:void 0,NMe=UZ?UZ.isBuffer:void 0,LMe=NMe||RMe;Of.exports=LMe});var jZ=w((Qut,HZ)=>{var TMe=Wc(),OMe=e0(),MMe=ta(),KMe="[object Arguments]",UMe="[object Array]",HMe="[object Boolean]",jMe="[object Date]",GMe="[object Error]",YMe="[object Function]",qMe="[object Map]",JMe="[object Number]",WMe="[object Object]",zMe="[object RegExp]",_Me="[object Set]",VMe="[object String]",XMe="[object WeakMap]",ZMe="[object ArrayBuffer]",$Me="[object DataView]",e1e="[object Float32Array]",t1e="[object Float64Array]",r1e="[object Int8Array]",i1e="[object Int16Array]",n1e="[object Int32Array]",s1e="[object Uint8Array]",o1e="[object Uint8ClampedArray]",a1e="[object Uint16Array]",A1e="[object Uint32Array]",wr={};wr[e1e]=wr[t1e]=wr[r1e]=wr[i1e]=wr[n1e]=wr[s1e]=wr[o1e]=wr[a1e]=wr[A1e]=!0;wr[KMe]=wr[UMe]=wr[ZMe]=wr[HMe]=wr[$Me]=wr[jMe]=wr[GMe]=wr[YMe]=wr[qMe]=wr[JMe]=wr[WMe]=wr[zMe]=wr[_Me]=wr[VMe]=wr[XMe]=!1;function l1e(r){return MMe(r)&&OMe(r.length)&&!!wr[TMe(r)]}HZ.exports=l1e});var c0=w((Sut,GZ)=>{function c1e(r){return function(e){return r(e)}}GZ.exports=c1e});var u0=w((QC,Mf)=>{var u1e=rk(),YZ=typeof QC=="object"&&QC&&!QC.nodeType&&QC,SC=YZ&&typeof Mf=="object"&&Mf&&!Mf.nodeType&&Mf,g1e=SC&&SC.exports===YZ,ZR=g1e&&u1e.process,f1e=function(){try{var r=SC&&SC.require&&SC.require("util").types;return r||ZR&&ZR.binding&&ZR.binding("util")}catch(e){}}();Mf.exports=f1e});var g0=w((vut,qZ)=>{var h1e=jZ(),p1e=c0(),JZ=u0(),WZ=JZ&&JZ.isTypedArray,d1e=WZ?p1e(WZ):h1e;qZ.exports=d1e});var $R=w((xut,zZ)=>{var C1e=LZ(),m1e=dC(),E1e=Ks(),I1e=bC(),y1e=pC(),w1e=g0(),B1e=Object.prototype,b1e=B1e.hasOwnProperty;function Q1e(r,e){var t=E1e(r),i=!t&&m1e(r),n=!t&&!i&&I1e(r),s=!t&&!i&&!n&&w1e(r),o=t||i||n||s,a=o?C1e(r.length,String):[],l=a.length;for(var c in r)(e||b1e.call(r,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||y1e(c,l)))&&a.push(c);return a}zZ.exports=Q1e});var f0=w((kut,_Z)=>{var S1e=Object.prototype;function v1e(r){var e=r&&r.constructor,t=typeof e=="function"&&e.prototype||S1e;return r===t}_Z.exports=v1e});var eF=w((Put,VZ)=>{function x1e(r,e){return function(t){return r(e(t))}}VZ.exports=x1e});var ZZ=w((Dut,XZ)=>{var k1e=eF(),P1e=k1e(Object.keys,Object);XZ.exports=P1e});var e$=w((Rut,$Z)=>{var D1e=f0(),R1e=ZZ(),F1e=Object.prototype,N1e=F1e.hasOwnProperty;function L1e(r){if(!D1e(r))return R1e(r);var e=[];for(var t in Object(r))N1e.call(r,t)&&t!="constructor"&&e.push(t);return e}$Z.exports=L1e});var vC=w((Fut,t$)=>{var T1e=VB(),O1e=e0();function M1e(r){return r!=null&&O1e(r.length)&&!T1e(r)}t$.exports=M1e});var Kf=w((Nut,r$)=>{var K1e=$R(),U1e=e$(),H1e=vC();function j1e(r){return H1e(r)?K1e(r):U1e(r)}r$.exports=j1e});var tF=w((Lut,i$)=>{var G1e=XR(),Y1e=Kf();function q1e(r,e){return r&&G1e(r,e,Y1e)}i$.exports=q1e});var s$=w((Tut,n$)=>{var J1e=gC();function W1e(){this.__data__=new J1e,this.size=0}n$.exports=W1e});var a$=w((Out,o$)=>{function z1e(r){var e=this.__data__,t=e.delete(r);return this.size=e.size,t}o$.exports=z1e});var l$=w((Mut,A$)=>{function _1e(r){return this.__data__.get(r)}A$.exports=_1e});var u$=w((Kut,c$)=>{function V1e(r){return this.__data__.has(r)}c$.exports=V1e});var f$=w((Uut,g$)=>{var X1e=gC(),Z1e=XB(),$1e=ZB(),eKe=200;function tKe(r,e){var t=this.__data__;if(t instanceof X1e){var i=t.__data__;if(!Z1e||i.length{var rKe=gC(),iKe=s$(),nKe=a$(),sKe=l$(),oKe=u$(),aKe=f$();function Uf(r){var e=this.__data__=new rKe(r);this.size=e.size}Uf.prototype.clear=iKe;Uf.prototype.delete=nKe;Uf.prototype.get=sKe;Uf.prototype.has=oKe;Uf.prototype.set=aKe;h$.exports=Uf});var d$=w((jut,p$)=>{var AKe="__lodash_hash_undefined__";function lKe(r){return this.__data__.set(r,AKe),this}p$.exports=lKe});var m$=w((Gut,C$)=>{function cKe(r){return this.__data__.has(r)}C$.exports=cKe});var I$=w((Yut,E$)=>{var uKe=ZB(),gKe=d$(),fKe=m$();function h0(r){var e=-1,t=r==null?0:r.length;for(this.__data__=new uKe;++e{function hKe(r,e){for(var t=-1,i=r==null?0:r.length;++t{function pKe(r,e){return r.has(e)}B$.exports=pKe});var rF=w((Wut,Q$)=>{var dKe=I$(),CKe=w$(),mKe=b$(),EKe=1,IKe=2;function yKe(r,e,t,i,n,s){var o=t&EKe,a=r.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(r),u=s.get(e);if(c&&u)return c==e&&u==r;var g=-1,f=!0,h=t&IKe?new dKe:void 0;for(s.set(r,e),s.set(e,r);++g{var wKe=Ns(),BKe=wKe.Uint8Array;S$.exports=BKe});var x$=w((_ut,v$)=>{function bKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i,n){t[++e]=[n,i]}),t}v$.exports=bKe});var P$=w((Vut,k$)=>{function QKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i){t[++e]=i}),t}k$.exports=QKe});var L$=w((Xut,D$)=>{var R$=Jc(),F$=iF(),SKe=Pf(),vKe=rF(),xKe=x$(),kKe=P$(),PKe=1,DKe=2,RKe="[object Boolean]",FKe="[object Date]",NKe="[object Error]",LKe="[object Map]",TKe="[object Number]",OKe="[object RegExp]",MKe="[object Set]",KKe="[object String]",UKe="[object Symbol]",HKe="[object ArrayBuffer]",jKe="[object DataView]",N$=R$?R$.prototype:void 0,nF=N$?N$.valueOf:void 0;function GKe(r,e,t,i,n,s,o){switch(t){case jKe:if(r.byteLength!=e.byteLength||r.byteOffset!=e.byteOffset)return!1;r=r.buffer,e=e.buffer;case HKe:return!(r.byteLength!=e.byteLength||!s(new F$(r),new F$(e)));case RKe:case FKe:case TKe:return SKe(+r,+e);case NKe:return r.name==e.name&&r.message==e.message;case OKe:case KKe:return r==e+"";case LKe:var a=xKe;case MKe:var l=i&PKe;if(a||(a=kKe),r.size!=e.size&&!l)return!1;var c=o.get(r);if(c)return c==e;i|=DKe,o.set(r,e);var u=vKe(a(r),a(e),i,n,s,o);return o.delete(r),u;case UKe:if(nF)return nF.call(r)==nF.call(e)}return!1}D$.exports=GKe});var sF=w((Zut,T$)=>{var YKe=t0(),qKe=Ks();function JKe(r,e,t){var i=e(r);return qKe(r)?i:YKe(i,t(r))}T$.exports=JKe});var M$=w(($ut,O$)=>{function WKe(r,e){for(var t=-1,i=r==null?0:r.length,n=0,s=[];++t{function zKe(){return[]}K$.exports=zKe});var p0=w((tgt,U$)=>{var _Ke=M$(),VKe=oF(),XKe=Object.prototype,ZKe=XKe.propertyIsEnumerable,H$=Object.getOwnPropertySymbols,$Ke=H$?function(r){return r==null?[]:(r=Object(r),_Ke(H$(r),function(e){return ZKe.call(r,e)}))}:VKe;U$.exports=$Ke});var aF=w((rgt,j$)=>{var eUe=sF(),tUe=p0(),rUe=Kf();function iUe(r){return eUe(r,rUe,tUe)}j$.exports=iUe});var q$=w((igt,G$)=>{var Y$=aF(),nUe=1,sUe=Object.prototype,oUe=sUe.hasOwnProperty;function aUe(r,e,t,i,n,s){var o=t&nUe,a=Y$(r),l=a.length,c=Y$(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:oUe.call(e,f)))return!1}var h=s.get(r),p=s.get(e);if(h&&p)return h==e&&p==r;var m=!0;s.set(r,e),s.set(e,r);for(var y=o;++g{var AUe=Rl(),lUe=Ns(),cUe=AUe(lUe,"DataView");J$.exports=cUe});var _$=w((sgt,z$)=>{var uUe=Rl(),gUe=Ns(),fUe=uUe(gUe,"Promise");z$.exports=fUe});var X$=w((ogt,V$)=>{var hUe=Rl(),pUe=Ns(),dUe=hUe(pUe,"Set");V$.exports=dUe});var $$=w((agt,Z$)=>{var CUe=Rl(),mUe=Ns(),EUe=CUe(mUe,"WeakMap");Z$.exports=EUe});var kC=w((Agt,eee)=>{var AF=W$(),lF=XB(),cF=_$(),uF=X$(),gF=$$(),tee=Wc(),Hf=SR(),ree="[object Map]",IUe="[object Object]",iee="[object Promise]",nee="[object Set]",see="[object WeakMap]",oee="[object DataView]",yUe=Hf(AF),wUe=Hf(lF),BUe=Hf(cF),bUe=Hf(uF),QUe=Hf(gF),hu=tee;(AF&&hu(new AF(new ArrayBuffer(1)))!=oee||lF&&hu(new lF)!=ree||cF&&hu(cF.resolve())!=iee||uF&&hu(new uF)!=nee||gF&&hu(new gF)!=see)&&(hu=function(r){var e=tee(r),t=e==IUe?r.constructor:void 0,i=t?Hf(t):"";if(i)switch(i){case yUe:return oee;case wUe:return ree;case BUe:return iee;case bUe:return nee;case QUe:return see}return e});eee.exports=hu});var hee=w((lgt,aee)=>{var fF=xC(),SUe=rF(),vUe=L$(),xUe=q$(),Aee=kC(),lee=Ks(),cee=bC(),kUe=g0(),PUe=1,uee="[object Arguments]",gee="[object Array]",d0="[object Object]",DUe=Object.prototype,fee=DUe.hasOwnProperty;function RUe(r,e,t,i,n,s){var o=lee(r),a=lee(e),l=o?gee:Aee(r),c=a?gee:Aee(e);l=l==uee?d0:l,c=c==uee?d0:c;var u=l==d0,g=c==d0,f=l==c;if(f&&cee(r)){if(!cee(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new fF),o||kUe(r)?SUe(r,e,t,i,n,s):vUe(r,e,l,t,i,n,s);if(!(t&PUe)){var h=u&&fee.call(r,"__wrapped__"),p=g&&fee.call(e,"__wrapped__");if(h||p){var m=h?r.value():r,y=p?e.value():e;return s||(s=new fF),n(m,y,t,i,s)}}return f?(s||(s=new fF),xUe(r,e,t,i,n,s)):!1}aee.exports=RUe});var hF=w((cgt,pee)=>{var FUe=hee(),dee=ta();function Cee(r,e,t,i,n){return r===e?!0:r==null||e==null||!dee(r)&&!dee(e)?r!==r&&e!==e:FUe(r,e,t,i,Cee,n)}pee.exports=Cee});var Eee=w((ugt,mee)=>{var NUe=xC(),LUe=hF(),TUe=1,OUe=2;function MUe(r,e,t,i){var n=t.length,s=n,o=!i;if(r==null)return!s;for(r=Object(r);n--;){var a=t[n];if(o&&a[2]?a[1]!==r[a[0]]:!(a[0]in r))return!1}for(;++n{var KUe=Rn();function UUe(r){return r===r&&!KUe(r)}Iee.exports=UUe});var wee=w((fgt,yee)=>{var HUe=pF(),jUe=Kf();function GUe(r){for(var e=jUe(r),t=e.length;t--;){var i=e[t],n=r[i];e[t]=[i,n,HUe(n)]}return e}yee.exports=GUe});var dF=w((hgt,Bee)=>{function YUe(r,e){return function(t){return t==null?!1:t[r]===e&&(e!==void 0||r in Object(t))}}Bee.exports=YUe});var Qee=w((pgt,bee)=>{var qUe=Eee(),JUe=wee(),WUe=dF();function zUe(r){var e=JUe(r);return e.length==1&&e[0][2]?WUe(e[0][0],e[0][1]):function(t){return t===r||qUe(t,r,e)}}bee.exports=zUe});var C0=w((dgt,See)=>{var _Ue=hC();function VUe(r,e,t){var i=r==null?void 0:_Ue(r,e);return i===void 0?t:i}See.exports=VUe});var xee=w((Cgt,vee)=>{var XUe=hF(),ZUe=C0(),$Ue=DR(),e2e=_B(),t2e=pF(),r2e=dF(),i2e=gu(),n2e=1,s2e=2;function o2e(r,e){return e2e(r)&&t2e(e)?r2e(i2e(r),e):function(t){var i=ZUe(t,r);return i===void 0&&i===e?$Ue(t,r):XUe(e,i,n2e|s2e)}}vee.exports=o2e});var Pee=w((mgt,kee)=>{function a2e(r){return function(e){return e==null?void 0:e[r]}}kee.exports=a2e});var Ree=w((Egt,Dee)=>{var A2e=hC();function l2e(r){return function(e){return A2e(e,r)}}Dee.exports=l2e});var Nee=w((Igt,Fee)=>{var c2e=Pee(),u2e=Ree(),g2e=_B(),f2e=gu();function h2e(r){return g2e(r)?c2e(f2e(r)):u2e(r)}Fee.exports=h2e});var CF=w((ygt,Lee)=>{var p2e=Qee(),d2e=xee(),C2e=r0(),m2e=Ks(),E2e=Nee();function I2e(r){return typeof r=="function"?r:r==null?C2e:typeof r=="object"?m2e(r)?d2e(r[0],r[1]):p2e(r):E2e(r)}Lee.exports=I2e});var mF=w((wgt,Tee)=>{var y2e=Nf(),w2e=tF(),B2e=CF();function b2e(r,e){var t={};return e=B2e(e,3),w2e(r,function(i,n,s){y2e(t,n,e(i,n,s))}),t}Tee.exports=b2e});var PC=w((Bgt,Oee)=>{"use strict";function pu(r){this._maxSize=r,this.clear()}pu.prototype.clear=function(){this._size=0,this._values=Object.create(null)};pu.prototype.get=function(r){return this._values[r]};pu.prototype.set=function(r,e){return this._size>=this._maxSize&&this.clear(),r in this._values||this._size++,this._values[r]=e};var Q2e=/[^.^\]^[]+|(?=\[\]|\.\.)/g,Mee=/^\d+$/,S2e=/^\d/,v2e=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,x2e=/^\s*(['"]?)(.*?)(\1)\s*$/,EF=512,Kee=new pu(EF),Uee=new pu(EF),Hee=new pu(EF);Oee.exports={Cache:pu,split:yF,normalizePath:IF,setter:function(r){var e=IF(r);return Uee.get(r)||Uee.set(r,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(DC,"__esModule",{value:!0});DC.create=F2e;DC.default=void 0;var N2e=PC(),m0={context:"$",value:"."};function F2e(r,e){return new E0(r,e)}var E0=class{constructor(e,t={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===m0.context,this.isValue=this.key[0]===m0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?m0.context:this.isValue?m0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,N2e.getter)(this.path,!0),this.map=t.map}getValue(e,t,i){let n=this.isContext?i:this.isValue?e:t;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,t){return this.getValue(e,t==null?void 0:t.parent,t==null?void 0:t.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};DC.default=E0;E0.prototype.__isYupRef=!0});var jee=w(BF=>{"use strict";Object.defineProperty(BF,"__esModule",{value:!0});BF.default=L2e;var T2e=bF(mF()),I0=bF(fu()),O2e=bF(du());function bF(r){return r&&r.__esModule?r:{default:r}}function y0(){return y0=Object.assign||function(r){for(var e=1;e=0)&&(t[n]=r[n]);return t}function L2e(r){function e(t,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=t,u=M2e(t,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=r,{parent:m,context:y}=a;function b(Y){return O2e.default.isRef(Y)?Y.getValue(n,m,y):Y}function v(Y={}){let $=(0,T2e.default)(y0({value:n,originalValue:l,label:o,path:Y.path||s},h,Y.params),b),_=new I0.default(I0.default.formatError(Y.message||p,$),n,$.path,Y.type||g);return _.params=$,_}let x=y0({path:s,parent:m,type:g,createError:v,resolve:b,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(x,n,x)).then(Y=>{I0.default.isError(Y)?i(Y):Y?i(null,Y):i(v())})}catch(Y){i(Y)}return}let T;try{var q;if(T=f.call(x,n,x),typeof((q=T)==null?void 0:q.then)=="function")throw new Error(`Validation test of type: "${x.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(Y){i(Y);return}I0.default.isError(T)?i(T):T?i(null,T):i(v())}return e.OPTIONS=r,e}});var QF=w(RC=>{"use strict";Object.defineProperty(RC,"__esModule",{value:!0});RC.getIn=Gee;RC.default=void 0;var K2e=PC(),U2e=r=>r.substr(0,r.length-1).substr(1);function Gee(r,e,t,i=t){let n,s,o;return e?((0,K2e.forEach)(e,(a,l,c)=>{let u=l?U2e(a):a;if(r=r.resolve({context:i,parent:n,value:t}),r.innerType){let g=c?parseInt(u,10):0;if(t&&g>=t.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=t,t=t&&t[g],r=r.innerType}if(!c){if(!r.fields||!r.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${r._type}")`);n=t,t=t&&t[u],r=r.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:r,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:r}}var H2e=(r,e,t,i)=>Gee(r,e,t,i).schema,j2e=H2e;RC.default=j2e});var qee=w(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});w0.default=void 0;var Yee=G2e(du());function G2e(r){return r&&r.__esModule?r:{default:r}}var B0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,t]of this.refs)e.push(t.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){Yee.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){Yee.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(t(i.value)===e)return!0;return!1}clone(){let e=new B0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),t.list.forEach(n=>i.delete(n)),t.refs.forEach(n=>i.delete(n)),i}};w0.default=B0});var EA=w(b0=>{"use strict";Object.defineProperty(b0,"__esModule",{value:!0});b0.default=void 0;var Jee=mA(hZ()),jf=CA(),Y2e=mA(kZ()),Wee=mA(l0()),Q0=mA(jee()),zee=mA(IC()),q2e=mA(du()),J2e=QF(),W2e=mA(WR()),_ee=mA(fu()),Vee=mA(qee());function mA(r){return r&&r.__esModule?r:{default:r}}function Js(){return Js=Object.assign||function(r){for(var e=1;e{this.typeError(jf.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=Js({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=Js({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=(0,Jee.default)(Js({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(e.length===0)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=t,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let t=this,i=e.clone(),n=Js({},t.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=t._typeError),i._whitelistError||(i._whitelistError=t._whitelistError),i._blacklistError||(i._blacklistError=t._blacklistError),i._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),i.tests=t.tests,i.exclusiveTests=t.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let i=t.conditions;t=t.clone(),t.conditions=[],t=i.reduce((n,s)=>s.resolve(n,e),t),t=t.resolve(e)}return t}cast(e,t={}){let i=this.resolve(Js({value:e},t)),n=i._cast(e,t);if(e!==void 0&&t.assert!==!1&&i.isType(n)!==!0){let s=(0,zee.default)(e),o=(0,zee.default)(n);throw new TypeError(`The value of ${t.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". - -attempted value: ${s} -`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,t){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,t={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=t,u=e;l||(u=this._cast(u,Js({assert:!1},t)));let g={value:u,path:s,options:t,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,Wee.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,Wee.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,t,i){let n=this.resolve(Js({},t,{value:e}));return typeof i=="function"?n._validate(e,t,i):new Promise((s,o)=>n._validate(e,t,(a,l)=>{a?o(a):s(l)}))}validateSync(e,t){let i=this.resolve(Js({},t,{value:e})),n;return i._validate(e,Js({},t,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,i=>{if(_ee.default.isError(i))return!1;throw i})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(i){if(_ee.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,Jee.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return e!=null}defined(e=jf.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(t){return t!==void 0}})}required(e=jf.mixed.required){return this.clone({presence:"required"}).withMutation(t=>t.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(t=>t.OPTIONS.name!=="required"),e}nullable(e=!0){var t=this.clone({nullable:e!==!1});return t}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(e.length===1?typeof e[0]=="function"?t={test:e[0]}:t=e[0]:e.length===2?t={name:e[0],test:e[1]}:t={name:e[0],message:e[1],test:e[2]},t.message===void 0&&(t.message=jf.mixed.default),typeof t.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,Q0.default)(t),s=t.exclusive||t.name&&i.exclusiveTests[t.name]===!0;if(t.exclusive&&!t.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return t.name&&(i.exclusiveTests[t.name]=!!t.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===t.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,t){!Array.isArray(e)&&typeof e!="string"&&(t=e,e=".");let i=this.clone(),n=(0,W2e.default)(e).map(s=>new q2e.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new Y2e.default(n,t)),i}typeError(e){var t=this.clone();return t._typeError=(0,Q0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),t}oneOf(e,t=jf.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,Q0.default)({message:t,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,t=jf.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,Q0.default)({message:t,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:i}=e.spec;return{meta:i,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};b0.default=ua;ua.prototype.__isYupSchema__=!0;for(let r of["validate","validateSync"])ua.prototype[`${r}At`]=function(e,t,i={}){let{parent:n,parentPath:s,schema:o}=(0,J2e.getIn)(this,e,t,i.context);return o[r](n&&n[s],Js({},i,{parent:n,path:e}))};for(let r of["equals","is"])ua.prototype[r]=ua.prototype.oneOf;for(let r of["not","nope"])ua.prototype[r]=ua.prototype.notOneOf;ua.prototype.optional=ua.prototype.notRequired});var Zee=w(FC=>{"use strict";Object.defineProperty(FC,"__esModule",{value:!0});FC.create=Xee;FC.default=void 0;var _2e=z2e(EA());function z2e(r){return r&&r.__esModule?r:{default:r}}var SF=_2e.default,V2e=SF;FC.default=V2e;function Xee(){return new SF}Xee.prototype=SF.prototype});var Gf=w(S0=>{"use strict";Object.defineProperty(S0,"__esModule",{value:!0});S0.default=void 0;var X2e=r=>r==null;S0.default=X2e});var ite=w(NC=>{"use strict";Object.defineProperty(NC,"__esModule",{value:!0});NC.create=$ee;NC.default=void 0;var Z2e=ete(EA()),tte=CA(),rte=ete(Gf());function ete(r){return r&&r.__esModule?r:{default:r}}function $ee(){return new v0}var v0=class extends Z2e.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(t){return(0,rte.default)(t)||t===!0}})}isFalse(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(t){return(0,rte.default)(t)||t===!1}})}};NC.default=v0;$ee.prototype=v0.prototype});var ote=w(LC=>{"use strict";Object.defineProperty(LC,"__esModule",{value:!0});LC.create=nte;LC.default=void 0;var ga=CA(),IA=ste(Gf()),$2e=ste(EA());function ste(r){return r&&r.__esModule?r:{default:r}}var eHe=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,tHe=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,rHe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,iHe=r=>(0,IA.default)(r)||r===r.trim(),nHe={}.toString();function nte(){return new x0}var x0=class extends $2e.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=e!=null&&e.toString?e.toString():e;return t===nHe?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=ga.string.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,IA.default)(i)||i.length===this.resolve(e)}})}min(e,t=ga.string.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,IA.default)(i)||i.length>=this.resolve(e)}})}max(e,t=ga.string.max){return this.test({name:"max",exclusive:!0,message:t,params:{max:e},test(i){return(0,IA.default)(i)||i.length<=this.resolve(e)}})}matches(e,t){let i=!1,n,s;return t&&(typeof t=="object"?{excludeEmptyString:i=!1,message:n,name:s}=t:n=t),this.test({name:s||"matches",message:n||ga.string.matches,params:{regex:e},test:o=>(0,IA.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=ga.string.email){return this.matches(eHe,{name:"email",message:e,excludeEmptyString:!0})}url(e=ga.string.url){return this.matches(tHe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=ga.string.uuid){return this.matches(rHe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=ga.string.trim){return this.transform(t=>t!=null?t.trim():t).test({message:e,name:"trim",test:iHe})}lowercase(e=ga.string.lowercase){return this.transform(t=>(0,IA.default)(t)?t:t.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toLowerCase()})}uppercase(e=ga.string.uppercase){return this.transform(t=>(0,IA.default)(t)?t:t.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toUpperCase()})}};LC.default=x0;nte.prototype=x0.prototype});var lte=w(TC=>{"use strict";Object.defineProperty(TC,"__esModule",{value:!0});TC.create=ate;TC.default=void 0;var Cu=CA(),mu=Ate(Gf()),sHe=Ate(EA());function Ate(r){return r&&r.__esModule?r:{default:r}}var oHe=r=>r!=+r;function ate(){return new k0}var k0=class extends sHe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let t=e;if(typeof t=="string"){if(t=t.replace(/\s/g,""),t==="")return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!oHe(e)}min(e,t=Cu.number.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,mu.default)(i)||i>=this.resolve(e)}})}max(e,t=Cu.number.max){return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,mu.default)(i)||i<=this.resolve(e)}})}lessThan(e,t=Cu.number.lessThan){return this.test({message:t,name:"max",exclusive:!0,params:{less:e},test(i){return(0,mu.default)(i)||ithis.resolve(e)}})}positive(e=Cu.number.positive){return this.moreThan(0,e)}negative(e=Cu.number.negative){return this.lessThan(0,e)}integer(e=Cu.number.integer){return this.test({name:"integer",message:e,test:t=>(0,mu.default)(t)||Number.isInteger(t)})}truncate(){return this.transform(e=>(0,mu.default)(e)?e:e|0)}round(e){var t,i=["ceil","floor","round","trunc"];if(e=((t=e)==null?void 0:t.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,mu.default)(n)?n:Math[e](n))}};TC.default=k0;ate.prototype=k0.prototype});var cte=w(vF=>{"use strict";Object.defineProperty(vF,"__esModule",{value:!0});vF.default=aHe;var AHe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function aHe(r){var e=[1,4,5,6,7,10,11],t=0,i,n;if(n=AHe.exec(r)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(t=n[10]*60+n[11],n[9]==="+"&&(t=0-t)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+t,n[6],n[7]))}else i=Date.parse?Date.parse(r):NaN;return i}});var fte=w(OC=>{"use strict";Object.defineProperty(OC,"__esModule",{value:!0});OC.create=xF;OC.default=void 0;var lHe=P0(cte()),ute=CA(),gte=P0(Gf()),cHe=P0(du()),uHe=P0(EA());function P0(r){return r&&r.__esModule?r:{default:r}}var kF=new Date(""),gHe=r=>Object.prototype.toString.call(r)==="[object Date]";function xF(){return new MC}var MC=class extends uHe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,lHe.default)(e),isNaN(e)?kF:new Date(e))})})}_typeCheck(e){return gHe(e)&&!isNaN(e.getTime())}prepareParam(e,t){let i;if(cHe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${t}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,t=ute.date.min){let i=this.prepareParam(e,"min");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(n){return(0,gte.default)(n)||n>=this.resolve(i)}})}max(e,t=ute.date.max){var i=this.prepareParam(e,"max");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(n){return(0,gte.default)(n)||n<=this.resolve(i)}})}};OC.default=MC;MC.INVALID_DATE=kF;xF.prototype=MC.prototype;xF.INVALID_DATE=kF});var pte=w((Tgt,hte)=>{function fHe(r,e,t,i){var n=-1,s=r==null?0:r.length;for(i&&s&&(t=r[++n]);++n{function hHe(r){return function(e){return r==null?void 0:r[e]}}dte.exports=hHe});var Ete=w((Mgt,mte)=>{var pHe=Cte(),dHe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},CHe=pHe(dHe);mte.exports=CHe});var yte=w((Kgt,Ite)=>{var mHe=Ete(),EHe=lf(),IHe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,yHe="\\u0300-\\u036f",wHe="\\ufe20-\\ufe2f",BHe="\\u20d0-\\u20ff",bHe=yHe+wHe+BHe,QHe="["+bHe+"]",SHe=RegExp(QHe,"g");function vHe(r){return r=EHe(r),r&&r.replace(IHe,mHe).replace(SHe,"")}Ite.exports=vHe});var Bte=w((Ugt,wte)=>{var xHe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function kHe(r){return r.match(xHe)||[]}wte.exports=kHe});var Qte=w((Hgt,bte)=>{var PHe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function DHe(r){return PHe.test(r)}bte.exports=DHe});var Yte=w((jgt,Ste)=>{var vte="\\ud800-\\udfff",RHe="\\u0300-\\u036f",FHe="\\ufe20-\\ufe2f",NHe="\\u20d0-\\u20ff",LHe=RHe+FHe+NHe,xte="\\u2700-\\u27bf",kte="a-z\\xdf-\\xf6\\xf8-\\xff",THe="\\xac\\xb1\\xd7\\xf7",OHe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",MHe="\\u2000-\\u206f",KHe=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Pte="A-Z\\xc0-\\xd6\\xd8-\\xde",UHe="\\ufe0e\\ufe0f",Dte=THe+OHe+MHe+KHe,Rte="['\u2019]",Fte="["+Dte+"]",HHe="["+LHe+"]",Nte="\\d+",jHe="["+xte+"]",Lte="["+kte+"]",Tte="[^"+vte+Dte+Nte+xte+kte+Pte+"]",GHe="\\ud83c[\\udffb-\\udfff]",YHe="(?:"+HHe+"|"+GHe+")",qHe="[^"+vte+"]",Ote="(?:\\ud83c[\\udde6-\\uddff]){2}",Mte="[\\ud800-\\udbff][\\udc00-\\udfff]",Yf="["+Pte+"]",JHe="\\u200d",Kte="(?:"+Lte+"|"+Tte+")",WHe="(?:"+Yf+"|"+Tte+")",Ute="(?:"+Rte+"(?:d|ll|m|re|s|t|ve))?",Hte="(?:"+Rte+"(?:D|LL|M|RE|S|T|VE))?",jte=YHe+"?",Gte="["+UHe+"]?",zHe="(?:"+JHe+"(?:"+[qHe,Ote,Mte].join("|")+")"+Gte+jte+")*",_He="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",VHe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",XHe=Gte+jte+zHe,ZHe="(?:"+[jHe,Ote,Mte].join("|")+")"+XHe,$He=RegExp([Yf+"?"+Lte+"+"+Ute+"(?="+[Fte,Yf,"$"].join("|")+")",WHe+"+"+Hte+"(?="+[Fte,Yf+Kte,"$"].join("|")+")",Yf+"?"+Kte+"+"+Ute,Yf+"+"+Hte,VHe,_He,Nte,ZHe].join("|"),"g");function eje(r){return r.match($He)||[]}Ste.exports=eje});var Jte=w((Ggt,qte)=>{var tje=Bte(),rje=Qte(),ije=lf(),nje=Yte();function sje(r,e,t){return r=ije(r),e=t?void 0:e,e===void 0?rje(r)?nje(r):tje(r):r.match(e)||[]}qte.exports=sje});var PF=w((Ygt,Wte)=>{var oje=pte(),aje=yte(),Aje=Jte(),lje="['\u2019]",cje=RegExp(lje,"g");function uje(r){return function(e){return oje(Aje(aje(e).replace(cje,"")),r,"")}}Wte.exports=uje});var _te=w((qgt,zte)=>{var gje=PF(),fje=gje(function(r,e,t){return r+(t?"_":"")+e.toLowerCase()});zte.exports=fje});var Xte=w((Jgt,Vte)=>{var hje=Zw(),pje=PF(),dje=pje(function(r,e,t){return e=e.toLowerCase(),r+(t?hje(e):e)});Vte.exports=dje});var $te=w((Wgt,Zte)=>{var Cje=Nf(),mje=tF(),Eje=CF();function Ije(r,e){var t={};return e=Eje(e,3),mje(r,function(i,n,s){Cje(t,e(i,n,s),i)}),t}Zte.exports=Ije});var tre=w((zgt,DF)=>{DF.exports=function(r){return ere(yje(r),r)};DF.exports.array=ere;function ere(r,e){var t=r.length,i=new Array(t),n={},s=t,o=wje(e),a=Bje(r);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(r[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(m){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--t]=c}}}function yje(r){for(var e=new Set,t=0,i=r.length;t{"use strict";Object.defineProperty(RF,"__esModule",{value:!0});RF.default=bje;var Qje=D0(yC()),Sje=D0(tre()),vje=PC(),xje=D0(du()),kje=D0(Tf());function D0(r){return r&&r.__esModule?r:{default:r}}function bje(r,e=[]){let t=[],i=[];function n(s,o){var a=(0,vje.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||t.push([o,a])}for(let s in r)if((0,Qje.default)(r,s)){let o=r[s];~i.indexOf(s)||i.push(s),xje.default.isRef(o)&&o.isSibling?n(o.path,s):(0,kje.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return Sje.default.array(i,t).reverse()}});var nre=w(FF=>{"use strict";Object.defineProperty(FF,"__esModule",{value:!0});FF.default=Pje;function ire(r,e){let t=Infinity;return r.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return t=n,!0}),t}function Pje(r){return(e,t)=>ire(r,e)-ire(r,t)}});var ure=w(KC=>{"use strict";Object.defineProperty(KC,"__esModule",{value:!0});KC.create=sre;KC.default=void 0;var ore=fa(yC()),are=fa(_te()),Dje=fa(Xte()),Rje=fa($te()),Fje=fa(mF()),Nje=PC(),Are=CA(),Lje=fa(rre()),lre=fa(nre()),Tje=fa(l0()),Oje=fa(fu()),NF=fa(EA());function fa(r){return r&&r.__esModule?r:{default:r}}function qf(){return qf=Object.assign||function(r){for(var e=1;eObject.prototype.toString.call(r)==="[object Object]";function Mje(r,e){let t=Object.keys(r.fields);return Object.keys(e).filter(i=>t.indexOf(i)===-1)}var Kje=(0,lre.default)([]),R0=class extends NF.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=Kje,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return cre(e)||typeof e=="function"}_cast(e,t={}){var i;let n=super._cast(e,t);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=t.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=qf({},t,{parent:l,__validating:t.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,ore.default)(n,g);if(f){let p,m=n[g];c.path=(t.path?`${t.path}.`:"")+g,f=f.resolve({value:m,context:t.context,parent:l});let y="spec"in f?f.spec:void 0,b=y==null?void 0:y.strict;if(y==null?void 0:y.strip){u=u||g in n;continue}p=!t.__validating||!b?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,t={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=t;o=[{schema:this,value:a},...o],t.__validating=!0,t.originalValue=a,t.from=o,super._validate(e,t,(u,g)=>{if(u){if(!Oje.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!cre(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,m)=>{let y=h.indexOf(".")===-1?(t.path?`${t.path}.`:"")+h:`${t.path||""}["${h}"]`,b=this.fields[h];if(b&&"validate"in b){b.validate(g[h],qf({},t,{path:y,from:o,strict:!0,parent:g,originalValue:a[h]}),m);return}m(null)});(0,Tje.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:t.path},i)})}clone(e){let t=super.clone(e);return t.fields=qf({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),i=t.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof NF.default&&s instanceof NF.default&&(i[n]=s.concat(o))}return t.withMutation(()=>t.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let i=this.fields[t];e[t]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,t=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,lre.default)(Object.keys(n)),t.length){Array.isArray(t[0])||(t=[t]);let s=t.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,Lje.default)(n,i._excludedEdges),i}pick(e){let t={};for(let i of e)this.fields[i]&&(t[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(t)))}omit(e){let t=this.clone(),i=t.fields;t.fields={};for(let n of e)delete i[n];return t.withMutation(()=>t.shape(i))}from(e,t,i){let n=(0,Nje.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,ore.default)(s,e)&&(o=qf({},s),i||delete o[e],o[t]=n(s)),o})}noUnknown(e=!0,t=Are.object.noUnknown){typeof e=="string"&&(t=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:t,test(n){if(n==null)return!0;let s=Mje(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,t=Are.object.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&(0,Rje.default)(t,(i,n)=>e(n)))}camelCase(){return this.transformKeys(Dje.default)}snakeCase(){return this.transformKeys(are.default)}constantCase(){return this.transformKeys(e=>(0,are.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,Fje.default)(this.fields,t=>t.describe()),e}};KC.default=R0;function sre(r){return new R0(r)}sre.prototype=R0.prototype});var fre=w(UC=>{"use strict";Object.defineProperty(UC,"__esModule",{value:!0});UC.create=gre;UC.default=void 0;var LF=Jf(Gf()),Uje=Jf(Tf()),Hje=Jf(IC()),TF=CA(),jje=Jf(l0()),Gje=Jf(fu()),Yje=Jf(EA());function Jf(r){return r&&r.__esModule?r:{default:r}}function F0(){return F0=Object.assign||function(r){for(var e=1;e{this.transform(function(t){if(typeof t=="string")try{t=JSON.parse(t)}catch(i){t=null}return this.isType(t)?t:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let i=super._cast(e,t);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,F0({},t,{path:`${t.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,t={},i){var n,s;let o=[],a=t.sync,l=t.path,c=this.innerType,u=(n=t.abortEarly)!=null?n:this.spec.abortEarly,g=(s=t.recursive)!=null?s:this.spec.recursive,f=t.originalValue!=null?t.originalValue:e;super._validate(e,t,(h,p)=>{if(h){if(!Gje.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let m=new Array(p.length);for(let y=0;yc.validate(b,x,q)}(0,jje.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:m},i)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!(0,Uje.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,Hje.default)(e));return t.innerType=e,t}length(e,t=TF.array.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,LF.default)(i)||i.length===this.resolve(e)}})}min(e,t){return t=t||TF.array.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,LF.default)(i)||i.length>=this.resolve(e)}})}max(e,t){return t=t||TF.array.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,LF.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:t==null?[]:[].concat(t))}compact(e){let t=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(t):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};UC.default=N0;gre.prototype=N0.prototype});var hre=w(HC=>{"use strict";Object.defineProperty(HC,"__esModule",{value:!0});HC.create=qje;HC.default=void 0;var Wje=Jje(Tf());function Jje(r){return r&&r.__esModule?r:{default:r}}function qje(r){return new OF(r)}var OF=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(t,i={})=>{let n=this.builder(t,i);if(!(0,Wje.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,t){return this._resolve(e,t).cast(e,t)}validate(e,t,i){return this._resolve(e,t).validate(e,t,i)}validateSync(e,t){return this._resolve(e,t).validateSync(e,t)}validateAt(e,t,i){return this._resolve(t,i).validateAt(e,t,i)}validateSyncAt(e,t,i){return this._resolve(t,i).validateSyncAt(e,t,i)}describe(){return null}isValid(e,t){return this._resolve(e,t).isValid(e,t)}isValidSync(e,t){return this._resolve(e,t).isValidSync(e,t)}},zje=OF;HC.default=zje});var pre=w(MF=>{"use strict";Object.defineProperty(MF,"__esModule",{value:!0});MF.default=_je;var Xje=Vje(CA());function Vje(r){return r&&r.__esModule?r:{default:r}}function _je(r){Object.keys(r).forEach(e=>{Object.keys(r[e]).forEach(t=>{Xje.default[e][t]=r[e][t]})})}});var UF=w(Br=>{"use strict";Object.defineProperty(Br,"__esModule",{value:!0});Br.addMethod=Zje;Object.defineProperty(Br,"MixedSchema",{enumerable:!0,get:function(){return dre.default}});Object.defineProperty(Br,"mixed",{enumerable:!0,get:function(){return dre.create}});Object.defineProperty(Br,"BooleanSchema",{enumerable:!0,get:function(){return KF.default}});Object.defineProperty(Br,"bool",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"boolean",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"StringSchema",{enumerable:!0,get:function(){return Cre.default}});Object.defineProperty(Br,"string",{enumerable:!0,get:function(){return Cre.create}});Object.defineProperty(Br,"NumberSchema",{enumerable:!0,get:function(){return mre.default}});Object.defineProperty(Br,"number",{enumerable:!0,get:function(){return mre.create}});Object.defineProperty(Br,"DateSchema",{enumerable:!0,get:function(){return Ere.default}});Object.defineProperty(Br,"date",{enumerable:!0,get:function(){return Ere.create}});Object.defineProperty(Br,"ObjectSchema",{enumerable:!0,get:function(){return Ire.default}});Object.defineProperty(Br,"object",{enumerable:!0,get:function(){return Ire.create}});Object.defineProperty(Br,"ArraySchema",{enumerable:!0,get:function(){return yre.default}});Object.defineProperty(Br,"array",{enumerable:!0,get:function(){return yre.create}});Object.defineProperty(Br,"ref",{enumerable:!0,get:function(){return $je.create}});Object.defineProperty(Br,"lazy",{enumerable:!0,get:function(){return eGe.create}});Object.defineProperty(Br,"ValidationError",{enumerable:!0,get:function(){return tGe.default}});Object.defineProperty(Br,"reach",{enumerable:!0,get:function(){return rGe.default}});Object.defineProperty(Br,"isSchema",{enumerable:!0,get:function(){return wre.default}});Object.defineProperty(Br,"setLocale",{enumerable:!0,get:function(){return iGe.default}});Object.defineProperty(Br,"BaseSchema",{enumerable:!0,get:function(){return nGe.default}});var dre=Eu(Zee()),KF=Eu(ite()),Cre=Eu(ote()),mre=Eu(lte()),Ere=Eu(fte()),Ire=Eu(ure()),yre=Eu(fre()),$je=du(),eGe=hre(),tGe=jC(fu()),rGe=jC(QF()),wre=jC(Tf()),iGe=jC(pre()),nGe=jC(EA());function jC(r){return r&&r.__esModule?r:{default:r}}function Bre(){if(typeof WeakMap!="function")return null;var r=new WeakMap;return Bre=function(){return r},r}function Eu(r){if(r&&r.__esModule)return r;if(r===null||typeof r!="object"&&typeof r!="function")return{default:r};var e=Bre();if(e&&e.has(r))return e.get(r);var t={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in r)if(Object.prototype.hasOwnProperty.call(r,n)){var s=i?Object.getOwnPropertyDescriptor(r,n):null;s&&(s.get||s.set)?Object.defineProperty(t,n,s):t[n]=r[n]}return t.default=r,e&&e.set(r,t),t}function Zje(r,e,t){if(!r||!(0,wre.default)(r.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof t!="function")throw new TypeError("Method function must be provided");r.prototype[e]=t}});var xre=w((hft,YC)=>{"use strict";var aGe=process.env.TERM_PROGRAM==="Hyper",AGe=process.platform==="win32",Qre=process.platform==="linux",HF={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Sre=Object.assign({},HF,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),vre=Object.assign({},HF,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:Qre?"\u25B8":"\u276F",pointerSmall:Qre?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});YC.exports=AGe&&!aGe?Sre:vre;Reflect.defineProperty(YC.exports,"common",{enumerable:!1,value:HF});Reflect.defineProperty(YC.exports,"windows",{enumerable:!1,value:Sre});Reflect.defineProperty(YC.exports,"other",{enumerable:!1,value:vre})});var Eo=w((pft,jF)=>{"use strict";var lGe=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),cGe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,kre=()=>{let r={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(r.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},t=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(r.enabled===!1)return s;if(r.visible===!1)return"";let a=""+s,l=a.includes(` -`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=t(r.styles[o[c]],a,l);return a},n=(s,o,a)=>{r.styles[s]=e({name:s,codes:o}),(r.keys[a]||(r.keys[a]=[])).push(s),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(c){r.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,r),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),r.ansiRegex=cGe,r.hasColor=r.hasAnsi=s=>(r.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&r.ansiRegex.test(s)),r.alias=(s,o)=>{let a=typeof o=="string"?r[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),r.styles[s]=a,a.stack=[s]),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(l){r.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,r),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},r.theme=s=>{if(!lGe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))r.alias(o,s[o]);return r},r.alias("unstyle",s=>typeof s=="string"&&s!==""?(r.ansiRegex.lastIndex=0,s.replace(r.ansiRegex,"")):""),r.alias("noop",s=>s),r.none=r.clear=r.noop,r.stripColor=r.unstyle,r.symbols=xre(),r.define=n,r};jF.exports=kre();jF.exports.create=kre});var Xi=w(Lt=>{"use strict";var uGe=Object.prototype.toString,Ws=Eo(),Pre=!1,GF=[],Dre={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};Lt.longest=(r,e)=>r.reduce((t,i)=>Math.max(t,e?i[e].length:i.length),0);Lt.hasColor=r=>!!r&&Ws.hasColor(r);var T0=Lt.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);Lt.nativeType=r=>uGe.call(r).slice(8,-1).toLowerCase().replace(/\s/g,"");Lt.isAsyncFn=r=>Lt.nativeType(r)==="asyncfunction";Lt.isPrimitive=r=>r!=null&&typeof r!="object"&&typeof r!="function";Lt.resolve=(r,e,...t)=>typeof e=="function"?e.call(r,...t):e;Lt.scrollDown=(r=[])=>[...r.slice(1),r[0]];Lt.scrollUp=(r=[])=>[r.pop(),...r];Lt.reorder=(r=[])=>{let e=r.slice();return e.sort((t,i)=>t.index>i.index?1:t.index{let i=r.length,n=t===i?0:t<0?i-1:t,s=r[e];r[e]=r[n],r[n]=s};Lt.width=(r,e=80)=>{let t=r&&r.columns?r.columns:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[0]),process.platform==="win32"?t-1:t};Lt.height=(r,e=20)=>{let t=r&&r.rows?r.rows:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[1]),t};Lt.wordWrap=(r,e={})=>{if(!r)return r;typeof e=="number"&&(e={width:e});let{indent:t="",newline:i=` -`+t,width:n=80}=e;n-=((i+t).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=r.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),t+c.join(i)};Lt.unmute=r=>{let e=r.stack.find(i=>Ws.keys.color.includes(i));return e?Ws[e]:r.stack.find(i=>i.slice(2)==="bg")?Ws[e.slice(2)]:i=>i};Lt.pascal=r=>r?r[0].toUpperCase()+r.slice(1):"";Lt.inverse=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i));if(e){let i=Ws["bg"+Lt.pascal(e)];return i?i.black:r}let t=r.stack.find(i=>i.slice(0,2)==="bg");return t?Ws[t.slice(2).toLowerCase()]||r:Ws.none};Lt.complement=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i)),t=r.stack.find(i=>i.slice(0,2)==="bg");if(e&&!t)return Ws[Dre[e]||e];if(t){let i=t.slice(2).toLowerCase(),n=Dre[i];return n&&Ws["bg"+Lt.pascal(n)]||r}return Ws.none};Lt.meridiem=r=>{let e=r.getHours(),t=r.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=t<10?"0"+t:t;return n+":"+s+" "+i};Lt.set=(r={},e="",t)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:t;return!Lt.isObject(a)&&s{let i=r[e]==null?e.split(".").reduce((n,s)=>n&&n[s],r):r[e];return i==null?t:i};Lt.mixin=(r,e)=>{if(!T0(r))return e;if(!T0(e))return r;for(let t of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,t);if(i.hasOwnProperty("value"))if(r.hasOwnProperty(t)&&T0(i.value)){let n=Object.getOwnPropertyDescriptor(r,t);T0(n.value)?r[t]=Lt.merge({},r[t],e[t]):Reflect.defineProperty(r,t,i)}else Reflect.defineProperty(r,t,i);else Reflect.defineProperty(r,t,i)}return r};Lt.merge=(...r)=>{let e={};for(let t of r)Lt.mixin(e,t);return e};Lt.mixinEmitter=(r,e)=>{let t=e.constructor.prototype;for(let i of Object.keys(t)){let n=t[i];typeof n=="function"?Lt.define(r,i,n.bind(e)):Lt.define(r,i,n)}};Lt.onExit=r=>{let e=(t,i)=>{Pre||(Pre=!0,GF.forEach(n=>n()),t===!0&&process.exit(128+i))};GF.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),GF.push(r)};Lt.define=(r,e,t)=>{Reflect.defineProperty(r,e,{value:t})};Lt.defineExport=(r,e,t)=>{let i;Reflect.defineProperty(r,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():t()}})}});var Rre=w(zf=>{"use strict";zf.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};zf.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};zf.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};zf.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};zf.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var Lre=w((mft,Fre)=>{"use strict";var Nre=require("readline"),gGe=Rre(),fGe=/^(?:\x1b)([a-zA-Z0-9])$/,hGe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,pGe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function dGe(r){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(r)}function CGe(r){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(r)}var O0=(r="",e={})=>{let t,i=N({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:r,raw:r},e);if(Buffer.isBuffer(r)?r[0]>127&&r[1]===void 0?(r[0]-=128,r=""+String(r)):r=String(r):r!==void 0&&typeof r!="string"?r=String(r):r||(r=i.sequence||""),i.sequence=i.sequence||r||i.name,r==="\r")i.raw=void 0,i.name="return";else if(r===` -`)i.name="enter";else if(r===" ")i.name="tab";else if(r==="\b"||r==="\x7F"||r==="\x7F"||r==="\b")i.name="backspace",i.meta=r.charAt(0)==="";else if(r===""||r==="")i.name="escape",i.meta=r.length===2;else if(r===" "||r===" ")i.name="space",i.meta=r.length===2;else if(r<="")i.name=String.fromCharCode(r.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(r.length===1&&r>="0"&&r<="9")i.name="number";else if(r.length===1&&r>="a"&&r<="z")i.name=r;else if(r.length===1&&r>="A"&&r<="Z")i.name=r.toLowerCase(),i.shift=!0;else if(t=fGe.exec(r))i.meta=!0,i.shift=/^[A-Z]$/.test(t[1]);else if(t=hGe.exec(r)){let n=[...r];n[0]===""&&n[1]===""&&(i.option=!0);let s=[t[1],t[2],t[4],t[6]].filter(Boolean).join(""),o=(t[3]||t[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=pGe[s],i.shift=dGe(s)||i.shift,i.ctrl=CGe(s)||i.ctrl}return i};O0.listen=(r={},e)=>{let{stdin:t}=r;if(!t||t!==process.stdin&&!t.isTTY)throw new Error("Invalid stream passed");let i=Nre.createInterface({terminal:!0,input:t});Nre.emitKeypressEvents(t,i);let n=(a,l)=>e(a,O0(a,l),i),s=t.isRaw;return t.isTTY&&t.setRawMode(!0),t.on("keypress",n),i.resume(),()=>{t.isTTY&&t.setRawMode(s),t.removeListener("keypress",n),i.pause(),i.close()}};O0.action=(r,e,t)=>{let i=N(N({},gGe),t);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};Fre.exports=O0});var Ore=w((Eft,Tre)=>{"use strict";Tre.exports=r=>{r.timers=r.timers||{};let e=r.options.timers;if(!!e)for(let t of Object.keys(e)){let i=e[t];typeof i=="number"&&(i={interval:i}),mGe(r,t,i)}};function mGe(r,e,t={}){let i=r.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=t.interval||120;i.frames=t.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,r.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),r.once("close",()=>i.stop()),i.stop}});var Ure=w((Ift,Mre)=>{"use strict";var{define:EGe,width:IGe}=Xi(),Kre=class{constructor(e){let t=e.options;EGe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=IGe(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=N({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t=="function"?t:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};Mre.exports=Kre});var jre=w((yft,Hre)=>{"use strict";var YF=Xi(),Ni=Eo(),qF={default:Ni.noop,noop:Ni.noop,set inverse(r){this._inverse=r},get inverse(){return this._inverse||YF.inverse(this.primary)},set complement(r){this._complement=r},get complement(){return this._complement||YF.complement(this.primary)},primary:Ni.cyan,success:Ni.green,danger:Ni.magenta,strong:Ni.bold,warning:Ni.yellow,muted:Ni.dim,disabled:Ni.gray,dark:Ni.dim.gray,underline:Ni.underline,set info(r){this._info=r},get info(){return this._info||this.primary},set em(r){this._em=r},get em(){return this._em||this.primary.underline},set heading(r){this._heading=r},get heading(){return this._heading||this.muted.underline},set pending(r){this._pending=r},get pending(){return this._pending||this.primary},set submitted(r){this._submitted=r},get submitted(){return this._submitted||this.success},set cancelled(r){this._cancelled=r},get cancelled(){return this._cancelled||this.danger},set typing(r){this._typing=r},get typing(){return this._typing||this.dim},set placeholder(r){this._placeholder=r},get placeholder(){return this._placeholder||this.primary.dim},set highlight(r){this._highlight=r},get highlight(){return this._highlight||this.inverse}};qF.merge=(r={})=>{r.styles&&typeof r.styles.enabled=="boolean"&&(Ni.enabled=r.styles.enabled),r.styles&&typeof r.styles.visible=="boolean"&&(Ni.visible=r.styles.visible);let e=YF.merge({},qF,r.styles);delete e.merge;for(let t of Object.keys(Ni))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});for(let t of Object.keys(Ni.styles))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});return e};Hre.exports=qF});var Yre=w((wft,Gre)=>{"use strict";var JF=process.platform==="win32",yA=Eo(),yGe=Xi(),WF=te(N({},yA.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:yA.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:yA.symbols.question,submitted:yA.symbols.check,cancelled:yA.symbols.cross},separator:{pending:yA.symbols.pointerSmall,submitted:yA.symbols.middot,cancelled:yA.symbols.middot},radio:{off:JF?"( )":"\u25EF",on:JF?"(*)":"\u25C9",disabled:JF?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});WF.merge=r=>{let e=yGe.merge({},yA.symbols,WF,r.symbols);return delete e.merge,e};Gre.exports=WF});var Jre=w((Bft,qre)=>{"use strict";var wGe=jre(),BGe=Yre(),bGe=Xi();qre.exports=r=>{r.options=bGe.merge({},r.options.theme,r.options),r.symbols=BGe.merge(r.options),r.styles=wGe.merge(r.options)}});var Xre=w((Wre,zre)=>{"use strict";var _re=process.env.TERM_PROGRAM==="Apple_Terminal",QGe=Eo(),zF=Xi(),Io=zre.exports=Wre,Lr="[",Vre="\x07",_F=!1,Fl=Io.code={bell:Vre,beep:Vre,beginning:`${Lr}G`,down:`${Lr}J`,esc:Lr,getPosition:`${Lr}6n`,hide:`${Lr}?25l`,line:`${Lr}2K`,lineEnd:`${Lr}K`,lineStart:`${Lr}1K`,restorePosition:Lr+(_re?"8":"u"),savePosition:Lr+(_re?"7":"s"),screen:`${Lr}2J`,show:`${Lr}?25h`,up:`${Lr}1J`},Iu=Io.cursor={get hidden(){return _F},hide(){return _F=!0,Fl.hide},show(){return _F=!1,Fl.show},forward:(r=1)=>`${Lr}${r}C`,backward:(r=1)=>`${Lr}${r}D`,nextLine:(r=1)=>`${Lr}E`.repeat(r),prevLine:(r=1)=>`${Lr}F`.repeat(r),up:(r=1)=>r?`${Lr}${r}A`:"",down:(r=1)=>r?`${Lr}${r}B`:"",right:(r=1)=>r?`${Lr}${r}C`:"",left:(r=1)=>r?`${Lr}${r}D`:"",to(r,e){return e?`${Lr}${e+1};${r+1}H`:`${Lr}${r+1}G`},move(r=0,e=0){let t="";return t+=r<0?Iu.left(-r):r>0?Iu.right(r):"",t+=e<0?Iu.up(-e):e>0?Iu.down(e):"",t},restore(r={}){let{after:e,cursor:t,initial:i,input:n,prompt:s,size:o,value:a}=r;if(i=zF.isPrimitive(i)?String(i):"",n=zF.isPrimitive(n)?String(n):"",a=zF.isPrimitive(a)?String(a):"",o){let l=Io.cursor.up(o)+Io.cursor.to(s.length),c=n.length-t;return c>0&&(l+=Io.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+t;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Io.cursor.move(l)}}},VF=Io.erase={screen:Fl.screen,up:Fl.up,down:Fl.down,line:Fl.line,lineEnd:Fl.lineEnd,lineStart:Fl.lineStart,lines(r){let e="";for(let t=0;t{if(!e)return VF.line+Iu.to(0);let t=s=>[...QGe.unstyle(s)].length,i=r.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(t(s)-1,0)/e);return(VF.line+Iu.prevLine()).repeat(n-1)+VF.line+Iu.to(0)}});var _f=w((bft,Zre)=>{"use strict";var SGe=require("events"),$re=Eo(),XF=Lre(),vGe=Ore(),xGe=Ure(),kGe=Jre(),Tn=Xi(),yu=Xre(),M0=class extends SGe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,kGe(this),vGe(this),this.state=new xGe(this),this.initial=[e.initial,e.default].find(t=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=DGe(this.options.margin),this.setMaxListeners(0),PGe(this)}async keypress(e,t={}){this.keypressed=!0;let i=XF.action(e,XF(e,t),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(yu.code.beep)}cursorHide(){this.stdout.write(yu.cursor.hide()),Tn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(yu.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let t=this.state.buffer;this.state.buffer="",!(!t&&!e||this.options.show===!1)&&this.stdout.write(yu.cursor.down(e)+yu.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:t,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=yu.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:t,prompt:i}=this.state;i=$re.unstyle(i);let n=$re.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` -`),c=l[0],u=l[l.length-1],f=(i+(t?" "+t:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof t.initial=="function"&&(this.initial=await t.initial.call(this,this)),typeof t.onRun=="function"&&await t.onRun.call(this,this),typeof t.onSubmit=="function"){let n=t.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,t)=>{if(this.once("submit",e),this.once("cancel",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,t,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=t&&t[e]!=null?t[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,t,i);return!g&&t&&t[e]?this.resolve(c,s,t,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,t=this.timers&&this.timers.prefix,i=this.state;return i.timer=t,Tn.isObject(e)&&(e=e[i.status]||e.pending),Tn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Tn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,t=this.timers&&this.timers.separator,i=this.state;i.timer=t;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return Tn.isObject(s)&&(s=s[i.status]||s.pending),Tn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,t){let i=await this.element("pointer",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===t,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=Tn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,t){let i=await this.element("indicator",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return Tn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Tn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...t){return Tn.resolve(this,e,...t)}get base(){return M0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Tn.height(this.stdout,25)}get width(){return this.options.columns||Tn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,i=[t,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function PGe(r){let e=n=>r[n]===void 0||typeof r[n]=="function",t=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(r.options)){if(t.includes(n)||/^on[A-Z]/.test(n))continue;let s=r.options[n];typeof s=="function"&&e(n)?i.includes(n)||(r[n]=s.bind(r)):typeof r[n]!="function"&&(r[n]=s)}}function DGe(r){typeof r=="number"&&(r=[r,r,r,r]);let e=[].concat(r||[]),t=n=>n%2==0?` -`:" ",i=[];for(let n=0;n<4;n++){let s=t(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}Zre.exports=M0});var rie=w((Qft,eie)=>{"use strict";var RGe=Xi(),tie={default(r,e){return e},checkbox(r,e){throw new Error("checkbox role is not implemented yet")},editable(r,e){throw new Error("editable role is not implemented yet")},expandable(r,e){throw new Error("expandable role is not implemented yet")},heading(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||"",e},input(r,e){throw new Error("input role is not implemented yet")},option(r,e){return tie.default(r,e)},radio(r,e){throw new Error("radio role is not implemented yet")},separator(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||r.symbols.line.repeat(5),e},spacer(r,e){return e}};eie.exports=(r,e={})=>{let t=RGe.merge({},tie,e.roles);return t[r]||t.default}});var qC=w((Sft,iie)=>{"use strict";var FGe=Eo(),NGe=_f(),LGe=rie(),K0=Xi(),{reorder:ZF,scrollUp:TGe,scrollDown:OGe,isObject:nie,swap:MGe}=K0,sie=class extends NGe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");nie(t)&&(t=Object.keys(t)),Array.isArray(t)?(i!=null&&(this.index=this.findIndex(i)),t.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(t=i),typeof t=="string"&&(t=this.findIndex(t)),typeof t=="number"&&t>-1&&(this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,t,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=LGe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=t,e.cursor=0,K0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,FGe.unstyle(e.message).length));let o=N({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,t)),e}async onChoice(e,t){this.emit("choice",e,t,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,i){let n=await this.toChoice(e,t,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,t,i){let n=N({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,t,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){return typeof t!="boolean"&&(t=e.enabled),t&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=t&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedt.enabled);return this.choices.forEach(t=>t.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(t=>!!t.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof t!="boolean"&&(t=!e.enabled),e.enabled=t,e.choices&&e.choices.forEach(n=>this.toggle(n,t));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return oie(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=ZF(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=t(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=ZF(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=ZF(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>t&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===t-1?this.alert():e>t&&i===t-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=TGe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=OGe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){MGe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(t=>this.isEnabled(t));if(e.choices){let t=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&t.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(t=>this.isChoice(e,t)):this.isChoice(e,this.initial)}map(e=[],t="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,t),i),{})}filter(e,t){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return t?o.map(a=>a[t]):o}find(e,t){if(nie(e))return t?e[t]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return t?s[t]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:t,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&t!==!1&&i!==!0&&(s=K0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)this.state._choices.some(i=>i.name===t.name)||this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t=="string"||typeof t=="number"){let i=this.find(t);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return oie(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:i}=this,n=e.limit||this._limit||t.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function oie(r,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(K0.isAsyncFn(e))return e;e=e.call(r,r)}for(let t of e){if(Array.isArray(t.choices)){let i=t.choices.filter(n=>!r.isDisabled(n));t.enabled=i.every(n=>n.enabled===!0)}r.isDisabled(t)===!0&&delete t.enabled}return e}iie.exports=sie});var Nl=w((vft,aie)=>{"use strict";var KGe=qC(),$F=Xi(),Aie=class extends KGe{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):""}indicator(e,t){return this.multiple?super.indicator(e,t):""}choiceMessage(e,t){let i=this.resolve(e.message,this.state,e,t);return e.role==="heading"&&!$F.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,t)}choiceSeparator(){return":"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await this.indicator(e,t)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,t);o&&!$F.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,t),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?($F.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),t=await Promise.all(e);t.length||t.push(this.styles.danger("No matching choices"));let i=this.margin[0]+t.join(` -`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` -`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(t),this.write([n,i,u,g].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};aie.exports=Aie});var uie=w((xft,lie)=>{"use strict";var UGe=Nl(),HGe=(r,e)=>{let t=r.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(t),o=e(i.slice(s,s+t.length));return s>=0?i.slice(0,s)+o+i.slice(s+t.length):i}},cie=class extends UGe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:i}=this.state;return this.input=i.slice(0,t)+e+i.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;return t?(this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:t}=this.state;return t[e]===void 0?this.alert():(this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,t);let i=e.toLowerCase();return t.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,t=HGe(this.input,e),i=this.choices;this.choices=i.map(n=>te(N({},n),{message:t(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};lie.exports=cie});var tN=w((kft,gie)=>{"use strict";var eN=Xi();gie.exports=(r,e={})=>{r.cursorHide();let{input:t="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||r.styles.placeholder,l=eN.inverse(r.styles.primary),c=m=>l(r.styles.black(m)),u=t,g=" ",f=c(g);if(r.blink&&r.blink.off===!0&&(c=m=>m,f=""),s&&n===0&&i===""&&t==="")return c(g);if(s&&n===0&&(t===i||t===""))return c(i[0])+a(i.slice(1));i=eN.isPrimitive(i)?`${i}`:"",t=eN.isPrimitive(t)?`${t}`:"";let h=i&&i.startsWith(t)&&i!==t,p=h?c(i[t.length]):f;if(n!==t.length&&s===!0&&(u=t.slice(0,n)+c(t[n])+t.slice(n+1),p=""),s===!1&&(p=""),h){let m=r.styles.unstyle(u+p);return u+p+a(i.slice(m.length))}return u+p}});var U0=w((Pft,fie)=>{"use strict";var jGe=Eo(),GGe=Nl(),YGe=tN(),hie=class extends GGe{constructor(e){super(te(N({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(t=>t!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(t=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:i,input:n}=t;return t.value=t.input=n.slice(0,i)+e+n.slice(i),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:i}=e;return e.value=e.input=i.slice(0,t-1)+i.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:i}=e;if(i[t]===void 0)return this.alert();let n=`${i}`.slice(0,t)+`${i}`.slice(t+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:i}=e;return t&&t.startsWith(i)&&i!==t?(e.value=e.input=t,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,t){let i=await this.resolve(e.separator,this.state,e,t)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,t){await this.onChoice(e,t);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,m=this.index===t,y=e.validate||(()=>!0),b=await this.choiceSeparator(e,t),v=e.message;this.align==="right"&&(v=v.padStart(this.longest+1," ")),this.align==="left"&&(v=v.padEnd(this.longest+1," "));let x=this.values[a]=c||o,T=c?"success":"dark";await y.call(e,x,this.state)!==!0&&(T="danger");let Y=n[T](await this.indicator(e,t))+(e.pad||""),$=this.indent(e),_=()=>[$,Y,v+b,c,p].filter(Boolean).join(" ");if(i.submitted)return v=jGe.unstyle(v),c=g(c),p="",_();if(e.format)c=await e.format.call(this,c,e,t);else{let ne=this.styles.muted;c=YGe(this,{input:c,initial:o,pos:s,showCursor:m,color:ne})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,x,e,t)),m&&(v=f(v)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),_()}async submit(){return this.value=this.values,super.base.submit.call(this)}};fie.exports=hie});var rN=w((Dft,pie)=>{"use strict";var qGe=U0(),JGe=()=>{throw new Error("expected prompt to have a custom authenticate method")},die=(r=JGe)=>{class e extends qGe{constructor(i){super(i)}async submit(){this.value=await r.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return die(i)}}return e};pie.exports=die()});var Eie=w((Rft,Cie)=>{"use strict";var WGe=rN();function zGe(r,e){return r.username===this.options.username&&r.password===this.options.password}var mie=(r=zGe)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class t extends WGe.create(r){constructor(n){super(te(N({},n),{choices:e}))}static create(n){return mie(n)}}return t};Cie.exports=mie()});var H0=w((Fft,Iie)=>{"use strict";var _Ge=_f(),{isPrimitive:VGe,hasColor:XGe}=Xi(),yie=class extends _Ge{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:t,state:i}=this;return i.submitted?t.success(e):t.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return VGe(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return XGe(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(t),this.write([l,a,f].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};Iie.exports=yie});var bie=w((Nft,wie)=>{"use strict";var ZGe=H0(),Bie=class extends ZGe{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};wie.exports=Bie});var vie=w((Lft,Qie)=>{"use strict";var $Ge=Nl(),eYe=U0(),Vf=eYe.prototype,Sie=class extends $Ge{constructor(e){super(te(N({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(t=>t!=null),this.emptyError="",this.values={}}dispatch(e,t){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():Vf.dispatch.call(this,e,t)}append(e,t){return Vf.append.call(this,e,t)}delete(e,t){return Vf.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?Vf.next.call(this):super.next()}prev(){return this.focused.editable?Vf.prev.call(this):super.prev()}async indicator(e,t){let i=e.indicator||"",n=e.editable?i:super.indicator(e,t);return await this.resolve(n,this.state,e,t)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,t){return e.indent="",e.editable?Vf.renderChoice.call(this,e,t):super.renderChoice(e,t)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!="function"||t.role==="heading")continue;let i=t.parent?this.value[t.parent.name]:this.value;if(t.editable?i=t.value===t.name?t.initial||"":t.value:this.isDisabled(t)||(i=t.enabled===!0),e=await t.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?t[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(t[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Qie.exports=Sie});var wu=w((Tft,xie)=>{"use strict";var tYe=_f(),rYe=tN(),{isPrimitive:iYe}=Xi(),kie=class extends tYe{constructor(e){super(e);this.initial=iYe(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,t={}){let i=this.state.prevKeypress;return this.state.prevKeypress=t,this.options.multiline===!0&&t.name==="return"&&(!i||i.name!=="return")?this.append(` -`,t):super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:i}=this.state;this.input=`${i}`.slice(0,t)+e+`${i}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),i=this.input.slice(e),n=t.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||t):rYe(this,{input:e,initial:t,pos:this.cursor})}async render(){let e=this.state.size,t=await this.prefix(),i=await this.separator(),n=await this.message(),s=[t,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` -`)),this.restore()}};xie.exports=kie});var Die=w((Oft,Pie)=>{"use strict";var nYe=r=>r.filter((e,t)=>r.lastIndexOf(e)===t),j0=r=>nYe(r).filter(Boolean);Pie.exports=(r,e={},t="")=>{let{past:i=[],present:n=""}=e,s,o;switch(r){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:j0([t,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:j0([...s,t]),present:o};case"save":return{past:j0([...i,t]),present:""};case"remove":return o=j0(i.filter(a=>a!==t)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${r}"`)}}});var iN=w((Mft,Rie)=>{"use strict";var sYe=wu(),Fie=Die(),Nie=class extends sYe{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let i=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=Fie(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=Fie("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Rie.exports=Nie});var Oie=w((Kft,Lie)=>{"use strict";var oYe=wu(),Tie=class extends oYe{format(){return""}};Lie.exports=Tie});var Uie=w((Uft,Mie)=>{"use strict";var aYe=wu(),Kie=class extends aYe{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:t=>t;return this.list.map(e).join(", ")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);return t!==!0?(this.state.error=t,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Mie.exports=Kie});var Gie=w((Hft,Hie)=>{"use strict";var AYe=Nl(),jie=class extends AYe{constructor(e){super(te(N({},e),{multiple:!0}))}};Hie.exports=jie});var nN=w((jft,Yie)=>{"use strict";var lYe=wu(),qie=class extends lYe{constructor(e={}){super(N({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let t=e||this.minor,i=this.toNumber(this.input);return i>this.max+t?this.alert():(this.input=`${i+t}`,this.render())}down(e){let t=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(t));return this.value=this.toNumber(e||0),super.submit()}};Yie.exports=qie});var Wie=w((Gft,Jie)=>{Jie.exports=nN()});var Vie=w((Yft,zie)=>{"use strict";var cYe=wu(),_ie=class extends cYe{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};zie.exports=_ie});var ene=w((qft,Xie)=>{"use strict";var uYe=Eo(),gYe=qC(),Zie=Xi(),$ie=class extends gYe{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` - `;let t=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+t})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` -`)}renderScaleHeading(e){let t=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(t=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-t.join("").length,n=Math.round(i/(t.length-1)),o=t.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,t,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,t,i);let n=e.scaleIndex===t.index;return t.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,t){let i=e.scale.map(s=>this.scaleIndicator(e,s,t)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await e.hint;s&&!Zie.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,t),u=await this.renderScale(e,t),g=this.margin[1]+this.margin[3];this.scaleLength=uYe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=Zie.wordWrap(c,{width:this.widths[0],newline:a}).split(` -`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),t=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...t.map(n=>n.join(" "))].join(` -`)}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(t),this.write([a,o,c,g,f].filter(Boolean).join(` -`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Xie.exports=$ie});var nne=w((Jft,tne)=>{"use strict";var rne=Eo(),fYe=(r="")=>typeof r=="string"?r.replace(/^['"]|['"]$/g,""):"",ine=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=fYe(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},hYe=async(r={},e={},t=i=>i)=>{let i=new Set,n=r.fields||[],s=r.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uT.name===b.key);b.field=n.find(T=>T.name===b.key),x||(x=new ine(b),a.push(x)),x.lines.push(b.line-1);continue}let m=o[o.length-1];m.type==="text"&&m.line===c?m.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};tne.exports=async r=>{let e=r.options,t=new Set(e.required===!0?[]:e.required||[]),i=N(N({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await hYe(e,i),a=sN("result",r,e),l=sN("format",r,e),c=sN("validate",r,e,!0),u=r.isValue.bind(r);return async(g={},f=!1)=>{let h=0;g.required=t,g.items=s,g.keys=o,g.output="";let p=async(v,x,T,q)=>{let Y=await c(v,x,T,q);return Y===!1?"Invalid field "+T.name:Y};for(let v of n){let x=v.value,T=v.key;if(v.type!=="template"){x&&(g.output+=x);continue}if(v.type==="template"){let q=s.find(ee=>ee.name===T);e.required===!0&&g.required.add(q.name);let Y=[q.input,g.values[q.value],q.value,x].find(u),_=(q.field||{}).message||v.inner;if(f){let ee=await p(g.values[T],g,q,h);if(ee&&typeof ee=="string"||ee===!1){g.invalid.set(T,ee);continue}g.invalid.delete(T);let A=await a(g.values[T],g,q,h);g.output+=rne.unstyle(A);continue}q.placeholder=!1;let ne=x;x=await l(x,g,q,h),Y!==x?(g.values[T]=Y,x=r.styles.typing(Y),g.missing.delete(_)):(g.values[T]=void 0,Y=`<${_}>`,x=r.styles.primary(Y),q.placeholder=!0,g.required.has(T)&&g.missing.add(_)),g.missing.has(_)&&g.validating&&(x=r.styles.warning(Y)),g.invalid.has(T)&&g.validating&&(x=r.styles.danger(Y)),h===g.index&&(ne!==x?x=r.styles.underline(x):x=r.styles.heading(rne.unstyle(x))),h++}x&&(g.output+=x)}let m=g.output.split(` -`).map(v=>" "+v),y=s.length,b=0;for(let v of s)g.invalid.has(v.name)&&v.lines.forEach(x=>{m[x][0]===" "&&(m[x]=g.styles.danger(g.symbols.bullet)+m[x].slice(1))}),r.isValue(g.values[v.name])&&b++;return g.completed=(b/y*100).toFixed(0),g.output=m.join(` -`),g.output}};function sN(r,e,t,i){return(n,s,o,a)=>typeof o.field[r]=="function"?o.field[r].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var ane=w((Wft,sne)=>{"use strict";var pYe=Eo(),dYe=nne(),CYe=_f(),one=class extends CYe{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await dYe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(t=this.styles.danger),t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:i,size:n}=this.state,s=[this.options.newline,` -`].find(v=>v!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=t[e]||"",m=await this.format(p),y=await this.footer();m&&(c+=" "+m),f&&!m&&this.state.completed===0&&(c+=" "+f),this.clear(n);let b=[u,c,h,y,g.trim()];this.write(b.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:t,keys:i,index:n}=this.state,s=t.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} -`;return this.state.error=a,super.submit()}if(t.size)return this.state.error="Required: "+[...t.keys()].join(", "),super.submit();let o=pYe.unstyle(i).split(` -`).map(a=>a.slice(1)).join(` -`);return this.value={values:n,result:o},super.submit()}};sne.exports=one});var cne=w((zft,Ane)=>{"use strict";var mYe="(Use + to sort)",EYe=Nl(),lne=class extends EYe{constructor(e){super(te(N({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,mYe].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,t){let i=await super.renderChoice(e,t),n=this.symbols.identicalTo+" ",s=this.index===t&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${t+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Ane.exports=lne});var fne=w((_ft,une)=>{"use strict";var IYe=qC(),gne=class extends IYe{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];t=t.map(i=>this.styles.muted(i)),this.state.header=t.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let i of t)i.scale=yYe(5,this.options),i.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],i=t.selected;return e.scale.forEach(n=>n.selected=!1),t.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=x=>(x?this.styles.success("\u25C9"):"\u25EF")+o,u=t+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,t),h=this.indent(e),p=h+e.scale.map((x,T)=>c(T===e.scaleIdx)).join(a),m=x=>x===e.scaleIdx?g(x):x,y=h+e.scale.map((x,T)=>m(T)).join(l),b=()=>[u,f].filter(Boolean).join(" "),v=()=>[b(),p,y," "].filter(Boolean).join(` -`);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),v()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),t=await Promise.all(e);return t.length||t.push(this.styles.danger("No matching choices")),t.join(` -`)}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(t),this.write([o,a,u,g].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function yYe(r,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>N({},i));let t=[];for(let i=1;i{hne.exports=iN()});var mne=w((Xft,dne)=>{"use strict";var wYe=H0(),Cne=class extends wYe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([t,c,l].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};dne.exports=Cne});var yne=w((Zft,Ene)=>{"use strict";var BYe=Nl(),Ine=class extends BYe{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Ene.exports=Ine});var Bne=w(oN=>{"use strict";var wne=Xi(),mi=(r,e)=>{wne.defineExport(oN,r,e),wne.defineExport(oN,r.toLowerCase(),e)};mi("AutoComplete",()=>uie());mi("BasicAuth",()=>Eie());mi("Confirm",()=>bie());mi("Editable",()=>vie());mi("Form",()=>U0());mi("Input",()=>iN());mi("Invisible",()=>Oie());mi("List",()=>Uie());mi("MultiSelect",()=>Gie());mi("Numeral",()=>Wie());mi("Password",()=>Vie());mi("Scale",()=>ene());mi("Select",()=>Nl());mi("Snippet",()=>ane());mi("Sort",()=>cne());mi("Survey",()=>fne());mi("Text",()=>pne());mi("Toggle",()=>mne());mi("Quiz",()=>yne())});var Qne=w((eht,bne)=>{bne.exports={ArrayPrompt:qC(),AuthPrompt:rN(),BooleanPrompt:H0(),NumberPrompt:nN(),StringPrompt:wu()}});var WC=w((tht,Sne)=>{"use strict";var vne=require("assert"),aN=require("events"),Ll=Xi(),ha=class extends aN{constructor(e,t){super();this.options=Ll.merge({},e),this.answers=N({},t)}register(e,t){if(Ll.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}vne.equal(typeof t,"function","expected a function");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t=="function"&&(t=await t.call(this)),await this.ask(Ll.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let t=Ll.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=Ll;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];vne(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||_f()}static get prompts(){return Bne()}static get types(){return Qne()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return Ll.mixinEmitter(e,new aN),e}};Ll.mixinEmitter(ha,new aN);var AN=ha.prompts;for(let r of Object.keys(AN)){let e=r.toLowerCase(),t=i=>new AN[r](i).run();ha.prompt[e]=t,ha[e]=t,ha[r]||Reflect.defineProperty(ha,r,{get:()=>AN[r]})}var JC=r=>{Ll.defineExport(ha,r,()=>ha.types[r])};JC("ArrayPrompt");JC("AuthPrompt");JC("BooleanPrompt");JC("NumberPrompt");JC("StringPrompt");Sne.exports=ha});var Une=w((Yht,Kne)=>{function xYe(r,e){for(var t=-1,i=r==null?0:r.length;++t{var kYe=$B(),PYe=Nf();function DYe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s{var RYe=Zf(),FYe=Kf();function NYe(r,e){return r&&RYe(e,FYe(e),r)}jne.exports=NYe});var qne=w((Wht,Yne)=>{function LYe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Yne.exports=LYe});var Wne=w((zht,Jne)=>{var TYe=Rn(),OYe=f0(),MYe=qne(),KYe=Object.prototype,UYe=KYe.hasOwnProperty;function HYe(r){if(!TYe(r))return MYe(r);var e=OYe(r),t=[];for(var i in r)i=="constructor"&&(e||!UYe.call(r,i))||t.push(i);return t}Jne.exports=HYe});var $f=w((_ht,zne)=>{var jYe=$R(),GYe=Wne(),YYe=vC();function qYe(r){return YYe(r)?jYe(r,!0):GYe(r)}zne.exports=qYe});var Vne=w((Vht,_ne)=>{var JYe=Zf(),WYe=$f();function zYe(r,e){return r&&JYe(e,WYe(e),r)}_ne.exports=zYe});var hN=w((em,eh)=>{var _Ye=Ns(),Xne=typeof em=="object"&&em&&!em.nodeType&&em,Zne=Xne&&typeof eh=="object"&&eh&&!eh.nodeType&&eh,VYe=Zne&&Zne.exports===Xne,$ne=VYe?_Ye.Buffer:void 0,ese=$ne?$ne.allocUnsafe:void 0;function XYe(r,e){if(e)return r.slice();var t=r.length,i=ese?ese(t):new r.constructor(t);return r.copy(i),i}eh.exports=XYe});var pN=w((Xht,tse)=>{function ZYe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t{var $Ye=Zf(),eqe=p0();function tqe(r,e){return $Ye(r,eqe(r),e)}rse.exports=tqe});var G0=w(($ht,nse)=>{var rqe=eF(),iqe=rqe(Object.getPrototypeOf,Object);nse.exports=iqe});var dN=w((ept,sse)=>{var nqe=t0(),sqe=G0(),oqe=p0(),aqe=oF(),Aqe=Object.getOwnPropertySymbols,lqe=Aqe?function(r){for(var e=[];r;)nqe(e,oqe(r)),r=sqe(r);return e}:aqe;sse.exports=lqe});var ase=w((tpt,ose)=>{var cqe=Zf(),uqe=dN();function gqe(r,e){return cqe(r,uqe(r),e)}ose.exports=gqe});var lse=w((rpt,Ase)=>{var fqe=sF(),hqe=dN(),pqe=$f();function dqe(r){return fqe(r,pqe,hqe)}Ase.exports=dqe});var use=w((ipt,cse)=>{var Cqe=Object.prototype,mqe=Cqe.hasOwnProperty;function Eqe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]=="string"&&mqe.call(r,"index")&&(t.index=r.index,t.input=r.input),t}cse.exports=Eqe});var Y0=w((npt,gse)=>{var fse=iF();function Iqe(r){var e=new r.constructor(r.byteLength);return new fse(e).set(new fse(r)),e}gse.exports=Iqe});var pse=w((spt,hse)=>{var yqe=Y0();function wqe(r,e){var t=e?yqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}hse.exports=wqe});var Cse=w((opt,dse)=>{var Bqe=/\w*$/;function bqe(r){var e=new r.constructor(r.source,Bqe.exec(r));return e.lastIndex=r.lastIndex,e}dse.exports=bqe});var wse=w((apt,mse)=>{var Ese=Jc(),Ise=Ese?Ese.prototype:void 0,yse=Ise?Ise.valueOf:void 0;function Qqe(r){return yse?Object(yse.call(r)):{}}mse.exports=Qqe});var CN=w((Apt,Bse)=>{var Sqe=Y0();function vqe(r,e){var t=e?Sqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}Bse.exports=vqe});var Qse=w((lpt,bse)=>{var xqe=Y0(),kqe=pse(),Pqe=Cse(),Dqe=wse(),Rqe=CN(),Fqe="[object Boolean]",Nqe="[object Date]",Lqe="[object Map]",Tqe="[object Number]",Oqe="[object RegExp]",Mqe="[object Set]",Kqe="[object String]",Uqe="[object Symbol]",Hqe="[object ArrayBuffer]",jqe="[object DataView]",Gqe="[object Float32Array]",Yqe="[object Float64Array]",qqe="[object Int8Array]",Jqe="[object Int16Array]",Wqe="[object Int32Array]",zqe="[object Uint8Array]",_qe="[object Uint8ClampedArray]",Vqe="[object Uint16Array]",Xqe="[object Uint32Array]";function Zqe(r,e,t){var i=r.constructor;switch(e){case Hqe:return xqe(r);case Fqe:case Nqe:return new i(+r);case jqe:return kqe(r,t);case Gqe:case Yqe:case qqe:case Jqe:case Wqe:case zqe:case _qe:case Vqe:case Xqe:return Rqe(r,t);case Lqe:return new i;case Tqe:case Kqe:return new i(r);case Oqe:return Pqe(r);case Mqe:return new i;case Uqe:return Dqe(r)}}bse.exports=Zqe});var xse=w((cpt,Sse)=>{var $qe=Rn(),vse=Object.create,eJe=function(){function r(){}return function(e){if(!$qe(e))return{};if(vse)return vse(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Sse.exports=eJe});var mN=w((upt,kse)=>{var tJe=xse(),rJe=G0(),iJe=f0();function nJe(r){return typeof r.constructor=="function"&&!iJe(r)?tJe(rJe(r)):{}}kse.exports=nJe});var Dse=w((gpt,Pse)=>{var sJe=kC(),oJe=ta(),aJe="[object Map]";function AJe(r){return oJe(r)&&sJe(r)==aJe}Pse.exports=AJe});var Lse=w((fpt,Rse)=>{var lJe=Dse(),cJe=c0(),Fse=u0(),Nse=Fse&&Fse.isMap,uJe=Nse?cJe(Nse):lJe;Rse.exports=uJe});var Ose=w((hpt,Tse)=>{var gJe=kC(),fJe=ta(),hJe="[object Set]";function pJe(r){return fJe(r)&&gJe(r)==hJe}Tse.exports=pJe});var Hse=w((ppt,Mse)=>{var dJe=Ose(),CJe=c0(),Kse=u0(),Use=Kse&&Kse.isSet,mJe=Use?CJe(Use):dJe;Mse.exports=mJe});var Jse=w((dpt,jse)=>{var EJe=xC(),IJe=Une(),yJe=$B(),wJe=Gne(),BJe=Vne(),bJe=hN(),QJe=pN(),SJe=ise(),vJe=ase(),xJe=aF(),kJe=lse(),PJe=kC(),DJe=use(),RJe=Qse(),FJe=mN(),NJe=Ks(),LJe=bC(),TJe=Lse(),OJe=Rn(),MJe=Hse(),KJe=Kf(),UJe=$f(),HJe=1,jJe=2,GJe=4,Gse="[object Arguments]",YJe="[object Array]",qJe="[object Boolean]",JJe="[object Date]",WJe="[object Error]",Yse="[object Function]",zJe="[object GeneratorFunction]",_Je="[object Map]",VJe="[object Number]",qse="[object Object]",XJe="[object RegExp]",ZJe="[object Set]",$Je="[object String]",e3e="[object Symbol]",t3e="[object WeakMap]",r3e="[object ArrayBuffer]",i3e="[object DataView]",n3e="[object Float32Array]",s3e="[object Float64Array]",o3e="[object Int8Array]",a3e="[object Int16Array]",A3e="[object Int32Array]",l3e="[object Uint8Array]",c3e="[object Uint8ClampedArray]",u3e="[object Uint16Array]",g3e="[object Uint32Array]",dr={};dr[Gse]=dr[YJe]=dr[r3e]=dr[i3e]=dr[qJe]=dr[JJe]=dr[n3e]=dr[s3e]=dr[o3e]=dr[a3e]=dr[A3e]=dr[_Je]=dr[VJe]=dr[qse]=dr[XJe]=dr[ZJe]=dr[$Je]=dr[e3e]=dr[l3e]=dr[c3e]=dr[u3e]=dr[g3e]=!0;dr[WJe]=dr[Yse]=dr[t3e]=!1;function q0(r,e,t,i,n,s){var o,a=e&HJe,l=e&jJe,c=e&GJe;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!OJe(r))return r;var u=NJe(r);if(u){if(o=DJe(r),!a)return QJe(r,o)}else{var g=PJe(r),f=g==Yse||g==zJe;if(LJe(r))return bJe(r,a);if(g==qse||g==Gse||f&&!n){if(o=l||f?{}:FJe(r),!a)return l?vJe(r,BJe(o,r)):SJe(r,wJe(o,r))}else{if(!dr[g])return n?r:{};o=RJe(r,g,a)}}s||(s=new EJe);var h=s.get(r);if(h)return h;s.set(r,o),MJe(r)?r.forEach(function(y){o.add(q0(y,e,t,y,r,s))}):TJe(r)&&r.forEach(function(y,b){o.set(b,q0(y,e,t,b,r,s))});var p=c?l?kJe:xJe:l?UJe:KJe,m=u?void 0:p(r);return IJe(m||r,function(y,b){m&&(b=y,y=r[b]),yJe(o,b,q0(y,e,t,b,r,s))}),o}jse.exports=q0});var EN=w((Cpt,Wse)=>{var f3e=Jse(),h3e=1,p3e=4;function d3e(r){return f3e(r,h3e|p3e)}Wse.exports=d3e});var _se=w((mpt,zse)=>{var C3e=kR();function m3e(r,e,t){return r==null?r:C3e(r,e,t)}zse.exports=m3e});var toe=w((bpt,eoe)=>{function E3e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}eoe.exports=E3e});var ioe=w((Qpt,roe)=>{var I3e=hC(),y3e=VP();function w3e(r,e){return e.length<2?r:I3e(r,y3e(e,0,-1))}roe.exports=w3e});var soe=w((Spt,noe)=>{var B3e=Ff(),b3e=toe(),Q3e=ioe(),S3e=gu();function v3e(r,e){return e=B3e(e,r),r=Q3e(r,e),r==null||delete r[S3e(b3e(e))]}noe.exports=v3e});var aoe=w((vpt,ooe)=>{var x3e=soe();function k3e(r,e){return r==null?!0:x3e(r,e)}ooe.exports=k3e});var doe=w((idt,poe)=>{poe.exports={name:"@yarnpkg/cli",version:"3.2.2",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.2.0-rc.4",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var DN=w((LEt,rae)=>{"use strict";rae.exports=function(e,t){t===!0&&(t=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof t=="number"?n[t]:n}});var RN=w((TEt,iae)=>{"use strict";var V3e=DN();function nae(r){if(Array.isArray(r))return r.indexOf("ssh")!==-1||r.indexOf("rsync")!==-1;if(typeof r!="string")return!1;var e=V3e(r);return r=r.substring(r.indexOf("://")+3),nae(e)?!0:r.indexOf("@"){"use strict";var X3e=DN(),Z3e=RN(),$3e=require("querystring");function eWe(r){r=(r||"").trim();var e={protocols:X3e(r),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:r,query:Object.create(null)},t=r.indexOf("://"),i=-1,n=null,s=null;r.startsWith(".")&&(r.startsWith("./")&&(r=r.substring(2)),e.pathname=r,e.protocol="file");var o=r.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(Z3e(r)?e.protocol="ssh":((o==="/"||o==="~")&&(r=r.substring(2)),e.protocol="file"))),t!==-1&&(r=r.substring(t+3)),s=r.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=$3e.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}sae.exports=eWe});var lae=w((MEt,aae)=>{"use strict";var tWe="text/plain",rWe="us-ascii",Aae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),iWe=(r,{stripHash:e})=>{let t=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(";");s=e?"":s;let a=!1;o[o.length-1]==="base64"&&(o.pop(),a=!0);let l=(o.shift()||"").toLowerCase(),u=[...o.map(g=>{let[f,h=""]=g.split("=").map(p=>p.trim());return f==="charset"&&(h=h.toLowerCase(),h===rWe)?"":`${f}${h?`=${h}`:""}`}).filter(Boolean)];return a&&u.push("base64"),(u.length!==0||l&&l!==tWe)&&u.unshift(l),`data:${u.join(";")},${a?n.trim():n}${s?`#${s}`:""}`},nWe=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),r=r.trim(),/^data:/i.test(r))return iWe(r,e);if(/^view-source:/i.test(r))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash?n.hash="":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,"")),n.pathname&&(n.pathname=n.pathname.replace(/(?0){let o=n.pathname.split("/"),a=o[o.length-1];Aae(a,e.removeDirectoryIndex)&&(o=o.slice(0,o.length-1),n.pathname=o.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)(?:[a-z\-\d]{1,63})\.(?:[a-z.\-\d]{2,63})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])Aae(o,e.removeQueryParameters)&&n.searchParams.delete(o);e.removeQueryParameters===!0&&(n.search=""),e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,""));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname==="/"&&!s.endsWith("/")&&n.hash===""&&(r=r.replace(/\/$/,"")),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&e.removeSingleSlash&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};aae.exports=nWe});var uae=w((KEt,cae)=>{"use strict";var sWe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(r){return typeof r}:function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},oWe=oae(),aWe=lae();function AWe(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof r!="string"||!r.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":sWe(e))!=="object"&&(e={stripHash:!1}),r=aWe(r,e));var t=oWe(r);return t}cae.exports=AWe});var hae=w((UEt,gae)=>{"use strict";var lWe=uae(),fae=RN();function cWe(r){var e=lWe(r);e.token="";var t=e.user.split(":");return t.length===2&&(t[1]==="x-oauth-basic"?e.token=t[0]:t[0]==="x-token-auth"&&(e.token=t[1])),fae(e.protocols)||fae(r)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}gae.exports=cWe});var dae=w((HEt,pae)=>{"use strict";var uWe=hae();function FN(r){if(typeof r!="string")throw new Error("The url must be a string.");var e=uWe(r),t=e.resource.split("."),i=null;switch(e.toString=function(l){return FN.stringify(this,l)},e.source=t.length>2?t.slice(1-t.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=t[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}FN.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join("+"):r.protocol);var t=r.port?":"+r.port:"",i=r.user||"git",n=r.git_suffix?".git":"";switch(e){case"ssh":return t?"ssh://"+i+"@"+r.resource+t+"/"+r.full_name+n:i+"@"+r.resource+":"+r.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+r.resource+t+"/"+r.full_name+n;case"http":case"https":var s=r.token?gWe(r):r.user&&(r.protocols.includes("http")||r.protocols.includes("https"))?r.user+"@":"";return e+"://"+s+r.resource+t+"/"+r.full_name+n;default:return r.href}};function gWe(r){switch(r.source){case"bitbucket.org":return"x-token-auth:"+r.token+"@";default:return r.token+"@"}}pae.exports=FN});var cL=w((Vwt,Mae)=>{var DWe=Nf(),RWe=Pf();function FWe(r,e,t){(t!==void 0&&!RWe(r[e],t)||t===void 0&&!(e in r))&&DWe(r,e,t)}Mae.exports=FWe});var Uae=w((Xwt,Kae)=>{var NWe=vC(),LWe=ta();function TWe(r){return LWe(r)&&NWe(r)}Kae.exports=TWe});var Gae=w((Zwt,Hae)=>{var OWe=Wc(),MWe=G0(),KWe=ta(),UWe="[object Object]",HWe=Function.prototype,jWe=Object.prototype,jae=HWe.toString,GWe=jWe.hasOwnProperty,YWe=jae.call(Object);function qWe(r){if(!KWe(r)||OWe(r)!=UWe)return!1;var e=MWe(r);if(e===null)return!0;var t=GWe.call(e,"constructor")&&e.constructor;return typeof t=="function"&&t instanceof t&&jae.call(t)==YWe}Hae.exports=qWe});var uL=w(($wt,Yae)=>{function JWe(r,e){if(!(e==="constructor"&&typeof r[e]=="function")&&e!="__proto__")return r[e]}Yae.exports=JWe});var Jae=w((eBt,qae)=>{var WWe=Zf(),zWe=$f();function _We(r){return WWe(r,zWe(r))}qae.exports=_We});var Zae=w((tBt,Wae)=>{var zae=cL(),VWe=hN(),XWe=CN(),ZWe=pN(),$We=mN(),_ae=dC(),Vae=Ks(),e4e=Uae(),t4e=bC(),r4e=VB(),i4e=Rn(),n4e=Gae(),s4e=g0(),Xae=uL(),o4e=Jae();function a4e(r,e,t,i,n,s,o){var a=Xae(r,t),l=Xae(e,t),c=o.get(l);if(c){zae(r,t,c);return}var u=s?s(a,l,t+"",r,e,o):void 0,g=u===void 0;if(g){var f=Vae(l),h=!f&&t4e(l),p=!f&&!h&&s4e(l);u=l,f||h||p?Vae(a)?u=a:e4e(a)?u=ZWe(a):h?(g=!1,u=VWe(l,!0)):p?(g=!1,u=XWe(l,!0)):u=[]:n4e(l)||_ae(l)?(u=a,_ae(a)?u=o4e(a):(!i4e(a)||r4e(a))&&(u=$We(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),zae(r,t,u)}Wae.exports=a4e});var tAe=w((rBt,$ae)=>{var A4e=xC(),l4e=cL(),c4e=XR(),u4e=Zae(),g4e=Rn(),f4e=$f(),h4e=uL();function eAe(r,e,t,i,n){r!==e&&c4e(e,function(s,o){if(n||(n=new A4e),g4e(s))u4e(r,e,o,t,eAe,i,n);else{var a=i?i(h4e(r,o),s,o+"",r,e,n):void 0;a===void 0&&(a=s),l4e(r,o,a)}},f4e)}$ae.exports=eAe});var iAe=w((iBt,rAe)=>{var p4e=r0(),d4e=RR(),C4e=FR();function m4e(r,e){return C4e(d4e(r,e,p4e),r+"")}rAe.exports=m4e});var sAe=w((nBt,nAe)=>{var E4e=Pf(),I4e=vC(),y4e=pC(),w4e=Rn();function B4e(r,e,t){if(!w4e(t))return!1;var i=typeof e;return(i=="number"?I4e(t)&&y4e(e,t.length):i=="string"&&e in t)?E4e(t[e],r):!1}nAe.exports=B4e});var aAe=w((sBt,oAe)=>{var b4e=iAe(),Q4e=sAe();function S4e(r){return b4e(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s=="function"?(n--,s):void 0,o&&Q4e(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var v4e=tAe(),x4e=aAe(),k4e=x4e(function(r,e,t){v4e(r,e,t)});AAe.exports=k4e});var QAe=w((u0t,bAe)=>{var QL;bAe.exports=()=>(typeof QL=="undefined"&&(QL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),QL)});var TAe=w((Y0t,LAe)=>{var kL;LAe.exports=()=>(typeof kL=="undefined"&&(kL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),kL)});var YAe=w((TL,OL)=>{(function(r){TL&&typeof TL=="object"&&typeof OL!="undefined"?OL.exports=r():typeof define=="function"&&define.amd?define([],r):typeof window!="undefined"?window.isWindows=r():typeof global!="undefined"?global.isWindows=r():typeof self!="undefined"?self.isWindows=r():this.isWindows=r()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var zAe=w((Vbt,qAe)=>{"use strict";ML.ifExists=C8e;var ah=require("util"),zs=require("path"),JAe=YAe(),m8e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,E8e={createPwshFile:!0,createCmdFile:JAe(),fs:require("fs")},I8e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function WAe(r){let e=N(N({},E8e),r),t=e.fs;return e.fs_={chmod:t.chmod?ah.promisify(t.chmod):async()=>{},mkdir:ah.promisify(t.mkdir),readFile:ah.promisify(t.readFile),stat:ah.promisify(t.stat),unlink:ah.promisify(t.unlink),writeFile:ah.promisify(t.writeFile)},e}async function ML(r,e,t){let i=WAe(t);await i.fs_.stat(r),await y8e(r,e,i)}function C8e(r,e,t){return ML(r,e,t).catch(()=>{})}function w8e(r,e){return e.fs_.unlink(r).catch(()=>{})}async function y8e(r,e,t){let i=await Q8e(r,t);return await B8e(e,t),b8e(r,e,i,t)}function B8e(r,e){return e.fs_.mkdir(zs.dirname(r),{recursive:!0})}function b8e(r,e,t,i){let n=WAe(i),s=[{generator:x8e,extension:""}];return n.createCmdFile&&s.push({generator:v8e,extension:".cmd"}),n.createPwshFile&&s.push({generator:k8e,extension:".ps1"}),Promise.all(s.map(o=>S8e(r,e+o.extension,t,o.generator,n)))}function P8e(r,e){return w8e(r,e)}function R8e(r,e){return D8e(r,e)}async function Q8e(r,e){let n=(await e.fs_.readFile(r,"utf8")).trim().split(/\r*\n/)[0].match(m8e);if(!n){let s=zs.extname(r).toLowerCase();return{program:I8e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function S8e(r,e,t,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[t.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:t.program,args:o}),await P8e(e,n),await n.fs_.writeFile(e,i(r,e,n),"utf8"),R8e(e,n)}function v8e(r,e,t){let n=zs.relative(zs.dirname(e),r).split("/").join("\\"),s=zs.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=t.prog,l=t.args||"",c=KL(t.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=t.progArgs?`${t.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r -`:"";return o?g+=`@IF EXIST ${o} (\r - ${o} ${l} ${n} ${u}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${a} ${l} ${n} ${u}%*\r -)\r -`:g+=`@${a} ${l} ${n} ${u}%*\r -`,g}function x8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=t.args||"",l=KL(t.nodePath).posix;n?(s=`"$basedir/${t.prog}"`,i=o):(n=o,a="",i="");let c=t.progArgs?`${t.progArgs.join(" ")} `:"",u=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,g=t.nodePath?`export NODE_PATH="${l}" -`:"";return s?u+=`${g}if [ -x ${s} ]; then - exec ${s} ${a} ${i} ${c}"$@" -else - exec ${n} ${a} ${i} ${c}"$@" -fi -`:u+=`${g}${n} ${a} ${i} ${c}"$@" -exit $? -`,u}function k8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=t.args||"",c=KL(t.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${t.prog}$exe"`,i=a):(s=a,l="",i="");let f=t.progArgs?`${t.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${t.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${u}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return t.nodePath&&(h+=` else { - $env:NODE_PATH="${g}" -}`),o?h+=` -$ret=0 -if (Test-Path ${o}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${o} ${l} ${i} ${f}$args - } else { - & ${o} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args - } else { - & ${s} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} -${t.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:h+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args -} else { - & ${s} ${l} ${i} ${f}$args -} -${t.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,h}function D8e(r,e){return e.fs_.chmod(r,493)}function KL(r){if(!r)return{win32:"",posix:""};let e=typeof r=="string"?r.split(zs.delimiter):Array.from(r),t={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];t.win32=t.win32?`${t.win32};${n}`:n,t.posix=t.posix?`${t.posix}:${s}`:s,t[i]={win32:n,posix:s}}return t}qAe.exports=ML});var eT=w((RSt,hle)=>{hle.exports=require("stream")});var mle=w((FSt,ple)=>{"use strict";function dle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function Z8e(r){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(t){var i={data:t,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(t){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=t+i.data;return n}},{key:"concat",value:function(t){if(this.length===0)return lb.alloc(0);for(var i=lb.allocUnsafe(t>>>0),n=this.head,s=0;n;)nze(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(t,i){var n;return to.length?o.length:t;if(a===o.length?s+=o:s+=o.slice(0,t),t-=a,t===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(t){var i=lb.allocUnsafe(t),n=this.head,s=1;for(n.data.copy(i),t-=n.data.length;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(i,i.length-t,0,a),t-=a,t===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:ize,value:function(t,i){return tT(this,Z8e({},i,{depth:0,customInspect:!1}))}}]),r}()});var iT=w((NSt,Ele)=>{"use strict";function sze(r,e){var t=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(r):r&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(rT,this,r)):process.nextTick(rT,this,r)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(r||null,function(s){!e&&s?t._writableState?t._writableState.errorEmitted?process.nextTick(cb,t):(t._writableState.errorEmitted=!0,process.nextTick(Ile,t,s)):process.nextTick(Ile,t,s):e?(process.nextTick(cb,t),e(s)):process.nextTick(cb,t)}),this)}function Ile(r,e){rT(r,e),cb(r)}function cb(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit("close")}function oze(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function rT(r,e){r.emit("error",e)}function aze(r,e){var t=r._readableState,i=r._writableState;t&&t.autoDestroy||i&&i.autoDestroy?r.destroy(e):r.emit("error",e)}Ele.exports={destroy:sze,undestroy:oze,errorOrDestroy:aze}});var Ul=w((LSt,yle)=>{"use strict";var wle={};function _s(r,e,t){t||(t=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends t{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=t.name,n.prototype.code=r,wle[r]=n}function Ble(r,e){if(Array.isArray(r)){let t=r.length;return r=r.map(i=>String(i)),t>2?`one of ${e} ${r.slice(0,t-1).join(", ")}, or `+r[t-1]:t===2?`one of ${e} ${r[0]} or ${r[1]}`:`of ${e} ${r[0]}`}else return`of ${e} ${String(r)}`}function Aze(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function lze(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function cze(r,e,t){return typeof t!="number"&&(t=0),t+e.length>r.length?!1:r.indexOf(e,t)!==-1}_s("ERR_INVALID_OPT_VALUE",function(r,e){return'The value "'+e+'" is invalid for option "'+r+'"'},TypeError);_s("ERR_INVALID_ARG_TYPE",function(r,e,t){let i;typeof e=="string"&&Aze(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(lze(r," argument"))n=`The ${r} ${i} ${Ble(e,"type")}`;else{let s=cze(r,".")?"property":"argument";n=`The "${r}" ${s} ${i} ${Ble(e,"type")}`}return n+=`. Received type ${typeof t}`,n},TypeError);_s("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");_s("ERR_METHOD_NOT_IMPLEMENTED",function(r){return"The "+r+" method is not implemented"});_s("ERR_STREAM_PREMATURE_CLOSE","Premature close");_s("ERR_STREAM_DESTROYED",function(r){return"Cannot call "+r+" after a stream was destroyed"});_s("ERR_MULTIPLE_CALLBACK","Callback called multiple times");_s("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");_s("ERR_STREAM_WRITE_AFTER_END","write after end");_s("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);_s("ERR_UNKNOWN_ENCODING",function(r){return"Unknown encoding: "+r},TypeError);_s("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");yle.exports.codes=wle});var nT=w((TSt,ble)=>{"use strict";var uze=Ul().codes.ERR_INVALID_OPT_VALUE;function gze(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function fze(r,e,t,i){var n=gze(e,i,t);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?t:"highWaterMark";throw new uze(s,n)}return Math.floor(n)}return r.objectMode?16:16*1024}ble.exports={getHighWaterMark:fze}});var Qle=w((OSt,sT)=>{typeof Object.create=="function"?sT.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:sT.exports=function(e,t){if(t){e.super_=t;var i=function(){};i.prototype=t.prototype,e.prototype=new i,e.prototype.constructor=e}}});var Hl=w((MSt,oT)=>{try{if(aT=require("util"),typeof aT.inherits!="function")throw"";oT.exports=aT.inherits}catch(r){oT.exports=Qle()}var aT});var vle=w((KSt,Sle)=>{Sle.exports=require("util").deprecate});var cT=w((USt,xle)=>{"use strict";xle.exports=Gr;function kle(r){var e=this;this.next=null,this.entry=null,this.finish=function(){hze(e,r)}}var ch;Gr.WritableState=Gm;var pze={deprecate:vle()},Ple=eT(),ub=require("buffer").Buffer,dze=global.Uint8Array||function(){};function Cze(r){return ub.from(r)}function mze(r){return ub.isBuffer(r)||r instanceof dze}var AT=iT(),Eze=nT(),Ize=Eze.getHighWaterMark,jl=Ul().codes,yze=jl.ERR_INVALID_ARG_TYPE,wze=jl.ERR_METHOD_NOT_IMPLEMENTED,Bze=jl.ERR_MULTIPLE_CALLBACK,bze=jl.ERR_STREAM_CANNOT_PIPE,Qze=jl.ERR_STREAM_DESTROYED,Sze=jl.ERR_STREAM_NULL_VALUES,vze=jl.ERR_STREAM_WRITE_AFTER_END,xze=jl.ERR_UNKNOWN_ENCODING,uh=AT.errorOrDestroy;Hl()(Gr,Ple);function kze(){}function Gm(r,e,t){ch=ch||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof ch),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.writableObjectMode),this.highWaterMark=Ize(this,r,"writableHighWaterMark",t),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=r.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=r.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){Pze(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new kle(this)}Gm.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t};(function(){try{Object.defineProperty(Gm.prototype,"buffer",{get:pze.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(r){}})();var gb;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(gb=Function.prototype[Symbol.hasInstance],Object.defineProperty(Gr,Symbol.hasInstance,{value:function(e){return gb.call(this,e)?!0:this!==Gr?!1:e&&e._writableState instanceof Gm}})):gb=function(e){return e instanceof this};function Gr(r){ch=ch||ku();var e=this instanceof ch;if(!e&&!gb.call(Gr,this))return new Gr(r);this._writableState=new Gm(r,this,e),this.writable=!0,r&&(typeof r.write=="function"&&(this._write=r.write),typeof r.writev=="function"&&(this._writev=r.writev),typeof r.destroy=="function"&&(this._destroy=r.destroy),typeof r.final=="function"&&(this._final=r.final)),Ple.call(this)}Gr.prototype.pipe=function(){uh(this,new bze)};function Dze(r,e){var t=new vze;uh(r,t),process.nextTick(e,t)}function Rze(r,e,t,i){var n;return t===null?n=new Sze:typeof t!="string"&&!e.objectMode&&(n=new yze("chunk",["string","Buffer"],t)),n?(uh(r,n),process.nextTick(i,n),!1):!0}Gr.prototype.write=function(r,e,t){var i=this._writableState,n=!1,s=!i.objectMode&&mze(r);return s&&!ub.isBuffer(r)&&(r=Cze(r)),typeof e=="function"&&(t=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof t!="function"&&(t=kze),i.ending?Dze(this,t):(s||Rze(this,i,r,t))&&(i.pendingcb++,n=Fze(this,i,s,r,e,t)),n};Gr.prototype.cork=function(){this._writableState.corked++};Gr.prototype.uncork=function(){var r=this._writableState;r.corked&&(r.corked--,!r.writing&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&Dle(this,r))};Gr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new xze(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Gr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Nze(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e=="string"&&(e=ub.from(e,t)),e}Object.defineProperty(Gr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Fze(r,e,t,i,n,s){if(!t){var o=Nze(e,i,n);i!==o&&(t=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var Hze=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};Nle.exports=Ea;var Lle=uT(),gT=cT();Hl()(Ea,Lle);for(fT=Hze(gT.prototype),fb=0;fb{var pb=require("buffer"),vA=pb.Buffer;function Ole(r,e){for(var t in r)e[t]=r[t]}vA.from&&vA.alloc&&vA.allocUnsafe&&vA.allocUnsafeSlow?Tle.exports=pb:(Ole(pb,hT),hT.Buffer=gh);function gh(r,e,t){return vA(r,e,t)}Ole(vA,gh);gh.from=function(r,e,t){if(typeof r=="number")throw new TypeError("Argument must not be a number");return vA(r,e,t)};gh.alloc=function(r,e,t){if(typeof r!="number")throw new TypeError("Argument must be a number");var i=vA(r);return e!==void 0?typeof t=="string"?i.fill(e,t):i.fill(e):i.fill(0),i};gh.allocUnsafe=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return vA(r)};gh.allocUnsafeSlow=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return pb.SlowBuffer(r)}});var CT=w(Kle=>{"use strict";var pT=Mle().Buffer,Ule=pT.isEncoding||function(r){switch(r=""+r,r&&r.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Yze(r){if(!r)return"utf8";for(var e;;)switch(r){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return r;default:if(e)return;r=(""+r).toLowerCase(),e=!0}}function qze(r){var e=Yze(r);if(typeof e!="string"&&(pT.isEncoding===Ule||!Ule(r)))throw new Error("Unknown encoding: "+r);return e||r}Kle.StringDecoder=qm;function qm(r){this.encoding=qze(r);var e;switch(this.encoding){case"utf16le":this.text=Wze,this.end=zze,e=4;break;case"utf8":this.fillLast=Jze,e=4;break;case"base64":this.text=_ze,this.end=Vze,e=3;break;default:this.write=Xze,this.end=Zze;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=pT.allocUnsafe(e)}qm.prototype.write=function(r){if(r.length===0)return"";var e,t;if(this.lastNeed){if(e=this.fillLast(r),e===void 0)return"";t=this.lastNeed,this.lastNeed=0}else t=0;return t>5==6?2:r>>4==14?3:r>>3==30?4:r>>6==2?-1:-2}function t5e(r,e,t){var i=e.length-1;if(i=0?(n>0&&(r.lastNeed=n-1),n):--i=0?(n>0&&(r.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:r.lastNeed=n-3),n):0))}function r5e(r,e,t){if((e[0]&192)!=128)return r.lastNeed=0,"\uFFFD";if(r.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return r.lastNeed=1,"\uFFFD";if(r.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return r.lastNeed=2,"\uFFFD"}}function Jze(r){var e=this.lastTotal-this.lastNeed,t=r5e(this,r,e);if(t!==void 0)return t;if(this.lastNeed<=r.length)return r.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,e,0,r.length),this.lastNeed-=r.length}function e5e(r,e){var t=t5e(this,r,e);if(!this.lastNeed)return r.toString("utf8",e);this.lastTotal=t;var i=r.length-(t-this.lastNeed);return r.copy(this.lastChar,0,i),r.toString("utf8",e,i)}function $ze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+"\uFFFD":e}function Wze(r,e){if((r.length-e)%2==0){var t=r.toString("utf16le",e);if(t){var i=t.charCodeAt(t.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1],t.slice(0,-1)}return t}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=r[r.length-1],r.toString("utf16le",e,r.length-1)}function zze(r){var e=r&&r.length?this.write(r):"";if(this.lastNeed){var t=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,t)}return e}function _ze(r,e){var t=(r.length-e)%3;return t===0?r.toString("base64",e):(this.lastNeed=3-t,this.lastTotal=3,t===1?this.lastChar[0]=r[r.length-1]:(this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1]),r.toString("base64",e,r.length-t))}function Vze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function Xze(r){return r.toString(this.encoding)}function Zze(r){return r&&r.length?this.write(r):""}});var db=w((GSt,Hle)=>{"use strict";var jle=Ul().codes.ERR_STREAM_PREMATURE_CLOSE;function i5e(r){var e=!1;return function(){if(!e){e=!0;for(var t=arguments.length,i=new Array(t),n=0;n{"use strict";var Cb;function Gl(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var o5e=db(),Yl=Symbol("lastResolve"),Pu=Symbol("lastReject"),Jm=Symbol("error"),mb=Symbol("ended"),Du=Symbol("lastPromise"),mT=Symbol("handlePromise"),Ru=Symbol("stream");function ql(r,e){return{value:r,done:e}}function a5e(r){var e=r[Yl];if(e!==null){var t=r[Ru].read();t!==null&&(r[Du]=null,r[Yl]=null,r[Pu]=null,e(ql(t,!1)))}}function A5e(r){process.nextTick(a5e,r)}function l5e(r,e){return function(t,i){r.then(function(){if(e[mb]){t(ql(void 0,!0));return}e[mT](t,i)},i)}}var c5e=Object.getPrototypeOf(function(){}),u5e=Object.setPrototypeOf((Cb={get stream(){return this[Ru]},next:function(){var e=this,t=this[Jm];if(t!==null)return Promise.reject(t);if(this[mb])return Promise.resolve(ql(void 0,!0));if(this[Ru].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[Jm]?a(e[Jm]):o(ql(void 0,!0))})});var i=this[Du],n;if(i)n=new Promise(l5e(i,this));else{var s=this[Ru].read();if(s!==null)return Promise.resolve(ql(s,!1));n=new Promise(this[mT])}return this[Du]=n,n}},Gl(Cb,Symbol.asyncIterator,function(){return this}),Gl(Cb,"return",function(){var e=this;return new Promise(function(t,i){e[Ru].destroy(null,function(n){if(n){i(n);return}t(ql(void 0,!0))})})}),Cb),c5e),g5e=function(e){var t,i=Object.create(u5e,(t={},Gl(t,Ru,{value:e,writable:!0}),Gl(t,Yl,{value:null,writable:!0}),Gl(t,Pu,{value:null,writable:!0}),Gl(t,Jm,{value:null,writable:!0}),Gl(t,mb,{value:e._readableState.endEmitted,writable:!0}),Gl(t,mT,{value:function(s,o){var a=i[Ru].read();a?(i[Du]=null,i[Yl]=null,i[Pu]=null,s(ql(a,!1))):(i[Yl]=s,i[Pu]=o)},writable:!0}),t));return i[Du]=null,o5e(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[Pu];s!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,s(n)),i[Jm]=n;return}var o=i[Yl];o!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,o(ql(void 0,!0))),i[mb]=!0}),e.on("readable",A5e.bind(null,i)),i};Yle.exports=g5e});var _le=w((qSt,Jle)=>{"use strict";function Wle(r,e,t,i,n,s,o){try{var a=r[s](o),l=a.value}catch(c){t(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function f5e(r){return function(){var e=this,t=arguments;return new Promise(function(i,n){var s=r.apply(e,t);function o(l){Wle(s,i,n,o,a,"next",l)}function a(l){Wle(s,i,n,o,a,"throw",l)}o(void 0)})}}function zle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function p5e(r){for(var e=1;e{"use strict";Vle.exports=Ut;var fh;Ut.ReadableState=Xle;var JSt=require("events").EventEmitter,Zle=function(e,t){return e.listeners(t).length},Wm=eT(),Eb=require("buffer").Buffer,m5e=global.Uint8Array||function(){};function E5e(r){return Eb.from(r)}function I5e(r){return Eb.isBuffer(r)||r instanceof m5e}var ET=require("util"),Pt;ET&&ET.debuglog?Pt=ET.debuglog("stream"):Pt=function(){};var y5e=mle(),IT=iT(),w5e=nT(),B5e=w5e.getHighWaterMark,Ib=Ul().codes,b5e=Ib.ERR_INVALID_ARG_TYPE,Q5e=Ib.ERR_STREAM_PUSH_AFTER_EOF,S5e=Ib.ERR_METHOD_NOT_IMPLEMENTED,v5e=Ib.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,hh,yT,wT;Hl()(Ut,Wm);var zm=IT.errorOrDestroy,BT=["error","close","destroy","pause","resume"];function x5e(r,e,t){if(typeof r.prependListener=="function")return r.prependListener(e,t);!r._events||!r._events[e]?r.on(e,t):Array.isArray(r._events[e])?r._events[e].unshift(t):r._events[e]=[t,r._events[e]]}function Xle(r,e,t){fh=fh||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof fh),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.readableObjectMode),this.highWaterMark=B5e(this,r,"readableHighWaterMark",t),this.buffer=new y5e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.destroyed=!1,this.defaultEncoding=r.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,r.encoding&&(hh||(hh=CT().StringDecoder),this.decoder=new hh(r.encoding),this.encoding=r.encoding)}function Ut(r){if(fh=fh||ku(),!(this instanceof Ut))return new Ut(r);var e=this instanceof fh;this._readableState=new Xle(r,this,e),this.readable=!0,r&&(typeof r.read=="function"&&(this._read=r.read),typeof r.destroy=="function"&&(this._destroy=r.destroy)),Wm.call(this)}Object.defineProperty(Ut.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Ut.prototype.destroy=IT.destroy;Ut.prototype._undestroy=IT.undestroy;Ut.prototype._destroy=function(r,e){e(r)};Ut.prototype.push=function(r,e){var t=this._readableState,i;return t.objectMode?i=!0:typeof r=="string"&&(e=e||t.defaultEncoding,e!==t.encoding&&(r=Eb.from(r,e),e=""),i=!0),$le(this,r,e,!1,i)};Ut.prototype.unshift=function(r){return $le(this,r,null,!0,!1)};function $le(r,e,t,i,n){Pt("readableAddChunk",e);var s=r._readableState;if(e===null)s.reading=!1,P5e(r,s);else{var o;if(n||(o=k5e(s,e)),o)zm(r,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==Eb.prototype&&(e=E5e(e)),i)s.endEmitted?zm(r,new v5e):bT(r,s,e,!0);else if(s.ended)zm(r,new Q5e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!t?(e=s.decoder.write(e),s.objectMode||e.length!==0?bT(r,s,e,!1):QT(r,s)):bT(r,s,e,!1)}else i||(s.reading=!1,QT(r,s))}return!s.ended&&(s.length=ece?r=ece:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function tce(r,e){return r<=0||e.length===0&&e.ended?0:e.objectMode?1:r!==r?e.flowing&&e.length?e.buffer.head.data.length:e.length:(r>e.highWaterMark&&(e.highWaterMark=D5e(r)),r<=e.length?r:e.ended?e.length:(e.needReadable=!0,0))}Ut.prototype.read=function(r){Pt("read",r),r=parseInt(r,10);var e=this._readableState,t=r;if(r!==0&&(e.emittedReadable=!1),r===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Pt("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?ST(this):yb(this),null;if(r=tce(r,e),r===0&&e.ended)return e.length===0&&ST(this),null;var i=e.needReadable;Pt("need readable",i),(e.length===0||e.length-r0?n=rce(r,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,r=0):(e.length-=r,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),t!==r&&e.ended&&ST(this)),n!==null&&this.emit("data",n),n};function P5e(r,e){if(Pt("onEofChunk"),!e.ended){if(e.decoder){var t=e.decoder.end();t&&t.length&&(e.buffer.push(t),e.length+=e.objectMode?1:t.length)}e.ended=!0,e.sync?yb(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,ice(r)))}}function yb(r){var e=r._readableState;Pt("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Pt("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(ice,r))}function ice(r){var e=r._readableState;Pt("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(r.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,vT(r)}function QT(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(R5e,r,e))}function R5e(r,e){for(;!e.reading&&!e.ended&&(e.length1&&nce(i.pipes,r)!==-1)&&!c&&(Pt("false write response, pause",i.awaitDrain),i.awaitDrain++),t.pause())}function f(y){Pt("onerror",y),m(),r.removeListener("error",f),Zle(r,"error")===0&&zm(r,y)}x5e(r,"error",f);function h(){r.removeListener("finish",p),m()}r.once("close",h);function p(){Pt("onfinish"),r.removeListener("close",h),m()}r.once("finish",p);function m(){Pt("unpipe"),t.unpipe(r)}return r.emit("pipe",t),i.flowing||(Pt("pipe resume"),t.resume()),r};function F5e(r){return function(){var t=r._readableState;Pt("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Zle(r,"data")&&(t.flowing=!0,vT(r))}}Ut.prototype.unpipe=function(r){var e=this._readableState,t={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return r&&r!==e.pipes?this:(r||(r=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,r&&r.emit("unpipe",this,t),this);if(!r){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):r==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Pt("on readable",i.length,i.reading),i.length?yb(this):i.reading||process.nextTick(N5e,this)),t};Ut.prototype.addListener=Ut.prototype.on;Ut.prototype.removeListener=function(r,e){var t=Wm.prototype.removeListener.call(this,r,e);return r==="readable"&&process.nextTick(sce,this),t};Ut.prototype.removeAllListeners=function(r){var e=Wm.prototype.removeAllListeners.apply(this,arguments);return(r==="readable"||r===void 0)&&process.nextTick(sce,this),e};function sce(r){var e=r._readableState;e.readableListening=r.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:r.listenerCount("data")>0&&r.resume()}function N5e(r){Pt("readable nexttick read 0"),r.read(0)}Ut.prototype.resume=function(){var r=this._readableState;return r.flowing||(Pt("resume"),r.flowing=!r.readableListening,L5e(this,r)),r.paused=!1,this};function L5e(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(T5e,r,e))}function T5e(r,e){Pt("resume",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit("resume"),vT(r),e.flowing&&!e.reading&&r.read(0)}Ut.prototype.pause=function(){return Pt("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(Pt("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function vT(r){var e=r._readableState;for(Pt("flow",e.flowing);e.flowing&&r.read()!==null;);}Ut.prototype.wrap=function(r){var e=this,t=this._readableState,i=!1;r.on("end",function(){if(Pt("wrapped end"),t.decoder&&!t.ended){var o=t.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),r.on("data",function(o){if(Pt("wrapped data"),t.decoder&&(o=t.decoder.write(o)),!(t.objectMode&&o==null)&&!(!t.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,r.pause())}});for(var n in r)this[n]===void 0&&typeof r[n]=="function"&&(this[n]=function(a){return function(){return r[a].apply(r,arguments)}}(n));for(var s=0;s=e.length?(e.decoder?t=e.buffer.join(""):e.buffer.length===1?t=e.buffer.first():t=e.buffer.concat(e.length),e.buffer.clear()):t=e.buffer.consume(r,e.decoder),t}function ST(r){var e=r._readableState;Pt("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(O5e,e,r))}function O5e(r,e){if(Pt("endReadableNT",r.endEmitted,r.length),!r.endEmitted&&r.length===0&&(r.endEmitted=!0,e.readable=!1,e.emit("end"),r.autoDestroy)){var t=e._writableState;(!t||t.autoDestroy&&t.finished)&&e.destroy()}}typeof Symbol=="function"&&(Ut.from=function(r,e){return wT===void 0&&(wT=_le()),wT(Ut,r,e)});function nce(r,e){for(var t=0,i=r.length;t{"use strict";oce.exports=xA;var wb=Ul().codes,M5e=wb.ERR_METHOD_NOT_IMPLEMENTED,K5e=wb.ERR_MULTIPLE_CALLBACK,U5e=wb.ERR_TRANSFORM_ALREADY_TRANSFORMING,H5e=wb.ERR_TRANSFORM_WITH_LENGTH_0,Bb=ku();Hl()(xA,Bb);function j5e(r,e){var t=this._transformState;t.transforming=!1;var i=t.writecb;if(i===null)return this.emit("error",new K5e);t.writechunk=null,t.writecb=null,e!=null&&this.push(e),i(r);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";Ace.exports=_m;var lce=xT();Hl()(_m,lce);function _m(r){if(!(this instanceof _m))return new _m(r);lce.call(this,r)}_m.prototype._transform=function(r,e,t){t(null,r)}});var pce=w((VSt,uce)=>{"use strict";var kT;function Y5e(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var gce=Ul().codes,q5e=gce.ERR_MISSING_ARGS,J5e=gce.ERR_STREAM_DESTROYED;function fce(r){if(r)throw r}function W5e(r){return r.setHeader&&typeof r.abort=="function"}function z5e(r,e,t,i){i=Y5e(i);var n=!1;r.on("close",function(){n=!0}),kT===void 0&&(kT=db()),kT(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,W5e(r))return r.abort();if(typeof r.destroy=="function")return r.destroy();i(o||new J5e("pipe"))}}}function hce(r){r()}function _5e(r,e){return r.pipe(e)}function V5e(r){return!r.length||typeof r[r.length-1]!="function"?fce:r.pop()}function X5e(){for(var r=arguments.length,e=new Array(r),t=0;t0;return z5e(o,l,c,function(u){n||(n=u),u&&s.forEach(hce),!l&&(s.forEach(hce),i(n))})});return e.reduce(_5e)}uce.exports=X5e});var ph=w((Vs,Vm)=>{var Xm=require("stream");process.env.READABLE_STREAM==="disable"&&Xm?(Vm.exports=Xm.Readable,Object.assign(Vm.exports,Xm),Vm.exports.Stream=Xm):(Vs=Vm.exports=uT(),Vs.Stream=Xm||Vs,Vs.Readable=Vs,Vs.Writable=cT(),Vs.Duplex=ku(),Vs.Transform=xT(),Vs.PassThrough=cce(),Vs.finished=db(),Vs.pipeline=pce())});var mce=w((XSt,dce)=>{"use strict";var{Buffer:So}=require("buffer"),Cce=Symbol.for("BufferList");function mr(r){if(!(this instanceof mr))return new mr(r);mr._init.call(this,r)}mr._init=function(e){Object.defineProperty(this,Cce,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};mr.prototype._new=function(e){return new mr(e)};mr.prototype._offset=function(e){if(e===0)return[0,0];let t=0;for(let i=0;ithis.length||e<0)return;let t=this._offset(e);return this._bufs[t[0]][t[1]]};mr.prototype.slice=function(e,t){return typeof e=="number"&&e<0&&(e+=this.length),typeof t=="number"&&t<0&&(t+=this.length),this.copy(null,0,e,t)};mr.prototype.copy=function(e,t,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||So.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&t||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:So.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};mr.prototype.shallowSlice=function(e,t){if(e=e||0,t=typeof t!="number"?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return this._new();let i=this._offset(e),n=this._offset(t),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};mr.prototype.toString=function(e,t,i){return this.slice(t,i).toString(e)};mr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};mr.prototype.duplicate=function(){let e=this._new();for(let t=0;tthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=r.length){let l=o.indexOf(r,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-r.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,r))return l;s++}s=0}return-1};mr.prototype._match=function(r,e){if(this.length-r{"use strict";var PT=ph().Duplex,Z5e=Hl(),Zm=mce();function Zi(r){if(!(this instanceof Zi))return new Zi(r);if(typeof r=="function"){this._callback=r;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),r=null}Zm._init.call(this,r),PT.call(this)}Z5e(Zi,PT);Object.assign(Zi.prototype,Zm.prototype);Zi.prototype._new=function(e){return new Zi(e)};Zi.prototype._write=function(e,t,i){this._appendBuffer(e),typeof i=="function"&&i()};Zi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Zi.prototype.end=function(e){PT.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Zi.prototype._destroy=function(e,t){this._bufs.length=0,this.length=0,t(e)};Zi.prototype._isBufferList=function(e){return e instanceof Zi||e instanceof Zm||Zi.isBufferList(e)};Zi.isBufferList=Zm.isBufferList;bb.exports=Zi;bb.exports.BufferListStream=Zi;bb.exports.BufferList=Zm});var FT=w(dh=>{var $5e=Buffer.alloc,e9e="0000000000000000000",t9e="7777777777777777777",Ice="0".charCodeAt(0),yce=Buffer.from("ustar\0","binary"),r9e=Buffer.from("00","binary"),i9e=Buffer.from("ustar ","binary"),n9e=Buffer.from(" \0","binary"),s9e=parseInt("7777",8),$m=257,DT=263,o9e=function(r,e,t){return typeof r!="number"?t:(r=~~r,r>=e?e:r>=0||(r+=e,r>=0)?r:0)},a9e=function(r){switch(r){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},A9e=function(r){switch(r){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},wce=function(r,e,t,i){for(;te?t9e.slice(0,e)+" ":e9e.slice(0,e-r.length)+r+" "};function l9e(r){var e;if(r[0]===128)e=!0;else if(r[0]===255)e=!1;else return null;for(var t=[],i=r.length-1;i>0;i--){var n=r[i];e?t.push(n):t.push(255-n)}var s=0,o=t.length;for(i=0;i=Math.pow(10,t)&&t++,e+t+r};dh.decodeLongPath=function(r,e){return Ch(r,0,r.length,e)};dh.encodePax=function(r){var e="";r.name&&(e+=RT(" path="+r.name+` -`)),r.linkname&&(e+=RT(" linkpath="+r.linkname+` -`));var t=r.pax;if(t)for(var i in t)e+=RT(" "+i+"="+t[i]+` -`);return Buffer.from(e)};dh.decodePax=function(r){for(var e={};r.length;){for(var t=0;t100;){var n=t.indexOf("/");if(n===-1)return null;i+=i?"/"+t.slice(0,n):t.slice(0,n),t=t.slice(n+1)}return Buffer.byteLength(t)>100||Buffer.byteLength(i)>155||r.linkname&&Buffer.byteLength(r.linkname)>100?null:(e.write(t),e.write(Jl(r.mode&s9e,6),100),e.write(Jl(r.uid,6),108),e.write(Jl(r.gid,6),116),e.write(Jl(r.size,11),124),e.write(Jl(r.mtime.getTime()/1e3|0,11),136),e[156]=Ice+A9e(r.type),r.linkname&&e.write(r.linkname,157),yce.copy(e,$m),r9e.copy(e,DT),r.uname&&e.write(r.uname,265),r.gname&&e.write(r.gname,297),e.write(Jl(r.devmajor||0,6),329),e.write(Jl(r.devminor||0,6),337),i&&e.write(i,345),e.write(Jl(Bce(e),6),148),e)};dh.decode=function(r,e,t){var i=r[156]===0?0:r[156]-Ice,n=Ch(r,0,100,e),s=Wl(r,100,8),o=Wl(r,108,8),a=Wl(r,116,8),l=Wl(r,124,12),c=Wl(r,136,12),u=a9e(i),g=r[157]===0?null:Ch(r,157,100,e),f=Ch(r,265,32),h=Ch(r,297,32),p=Wl(r,329,8),m=Wl(r,337,8),y=Bce(r);if(y===8*32)return null;if(y!==Wl(r,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(yce.compare(r,$m,$m+6)===0)r[345]&&(n=Ch(r,345,155,e)+"/"+n);else if(!(i9e.compare(r,$m,$m+6)===0&&n9e.compare(r,DT,DT+2)===0)){if(!t)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:m}}});var Pce=w((evt,bce)=>{var Qce=require("util"),c9e=Ece(),eE=FT(),Sce=ph().Writable,vce=ph().PassThrough,xce=function(){},kce=function(r){return r&=511,r&&512-r},u9e=function(r,e){var t=new Qb(r,e);return t.end(),t},g9e=function(r,e){return e.path&&(r.name=e.path),e.linkpath&&(r.linkname=e.linkpath),e.size&&(r.size=parseInt(e.size,10)),r.pax=e,r},Qb=function(r,e){this._parent=r,this.offset=e,vce.call(this,{autoDestroy:!1})};Qce.inherits(Qb,vce);Qb.prototype.destroy=function(r){this._parent.destroy(r)};var kA=function(r){if(!(this instanceof kA))return new kA(r);Sce.call(this,r),r=r||{},this._offset=0,this._buffer=c9e(),this._missing=0,this._partial=!1,this._onparse=xce,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,t=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=kce(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(kce(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=eE.decodePax(t.slice(0,f)),t.consume(f),s()},l=function(){var f=e._header.size;e._pax=eE.decodePax(t.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),t.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=eE.decode(t.slice(0,512),r.filenameEncoding,r.allowUnknownFormat)}catch(p){e.emit("error",p)}if(t.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=g9e(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,u9e(e,f),n);return}e._stream=new Qb(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};Qce.inherits(kA,Sce);kA.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.emit("close"))};kA.prototype._parse=function(r,e){this._destroyed||(this._offset+=r,this._missing=r,e===this._onheader&&(this._partial=!1),this._onparse=e)};kA.prototype._continue=function(){if(!this._destroyed){var r=this._cb;this._cb=xce,this._overflow?this._write(this._overflow,void 0,r):r()}};kA.prototype._write=function(r,e,t){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(r.length&&(this._partial=!0),r.lengths&&(o=r.slice(s),r=r.slice(0,s)),i?i.end(r):n.append(r),this._overflow=o,this._onparse()}};kA.prototype._final=function(r){if(this._partial)return this.destroy(new Error("Unexpected end of data"));r()};bce.exports=kA});var Rce=w((tvt,Dce)=>{Dce.exports=require("fs").constants||require("constants")});var Oce=w((rvt,Fce)=>{var mh=Rce(),Nce=Mk(),Sb=Hl(),f9e=Buffer.alloc,Lce=ph().Readable,Eh=ph().Writable,h9e=require("string_decoder").StringDecoder,vb=FT(),p9e=parseInt("755",8),d9e=parseInt("644",8),Tce=f9e(1024),NT=function(){},LT=function(r,e){e&=511,e&&r.push(Tce.slice(0,512-e))};function C9e(r){switch(r&mh.S_IFMT){case mh.S_IFBLK:return"block-device";case mh.S_IFCHR:return"character-device";case mh.S_IFDIR:return"directory";case mh.S_IFIFO:return"fifo";case mh.S_IFLNK:return"symlink"}return"file"}var xb=function(r){Eh.call(this),this.written=0,this._to=r,this._destroyed=!1};Sb(xb,Eh);xb.prototype._write=function(r,e,t){if(this.written+=r.length,this._to.push(r))return t();this._to._drain=t};xb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var kb=function(){Eh.call(this),this.linkname="",this._decoder=new h9e("utf-8"),this._destroyed=!1};Sb(kb,Eh);kb.prototype._write=function(r,e,t){this.linkname+=this._decoder.write(r),t()};kb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var tE=function(){Eh.call(this),this._destroyed=!1};Sb(tE,Eh);tE.prototype._write=function(r,e,t){t(new Error("No body allowed for this entry"))};tE.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Ia=function(r){if(!(this instanceof Ia))return new Ia(r);Lce.call(this,r),this._drain=NT,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Sb(Ia,Lce);Ia.prototype.entry=function(r,e,t){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(t=e,e=null),t||(t=NT);var i=this;if((!r.size||r.type==="symlink")&&(r.size=0),r.type||(r.type=C9e(r.mode)),r.mode||(r.mode=r.type==="directory"?p9e:d9e),r.uid||(r.uid=0),r.gid||(r.gid=0),r.mtime||(r.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){r.size=e.length,this._encode(r);var n=this.push(e);return LT(i,r.size),n?process.nextTick(t):this._drain=t,new tE}if(r.type==="symlink"&&!r.linkname){var s=new kb;return Nce(s,function(a){if(a)return i.destroy(),t(a);r.linkname=s.linkname,i._encode(r),t()}),s}if(this._encode(r),r.type!=="file"&&r.type!=="contiguous-file")return process.nextTick(t),new tE;var o=new xb(this);return this._stream=o,Nce(o,function(a){if(i._stream=null,a)return i.destroy(),t(a);if(o.written!==r.size)return i.destroy(),t(new Error("size mismatch"));LT(i,r.size),i._finalizing&&i.finalize(),t()}),o}};Ia.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(Tce),this.push(null))};Ia.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Ia.prototype._encode=function(r){if(!r.pax){var e=vb.encode(r);if(e){this.push(e);return}}this._encodePax(r)};Ia.prototype._encodePax=function(r){var e=vb.encodePax({name:r.name,linkname:r.linkname,pax:r.pax}),t={name:"PaxHeader",mode:r.mode,uid:r.uid,gid:r.gid,size:e.length,mtime:r.mtime,type:"pax-header",linkname:r.linkname&&"PaxHeader",uname:r.uname,gname:r.gname,devmajor:r.devmajor,devminor:r.devminor};this.push(vb.encode(t)),this.push(e),LT(this,e.length),t.size=r.size,t.type=r.type,this.push(vb.encode(t))};Ia.prototype._read=function(r){var e=this._drain;this._drain=NT,e()};Fce.exports=Ia});var Mce=w(TT=>{TT.extract=Pce();TT.pack=Oce()});var Xce=w((Qvt,Wce)=>{"use strict";var Ih=class{constructor(e,t,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=t||{},this.__providers=_ce(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return jT(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,t=this){for(let[i,n]of this.entries())e.call(t,n,i,this)}toJSON(){let e={};return this.forEach((t,i)=>{e[i]=t}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let t=e||this.__opts.other;if(t){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(t):P9e(n);for(let[o,a]of s)t(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Ih(this.__specs,this.__opts,_ce(this.__providers).concat(e)),zce)}};try{let r=require("util");Ih.prototype[r.inspect.custom]=function(e,t){return this[Symbol.toStringTag]+" "+r.inspect(this.toJSON(),t)}}catch(r){}function D9e(r){throw Object.assign(new Error(`invalid config key requested: ${r}`),{code:"EBADKEY"})}function jT(r,e,t){let i=r.__specs[e];if(t&&!i&&(!r.__opts.other||!r.__opts.other(e)))D9e(e);else{i||(i={});let n;for(let s of r.__providers){if(n=Vce(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=Vce(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(r):i.default:n}}function Vce(r,e){let t;return e.__isFiggyPudding?t=jT(e,r,!1):typeof e.get=="function"?t=e.get(r):t=e[r],t}var zce={has(r,e){return e in r.__specs&&jT(r,e,!1)!==void 0},ownKeys(r){return Object.keys(r.__specs)},get(r,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Ih.prototype?r[e]:r.get(e)},set(r,e,t){if(typeof e=="symbol"||e.slice(0,2)==="__")return r[e]=t,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};Wce.exports=R9e;function R9e(r,e){function t(...i){return new Proxy(new Ih(r,e,i),zce)}return t}function _ce(r){let e=[];return r.forEach(t=>e.unshift(t)),e}function P9e(r){return Object.keys(r).map(e=>[e,r[e]])}});var eue=w((Svt,ya)=>{"use strict";var iE=require("crypto"),F9e=Xce(),N9e=require("stream").Transform,Zce=["sha256","sha384","sha512"],L9e=/^[a-z0-9+/]+(?:=?=?)$/i,T9e=/^([^-]+)-([^?]+)([?\S*]*)$/,O9e=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,M9e=/^[\x21-\x7E]+$/,Cn=F9e({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>K9e},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),Fu=class{get isHash(){return!0}constructor(e,t){t=Cn(t);let i=!!t.strict;this.source=e.trim();let n=this.source.match(i?O9e:T9e);if(!n||i&&!Zce.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=Cn(e),e.strict&&!(Zce.some(i=>i===this.algorithm)&&this.digest.match(L9e)&&(this.options||[]).every(i=>i.match(M9e))))return"";let t=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${t}`}},yh=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=Cn(e);let t=e.sep||" ";return e.strict&&(t=t.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>Fu.prototype.toString.call(n,e)).filter(n=>n.length).join(t)).filter(i=>i.length).join(t)}concat(e,t){t=Cn(t);let i=typeof e=="string"?e:nE(e,t);return wa(`${this.toString(t)} ${i}`,t)}hexDigest(){return wa(this,{single:!0}).hexDigest()}match(e,t){t=Cn(t);let i=wa(e,t),n=i.pickAlgorithm(t);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=Cn(e);let t=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>t(n,s)||n)}};ya.exports.parse=wa;function wa(r,e){if(e=Cn(e),typeof r=="string")return GT(r,e);if(r.algorithm&&r.digest){let t=new yh;return t[r.algorithm]=[r],GT(nE(t,e),e)}else return GT(nE(r,e),e)}function GT(r,e){return e.single?new Fu(r,e):r.trim().split(/\s+/).reduce((t,i)=>{let n=new Fu(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;t[s]||(t[s]=[]),t[s].push(n)}return t},new yh)}ya.exports.stringify=nE;function nE(r,e){return e=Cn(e),r.algorithm&&r.digest?Fu.prototype.toString.call(r,e):typeof r=="string"?nE(wa(r,e),e):yh.prototype.toString.call(r,e)}ya.exports.fromHex=U9e;function U9e(r,e,t){t=Cn(t);let i=t.options&&t.options.length?`?${t.options.join("?")}`:"";return wa(`${e}-${Buffer.from(r,"hex").toString("base64")}${i}`,t)}ya.exports.fromData=H9e;function H9e(r,e){e=Cn(e);let t=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return t.reduce((n,s)=>{let o=iE.createHash(s).update(r).digest("base64"),a=new Fu(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new yh)}ya.exports.fromStream=j9e;function j9e(r,e){e=Cn(e);let t=e.Promise||Promise,i=YT(e);return new t((n,s)=>{r.pipe(i),r.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}ya.exports.checkData=G9e;function G9e(r,e,t){if(t=Cn(t),e=wa(e,t),!Object.keys(e).length){if(t.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(t),n=iE.createHash(i).update(r).digest("base64"),s=wa({algorithm:i,digest:n}),o=s.match(e,t);if(o||!t.error)return o;if(typeof t.size=="number"&&r.length!==t.size){let a=new Error(`data size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${r.length}`);throw a.code="EBADSIZE",a.found=r.length,a.expected=t.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${r.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}ya.exports.checkStream=Y9e;function Y9e(r,e,t){t=Cn(t);let i=t.Promise||Promise,n=YT(t.concat({integrity:e}));return new i((s,o)=>{r.pipe(n),r.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}ya.exports.integrityStream=YT;function YT(r){r=Cn(r);let e=r.integrity&&wa(r.integrity,r),t=e&&Object.keys(e).length,i=t&&e.pickAlgorithm(r),n=t&&e[i],s=Array.from(new Set(r.algorithms.concat(i?[i]:[]))),o=s.map(iE.createHash),a=0,l=new N9e({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=r.options&&r.options.length?`?${r.options.join("?")}`:"",u=wa(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),r),g=t&&u.match(e,r);if(typeof r.size=="number"&&a!==r.size){let f=new Error(`stream size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=r.size,f.sri=e,l.emit("error",f)}else if(r.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}ya.exports.create=q9e;function q9e(r){r=Cn(r);let e=r.algorithms,t=r.options.length?`?${r.options.join("?")}`:"",i=e.map(iE.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new Fu(`${a}-${l}${t}`,r);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new yh)}}}var J9e=new Set(iE.getHashes()),$ce=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(r=>J9e.has(r));function K9e(r,e){return $ce.indexOf(r.toLowerCase())>=$ce.indexOf(e.toLowerCase())?r:e}});var EC={};ft(EC,{BuildType:()=>cs,Cache:()=>Nt,Configuration:()=>ye,DEFAULT_LOCK_FILENAME:()=>fk,DEFAULT_RC_FILENAME:()=>gk,FormatType:()=>Ri,InstallMode:()=>Ci,LightReport:()=>pA,LinkType:()=>Qt,Manifest:()=>At,MessageName:()=>X,MultiFetcher:()=>yd,PackageExtensionStatus:()=>qi,PackageExtensionType:()=>wi,Project:()=>ze,ProjectLookup:()=>ul,Report:()=>Ji,ReportError:()=>ct,SettingsType:()=>Ie,StreamReport:()=>Je,TAG_REGEXP:()=>zg,TelemetryManager:()=>mC,ThrowReport:()=>di,VirtualFetcher:()=>Bd,Workspace:()=>CC,WorkspaceFetcher:()=>bd,WorkspaceResolver:()=>oi,YarnVersion:()=>Ur,execUtils:()=>Nr,folderUtils:()=>sk,formatUtils:()=>ae,hashUtils:()=>Dn,httpUtils:()=>ir,miscUtils:()=>Se,nodeUtils:()=>Vg,parseMessageName:()=>II,scriptUtils:()=>Zt,semverUtils:()=>Wt,stringifyMessageName:()=>_A,structUtils:()=>P,tgzUtils:()=>Bi,treeUtils:()=>ls});var Nr={};ft(Nr,{EndStrategy:()=>ss,ExecError:()=>Ik,PipeError:()=>ww,execvp:()=>pve,pipevp:()=>ra});var Zh={};ft(Zh,{AliasFS:()=>Na,CwdFS:()=>_t,DEFAULT_COMPRESSION_LEVEL:()=>lc,FakeFS:()=>YA,Filename:()=>kt,JailFS:()=>La,LazyFS:()=>_h,LinkStrategy:()=>Gh,NoFS:()=>jE,NodeFS:()=>ar,PortablePath:()=>Me,PosixFS:()=>Vh,ProxiedFS:()=>Qi,VirtualFS:()=>Wr,ZipFS:()=>li,ZipOpenFS:()=>Is,constants:()=>Rr,extendFs:()=>WE,normalizeLineEndings:()=>sc,npath:()=>H,opendir:()=>KE,patchFs:()=>pQ,ppath:()=>k,statUtils:()=>rQ,toFilename:()=>Jr,xfs:()=>K});var Rr={};ft(Rr,{SAFE_TIME:()=>tQ,S_IFDIR:()=>Da,S_IFLNK:()=>Fa,S_IFMT:()=>_n,S_IFREG:()=>Ra});var _n=61440,Da=16384,Ra=32768,Fa=40960,tQ=456789e3;var rQ={};ft(rQ,{BigIntStatsEntry:()=>Uh,DEFAULT_MODE:()=>Kh,DirEntry:()=>KO,StatEntry:()=>jA,areStatsEqual:()=>nQ,clearStats:()=>RE,convertToBigIntStats:()=>FE,makeDefaultStats:()=>Hh,makeEmptyStats:()=>fge});var iQ=ge(require("util"));var Kh=Ra|420,KO=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},jA=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Kh;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},Uh=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Kh);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(_n))===BigInt(Da)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(_n))===BigInt(Ra)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(_n))===BigInt(Fa)}};function Hh(){return new jA}function fge(){return RE(Hh())}function RE(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(r,e)){let t=r[e];typeof t=="number"?r[e]=0:typeof t=="bigint"?r[e]=BigInt(0):iQ.types.isDate(t)&&(r[e]=new Date(0))}return r}function FE(r){let e=new Uh;for(let t in r)if(Object.prototype.hasOwnProperty.call(r,t)){let i=r[t];typeof i=="number"?e[t]=BigInt(i):iQ.types.isDate(i)&&(e[t]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function nQ(r,e){if(r.atimeMs!==e.atimeMs||r.birthtimeMs!==e.birthtimeMs||r.blksize!==e.blksize||r.blocks!==e.blocks||r.ctimeMs!==e.ctimeMs||r.dev!==e.dev||r.gid!==e.gid||r.ino!==e.ino||r.isBlockDevice()!==e.isBlockDevice()||r.isCharacterDevice()!==e.isCharacterDevice()||r.isDirectory()!==e.isDirectory()||r.isFIFO()!==e.isFIFO()||r.isFile()!==e.isFile()||r.isSocket()!==e.isSocket()||r.isSymbolicLink()!==e.isSymbolicLink()||r.mode!==e.mode||r.mtimeMs!==e.mtimeMs||r.nlink!==e.nlink||r.rdev!==e.rdev||r.size!==e.size||r.uid!==e.uid)return!1;let t=r,i=e;return!(t.atimeNs!==i.atimeNs||t.mtimeNs!==i.mtimeNs||t.ctimeNs!==i.ctimeNs||t.birthtimeNs!==i.birthtimeNs)}var LE=ge(require("fs"));var jh=ge(require("path")),UO;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(UO||(UO={}));var Me={root:"/",dot:"."},kt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},H=Object.create(jh.default),k=Object.create(jh.default.posix);H.cwd=()=>process.cwd();k.cwd=()=>sQ(process.cwd());k.resolve=(...r)=>r.length>0&&k.isAbsolute(r[0])?jh.default.posix.resolve(...r):jh.default.posix.resolve(k.cwd(),...r);var HO=function(r,e,t){return e=r.normalize(e),t=r.normalize(t),e===t?".":(e.endsWith(r.sep)||(e=e+r.sep),t.startsWith(e)?t.slice(e.length):null)};H.fromPortablePath=jO;H.toPortablePath=sQ;H.contains=(r,e)=>HO(H,r,e);k.contains=(r,e)=>HO(k,r,e);var hge=/^([a-zA-Z]:.*)$/,pge=/^\/\/(\.\/)?(.*)$/,dge=/^\/([a-zA-Z]:.*)$/,Cge=/^\/unc\/(\.dot\/)?(.*)$/;function jO(r){if(process.platform!=="win32")return r;let e,t;if(e=r.match(dge))r=e[1];else if(t=r.match(Cge))r=`\\\\${t[1]?".\\":""}${t[2]}`;else return r;return r.replace(/\//g,"\\")}function sQ(r){if(process.platform!=="win32")return r;r=r.replace(/\\/g,"/");let e,t;return(e=r.match(hge))?r=`/${e[1]}`:(t=r.match(pge))&&(r=`/unc/${t[1]?".dot/":""}${t[2]}`),r}function NE(r,e){return r===H?jO(e):sQ(e)}function Jr(r){if(H.parse(r).dir!==""||k.parse(r).dir!=="")throw new Error(`Invalid filename: "${r}"`);return r}var TE=new Date(tQ*1e3),Gh;(function(t){t.Allow="allow",t.ReadOnly="readOnly"})(Gh||(Gh={}));async function GO(r,e,t,i,n){let s=r.pathUtils.normalize(e),o=t.pathUtils.normalize(i),a=[],l=[],{atime:c,mtime:u}=n.stableTime?{atime:TE,mtime:TE}:await t.lstatPromise(o);await r.mkdirpPromise(r.pathUtils.dirname(e),{utimes:[c,u]});let g=typeof r.lutimesPromise=="function"?r.lutimesPromise.bind(r):r.utimesPromise.bind(r);await oQ(a,l,g,r,s,t,o,te(N({},n),{didParentExist:!0}));for(let f of a)await f();await Promise.all(l.map(f=>f()))}async function oQ(r,e,t,i,n,s,o,a){var h,p;let l=a.didParentExist?await mge(i,n):null,c=await s.lstatPromise(o),{atime:u,mtime:g}=a.stableTime?{atime:TE,mtime:TE}:c,f;switch(!0){case c.isDirectory():f=await Ege(r,e,t,i,n,l,s,o,c,a);break;case c.isFile():f=await Ige(r,e,t,i,n,l,s,o,c,a);break;case c.isSymbolicLink():f=await yge(r,e,t,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(f||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==g.getTime()||((p=l==null?void 0:l.atime)==null?void 0:p.getTime())!==u.getTime())&&(e.push(()=>t(n,u,g)),f=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),f=!0),f}async function mge(r,e){try{return await r.lstatPromise(e)}catch(t){return null}}async function Ege(r,e,t,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(r.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!=="EEXIST")throw h}}),u=!0);let g=await o.readdirPromise(a),f=c.didParentExist&&!s?te(N({},c),{didParentExist:!1}):c;if(c.stableSort)for(let h of g.sort())await oQ(r,e,t,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),f)&&(u=!0);else(await Promise.all(g.map(async p=>{await oQ(r,e,t,i,i.pathUtils.join(n,p),o,o.pathUtils.join(a,p),f)}))).some(p=>p)&&(u=!0);return u}var aQ=new WeakMap;function AQ(r,e,t,i,n){return async()=>{await r.linkPromise(t,e),n===Gh.ReadOnly&&(i.mode&=~146,await r.chmodPromise(e,i.mode))}}function wge(r,e,t,i,n){let s=aQ.get(r);return typeof s=="undefined"?async()=>{try{await r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE),aQ.set(r,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")aQ.set(r,!1),await AQ(r,e,t,i,n)();else throw o}}:s?async()=>r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE):AQ(r,e,t,i,n)}async function Ige(r,e,t,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?wge(i,n,a,l,u):async()=>i.copyFilePromise(a,n,LE.default.constants.COPYFILE_FICLONE):u!==null?AQ(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return r.push(async()=>g()),!0}async function yge(r,e,t,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;return r.push(async()=>{await i.symlinkPromise(NE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function Es(r,e){return Object.assign(new Error(`${r}: ${e}`),{code:r})}function OE(r){return Es("EBUSY",r)}function Yh(r,e){return Es("ENOSYS",`${r}, ${e}`)}function GA(r){return Es("EINVAL",`invalid argument, ${r}`)}function Ai(r){return Es("EBADF",`bad file descriptor, ${r}`)}function io(r){return Es("ENOENT",`no such file or directory, ${r}`)}function Ro(r){return Es("ENOTDIR",`not a directory, ${r}`)}function qh(r){return Es("EISDIR",`illegal operation on a directory, ${r}`)}function ME(r){return Es("EEXIST",`file already exists, ${r}`)}function In(r){return Es("EROFS",`read-only filesystem, ${r}`)}function YO(r){return Es("ENOTEMPTY",`directory not empty, ${r}`)}function qO(r){return Es("EOPNOTSUPP",`operation not supported, ${r}`)}function JO(){return Es("ERR_DIR_CLOSED","Directory handle was closed")}var lQ=class extends Error{constructor(e,t){super(e);this.name="Libzip Error",this.code=t}};var WO=class{constructor(e,t,i={}){this.path=e;this.nextDirent=t;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw JO()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let t=this.readSync();return typeof e!="undefined"?e(null,t):Promise.resolve(t)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,t;this.throwIfClosed(),(t=(e=this.opts).onClose)==null||t.call(e),this.closed=!0}};function KE(r,e,t,i){let n=()=>{let s=t.shift();return typeof s=="undefined"?null:Object.assign(r.statSync(r.pathUtils.join(e,s)),{name:s})};return new WO(e,n,i)}var zO=ge(require("os"));var YA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:t=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(t)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:t=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(t){let s=await this.readdirPromise(e);await Promise.all(s.map(o=>this.removePromise(this.pathUtils.resolve(e,o))))}for(let s=0;s<=i;s++)try{await this.rmdirPromise(e);break}catch(o){if(o.code!=="EBUSY"&&o.code!=="ENOTEMPTY")throw o;ssetTimeout(a,s*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:t=!0}={}){let i;try{i=this.lstatSync(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(i.isDirectory()){if(t)for(let n of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,n));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{await this.mkdirPromise(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&await this.chmodPromise(a,t),i!=null)await this.utimesPromise(a,i[0],i[1]);else{let l=await this.statPromise(this.pathUtils.dirname(a));await this.utimesPromise(a,l.atime,l.mtime)}}}return s}mkdirpSync(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{this.mkdirSync(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&this.chmodSync(a,t),i!=null)this.utimesSync(a,i[0],i[1]);else{let l=this.statSync(this.pathUtils.dirname(a));this.utimesSync(a,l.atime,l.mtime)}}}return s}async copyPromise(e,t,{baseFs:i=this,overwrite:n=!0,stableSort:s=!1,stableTime:o=!1,linkStrategy:a=null}={}){return await GO(this,e,i,t,{overwrite:n,stableSort:s,stableTime:o,linkStrategy:a})}copySync(e,t,{baseFs:i=this,overwrite:n=!0}={}){let s=i.lstatSync(t),o=this.existsSync(e);if(s.isDirectory()){this.mkdirpSync(e);let l=i.readdirSync(t);for(let c of l)this.copySync(this.pathUtils.join(e,c),i.pathUtils.join(t,c),{baseFs:i,overwrite:n})}else if(s.isFile()){if(!o||n){o&&this.removeSync(e);let l=i.readFileSync(t);this.writeFileSync(e,l)}}else if(s.isSymbolicLink()){if(!o||n){o&&this.removeSync(e);let l=i.readlinkSync(t);this.symlinkSync(NE(this.pathUtils,l),e)}}else throw new Error(`Unsupported file type (file: ${t}, mode: 0o${s.mode.toString(8).padStart(6,"0")})`);let a=s.mode&511;this.chmodSync(e,a)}async changeFilePromise(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferPromise(e,t,i):this.changeFileTextPromise(e,t,i)}async changeFileBufferPromise(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=await this.readFilePromise(e)}catch(s){}Buffer.compare(n,t)!==0&&await this.writeFilePromise(e,t,{mode:i})}async changeFileTextPromise(e,t,{automaticNewlines:i,mode:n}={}){let s="";try{s=await this.readFilePromise(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&await this.writeFilePromise(e,o,{mode:n})}changeFileSync(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferSync(e,t,i):this.changeFileTextSync(e,t,i)}changeFileBufferSync(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=this.readFileSync(e)}catch(s){}Buffer.compare(n,t)!==0&&this.writeFileSync(e,t,{mode:i})}changeFileTextSync(e,t,{automaticNewlines:i=!1,mode:n}={}){let s="";try{s=this.readFileSync(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&this.writeFileSync(e,o,{mode:n})}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(i){if(i.code==="EXDEV")await this.copyPromise(t,e),await this.removePromise(e);else throw i}}moveSync(e,t){try{this.renameSync(e,t)}catch(i){if(i.code==="EXDEV")this.copySync(t,e),this.removeSync(e);else throw i}}async lockPromise(e,t){let i=`${e}.flock`,n=1e3/60,s=Date.now(),o=null,a=async()=>{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let t=await this.readFilePromise(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let t=this.readFileSync(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,`${JSON.stringify(t,null,2)} -`)}writeJsonSync(e,t){return this.writeFileSync(e,`${JSON.stringify(t,null,2)} -`)}async preserveTimePromise(e,t){let i=await this.lstatPromise(e),n=await t();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,t){let i=this.lstatSync(e),n=t();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},oc=class extends YA{constructor(){super(k)}};function Bge(r){let e=r.match(/\r?\n/g);if(e===null)return zO.EOL;let t=e.filter(n=>n===`\r -`).length,i=e.length-t;return t>i?`\r -`:` -`}function sc(r,e){return e.replace(/\r?\n/g,Bge(r))}var zu=ge(require("fs")),cQ=ge(require("stream")),ZO=ge(require("util")),uQ=ge(require("zlib"));var _O=ge(require("fs"));var ar=class extends oc{constructor(e=_O.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Me.root}resolve(e){return k.resolve(e)}async openPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.open(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}openSync(e,t,i){return this.realFs.openSync(H.fromPortablePath(e),t,i)}async opendirPromise(e,t){return await new Promise((i,n)=>{typeof t!="undefined"?this.realFs.opendir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.opendir(H.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,t){let i=typeof t!="undefined"?this.realFs.opendirSync(H.fromPortablePath(e),t):this.realFs.opendirSync(H.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,t,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,t,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,t,i,n,s){return this.realFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return await new Promise((o,a)=>typeof t=="string"?this.realFs.write(e,t,i,this.makeCallback(o,a)):this.realFs.write(e,t,i,n,s,this.makeCallback(o,a)))}writeSync(e,t,i,n,s){return typeof t=="string"?this.realFs.writeSync(e,t,i):this.realFs.writeSync(e,t,i,n,s)}async closePromise(e){await new Promise((t,i)=>{this.realFs.close(e,this.makeCallback(t,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createReadStream(i,t)}createWriteStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createWriteStream(i,t)}async realpathPromise(e){return await new Promise((t,i)=>{this.realFs.realpath(H.fromPortablePath(e),{},this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}realpathSync(e){return H.toPortablePath(this.realFs.realpathSync(H.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(t=>{this.realFs.exists(H.fromPortablePath(e),t)})}accessSync(e,t){return this.realFs.accessSync(H.fromPortablePath(e),t)}async accessPromise(e,t){return await new Promise((i,n)=>{this.realFs.access(H.fromPortablePath(e),t,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(H.fromPortablePath(e))}async statPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.stat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.stat(H.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,t){return t?this.realFs.statSync(H.fromPortablePath(e),t):this.realFs.statSync(H.fromPortablePath(e))}async fstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.fstat(e,t,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,t){return t?this.realFs.fstatSync(e,t):this.realFs.fstatSync(e)}async lstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.lstat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.lstat(H.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,t){return t?this.realFs.lstatSync(H.fromPortablePath(e),t):this.realFs.lstatSync(H.fromPortablePath(e))}async fchmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.fchmod(e,t,this.makeCallback(i,n))})}fchmodSync(e,t){return this.realFs.fchmodSync(e,t)}async chmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.chmod(H.fromPortablePath(e),t,this.makeCallback(i,n))})}chmodSync(e,t){return this.realFs.chmodSync(H.fromPortablePath(e),t)}async chownPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.chown(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}chownSync(e,t,i){return this.realFs.chownSync(H.fromPortablePath(e),t,i)}async renamePromise(e,t){return await new Promise((i,n)=>{this.realFs.rename(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}renameSync(e,t){return this.realFs.renameSync(H.fromPortablePath(e),H.fromPortablePath(t))}async copyFilePromise(e,t,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(H.fromPortablePath(e),H.fromPortablePath(t),i,this.makeCallback(n,s))})}copyFileSync(e,t,i=0){return this.realFs.copyFileSync(H.fromPortablePath(e),H.fromPortablePath(t),i)}async appendFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFile(o,t,i,this.makeCallback(n,s)):this.realFs.appendFile(o,t,this.makeCallback(n,s))})}appendFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,t,i):this.realFs.appendFileSync(n,t)}async writeFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFile(o,t,i,this.makeCallback(n,s)):this.realFs.writeFile(o,t,this.makeCallback(n,s))})}writeFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,t,i):this.realFs.writeFileSync(n,t)}async unlinkPromise(e){return await new Promise((t,i)=>{this.realFs.unlink(H.fromPortablePath(e),this.makeCallback(t,i))})}unlinkSync(e){return this.realFs.unlinkSync(H.fromPortablePath(e))}async utimesPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.utimes(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}utimesSync(e,t,i){this.realFs.utimesSync(H.fromPortablePath(e),t,i)}async lutimesPromiseImpl(e,t,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,H.fromPortablePath(e),t,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,t,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,H.fromPortablePath(e),t,i)}async mkdirPromise(e,t){return await new Promise((i,n)=>{this.realFs.mkdir(H.fromPortablePath(e),t,this.makeCallback(i,n))})}mkdirSync(e,t){return this.realFs.mkdirSync(H.fromPortablePath(e),t)}async rmdirPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.rmdir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.rmdir(H.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,t){return this.realFs.rmdirSync(H.fromPortablePath(e),t)}async linkPromise(e,t){return await new Promise((i,n)=>{this.realFs.link(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}linkSync(e,t){return this.realFs.linkSync(H.fromPortablePath(e),H.fromPortablePath(t))}async symlinkPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.symlink(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i,this.makeCallback(n,s))})}symlinkSync(e,t,i){return this.realFs.symlinkSync(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i)}async readFilePromise(e,t){return await new Promise((i,n)=>{let s=typeof e=="string"?H.fromPortablePath(e):e;this.realFs.readFile(s,t,this.makeCallback(i,n))})}readFileSync(e,t){let i=typeof e=="string"?H.fromPortablePath(e):e;return this.realFs.readFileSync(i,t)}async readdirPromise(e,t){return await new Promise((i,n)=>{(t==null?void 0:t.withFileTypes)?this.realFs.readdir(H.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(H.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,t){return(t==null?void 0:t.withFileTypes)?this.realFs.readdirSync(H.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(H.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((t,i)=>{this.realFs.readlink(H.fromPortablePath(e),this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}readlinkSync(e){return H.toPortablePath(this.realFs.readlinkSync(H.fromPortablePath(e)))}async truncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.truncate(H.fromPortablePath(e),t,this.makeCallback(i,n))})}truncateSync(e,t){return this.realFs.truncateSync(H.fromPortablePath(e),t)}async ftruncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.ftruncate(e,t,this.makeCallback(i,n))})}ftruncateSync(e,t){return this.realFs.ftruncateSync(e,t)}watch(e,t,i){return this.realFs.watch(H.fromPortablePath(e),t,i)}watchFile(e,t,i){return this.realFs.watchFile(H.fromPortablePath(e),t,i)}unwatchFile(e,t){return this.realFs.unwatchFile(H.fromPortablePath(e),t)}makeCallback(e,t){return(i,n)=>{i?t(i):e(n)}}};var VO=ge(require("events"));var ac;(function(t){t.Change="change",t.Stop="stop"})(ac||(ac={}));var Ac;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(Ac||(Ac={}));function XO(r,e){if(r!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${r}'`)}var Jh=class extends VO.EventEmitter{constructor(e,t,{bigint:i=!1}={}){super();this.status=Ac.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=t,this.bigint=i,this.lastStats=this.stat()}static create(e,t,i){let n=new Jh(e,t,i);return n.start(),n}start(){XO(this.status,Ac.Ready),this.status=Ac.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(ac.Change,this.lastStats,this.lastStats)},3)}stop(){XO(this.status,Ac.Running),this.status=Ac.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(ac.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let t=this.bigint?new Uh:new jA;return RE(t)}}makeInterval(e){let t=setInterval(()=>{let i=this.stat(),n=this.lastStats;nQ(i,n)||(this.lastStats=i,this.emit(ac.Change,i,n))},e.interval);return e.persistent?t:t.unref()}registerChangeListener(e,t){this.addListener(ac.Change,e),this.changeListeners.set(e,this.makeInterval(t))}unregisterChangeListener(e){this.removeListener(ac.Change,e);let t=this.changeListeners.get(e);typeof t!="undefined"&&clearInterval(t),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var UE=new WeakMap;function HE(r,e,t,i){let n,s,o,a;switch(typeof t){case"function":n=!1,s=!0,o=5007,a=t;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=t),a=i;break}let l=UE.get(r);typeof l=="undefined"&&UE.set(r,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=Jh.create(r,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function Wh(r,e,t){let i=UE.get(r);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof t=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(t),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function zh(r){let e=UE.get(r);if(typeof e!="undefined")for(let t of e.keys())Wh(r,t)}var lc="mixed";function bge(r){if(typeof r=="string"&&String(+r)===r)return+r;if(Number.isFinite(r))return r<0?Date.now()/1e3:r;if(ZO.types.isDate(r))return r.getTime()/1e3;throw new Error("Invalid time")}function $O(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var li=class extends oc{constructor(e,t){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=t.libzip;let i=t;if(this.level=typeof i.level!="undefined"?i.level:lc,e!=null||(e=$O()),typeof e=="string"){let{baseFs:o=new ar}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(t.stats)this.stats=t.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Hh();else throw o}else this.stats=Hh();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),t.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(H.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Me.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(t,t+e);return Buffer.from(n)}finally{this.libzip.free(t)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw OE("archive closed, close");zh(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===Kh?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,$O(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return k.resolve(Me.root,e)}async openPromise(e,t,i){return this.openSync(e,t,i)}openSync(e,t,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,t){return this.opendirSync(e,t)}opendirSync(e,t={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return KE(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,t,i,n,s){return this.readSync(e,t,i,n,s)}readSync(e,t,i=0,n=t.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw Ai("read");let a=s===-1||s===null?o.cursor:s,l=this.readFileSync(o.p);l.copy(t,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,t,i,n,s){return typeof t=="string"?this.writeSync(e,t,s):this.writeSync(e,t,i,n,s)}writeSync(e,t,i,n,s){throw typeof this.fds.get(e)=="undefined"?Ai("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw Ai("read");this.fds.delete(e)}createReadStream(e,{encoding:t}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new cQ.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,t);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:t}={}){if(this.readOnly)throw In(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new cQ.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),t),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let t=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`lstat '${e}'`);return t}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw OE(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=k.resolve(Me.root,e);return this.entries.has(i)||this.listings.has(i)}let t;try{t=this.resolveFilename(`stat '${e}'`,e,void 0,!1)}catch(i){return!1}return t===void 0?!1:this.entries.has(t)||this.listings.has(t)}async accessPromise(e,t){return this.accessSync(e,t)}accessSync(e,t=zu.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`access '${e}'`);if(this.readOnly&&t&zu.constants.W_OK)throw In(`access '${e}'`)}async statPromise(e,t={bigint:!1}){return t.bigint?this.statSync(e,{bigint:!0}):this.statSync(e)}statSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`stat '${e}'`,e,void 0,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`stat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,t)}}async fstatPromise(e,t){return this.fstatSync(e,t)}fstatSync(e,t){let i=this.fds.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw io(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw Ro(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,t)}async lstatPromise(e,t={bigint:!1}){return t.bigint?this.lstatSync(e,{bigint:!0}):this.lstatSync(e)}lstatSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`lstat '${e}'`,e,!1,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`lstat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,t)}}statImpl(e,t,i={}){let n=this.entries.get(t);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,m=f,y=new Date(h),b=new Date(p),v=new Date(m),x=new Date(f),T=this.listings.has(t)?Da:this.isSymbolicLink(n)?Fa:Ra,q=T===Da?493:420,Y=T|this.getUnixMode(n,q)&511,$=this.libzip.struct.statCrc(s),_=Object.assign(new jA,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:y,birthtime:b,ctime:v,mtime:x,atimeMs:h,birthtimeMs:p,ctimeMs:m,mtimeMs:f,mode:Y,crc:$});return i.bigint===!0?FE(_):_}if(this.listings.has(t)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),m=new Date(g),y=new Date(f),b=new Date(h),v=Da|493,x=0,T=Object.assign(new jA,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:m,ctime:y,mtime:b,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:v,crc:x});return i.bigint===!0?FE(T):T}throw new Error("Unreachable")}getUnixMode(e,t){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?t:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let t=this.listings.get(e);if(t)return t;this.registerListing(k.dirname(e)).add(k.basename(e));let n=new Set;return this.listings.set(e,n),n}registerEntry(e,t){this.registerListing(k.dirname(e)).add(k.basename(e)),this.entries.set(e,t)}unregisterListing(e){this.listings.delete(e);let t=this.listings.get(k.dirname(e));t==null||t.delete(k.basename(e))}unregisterEntry(e){this.unregisterListing(e);let t=this.entries.get(e);this.entries.delete(e),typeof t!="undefined"&&(this.fileSources.delete(t),this.isSymbolicLink(t)&&this.symlinkCount--)}deleteEntry(e,t){if(this.unregisterEntry(e),this.libzip.delete(this.zip,t)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,t,i=!0,n=!0){if(!this.ready)throw OE(`archive closed, ${e}`);let s=k.resolve(Me.root,t);if(s==="/")return Me.root;let o=this.entries.get(s);if(i&&o!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(o)){let a=this.getFileSource(o).toString();return this.resolveFilename(e,k.resolve(k.dirname(s),a),!0,n)}else return s;for(;;){let a=this.resolveFilename(e,k.dirname(s),!0,n);if(a===void 0)return a;let l=this.listings.has(a),c=this.entries.has(a);if(!l&&!c){if(n===!1)return;throw io(e)}if(!l)throw Ro(e);if(s=k.resolve(a,k.basename(s)),!i||this.symlinkCount===0)break;let u=this.libzip.name.locate(this.zip,s.slice(1));if(u===-1)break;if(this.isSymbolicLink(u)){let g=this.getFileSource(u).toString();s=k.resolve(k.dirname(s),g)}else break}return s}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let t=this.libzip.malloc(e.byteLength);if(!t)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,t,e.byteLength).set(e),{buffer:t,byteLength:e.byteLength}}allocateUnattachedSource(e){let t=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,t);if(s===0)throw this.libzip.free(t),this.makeLibzipError(t);return s}allocateSource(e){let{buffer:t,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,t,i,0,!0);if(n===0)throw this.libzip.free(t),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,t){let i=Buffer.isBuffer(t)?t:Buffer.from(t),n=k.relative(Me.root,e),s=this.allocateSource(t);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&_n)===Fa}getFileSource(e,t={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(t.asyncDecompress)return new Promise((h,p)=>{uQ.default.inflateRaw(f,(m,y)=>{m?p(m):(this.fileSources.set(e,y),h(y))})});{let h=uQ.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async fchmodPromise(e,t){return this.chmodPromise(this.fdToPath(e,"fchmod"),t)}fchmodSync(e,t){return this.chmodSync(this.fdToPath(e,"fchmodSync"),t)}async chmodPromise(e,t){return this.chmodSync(e,t)}chmodSync(e,t){if(this.readOnly)throw In(`chmod '${e}'`);t&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Ra|0)&~511|t;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,t,i){return this.chownSync(e,t,i)}chownSync(e,t,i){throw new Error("Unimplemented")}async renamePromise(e,t){return this.renameSync(e,t)}renameSync(e,t){throw new Error("Unimplemented")}async copyFilePromise(e,t,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,t,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,t,i=0){if(this.readOnly)throw In(`copyfile '${e} -> '${t}'`);if((i&zu.constants.COPYFILE_FICLONE_FORCE)!=0)throw Yh("unsupported clone operation",`copyfile '${e}' -> ${t}'`);let n=this.resolveFilename(`copyfile '${e} -> ${t}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw GA(`copyfile '${e}' -> '${t}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${t}'`,t),a=this.entries.get(o);if((i&(zu.constants.COPYFILE_EXCL|zu.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw ME(`copyfile '${e}' -> '${t}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,t,i){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFilePromise(e,t,i)}appendFileSync(e,t,i={}){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFileSync(e,t,i)}fdToPath(e,t){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw Ai(t);return i}async writeFilePromise(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([this.getFileSource(o),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,t){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw In(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw qh(`open '${e}'`);let n=null,s=null;typeof t=="string"?n=t:typeof t=="object"&&({encoding:n=null,mode:s=null}=t);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw In(`unlink '${e}'`);let t=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(t))throw qh(`unlink '${e}'`);let i=this.entries.get(t);if(typeof i=="undefined")throw GA(`unlink '${e}'`);this.deleteEntry(t,i)}async utimesPromise(e,t,i){return this.utimesSync(e,t,i)}utimesSync(e,t,i){if(this.readOnly)throw In(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,t,i){return this.lutimesSync(e,t,i)}lutimesSync(e,t,i){if(this.readOnly)throw In(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,t){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,bge(t),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,t){return this.mkdirSync(e,t)}mkdirSync(e,{mode:t=493,recursive:i=!1}={}){if(i)return this.mkdirpSync(e,{chmod:t});if(this.readOnly)throw In(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw ME(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,t)}async rmdirPromise(e,t){return this.rmdirSync(e,t)}rmdirSync(e,{recursive:t=!1}={}){if(this.readOnly)throw In(`rmdir '${e}'`);if(t){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw Ro(`rmdir '${e}'`);if(n.size>0)throw YO(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw GA(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let t=this.libzip.dir.add(this.zip,k.relative(Me.root,e));if(t===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,t),t}async linkPromise(e,t){return this.linkSync(e,t)}linkSync(e,t){throw qO(`link '${e}' -> '${t}'`)}async symlinkPromise(e,t){return this.symlinkSync(e,t)}symlinkSync(e,t){if(this.readOnly)throw In(`symlink '${e}' -> '${t}'`);let i=this.resolveFilename(`symlink '${e}' -> '${t}'`,t);if(this.listings.has(i))throw qh(`symlink '${e}' -> '${t}'`);if(this.entries.has(i))throw ME(`symlink '${e}' -> '${t}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(Fa|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return t?i.toString(t):i}readFileSync(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=this.readFileBuffer(e);return t?i.toString(t):i}readFileBuffer(e,t={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`open '${e}'`);if(this.listings.has(i))throw qh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,t)}async readdirPromise(e,t){return this.readdirSync(e,t)}readdirSync(e,t){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`scandir '${e}'`);let s=[...n];return(t==null?void 0:t.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",k.join(e,o)),{name:o})):s}async readlinkPromise(e){let t=this.prepareReadlink(e);return(await this.getFileSource(t,{asyncDecompress:!0})).toString()}readlinkSync(e){let t=this.prepareReadlink(e);return this.getFileSource(t).toString()}prepareReadlink(e){let t=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(t))throw Ro(`open '${e}'`);if(this.listings.has(t))throw GA(`readlink '${e}'`);let i=this.entries.get(t);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw GA(`readlink '${e}'`);return i}async truncatePromise(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(t,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(t,0);return s.copy(o),this.writeFileSync(e,o)}async ftruncatePromise(e,t){return this.truncatePromise(this.fdToPath(e,"ftruncate"),t)}ftruncateSync(e,t){return this.truncateSync(this.fdToPath(e,"ftruncateSync"),t)}watch(e,t,i){let n;switch(typeof t){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=t);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,t,i){let n=k.resolve(Me.root,e);return HE(this,n,t,i)}unwatchFile(e,t){let i=k.resolve(Me.root,e);return Wh(this,i,t)}};var Qi=class extends YA{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,t,i){return this.baseFs.openPromise(this.mapToBase(e),t,i)}openSync(e,t,i){return this.baseFs.openSync(this.mapToBase(e),t,i)}async opendirPromise(e,t){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),t),{path:e})}opendirSync(e,t){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),t),{path:e})}async readPromise(e,t,i,n,s){return await this.baseFs.readPromise(e,t,i,n,s)}readSync(e,t,i,n,s){return this.baseFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s)}writeSync(e,t,i,n,s){return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}async accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}async statPromise(e,t){return this.baseFs.statPromise(this.mapToBase(e),t)}statSync(e,t){return this.baseFs.statSync(this.mapToBase(e),t)}async fstatPromise(e,t){return this.baseFs.fstatPromise(e,t)}fstatSync(e,t){return this.baseFs.fstatSync(e,t)}lstatPromise(e,t){return this.baseFs.lstatPromise(this.mapToBase(e),t)}lstatSync(e,t){return this.baseFs.lstatSync(this.mapToBase(e),t)}async fchmodPromise(e,t){return this.baseFs.fchmodPromise(e,t)}fchmodSync(e,t){return this.baseFs.fchmodSync(e,t)}async chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}async chownPromise(e,t,i){return this.baseFs.chownPromise(this.mapToBase(e),t,i)}chownSync(e,t,i){return this.baseFs.chownSync(this.mapToBase(e),t,i)}async renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}async copyFilePromise(e,t,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),i)}copyFileSync(e,t,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),i)}async appendFilePromise(e,t,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,i)}appendFileSync(e,t,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,i)}async writeFilePromise(e,t,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,i)}writeFileSync(e,t,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,t,i){return this.baseFs.utimesPromise(this.mapToBase(e),t,i)}utimesSync(e,t,i){return this.baseFs.utimesSync(this.mapToBase(e),t,i)}async mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}async rmdirPromise(e,t){return this.baseFs.rmdirPromise(this.mapToBase(e),t)}rmdirSync(e,t){return this.baseFs.rmdirSync(this.mapToBase(e),t)}async linkPromise(e,t){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(t))}linkSync(e,t){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(t))}async symlinkPromise(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,t){return t==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),t):this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return t==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),t):this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,t){return this.baseFs.readdirPromise(this.mapToBase(e),t)}readdirSync(e,t){return this.baseFs.readdirSync(this.mapToBase(e),t)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,t){return this.baseFs.truncatePromise(this.mapToBase(e),t)}truncateSync(e,t){return this.baseFs.truncateSync(this.mapToBase(e),t)}async ftruncatePromise(e,t){return this.baseFs.ftruncatePromise(e,t)}ftruncateSync(e,t){return this.baseFs.ftruncateSync(e,t)}watch(e,t,i){return this.baseFs.watch(this.mapToBase(e),t,i)}watchFile(e,t,i){return this.baseFs.watchFile(this.mapToBase(e),t,i)}unwatchFile(e,t){return this.baseFs.unwatchFile(this.mapToBase(e),t)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Na=class extends Qi{constructor(e,{baseFs:t,pathUtils:i}){super(i);this.target=e,this.baseFs=t}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var _t=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.normalize(e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?k.normalize(e):this.baseFs.resolve(k.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var eM=Me.root,La=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.resolve(Me.root,e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Me.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let t=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(eM,e));if(t.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(eM,this.pathUtils.relative(this.target,e))}};var _h=class extends Qi{constructor(e,t){super(t);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var et=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),gQ=class extends YA{constructor(){super(k)}getExtractHint(){throw et()}getRealPath(){throw et()}resolve(){throw et()}async openPromise(){throw et()}openSync(){throw et()}async opendirPromise(){throw et()}opendirSync(){throw et()}async readPromise(){throw et()}readSync(){throw et()}async writePromise(){throw et()}writeSync(){throw et()}async closePromise(){throw et()}closeSync(){throw et()}createWriteStream(){throw et()}createReadStream(){throw et()}async realpathPromise(){throw et()}realpathSync(){throw et()}async readdirPromise(){throw et()}readdirSync(){throw et()}async existsPromise(e){throw et()}existsSync(e){throw et()}async accessPromise(){throw et()}accessSync(){throw et()}async statPromise(){throw et()}statSync(){throw et()}async fstatPromise(e){throw et()}fstatSync(e){throw et()}async lstatPromise(e){throw et()}lstatSync(e){throw et()}async fchmodPromise(){throw et()}fchmodSync(){throw et()}async chmodPromise(){throw et()}chmodSync(){throw et()}async chownPromise(){throw et()}chownSync(){throw et()}async mkdirPromise(){throw et()}mkdirSync(){throw et()}async rmdirPromise(){throw et()}rmdirSync(){throw et()}async linkPromise(){throw et()}linkSync(){throw et()}async symlinkPromise(){throw et()}symlinkSync(){throw et()}async renamePromise(){throw et()}renameSync(){throw et()}async copyFilePromise(){throw et()}copyFileSync(){throw et()}async appendFilePromise(){throw et()}appendFileSync(){throw et()}async writeFilePromise(){throw et()}writeFileSync(){throw et()}async unlinkPromise(){throw et()}unlinkSync(){throw et()}async utimesPromise(){throw et()}utimesSync(){throw et()}async readFilePromise(){throw et()}readFileSync(){throw et()}async readlinkPromise(){throw et()}readlinkSync(){throw et()}async truncatePromise(){throw et()}truncateSync(){throw et()}async ftruncatePromise(e,t){throw et()}ftruncateSync(e,t){throw et()}watch(){throw et()}watchFile(){throw et()}unwatchFile(){throw et()}},jE=gQ;jE.instance=new gQ;var Vh=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return H.fromPortablePath(e)}mapToBase(e){return H.toPortablePath(e)}};var Qge=/^[0-9]+$/,fQ=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,Sge=/^([^/]+-)?[a-f0-9]+$/,Wr=class extends Qi{static makeVirtualPath(e,t,i){if(k.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!k.basename(t).match(Sge))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=k.relative(k.dirname(e),i).split("/"),o=0;for(;o{let t=r.indexOf(e);if(t<=0)return null;let i=t;for(;t>=0&&(i=t+e.length,r[i]!==k.sep);){if(r[t-1]===k.sep)return null;t=r.indexOf(e,i)}return r.length>i&&r[i]!==k.sep?null:r.slice(0,i)},Is=class extends oc{constructor({libzip:e,baseFs:t=new ar,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=t,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,t){let i=new Is(t);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,t){let i=this.nextFd++|Vn;return this.fdMap.set(i,[e,t]),i}async openPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,t,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,t,i)))}openSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,t,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,t,i)))}async opendirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,t),async(i,{subPath:n})=>await i.opendirPromise(n,t),{requireSubpath:!1})}opendirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,t),(i,{subPath:n})=>i.opendirSync(n,t),{requireSubpath:!1})}async readPromise(e,t,i,n,s){if((e&Vn)==0)return await this.baseFs.readPromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("read");let[a,l]=o;return await a.readPromise(l,t,i,n,s)}readSync(e,t,i,n,s){if((e&Vn)==0)return this.baseFs.readSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("readSync");let[a,l]=o;return a.readSync(l,t,i,n,s)}async writePromise(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("write");let[a,l]=o;return typeof t=="string"?await a.writePromise(l,t,i):await a.writePromise(l,t,i,n,s)}writeSync(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("writeSync");let[a,l]=o;return typeof t=="string"?a.writeSync(l,t,i):a.writeSync(l,t,i,n,s)}async closePromise(e){if((e&Vn)==0)return await this.baseFs.closePromise(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("close");this.fdMap.delete(e);let[i,n]=t;return await i.closePromise(n)}closeSync(e){if((e&Vn)==0)return this.baseFs.closeSync(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("closeSync");this.fdMap.delete(e);let[i,n]=t;return i.closeSync(n)}createReadStream(e,t){return e===null?this.baseFs.createReadStream(e,t):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,t),(i,{archivePath:n,subPath:s})=>{let o=i.createReadStream(s,t);return o.path=H.fromPortablePath(this.pathUtils.join(n,s)),o})}createWriteStream(e,t){return e===null?this.baseFs.createWriteStream(e,t):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,t),(i,{subPath:n})=>i.createWriteStream(n,t))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,await t.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,t.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(t,{subPath:i})=>await t.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(t,{subPath:i})=>t.existsSync(i))}async accessPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,t),async(i,{subPath:n})=>await i.accessPromise(n,t))}accessSync(e,t){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,t),(i,{subPath:n})=>i.accessSync(n,t))}async statPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,t),async(i,{subPath:n})=>await i.statPromise(n,t))}statSync(e,t){return this.makeCallSync(e,()=>this.baseFs.statSync(e,t),(i,{subPath:n})=>i.statSync(n,t))}async fstatPromise(e,t){if((e&Vn)==0)return this.baseFs.fstatPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstat");let[n,s]=i;return n.fstatPromise(s,t)}fstatSync(e,t){if((e&Vn)==0)return this.baseFs.fstatSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let[n,s]=i;return n.fstatSync(s,t)}async lstatPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,t),async(i,{subPath:n})=>await i.lstatPromise(n,t))}lstatSync(e,t){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,t),(i,{subPath:n})=>i.lstatSync(n,t))}async fchmodPromise(e,t){if((e&Vn)==0)return this.baseFs.fchmodPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmod");let[n,s]=i;return n.fchmodPromise(s,t)}fchmodSync(e,t){if((e&Vn)==0)return this.baseFs.fchmodSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmodSync");let[n,s]=i;return n.fchmodSync(s,t)}async chmodPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,t),async(i,{subPath:n})=>await i.chmodPromise(n,t))}chmodSync(e,t){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,t),(i,{subPath:n})=>i.chmodSync(n,t))}async chownPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,t,i),async(n,{subPath:s})=>await n.chownPromise(s,t,i))}chownSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,t,i),(n,{subPath:s})=>n.chownSync(s,t,i))}async renamePromise(e,t){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.renamePromise(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(t,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,t){return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.renameSync(e,t),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(t,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,t,i=0){let n=async(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.copyFilePromise(e,t,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(t,async()=>await n(s,o,this.baseFs,t),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,t,i=0){let n=(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.copyFileSync(e,t,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(t,()=>n(s,o,this.baseFs,t),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,t,i),async(n,{subPath:s})=>await n.appendFilePromise(s,t,i))}appendFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,t,i),(n,{subPath:s})=>n.appendFileSync(s,t,i))}async writeFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,t,i),async(n,{subPath:s})=>await n.writeFilePromise(s,t,i))}writeFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,t,i),(n,{subPath:s})=>n.writeFileSync(s,t,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(t,{subPath:i})=>await t.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(t,{subPath:i})=>t.unlinkSync(i))}async utimesPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,t,i),async(n,{subPath:s})=>await n.utimesPromise(s,t,i))}utimesSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,t,i),(n,{subPath:s})=>n.utimesSync(s,t,i))}async mkdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,t),async(i,{subPath:n})=>await i.mkdirPromise(n,t))}mkdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,t),(i,{subPath:n})=>i.mkdirSync(n,t))}async rmdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,t),async(i,{subPath:n})=>await i.rmdirPromise(n,t))}rmdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,t),(i,{subPath:n})=>i.rmdirSync(n,t))}async linkPromise(e,t){return await this.makeCallPromise(t,async()=>await this.baseFs.linkPromise(e,t),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,t){return this.makeCallSync(t,()=>this.baseFs.linkSync(e,t),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.symlinkPromise(e,t,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,t,i){return this.makeCallSync(t,()=>this.baseFs.symlinkSync(e,t,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,t){return this.makeCallPromise(e,async()=>{switch(t){case"utf8":return await this.baseFs.readFilePromise(e,t);default:return await this.baseFs.readFilePromise(e,t)}},async(i,{subPath:n})=>await i.readFilePromise(n,t))}readFileSync(e,t){return this.makeCallSync(e,()=>{switch(t){case"utf8":return this.baseFs.readFileSync(e,t);default:return this.baseFs.readFileSync(e,t)}},(i,{subPath:n})=>i.readFileSync(n,t))}async readdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,t),async(i,{subPath:n})=>await i.readdirPromise(n,t),{requireSubpath:!1})}readdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,t),(i,{subPath:n})=>i.readdirSync(n,t),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(t,{subPath:i})=>await t.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(t,{subPath:i})=>t.readlinkSync(i))}async truncatePromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,t),async(i,{subPath:n})=>await i.truncatePromise(n,t))}truncateSync(e,t){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,t),(i,{subPath:n})=>i.truncateSync(n,t))}async ftruncatePromise(e,t){if((e&Vn)==0)return this.baseFs.ftruncatePromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncate");let[n,s]=i;return n.ftruncatePromise(s,t)}ftruncateSync(e,t){if((e&Vn)==0)return this.baseFs.ftruncateSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncateSync");let[n,s]=i;return n.ftruncateSync(s,t)}watch(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,t,i),(n,{subPath:s})=>n.watch(s,t,i))}watchFile(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,t,i),()=>HE(this,e,t,i))}unwatchFile(e,t){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,t),()=>Wh(this,e,t))}async makeCallPromise(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await t();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await t():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await t()}makeCallSync(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return t();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?t():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let t="";for(;;){let i=e.substring(t.length),n;if(!this.fileExtensions)n=tM(i,".zip");else for(let s of this.fileExtensions)if(n=tM(i,s),n)break;if(!n)return null;if(t=this.pathUtils.join(t,n),this.isZip.has(t)===!1){if(this.notZip.has(t))continue;try{if(!this.baseFs.lstatSync(t).isFile()){this.notZip.add(t);continue}}catch{return null}this.isZip.add(t)}return{archivePath:t,subPath:this.pathUtils.join(Me.root,e.substring(t.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let t=Date.now(),i=t+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(t>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-t).unref())}async getZipPromise(e,t){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new li(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await t(n.zipFs)}finally{n.refCount-=1}}else{let n=new li(e,await i());try{return await t(n)}finally{n.saveAndClose()}}}getZipSync(e,t){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new li(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,t(n.zipFs)}else{let n=new li(e,i());try{return t(n)}finally{n.saveAndClose()}}}};var Vu=ge(require("util"));var GE=ge(require("url"));var hQ=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof GE.URL?(0,GE.fileURLToPath)(e):e}};var en=Symbol("kBaseFs"),Ta=Symbol("kFd"),qA=Symbol("kClosePromise"),YE=Symbol("kCloseResolve"),qE=Symbol("kCloseReject"),_u=Symbol("kRefs"),Fo=Symbol("kRef"),No=Symbol("kUnref"),Q6e,S6e,v6e,x6e,JE=class{constructor(e,t){this[Q6e]=1;this[S6e]=void 0;this[v6e]=void 0;this[x6e]=void 0;this[en]=t,this[Ta]=e}get fd(){return this[Ta]}async appendFile(e,t){var i;try{this[Fo](this.appendFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;return await this[en].appendFilePromise(this.fd,e,n?{encoding:n}:void 0)}finally{this[No]()}}chown(e,t){throw new Error("Method not implemented.")}async chmod(e){try{return this[Fo](this.chmod),await this[en].fchmodPromise(this.fd,e)}finally{this[No]()}}createReadStream(e){return this[en].createReadStream(null,te(N({},e),{fd:this.fd}))}createWriteStream(e){return this[en].createWriteStream(null,te(N({},e),{fd:this.fd}))}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,t,i,n){var s,o,a;try{this[Fo](this.read);let l;return Buffer.isBuffer(e)?l=e:(e!=null||(e={}),l=(s=e.buffer)!=null?s:Buffer.alloc(16384),t=e.offset||0,i=(o=e.length)!=null?o:l.byteLength,n=(a=e.position)!=null?a:null),t!=null||(t=0),i!=null||(i=0),i===0?{bytesRead:i,buffer:l}:{bytesRead:await this[en].readPromise(this.fd,l,t,i,n),buffer:l}}finally{this[No]()}}async readFile(e){var t;try{this[Fo](this.readFile);let i=(t=typeof e=="string"?e:e==null?void 0:e.encoding)!=null?t:void 0;return await this[en].readFilePromise(this.fd,i)}finally{this[No]()}}async stat(e){try{return this[Fo](this.stat),await this[en].fstatPromise(this.fd,e)}finally{this[No]()}}async truncate(e){try{return this[Fo](this.truncate),await this[en].ftruncatePromise(this.fd,e)}finally{this[No]()}}utimes(e,t){throw new Error("Method not implemented.")}async writeFile(e,t){var i;try{this[Fo](this.writeFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;await this[en].writeFilePromise(this.fd,e,n)}finally{this[No]()}}async write(...e){try{if(this[Fo](this.write),ArrayBuffer.isView(e[0])){let[t,i,n,s]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i!=null?i:void 0,n!=null?n:void 0,s!=null?s:void 0),buffer:t}}else{let[t,i,n]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i,n),buffer:t}}}finally{this[No]()}}async writev(e,t){try{this[Fo](this.writev);let i=0;if(typeof t!="undefined")for(let n of e){let s=await this.write(n,void 0,void 0,t);i+=s.bytesWritten,t+=s.bytesWritten}else for(let n of e)i+=(await this.write(n)).bytesWritten;return{buffers:e,bytesWritten:i}}finally{this[No]()}}readv(e,t){throw new Error("Method not implemented.")}close(){if(this[Ta]===-1)return Promise.resolve();if(this[qA])return this[qA];if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[qA]=this[en].closePromise(e).finally(()=>{this[qA]=void 0})}else this[qA]=new Promise((e,t)=>{this[YE]=e,this[qE]=t}).finally(()=>{this[qA]=void 0,this[qE]=void 0,this[YE]=void 0});return this[qA]}[(en,Ta,Q6e=_u,S6e=qA,v6e=YE,x6e=qE,Fo)](e){if(this[Ta]===-1){let t=new Error("file closed");throw t.code="EBADF",t.syscall=e.name,t}this[_u]++}[No](){if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[en].closePromise(e).then(this[YE],this[qE])}}};var vge=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),rM=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]);function pQ(r,e){e=new hQ(e);let t=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Vu.promisify.custom])!="undefined"&&(s[Vu.promisify.custom]=o[Vu.promisify.custom])};{t(r,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),t(r,"read",(...i)=>{let[n,s,o,a,l,c]=i;if(i.length<=3){let u={};i.length<3?c=i[1]:(u=i[1],c=i[2]),{buffer:s=Buffer.alloc(16384),offset:o=0,length:a=s.byteLength,position:l}=u}if(o==null&&(o=0),a|=0,a===0){process.nextTick(()=>{c(null,0,s)});return}l==null&&(l=-1),process.nextTick(()=>{e.readPromise(n,s,o,a,l).then(u=>{c(null,u,s)},u=>{c(u,0,s)})})});for(let i of rM){let n=i.replace(/Promise$/,"");if(typeof r[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;t(r,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}r.realpath.native=r.realpath}{t(r,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}}),t(r,"readSync",(...i)=>{let[n,s,o,a,l]=i;return i.length<=3&&({offset:o=0,length:a=s.byteLength,position:l}=i[2]||{}),o==null&&(o=0),a|=0,a===0?0:(l==null&&(l=-1),e.readSync(n,s,o,a,l))});for(let i of vge){let n=i;if(typeof r[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&t(r,n,s.bind(e))}r.realpathSync.native=r.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=r.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let s of rM){let o=s.replace(/Promise$/,"");if(typeof n[o]=="undefined")continue;let a=e[s];typeof a!="undefined"&&s!=="open"&&t(n,o,(l,...c)=>l instanceof JE?l[o].apply(l,c):a.call(e,l,...c))}t(n,"open",async(...s)=>{let o=await e.openPromise(...s);return new JE(o,e)})}}r.read[Vu.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n}),r.write[Vu.promisify.custom]=async(i,n,...s)=>({bytesWritten:await e.writePromise(i,n,...s),buffer:n})}function WE(r,e){let t=Object.create(r);return pQ(t,e),t}var iM=ge(require("os"));function nM(r){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${r}${e}`}var no=new Set,dQ=null;function sM(){if(dQ)return dQ;let r=H.toPortablePath(iM.default.tmpdir()),e=K.realpathSync(r);return process.once("exit",()=>{K.rmtempSync()}),dQ={tmpdir:r,realTmpdir:e}}var K=Object.assign(new ar,{detachTemp(r){no.delete(r)},mktempSync(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{this.mkdirSync(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return r(n)}finally{if(no.has(n)){no.delete(n);try{this.removeSync(n)}catch{}}}}},async mktempPromise(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{await this.mkdirPromise(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return await r(n)}finally{if(no.has(n)){no.delete(n);try{await this.removePromise(n)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(no.values()).map(async r=>{try{await K.removePromise(r,{maxRetries:0}),no.delete(r)}catch{}}))},rmtempSync(){for(let r of no)try{K.removeSync(r),no.delete(r)}catch{}}});var mk=ge(SQ());var op={};ft(op,{parseResolution:()=>$E,parseShell:()=>_E,parseSyml:()=>Si,stringifyArgument:()=>PQ,stringifyArgumentSegment:()=>DQ,stringifyArithmeticExpression:()=>ZE,stringifyCommand:()=>kQ,stringifyCommandChain:()=>eg,stringifyCommandChainThen:()=>xQ,stringifyCommandLine:()=>VE,stringifyCommandLineThen:()=>vQ,stringifyEnvSegment:()=>XE,stringifyRedirectArgument:()=>$h,stringifyResolution:()=>eI,stringifyShell:()=>$u,stringifyShellLine:()=>$u,stringifySyml:()=>Ma,stringifyValueArgument:()=>uc});var _M=ge(zM());function _E(r,e={isGlobPattern:()=>!1}){try{return(0,_M.parse)(r,e)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function $u(r,{endSemicolon:e=!1}={}){return r.map(({command:t,type:i},n)=>`${VE(t)}${i===";"?n!==r.length-1||e?";":"":" &"}`).join(" ")}function VE(r){return`${eg(r.chain)}${r.then?` ${vQ(r.then)}`:""}`}function vQ(r){return`${r.type} ${VE(r.line)}`}function eg(r){return`${kQ(r)}${r.then?` ${xQ(r.then)}`:""}`}function xQ(r){return`${r.type} ${eg(r.chain)}`}function kQ(r){switch(r.type){case"command":return`${r.envs.length>0?`${r.envs.map(e=>XE(e)).join(" ")} `:""}${r.args.map(e=>PQ(e)).join(" ")}`;case"subshell":return`(${$u(r.subshell)})${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"group":return`{ ${$u(r.group,{endSemicolon:!0})} }${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"envs":return r.envs.map(e=>XE(e)).join(" ");default:throw new Error(`Unsupported command type: "${r.type}"`)}}function XE(r){return`${r.name}=${r.args[0]?uc(r.args[0]):""}`}function PQ(r){switch(r.type){case"redirection":return $h(r);case"argument":return uc(r);default:throw new Error(`Unsupported argument type: "${r.type}"`)}}function $h(r){return`${r.subtype} ${r.args.map(e=>uc(e)).join(" ")}`}function uc(r){return r.segments.map(e=>DQ(e)).join("")}function DQ(r){let e=(i,n)=>n?`"${i}"`:i,t=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(r.type){case"text":return t(r.text);case"glob":return r.pattern;case"shell":return e(`\${${$u(r.shell)}}`,r.quoted);case"variable":return e(typeof r.defaultValue=="undefined"?typeof r.alternativeValue=="undefined"?`\${${r.name}}`:r.alternativeValue.length===0?`\${${r.name}:+}`:`\${${r.name}:+${r.alternativeValue.map(i=>uc(i)).join(" ")}}`:r.defaultValue.length===0?`\${${r.name}:-}`:`\${${r.name}:-${r.defaultValue.map(i=>uc(i)).join(" ")}}`,r.quoted);case"arithmetic":return`$(( ${ZE(r.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${r.type}"`)}}function ZE(r){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},t=(n,s)=>s?`( ${n} )`:n,i=n=>t(ZE(n),!["number","variable"].includes(n.type));switch(r.type){case"number":return String(r.value);case"variable":return r.name;default:return`${i(r.left)} ${e(r.type)} ${i(r.right)}`}}var ZM=ge(XM());function $E(r){let e=r.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${r}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,ZM.parse)(r)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function eI(r){let e="";return r.from&&(e+=r.from.fullName,r.from.description&&(e+=`@${r.from.description}`),e+="/"),e+=r.descriptor.fullName,r.descriptor.description&&(e+=`@${r.descriptor.description}`),e}var uI=ge(jK()),qK=ge(YK()),Tpe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,JK=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],YQ=class{constructor(e){this.data=e}};function WK(r){return r.match(Tpe)?r:JSON.stringify(r)}function zK(r){return typeof r=="undefined"?!0:typeof r=="object"&&r!==null?Object.keys(r).every(e=>zK(r[e])):!1}function qQ(r,e,t){if(r===null)return`null -`;if(typeof r=="number"||typeof r=="boolean")return`${r.toString()} -`;if(typeof r=="string")return`${WK(r)} -`;if(Array.isArray(r)){if(r.length===0)return`[] -`;let i=" ".repeat(e);return` -${r.map(s=>`${i}- ${qQ(s,e+1,!1)}`).join("")}`}if(typeof r=="object"&&r){let i,n;r instanceof YQ?(i=r.data,n=!1):(i=r,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=JK.indexOf(l),g=JK.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!zK(i[l])).map((l,c)=>{let u=i[l],g=WK(l),f=qQ(u,e+1,!0),h=c>0||t?s:"",p=g.length>1024?`? ${g} -${h}:`:`${g}:`,m=f.startsWith(` -`)?f:` ${f}`;return`${h}${p}${m}`}).join(e===0?` -`:"")||` -`;return t?` -${a}`:`${a}`}throw new Error(`Unsupported value type (${r})`)}function Ma(r){try{let e=qQ(r,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Ma.PreserveOrdering=YQ;function Ope(r){return r.endsWith(` -`)||(r+=` -`),(0,qK.parse)(r)}var Mpe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function Kpe(r){if(Mpe.test(r))return Ope(r);let e=(0,uI.safeLoad)(r,{schema:uI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Si(r){return Kpe(r)}var T4=ge(VK()),mw=ge(Ic());var Cp={};ft(Cp,{Builtins:()=>oS,Cli:()=>ws,Command:()=>Re,Option:()=>J,UsageError:()=>Pe,formatMarkdownish:()=>Ui});var yc=0,ap=1,tn=2,WQ="",vi="\0",lg=-1,zQ=/^(-h|--help)(?:=([0-9]+))?$/,gI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,tU=/^-[a-zA-Z]{2,}$/,_Q=/^([^=]+)=([\s\S]*)$/,VQ=process.env.DEBUG_CLI==="1";var Pe=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},Ap=class extends Error{constructor(e,t){super();if(this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${XQ(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${XQ(e)}`}},ZQ=class extends Error{constructor(e,t){super();this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${XQ(e)}`}},XQ=r=>`While running ${r.filter(e=>e!==vi).map(e=>{let t=JSON.stringify(e);return e.match(/\s/)||e.length===0||t!==`"${e}"`?t:e}).join(" ")}`;var lp=Symbol("clipanion/isOption");function rn(r){return te(N({},r),{[lp]:!0})}function Oo(r,e){return typeof r=="undefined"?[r,e]:typeof r=="object"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function fI(r,e=!1){let t=r.replace(/^\.: /,"");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function cp(r,e){return e.length===1?new Pe(`${r}: ${fI(e[0],!0)}`):new Pe(`${r}: -${e.map(t=>` -- ${fI(t)}`).join("")}`)}function up(r,e,t){if(typeof t=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw cp(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}var Re=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(ys(),cg)),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw cp("Invalid option schema",l);for(let[,g]of c)g()}else if(t!=null)throw new Error("Invalid command schema");let i=await this.execute();return typeof i!="undefined"?i:0}};Re.isOption=lp;Re.Default=[];var uU=80,tS=Array(uU).fill("\u2501");for(let r=0;r<=24;++r)tS[tS.length-r]=`[38;5;${232+r}m\u2501`;var rS={header:r=>`\u2501\u2501\u2501 ${r}${r.length`${r}`,error:r=>`${r}`,code:r=>`${r}`},gU={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function yde(r){let e=r.split(` -`),t=e.filter(n=>n.match(/\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function Ui(r,{format:e,paragraphs:t}){return r=r.replace(/\r\n?/g,` -`),r=yde(r),r=r.replace(/^\n+|\n+$/g,""),r=r.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),r=r.replace(/\n(\n)?\n*/g,"$1"),t&&(r=r.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),r=r.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r} -`:""}var sS=ge(require("tty"));function wn(r){VQ&&console.log(r)}var fU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:lg};function hU(){return{nodes:[sn(),sn(),sn()]}}function Bde(r){let e=hU(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(yc)}function Qde(r,{prefix:e=""}={}){if(VQ){wn(`${e}Nodes are:`);for(let t=0;tl!==tn).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===tn))throw new Ap(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=Sde(a)}if(i.length>0){wn(" Results:");for(let s of i)wn(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else wn(" No results");return i}function vde(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,vi)){for(let{to:t}of r.statics[vi])if(t===ap)return!0}return!1}function kde(r,e,t){let i=t&&e.length>0?[""]:[],n=dU(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let m=r.nodes[p],y=Object.keys(m.statics);for(let b of Object.keys(m.statics)){let v=y[0];for(let{to:x,reducer:T}of m.statics[v])T==="pushPath"&&(u||l.push(v),g.push(x))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=vde(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==vi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===tn)continue;let p=xde(f,c);if(p!==null)for(let m of p)a([...i,m],l)}}return[...s].sort()}function Dde(r,e){let t=dU(r,[...e,vi]);return Pde(e,t.map(({state:i})=>i))}function Sde(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function Pde(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Ap(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=Rde(c);if(u.length>1)throw new ZQ(r,u.map(g=>g.candidateUsage));return u[0]}function Rde(r){let e=[],t=[];for(let i of r)i.selectedIndex===lg?t.push(i):e.push(i);return t.length>0&&e.push(te(N({},fU),{path:CU(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])})),e}function CU(r,e,...t){return e===void 0?Array.from(r):CU(r.filter((i,n)=>i===e[n]),...t)}function sn(){return{dynamics:[],shortcuts:[],statics:{}}}function pU(r){return r===ap||r===tn}function nS(r,e=0){return{to:pU(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function wde(r,e=0){let t=sn();for(let[i,n]of r.dynamics)t.dynamics.push([i,nS(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(nS(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>nS(s,e));return t}function xi(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function ug(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function Ka(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function pI(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function xde(r,e){let t=Array.isArray(r)?dI[r[0]]:dI[r];if(typeof t.suggest=="undefined")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var dI={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(r,e)=>r.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&&tU.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(_Q);return!r.ignoreOptions&&!!n&&gI.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&&zQ.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith("-")&&gI.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith("-")&&!gI.test(e)};dI.isOption.suggest=(r,e,t=!0)=>t?null:[e];var iS={setCandidateState:(r,e,t)=>N(N({},r),t),setSelectedIndex:(r,e,t)=>te(N({},r),{selectedIndex:t}),pushBatch:(r,e)=>te(N({},r),{options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(_Q);return te(N({},r),{options:r.options.concat({name:t,value:i})})},pushPath:(r,e)=>te(N({},r),{path:r.path.concat(e)}),pushPositional:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:Zn})}),pushTrue:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>te(N({},r),{options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i=te(N({},r),{options:[...r.options]}),n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t=te(N({},r),{options:[...r.options]}),i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>te(N({},r),{ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(zQ);return typeof i!="undefined"?te(N({},r),{options:[{name:"-c",value:String(t)},{name:"-i",value:i}]}):te(N({},r),{options:[{name:"-c",value:String(t)}]})},setError:(r,e,t)=>e===vi?te(N({},r),{errorMessage:`${t}.`}):te(N({},r),{errorMessage:`${t} ("${e}").`}),setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return te(N({},r),{errorMessage:`Not enough arguments to option ${t.name}.`})}},Zn=Symbol(),mU=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===Zn)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!t&&this.arity.extra!==Zn?this.arity.extra.push(e):this.arity.extra!==Zn&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===Zn)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Zn?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=hU(),t=yc,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=so(e,sn()),Ka(e,yc,WQ,t,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=so(e,sn());ug(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=so(e,sn());xi(e,l,"isHelp",f,["useHelp",this.cliIndex]),Ka(e,f,vi,ap,["setSelectedIndex",lg]),this.registerOptions(e,l)}this.arity.leading.length>0&&Ka(e,l,vi,tn,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&Ka(e,h,vi,tn,["setError","Not enough positional arguments"]),xi(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Zn||this.arity.extra.length>0){let f=so(e,sn());if(ug(e,c,f),this.arity.extra===Zn){let h=so(e,sn());this.arity.proxy||this.registerOptions(e,h),xi(e,c,s,h,"pushExtraNoLimits"),xi(e,h,s,h,"pushExtraNoLimits"),ug(e,h,f)}else for(let h=0;h0&&Ka(e,u,vi,tn,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)xi(e,t,["isOption",s,i.hidden||s!==n],t,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&xi(e,t,["isNegatedOption",s],t,["pushFalse",s]);else{let s=so(e,sn());for(let o of i.names)xi(e,t,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eDde(i,n),suggest:(n,s)=>kde(i,n,s)}}};var dp=class extends Re{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,t){let i=new dp(t);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};var EU=Symbol("clipanion/errorCommand");function Fde(){return process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY?8:1}var ws=class{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new pp({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new ws(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[Re.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case lg:return dp.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[EU]=a,l}}break}}async run(e,t){var i;let n,s=N(N({},ws.defaultContext),t),o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,N(N({},s),u)),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?Nde(s):IU,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Ui(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Ui(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Ui(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Ui(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof Re?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Ui(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(t).header("Usage")} -`,a+=` -`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g} -`,f.length>0){a+=` -`,a+=`${rS.header("Options")} -`;let h=f.reduce((p,m)=>Math.max(p,m.definition.length),0);a+=` -`;for(let{definition:p,description:m}of f)a+=` ${this.format(t).bold(p.padEnd(h))} ${Ui(m,{format:this.format(t),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(t).header("Details")} -`,a+=` -`,a+=Ui(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(t).header("Examples")} -`;for(let[h,p]of u)a+=` -`,a+=Ui(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(t).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l} -`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Ui(f.usage.category,{format:this.format(t),paragraphs:!1}):null,m=l.get(p);typeof m=="undefined"&&l.set(p,m=[]);let{usage:y}=this.getUsageByIndex(h);m.push({commandClass:f,usage:y})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)} -`:a+=`${this.format(t).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(t).bold(n)}${this.binaryName} -`):a+=`${this.format(t).bold(n)}${this.binaryName} -`;for(let f of c){let h=l.get(f).slice().sort((m,y)=>m.usage.localeCompare(y.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` -`,a+=`${this.format(t).header(`${p}`)} -`;for(let{commandClass:m,usage:y}of h){let b=m.usage.description||"undocumented";a+=` -`,a+=` ${this.format(t).bold(y)} -`,a+=` ${Ui(b,{format:this.format(t),paragraphs:!1})}`}}a+=` -`,a+=Ui("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[EU])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:ws.defaultContext.colorDepth>1)?rS:gU}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};ws.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:"getColorDepth"in sS.default.WriteStream.prototype?sS.default.WriteStream.prototype.getColorDepth():Fde()};var yU;function Nde(r){let e=yU;if(typeof e=="undefined"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return IU;let{AsyncLocalStorage:t}=require("async_hooks");e=yU=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function IU(r){return r()}var oS={};ft(oS,{DefinitionsCommand:()=>CI,HelpCommand:()=>mI,VersionCommand:()=>EI});var CI=class extends Re{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};CI.paths=[["--clipanion=definitions"]];var mI=class extends Re{async execute(){this.context.stdout.write(this.cli.usage())}};mI.paths=[["-h"],["--help"]];var EI=class extends Re{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};EI.paths=[["-v"],["--version"]];var J={};ft(J,{Array:()=>wU,Boolean:()=>BU,Counter:()=>bU,Proxy:()=>QU,Rest:()=>SU,String:()=>vU,applyValidator:()=>up,cleanValidationError:()=>fI,formatError:()=>cp,isOptionSymbol:()=>lp,makeCommandOption:()=>rn,rerouteArguments:()=>Oo});function wU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function BU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function bU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function QU(r={}){return rn({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}function SU(r={}){return rn({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Zn||a.extra===!1&&oo)}})}function Lde(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?up(g!=null?g:c,f,n.validator):f}})}function Tde(r={}){let{required:e=!0}=r;return rn({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;oYW,areIdentsEqual:()=>fd,areLocatorsEqual:()=>hd,areVirtualPackagesEquivalent:()=>aSe,bindDescriptor:()=>sSe,bindLocator:()=>oSe,convertDescriptorToLocator:()=>Aw,convertLocatorToDescriptor:()=>_x,convertPackageToLocator:()=>nSe,convertToIdent:()=>iSe,convertToManifestRange:()=>cSe,copyPackage:()=>cd,devirtualizeDescriptor:()=>ud,devirtualizeLocator:()=>gd,getIdentVendorPath:()=>ek,isPackageCompatible:()=>gw,isVirtualDescriptor:()=>Al,isVirtualLocator:()=>ea,makeDescriptor:()=>rr,makeIdent:()=>$o,makeLocator:()=>cn,makeRange:()=>cw,parseDescriptor:()=>ll,parseFileStyleRange:()=>ASe,parseIdent:()=>An,parseLocator:()=>Yc,parseRange:()=>qg,prettyDependent:()=>Lv,prettyDescriptor:()=>sr,prettyIdent:()=>fi,prettyLocator:()=>It,prettyLocatorNoColors:()=>$x,prettyRange:()=>aw,prettyReference:()=>dd,prettyResolution:()=>Tv,prettyWorkspace:()=>Cd,renamePackage:()=>ld,slugifyIdent:()=>Zx,slugifyLocator:()=>Jg,sortDescriptors:()=>Wg,stringifyDescriptor:()=>Pn,stringifyIdent:()=>Ot,stringifyLocator:()=>Rs,tryParseDescriptor:()=>pd,tryParseIdent:()=>qW,tryParseLocator:()=>lw,virtualizeDescriptor:()=>Vx,virtualizePackage:()=>Xx});var Yg=ge(require("querystring")),HW=ge(ri()),jW=ge(nY());var ae={};ft(ae,{LogLevel:()=>ho,Style:()=>Tc,Type:()=>qe,addLogFilterSupport:()=>nd,applyColor:()=>ns,applyHyperlink:()=>Mg,applyStyle:()=>Ry,json:()=>Oc,jsonOrPretty:()=>KBe,mark:()=>Hv,pretty:()=>tt,prettyField:()=>_o,prettyList:()=>Uv,supportsColor:()=>Py,supportsHyperlinks:()=>Mv,tuple:()=>fo});var rd=ge(uv()),id=ge(Ic());var sJ=ge(is()),oJ=ge(Jq());var Se={};ft(Se,{AsyncActions:()=>$q,BufferStream:()=>Zq,CachingStrategy:()=>Lc,DefaultStream:()=>eJ,allSettledSafe:()=>go,assertNever:()=>Pv,bufferStream:()=>Tg,buildIgnorePattern:()=>LBe,convertMapsToIndexableObjects:()=>ky,dynamicRequire:()=>Og,escapeRegExp:()=>PBe,getArrayWithDefault:()=>Fg,getFactoryWithDefault:()=>_a,getMapWithDefault:()=>Ng,getSetWithDefault:()=>Nc,isIndexableObject:()=>Dv,isPathLike:()=>TBe,isTaggedYarnVersion:()=>kBe,mapAndFilter:()=>zo,mapAndFind:()=>$p,overrideType:()=>kv,parseBoolean:()=>td,parseOptionalBoolean:()=>nJ,prettifyAsyncErrors:()=>Lg,prettifySyncErrors:()=>Rv,releaseAfterUseAsync:()=>RBe,replaceEnvVariables:()=>Fv,sortMap:()=>kn,tryParseOptionalBoolean:()=>Nv,validateEnum:()=>DBe});var Wq=ge(is()),zq=ge(gg()),_q=ge(ri()),xv=ge(require("stream"));function kBe(r){return!!(_q.default.valid(r)&&r.match(/^[^-]+(-rc\.[0-9]+)?$/))}function PBe(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kv(r){}function Pv(r){throw new Error(`Assertion failed: Unexpected object '${r}'`)}function DBe(r,e){let t=Object.values(r);if(!t.includes(e))throw new Pe(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${t.map(i=>JSON.stringify(i)).join(", ")})`);return e}function zo(r,e){let t=[];for(let i of r){let n=e(i);n!==Vq&&t.push(n)}return t}var Vq=Symbol();zo.skip=Vq;function $p(r,e){for(let t of r){let i=e(t);if(i!==Xq)return i}}var Xq=Symbol();$p.skip=Xq;function Dv(r){return typeof r=="object"&&r!==null}async function go(r){let e=await Promise.allSettled(r),t=[];for(let i of e){if(i.status==="rejected")throw i.reason;t.push(i.value)}return t}function ky(r){if(r instanceof Map&&(r=Object.fromEntries(r)),Dv(r))for(let e of Object.keys(r)){let t=r[e];Dv(t)&&(r[e]=ky(t))}return r}function _a(r,e,t){let i=r.get(e);return typeof i=="undefined"&&r.set(e,i=t()),i}function Fg(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=[]),t}function Nc(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Set),t}function Ng(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Map),t}async function RBe(r,e){if(e==null)return await r();try{return await r()}finally{await e()}}async function Lg(r,e){try{return await r()}catch(t){throw t.message=e(t.message),t}}function Rv(r,e){try{return r()}catch(t){throw t.message=e(t.message),t}}async function Tg(r){return await new Promise((e,t)=>{let i=[];r.on("error",n=>{t(n)}),r.on("data",n=>{i.push(n)}),r.on("end",()=>{e(Buffer.concat(i))})})}var Zq=class extends xv.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}};function FBe(){let r,e;return{promise:new Promise((i,n)=>{r=i,e=n}),resolve:r,reject:e}}var $q=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,zq.default)(e)}set(e,t){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=FBe());let n=this.limit(()=>t());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,t){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>t(i))}async wait(){await Promise.all(this.promises.values())}},eJ=class extends xv.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},ed=eval("require");function tJ(r){return ed(H.fromPortablePath(r))}function rJ(path){let physicalPath=H.fromPortablePath(path),currentCacheEntry=ed.cache[physicalPath];delete ed.cache[physicalPath];let result;try{result=tJ(physicalPath);let freshCacheEntry=ed.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{ed.cache[physicalPath]=currentCacheEntry}return result}var iJ=new Map;function NBe(r){let e=iJ.get(r),t=K.statSync(r);if((e==null?void 0:e.mtime)===t.mtimeMs)return e.instance;let i=rJ(r);return iJ.set(r,{mtime:t.mtimeMs,instance:i}),i}var Lc;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Lc||(Lc={}));function Og(r,{cachingStrategy:e=2}={}){switch(e){case 0:return rJ(r);case 1:return NBe(r);case 2:return tJ(r);default:throw new Error("Unsupported caching strategy")}}function kn(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function LBe(r){return r.length===0?null:r.map(e=>`(${Wq.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Fv(r,{env:e}){let t=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return r.replace(t,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new Pe(`Environment variable not found (${n})`)})}function td(r){switch(r){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${r}" as a boolean`)}}function nJ(r){return typeof r=="undefined"?r:td(r)}function Nv(r){try{return nJ(r)}catch{return null}}function TBe(r){return!!(H.isAbsolute(r)||r.match(/^(\.{1,2}|~)\//))}var Qt;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(Qt||(Qt={}));var wi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(wi||(wi={}));var qi;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(qi||(qi={}));var qe={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN"},Tc;(function(e){e[e.BOLD=2]="BOLD"})(Tc||(Tc={}));var Ov=id.default.GITHUB_ACTIONS?{level:2}:rd.default.supportsColor?{level:rd.default.supportsColor.level}:{level:0},Py=Ov.level!==0,Mv=Py&&!id.default.GITHUB_ACTIONS&&!id.default.CIRCLE&&!id.default.GITLAB,Kv=new rd.default.Instance(Ov),OBe=new Map([[qe.NO_HINT,null],[qe.NULL,["#a853b5",129]],[qe.SCOPE,["#d75f00",166]],[qe.NAME,["#d7875f",173]],[qe.RANGE,["#00afaf",37]],[qe.REFERENCE,["#87afff",111]],[qe.NUMBER,["#ffd700",220]],[qe.PATH,["#d75fd7",170]],[qe.URL,["#d75fd7",170]],[qe.ADDED,["#5faf00",70]],[qe.REMOVED,["#d70000",160]],[qe.CODE,["#87afff",111]],[qe.SIZE,["#ffd700",220]]]),Fs=r=>r,Dy={[qe.NUMBER]:Fs({pretty:(r,e)=>`${e}`,json:r=>r}),[qe.IDENT]:Fs({pretty:(r,e)=>fi(r,e),json:r=>Ot(r)}),[qe.LOCATOR]:Fs({pretty:(r,e)=>It(r,e),json:r=>Rs(r)}),[qe.DESCRIPTOR]:Fs({pretty:(r,e)=>sr(r,e),json:r=>Pn(r)}),[qe.RESOLUTION]:Fs({pretty:(r,{descriptor:e,locator:t})=>Tv(r,e,t),json:({descriptor:r,locator:e})=>({descriptor:Pn(r),locator:e!==null?Rs(e):null})}),[qe.DEPENDENT]:Fs({pretty:(r,{locator:e,descriptor:t})=>Lv(r,e,t),json:({locator:r,descriptor:e})=>({locator:Rs(r),descriptor:Pn(e)})}),[qe.PACKAGE_EXTENSION]:Fs({pretty:(r,e)=>{switch(e.type){case wi.Dependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"dependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependencyMeta:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependenciesMeta",qe.CODE)} \u27A4 ${fi(r,An(e.selector))} \u27A4 ${ns(r,e.key,qe.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:r=>{switch(r.type){case wi.Dependency:return`${Ot(r.parentDescriptor)} > ${Ot(r.descriptor)}`;case wi.PeerDependency:return`${Ot(r.parentDescriptor)} >> ${Ot(r.descriptor)}`;case wi.PeerDependencyMeta:return`${Ot(r.parentDescriptor)} >> ${r.selector} / ${r.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${r.type}`)}}}),[qe.SETTING]:Fs({pretty:(r,e)=>(r.get(e),Mg(r,ns(r,e,qe.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:r=>r}),[qe.DURATION]:Fs({pretty:(r,e)=>{if(e>1e3*60){let t=Math.floor(e/1e3/60),i=Math.ceil((e-t*60*1e3)/1e3);return i===0?`${t}m`:`${t}m ${i}s`}else{let t=Math.floor(e/1e3),i=e-t*1e3;return i===0?`${t}s`:`${t}s ${i}ms`}},json:r=>r}),[qe.SIZE]:Fs({pretty:(r,e)=>{let t=["KB","MB","GB","TB"],i=t.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return ns(r,`${s} ${t[i-1]}`,qe.NUMBER)},json:r=>r}),[qe.PATH]:Fs({pretty:(r,e)=>ns(r,H.fromPortablePath(e),qe.PATH),json:r=>H.fromPortablePath(r)}),[qe.MARKDOWN]:Fs({pretty:(r,{text:e,format:t,paragraphs:i})=>Ui(e,{format:t,paragraphs:i}),json:({text:r})=>r})};function fo(r,e){return[e,r]}function Ry(r,e,t){return r.get("enableColors")&&t&2&&(e=rd.default.bold(e)),e}function ns(r,e,t){if(!r.get("enableColors"))return e;let i=OBe.get(t);if(i===null)return e;let n=typeof i=="undefined"?t:Ov.level>=3?i[0]:i[1],s=typeof n=="number"?Kv.ansi256(n):n.startsWith("#")?Kv.hex(n):Kv[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var MBe=!!process.env.KONSOLE_VERSION;function Mg(r,e,t){return r.get("enableHyperlinks")?MBe?`]8;;${t}\\${e}]8;;\\`:`]8;;${t}\x07${e}]8;;\x07`:e}function tt(r,e,t){if(e===null)return ns(r,"null",qe.NULL);if(Object.prototype.hasOwnProperty.call(Dy,t))return Dy[t].pretty(r,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return ns(r,e,t)}function Uv(r,e,t,{separator:i=", "}={}){return[...e].map(n=>tt(r,n,t)).join(i)}function Oc(r,e){if(r===null)return null;if(Object.prototype.hasOwnProperty.call(Dy,e))return kv(e),Dy[e].json(r);if(typeof r!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof r}`);return r}function KBe(r,e,[t,i]){return r?Oc(t,i):tt(e,t,i)}function Hv(r){return{Check:ns(r,"\u2713","green"),Cross:ns(r,"\u2718","red"),Question:ns(r,"?","cyan")}}function _o(r,{label:e,value:[t,i]}){return`${tt(r,e,qe.CODE)}: ${tt(r,t,i)}`}var ho;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(ho||(ho={}));function nd(r,{configuration:e}){let t=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of t){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let m=g.get("pattern");typeof m!="undefined"&&s.push([sJ.default.matcher(m,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===X.UNNAMED)return h;let p=n.size>0||s.length>0?(0,oJ.default)(f):f;if(n.size>0){let m=n.get(p);if(typeof m!="undefined")return m!=null?m:h}if(s.length>0){for(let[m,y]of s)if(m(p))return y!=null?y:h}if(i.size>0){let m=i.get(_A(g));if(typeof m!="undefined")return m!=null?m:h}return h},a=r.reportInfo,l=r.reportWarning,c=r.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case ho.Info:a.call(g,f,h);break;case ho.Warning:l.call(g,f!=null?f:X.UNNAMED,h);break;case ho.Error:c.call(g,f!=null?f:X.UNNAMED,h);break}};r.reportInfo=function(...g){return u(this,...g,ho.Info)},r.reportWarning=function(...g){return u(this,...g,ho.Warning)},r.reportError=function(...g){return u(this,...g,ho.Error)}}var Dn={};ft(Dn,{checksumFile:()=>sw,checksumPattern:()=>ow,makeHash:()=>ln});var nw=ge(require("crypto")),zx=ge(Wx());function ln(...r){let e=(0,nw.createHash)("sha512"),t="";for(let i of r)typeof i=="string"?t+=i:i&&(t&&(e.update(t),t=""),e.update(i));return t&&e.update(t),e.digest("hex")}async function sw(r,{baseFs:e,algorithm:t}={baseFs:K,algorithm:"sha512"}){let i=await e.openPromise(r,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,nw.createHash)(t),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function ow(r,{cwd:e}){let i=(await(0,zx.default)(r,{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,zx.default)([r,...i],{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=H.toPortablePath(a),u=await K.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await K.readlinkPromise(c))):u.isFile()&&l.push(await K.readFilePromise(c)),l.join("\0")})),o=(0,nw.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var Ad="virtual:",tSe=5,GW=/(os|cpu|libc)=([a-z0-9_-]+)/,rSe=(0,jW.makeParser)(GW);function $o(r,e){if(r==null?void 0:r.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:ln(r,e),scope:r,name:e}}function rr(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:ln(r.identHash,e),range:e}}function cn(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:ln(r.identHash,e),reference:e}}function iSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name}}function Aw(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.descriptorHash,reference:r.range}}function _x(r){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:r.locatorHash,range:r.reference}}function nSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.locatorHash,reference:r.reference}}function ld(r,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:r.version,languageName:r.languageName,linkType:r.linkType,conditions:r.conditions,dependencies:new Map(r.dependencies),peerDependencies:new Map(r.peerDependencies),dependenciesMeta:new Map(r.dependenciesMeta),peerDependenciesMeta:new Map(r.peerDependenciesMeta),bin:new Map(r.bin)}}function cd(r){return ld(r,r)}function Vx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return rr(r,`virtual:${e}#${r.range}`)}function Xx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return ld(r,cn(r,`virtual:${e}#${r.reference}`))}function Al(r){return r.range.startsWith(Ad)}function ea(r){return r.reference.startsWith(Ad)}function ud(r){if(!Al(r))throw new Error("Not a virtual descriptor");return rr(r,r.range.replace(/^[^#]*#/,""))}function gd(r){if(!ea(r))throw new Error("Not a virtual descriptor");return cn(r,r.reference.replace(/^[^#]*#/,""))}function sSe(r,e){return r.range.includes("::")?r:rr(r,`${r.range}::${Yg.default.stringify(e)}`)}function oSe(r,e){return r.reference.includes("::")?r:cn(r,`${r.reference}::${Yg.default.stringify(e)}`)}function fd(r,e){return r.identHash===e.identHash}function YW(r,e){return r.descriptorHash===e.descriptorHash}function hd(r,e){return r.locatorHash===e.locatorHash}function aSe(r,e){if(!ea(r))throw new Error("Invalid package type");if(!ea(e))throw new Error("Invalid package type");if(!fd(r,e)||r.dependencies.size!==e.dependencies.size)return!1;for(let t of r.dependencies.values()){let i=e.dependencies.get(t.identHash);if(!i||!YW(t,i))return!1}return!0}function An(r){let e=qW(r);if(!e)throw new Error(`Invalid ident (${r})`);return e}function qW(r){let e=r.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,t,i]=e,n=typeof t!="undefined"?t:null;return $o(n,i)}function ll(r,e=!1){let t=pd(r,e);if(!t)throw new Error(`Invalid descriptor (${r})`);return t}function pd(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid range (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return rr($o(o,n),a)}function Yc(r,e=!1){let t=lw(r,e);if(!t)throw new Error(`Invalid locator (${r})`);return t}function lw(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid reference (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return cn($o(o,n),a)}function qg(r,e){let t=r.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(t===null)throw new Error(`Invalid range (${r})`);let i=typeof t[1]!="undefined"?t[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof t[3]!="undefined"?decodeURIComponent(t[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${r})`);let s=typeof t[3]!="undefined"?decodeURIComponent(t[3]):decodeURIComponent(t[2]),o=(e==null?void 0:e.parseSelector)?Yg.default.parse(s):s,a=typeof t[4]!="undefined"?Yg.default.parse(t[4]):null;return{protocol:i,source:n,selector:o,params:a}}function ASe(r,{protocol:e}){let{selector:t,params:i}=qg(r,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${r}`);return{parentLocator:Yc(i.locator,!0),path:t}}function JW(r){return r=r.replace(/%/g,"%25"),r=r.replace(/:/g,"%3A"),r=r.replace(/#/g,"%23"),r}function lSe(r){return r===null?!1:Object.entries(r).length>0}function cw({protocol:r,source:e,selector:t,params:i}){let n="";return r!==null&&(n+=`${r}`),e!==null&&(n+=`${JW(e)}#`),n+=JW(t),lSe(i)&&(n+=`::${Yg.default.stringify(i)}`),n}function cSe(r){let{params:e,protocol:t,source:i,selector:n}=qg(r);for(let s in e)s.startsWith("__")&&delete e[s];return cw({protocol:t,source:i,params:e,selector:n})}function Ot(r){return r.scope?`@${r.scope}/${r.name}`:`${r.name}`}function Pn(r){return r.scope?`@${r.scope}/${r.name}@${r.range}`:`${r.name}@${r.range}`}function Rs(r){return r.scope?`@${r.scope}/${r.name}@${r.reference}`:`${r.name}@${r.reference}`}function Zx(r){return r.scope!==null?`@${r.scope}-${r.name}`:r.name}function Jg(r){let{protocol:e,selector:t}=qg(r.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=HW.default.valid(t),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=r.scope?`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`:`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`;return Jr(a)}function fi(r,e){return e.scope?`${tt(r,`@${e.scope}/`,qe.SCOPE)}${tt(r,e.name,qe.NAME)}`:`${tt(r,e.name,qe.NAME)}`}function uw(r){if(r.startsWith(Ad)){let e=uw(r.substring(r.indexOf("#")+1)),t=r.substring(Ad.length,Ad.length+tSe);return`${e} [${t}]`}else return r.replace(/\?.*/,"?[...]")}function aw(r,e){return`${tt(r,uw(e),qe.RANGE)}`}function sr(r,e){return`${fi(r,e)}${tt(r,"@",qe.RANGE)}${aw(r,e.range)}`}function dd(r,e){return`${tt(r,uw(e),qe.REFERENCE)}`}function It(r,e){return`${fi(r,e)}${tt(r,"@",qe.REFERENCE)}${dd(r,e.reference)}`}function $x(r){return`${Ot(r)}@${uw(r.reference)}`}function Wg(r){return kn(r,[e=>Ot(e),e=>e.range])}function Cd(r,e){return fi(r,e.locator)}function Tv(r,e,t){let i=Al(e)?ud(e):e;return t===null?`${sr(r,i)} \u2192 ${Hv(r).Cross}`:i.identHash===t.identHash?`${sr(r,i)} \u2192 ${dd(r,t.reference)}`:`${sr(r,i)} \u2192 ${It(r,t)}`}function Lv(r,e,t){return t===null?`${It(r,e)}`:`${It(r,e)} (via ${aw(r,t.range)})`}function ek(r){return`node_modules/${Ot(r)}`}function gw(r,e){return r.conditions?rSe(r.conditions,t=>{let[,i,n]=t.match(GW),s=e[i];return s?s.includes(n):!0}):!0}var WW={hooks:{reduceDependency:(r,e,t,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==Ot(t)||o.from&&o.from.description&&o.from.description!==t.reference||o.descriptor.fullName!==Ot(r)||o.descriptor.description&&o.descriptor.description!==r.range)continue;return n.bindDescriptor(rr(r,a),e.topLevelWorkspace.anchoredLocator,s)}return r},validateProject:async(r,e)=>{for(let t of r.workspaces){let i=Cd(r.configuration,t);await r.configuration.triggerHook(n=>n.validateWorkspace,t,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(r,e)=>{let{manifest:t}=r;t.resolutions.length&&r.cwd!==r.project.cwd&&t.errors.push(new Error("Resolutions field will be ignored"));for(let i of t.errors)e.reportWarning(X.INVALID_MANIFEST,i.message)}}};var XW=ge(ri());var md=class{supportsDescriptor(e,t){return!!(e.range.startsWith(md.protocol)||t.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,t){return!!e.reference.startsWith(md.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.getWorkspaceByCwd(e.reference.slice(md.protocol.length));return te(N({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:Qt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},oi=md;oi.protocol="workspace:";var Wt={};ft(Wt,{SemVer:()=>zW.SemVer,clean:()=>gSe,satisfiesWithPrereleases:()=>qc,validRange:()=>po});var fw=ge(ri()),zW=ge(ri()),_W=new Map;function qc(r,e,t=!1){if(!r)return!1;let i=`${e}${t}`,n=_W.get(i);if(typeof n=="undefined")try{n=new fw.default.Range(e,{includePrerelease:!0,loose:t})}catch{return!1}finally{_W.set(i,n||null)}else if(n===null)return!1;let s;try{s=new fw.default.SemVer(r,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var VW=new Map;function po(r){if(r.indexOf(":")!==-1)return null;let e=VW.get(r);if(typeof e!="undefined")return e;try{e=new fw.default.Range(r)}catch{e=null}return VW.set(r,e),e}var uSe=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/;function gSe(r){let e=uSe.exec(r);return e?e[1]:null}var cl=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:t=new ar}={}){let i=k.join(e,"package.json");try{return await cl.fromFile(i,{baseFs:t})}catch(n){if(n.code==="ENOENT")return null;throw n}}static async find(e,{baseFs:t}={}){let i=await cl.tryFind(e,{baseFs:t});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:t=new ar}={}){let i=new cl;return await i.loadFile(e,{baseFs:t}),i}static fromText(e){let t=new cl;return t.loadFromText(e),t}static isManifestFieldCompatible(e,t){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,t===s.slice(1))return!1}else if(i=!1,s===t)return!0;return n&&i}loadFromText(e){let t;try{t=JSON.parse($W(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(t),this.indent=ZW(e)}async loadFile(e,{baseFs:t=new ar}){let i=await t.readFilePromise(e,"utf8"),n;try{n=JSON.parse($W(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=ZW(i)}load(e,{yamlCompatibilityMode:t=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=An(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(Array.isArray(e.libc)){let s=[];this.libc=s;for(let o of e.libc)typeof o!="string"?i.push(new Error("Parsing failed for the 'libc' field")):s.push(o)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=un(e.main):this.main=null,typeof e.module=="string"?this.module=un(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=un(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(un(s),typeof o=="string"?un(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,un(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}let a=An(s);this.bin.set(a.name,un(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(oi.protocol)&&!po(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=rr(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=ll(s),l=this.ensureDependencyMeta(a),c=hw(o.built,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=hw(o.optional,{yamlCompatibilityMode:t});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=hw(o.unplugged,{yamlCompatibilityMode:t});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=ll(s),l=this.ensurePeerDependencyMeta(a),c=hw(o.optional,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:$E(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=un(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=un(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=un(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(un(s),typeof o=="string"?un(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,un(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,un(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(un(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l);let c=rr(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(tk("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(tk("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(tk("libc",this.libc)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return cl.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return cl.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!XW.default.valid(e.range))throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(t);n||this.dependenciesMeta.set(t,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=this.peerDependenciesMeta.get(t);return i||this.peerDependenciesMeta.set(t,i={}),i}setRawField(e,t,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=t,a=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=Ot(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=te(N({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(Ot(o)),l=!1;if(t&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Wg(i).map(o=>({[Ot(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Wg(n).map(o=>({[Ot(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Wg(this.devDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Wg(this.peerDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of kn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of kn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?Pn(rr(An(o),l)):o,g=N({},c);t&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...kn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[eI(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},At=cl;At.fileName="package.json",At.allDependencies=["dependencies","devDependencies","peerDependencies"],At.hardDependencies=["dependencies","devDependencies"];function ZW(r){let e=r.match(/^[ \t]+/m);return e?e[0]:" "}function $W(r){return r.charCodeAt(0)===65279?r.slice(1):r}function un(r){return r.replace(/\\/g,"/")}function hw(r,{yamlCompatibilityMode:e}){return e?Nv(r):typeof r=="undefined"||typeof r=="boolean"?r:null}function e4(r,e){let t=e.search(/[^!]/);if(t===-1)return"invalid";let i=t%2==0?"":"!",n=e.slice(t);return`${i}${r}=${n}`}function tk(r,e){return e.length===1?e4(r,e[0]):`(${e.map(t=>e4(r,t)).join(" | ")})`}var D4=ge(P4()),R4=ge(require("stream")),F4=ge(require("string_decoder"));var sve=15,ct=class extends Error{constructor(e,t,i){super(t);this.reportExtra=i;this.reportCode=e}};function ove(r){return typeof r.reportCode!="undefined"}var Ji=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let t=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),t=l,c()},o=(l=0)=>{s(t+1)},a=async function*(){for(;t{t=o}),n=(0,D4.default)(o=>{let a=t;i=new Promise(l=>{t=l}),e=o,a()},1e3/sve),s=async function*(){for(;;)await i,yield{title:e}}();return{[Symbol.asyncIterator](){return s},hasProgress:!1,hasTitle:!0,setTitle:n}}async startProgressPromise(e,t){let i=this.reportProgress(e);try{return await t(e)}finally{i.stop()}}startProgressSync(e,t){let i=this.reportProgress(e);try{return t(e)}finally{i.stop()}}reportInfoOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportWarningOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportErrorOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportExceptionOnce(e){ove(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(X.EXCEPTION,e.stack||e.message,{key:e})}createStreamReporter(e=null){let t=new R4.PassThrough,i=new F4.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),t}};var yd=class{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){return await this.getFetcher(e,t).fetch(e,t)}tryFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));return i||null}getFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));if(!i)throw new ct(X.FETCHER_NOT_FOUND,`${It(t.project.configuration,e)} isn't supported by any available fetcher`);return i}};var wd=class{constructor(e){this.resolvers=e.filter(t=>t)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,t,i)}async getSatisfying(e,t,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,t,i)}async resolve(e,t){return await this.getResolverByLocator(e,t).resolve(e,t)}tryResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));return i||null}getResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));if(!i)throw new Error(`${sr(t.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));return i||null}getResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));if(!i)throw new Error(`${It(t.project.configuration,e)} isn't supported by any available resolver`);return i}};var N4=ge(ri());var zg=/^(?!v)[a-z0-9._-]+$/i,nk=class{supportsDescriptor(e,t){return!!(po(e.range)||zg.test(e.range))}supportsLocator(e,t){return!!(N4.default.valid(e.reference)||zg.test(e.reference))}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),t,i)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),t,i)}async getSatisfying(e,t,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),t,i)}async resolve(e,t){let i=await t.resolver.resolve(this.forwardLocator(e,t),t);return ld(i,e)}forwardDescriptor(e,t){return rr(e,`${t.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,t){return cn(e,`${t.project.configuration.get("defaultProtocol")}${e.reference}`)}};var Bd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n);return t.fetcher.getLocalPath(s,t)}async fetch(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n),o=await t.fetcher.fetch(s,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return Jg(e)}async ensureVirtualLink(e,t,i){let n=t.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Wr.makeVirtualPath(s,o,n),l=new Na(a,{baseFs:t.packageFs,pathUtils:k});return te(N({},t),{packageFs:l})}};var _g=class{static isVirtualDescriptor(e){return!!e.range.startsWith(_g.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(_g.protocol)}supportsDescriptor(e,t){return _g.isVirtualDescriptor(e)}supportsLocator(e,t){return _g.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,t,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,t,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},pw=_g;pw.protocol="virtual:";var bd=class{supports(e){return!!e.reference.startsWith(oi.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){let i=this.getWorkspace(e,t).cwd;return{packageFs:new _t(i),prefixPath:Me.dot,localPath:i}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(oi.protocol.length))}};var sk={};ft(sk,{getDefaultGlobalFolder:()=>ak,getHomeFolder:()=>Qd,isFolderInside:()=>Ak});var ok=ge(require("os"));function ak(){if(process.platform==="win32"){let r=H.toPortablePath(process.env.LOCALAPPDATA||H.join((0,ok.homedir)(),"AppData","Local"));return k.resolve(r,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let r=H.toPortablePath(process.env.XDG_DATA_HOME);return k.resolve(r,"yarn/berry")}return k.resolve(Qd(),".yarn/berry")}function Qd(){return H.toPortablePath((0,ok.homedir)()||"/usr/local/share")}function Ak(r,e){let t=k.relative(e,r);return t&&!t.startsWith("..")&&!k.isAbsolute(t)}var Vg={};ft(Vg,{builtinModules:()=>lk,getArchitecture:()=>Sd,getArchitectureName:()=>Ave,getArchitectureSet:()=>ck});var L4=ge(require("module"));function lk(){return new Set(L4.default.builtinModules||Object.keys(process.binding("natives")))}function ave(){var i,n,s,o;if(process.platform==="win32")return null;let e=(s=((n=(i=process.report)==null?void 0:i.getReport())!=null?n:{}).sharedObjects)!=null?s:[],t=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return(o=$p(e,a=>{let l=a.match(t);if(!l)return $p.skip;if(l[1])return"glibc";if(l[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")}))!=null?o:null}var dw,Cw;function Sd(){return dw=dw!=null?dw:{os:process.platform,cpu:process.arch,libc:ave()}}function Ave(r=Sd()){return r.libc?`${r.os}-${r.cpu}-${r.libc}`:`${r.os}-${r.cpu}`}function ck(){let r=Sd();return Cw=Cw!=null?Cw:{os:[r.os],cpu:[r.cpu],libc:r.libc?[r.libc]:[]}}var lve=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),Ew="yarn_",gk=".yarnrc.yml",fk="yarn.lock",cve="********",Ie;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(Ie||(Ie={}));var Ri=qe,hk={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:Ie.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:Ie.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:Ie.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:Ie.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:Ie.STRING,default:null},globalFolder:{description:"Folder where all system-global files are stored",type:Ie.ABSOLUTE_PATH,default:ak()},cacheFolder:{description:"Folder where the cache files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:Ie.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:lc},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:Ie.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:Ie.STRING,default:fk},installStatePath:{description:"Path of the file where the install state will be persisted",type:Ie.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:Ie.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:Ie.STRING,default:Iw()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:Ie.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:Ie.BOOLEAN,default:Py,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:Ie.BOOLEAN,default:Mv,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:Ie.BOOLEAN,default:mw.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:Ie.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:Ie.BOOLEAN,default:!mw.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:Ie.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:Ie.BOOLEAN,default:mw.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:Ie.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:Ie.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:Ie.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:Ie.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:Ie.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:Ie.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:Ie.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:Ie.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:Ie.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:Ie.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:Ie.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:Ie.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:Ie.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:Ie.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:Ie.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:Ie.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:Ie.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:Ie.STRING,values:Object.values(ho),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:Ie.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:Ie.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:Ie.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:Ie.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:Ie.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:Ie.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:Ie.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:Ie.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:Ie.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:Ie.MAP,valueDefinition:{description:"A range",type:Ie.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:Ie.MAP,valueDefinition:{description:"A semver range",type:Ie.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:Ie.MAP,valueDefinition:{description:"The peerDependency meta",type:Ie.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:Ie.BOOLEAN,default:!1}}}}}}}};function dk(r,e,t,i,n){if(i.isArray||i.type===Ie.ANY&&Array.isArray(t))return Array.isArray(t)?t.map((s,o)=>pk(r,`${e}[${o}]`,s,i,n)):String(t).split(/,/).map(s=>pk(r,e,s,i,n));if(Array.isArray(t))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return pk(r,e,t,i,n)}function pk(r,e,t,i,n){var a;switch(i.type){case Ie.ANY:return t;case Ie.SHAPE:return uve(r,e,t,i,n);case Ie.MAP:return gve(r,e,t,i,n)}if(t===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(t))return t;let o=(()=>{if(i.type===Ie.BOOLEAN&&typeof t!="string")return td(t);if(typeof t!="string")throw new Error(`Expected value (${t}) to be a string`);let l=Fv(t,{env:process.env});switch(i.type){case Ie.ABSOLUTE_PATH:return k.resolve(n,H.toPortablePath(l));case Ie.LOCATOR_LOOSE:return Yc(l,!1);case Ie.NUMBER:return parseInt(l);case Ie.LOCATOR:return Yc(l);case Ie.BOOLEAN:return td(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function uve(r,e,t,i,n){if(typeof t!="object"||Array.isArray(t))throw new Pe(`Object configuration settings "${e}" must be an object`);let s=Ck(r,i,{ignoreArrays:!0});if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=`${e}.${o}`;if(!i.properties[o])throw new Pe(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,dk(r,l,a,i.properties[o],n))}return s}function gve(r,e,t,i,n){let s=new Map;if(typeof t!="object"||Array.isArray(t))throw new Pe(`Map configuration settings "${e}" must be an object`);if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,dk(r,c,a,u,n))}return s}function Ck(r,e,{ignoreArrays:t=!1}={}){switch(e.type){case Ie.SHAPE:{if(e.isArray&&!t)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,Ck(r,s));return i}break;case Ie.MAP:return e.isArray&&!t?[]:new Map;case Ie.ABSOLUTE_PATH:return e.default===null?null:r.projectCwd===null?k.isAbsolute(e.default)?k.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>k.resolve(r.projectCwd,i)):k.resolve(r.projectCwd,e.default);default:return e.default}}function yw(r,e,t){if(e.type===Ie.SECRET&&typeof r=="string"&&t.hideSecrets)return cve;if(e.type===Ie.ABSOLUTE_PATH&&typeof r=="string"&&t.getNativePaths)return H.fromPortablePath(r);if(e.isArray&&Array.isArray(r)){let i=[];for(let n of r)i.push(yw(n,e,t));return i}if(e.type===Ie.MAP&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries())i.set(n,yw(s,e.valueDefinition,t));return i}if(e.type===Ie.SHAPE&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries()){let o=e.properties[n];i.set(n,yw(s,o,t))}return i}return r}function fve(){let r={};for(let[e,t]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(Ew)&&(e=(0,T4.default)(e.slice(Ew.length)),r[e]=t);return r}function Iw(){let r=`${Ew}rc_filename`;for(let[e,t]of Object.entries(process.env))if(e.toLowerCase()===r&&typeof t=="string")return t;return gk}var ul;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(ul||(ul={}));var tA=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,t,i){let n=new tA(e);typeof t!="undefined"&&!(t instanceof Map)&&(n.projectCwd=t),n.importSettings(hk);let s=typeof i!="undefined"?i:t instanceof Map?t:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,t,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=fve();delete a.rcFilename;let l=await tA.findRcFiles(e),c=await tA.findHomeRcFile();if(c){let b=l.find(v=>v.path===c.path);b?b.strict=!1:l.push(te(N({},c),{strict:!1}))}let u=({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T})=>({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}),g=Y=>{var $=Y,{ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}=$,q=Or($,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return q},f=new tA(e);f.importSettings(u(hk)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:b,cwd:v,data:x}of l)f.useWithSource(b,u(x),v,{strict:!1});if(s){let b=f.get("yarnPath"),v=f.get("ignorePath");if(b!==null&&!v)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await tA.findProjectCwd(e,h);break;case 1:p=await tA.findProjectCwd(e,null);break;case 2:K.existsSync(k.join(e,"package.json"))?p=k.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(hk));let m=new Map([["@@core",WW]]),y=b=>"default"in b?b.default:b;if(t!==null){for(let T of t.plugins.keys())m.set(T,y(t.modules.get(T)));let b=new Map;for(let T of lk())b.set(T,()=>Og(T));for(let[T,q]of t.modules)b.set(T,()=>q);let v=new Set,x=async(T,q)=>{let{factory:Y,name:$}=Og(T);if(v.has($))return;let _=new Map(b),ne=A=>{if(_.has(A))return _.get(A)();throw new Pe(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},ee=await Lg(async()=>y(await Y(ne)),A=>`${A} (when initializing ${$}, defined in ${q})`);b.set($,()=>ee),v.add($),m.set($,ee)};if(a.plugins)for(let T of a.plugins.split(";")){let q=k.resolve(e,H.toPortablePath(T));await x(q,"")}for(let{path:T,cwd:q,data:Y}of l)if(!!o&&!!Array.isArray(Y.plugins))for(let $ of Y.plugins){let _=typeof $!="string"?$.path:$,ne=k.resolve(q,H.toPortablePath(_));await x(ne,T)}}for(let[b,v]of m)f.activatePlugin(b,v);f.useWithSource("",g(a),e,{strict:n});for(let{path:b,cwd:v,data:x,strict:T}of l)f.useWithSource(b,g(x),v,{strict:T!=null?T:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let t=Iw(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=k.join(s,t);if(K.existsSync(o)){let a=await K.readFilePromise(o,"utf8"),l;try{l=Si(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new Pe(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=k.dirname(s)}return i}static async findHomeRcFile(){let e=Iw(),t=Qd(),i=k.join(t,e);if(K.existsSync(i)){let n=await K.readFilePromise(i,"utf8"),s=Si(n);return{path:i,cwd:t,data:s}}return null}static async findProjectCwd(e,t){let i=null,n=e,s=null;for(;n!==s;){if(s=n,K.existsSync(k.join(s,"package.json"))&&(i=s),t!==null){if(K.existsSync(k.join(s,t))){i=s;break}}else if(i!==null)break;n=k.dirname(s)}return i}static async updateConfiguration(e,t){let i=Iw(),n=k.join(e,i),s=K.existsSync(n)?Si(await K.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof t=="function"){try{a=t(s)}catch{a=t({})}if(a===s)return}else{a=s;for(let l of Object.keys(t)){let c=s[l],u=t[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await K.changeFilePromise(n,Ma(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let t=Qd();return await tA.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),typeof t.configuration!="undefined"&&this.importSettings(t.configuration)}importSettings(e){for(let[t,i]of Object.entries(e))if(i!=null){if(this.settings.has(t))throw new Error(`Cannot redefine settings "${t}"`);this.settings.set(t,i),this.values.set(t,Ck(this,i))}}useWithSource(e,t,i,n){try{this.use(e,t,i,n)}catch(s){throw s.message+=` (in ${tt(this,e,qe.PATH)})`,s}}use(e,t,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(t)]){if(typeof t[o]=="undefined"||o==="plugins"||e===""&&lve.has(o))continue;if(o==="rcFilename")throw new Pe(`The rcFilename settings can only be set via ${`${Ew}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new Pe(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===Ie.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=dk(this,o,t[o],l,i)}catch(u){throw u.message+=` in ${tt(this,e,qe.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===Ie.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new Pe(`Couldn't find a configuration settings named "${e}"`);return yw(n,s,{hideSecrets:t,getNativePaths:i})}getSubprocessStreams(e,{header:t,prefix:i,report:n}){let s,o,a=K.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${tt(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${tt(this,"STDERR","red")}`);s=new uk.PassThrough,s.pipe(l),s.pipe(a),o=new uk.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof t!="undefined"&&s.write(`${t} -`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let t of this.plugins.values())for(let i of t.resolvers||[])e.push(new i);return new wd([new pw,new oi,new nk,...e])}makeFetcher(){let e=[];for(let t of this.plugins.values())for(let i of t.fetchers||[])e.push(new i);return new yd([new Bd,new bd,...e])}getLinkers(){let e=[];for(let t of this.plugins.values())for(let i of t.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=Sd(),t=this.get("supportedArchitectures"),i=t.get("os");i!==null&&(i=i.map(o=>o==="current"?e.os:o));let n=t.get("cpu");n!==null&&(n=n.map(o=>o==="current"?e.cpu:o));let s=t.get("libc");return s!==null&&(s=zo(s,o=>{var a;return o==="current"?(a=e.libc)!=null?a:zo.skip:o})),{os:i,cpu:n,libc:s}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,t=(i,n,{userProvided:s=!1}={})=>{if(!po(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new At;o.load(n,{yamlCompatibilityMode:!0});let a=Fg(e,i.identHash),l=[];a.push([i.range,l]);let c={status:qi.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(te(N({},c),{type:wi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(te(N({},c),{type:wi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(te(N({},c),{type:wi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,t);for(let[i,n]of this.get("packageExtensions"))t(ll(i,!0),ky(n),{userProvided:!0})}normalizePackage(e){let t=cd(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!qc(s,o))for(let l of a)switch(l.status===qi.Inactive&&(l.status=qi.Redundant),l.type){case wi.Dependency:typeof t.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.dependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependency:typeof t.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependencyMeta:{let c=t.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=qi.Active,_a(t.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:Pv(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of t.peerDependenciesMeta.keys()){let o=An(s);t.peerDependencies.has(o.identHash)||t.peerDependencies.set(o.identHash,rr(o,"*"))}for(let s of t.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=$o("types",o),l=Ot(a);t.peerDependencies.has(a.identHash)||t.peerDependenciesMeta.has(l)||(t.peerDependencies.set(a.identHash,rr(a,"*")),t.peerDependenciesMeta.set(l,{optional:!0}))}return t.dependencies=new Map(kn(t.dependencies,([,s])=>Pn(s))),t.peerDependencies=new Map(kn(t.peerDependencies,([,s])=>Pn(s))),t}getLimit(e){return _a(this.limits,e,()=>(0,O4.default)(this.get(e)))}async triggerHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...t)}}async triggerMultipleHooks(e,t){for(let i of t)await this.triggerHook(e,...i)}async reduceHook(e,t,...i){let n=t;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...t);if(typeof o!="undefined")return o}return null}},ye=tA;ye.telemetry=null;var ss;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(ss||(ss={}));var ww=class extends ct{constructor({fileName:e,code:t,signal:i}){let n=ye.create(k.cwd()),s=tt(n,e,qe.PATH);super(X.EXCEPTION,`Child ${s} reported an error`,o=>{hve(t,i,{configuration:n,report:o})});this.code=Ek(t,i)}},Ik=class extends ww{constructor({fileName:e,code:t,signal:i,stdout:n,stderr:s}){super({fileName:e,code:t,signal:i});this.stdout=n,this.stderr=s}};function zc(r){return r!==null&&typeof r.fd=="number"}var _c=new Set;function yk(){}function wk(){for(let r of _c)r.kill()}async function ra(r,e,{cwd:t,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":zc(s)&&(c[0]=s),zc(o)&&(c[1]=o),zc(a)&&(c[2]=a);let u=(0,mk.default)(r,e,{cwd:H.fromPortablePath(t),env:te(N({},i),{PWD:H.fromPortablePath(t)}),stdio:c});_c.add(u),_c.size===1&&(process.on("SIGINT",yk),process.on("SIGTERM",wk)),!zc(s)&&s!==null&&s.pipe(u.stdin),zc(o)||u.stdout.pipe(o,{end:!1}),zc(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))zc(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,m)=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:Ek(p,m)}):h(new ww({fileName:r,code:p,signal:m}))})})}async function pve(r,e,{cwd:t,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=H.fromPortablePath(t);typeof i.PWD!="undefined"&&(i=te(N({},i),{PWD:c}));let u=(0,mk.default)(r,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",h=>{let p=ye.create(t),m=tt(p,r,qe.PATH);f(new ct(X.EXCEPTION,`Process ${m} failed to spawn`,y=>{y.reportError(X.EXCEPTION,` ${_o(p,{label:"Thrown Error",value:fo(qe.NO_HINT,h.message)})}`)}))}),u.on("close",(h,p)=>{let m=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),y=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:Ek(h,p),stdout:m,stderr:y}):f(new Ik({fileName:r,code:h,signal:p,stdout:m,stderr:y}))})})}var dve=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function Ek(r,e){let t=dve.get(e);return typeof t!="undefined"?128+t:r!=null?r:1}function hve(r,e,{configuration:t,report:i}){i.reportError(X.EXCEPTION,` ${_o(t,r!==null?{label:"Exit Code",value:fo(qe.NUMBER,r)}:{label:"Exit Signal",value:fo(qe.CODE,e)})}`)}var ir={};ft(ir,{Method:()=>Cl,RequestError:()=>w5.RequestError,del:()=>xPe,get:()=>SPe,getNetworkSettings:()=>S5,post:()=>HP,put:()=>vPe,request:()=>Od});var E5=ge(Uw()),I5=ge(require("https")),y5=ge(require("http")),MP=ge(is()),KP=ge(m5()),Hw=ge(require("url"));var w5=ge(Uw()),B5=new Map,b5=new Map,wPe=new y5.Agent({keepAlive:!0}),BPe=new I5.Agent({keepAlive:!0});function Q5(r){let e=new Hw.URL(r),t={host:e.hostname,headers:{}};return e.port&&(t.port=Number(e.port)),{proxy:t}}async function UP(r){return _a(b5,r,()=>K.readFilePromise(r).then(e=>(b5.set(r,e),e)))}function bPe({statusCode:r,statusMessage:e},t){let i=tt(t,r,qe.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${r}`;return Mg(t,`${i}${e?` (${e})`:""}`,n)}async function jw(r,{configuration:e,customErrorMessage:t}){var i,n;try{return await r}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=t==null?void 0:t(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof E5.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${tt(e,"httpTimeout",qe.SETTING)})`);let a=new ct(X.NETWORK_ERROR,o,l=>{s.response&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Response Code",value:fo(qe.NO_HINT,bPe(s.response,e))})}`),s.request&&(l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Method",value:fo(qe.NO_HINT,s.request.options.method)})}`),l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request URL",value:fo(qe.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Redirects",value:fo(qe.NO_HINT,Uv(e,s.request.redirects,qe.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Retry Count",value:fo(qe.NO_HINT,`${tt(e,s.request.retryCount,qe.NUMBER)} (can be increased via ${tt(e,"httpRetry",qe.SETTING)})`)})}`)});throw a.originalError=s,a}}function S5(r,e){let t=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},n=Object.keys(i),s=typeof r=="string"?new Hw.URL(r):r;for(let[o,a]of t)if(MP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var Cl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(Cl||(Cl={}));async function Od(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=async()=>await QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o});return await(await t.reduceHook(c=>c.wrapNetworkRequest,a,{target:r,body:e,configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o}))()}async function SPe(r,n){var s=n,{configuration:e,jsonResponse:t}=s,i=Or(s,["configuration","jsonResponse"]);let o=_a(B5,r,()=>jw(Od(r,null,N({configuration:e},i)),{configuration:e}).then(a=>(B5.set(r,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),t?JSON.parse(o.toString()):o}async function vPe(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.PUT})),i)).body}async function HP(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.POST})),i)).body}async function xPe(r,i){var n=i,{customErrorMessage:e}=n,t=Or(n,["customErrorMessage"]);return(await jw(Od(r,null,te(N({},t),{method:Cl.DELETE})),t)).body}async function QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=typeof r=="string"?new Hw.URL(r):r,l=S5(a,{configuration:t});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!MP.default.isMatch(a.hostname,t.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?KP.default.httpOverHttp(Q5(l.httpProxy)):wPe,https:l.httpsProxy?KP.default.httpsOverHttp(Q5(l.httpsProxy)):BPe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=t.get("httpTimeout"),f=t.get("httpRetry"),h=t.get("enableStrictSsl"),p=l.caFilePath,m=l.httpsCertFilePath,y=l.httpsKeyFilePath,{default:b}=await Promise.resolve().then(()=>ge(Uw())),v=p?await UP(p):void 0,x=m?await UP(m):void 0,T=y?await UP(y):void 0,q=b.extend(N({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:v,certificate:x,key:T}},u));return t.getLimit("networkConcurrency")(()=>q(a))}var Zt={};ft(Zt,{PackageManager:()=>hn,detectPackageManager:()=>K9,executePackageAccessibleBinary:()=>Y9,executePackageScript:()=>nB,executePackageShellcode:()=>rD,executeWorkspaceAccessibleBinary:()=>WDe,executeWorkspaceLifecycleScript:()=>G9,executeWorkspaceScript:()=>j9,getPackageAccessibleBinaries:()=>sB,getWorkspaceAccessibleBinaries:()=>H9,hasPackageScript:()=>YDe,hasWorkspaceScript:()=>tD,makeScriptEnv:()=>Yd,maybeExecuteWorkspaceLifecycleScript:()=>JDe,prepareExternalProject:()=>GDe});var Md={};ft(Md,{getLibzipPromise:()=>fn,getLibzipSync:()=>D5});var P5=ge(x5());var ml=["number","number"],YP;(function(L){L[L.ZIP_ER_OK=0]="ZIP_ER_OK",L[L.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",L[L.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",L[L.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",L[L.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",L[L.ZIP_ER_READ=5]="ZIP_ER_READ",L[L.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",L[L.ZIP_ER_CRC=7]="ZIP_ER_CRC",L[L.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",L[L.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",L[L.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",L[L.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",L[L.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",L[L.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",L[L.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",L[L.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",L[L.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",L[L.ZIP_ER_EOF=17]="ZIP_ER_EOF",L[L.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",L[L.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",L[L.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",L[L.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",L[L.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",L[L.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",L[L.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",L[L.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",L[L.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",L[L.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",L[L.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",L[L.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",L[L.ZIP_ER_TELL=30]="ZIP_ER_TELL",L[L.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(YP||(YP={}));var k5=r=>({get HEAP8(){return r.HEAP8},get HEAPU8(){return r.HEAPU8},errors:YP,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:r._malloc(1),uint16S:r._malloc(2),uint32S:r._malloc(4),uint64S:r._malloc(8),malloc:r._malloc,free:r._free,getValue:r.getValue,open:r.cwrap("zip_open","number",["string","number","number"]),openFromSource:r.cwrap("zip_open_from_source","number",["number","number","number"]),close:r.cwrap("zip_close","number",["number"]),discard:r.cwrap("zip_discard",null,["number"]),getError:r.cwrap("zip_get_error","number",["number"]),getName:r.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:r.cwrap("zip_get_num_entries","number",["number","number"]),delete:r.cwrap("zip_delete","number",["number","number"]),stat:r.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:r.cwrap("zip_stat_index","number",["number",...ml,"number","number"]),fopen:r.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:r.cwrap("zip_fopen_index","number",["number",...ml,"number"]),fread:r.cwrap("zip_fread","number",["number","number","number","number"]),fclose:r.cwrap("zip_fclose","number",["number"]),dir:{add:r.cwrap("zip_dir_add","number",["number","string"])},file:{add:r.cwrap("zip_file_add","number",["number","string","number","number"]),getError:r.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:r.cwrap("zip_file_get_external_attributes","number",["number",...ml,"number","number","number"]),setExternalAttributes:r.cwrap("zip_file_set_external_attributes","number",["number",...ml,"number","number","number"]),setMtime:r.cwrap("zip_file_set_mtime","number",["number",...ml,"number","number"]),setCompression:r.cwrap("zip_set_file_compression","number",["number",...ml,"number","number"])},ext:{countSymlinks:r.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:r.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:r.cwrap("zip_error_strerror","string",["number"])},name:{locate:r.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:r.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:r.cwrap("zip_source_buffer","number",["number","number",...ml,"number"]),free:r.cwrap("zip_source_free",null,["number"]),keep:r.cwrap("zip_source_keep",null,["number"]),open:r.cwrap("zip_source_open","number",["number"]),close:r.cwrap("zip_source_close","number",["number"]),seek:r.cwrap("zip_source_seek","number",["number",...ml,"number"]),tell:r.cwrap("zip_source_tell","number",["number"]),read:r.cwrap("zip_source_read","number",["number","number","number"]),error:r.cwrap("zip_source_error","number",["number"]),setMtime:r.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:r.cwrap("zipstruct_stat","number",[]),statS:r.cwrap("zipstruct_statS","number",[]),statName:r.cwrap("zipstruct_stat_name","string",["number"]),statIndex:r.cwrap("zipstruct_stat_index","number",["number"]),statSize:r.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:r.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:r.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:r.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:r.cwrap("zipstruct_stat_crc","number",["number"]),error:r.cwrap("zipstruct_error","number",[]),errorS:r.cwrap("zipstruct_errorS","number",[]),errorCodeZip:r.cwrap("zipstruct_error_code_zip","number",["number"])}});var qP=null;function D5(){return qP===null&&(qP=k5((0,P5.default)())),qP}async function fn(){return D5()}var Ud={};ft(Ud,{ShellError:()=>Ms,execute:()=>Xw,globUtils:()=>Yw});var G5=ge(uv()),Y5=ge(require("os")),os=ge(require("stream")),q5=ge(require("util"));var Ms=class extends Error{constructor(e){super(e);this.name="ShellError"}};var Yw={};ft(Yw,{fastGlobOptions:()=>N5,isBraceExpansion:()=>L5,isGlobPattern:()=>kPe,match:()=>PPe,micromatchOptions:()=>Jw});var R5=ge(Zy()),F5=ge(require("fs")),qw=ge(is()),Jw={strictBrackets:!0},N5={onlyDirectories:!1,onlyFiles:!1};function kPe(r){if(!qw.default.scan(r,Jw).isGlob)return!1;try{qw.default.parse(r,Jw)}catch{return!1}return!0}function PPe(r,{cwd:e,baseFs:t}){return(0,R5.default)(r,te(N({},N5),{cwd:H.fromPortablePath(e),fs:WE(F5.default,new Vh(t))}))}function L5(r){return qw.default.scan(r,Jw).isBrace}var T5=ge(SQ()),na=ge(require("stream")),O5=ge(require("string_decoder")),Fn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(Fn||(Fn={}));var Xc=new Set;function JP(){}function WP(){for(let r of Xc)r.kill()}function M5(r,e,t,i){return n=>{let s=n[0]instanceof na.Transform?"pipe":n[0],o=n[1]instanceof na.Transform?"pipe":n[1],a=n[2]instanceof na.Transform?"pipe":n[2],l=(0,T5.default)(r,e,te(N({},i),{stdio:[s,o,a]}));return Xc.add(l),Xc.size===1&&(process.on("SIGINT",JP),process.on("SIGTERM",WP)),n[0]instanceof na.Transform&&n[0].pipe(l.stdin),n[1]instanceof na.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof na.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),u.code){case"ENOENT":n[2].write(`command not found: ${r} -`),c(127);break;case"EACCES":n[2].write(`permission denied: ${r} -`),c(128);break;default:n[2].write(`uncaught error: ${u.message} -`),c(1);break}}),l.on("close",u=>{Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),c(u!==null?u:129)})})}}}function K5(r){return e=>{let t=e[0]==="pipe"?new na.PassThrough:e[0];return{stdin:t,promise:Promise.resolve().then(()=>r({stdin:t,stdout:e[1],stderr:e[2]}))}}}var mo=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},U5=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Kd=class{constructor(e,t){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:i,stderr:n}){let s=new Kd(null,e);return s.stdin=t,s.stdout=i,s.stderr=n,s}pipeTo(e,t=1){let i=new Kd(this,e),n=new U5;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(t&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(t&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let t;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");t=this.stdout,e[1]=t.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(t.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function Ww(r,e){return Kd.start(r,e)}function H5(r,e=null){let t=new na.PassThrough,i=new O5.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",r(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&r(e!==null?`${e} ${s}`:s)}),t}function j5(r,{prefix:e}){return{stdout:H5(t=>r.stdout.write(`${t} -`),r.stdout.isTTY?e:null),stderr:H5(t=>r.stderr.write(`${t} -`),r.stderr.isTTY?e:null)}}var DPe=(0,q5.promisify)(setTimeout);var zi;(function(t){t[t.Readable=1]="Readable",t[t.Writable=2]="Writable"})(zi||(zi={}));function J5(r,e,t){let i=new os.PassThrough({autoDestroy:!0});switch(r){case Fn.STDIN:(e&1)==1&&t.stdin.pipe(i,{end:!1}),(e&2)==2&&t.stdin instanceof os.Writable&&i.pipe(t.stdin,{end:!1});break;case Fn.STDOUT:(e&1)==1&&t.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stdout,{end:!1});break;case Fn.STDERR:(e&1)==1&&t.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stderr,{end:!1});break;default:throw new Ms(`Bad file descriptor: "${r}"`)}return i}function zw(r,e={}){let t=N(N({},r),e);return t.environment=N(N({},r.environment),e.environment),t.variables=N(N({},r.variables),e.variables),t}var RPe=new Map([["cd",async([r=(0,Y5.homedir)(),...e],t,i)=>{let n=k.resolve(i.cwd,H.toPortablePath(r));if(!(await t.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new Ms(`cd: no such file or directory: ${r}`):o})).isDirectory())throw new Ms(`cd: not a directory: ${r}`);return i.cwd=n,0}],["pwd",async(r,e,t)=>(t.stdout.write(`${H.fromPortablePath(t.cwd)} -`),0)],[":",async(r,e,t)=>0],["true",async(r,e,t)=>0],["false",async(r,e,t)=>1],["exit",async([r,...e],t,i)=>i.exitCode=parseInt(r!=null?r:i.variables["?"],10)],["echo",async(r,e,t)=>(t.stdout.write(`${r.join(" ")} -`),0)],["sleep",async([r],e,t)=>{if(typeof r=="undefined")throw new Ms("sleep: missing operand");let i=Number(r);if(Number.isNaN(i))throw new Ms(`sleep: invalid time interval '${r}'`);return await DPe(1e3*i,0)}],["__ysh_run_procedure",async(r,e,t)=>{let i=t.procedures[r[0]];return await Ww(i,{stdin:new mo(t.stdin),stdout:new mo(t.stdout),stderr:new mo(t.stderr)}).run()}],["__ysh_set_redirects",async(r,e,t)=>{let i=t.stdin,n=t.stdout,s=t.stderr,o=[],a=[],l=[],c=0;for(;r[c]!=="--";){let g=r[c++],{type:f,fd:h}=JSON.parse(g),p=v=>{switch(h){case null:case 0:o.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=v=>{switch(h){case null:case 1:a.push(v);break;case 2:l.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},y=Number(r[c++]),b=c+y;for(let v=c;ve.baseFs.createReadStream(k.resolve(t.cwd,H.toPortablePath(r[v]))));break;case"<<<":p(()=>{let x=new os.PassThrough;return process.nextTick(()=>{x.write(`${r[v]} -`),x.end()}),x});break;case"<&":p(()=>J5(Number(r[v]),1,t));break;case">":case">>":{let x=k.resolve(t.cwd,H.toPortablePath(r[v]));m(x==="/dev/null"?new os.Writable({autoDestroy:!0,emitClose:!0,write(T,q,Y){setImmediate(Y)}}):e.baseFs.createWriteStream(x,f===">>"?{flags:"a"}:void 0))}break;case">&":m(J5(Number(r[v]),2,t));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new os.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new os.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new os.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await Ww(Hd(r.slice(c+1),e,t),{stdin:new mo(i),stdout:new mo(n),stderr:new mo(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function FPe(r,e,t){let i=[],n=new os.PassThrough;return n.on("data",s=>i.push(s)),await _w(r,e,zw(t,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function W5(r,e,t){let i=r.map(async s=>{let o=await aA(s.args,e,t);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function Vw(r){return r.match(/[^ \r\n\t]+/g)||[]}async function z5(r,e,t,i,n=i){switch(r.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(r.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=Vw(s);for(let a=0;a=0&&sr+e,subtraction:(r,e)=>r-e,multiplication:(r,e)=>r*e,division:(r,e)=>Math.trunc(r/e)};async function jd(r,e,t){if(r.type==="number"){if(Number.isInteger(r.value))return r.value;throw new Error(`Invalid number: "${r.value}", only integers are allowed`)}else if(r.type==="variable"){let i=[];await z5(te(N({},r),{quoted:!0}),e,t,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?jd({type:"variable",name:i.join(" ")},e,t):jd({type:"number",value:n},e,t)}else return NPe[r.type](await jd(r.left,e,t),await jd(r.right,e,t))}async function aA(r,e,t){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of r){let g=!1;switch(u.type){case"redirection":{let f=await aA(u.args,e,t);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await FPe(f.shell,e,t);if(f.quoted)o(h);else{let p=Vw(h);for(let m=0;m0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Hd(r,e,t){e.builtins.has(r[0])||(r=["command",...r]);let i=H.fromPortablePath(t.cwd),n=t.environment;typeof n.PWD!="undefined"&&(n=te(N({},n),{PWD:i}));let[s,...o]=r;if(s==="command")return M5(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return K5(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=t;t.stdin=l,t.stdout=c,t.stderr=u;try{return await a(o,e,t)}finally{t.stdin=g,t.stdout=f,t.stderr=h}})}function LPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,zw(t,{stdin:n}));return{stdin:n,promise:s}}}function TPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,t);return{stdin:n,promise:s}}}function _5(r,e,t,i){if(e.length===0)return r;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=N({},i.procedures),i.procedures[n]=r,Hd([...e,"__ysh_run_procedure",n],t,i)}}async function V5(r,e,t){let i=r,n=null,s=null;for(;i;){let o=i.then?N({},t):t,a;switch(i.type){case"command":{let l=await aA(i.args,e,t),c=await W5(i.envs,e,t);a=i.envs.length?Hd(l,e,zw(o,{environment:c})):Hd(l,e,o)}break;case"subshell":{let l=await aA(i.args,e,t),c=LPe(i.subshell,e,o);a=_5(c,l,e,o)}break;case"group":{let l=await aA(i.args,e,t),c=TPe(i.group,e,o);a=_5(c,l,e,o)}break;case"envs":{let l=await W5(i.envs,e,t);o.environment=N(N({},o.environment),l),a=Hd(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=Ww(a,{stdin:new mo(o.stdin),stdout:new mo(o.stdout),stderr:new mo(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,Fn.STDOUT);break;case"|&":s=s.pipeTo(a,Fn.STDOUT|Fn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function OPe(r,e,t,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return G5.default.hex(a)}if(i){let s=t.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=j5(t,{prefix:l});return t.backgroundJobs.push(V5(r,e,zw(t,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} -`)).finally(()=>{t.stdout.isTTY&&t.stdout.write(`Job ${l}, '${o(eg(r))}' has ended -`)})),0}return await V5(r,e,t)}async function MPe(r,e,t,{background:i=!1}={}){let n,s=a=>{n=a,t.variables["?"]=String(a)},o=async a=>{try{return await OPe(a.chain,e,t,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof Ms))throw l;return t.stderr.write(`${l.message} -`),1}};for(s(await o(r));r.then;){if(t.exitCode!==null)return t.exitCode;switch(r.then.type){case"&&":n===0&&s(await o(r.then.line));break;case"||":n!==0&&s(await o(r.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${r.then.type}"`)}r=r.then.line}return n}async function _w(r,e,t){let i=t.backgroundJobs;t.backgroundJobs=[];let n=0;for(let{command:s,type:o}of r){if(n=await MPe(s,e,t,{background:o==="&"}),t.exitCode!==null)return t.exitCode;t.variables["?"]=String(n)}return await Promise.all(t.backgroundJobs),t.backgroundJobs=i,n}function X5(r){switch(r.type){case"variable":return r.name==="@"||r.name==="#"||r.name==="*"||Number.isFinite(parseInt(r.name,10))||"defaultValue"in r&&!!r.defaultValue&&r.defaultValue.some(e=>Gd(e))||"alternativeValue"in r&&!!r.alternativeValue&&r.alternativeValue.some(e=>Gd(e));case"arithmetic":return zP(r.arithmetic);case"shell":return _P(r.shell);default:return!1}}function Gd(r){switch(r.type){case"redirection":return r.args.some(e=>Gd(e));case"argument":return r.segments.some(e=>X5(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${r.type}"`)}}function zP(r){switch(r.type){case"variable":return X5(r);case"number":return!1;default:return zP(r.left)||zP(r.right)}}function _P(r){return r.some(({command:e})=>{for(;e;){let t=e.chain;for(;t;){let i;switch(t.type){case"subshell":i=_P(t.subshell);break;case"command":i=t.envs.some(n=>n.args.some(s=>Gd(s)))||t.args.some(n=>Gd(n));break}if(i)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Xw(r,e=[],{baseFs:t=new ar,builtins:i={},cwd:n=H.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=Yw}={}){let g={};for(let[p,m]of Object.entries(s))typeof m!="undefined"&&(g[p]=m);let f=new Map(RPe);for(let[p,m]of Object.entries(i))f.set(p,m);o===null&&(o=new os.PassThrough,o.end());let h=_E(r,u);if(!_P(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let m=p.chain;for(;m.then;)m=m.then.chain;m.type==="command"&&(m.args=m.args.concat(e.map(y=>({type:"argument",segments:[{type:"text",text:y}]}))))}return await _w(h,{args:e,baseFs:t,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var O9=ge(Zw()),M9=ge(gg()),El=ge(require("stream"));var R9=ge(D9()),tB=ge(Ic());var F9=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],N9=80,TDe=new Set([X.FETCH_NOT_CACHED,X.UNUSED_CACHE_ENTRY]),ODe=5,rB=tB.default.GITHUB_ACTIONS?{start:r=>`::group::${r} -`,end:r=>`::endgroup:: -`}:tB.default.TRAVIS?{start:r=>`travis_fold:start:${r} -`,end:r=>`travis_fold:end:${r} -`}:tB.default.GITLAB?{start:r=>`section_start:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${r} -`,end:r=>`section_end:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}\r`}:null,L9=new Date,MDe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,KDe=r=>r,iB=KDe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),UDe=MDe&&Object.keys(iB).find(r=>{let e=iB[r];return!(e.date&&(e.date[0]!==L9.getDate()||e.date[1]!==L9.getMonth()+1))})||"default";function T9(r,{configuration:e,json:t}){if(!e.get("enableMessageNames"))return"";let n=_A(r===null?0:r);return!t&&r===null?tt(e,n,"grey"):n}function eD(r,{configuration:e,json:t}){let i=T9(r,{configuration:e,json:t});if(!i||r===null||r===X.UNNAMED)return i;let n=X[r],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Mg(e,i,s)}var Je=class extends Ji{constructor({configuration:e,stdout:t,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=ODe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(nd(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...TDe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=t,e.get("enableProgressBars")&&!i&&t.isTTY&&t.columns>22){let u=e.get("progressBarStyle")||UDe;if(!Object.prototype.hasOwnProperty.call(iB,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=iB[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(t.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}}static async start(e,t){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(X.UNNAMED,a)};try{await t(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,t){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof t!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(X.FETCH_NOT_CACHED,t)}startSectionSync({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}async startSectionPromise({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return await n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}startTimerImpl(e,t,i){let n=typeof t=="function"?{}:t;return{cb:typeof t=="function"?t:i,reportHeader:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.start(e))},reportFooter:o=>{this.indent-=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.end(e)),this.configuration.get("enableTimers")&&o>200?this.reportInfo(null,`\u2514 Completed in ${tt(this.configuration,o,qe.DURATION)}`):this.reportInfo(null,"\u2514 Completed")},skipIfEmpty:n.skipIfEmpty}}startTimerSync(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionSync(s,n)}async startTimerPromise(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionPromise(s,n)}async startCacheReport(e){let t=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{t!==null&&this.reportCacheChanges(t)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,t){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${tt(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${t}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,t){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${t}`)}reportError(e,t){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${t}`,{truncate:!1})}reportProgress(e){if(this.progressStyle===null)return te(N({},Promise.resolve()),{stop:()=>{}});if(e.hasProgress&&e.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let t=!1,i=Promise.resolve().then(async()=>{let s={progress:e.hasProgress?0:void 0,title:e.hasTitle?"":void 0};this.progress.set(e,{definition:s,lastScaledSize:e.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:o,title:a}of e)t||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{t||(t=!0,this.progress.delete(e),this.refreshProgress({delta:1}))};return te(N({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let t=tt(this.configuration,Date.now()-this.startTime,qe.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${t}`:e;this.errorCount>0?this.reportError(X.UNNAMED,i):this.warningCount>0?this.reportWarning(X.UNNAMED,i):this.reportInfo(X.UNNAMED,i)}writeLine(e,{truncate:t}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:t})} -`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:t}={}){this.forgettableLines=[],this.writeLine(e,{truncate:t})}writeLines(e,{truncate:t}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:t})} -`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:t}){let i=this.cacheHitCount-e,n=this.cacheMissCount-t;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${It(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${It(this.configuration,this.lastCacheMiss)})`),this.reportInfo(X.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let t of e)t.committed=!0,t.action()}clearProgress({delta:e=0,clear:t=!1}){this.progressStyle!==null&&this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||t)&&this.stdout.write(""))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>N9&&(this.progressFrame=(this.progressFrame+1)%F9.length,this.progressTime=e);let t=F9[this.progressFrame];for(let i of this.progress.values()){let n="";if(typeof i.lastScaledSize!="undefined"){let l=this.progressStyle.chars[0].repeat(i.lastScaledSize),c=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize);n=` ${l}${c}`}let s=this.formatName(null),o=s?`${s}: `:"",a=i.definition.title?` ${i.definition.title}`:"";this.stdout.write(`${tt(this.configuration,"\u27A4","blueBright")} ${o}${t}${n}${a} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},N9)}refreshProgress({delta:e=0,force:t=!1}={}){let i=!1,n=!1;if(t||this.progress.size===0)i=!0;else for(let s of this.progress.values()){let o=typeof s.definition.progress!="undefined"?Math.trunc(this.progressMaxScaledSize*s.definition.progress):void 0,a=s.lastScaledSize;s.lastScaledSize=o;let l=s.lastTitle;if(s.lastTitle=s.definition.title,o!==a||(n=l!==s.definition.title)){i=!0;break}}i&&(this.clearProgress({delta:e,clear:n}),this.writeProgress())}truncate(e,{truncate:t}={}){return this.progressStyle===null&&(t=!1),typeof t=="undefined"&&(t=this.configuration.get("preferTruncatedLines")),t&&(e=(0,R9.default)(e,0,this.stdout.columns-1)),e}formatName(e){return T9(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Ur="3.2.2";var hn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(hn||(hn={}));async function AA(r,e,t,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${t}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await K.writeFilePromise(k.format({dir:r,name:e,ext:".cmd"}),n)}await K.writeFilePromise(k.join(r,e),`#!/bin/sh -exec "${t}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function K9(r){let e=await At.tryFind(r);if(e==null?void 0:e.packageManager){let i=lw(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?hn.Yarn1:hn.Yarn2,reason:n};case"npm":return{packageManager:hn.Npm,reason:n};case"pnpm":return{packageManager:hn.Pnpm,reason:n}}}}let t;try{t=await K.readFilePromise(k.join(r,kt.lockfile),"utf8")}catch{}return t!==void 0?t.match(/^__metadata:$/m)?{packageManager:hn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:hn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:K.existsSync(k.join(r,"package-lock.json"))?{packageManager:hn.Npm,reason:`found npm's "package-lock.json" lockfile`}:K.existsSync(k.join(r,"pnpm-lock.yaml"))?{packageManager:hn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Yd({project:r,locator:e,binFolder:t,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=H.fromPortablePath(t);n.BERRY_BIN_FOLDER=H.fromPortablePath(s);let o=process.env.COREPACK_ROOT?H.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([AA(t,"node",process.execPath),...Ur!==null?[AA(t,"run",process.execPath,[o,"run"]),AA(t,"yarn",process.execPath,[o]),AA(t,"yarnpkg",process.execPath,[o]),AA(t,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),r&&(n.INIT_CWD=H.fromPortablePath(r.configuration.startingCwd),n.PROJECT_CWD=H.fromPortablePath(r.cwd)),n.PATH=n.PATH?`${s}${H.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${H.sep}yarn`,n.npm_node_execpath=`${s}${H.sep}node`,e){if(!r)throw new Error("Assertion failed: Missing project");let u=r.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=r.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=Ot(e),n.npm_package_version=g;let f;if(u)f=u.cwd;else{let h=r.storedPackages.get(e.locatorHash);if(!h)throw new Error(`Package for ${It(r.configuration,e)} not found in the project`);let p=r.configuration.getLinkers(),m={project:r,report:new Je({stdout:new El.PassThrough,configuration:r.configuration})},y=p.find(b=>b.supportsPackage(h,m));if(!y)throw new Error(`The package ${It(r.configuration,h)} isn't supported by any of the available linkers`);f=await y.findPackageLocation(h,m)}n.npm_package_json=H.fromPortablePath(k.join(f,kt.manifest))}let a=Ur!==null?`yarn/${Ur}`:`yarn/${Og("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.version} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),r&&await r.configuration.triggerHook(u=>u.setupScriptEnvironment,r,n,async(u,g,f)=>await AA(t,Jr(u),g,f)),n}var HDe=2,jDe=(0,M9.default)(HDe);async function GDe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await jDe(async()=>{await K.mktempPromise(async o=>{let a=k.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=t.getSubprocessStreams(a,{prefix:H.fromPortablePath(r),report:i}),g=s&&ea(s)?gd(s):s,f=g?Rs(g):"an external project";c.write(`Packing ${f} from sources -`);let h=await K9(r),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} - -`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn - -`),p=hn.Yarn2),await K.mktempPromise(async m=>{let y=await Yd({binFolder:m}),v=new Map([[hn.Yarn1,async()=>{let T=n!==null?["workspace",n]:[],q=await ra("yarn",["set","version","classic","--only-if-needed"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;await K.appendFilePromise(k.join(r,".npmignore"),`/.yarn -`),c.write(` -`),delete y.NODE_ENV;let Y=await ra("yarn",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(Y.code!==0)return Y.code;c.write(` -`);let $=await ra("yarn",[...T,"pack","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return $.code!==0?$.code:0}],[hn.Yarn2,async()=>{let T=n!==null?["workspace",n]:[];y.YARN_ENABLE_INLINE_BUILDS="1";let q=k.join(r,kt.lockfile);await K.existsPromise(q)||await K.writeFilePromise(q,"");let Y=await ra("yarn",[...T,"pack","--install-if-needed","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return Y.code!==0?Y.code:0}],[hn.Npm,async()=>{if(n!==null){let A=new El.PassThrough,oe=Tg(A);A.pipe(c,{end:!1});let ce=await ra("npm",["--version"],{cwd:r,env:y,stdin:l,stdout:A,stderr:u,end:ss.Never});if(A.end(),ce.code!==0)return c.end(),u.end(),ce.code;let Z=(await oe).toString().trim();if(!qc(Z,">=7.x")){let O=$o(null,"npm"),L=rr(O,Z),de=rr(O,">=7.x");throw new Error(`Workspaces aren't supported by ${sr(t,L)}; please upgrade to ${sr(t,de)} (npm has been detected as the primary package manager for ${tt(t,r,qe.PATH)})`)}}let T=n!==null?["--workspace",n]:[];delete y.npm_config_user_agent,delete y.npm_config_production,delete y.NPM_CONFIG_PRODUCTION,delete y.NODE_ENV;let q=await ra("npm",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;let Y=new El.PassThrough,$=Tg(Y);Y.pipe(c);let _=await ra("npm",["pack","--silent",...T],{cwd:r,env:y,stdin:l,stdout:Y,stderr:u});if(_.code!==0)return _.code;let ne=(await $).toString().trim().replace(/^.*\n/s,""),ee=k.resolve(r,H.toPortablePath(ne));return await K.renamePromise(ee,e),0}]]).get(p);if(typeof v=="undefined")throw new Error("Assertion failed: Unsupported workflow");let x=await v();if(!(x===0||typeof x=="undefined"))throw K.detachTemp(o),new ct(X.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${x}, logs can be found here: ${tt(t,a,qe.PATH)})`)})})})}async function YDe(r,e,{project:t}){let i=t.tryWorkspaceByLocator(r);if(i!==null)return tD(i,e);let n=t.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t.configuration,r)} not found in the project`);return await Is.openPromise(async s=>{let o=t.configuration,a=t.configuration.getLinkers(),l={project:t,report:new Je({stdout:new El.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${It(t.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new _t(u,{baseFs:s});return(await At.find(Me.dot,{baseFs:g})).scripts.has(e)},{libzip:await fn()})}async function nB(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await U9(r,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await Xw(f,t,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(m=>m.wrapScriptExecution,h,n,r,e,{script:f,args:t,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function rD(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{env:c,cwd:u}=await U9(r,{project:n,binFolder:l,cwd:i});return await Xw(e,t,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function qDe(r,{binFolder:e,cwd:t,lifecycleScript:i}){let n=await Yd({project:r.project,locator:r.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await H9(r),([s,[,o]])=>AA(e,Jr(s),process.execPath,[o]))),typeof t=="undefined"&&(t=k.dirname(await K.realpathPromise(k.join(r.cwd,"package.json")))),{manifest:r.manifest,binFolder:e,env:n,cwd:t}}async function U9(r,{project:e,binFolder:t,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(r);if(s!==null)return qDe(s,{binFolder:t,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(r.locatorHash);if(!o)throw new Error(`Package for ${It(e.configuration,r)} not found in the project`);return await Is.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Je({stdout:new El.PassThrough,configuration:l})},g=c.find(y=>y.supportsPackage(o,u));if(!g)throw new Error(`The package ${It(e.configuration,o)} isn't supported by any of the available linkers`);let f=await Yd({project:e,locator:r,binFolder:t,lifecycleScript:n});await Promise.all(Array.from(await sB(r,{project:e}),([y,[,b]])=>AA(t,Jr(y),process.execPath,[b])));let h=await g.findPackageLocation(o,u),p=new _t(h,{baseFs:a}),m=await At.find(Me.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:m,binFolder:t,env:f,cwd:i}},{libzip:await fn()})}async function j9(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o}){return await nB(r.anchoredLocator,e,t,{cwd:i,project:r.project,stdin:n,stdout:s,stderr:o})}function tD(r,e){return r.manifest.scripts.has(e)}async function G9(r,e,{cwd:t,report:i}){let{configuration:n}=r.project,s=null;await K.mktempPromise(async o=>{let a=k.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${H.fromPortablePath(r.cwd)}") -`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:It(n,r.anchoredLocator),header:l});i.reportInfo(X.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await j9(r,e,[],{cwd:t,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw K.detachTemp(o),new ct(X.LIFECYCLE_SCRIPT,`${(0,O9.default)(e)} script failed (exit code ${tt(n,g,qe.NUMBER)}, logs can be found here: ${tt(n,a,qe.PATH)}); run ${tt(n,`yarn ${e}`,qe.CODE)} to investigate`)})}async function JDe(r,e,t){tD(r,e)&&await G9(r,e,t)}async function sB(r,{project:e}){let t=e.configuration,i=new Map,n=e.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t,r)} not found in the project`);let s=new El.Writable,o=t.getLinkers(),a={project:e,report:new Je({configuration:t,stdout:s})},l=new Set([r.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${sr(t,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return zo.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return zo.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return zo.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===zo.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,H.fromPortablePath(k.resolve(f,p))])}return i}async function H9(r){return await sB(r.anchoredLocator,{project:r.project})}async function Y9(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await sB(r,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${It(n.configuration,r)}`);return await K.mktempPromise(async g=>{let[,f]=u,h=await Yd({project:n,locator:r,binFolder:g});await Promise.all(Array.from(c,([m,[,y]])=>AA(h.BERRY_BIN_FOLDER,Jr(m),process.execPath,[y])));let p;try{p=await ra(process.execPath,[...l,f,...t],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await K.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function WDe(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await Y9(r.anchoredLocator,e,t,{project:r.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Bi={};ft(Bi,{convertToZip:()=>iNe,extractArchiveTo:()=>sNe,makeArchiveFromDirectory:()=>rNe});var T6=ge(require("stream")),O6=ge(P6());var D6=ge(require("os")),R6=ge(gg()),F6=ge(require("worker_threads")),Dl=Symbol("kTaskInfo"),pR=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,R6.default)(Math.max(1,(0,D6.cpus)().length));this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let t=this.workers.pop();t?t.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new F6.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",t=>{if(!e[Dl])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[Dl].resolve(t),e[Dl]=null,e.unref(),this.workers.push(e)}),e.on("error",t=>{var i;(i=e[Dl])==null||i.reject(t),e[Dl]=null}),e.on("exit",t=>{var i;t!==0&&((i=e[Dl])==null||i.reject(new Error(`Worker exited with code ${t}`))),e[Dl]=null}),e}run(e){return this.limit(()=>{var i;let t=(i=this.workers.pop())!=null?i:this.createWorker();return t.ref(),new Promise((n,s)=>{t[Dl]={resolve:n,reject:s},t.postMessage(e)})})}};var M6=ge(L6());async function rNe(r,{baseFs:e=new ar,prefixPath:t=Me.root,compressionLevel:i,inMemory:n=!1}={}){let s=await fn(),o;if(n)o=new li(null,{libzip:s,level:i});else{let l=await K.mktempPromise(),c=k.join(l,"archive.zip");o=new li(c,{create:!0,libzip:s,level:i})}let a=k.resolve(Me.root,t);return await o.copyPromise(a,r,{baseFs:e,stableTime:!0,stableSort:!0}),o}var K6;async function iNe(r,e){let t=await K.mktempPromise(),i=k.join(t,"archive.zip");return K6||(K6=new pR((0,M6.getContent)())),await K6.run({tmpFile:i,tgz:r,opts:e}),new li(i,{libzip:await fn(),level:e.compressionLevel})}async function*nNe(r){let e=new O6.default.Parse,t=new T6.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{t.write(i)}),e.on("error",i=>{t.destroy(i)}),e.on("close",()=>{t.destroyed||t.end()}),e.end(r);for await(let i of t){let n=i;yield n,n.resume()}}async function sNe(r,e,{stripComponents:t=0,prefixPath:i=Me.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=t)}for await(let a of nNe(r)){if(n(a))continue;let l=k.normalize(H.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=t)continue;let c=l.slice(t).join("/"),u=k.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.writeFileSync(u,await Tg(a),{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,Rr.SAFE_TIME,Rr.SAFE_TIME);break}}return e}var ls={};ft(ls,{emitList:()=>oNe,emitTree:()=>q6,treeNodeToJson:()=>Y6,treeNodeToTreeify:()=>G6});var j6=ge(H6());function G6(r,{configuration:e}){let t={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Ry(e,l,Tc.BOLD)),typeof c!="undefined"&&g.push(tt(e,c[0],c[1])),g.length===0&&g.push(Ry(e,`${a}`,Tc.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof r.children=="undefined")throw new Error("The root node must only contain children");return i(r.children,t),t}function Y6(r){let e=t=>{var s;if(typeof t.children=="undefined"){if(typeof t.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Oc(t.value[0],t.value[1])}let i=Array.isArray(t.children)?t.children.entries():Object.entries((s=t.children)!=null?s:{}),n=Array.isArray(t.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof t.value=="undefined"?n:{value:Oc(t.value[0],t.value[1]),children:n}};return e(r)}function oNe(r,{configuration:e,stdout:t,json:i}){let n=r.map(s=>({value:s}));q6({children:n},{configuration:e,stdout:t,json:i})}function q6(r,{configuration:e,stdout:t,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(r.children)?r.children.values():Object.values((o=r.children)!=null?o:{});for(let l of a)t.write(`${JSON.stringify(Y6(l))} -`);return}let s=(0,j6.asTree)(G6(r,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");t.write(s)}var J6=ge(require("crypto")),mR=ge(require("fs"));var aNe=8,Nt=class{constructor(e,{configuration:t,immutable:i=t.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,J6.randomBytes)(8).toString("hex")}.tmp`;this.configuration=t,this.cwd=e,this.immutable=i,this.check=n;let s=t.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=t.get("compressionLevel"),a=o!==lc?`c${o}`:"";this.cacheKey=[aNe,a].join("")}}static async find(e,{immutable:t,check:i}={}){let n=new Nt(e.get("cacheFolder"),{configuration:e,immutable:t,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Jg(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){let n=ANe(t).slice(0,10);return`${Jg(e)}-${n}.zip`}getLocatorPath(e,t,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?k.resolve(this.cwd,this.getVersionFilename(e)):t===null||ER(t)!==this.cacheKey?null:k.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){let t=this.mirrorCwd;return t!==null?k.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await K.existsPromise(this.cwd))throw new ct(X.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await K.mkdirPromise(this.cwd,{recursive:!0});let e=k.resolve(this.cwd,".gitignore");await K.changeFilePromise(e,`/.gitignore -*.flock -*.tmp -`)}(this.mirrorCwd||!this.immutable)&&await K.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,t,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=Or(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new ar,g=()=>{let oe=new li(null,{libzip:q}),ce=k.join(Me.root,ek(e));return oe.mkdirSync(ce,{recursive:!0}),oe.writeJsonSync(k.join(ce,kt.manifest),{name:Ot(e),mocked:!0}),oe},f=async(oe,ce=null)=>{var O;if(ce===null&&((O=o.unstablePackages)==null?void 0:O.has(e.locatorHash)))return null;let Z=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(oe)}`:t;if(ce!==null){let L=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(ce)}`:t;if(Z!==L)throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(t!==null&&Z!==t){let L;switch(this.check?L="throw":ER(t)!==ER(Z)?L="update":L=this.configuration.get("checksumBehavior"),L){case"ignore":return t;case"update":return Z;default:case"throw":throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return Z},h=async oe=>{if(!s)throw new Error(`Cache check required but no loader configured for ${It(this.configuration,e)}`);let ce=await s(),Z=ce.getRealPath();return ce.saveAndClose(),await K.chmodPromise(Z,420),await f(oe,Z)},p=async()=>{if(c===null||!await K.existsPromise(c)){let oe=await s(),ce=oe.getRealPath();return oe.saveAndClose(),{source:"loader",path:ce}}return{source:"mirror",path:c}},m=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${It(this.configuration,e)}`);if(this.immutable)throw new ct(X.IMMUTABLE_CACHE,`Cache entry required but missing for ${It(this.configuration,e)}`);let{path:oe,source:ce}=await p(),Z=await f(oe),O=this.getLocatorPath(e,Z,o);if(!O)throw new Error("Assertion failed: Expected the cache path to be available");let L=[];ce!=="mirror"&&c!==null&&L.push(async()=>{let Be=`${c}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,c)}),(!o.mirrorWriteOnly||c===null)&&L.push(async()=>{let Be=`${O}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,O)});let de=o.mirrorWriteOnly&&c!=null?c:O;return await Promise.all(L.map(Be=>Be())),[!1,de,Z]},y=async()=>{let ce=(async()=>{var je;let Z=this.getLocatorPath(e,t,o),O=Z!==null?await u.existsPromise(Z):!1,L=!!((je=o.mockedPackages)==null?void 0:je.has(e.locatorHash))&&(!this.check||!O),de=L||O,Be=de?i:n;if(Be&&Be(),de){let re=null,se=Z;return L||(re=this.check?await h(se):await f(se)),[L,se,re]}else return m()})();this.mutexes.set(e.locatorHash,ce);try{return await ce}finally{this.mutexes.delete(e.locatorHash)}};for(let oe;oe=this.mutexes.get(e.locatorHash);)await oe;let[b,v,x]=await y();this.markedFiles.add(v);let T,q=await fn(),Y=b?()=>g():()=>new li(v,{baseFs:u,libzip:q,readOnly:!0}),$=new _h(()=>Rv(()=>T=Y(),oe=>`Failed to open the cache entry for ${It(this.configuration,e)}: ${oe}`),k),_=new Na(v,{baseFs:$,pathUtils:k}),ne=()=>{T==null||T.discardAndClose()},ee=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:x;return[_,ne,ee]}};function ER(r){let e=r.indexOf("/");return e!==-1?r.slice(0,e):null}function ANe(r){let e=r.indexOf("/");return e!==-1?r.slice(e+1):r}var cs;(function(t){t[t.SCRIPT=0]="SCRIPT",t[t.SHELLCODE=1]="SHELLCODE"})(cs||(cs={}));var pA=class extends Ji{constructor({configuration:e,stdout:t,suggestInstall:i=!0}){super();this.errorCount=0;nd(this,{configuration:e}),this.configuration=e,this.stdout=t,this.suggestInstall=i}static async start(e,t){let i=new this(e);try{await t(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){this.errorCount+=1,this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${t} -`)}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:!1})}};var i0=ge(require("crypto"));function dA(){}dA.prototype={diff:function(e,t){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(m){return n?(setTimeout(function(){n(void 0,m)},0),!0):m}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var a=t.length,l=e.length,c=1,u=a+l;i.maxEditLength&&(u=Math.min(u,i.maxEditLength));var g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],t,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(t),count:t.length}]);function h(){for(var m=-1*c;m<=c;m+=2){var y=void 0,b=g[m-1],v=g[m+1],x=(v?v.newPos:0)-m;b&&(g[m-1]=void 0);var T=b&&b.newPos+1=a&&x+1>=l)return o(lNe(s,y.components,t,e,s.useLongestToken));g[m]=y}c++}if(n)(function m(){setTimeout(function(){if(c>u)return n();h()||m()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,t,i){var n=e[e.length-1];n&&n.added===t&&n.removed===i?e[e.length-1]={count:n.count+1,added:t,removed:i}:e.push({count:1,added:t,removed:i})},extractCommon:function(e,t,i,n){for(var s=t.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?m:h}),c.value=r.join(u)}else c.value=r.join(t.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&r.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function cNe(r){return{newPos:r.newPos,components:r.components.slice(0)}}var nAt=new dA;var W6=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,z6=/\S/,_6=new dA;_6.equals=function(r,e){return this.options.ignoreCase&&(r=r.toLowerCase(),e=e.toLowerCase()),r===e||this.options.ignoreWhitespace&&!z6.test(r)&&!z6.test(e)};_6.tokenize=function(r){for(var e=r.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),t=0;tr.length)&&(e=r.length);for(var t=0,i=new Array(e);t0?l(Y.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(q=f).push.apply(q,yR(T.map(function(Z){return(x.added?"+":"-")+Z}))),x.added?p+=T.length:h+=T.length}else{if(u)if(T.length<=o.context*2&&v=a.length-2&&T.length<=o.context){var A=/\n$/.test(t),oe=/\n$/.test(i),ce=T.length==0&&f.length>ee.oldLines;!A&&ce&&t.length>0&&f.splice(ee.oldLines,0,"\\ No newline at end of file"),(!A&&!ce||!oe)&&f.push("\\ No newline at end of file")}c.push(ee),u=0,g=0,f=[]}h+=T.length,p+=T.length}},y=0;y`${t}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,r=>`npm:${r}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(r,e)=>cw({protocol:"npm:",source:null,selector:r,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,r=>`npm:${r}`]],NR=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:t}){let i=k.join(e.cwd,e.configuration.get("lockfileFilename"));if(!K.existsSync(i))return;let n=await K.readFilePromise(i,"utf8"),s=Si(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=pd(a);if(!l){t.reportWarning(X.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}po(l.range)&&(l=rr(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of JOe){let m=u.match(h);if(m){g=p(c,...m);break}}if(!g){t.reportWarning(X.YARN_IMPORT_FAILED,`${sr(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=qg(l.range),p=pd(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,cn(f,g))}}supportsDescriptor(e,t){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return await this.resolver.getCandidates(_x(n),t,i)}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var LR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return!!(t.project.storedResolutions.get(e.descriptorHash)||t.project.originalPackages.has(Aw(e).locatorHash))}supportsLocator(e,t){return!!(t.project.originalPackages.has(e.locatorHash)&&!t.project.lockfileNeedsRefresh)}shouldPersistResolution(e,t){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){let n=i.project.originalPackages.get(Aw(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var TR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.resolver.bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,t){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var di=class extends Ji{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){}};var iZ=ge(Wx());var CC=class{constructor(e,{project:t}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=t,this.cwd=e}async setup(){var s;this.manifest=(s=await At.tryFind(this.cwd))!=null?s:new At,this.relativeCwd=k.relative(this.project.cwd,this.cwd)||Me.dot;let e=this.manifest.name?this.manifest.name:$o(null,`${this.computeCandidateName()}-${ln(this.relativeCwd).substring(0,6)}`),t=this.manifest.version?this.manifest.version:"0.0.0";this.locator=cn(e,t),this.anchoredDescriptor=rr(this.locator,`${oi.protocol}${this.relativeCwd}`),this.anchoredLocator=cn(this.locator,`${oi.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o),n=await(0,iZ.default)(i,{cwd:H.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let o of n){let a=k.resolve(this.cwd,H.toPortablePath(o));K.existsSync(k.join(a,"package.json"))&&this.workspacesCwds.add(a)}}accepts(e){var o;let t=e.indexOf(":"),i=t!==-1?e.slice(0,t+1):null,n=t!==-1?e.slice(t+1):e;if(i===oi.protocol&&k.normalize(n)===this.relativeCwd||i===oi.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=po(n);return s?i===oi.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${k.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||t.has(a)||(t.add(a),i(a))}};return i(this),t}getRecursiveWorkspaceDependents({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&hd(c.anchoredLocator,n.anchoredLocator)}))&&!t.has(s)&&(t.add(s),i(s))};return i(this),t}getRecursiveWorkspaceChildren(){let e=[];for(let t of this.workspacesCwds){let i=this.project.workspacesByCwd.get(t);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let t=k.join(this.cwd,At.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} -`;await K.changeFilePromise(t,i,{automaticNewlines:!0}),this.manifest.raw=e}};var oZ=6,WOe=1,zOe=/ *, */g,aZ=/\/$/,_Oe=32,VOe=(0,OR.promisify)(KR.default.gzip),XOe=(0,OR.promisify)(KR.default.gunzip),Ci;(function(t){t.UpdateLockfile="update-lockfile",t.SkipBuild="skip-build"})(Ci||(Ci={}));var UR={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},AZ=r=>ln(`${WOe}`,r),ze=class{constructor(e,{configuration:t}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=t,this.cwd=e}static async find(e,t){var p,m,y;if(!e.projectCwd)throw new Pe(`No project found in ${t}`);let i=e.projectCwd,n=t,s=null;for(;s!==e.projectCwd;){if(s=n,K.existsSync(k.join(s,kt.manifest))){i=s;break}n=k.dirname(s)}let o=new ze(e.projectCwd,{configuration:e});(p=ye.telemetry)==null||p.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(m=ye.telemetry)==null||m.reportWorkspaceCount(o.workspaces.length),(y=ye.telemetry)==null||y.reportDependencyCount(o.workspaces.reduce((b,v)=>b+v.manifest.dependencies.size+v.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};let c=tt(e,o.cwd,qe.PATH),u=tt(e,k.relative(o.cwd,i),qe.PATH),g=`- If ${c} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,f=`- If ${c} is intended to be a project, it might be that you forgot to list ${u} in its workspace configuration.`,h=`- Finally, if ${c} is fine and you intend ${u} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new Pe(`The nearest package directory (${tt(e,i,qe.PATH)}) doesn't seem to be part of the project declared in ${tt(e,o.cwd,qe.PATH)}. - -${[g,f,h].join(` -`)}`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.configuration.get("defaultLanguageName");if(K.existsSync(e)){let n=await K.readFilePromise(e,"utf8");this.lockFileChecksum=AZ(n);let s=Si(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let t=e;e=[];for(let i of t){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let t=new CC(e,{project:this});await t.setup();let i=this.workspacesByIdent.get(t.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${fi(this.configuration,t.locator)}: ${H.fromPortablePath(e)} conflicts with ${H.fromPortablePath(i.cwd)}`);return this.workspaces.push(t),this.workspacesByCwd.set(e,t),this.workspacesByIdent.set(t.locator.identHash,t),t}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){k.isAbsolute(e)||(e=k.resolve(this.cwd,e)),e=k.normalize(e).replace(/\/+$/,"");let t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){let t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(let i of this.workspaces)k.relative(i.cwd,e).startsWith("../")||t&&t.cwd.length>=i.cwd.length||(t=i);return t||null}getWorkspaceByFilePath(e){let t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){let t=this.workspacesByIdent.get(e.identHash);return typeof t=="undefined"?null:t}getWorkspaceByIdent(e){let t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${fi(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){let t=this.tryWorkspaceByIdent(e);return t===null||(Al(e)&&(e=ud(e)),!t.accepts(e.range))?null:t}getWorkspaceByDescriptor(e){let t=this.tryWorkspaceByDescriptor(e);if(t===null)throw new Error(`Workspace not found (${sr(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){let t=this.tryWorkspaceByIdent(e);return t===null||(ea(e)&&(e=gd(e)),t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash)?null:t}getWorkspaceByLocator(e){let t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${It(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(let e of this.workspaces){let t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error(`Assertion failed: Expected workspace ${Cd(this.configuration,e)} (${tt(this.configuration,k.join(e.cwd,kt.manifest),qe.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(t.dependencies)}}forgetResolution(e){let t=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);t(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&t(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let t of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(t,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(t)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[t,i]of e.dependencies)Al(i)&&e.dependencies.set(t,ud(i))}getDependencyMeta(e,t){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(Ot(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),t===null||!sZ.default.valid(t))return i;for(let[a,l]of s)a!==null&&a===t&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:t=!1}={}){let i=new di,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(t&&(await o.findPackageLocation(a,s)).replace(aZ,"")!==e.replace(aZ,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let t=e.resolver||this.configuration.makeResolver(),i=new NR(t);await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new TR(t)]:[i,t],s=new wd([new LR(t),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,m=new Set,y=[],b=ck(),v=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ji.progressViaTitle(),async ne=>{let ee=async O=>{let L=await Lg(async()=>await s.resolve(O,a),je=>`${It(this.configuration,O)}: ${je}`);if(!hd(O,L))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${It(this.configuration,O)} to ${It(this.configuration,L)})`);g.set(L.locatorHash,L);let de=this.configuration.normalizePackage(L);for(let[je,re]of de.dependencies){let se=await this.configuration.reduceHook(he=>he.reduceDependency,re,this,de,re,{resolver:s,resolveOptions:a});if(!fd(re,se))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let be=s.bindDescriptor(se,O,a);de.dependencies.set(je,be)}let Be=go([...de.dependencies.values()].map(je=>Z(je)));return y.push(Be),Be.catch(()=>{}),c.set(de.locatorHash,de),de},A=async O=>{let L=f.get(O.locatorHash);if(typeof L!="undefined")return L;let de=Promise.resolve().then(()=>ee(O));return f.set(O.locatorHash,de),de},oe=async(O,L)=>{let de=await Z(L);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,de.locatorHash),de},ce=async O=>{ne.setTitle(sr(this.configuration,O));let L=this.resolutionAliases.get(O.descriptorHash);if(typeof L!="undefined")return oe(O,this.storedDescriptors.get(L));let de=s.getResolutionDependencies(O,a),Be=new Map(await go(de.map(async se=>{let be=s.bindDescriptor(se,p,a),he=await Z(be);return m.add(he.locatorHash),[se.descriptorHash,he]}))),re=(await Lg(async()=>await s.getCandidates(O,Be,a),se=>`${sr(this.configuration,O)}: ${se}`))[0];if(typeof re=="undefined")throw new Error(`${sr(this.configuration,O)}: No candidates found`);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,re.locatorHash),A(re)},Z=O=>{let L=h.get(O.descriptorHash);if(typeof L!="undefined")return L;l.set(O.descriptorHash,O);let de=Promise.resolve().then(()=>ce(O));return h.set(O.descriptorHash,de),de};for(let O of this.workspaces){let L=O.anchoredDescriptor;y.push(Z(L))}for(;y.length>0;){let O=[...y];y.length=0,await go(O)}});let x=new Set(this.resolutionAliases.values()),T=new Set(c.keys()),q=new Set,Y=new Map;ZOe({project:this,report:e.report,accessibleLocators:q,volatileDescriptors:x,optionalBuilds:T,peerRequirements:Y,allDescriptors:l,allResolutions:u,allPackages:c});for(let ne of m)T.delete(ne);for(let ne of x)l.delete(ne),u.delete(ne);let $=new Set,_=new Set;for(let ne of c.values())ne.conditions!=null&&(!T.has(ne.locatorHash)||(gw(ne,v)||(gw(ne,b)&&e.report.reportWarningOnce(X.GHOST_ARCHITECTURE,`${It(this.configuration,ne)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${tt(this.configuration,"supportedArchitectures",Ri.SETTING)} setting`),_.add(ne.locatorHash)),$.add(ne.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=q,this.conditionalLocators=$,this.disabledLocators=_,this.originalPackages=g,this.optionalBuilds=T,this.peerRequirements=Y,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,cacheOptions:s},l=Array.from(new Set(kn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return Rs(h)}])));n===Ci.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Ji.progressViaCounter(l.length);t.reportProgress(u);let g=(0,nZ.default)(_Oe);if(await t.startCacheReport(async()=>{await go(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(ea(h))return;let p;try{p=await o.fetch(h,a)}catch(m){m.message=`${It(this.configuration,h)}: ${m.message}`,t.reportExceptionOnce(m),c=m;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:t,fetcher:i,mode:n}){var A,oe,ce;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:t},u=new Map(l.map(Z=>{let O=Z.makeInstaller(c),L=O.getCustomDataKey(),de=this.installersCustomData.get(L);return typeof de!="undefined"&&O.attachCustomData(de),[Z,O]})),g=new Map,f=new Map,h=new Map,p=new Map(await go([...this.accessibleLocators].map(async Z=>{let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");return[Z,await o.fetch(O,a)]}))),m=[];for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(typeof O=="undefined")throw new Error("Assertion failed: The locator should have been registered");let L=p.get(O.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let de=[],Be=re=>{de.push(re)},je=this.tryWorkspaceByLocator(O);if(je!==null){let re=[],{scripts:se}=je.manifest;for(let he of["preinstall","install","postinstall"])se.has(he)&&re.push([cs.SCRIPT,he]);try{for(let[he,Fe]of u)if(he.supportsPackage(O,c)&&(await Fe.installPackage(O,L,{holdFetchResult:Be})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{de.length===0?(A=L.releaseFs)==null||A.call(L):m.push(go(de).catch(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}let be=k.join(L.packageFs.getRealPath(),L.prefixPath);f.set(O.locatorHash,be),!ea(O)&&re.length>0&&h.set(O.locatorHash,{directives:re,buildLocations:[be]})}else{let re=l.find(he=>he.supportsPackage(O,c));if(!re)throw new ct(X.LINKER_NOT_FOUND,`${It(this.configuration,O)} isn't supported by any available linker`);let se=u.get(re);if(!se)throw new Error("Assertion failed: The installer should have been registered");let be;try{be=await se.installPackage(O,L,{holdFetchResult:Be})}finally{de.length===0?(oe=L.releaseFs)==null||oe.call(L):m.push(go(de).then(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}g.set(O.locatorHash,re),f.set(O.locatorHash,be.packageLocation),be.buildDirective&&be.buildDirective.length>0&&be.packageLocation&&h.set(O.locatorHash,{directives:be.buildDirective,buildLocations:[be.packageLocation]})}}let y=new Map;for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");let L=this.tryWorkspaceByLocator(O)!==null,de=async(Be,je)=>{let re=f.get(O.locatorHash);if(typeof re=="undefined")throw new Error(`Assertion failed: The package (${It(this.configuration,O)}) should have been registered`);let se=[];for(let be of O.dependencies.values()){let he=this.storedResolutions.get(be.descriptorHash);if(typeof he=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,be)}, from ${It(this.configuration,O)})should have been registered`);let Fe=this.storedPackages.get(he);if(typeof Fe=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);let Ke=this.tryWorkspaceByLocator(Fe)===null?g.get(he):null;if(typeof Ke=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);Ke===Be||Ke===null?f.get(Fe.locatorHash)!==null&&se.push([be,Fe]):!L&&re!==null&&Fg(y,he).push(re)}re!==null&&await je.attachInternalDependencies(O,se)};if(L)for(let[Be,je]of u)Be.supportsPackage(O,c)&&await de(Be,je);else{let Be=g.get(O.locatorHash);if(!Be)throw new Error("Assertion failed: The linker should have been found");let je=u.get(Be);if(!je)throw new Error("Assertion failed: The installer should have been registered");await de(Be,je)}}for(let[Z,O]of y){let L=this.storedPackages.get(Z);if(!L)throw new Error("Assertion failed: The package should have been registered");let de=g.get(L.locatorHash);if(!de)throw new Error("Assertion failed: The linker should have been found");let Be=u.get(de);if(!Be)throw new Error("Assertion failed: The installer should have been registered");await Be.attachExternalDependents(L,O)}let b=new Map;for(let Z of u.values()){let O=await Z.finalizeInstall();for(let L of(ce=O==null?void 0:O.records)!=null?ce:[])h.set(L.locatorHash,{directives:L.buildDirective,buildLocations:L.buildLocations});typeof(O==null?void 0:O.customData)!="undefined"&&b.set(Z.getCustomDataKey(),O.customData)}if(this.installersCustomData=b,await go(m),n===Ci.SkipBuild)return;let v=new Set(this.storedPackages.keys()),x=new Set(h.keys());for(let Z of x)v.delete(Z);let T=(0,i0.createHash)("sha512");T.update(process.versions.node),await this.configuration.triggerHook(Z=>Z.globalHashGeneration,this,Z=>{T.update("\0"),T.update(Z)});let q=T.digest("hex"),Y=new Map,$=Z=>{let O=Y.get(Z.locatorHash);if(typeof O!="undefined")return O;let L=this.storedPackages.get(Z.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The package should have been registered");let de=(0,i0.createHash)("sha512");de.update(Z.locatorHash),Y.set(Z.locatorHash,"");for(let Be of L.dependencies.values()){let je=this.storedResolutions.get(Be.descriptorHash);if(typeof je=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,Be)}) should have been registered`);let re=this.storedPackages.get(je);if(typeof re=="undefined")throw new Error("Assertion failed: The package should have been registered");de.update($(re))}return O=de.digest("hex"),Y.set(Z.locatorHash,O),O},_=(Z,O)=>{let L=(0,i0.createHash)("sha512");L.update(q),L.update($(Z));for(let de of O)L.update(de);return L.digest("hex")},ne=new Map,ee=!1;for(;x.size>0;){let Z=x.size,O=[];for(let L of x){let de=this.storedPackages.get(L);if(!de)throw new Error("Assertion failed: The package should have been registered");let Be=!0;for(let se of de.dependencies.values()){let be=this.storedResolutions.get(se.descriptorHash);if(!be)throw new Error(`Assertion failed: The resolution (${sr(this.configuration,se)}) should have been registered`);if(x.has(be)){Be=!1;break}}if(!Be)continue;x.delete(L);let je=h.get(de.locatorHash);if(!je)throw new Error("Assertion failed: The build directive should have been registered");let re=_(de,je.buildLocations);if(this.storedBuildState.get(de.locatorHash)===re){ne.set(de.locatorHash,re);continue}ee||(await this.persistInstallStateFile(),ee=!0),this.storedBuildState.has(de.locatorHash)?t.reportInfo(X.MUST_REBUILD,`${It(this.configuration,de)} must be rebuilt because its dependency tree changed`):t.reportInfo(X.MUST_BUILD,`${It(this.configuration,de)} must be built because it never has been before or the last one failed`);for(let se of je.buildLocations){if(!k.isAbsolute(se))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${se})`);O.push((async()=>{for(let[be,he]of je.directives){let Fe=`# This file contains the result of Yarn building a package (${Rs(de)}) -`;switch(be){case cs.SCRIPT:Fe+=`# Script name: ${he} -`;break;case cs.SHELLCODE:Fe+=`# Script code: ${he} -`;break}let Ke=null;if(!await K.mktempPromise(async ve=>{let pe=k.join(ve,"build.log"),{stdout:V,stderr:Qe}=this.configuration.getSubprocessStreams(pe,{header:Fe,prefix:It(this.configuration,de),report:t}),le;try{switch(be){case cs.SCRIPT:le=await nB(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break;case cs.SHELLCODE:le=await rD(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break}}catch(gt){Qe.write(gt.stack),le=1}if(V.end(),Qe.end(),le===0)return ne.set(de.locatorHash,re),!0;K.detachTemp(ve);let fe=`${It(this.configuration,de)} couldn't be built successfully (exit code ${tt(this.configuration,le,qe.NUMBER)}, logs can be found here: ${tt(this.configuration,pe,qe.PATH)})`;return this.optionalBuilds.has(de.locatorHash)?(t.reportInfo(X.BUILD_FAILED,fe),ne.set(de.locatorHash,re),!0):(t.reportError(X.BUILD_FAILED,fe),!1)}))return}})())}}if(await go(O),Z===x.size){let L=Array.from(x).map(de=>{let Be=this.storedPackages.get(de);if(!Be)throw new Error("Assertion failed: The package should have been registered");return It(this.configuration,Be)}).join(", ");t.reportError(X.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${L})`);break}}this.storedBuildState=ne}async install(e){var a,l;let t=this.configuration.get("nodeLinker");(a=ye.telemetry)==null||a.reportInstall(t),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=qi.Inactive;let i=k.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await K.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=tt(this.configuration,g,qe.PACKAGE_EXTENSION);switch(g.status){case qi.Inactive:e.report.reportWarning(X.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case qi.Redundant:e.report.reportWarning(X.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=sc(n,this.generateLockfile());if(c!==n){let u=V6(i,i,n,c,void 0,void 0,{maxEditLength:100});if(u){e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.ADDED)):f.startsWith("-")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.REMOVED)):e.report.reportInfo(null,tt(this.configuration,f,"grey"))}e.report.reportSeparator()}throw new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===qi.Active&&((l=ye.telemetry)==null||l.reportPackageExtension(Oc(g,qe.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==Ci.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>ow(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===Ci.UpdateLockfile){e.report.reportWarning(X.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${tt(this.configuration,"mode=update-lockfile",qe.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>ow(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let t={};t.__metadata={version:oZ,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>Pn(f)).sort().join(", "),c=new At;c.version=o.linkType===Qt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof t.__metadata.cacheKey=="undefined"&&(t.__metadata.cacheKey=h),h===t.__metadata.cacheKey?u=p:u=g}t[l]=te(N({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:Rs(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+Ma(t)}async persistLockfile(){let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t="";try{t=await K.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=sc(t,i);n!==t&&(await K.writeFilePromise(e,n),this.lockFileChecksum=AZ(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(UR))e.push(...o);let t=(0,n0.default)(this,e),i=MR.default.serialize(t),n=ln(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await K.mkdirPromise(k.dirname(s),{recursive:!0}),await K.writeFilePromise(s,await VOe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:t=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath"),s;try{let o=await XOe(await K.readFilePromise(n));s=MR.default.deserialize(o),this.installStateChecksum=ln(o)}catch{t&&await this.applyLightResolution();return}e&&typeof s.installersCustomData!="undefined"&&(this.installersCustomData=s.installersCustomData),i&&Object.assign(this,(0,n0.default)(s,UR.restoreBuildState)),t&&(s.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,n0.default)(s,UR.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new di}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:t}){if(this.configuration.get("enableGlobalCache"))return;let i=new Set([".gitignore"]);if(!Ak(e.cwd,this.cwd)||!await K.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await K.readdirPromise(e.cwd)){if(i.has(a))continue;let l=k.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?t.reportError(X.IMMUTABLE_CACHE,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:t.reportInfo(X.UNUSED_CACHE_ENTRY,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused - removing`),await K.removePromise(l)))}n&&s!==0&&t.reportInfo(X.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function ZOe({project:r,allDescriptors:e,allResolutions:t,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,peerRequirements:o=new Map,volatileDescriptors:a=new Set,report:l,tolerateMissingPackages:c=!1}){var ne;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,m=new Map,y=new Map,b=new Map(r.workspaces.map(ee=>{let A=ee.anchoredLocator.locatorHash,oe=i.get(A);if(typeof oe=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,cd(oe)]})),v=()=>{let ee=K.mktempSync(),A=k.join(ee,"stacktrace.log"),oe=String(g.length+1).length,ce=g.map((Z,O)=>`${`${O+1}.`.padStart(oe," ")} ${Rs(Z)} -`).join("");throw K.writeFileSync(A,ce),K.detachTemp(ee),new ct(X.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${H.fromPortablePath(A)}`)},x=ee=>{let A=t.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let oe=i.get(A);if(!oe)throw new Error("Assertion failed: The package could not be found");return oe},T=(ee,A,oe,{top:ce,optional:Z})=>{g.length>1e3&&v(),g.push(A);let O=q(ee,A,oe,{top:ce,optional:Z});return g.pop(),O},q=(ee,A,oe,{top:ce,optional:Z})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),Z||s.delete(A.locatorHash);let O=i.get(A.locatorHash);if(!O){if(c)return;throw new Error(`Assertion failed: The package (${It(r.configuration,A)}) should have been registered`)}let L=[],de=[],Be=[],je=[],re=[];for(let be of Array.from(O.dependencies.values())){if(O.peerDependencies.has(be.identHash)&&O.locatorHash!==ce)continue;if(Al(be))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");a.delete(be.descriptorHash);let he=Z;if(!he){let Qe=O.dependenciesMeta.get(Ot(be));if(typeof Qe!="undefined"){let le=Qe.get(null);typeof le!="undefined"&&le.optional&&(he=!0)}}let Fe=t.get(be.descriptorHash);if(!Fe){if(c)continue;throw new Error(`Assertion failed: The resolution (${sr(r.configuration,be)}) should have been registered`)}let Ke=b.get(Fe)||i.get(Fe);if(!Ke)throw new Error(`Assertion failed: The package (${Fe}, resolved from ${sr(r.configuration,be)}) should have been registered`);if(Ke.peerDependencies.size===0){T(be,Ke,new Map,{top:ce,optional:he});continue}let ke,ve,pe=new Set,V;de.push(()=>{ke=Vx(be,A.locatorHash),ve=Xx(Ke,A.locatorHash),O.dependencies.delete(be.identHash),O.dependencies.set(ke.identHash,ke),t.set(ke.descriptorHash,ve.locatorHash),e.set(ke.descriptorHash,ke),i.set(ve.locatorHash,ve),L.push([Ke,ke,ve])}),Be.push(()=>{var Qe;V=new Map;for(let le of ve.peerDependencies.values()){let fe=O.dependencies.get(le.identHash);if(!fe&&fd(A,le)&&(ee.identHash===A.identHash?fe=ee:(fe=rr(A,ee.range),e.set(fe.descriptorHash,fe),t.set(fe.descriptorHash,A.locatorHash),a.delete(fe.descriptorHash))),(!fe||fe.range==="missing:")&&ve.dependencies.has(le.identHash)){ve.peerDependencies.delete(le.identHash);continue}fe||(fe=rr(le,"missing:")),ve.dependencies.set(fe.identHash,fe),Al(fe)&&Nc(p,fe.descriptorHash).add(ve.locatorHash),f.set(fe.identHash,fe),fe.range==="missing:"&&pe.add(fe.identHash),V.set(le.identHash,(Qe=oe.get(le.identHash))!=null?Qe:ve.locatorHash)}ve.dependencies=new Map(kn(ve.dependencies,([le,fe])=>Ot(fe)))}),je.push(()=>{if(!i.has(ve.locatorHash))return;let Qe=u.get(Ke.locatorHash);typeof Qe=="number"&&Qe>=2&&v();let le=u.get(Ke.locatorHash),fe=typeof le!="undefined"?le+1:1;u.set(Ke.locatorHash,fe),T(ke,ve,V,{top:ce,optional:he}),u.set(Ke.locatorHash,fe-1)}),re.push(()=>{let Qe=O.dependencies.get(be.identHash);if(typeof Qe=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let le=t.get(Qe.descriptorHash);if(typeof le=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(Nc(y,le).add(A.locatorHash),!!i.has(ve.locatorHash)){for(let fe of ve.peerDependencies.values()){let gt=V.get(fe.identHash);if(typeof gt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Fg(Ng(m,gt),Ot(fe)).push(ve.locatorHash)}for(let fe of pe)ve.dependencies.delete(fe)}})}for(let be of[...de,...Be])be();let se;do{se=!0;for(let[be,he,Fe]of L){let Ke=Ng(h,be.locatorHash),ke=ln(...[...Fe.dependencies.values()].map(Qe=>{let le=Qe.range!=="missing:"?t.get(Qe.descriptorHash):"missing:";if(typeof le=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${sr(r.configuration,Qe)} to have been registered`);return le===ce?`${le} (top)`:le}),he.identHash),ve=Ke.get(ke);if(typeof ve=="undefined"){Ke.set(ke,he);continue}if(ve===he)continue;i.delete(Fe.locatorHash),e.delete(he.descriptorHash),t.delete(he.descriptorHash),n.delete(Fe.locatorHash);let pe=p.get(he.descriptorHash)||[],V=[O.locatorHash,...pe];p.delete(he.descriptorHash);for(let Qe of V){let le=i.get(Qe);typeof le!="undefined"&&(le.dependencies.get(he.identHash).descriptorHash!==ve.descriptorHash&&(se=!1),le.dependencies.set(he.identHash,ve))}}}while(!se);for(let be of[...je,...re])be()};for(let ee of r.workspaces){let A=ee.anchoredLocator;a.delete(ee.anchoredDescriptor.descriptorHash),T(ee.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var Y;(function(oe){oe[oe.NotProvided=0]="NotProvided",oe[oe.NotCompatible=1]="NotCompatible"})(Y||(Y={}));let $=[];for(let[ee,A]of y){let oe=i.get(ee);if(typeof oe=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let ce=m.get(ee);if(typeof ce!="undefined")for(let Z of A){let O=i.get(Z);if(typeof O!="undefined")for(let[L,de]of ce){let Be=An(L);if(O.peerDependencies.has(Be.identHash))continue;let je=`p${ln(Z,L,ee).slice(0,5)}`;o.set(je,{subject:Z,requested:Be,rootRequester:ee,allRequesters:de});let re=oe.dependencies.get(Be.identHash);if(typeof re!="undefined"){let se=x(re),be=(ne=se.version)!=null?ne:"0.0.0",he=new Set;for(let Ke of de){let ke=i.get(Ke);if(typeof ke=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let ve=ke.peerDependencies.get(Be.identHash);if(typeof ve=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");he.add(ve.range)}[...he].every(Ke=>{if(Ke.startsWith(oi.protocol)){if(!r.tryWorkspaceByLocator(se))return!1;Ke=Ke.slice(oi.protocol.length),(Ke==="^"||Ke==="~")&&(Ke="*")}return qc(be,Ke)})||$.push({type:1,subject:O,requested:Be,requester:oe,version:be,hash:je,requirementCount:de.length})}else{let se=oe.peerDependenciesMeta.get(L);(se==null?void 0:se.optional)||$.push({type:0,subject:O,requested:Be,requester:oe,hash:je})}}}}let _=[ee=>$x(ee.subject),ee=>Ot(ee.requested),ee=>`${ee.type}`];l==null||l.startSectionSync({reportFooter:()=>{l.reportWarning(X.UNNAMED,`Some peer dependencies are incorrectly met; run ${tt(r.configuration,"yarn explain peer-requirements ",qe.CODE)} for details, where ${tt(r.configuration,"",qe.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let ee of kn($,_))switch(ee.type){case 0:l.reportWarning(X.MISSING_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} doesn't provide ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}), requested by ${fi(r.configuration,ee.requester)}`);break;case 1:{let A=ee.requirementCount>1?"and some of its descendants request":"requests";l.reportWarning(X.INCOMPATIBLE_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} provides ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}) with version ${dd(r.configuration,ee.version)}, which doesn't satisfy what ${fi(r.configuration,ee.requester)} ${A}`)}break}})}var ca;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(ca||(ca={}));var mC=class{constructor(e,t){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!K.existsSync(i),this.sendReport(t),this.startBuffer()}reportVersion(e){this.reportValue(ca.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(ca.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(ca.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(ca.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(ca.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(ca.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(ca.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(ca.DEPENDENCY_COUNT,String(e))}reportValue(e,t){Nc(this.values,e).add(t)}reportEnumerator(e,t){Nc(this.enumerators,e).add(ln(t))}reportHit(e,t="*"){let i=Ng(this.hits,e),n=_a(i,t,()=>0);i.set(t,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return k.join(e,"telemetry.json")}sendReport(e){var u,g,f;let t=this.getRegistryPath(),i;try{i=K.readJsonSync(t)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{K.mkdirSync(k.dirname(t),{recursive:!0}),K.writeJsonSync(t,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>HP(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let m=p;m.userId=h,m.reportType="primary";for(let v of Object.keys((f=m.enumerators)!=null?f:{}))m.enumerators[v]=m.enumerators[v].length;c(m);let y=new Map,b=20;for(let[v,x]of Object.entries(m.values))x.length>0&&y.set(v,x.slice(0,b));for(;y.size>0;){let v={};v.userId=h,v.reportType="secondary",v.metrics={};for(let[x,T]of y)v.metrics[x]=T.shift(),T.length===0&&y.delete(x);c(v)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),t;try{t=K.readJsonSync(e)}catch{t={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=t.blocks=(a=t.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let m of this.hits.keys()){let y=s.hits=(c=s.hits)!=null?c:{},b=y[m]=(u=y[m])!=null?u:{};for(let[v,x]of this.hits.get(m))b[v]=((g=b[v])!=null?g:0)+x}for(let m of["values","enumerators"])for(let y of this[m].keys()){let b=s[m]=(f=s[m])!=null?f:{};b[y]=[...new Set([...(h=b[y])!=null?h:[],...(p=this[m].get(y))!=null?p:[]])]}K.mkdirSync(k.dirname(e),{recursive:!0}),K.writeJsonSync(e,t)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var HR=ge(require("child_process")),lZ=ge(Ic());var jR=ge(require("fs"));var Lf=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function $Oe(r){let e=H.fromPortablePath(r);process.on("SIGINT",()=>{}),e?(0,HR.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,HR.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function s0({binaryVersion:r,pluginConfiguration:e}){async function t(){let n=new ws({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:r});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var m,y,b,v,x;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(!Se.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!Wt.satisfiesWithPrereleases(s,o))throw new Pe(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let l=await ye.find(H.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),c=l.get("yarnPath"),u=l.get("ignorePath"),g=l.get("ignoreCwd"),f=H.toPortablePath(H.resolve(process.argv[1])),h=T=>K.readFilePromise(T).catch(()=>Buffer.of());if(!u&&!g&&await(async()=>c===f||Buffer.compare(...await Promise.all([h(c),h(f)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(c!==null&&!u)if(!K.existsSync(c))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${l.sources.get("yarnPath")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1;else try{$Oe(c)}catch(T){process.exitCode=T.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get("enableTelemetry")&&!lZ.isCI&&process.stdout.isTTY&&(ye.telemetry=new mC(l,"puba9cdc10ec5790a2cf4969dd413a47270")),(m=ye.telemetry)==null||m.reportVersion(r);for(let[$,_]of l.plugins.entries()){Lf.has((b=(y=$.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:y[1])!=null?b:"")&&((v=ye.telemetry)==null||v.reportPluginName($));for(let ne of _.commands||[])n.register(ne)}let q=n.process(process.argv.slice(2));q.help||(x=ye.telemetry)==null||x.reportCommandName(q.path.join(" "));let Y=q.cwd;if(typeof Y!="undefined"&&!g){let $=(0,jR.realpathSync)(process.cwd()),_=(0,jR.realpathSync)(Y);if($!==_){process.chdir(Y),await t();return}}await n.runExit(q,{cwd:H.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return t().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>K.rmtempPromise())}function cZ(r){r.Command.Path=(...e)=>t=>{t.paths=t.paths||[],t.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])r.Command[e]=(...t)=>(i,n)=>{let s=r.Option[e](...t);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return r}var GC={};ft(GC,{BaseCommand:()=>Le,WorkspaceRequiredError:()=>ht,getDynamicLibs:()=>bre,getPluginConfiguration:()=>L0,main:()=>s0,openWorkspace:()=>Wf,pluginCommands:()=>Lf});var Le=class extends Re{constructor(){super(...arguments);this.cwd=J.String("--cwd",{hidden:!0})}};var ht=class extends Pe{constructor(e,t){let i=k.relative(e,t),n=k.join(e,At.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var sGe=ge(ri());ys();var oGe=ge(UF()),bre=()=>new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",Cp],["semver",sGe],["typanion",cg],["yup",oGe]]);async function Wf(r,e){let{project:t,workspace:i}=await ze.find(r,e);if(!i)throw new ht(t.cwd,e);return i}var Q_e=ge(ri());ys();var S_e=ge(UF());var GN={};ft(GN,{dedupeUtils:()=>wN,default:()=>mWe,suggestUtils:()=>lN});var Sae=ge(Ic());var Fne=ge(WC());ys();var lN={};ft(lN,{Modifier:()=>pa,Strategy:()=>Vr,Target:()=>Hr,WorkspaceModifier:()=>Xf,applyModifier:()=>kne,extractDescriptorFromPath:()=>gN,extractRangeModifier:()=>xne,fetchDescriptorFrom:()=>uN,findProjectDescriptors:()=>Rne,getModifier:()=>zC,getSuggestedDescriptors:()=>_C,makeWorkspaceDescriptor:()=>Dne,toWorkspaceModifier:()=>Pne});var cN=ge(ri()),bYe="workspace:",Hr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(Hr||(Hr={}));var pa;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(pa||(pa={}));var Xf;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(Xf||(Xf={}));var Vr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Vr||(Vr={}));function zC(r,e){return r.exact?pa.EXACT:r.caret?pa.CARET:r.tilde?pa.TILDE:e.configuration.get("defaultSemverRangePrefix")}var QYe=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function xne(r,{project:e}){let t=r.match(QYe);return t?t[1]:e.configuration.get("defaultSemverRangePrefix")}function kne(r,e){let{protocol:t,source:i,params:n,selector:s}=P.parseRange(r.range);return cN.default.valid(s)&&(s=`${e}${r.range}`),P.makeDescriptor(r,P.makeRange({protocol:t,source:i,params:n,selector:s}))}function Pne(r){switch(r){case pa.CARET:return Xf.CARET;case pa.TILDE:return Xf.TILDE;case pa.EXACT:return Xf.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${r}"`)}}function Dne(r,e){return P.makeDescriptor(r.anchoredDescriptor,`${bYe}${Pne(e)}`)}async function Rne(r,{project:e,target:t}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(t===Hr.PEER){let o=s.manifest.peerDependencies.get(r.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(r.identHash),a=s.manifest.devDependencies.get(r.identHash);t===Hr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function gN(r,{cwd:e,workspace:t}){return await SYe(async i=>{k.isAbsolute(r)||(r=k.relative(t.cwd,k.resolve(e,r)),r.match(/^\.{0,2}\//)||(r=`./${r}`));let{project:n}=t,s=await uN(P.makeIdent(null,"archive"),r,{project:t.project,cache:i,workspace:t});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new di,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,t.anchoredLocator,c),g=P.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await At.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return P.makeDescriptor(h.name,r)})}async function _C(r,{project:e,workspace:t,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(r.range!=="unknown")return{suggestions:[{descriptor:r,name:`Use ${P.prettyDescriptor(e.configuration,r)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof t!="undefined"&&t!==null&&t.manifest[n].get(r.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Vr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${P.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Vr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await Rne(r,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===t.anchoredLocator.locatorHash&&o.includes(Vr.KEEP))continue;let m=`(originally used by ${P.prettyLocator(e.configuration,p[0])}`;m+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:m})}});break;case Vr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===r.identHash&&c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Vr.PROJECT:await g(async()=>{if(t.manifest.name!==null&&r.identHash===t.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(r);if(h===null)return;let p=Dne(h,s);c.push({descriptor:p,name:`Attach ${P.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ae.pretty(e.configuration,h.relativeCwd,ae.Type.PATH)})`})});break;case Vr.LATEST:await g(async()=>{if(r.range!=="unknown")c.push({descriptor:r,name:`Use ${P.prettyRange(e.configuration,r.range)}`,reason:"(explicit range requested)"});else if(n===Hr.PEER)c.push({descriptor:P.makeDescriptor(r,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:ae.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await uN(r,"latest",{project:e,cache:i,workspace:t,preserveModifier:!1});h&&(h=kne(h,s),c.push({descriptor:h,name:`Use ${P.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function uN(r,e,{project:t,cache:i,workspace:n,preserveModifier:s=!0}){let o=P.makeDescriptor(r,e),a=new di,l=t.configuration.makeFetcher(),c=t.configuration.makeResolver(),u={project:t,fetcher:l,cache:i,checksums:t.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=te(N({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:m,source:y,params:b,selector:v}=P.parseRange(P.convertToManifestRange(p.reference));if(m===t.configuration.get("defaultProtocol")&&(m=null),cN.default.valid(v)&&s!==!1){let x=typeof s=="string"?s:o.range;v=xne(x,{project:t})+v}return P.makeDescriptor(p,P.makeRange({protocol:m,source:y,params:b,selector:v}))}async function SYe(r){return await K.mktempPromise(async e=>{let t=ye.create(e);return t.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await r(new Nt(e,{configuration:t,check:!1,immutable:!1}))})}var VC=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=J.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=J.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=J.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=J.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=J.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=J.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.silent=J.Boolean("--silent",{hidden:!0});this.packages=J.Rest()}async execute(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=[...s?[Vr.REUSE]:[],Vr.PROJECT,...this.cached?[Vr.CACHE]:[],Vr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async y=>{let b=y.match(/^\.{0,2}\//)?await gN(y,{cwd:this.context.cwd,workspace:i}):P.tryParseDescriptor(y),v=y.match(/^(https?:|git@github)/);if(v)throw new Pe(`It seems you are trying to add a package using a ${ae.pretty(e,`${v[0]}...`,Ri.RANGE)} url; we now require package names to be explicitly specified. -Try running the command again with the package name prefixed: ${ae.pretty(e,"yarn add",Ri.CODE)} ${ae.pretty(e,P.makeDescriptor(P.makeIdent(null,"my-package"),`${v[0]}...`),Ri.DESCRIPTOR)}`);if(!b)throw new Pe(`The ${ae.pretty(e,y,Ri.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let x=vYe(i,b,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),T=await _C(b,{project:t,workspace:i,cache:n,target:x,modifier:o,strategies:a,maxResults:l});return[b,T,x]})),u=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[b,{suggestions:v,rejections:x}]of c)if(v.filter(q=>q.descriptor!==null).length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),y.reportSeparator(),y.reportExceptionOnce(q)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:y},b]of c){let v,x=y.filter($=>$.descriptor!==null),T=x[0].descriptor,q=x.every($=>P.areDescriptorsEqual($.descriptor,T));x.length===1||q?v=T:(g=!0,{answer:v}=await(0,Fne.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:y.map(({descriptor:$,name:_,reason:ne})=>$?{name:_,hint:ne,descriptor:$}:{name:_,hint:ne,disabled:!0}),onCancel:()=>process.exit(130),result($){return this.find($,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Y=i.manifest[b].get(v.identHash);(typeof Y=="undefined"||Y.descriptorHash!==v.descriptorHash)&&(i.manifest[b].set(v.identHash,v),this.optional&&(b==="dependencies"?i.manifest.ensureDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0:b==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0)),typeof Y=="undefined"?f.push([i,b,v,a]):h.push([i,b,Y,v]))}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` -`),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};VC.paths=[["add"]],VC.usage=Re.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var Nne=VC;function vYe(r,e,{dev:t,peer:i,preferDev:n,optional:s}){let o=r.manifest[Hr.REGULAR].has(e.identHash),a=r.manifest[Hr.DEVELOPMENT].has(e.identHash),l=r.manifest[Hr.PEER].has(e.identHash);if((t||i)&&o)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!t&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((t||n)&&s)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?Hr.PEER:t||n?Hr.DEVELOPMENT:o?Hr.REGULAR:a?Hr.DEVELOPMENT:Hr.REGULAR}var XC=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);if(await t.restoreInstallState(),this.name){let o=(await Zt.getPackageAccessibleBinaries(i,{project:t})).get(this.name);if(!o)throw new Pe(`Couldn't find a binary named "${this.name}" for package "${P.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} -`),0}return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Zt.getPackageAccessibleBinaries(i,{project:t}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:P.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${P.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};XC.paths=[["bin"]],XC.usage=Re.Usage({description:"get the path to a binary script",details:` - When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. - - When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var Lne=XC;var ZC=class extends Le{constructor(){super(...arguments);this.mirror=J.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=J.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Nt.find(e);return(await Je.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&t.mirrorCwd!==null,s=!this.mirror;n&&(await K.removePromise(t.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await K.removePromise(t.cwd)})).exitCode()}};ZC.paths=[["cache","clean"],["cache","clear"]],ZC.usage=Re.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var Tne=ZC;var One=ge(C0()),fN=ge(require("util")),$C=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=J.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(t)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${t}"`);let s=e.getSpecial(t,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=Se.convertMapsToIndexableObjects(s),a=i?(0,One.default)(o,i):o,l=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} -`),l.exitCode();fN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,fN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} -`)}return l.exitCode()}};$C.paths=[["config","get"]],$C.usage=Re.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. - `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var Mne=$C;var Vse=ge(EN()),Xse=ge(C0()),Zse=ge(_se()),IN=ge(require("util")),tm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String();this.value=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new Pe("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>ye.updateHomeConfiguration(h):h=>ye.updateConfiguration(t(),h))(h=>{if(n){let p=(0,Vse.default)(h);return(0,Zse.default)(p,this.name,o),p}else return te(N({},h),{[i]:o})});let c=(await ye.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=Se.convertMapsToIndexableObjects(c),g=n?(0,Xse.default)(u,n):u;return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{IN.inspect.styles.name="cyan",h.reportInfo(X.UNNAMED,`Successfully set ${this.name} to ${(0,IN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};tm.paths=[["config","set"]],tm.usage=Re.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var $se=tm;var Aoe=ge(EN()),loe=ge(yC()),coe=ge(aoe()),rm=class extends Le{constructor(){super(...arguments);this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>ye.updateHomeConfiguration(l):l=>ye.updateConfiguration(t(),l);return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,loe.default)(u,this.name))return l.reportWarning(X.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Aoe.default)(u):N({},u);return(0,coe.default)(g,this.name),g}),c||l.reportInfo(X.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};rm.paths=[["config","unset"]],rm.usage=Re.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var uoe=rm;var yN=ge(require("util")),im=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=J.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(X.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=Se.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(N({key:s,effective:a,source:l},o))}}else{let n=Se.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,yN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,yN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};im.paths=[["config"]],im.usage=Re.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]});var goe=im;ys();var wN={};ft(wN,{Strategy:()=>Bu,acceptedStrategies:()=>P3e,dedupe:()=>BN});var foe=ge(is()),Bu;(function(e){e.HIGHEST="highest"})(Bu||(Bu={}));var P3e=new Set(Object.values(Bu)),D3e={highest:async(r,e,{resolver:t,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of r.storedResolutions){let c=r.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);Se.getSetWithDefault(o,c.identHash).add(l)}return Array.from(r.storedDescriptors.values(),async a=>{if(e.length&&!foe.default.isMatch(P.stringifyIdent(a),e))return null;let l=r.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=r.originalPackages.get(l);if(typeof c=="undefined"||!t.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(y=>{let b=r.originalPackages.get(y);if(typeof b=="undefined")throw new Error(`Assertion failed: The package (${y}) should have been registered`);return b.reference}),f=await t.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,m=r.originalPackages.get(p);if(typeof m=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:m}})}};async function BN(r,{strategy:e,patterns:t,cache:i,report:n}){let{configuration:s}=r,o=new di,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:r.storedChecksums,fetcher:l,project:r,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:r,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await D3e[e](r,t,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Ji.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(b=>b.then(v=>{if(v===null)return;p++;let{descriptor:x,currentPackage:T,updatedPackage:q}=v;n.reportInfo(X.UNNAMED,`${P.prettyDescriptor(s,x)} can be deduped from ${P.prettyLocator(s,T)} to ${P.prettyLocator(s,q)}`),n.reportJson({descriptor:P.stringifyDescriptor(x),currentResolution:P.stringifyLocator(T),updatedResolution:P.stringifyLocator(q)}),r.storedResolutions.set(x.descriptorHash,q.locatorHash)}).finally(()=>h.tick())));let m;switch(p){case 0:m="No packages";break;case 1:m="One package";break;default:m=`${p} packages`}let y=ae.pretty(s,e,ae.Type.CODE);return n.reportInfo(X.UNNAMED,`${m} can be deduped using the ${y} strategy`),p})}var nm=class extends Le{constructor(){super(...arguments);this.strategy=J.String("-s,--strategy",Bu.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:nn(Bu)});this.check=J.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=await Nt.find(e);await t.restoreInstallState({restoreResolutions:!1});let n=0,s=await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await BN(t,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await t.install({cache:i,report:a,mode:this.mode})})).exitCode()}};nm.paths=[["dedupe"]],nm.usage=Re.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var hoe=nm;var J0=class extends Le{async execute(){let{plugins:e}=await ye.find(this.context.cwd,this.context.plugins),t=[];for(let o of e){let{commands:a}=o[1];if(a){let c=ws.from(a).definitions();t.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=doe()["@yarnpkg/builder"].bundles.standard;for(let o of t){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} -`)}};J0.paths=[["--clipanion=definitions"]];var Coe=J0;var W0=class extends Le{async execute(){this.context.stdout.write(this.cli.usage(null))}};W0.paths=[["help"],["--help"],["-h"]];var moe=W0;var bN=class extends Le{constructor(){super(...arguments);this.leadingArgument=J.String();this.args=J.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!P.tryParseIdent(this.leadingArgument)){let e=k.resolve(this.context.cwd,H.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Eoe=bN;var z0=class extends Le{async execute(){this.context.stdout.write(`${Ur||""} -`)}};z0.paths=[["-v"],["--version"]];var Ioe=z0;var sm=class extends Le{constructor(){super(...arguments);this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);return await t.restoreInstallState(),await Zt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:t})}};sm.paths=[["exec"]],sm.usage=Re.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var yoe=sm;ys();var om=class extends Le{constructor(){super(...arguments);this.hash=J.String({required:!1,validator:fp(gp(),[hp(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return await t.restoreInstallState({restoreResolutions:!1}),await t.applyLightResolution(),typeof this.hash!="undefined"?await R3e(this.hash,t,{stdout:this.context.stdout}):(await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>P.stringifyLocator(t.storedPackages.get(a.subject)),([,a])=>P.stringifyIdent(a.requested)];for(let[a,l]of Se.sortMap(t.peerRequirements,s)){let c=t.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=t.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=ae.pretty(e,a,ae.Type.CODE),h=P.prettyLocator(e,c),p=P.prettyIdent(e,l.requested),m=P.prettyIdent(e,u),y=l.allRequesters.length-1,b=`descendant${y===1?"":"s"}`,v=y>0?` and ${y} ${b}`:"",x=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${x} ${p} to ${m}${v}`)}})).exitCode()}};om.paths=[["explain","peer-requirements"]],om.usage=Re.Usage({description:"explain a set of peer requirements",details:` - A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. - - When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. - - When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. - - **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). - `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var woe=om;async function R3e(r,e,t){let{configuration:i}=e,n=e.peerRequirements.get(r);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${r}"`);return(await Je.start({configuration:i,stdout:t.stdout,includeFooter:!1},async o=>{var b,v;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(b=a.dependencies.get(n.requested.identHash))!=null?b:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(x=>{let T=e.storedPackages.get(x);if(typeof T=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let q=P.devirtualizeLocator(T),Y=e.storedPackages.get(q.locatorHash);if(typeof Y=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let $=Y.peerDependencies.get(n.requested.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:T,peerDependency:$}});if(g!==null){let x=f.every(({peerDependency:T})=>Wt.satisfiesWithPrereleases(g.version,T.range));o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} provides ${P.prettyLocator(i,g)} with version ${P.prettyReference(i,(v=g.version)!=null?v:"")}, which ${x?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} doesn't provide ${P.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ae.mark(i),p=[];for(let{pkg:x,peerDependency:T}of Se.sortMap(f,q=>P.stringifyLocator(q.pkg))){let Y=(g!==null?Wt.satisfiesWithPrereleases(g.version,T.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:P.stringifyLocator(x),prettyLocator:P.prettyLocator(i,x),prettyRange:P.prettyRange(i,T.range),mark:Y})}let m=Math.max(...p.map(({stringifiedLocator:x})=>x.length)),y=Math.max(...p.map(({prettyRange:x})=>x.length));for(let{stringifiedLocator:x,prettyLocator:T,prettyRange:q,mark:Y}of Se.sortMap(p,({stringifiedLocator:$})=>$))o.reportInfo(null,`${T.padEnd(m+(T.length-x.length)," ")} \u2192 ${q.padEnd(y," ")} ${Y}`);p.length>1&&(o.reportSeparator(),o.reportInfo(X.UNNAMED,`Note: these requirements start with ${P.prettyLocator(e.configuration,l)}`))})).exitCode()}ys();var Boe=ge(ri()),am=class extends Le{constructor(){super(...arguments);this.onlyIfNeeded=J.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let t=()=>{if(typeof Ur=="undefined")throw new Pe("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=t();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await Am(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await Am(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^https?:/))i=this.version;else if(this.version.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.version))i=`file://${H.resolve(this.version)}`;else if(Wt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(Wt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(Wt.validRange(this.version))i=`https://repo.yarnpkg.com/${await F3e(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new Pe(`Invalid version descriptor "${this.version}"`);return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,i,Ri.URL)}`),a=await K.readFilePromise(H.toPortablePath(i.slice(o.length)))):(s.reportInfo(X.UNNAMED,`Retrieving ${ae.pretty(e,i,Ri.PATH)}`),a=await ir.get(i,{configuration:e})),await QN(e,null,a,{report:s})})).exitCode()}};am.paths=[["set","version"]],am.usage=Re.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});var boe=am;async function F3e(r,e){let i=(await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0})).tags.filter(n=>Wt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new Pe(`No matching release found for range ${ae.pretty(r,e,ae.Type.RANGE)}.`);return i[0]}async function Am(r,e){let t=await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0});if(!t.latest[e])throw new Pe(`Tag ${ae.pretty(r,e,ae.Type.RANGE)} not found`);return t.latest[e]}async function QN(r,e,t,{report:i}){var g;e===null&&await K.mktempPromise(async f=>{let h=k.join(f,"yarn.cjs");await K.writeFilePromise(h,t);let{stdout:p}=await Nr.execvp(process.execPath,[H.fromPortablePath(h),"--version"],{cwd:f,env:te(N({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!Boe.default.valid(e))throw new Error(`Invalid semver version. ${ae.pretty(r,"yarn --version",ae.Type.CODE)} returned: -${e}`)});let n=(g=r.projectCwd)!=null?g:r.startingCwd,s=k.resolve(n,".yarn/releases"),o=k.resolve(s,`yarn-${e}.cjs`),a=k.relative(r.startingCwd,o),l=k.relative(n,o),c=r.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(X.UNNAMED,`Saving the new release in ${ae.pretty(r,a,"magenta")}`),await K.removePromise(k.dirname(o)),await K.mkdirPromise(k.dirname(o),{recursive:!0}),await K.writeFilePromise(o,t,{mode:493}),u){await ye.updateConfiguration(n,{yarnPath:l});let f=await At.tryFind(n)||new At;f.packageManager=`yarn@${e&&Se.isTaggedYarnVersion(e)?e:await Am(r,"stable")}`;let h={};f.exportTo(h);let p=k.join(n,At.fileName),m=`${JSON.stringify(h,null,f.indent)} -`;await K.changeFilePromise(p,m,{automaticNewlines:!0})}}function Qoe(r){return X[II(r)]}var N3e=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function L3e(r){let t=`https://repo.yarnpkg.com/${Se.isTaggedYarnVersion(Ur)?Ur:await Am(r,"canary")}/packages/gatsby/content/advanced/error-codes.md`,i=await ir.get(t,{configuration:r});return new Map(Array.from(i.toString().matchAll(N3e),({groups:n})=>{if(!n)throw new Error("Assertion failed: Expected the match to have been successful");let s=Qoe(n.code);if(n.name!==s)throw new Error(`Assertion failed: Invalid error code data: Expected "${n.name}" to be named "${s}"`);return[n.code,n.details]}))}var lm=class extends Le{constructor(){super(...arguments);this.code=J.String({required:!1,validator:fp(gp(),[hp(/^YN[0-9]{4}$/)])});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(typeof this.code!="undefined"){let t=Qoe(this.code),i=ae.pretty(e,t,ae.Type.CODE),n=this.cli.format().header(`${this.code} - ${i}`),o=(await L3e(e)).get(this.code),a=typeof o!="undefined"?ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.MARKDOWN,{text:o,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. - -You can help us by editing this page on GitHub \u{1F642}: -${ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} -`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:t,details:a})} -`):this.context.stdout.write(`${n} - -${a} -`)}else{let t={children:Se.mapAndFilter(Object.entries(X),([i,n])=>Number.isNaN(Number(i))?Se.mapAndFilter.skip:{label:_A(Number(i)),value:ae.tuple(ae.Type.CODE,n)})};ls.emitTree(t,{configuration:e,stdout:this.context.stdout,json:this.json})}}};lm.paths=[["explain"]],lm.usage=Re.Usage({description:"explain an error code",details:` - When the code argument is specified, this command prints its name and its details. - - When used without arguments, this command lists all error codes and their names. - `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});var Soe=lm;var voe=ge(is()),cm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=J.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=J.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=J.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=J.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=J.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=J.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i&&!this.all)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(x,{recursive:T})=>{let q=x.anchoredLocator.locatorHash,Y=new Map,$=[q];for(;$.length>0;){let _=$.shift();if(Y.has(_))continue;let ne=t.storedPackages.get(_);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(Y.set(_,ne),P.isVirtualLocator(ne)&&$.push(P.devirtualizeLocator(ne).locatorHash),!(!T&&_!==q))for(let ee of ne.dependencies.values()){let A=t.storedResolutions.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");$.push(A)}}return Y.values()},a=({recursive:x})=>{let T=new Map;for(let q of t.workspaces)for(let Y of o(q,{recursive:x}))T.set(Y.locatorHash,Y);return T.values()},l=({all:x,recursive:T})=>x&&T?t.storedPackages.values():x?a({recursive:T}):o(i,{recursive:T}),c=({all:x,recursive:T})=>{let q=l({all:x,recursive:T}),Y=this.patterns.map(ne=>{let ee=P.parseLocator(ne),A=voe.default.makeRe(P.stringifyIdent(ee)),oe=P.isVirtualLocator(ee),ce=oe?P.devirtualizeLocator(ee):ee;return Z=>{let O=P.stringifyIdent(Z);if(!A.test(O))return!1;if(ee.reference==="unknown")return!0;let L=P.isVirtualLocator(Z),de=L?P.devirtualizeLocator(Z):Z;return!(oe&&L&&ee.reference!==Z.reference||ce.reference!==de.reference)}}),$=Se.sortMap([...q],ne=>P.stringifyLocator(ne));return{selection:$.filter(ne=>Y.length===0||Y.some(ee=>ee(ne))),sortedLookup:$}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new Pe("No package matched your request");let f=new Map;if(this.dependents)for(let x of g)for(let T of x.dependencies.values()){let q=t.storedResolutions.get(T.descriptorHash);if(typeof q=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");Se.getArrayWithDefault(f,q).push(x)}let h=new Map;for(let x of g){if(!P.isVirtualLocator(x))continue;let T=P.devirtualizeLocator(x);Se.getArrayWithDefault(h,T.locatorHash).push(x)}let p={},m={children:p},y=e.makeFetcher(),b={project:t,fetcher:y,cache:n,checksums:t.storedChecksums,report:new di,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},v=[async(x,T,q)=>{var _,ne;if(!T.has("manifest"))return;let Y=await y.fetch(x,b),$;try{$=await At.find(Y.prefixPath,{baseFs:Y.packageFs})}finally{(_=Y.releaseFs)==null||_.call(Y)}q("Manifest",{License:ae.tuple(ae.Type.NO_HINT,$.license),Homepage:ae.tuple(ae.Type.URL,(ne=$.raw.homepage)!=null?ne:null)})},async(x,T,q)=>{var A;if(!T.has("cache"))return;let Y={mockedPackages:t.disabledLocators,unstablePackages:t.conditionalLocators},$=(A=t.storedChecksums.get(x.locatorHash))!=null?A:null,_=n.getLocatorPath(x,$,Y),ne;if(_!==null)try{ne=K.statSync(_)}catch{}let ee=typeof ne!="undefined"?[ne.size,ae.Type.SIZE]:void 0;q("Cache",{Checksum:ae.tuple(ae.Type.NO_HINT,$),Path:ae.tuple(ae.Type.PATH,_),Size:ee})}];for(let x of u){let T=P.isVirtualLocator(x);if(!this.virtuals&&T)continue;let q={},Y={value:[x,ae.Type.LOCATOR],children:q};if(p[P.stringifyLocator(x)]=Y,this.nameOnly){delete Y.children;continue}let $=h.get(x.locatorHash);typeof $!="undefined"&&(q.Instances={label:"Instances",value:ae.tuple(ae.Type.NUMBER,$.length)}),q.Version={label:"Version",value:ae.tuple(ae.Type.NO_HINT,x.version)};let _=(ee,A)=>{let oe={};if(q[ee]=oe,Array.isArray(A))oe.children=A.map(ce=>({value:ce}));else{let ce={};oe.children=ce;for(let[Z,O]of Object.entries(A))typeof O!="undefined"&&(ce[Z]={label:Z,value:O})}};if(!T){for(let ee of v)await ee(x,s,_);await e.triggerHook(ee=>ee.fetchPackageInfo,x,s,_)}x.bin.size>0&&!T&&_("Exported Binaries",[...x.bin.keys()].map(ee=>ae.tuple(ae.Type.PATH,ee)));let ne=f.get(x.locatorHash);typeof ne!="undefined"&&ne.length>0&&_("Dependents",ne.map(ee=>ae.tuple(ae.Type.LOCATOR,ee))),x.dependencies.size>0&&!T&&_("Dependencies",[...x.dependencies.values()].map(ee=>{var ce;let A=t.storedResolutions.get(ee.descriptorHash),oe=typeof A!="undefined"&&(ce=t.storedPackages.get(A))!=null?ce:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:oe})})),x.peerDependencies.size>0&&T&&_("Peer dependencies",[...x.peerDependencies.values()].map(ee=>{var Z,O;let A=x.dependencies.get(ee.identHash),oe=typeof A!="undefined"&&(Z=t.storedResolutions.get(A.descriptorHash))!=null?Z:null,ce=oe!==null&&(O=t.storedPackages.get(oe))!=null?O:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:ce})}))}ls.emitTree(m,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};cm.paths=[["info"]],cm.usage=Re.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var xoe=cm;var _0=ge(Ic());ys();var um=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=J.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=J.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=J.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=J.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.cacheFolder=J.String("--cache-folder",{hidden:!0});this.frozenLockfile=J.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=J.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=J.Boolean("--non-interactive",{hidden:!0});this.preferOffline=J.Boolean("--prefer-offline",{hidden:!0});this.production=J.Boolean("--production",{hidden:!0});this.registry=J.String("--registry",{hidden:!0});this.silent=J.Boolean("--silent",{hidden:!0});this.networkTimeout=J.String("--network-timeout",{hidden:!0})}async execute(){var g;let e=await ye.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let t=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(f,{error:h})=>{let p=await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async m=>{h?m.reportError(X.DEPRECATED_CLI_SETTINGS,f):m.reportWarning(X.DEPRECATED_CLI_SETTINGS,f)});return p.hasErrors()?p.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let f=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.registry!="undefined"){let f=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(f!==null)return f}if(typeof this.preferOffline!="undefined"){let f=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.production!="undefined"){let f=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(f!==null)return f}if(typeof this.nonInteractive!="undefined"){let f=await i("The --non-interactive option is deprecated",{error:!t});if(f!==null)return f}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let f=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!_0.default.NETLIFY});if(f!==null)return f}let n=this.mode===Ci.UpdateLockfile;if(n&&(this.immutable||this.immutableCache))throw new Pe(`${ae.pretty(e,"--immutable",ae.Type.CODE)} and ${ae.pretty(e,"--immutable-cache",ae.Type.CODE)} cannot be used with ${ae.pretty(e,"--mode=update-lockfile",ae.Type.CODE)}`);let s=((g=this.immutable)!=null?g:e.get("enableImmutableInstalls"))&&!n,o=this.immutableCache&&!n;if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{await T3e(e,s)&&(h.reportInfo(X.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let f=e.projectCwd,h;try{h=await K.readFilePromise(k.join(f,kt.lockfile),"utf8")}catch{}if(h==null?void 0:h.includes("yarn lockfile v1")){let p=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async m=>{m.reportInfo(X.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),m.reportSeparator(),e.use("",{nodeLinker:"node-modules"},f,{overwrite:!0}),await ye.updateConfiguration(f,{nodeLinker:"node-modules"})});if(p.hasErrors())return p.exitCode()}}if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{var p;((p=ye.telemetry)==null?void 0:p.isNew)&&(h.reportInfo(X.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),h.reportInfo(X.TELEMETRY_NOTICE,`Run ${ae.pretty(e,"yarn config set --home enableTelemetry 0",ae.Type.CODE)} to disable`),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}let{project:a,workspace:l}=await ze.find(e,this.context.cwd),c=await Nt.find(e,{immutable:o,check:this.checkCache});if(!l)throw new ht(a.cwd,this.context.cwd);return await a.restoreInstallState({restoreResolutions:!1}),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async f=>{await a.install({cache:c,report:f,immutable:s,mode:this.mode})})).exitCode()}};um.paths=[["install"],Re.Default],um.usage=Re.Usage({description:"install the project dependencies",details:` - This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: - - - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). - - - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). - - - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). - - - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. - - Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. - - If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. - - If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). - - If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. - - If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var koe=um,O3e="|||||||",M3e=">>>>>>>",K3e="=======",Poe="<<<<<<<";async function T3e(r,e){if(!r.projectCwd)return!1;let t=k.join(r.projectCwd,r.get("lockfileFilename"));if(!await K.existsPromise(t))return!1;let i=await K.readFilePromise(t,"utf8");if(!i.includes(Poe))return!1;if(e)throw new ct(X.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=U3e(i),o,a;try{o=Si(n),a=Si(s)}catch(c){throw new ct(X.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=N(N({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await K.changeFilePromise(t,Ma(l),{automaticNewlines:!0}),!0}function U3e(r){let e=[[],[]],t=r.split(/\r?\n/g),i=!1;for(;t.length>0;){let n=t.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Poe)){for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===K3e){i=!1;break}else if(i||s.startsWith(O3e)){i=!0;continue}else e[0].push(s)}for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(M3e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` -`),e[1].join(` -`)]}var gm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=J.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=J.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=k.resolve(this.context.cwd,H.toPortablePath(this.destination)),o=await ye.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await ze.find(o,s);if(t.cwd===a.cwd)throw new Pe("Invalid destination; Can't link the project to itself");if(!l)throw new ht(a.cwd,s);let c=t.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new Pe("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new Pe("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=P.stringifyIdent(f.locator),p=this.relative?k.relative(t.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Je.start({configuration:e,stdout:this.context.stdout},async f=>{await t.install({cache:n,report:f})})).exitCode()}};gm.paths=[["link"]],gm.usage=Re.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var Doe=gm;var fm=class extends Le{constructor(){super(...arguments);this.args=J.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};fm.paths=[["node"]],fm.usage=Re.Usage({description:"run node with the hook already setup",details:` - This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - - The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Roe=fm;var Hoe=ge(require("os"));var Noe=ge(require("os"));var H3e="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function bu(r){let e=await ir.get(H3e,{configuration:r});return Si(e.toString())}var hm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await bu(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=Or(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(N({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};hm.paths=[["plugin","list"]],hm.usage=Re.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var Foe=hm;var j3e=/^[0-9]+$/;function Loe(r){return j3e.test(r)?`pull/${r}/head`:r}var G3e=({repository:r,branch:e},t)=>[["git","init",H.fromPortablePath(t)],["git","remote","add","origin",r],["git","fetch","origin","--depth=1",Loe(e)],["git","reset","--hard","FETCH_HEAD"]],Y3e=({branch:r})=>[["git","fetch","origin","--depth=1",Loe(r),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],q3e=({plugins:r,noMinify:e},t)=>[["yarn","build:cli",...new Array().concat(...r.map(i=>["--plugin",k.resolve(t,i)])),...e?["--no-minify"]:[],"|"]],pm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=J.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=J.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Noe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{await vN(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(X.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await dm(q3e(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=k.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await K.readFilePromise(o);await QN(e,"sources",a,{report:s}),this.skipPlugins||await J3e(this,{project:t,report:s,target:i})})).exitCode()}};pm.paths=[["set","version","from","sources"]],pm.usage=Re.Usage({description:"build Yarn from master",details:` - This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]});var Toe=pm;async function dm(r,{configuration:e,context:t,target:i}){for(let[n,...s]of r){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await Nr.pipevp(n,s,{cwd:i,stdin:t.stdin,stdout:t.stdout,stderr:t.stderr,strict:!0});else{t.stdout.write(`${ae.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} -`);try{await Nr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw t.stdout.write(a.stdout||a.stack),a}}}}async function vN(r,{configuration:e,report:t,target:i}){let n=!1;if(!r.force&&K.existsSync(k.join(i,".git"))){t.reportInfo(X.UNNAMED,"Fetching the latest commits"),t.reportSeparator();try{await dm(Y3e(r),{configuration:e,context:r.context,target:i}),n=!0}catch(s){t.reportSeparator(),t.reportWarning(X.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(t.reportInfo(X.UNNAMED,"Cloning the remote repository"),t.reportSeparator(),await K.removePromise(i),await K.mkdirPromise(i,{recursive:!0}),await dm(G3e(r,i),{configuration:e,context:r.context,target:i}))}async function J3e(r,{project:e,report:t,target:i}){let n=await bu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await SN(o,r,{project:e,report:t,target:i})}var Ooe=ge(ri()),Moe=ge(require("url")),Koe=ge(require("vm"));var Cm=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await ze.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.name)){let a=k.resolve(this.context.cwd,H.toPortablePath(this.name));i.reportInfo(X.UNNAMED,`Reading ${ae.pretty(e,a,ae.Type.PATH)}`),s=k.relative(n.cwd,a),o=await K.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new Moe.URL(this.name)}catch{throw new ct(X.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=P.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!Ooe.default.valid(l.reference))throw new ct(X.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=P.stringifyIdent(l),u=await bu(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Ur!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Ur}/`))}i.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,a,"green")}`),o=await ir.get(a,{configuration:e})}await xN(s,o,{project:n,report:i})})).exitCode()}};Cm.paths=[["plugin","import"]],Cm.usage=Re.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). - `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var Uoe=Cm;async function xN(r,e,{project:t,report:i}){let{configuration:n}=t,s={},o={exports:s};(0,Koe.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=k.resolve(t.cwd,l);i.reportInfo(X.UNNAMED,`Saving the new plugin in ${ae.pretty(n,l,"magenta")}`),await K.mkdirPromise(k.dirname(c),{recursive:!0}),await K.writeFilePromise(c,e);let u={path:l,spec:r};await ye.updateConfiguration(t.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let m=typeof p!="string"?p.path:p,y=k.resolve(t.cwd,H.toPortablePath(m)),{name:b}=Se.dynamicRequire(y);b!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),te(N({},g),{plugins:f})})}var W3e=({pluginName:r,noMinify:e},t)=>[["yarn",`build:${r}`,...e?["--no-minify"]:[],"|"]],mm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Hoe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await ze.find(e,this.context.cwd),o=P.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=P.stringifyIdent(o),l=await bu(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await vN(this,{configuration:e,report:n,target:t}),await SN(c,this,{project:s,report:n,target:t})})).exitCode()}};mm.paths=[["plugin","import","from","sources"]],mm.usage=Re.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var joe=mm;async function SN(r,{context:e,noMinify:t},{project:i,report:n,target:s}){let o=r.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(X.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await dm(W3e({pluginName:o,noMinify:t},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=k.resolve(s,`packages/${o}/bundles/${r}.js`),c=await K.readFilePromise(l);await xN(r,c,{project:i,report:n})}var Em=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=P.parseIdent(s);if(!e.plugins.has(s))throw new Pe(`${P.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=k.resolve(t.cwd,a);K.existsSync(l)&&(n.reportInfo(X.UNNAMED,`Removing ${ae.pretty(e,a,ae.Type.PATH)}...`),await K.removePromise(l)),n.reportInfo(X.UNNAMED,"Updating the configuration..."),await ye.updateConfiguration(t.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:te(N({},c),{plugins:u})})})).exitCode()}};Em.paths=[["plugin","remove"]],Em.usage=Re.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. - `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var Goe=Em;var Im=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};Im.paths=[["plugin","runtime"]],Im.usage=Re.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var Yoe=Im;var ym=class extends Le{constructor(){super(...arguments);this.idents=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(P.parseIdent(a).identHash);if(await t.restoreInstallState({restoreResolutions:!1}),await t.resolveEverything({cache:n,report:new di}),s.size>0)for(let a of t.storedPackages.values())s.has(a.identHash)&&t.storedBuildState.delete(a.locatorHash);else t.storedBuildState.clear();return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await t.install({cache:n,report:a})})).exitCode()}};ym.paths=[["rebuild"]],ym.usage=Re.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). - - By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var qoe=ym;var kN=ge(is());ys();var wm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=this.all?t.workspaces:[i],o=[Hr.REGULAR,Hr.DEVELOPMENT,Hr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,m=P.parseIdent(h);for(let y of s){let b=[...y.manifest.peerDependenciesMeta.keys()];for(let v of(0,kN.default)(b,h))y.manifest.peerDependenciesMeta.delete(v),l=!0,p=!0;for(let v of o){let x=y.manifest.getForScope(v),T=[...x.values()].map(q=>P.stringifyIdent(q));for(let q of(0,kN.default)(T,P.stringifyIdent(m))){let{identHash:Y}=P.parseIdent(q),$=x.get(Y);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");y.manifest[v].delete(Y),c.push([y,v,$]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new Pe(`${u} ${ae.prettyList(e,a,Ri.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Je.start({configuration:e,stdout:this.context.stdout},async p=>{await t.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};wm.paths=[["remove"]],wm.usage=Re.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. - `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var Joe=wm;var Woe=ge(require("util")),V0=class extends Le{async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=Se.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,Woe.inspect)(g,l)}`)})).exitCode()}};V0.paths=[["run"]];var zoe=V0;var Bm=class extends Le{constructor(){super(...arguments);this.inspect=J.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=J.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=J.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=J.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=J.Boolean("--silent",{hidden:!0});this.scriptName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i,locator:n}=await ze.find(e,this.context.cwd);await t.restoreInstallState();let s=this.topLevel?t.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Zt.hasPackageScript(s,this.scriptName,{project:t}))return await Zt.executePackageScript(s,this.scriptName,this.args,{project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Zt.getPackageAccessibleBinaries(s,{project:t});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Zt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(t.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Zt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new Pe("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Lf)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new Pe(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new Pe(`Couldn't find a script named "${this.scriptName}".`)}}};Bm.paths=[["run"]],Bm.usage=Re.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. - - Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). - `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var _oe=Bm;var bm=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=J.String();this.resolution=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(await t.restoreInstallState({restoreResolutions:!1}),!i)throw new ht(t.cwd,this.context.cwd);let s=P.parseDescriptor(this.descriptor,!0),o=P.makeDescriptor(s,this.resolution);return t.storedDescriptors.set(s.descriptorHash,s),t.storedDescriptors.set(o.descriptorHash,o),t.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};bm.paths=[["set","resolution"]],bm.usage=Re.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var Voe=bm;var Xoe=ge(is()),Qm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=t.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=k.resolve(this.context.cwd,H.toPortablePath(l));if(Se.isPathLike(l)){let u=await ye.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await ze.find(u,c);if(!f)throw new ht(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(P.stringifyIdent(h.locator));if(o.size===0)throw new Pe("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be unlinked");o.add(P.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,Xoe.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};Qm.paths=[["unlink"]],Qm.usage=Re.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var Zoe=Qm;var $oe=ge(WC()),PN=ge(is());ys();var th=class extends Le{constructor(){super(...arguments);this.interactive=J.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=[...t.storedDescriptors.values()],o=s.map(u=>P.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(P.parseDescriptor(u).range!=="unknown")throw new Pe("Ranges aren't allowed when using --recursive");for(let g of(0,PN.default)(o,u)){let f=P.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)t.storedDescriptors.delete(u.descriptorHash),t.storedResolutions.delete(u.descriptorHash);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{await t.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=s?[Vr.KEEP,Vr.REUSE,Vr.PROJECT,Vr.LATEST]:[Vr.PROJECT,Vr.LATEST],l=[],c=[];for(let y of this.patterns){let b=!1,v=P.parseDescriptor(y);for(let x of t.workspaces)for(let T of[Hr.REGULAR,Hr.DEVELOPMENT]){let Y=[...x.manifest.getForScope(T).values()].map($=>P.stringifyIdent($));for(let $ of(0,PN.default)(Y,P.stringifyIdent(v))){let _=P.parseIdent($),ne=x.manifest[T].get(_.identHash);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let ee=P.makeDescriptor(_,v.range);l.push(Promise.resolve().then(async()=>[x,T,ne,await _C(ee,{project:t,workspace:x,cache:n,target:T,modifier:o,strategies:a})])),b=!0}}b||c.push(y)}if(c.length>1)throw new Pe(`Patterns ${ae.prettyList(e,c,Ri.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new Pe(`Pattern ${ae.prettyList(e,c,Ri.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[,,b,{suggestions:v,rejections:x}]of u){let T=v.filter(q=>q.descriptor!==null);if(T.length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let Y=this.cli.error(q);t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range - -${Y}`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${Y}`)}else T.length>1&&!s&&y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[y,b,,{suggestions:v}]of u){let x,T=v.filter(_=>_.descriptor!==null),q=T[0].descriptor,Y=T.every(_=>P.areDescriptorsEqual(_.descriptor,q));T.length===1||Y?x=q:(f=!0,{answer:x}=await(0,$oe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${P.prettyWorkspace(e,y)} \u276F ${b}?`,choices:v.map(({descriptor:_,name:ne,reason:ee})=>_?{name:ne,hint:ee,descriptor:_}:{name:ne,hint:ee,disabled:!0}),onCancel:()=>process.exit(130),result(_){return this.find(_,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let $=y.manifest[b].get(x.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if($.descriptorHash!==x.descriptorHash)y.manifest[b].set(x.identHash,x),h.push([y,b,$,x]);else{let _=e.makeResolver(),ne={project:t,resolver:_},ee=_.bindDescriptor($,y.anchoredLocator,ne);t.forgetResolution(ee)}}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` -`),(await Je.start({configuration:e,stdout:this.context.stdout},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};th.paths=[["up"]],th.usage=Re.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),th.schema=[eS("recursive",Bc.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var eae=th;var Sm=class extends Le{constructor(){super(...arguments);this.recursive=J.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=J.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=P.parseIdent(this.package).identHash,s=this.recursive?_3e(t,n,{configuration:e,peers:this.peers}):z3e(t,n,{configuration:e,peers:this.peers});ls.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};Sm.paths=[["why"]],Sm.usage=Re.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var tae=Sm;function z3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.storedPackages.values(),a=>P.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=r.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=r.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=P.stringifyLocator(a);s[p]={value:[a,ae.Type.LOCATOR],children:l}}let h=P.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ae.Type.DEPENDENT]}}}return o}function _3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.workspaces,f=>P.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let m=r.storedResolutions.get(p.descriptorHash);if(!m)throw new Error("Assertion failed: The resolution should have been registered");let y=r.storedPackages.get(m);if(!y)throw new Error("Assertion failed: The package should have been registered");a(y)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let m=p!==null?ae.tuple(ae.Type.DEPENDENT,{locator:f,descriptor:p}):ae.tuple(ae.Type.LOCATOR,f),y={},b={value:m,children:y},v=P.stringifyLocator(f);if(h[v]=b,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&r.tryWorkspaceByLocator(f))))for(let x of f.dependencies.values()){if(!i&&f.peerDependencies.has(x.identHash))continue;let T=r.storedResolutions.get(x.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let q=r.storedPackages.get(T);if(!q)throw new Error("Assertion failed: The package should have been registered");g(q,y,x)}};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var jN={};ft(jN,{default:()=>dWe,gitUtils:()=>Qu});var Qu={};ft(Qu,{TreeishProtocols:()=>On,clone:()=>KN,fetchBase:()=>wae,fetchChangedFiles:()=>Bae,fetchChangedWorkspaces:()=>hWe,fetchRoot:()=>yae,isGitUrl:()=>ih,lsRemote:()=>Iae,normalizeLocator:()=>TN,normalizeRepoUrl:()=>vm,resolveUrl:()=>MN,splitRepoUrl:()=>xm});var NN=ge(dae()),Cae=ge(Zw()),rh=ge(require("querystring")),LN=ge(ri()),mae=ge(require("url"));function Eae(){return te(N({},process.env),{GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`})}var fWe=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],On;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(On||(On={}));function ih(r){return r?fWe.some(e=>!!r.match(e)):!1}function xm(r){r=vm(r);let e=r.indexOf("#");if(e===-1)return{repo:r,treeish:{protocol:On.Head,request:"HEAD"},extra:{}};let t=r.slice(0,e),i=r.slice(e+1);if(i.match(/^[a-z]+=/)){let n=rh.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(On).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=On.Head,a="HEAD");for(let l of Object.values(On))delete n[l];return{repo:t,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:t,treeish:{protocol:s,request:o},extra:{}}}}function vm(r,{git:e=!1}={}){var t;if(r=r.replace(/^git\+https:/,"https:"),r=r.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),r=r.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){r=r.replace(/^git\+([^:]+):/,"$1:");let i;try{i=mae.default.parse(r)}catch{i=null}i&&i.protocol==="ssh:"&&((t=i.path)==null?void 0:t.startsWith("/:"))&&(r=r.replace(/^ssh:\/\//,""))}return r}function TN(r){return P.makeLocator(r,vm(r.reference))}async function Iae(r,e){let t=vm(r,{git:!0});if(!ir.getNetworkSettings(`https://${(0,NN.default)(t).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${t}' has been blocked because of your configuration settings`);let n=await ON("listing refs",["ls-remote",t],{cwd:e.startingCwd,env:Eae()},{configuration:e,normalizedRepoUrl:t}),s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function MN(r,e){let{repo:t,treeish:{protocol:i,request:n},extra:s}=xm(r),o=await Iae(t,e),a=(c,u)=>{switch(c){case On.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return rh.default.stringify(te(N({},s),{commit:u}))}case On.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Semver:{let g=Wt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,m])=>[LN.default.parse(p.slice(10)),m]).filter(p=>p[0]!==null)),h=LN.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return rh.default.stringify(te(N({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(On.Commit,u))!==null||(g=l(On.Tag,u))!==null||(g=l(On.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${t}#${a(i,n)}`}async function KN(r,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:t,treeish:{protocol:i,request:n}}=xm(r);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=vm(t,{git:!0});if(ir.getNetworkSettings(`https://${(0,NN.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await K.mktempPromise(),a={cwd:o,env:Eae()};return await ON("cloning the repository",["clone","-c core.autocrlf=false",s,H.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await ON("switching branch",["checkout",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function yae(r){let e=null,t,i=r;do t=i,await K.existsPromise(k.join(t,".git"))&&(e=t),i=k.dirname(t);while(e===null&&i!==t);return e}async function wae(r,{baseRefs:e}){if(e.length===0)throw new Pe("Can't run this command with zero base refs specified.");let t=[];for(let a of e){let{code:l}=await Nr.execvp("git",["merge-base",a,"HEAD"],{cwd:r});l===0&&t.push(a)}if(t.length===0)throw new Pe(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await Nr.execvp("git",["merge-base","HEAD",...t],{cwd:r,strict:!0}),n=i.trim(),{stdout:s}=await Nr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:r,strict:!0}),o=s.trim();return{hash:n,title:o}}async function Bae(r,{base:e,project:t}){let i=Se.buildIgnorePattern(t.configuration.get("changesetIgnorePatterns")),{stdout:n}=await Nr.execvp("git",["diff","--name-only",`${e}`],{cwd:r,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),{stdout:o}=await Nr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:r,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!k.relative(t.cwd,c).match(i)):l}async function hWe({ref:r,project:e}){if(e.configuration.projectCwd===null)throw new Pe("This command can only be run from within a Yarn project");let t=[k.resolve(e.cwd,e.configuration.get("cacheFolder")),k.resolve(e.cwd,e.configuration.get("installStatePath")),k.resolve(e.cwd,e.configuration.get("lockfileFilename")),k.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&t.push(o)});let i=await yae(e.configuration.projectCwd);if(i==null)throw new Pe("This command can only be run on Git repositories");let n=await wae(i,{baseRefs:typeof r=="string"?[r]:e.configuration.get("changesetBaseRefs")}),s=await Bae(i,{base:n.hash,project:e});return new Set(Se.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?Se.mapAndFilter.skip:t.some(l=>o.startsWith(l))?Se.mapAndFilter.skip:a}))}async function ON(r,e,t,{configuration:i,normalizedRepoUrl:n}){try{return await Nr.execvp("git",e,te(N({},t),{strict:!0}))}catch(s){if(!(s instanceof Nr.ExecError))throw s;let o=s.reportExtra,a=s.stderr.toString();throw new ct(X.EXCEPTION,`Failed ${r}`,l=>{l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:"Repository URL",value:ae.tuple(ae.Type.URL,n)})}`);for(let c of a.matchAll(/^(.+?): (.*)$/gm)){let[,u,g]=c;u=u.toLowerCase();let f=u==="error"?"Error":`${(0,Cae.default)(u)} Error`;l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:f,value:ae.tuple(ae.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var UN=class{supports(e,t){return ih(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,n=TN(e),s=new Map(t.checksums);s.set(n.locatorHash,i);let o=te(N({},t),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:P.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,t){return t.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){let i=await KN(e.reference,t.project.configuration),n=xm(e.reference),s=k.join(i,"package.tgz");await Zt.prepareExternalProject(i,s,{configuration:t.project.configuration,report:t.report,workspace:n.extra.workspace,locator:e});let o=await K.readFilePromise(s);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(o,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}))}};var HN=class{supportsDescriptor(e,t){return ih(e.range)}supportsLocator(e,t){return ih(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=await MN(e.range,i.project.configuration);return[P.makeLocator(e,n)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var pWe={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:Ie.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:Ie.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:Ie.NUMBER,default:2}},fetchers:[UN],resolvers:[HN]};var dWe=pWe;var km=class extends Le{constructor(){super(...arguments);this.since=J.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=J.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Qu.fetchChangedWorkspaces({ref:this.since,project:t}):t.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of At.hardDependencies)for(let[h,p]of l.getForScope(f)){let m=t.tryWorkspaceByDescriptor(p);m===null?t.workspacesByIdent.has(h)&&g.add(p):u.add(m)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>P.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(N({location:a.relativeCwd,name:l.name?P.stringifyIdent(l.name):null},c))}})).exitCode()}};km.paths=[["workspaces","list"]],km.usage=Re.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var bae=km;var Pm=class extends Le{constructor(){super(...arguments);this.workspaceName=J.String();this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=t.workspaces,s=new Map(n.map(a=>{let l=P.convertToIdent(a.locator);return[P.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new Pe(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${a.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};Pm.paths=[["workspace"]],Pm.usage=Re.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var Qae=Pm;var CWe={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:Ie.BOOLEAN,default:Sae.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:Ie.STRING,values:["^","~",""],default:pa.CARET}},commands:[Tne,Mne,$se,uoe,Voe,Toe,boe,bae,Coe,moe,Eoe,Ioe,Nne,Lne,goe,hoe,yoe,woe,Soe,xoe,koe,Doe,Zoe,Roe,joe,Uoe,Goe,Foe,Yoe,qoe,Joe,zoe,_oe,eae,tae,Qae]},mWe=CWe;var zN={};ft(zN,{default:()=>IWe});var Ge={optional:!0},YN=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Ge}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Ge,["postcss-jsx"]:Ge,["postcss-less"]:Ge,["postcss-markdown"]:Ge,["postcss-scss"]:Ge}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Ge}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Ge}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Ge,"vue-template-compiler":Ge}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Ge,"utf-8-validate":Ge}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge,"vuetify-loader":Ge}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Ge}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Ge}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:Ge}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Ge,tinyliquid:Ge,"liquid-node":Ge,jade:Ge,"then-jade":Ge,dust:Ge,"dustjs-helpers":Ge,"dustjs-linkedin":Ge,swig:Ge,"swig-templates":Ge,"razor-tmpl":Ge,atpl:Ge,liquor:Ge,twig:Ge,ejs:Ge,eco:Ge,jazz:Ge,jqtpl:Ge,hamljs:Ge,hamlet:Ge,whiskers:Ge,"haml-coffee":Ge,"hogan.js":Ge,templayed:Ge,handlebars:Ge,underscore:Ge,lodash:Ge,pug:Ge,"then-pug":Ge,qejs:Ge,walrus:Ge,mustache:Ge,just:Ge,ect:Ge,mote:Ge,toffee:Ge,dot:Ge,"bracket-template":Ge,ractive:Ge,nunjucks:Ge,htmling:Ge,"babel-core":Ge,plates:Ge,"react-dom":Ge,react:Ge,"arc-templates":Ge,vash:Ge,slm:Ge,marko:Ge,teacup:Ge,"coffee-script":Ge,squirrelly:Ge,twing:Ge}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge,vue:Ge}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Ge}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Ge}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(r=>[r,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Ge,"webpack-command":Ge}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Ge}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Ge}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:Ge,jimp:Ge}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":Ge,"eslint-import-resolver-typescript":Ge,"eslint-import-resolver-webpack":Ge,"@typescript-eslint/parser":Ge}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":Ge}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":Ge}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.0"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:Ge}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:Ge}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@*",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{["vue-template-compiler"]:"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["parcel@*",{peerDependenciesMeta:{["@parcel/core"]:Ge}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@*",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:{optional:!0}}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}]];var qN;function vae(){return typeof qN=="undefined"&&(qN=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),qN}var JN;function xae(){return typeof JN=="undefined"&&(JN=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),JN}var WN;function kae(){return typeof WN=="undefined"&&(WN=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),WN}var Pae=new Map([[P.makeIdent(null,"fsevents").identHash,vae],[P.makeIdent(null,"resolve").identHash,xae],[P.makeIdent(null,"typescript").identHash,kae]]),EWe={hooks:{registerPackageExtensions:async(r,e)=>{for(let[t,i]of YN)e(P.parseDescriptor(t,!0),i)},getBuiltinPatch:async(r,e)=>{var s;let t="compat/";if(!e.startsWith(t))return;let i=P.parseIdent(e.slice(t.length)),n=(s=Pae.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(r,e,t,i)=>typeof Pae.get(r.identHash)=="undefined"?r:P.makeDescriptor(r,P.makeRange({protocol:"patch:",source:P.stringifyDescriptor(r),selector:`~builtin`,params:null}))}},IWe=EWe;var _N={};ft(_N,{default:()=>wWe});var X0=class extends Le{constructor(){super(...arguments);this.pkg=J.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let t=P.parseDescriptor(this.command),i;t.scope?i=P.makeIdent(t.scope,`create-${t.name}`):t.name.startsWith("@")?i=P.makeIdent(t.name.substring(1),"create"):i=P.makeIdent(null,`create-${t.name}`);let n=P.stringifyIdent(i);return t.range!=="unknown"&&(n+=`@${t.range}`),this.cli.run(["dlx",...e,n,...this.args])}};X0.paths=[["create"]];var Dae=X0;var Dm=class extends Le{constructor(){super(...arguments);this.packages=J.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){return ye.telemetry=null,await K.mktempPromise(async e=>{var p;let t=k.join(e,`dlx-${process.pid}`);await K.mkdirPromise(t),await K.writeFilePromise(k.join(t,"package.json"),`{} -`),await K.writeFilePromise(k.join(t,"yarn.lock"),"");let i=k.join(t,".yarnrc.yml"),n=await ye.findProjectCwd(this.context.cwd,kt.lockfile),s=!(await ye.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?k.join(n,".yarnrc.yml"):null;o!==null&&K.existsSync(o)?(await K.copyFilePromise(o,i),await ye.updateConfiguration(t,m=>{let y=te(N({},m),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(m.plugins)&&(y.plugins=m.plugins.map(b=>{let v=typeof b=="string"?b:b.path,x=H.isAbsolute(v)?v:H.resolve(H.fromPortablePath(n),v);return typeof b=="string"?x:{path:x,spec:b.spec}})),y})):await K.writeFilePromise(i,`enableGlobalCache: ${s} -enableTelemetry: false -`);let a=(p=this.packages)!=null?p:[this.command],l=P.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:t,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` -`);let u=await ye.find(t,this.context.plugins),{project:g,workspace:f}=await ze.find(u,t);if(f===null)throw new ht(g.cwd,t);await g.restoreInstallState();let h=await Zt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Zt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Dm.paths=[["dlx"]],Dm.usage=Re.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var Rae=Dm;var yWe={commands:[Dae,Rae]},wWe=yWe;var nL={};ft(nL,{default:()=>QWe,fileUtils:()=>VN});var nh=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,Rm=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Xr="file:";var VN={};ft(VN,{makeArchiveFromLocator:()=>Z0,makeBufferFromLocator:()=>$N,makeLocator:()=>ZN,makeSpec:()=>Fae,parseSpec:()=>XN});function XN(r){let{params:e,selector:t}=P.parseRange(r),i=H.toPortablePath(t);return{parentLocator:e&&typeof e.locator=="string"?P.parseLocator(e.locator):null,path:i}}function Fae({parentLocator:r,path:e,folderHash:t,protocol:i}){let n=r!==null?{locator:P.stringifyLocator(r)}:{},s=typeof t!="undefined"?{hash:t}:{};return P.makeRange({protocol:i,source:e,selector:e,params:N(N({},s),n)})}function ZN(r,{parentLocator:e,path:t,folderHash:i,protocol:n}){return P.makeLocator(r,Fae({parentLocator:e,path:t,folderHash:i,protocol:n}))}async function Z0(r,{protocol:e,fetchOptions:t,inMemory:i=!1}){let{parentLocator:n,path:s}=P.parseFileStyleRange(r.reference,{protocol:e}),o=k.isAbsolute(s)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(n,t),a=o.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=k.join(a.prefixPath,s);return await Se.releaseAfterUseAsync(async()=>await Bi.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:P.getIdentVendorPath(r),compressionLevel:t.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function $N(r,{protocol:e,fetchOptions:t}){return(await Z0(r,{protocol:e,fetchOptions:t,inMemory:!0})).getBufferAndClose()}var eL=class{supports(e,t){return!!e.reference.startsWith(Xr)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async fetchFromDisk(e,t){return Z0(e,{protocol:Xr,fetchOptions:t})}};var BWe=2,tL=class{supportsDescriptor(e,t){return e.range.match(nh)?!0:!!e.range.startsWith(Xr)}supportsLocator(e,t){return!!e.reference.startsWith(Xr)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=XN(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await $N(P.makeLocator(e,P.makeRange({protocol:Xr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:Xr,fetchOptions:i.fetchOptions}),a=Dn.makeHash(`${BWe}`,o).slice(0,6);return[ZN(e,{parentLocator:s,path:n,folderHash:a,protocol:Xr})]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var rL=class{supports(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.join(o.prefixPath,n),c=await a.readFilePromise(l);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(c,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var iL=class{supportsDescriptor(e,t){return Rm.test(e.range)?!!(e.range.startsWith(Xr)||nh.test(e.range)):!1}supportsLocator(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range;return n.startsWith(Xr)&&(n=n.slice(Xr.length)),[P.makeLocator(e,`${Xr}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var bWe={fetchers:[rL,eL],resolvers:[iL,tL]},QWe=bWe;var oL={};ft(oL,{default:()=>xWe});var Nae=ge(require("querystring")),Lae=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function Tae(r){return r?Lae.some(e=>!!r.match(e)):!1}function Oae(r){let e;for(let a of Lae)if(e=r.match(a),e)break;if(!e)throw new Error(SWe(r));let[,t,i,n,s="master"]=e,{commit:o}=Nae.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:t,username:i,reponame:n,treeish:s}}function SWe(r){return`Input cannot be parsed as a valid GitHub URL ('${r}').`}var sL=class{supports(e,t){return!!Tae(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await K.mktempPromise(async n=>{let s=new _t(n);await Bi.extractArchiveTo(i,s,{stripComponents:1});let o=Qu.splitRepoUrl(e.reference),a=k.join(n,"package.tgz");await Zt.prepareExternalProject(n,a,{configuration:t.project.configuration,report:t.report,workspace:o.extra.workspace,locator:e});let l=await K.readFilePromise(a);return await Bi.convertToZip(l,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){let{auth:i,username:n,reponame:s,treeish:o}=Oae(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var vWe={hooks:{async fetchHostedRepository(r,e,t){if(r!==null)return r;let i=new sL;if(!i.supports(e,t))return null;try{return await i.fetch(e,t)}catch(n){return null}}}},xWe=vWe;var lL={};ft(lL,{default:()=>PWe});var Fm=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,Nm=/^https?:/;var aL=class{supports(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(e.reference,{configuration:t.project.configuration});return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var AL=class{supportsDescriptor(e,t){return Fm.test(e.range)?!!Nm.test(e.range):!1}supportsLocator(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[P.convertDescriptorToLocator(e)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var kWe={fetchers:[aL],resolvers:[AL]},PWe=kWe;var fL={};ft(fL,{default:()=>D4e});var cAe=ge(lAe()),gL=ge(require("util")),Lm=class extends Le{constructor(){super(...arguments);this.private=J.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=J.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=J.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=J.Boolean("-2",!1,{hidden:!0});this.yes=J.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=J.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return t!==null?await this.executeProxy(e,t):await this.executeRegular(e)}async executeProxy(e,t){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new Pe("Cannot use the --install flag from within a project subdirectory");K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=k.join(this.context.cwd,e.get("lockfileFilename"));K.existsSync(i)||await K.writeFilePromise(i,"");let n=await this.cli.run(["set","version",t],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await K.mktempPromise(async o=>{let{code:a}=await Nr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Zt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let t=null;try{t=(await ze.find(e,this.context.cwd)).project}catch{t=null}K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=await At.tryFind(this.context.cwd)||new At,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:P.makeIdent(e.get("initScope"),k.basename(this.context.cwd)),i.packageManager=Ur&&Se.isTaggedYarnVersion(Ur)?`yarn@${Ur}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await K.mkdirPromise(k.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),gL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,gL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} -`);let o=k.join(this.context.cwd,At.fileName);await K.changeFilePromise(o,`${JSON.stringify(s,null,2)} -`,{automaticNewlines:!0});let a=k.join(this.context.cwd,"README.md");if(K.existsSync(a)||await K.writeFilePromise(a,`# ${P.stringifyIdent(i.name)} -`),!t||t.cwd===this.context.cwd){let c=k.join(this.context.cwd,kt.lockfile);K.existsSync(c)||await K.writeFilePromise(c,"");let g=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!.yarn/cache","#.pnp.*"].map(y=>`${y} -`).join(""),f=k.join(this.context.cwd,".gitignore");K.existsSync(f)||await K.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,cAe.default)(h,e.get("initEditorConfig"));let p=`root = true -`;for(let[y,b]of Object.entries(h)){p+=` -[${y}] -`;for(let[v,x]of Object.entries(b))p+=`${v.replace(/[A-Z]/g,q=>`_${q.toLowerCase()}`)} = ${x} -`}let m=k.join(this.context.cwd,".editorconfig");K.existsSync(m)||await K.writeFilePromise(m,p),K.existsSync(k.join(this.context.cwd,".git"))||await Nr.execvp("git",["init"],{cwd:this.context.cwd})}}};Lm.paths=[["init"]],Lm.usage=Re.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var uAe=Lm;var P4e={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:Ie.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}}},commands:[uAe]},D4e=P4e;var mL={};ft(mL,{default:()=>F4e});var wA="portal:",BA="link:";var hL=class{supports(e,t){return!!e.reference.startsWith(wA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot}}};var pL=class{supportsDescriptor(e,t){return!!e.range.startsWith(wA)}supportsLocator(e,t){return!!e.reference.startsWith(wA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(wA.length);return[P.makeLocator(e,`${wA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var dL=class{supports(e,t){return!!e.reference.startsWith(BA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0}}};var CL=class{supportsDescriptor(e,t){return!!e.range.startsWith(BA)}supportsLocator(e,t){return!!e.reference.startsWith(BA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(BA.length);return[P.makeLocator(e,`${BA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){return te(N({},e),{version:"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var R4e={fetchers:[dL,hL],resolvers:[CL,pL]},F4e=R4e;var JL={};ft(JL,{default:()=>j8e});var Mn;(function(i){i[i.REGULAR=0]="REGULAR",i[i.WORKSPACE=1]="WORKSPACE",i[i.EXTERNAL_SOFT_LINK=2]="EXTERNAL_SOFT_LINK"})(Mn||(Mn={}));var bA;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(bA||(bA={}));var EL=(r,e)=>`${r}@${e}`,gAe=(r,e)=>{let t=e.indexOf("#"),i=t>=0?e.substring(t+1):e;return EL(r,i)},yo;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(yo||(yo={}));var hAe=(r,e={})=>{let t=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||t>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:t,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=N4e(r,s),l=!1,c=0;do l=IL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=Tm(a);if(IL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${u}, next tree: -${Tm(a)}`);let f=fAe(a);if(f)throw new Error(`${f}, after hoisting finished: -${Tm(a)}`)}return s.debugLevel>=2&&console.log(Tm(a)),L4e(a)},T4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())t.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),t},O4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of r)u=g.dependencies.get(c.name),u&&t.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),t},pAe=(r,e)=>{if(e.decoupled)return e;let{name:t,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:p,hoistedTo:m}=e,y={name:t,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:new Map(p),hoistedTo:new Map(m)},b=y.dependencies.get(t);return b&&b.ident==y.ident&&y.dependencies.set(t,y),r.dependencies.set(y.name,y),y},M4e=(r,e)=>{let t=new Map([[r.name,[r.ident]]]);for(let n of r.dependencies.values())r.peerNames.has(n.name)||t.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!r.peerNames.has(s)){let a=t.get(s);a||(a=[],t.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return t},yL=r=>{let e=new Set,t=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!r.peerNames.has(s)){let o=r.dependencies.get(s);o&&!e.has(o)&&t(o,n)}e.add(i)}};for(let i of r.dependencies.values())r.peerNames.has(i.name)||t(i);return e},IL=(r,e,t,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=U4e(o),l=M4e(o,a),c=r==o?new Map:n.fastLookupPossible?T4e(e):O4e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([m,y])=>[m,y[0]])),p=new Map;do{let m=K4e(r,e,t,c,h,l,i,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),u=!1;for(let[y,b]of l)b.length>1&&!o.dependencies.has(y)&&(h.delete(y),b.shift(),h.set(y,b[0]),u=!0)}while(u);for(let m of o.dependencies.values())if(!o.peerNames.has(m.name)&&!t.has(m.locator)){t.add(m.locator);let y=IL(r,[...e,m],t,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),t.delete(m.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},H4e=r=>{for(let[e,t]of r.dependencies)if(!r.peerNames.has(e)&&t.ident!==r.ident)return!0;return!1},j4e=(r,e,t,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(y=>Li(y)).join("\u2192")}`);let h=t[t.length-1],m=!(i.ident===h.ident);if(l&&!m&&(g="- self-reference"),m&&(m=i.dependencyKind!==1,l&&!m&&(g="- workspace")),m&&i.dependencyKind===2&&(m=!H4e(i),l&&!m&&(g="- external soft link with unhoisted dependencies")),m&&(m=h.dependencyKind!==1||h.hoistedFrom.has(i.name)||e.size===1,l&&!m&&(g=h.reasons.get(i.name))),m&&(m=!r.peerNames.has(i.name),l&&!m&&(g=`- cannot shadow peer: ${Li(r.originalDependencies.get(i.name).locator)} at ${u}`)),m){let y=!1,b=n.get(i.name);if(y=!b||b.ident===i.ident,l&&!y&&(g=`- filled by: ${Li(b.locator)} at ${u}`),y)for(let v=t.length-1;v>=1;v--){let T=t[v].dependencies.get(i.name);if(T&&T.ident!==i.ident){y=!1;let q=a.get(h);q||(q=new Set,a.set(h,q)),q.add(i.name),l&&(g=`- filled by ${Li(T.locator)} at ${t.slice(0,v).map(Y=>Li(Y.locator)).join("\u2192")}`);break}}m=y}if(m&&(m=s.get(i.name)===i.ident,l&&!m&&(g=`- filled by: ${Li(o.get(i.name)[0])} at ${u}`)),m){let y=!0,b=new Set(i.peerNames);for(let v=t.length-1;v>=1;v--){let x=t[v];for(let T of b){if(x.peerNames.has(T)&&x.originalDependencies.has(T))continue;let q=x.dependencies.get(T);q&&r.dependencies.get(T)!==q&&(v===t.length-1?f.add(q):(f=null,y=!1,l&&(g=`- peer dependency ${Li(q.locator)} from parent ${Li(x.locator)} was not hoisted to ${u}`))),b.delete(T)}if(!y)break}m=y}if(m&&!c)for(let y of i.hoistedDependencies.values()){let b=n.get(y.name)||r.dependencies.get(y.name);if(!b||y.ident!==b.ident){m=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${Li(y.locator)}, available: ${Li(b==null?void 0:b.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:m?0:1,reason:g}},$0=r=>`${r.name}@${r.locator}`,K4e=(r,e,t,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(b,v,x,T,q)=>{if(u.has(T))return;let Y=[...v,$0(T)],$=[...x,$0(T)],_=new Map,ne=new Map;for(let Z of yL(T)){let O=j4e(c,t,[c,...b,T],Z,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(ne.set(Z,O),O.isHoistable===2)for(let L of O.dependsOn){let de=_.get(L.name)||new Set;de.add(Z.name),_.set(L.name,de)}}let ee=new Set,A=(Z,O,L)=>{if(!ee.has(Z)){ee.add(Z),ne.set(Z,{isHoistable:1,reason:L});for(let de of _.get(Z.name)||[])A(T.dependencies.get(de),O,l.debugLevel>=2?`- peer dependency ${Li(Z.locator)} from parent ${Li(T.locator)} was not hoisted`:"")}};for(let[Z,O]of ne)O.isHoistable===1&&A(Z,O,O.reason);let oe=!1;for(let Z of ne.keys())if(!ee.has(Z)){f=!0;let O=o.get(T);O&&O.has(Z.name)&&(g=!0),oe=!0,T.dependencies.delete(Z.name),T.hoistedDependencies.set(Z.name,Z),T.reasons.delete(Z.name);let L=c.dependencies.get(Z.name);if(l.debugLevel>=2){let de=Array.from(v).concat([T.locator]).map(je=>Li(je)).join("\u2192"),Be=c.hoistedFrom.get(Z.name);Be||(Be=[],c.hoistedFrom.set(Z.name,Be)),Be.push(de),T.hoistedTo.set(Z.name,Array.from(e).map(je=>Li(je.locator)).join("\u2192"))}if(!L)c.ident!==Z.ident&&(c.dependencies.set(Z.name,Z),q.add(Z));else for(let de of Z.references)L.references.add(de)}if(T.dependencyKind===2&&oe&&(g=!0),l.check){let Z=fAe(r);if(Z)throw new Error(`${Z}, after hoisting dependencies of ${[c,...b,T].map(O=>Li(O.locator)).join("\u2192")}: -${Tm(r)}`)}let ce=yL(T);for(let Z of ce)if(ee.has(Z)){let O=ne.get(Z);if((n.get(Z.name)===Z.ident||!T.reasons.has(Z.name))&&O.isHoistable!==0&&T.reasons.set(Z.name,O.reason),!Z.isHoistBorder&&$.indexOf($0(Z))<0){u.add(T);let de=pAe(T,Z);h([...b,T],Y,$,de,m),u.delete(T)}}},p,m=new Set(yL(c)),y=Array.from(e).map(b=>$0(b));do{p=m,m=new Set;for(let b of p){if(b.locator===c.locator||b.isHoistBorder)continue;let v=pAe(c,b);h([],Array.from(t),y,v,m)}}while(m.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},fAe=r=>{let e=[],t=new Set,i=new Set,n=(s,o,a)=>{if(t.has(s)||(t.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>Li(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,m=`${h?` hoisted to ${h}`:""}`,y=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${y} - broken require promise for ${c.name}${m}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${y} - broken require promise: no required dependency ${c.name}${m} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(r,r.dependencies,r),e.join(` -`)},N4e=(r,e)=>{let{identName:t,name:i,reference:n,peerNames:s}=r,o={name:i,references:new Set([n]),locator:EL(t,n),ident:gAe(t,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[r,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:m,peerNames:y,hoistPriority:b,dependencyKind:v}=c,x=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([m]),locator:EL(p,m),ident:gAe(p,m),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(y),reasons:new Map,decoupled:!0,isHoistBorder:x?x.has(h):!1,hoistPriority:b||0,dependencyKind:v||0,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=m=>{if(!h.has(m)){h.add(m),m.decoupled=!1;for(let y of m.dependencies.values())m.peerNames.has(y.name)||p(y)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of r.dependencies)l(c,o);return o},wL=r=>r.substring(0,r.indexOf("@",1)),L4e=r=>{let e={name:r.name,identName:wL(r.locator),references:new Set(r.references),dependencies:new Set},t=new Set([r]),i=(n,s,o)=>{let a=t.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:wL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){t.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);t.delete(n)}};for(let n of r.dependencies.values())i(n,r,e);return e},U4e=r=>{let e=new Map,t=new Set([r]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!t.has(a);if(n(a).dependents.add(o.ident),!l){t.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of r.dependencies.values())r.peerNames.has(o.name)||s(r,o);return e},Li=r=>{if(!r)return"none";let e=r.indexOf("@",1),t=r.substring(0,e);t.endsWith("$wsroot$")&&(t=`wh:${t.replace("$wsroot$","")}`);let i=r.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(t=`v:${t}`),n.startsWith("workspace")&&(t=`w:${t}`,n=""),`${t}${n?`@${n}`:""}`}else return`${t}`},dAe=5e4,Tm=r=>{let e=0,t=(n,s,o="")=>{if(e>dAe||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name===u.name?0:c.name>u.name?1:-1),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+Li(u.locator)+(g?` ${g}`:"")} -`,l+=t(u,s,`${o}${cdAe?` -Tree is too large, part of the tree has been dunped -`:"")};var wo;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(wo||(wo={}));var Kn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Kn||(Kn={}));var CAe="node_modules",Su="$wsroot$";var Om=(r,e)=>{let{packageTree:t,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=G4e(r,e),o=null;if(n.length===0){let a=hAe(t,{hoistingLimits:i});o=Y4e(r,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},da=r=>`${r.name}@${r.reference}`,BL=r=>{let e=new Map;for(let[t,i]of r.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(t)}for(let t of e.values())t.locations=t.locations.sort((i,n)=>{let s=i.split(k.delimiter).length,o=n.split(k.delimiter).length;return n===i?0:s!==o?o-s:n>i?1:-1});return e},mAe=(r,e)=>{let t=P.isVirtualLocator(r)?P.devirtualizeLocator(r):r,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(t,i)},bL=(r,e,t,i)=>{if(r.linkType!==wo.SOFT)return!1;let n=H.toPortablePath(t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation);return k.contains(i,n)===null},q4e=r=>{let e=r.getPackageInformation(r.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(r.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=H.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=r.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=da(f);if(l.has(p))return;l.add(p);let m=r.getPackageInformation(f);if(m){let y=h?da(h):"";if(da(f)!==y&&m.linkType===wo.SOFT&&!bL(m,f,r,i)){let b=EAe(m,f,r);(!a.get(b)||f.reference.startsWith("workspace:"))&&a.set(b,f)}for(let[b,v]of m.packageDependencies)v!==null&&(m.packagePeers.has(b)||c(r.getLocator(b,v),f))}};for(let f of o)c(f,null);let u=i.split(k.sep);for(let f of a.values()){let h=r.getPackageInformation(f),m=H.toPortablePath(h.packageLocation.slice(0,-1)).split(k.sep).slice(u.length),y=s;for(let b of m){let v=y.children.get(b);v||(v={children:new Map},y.children.set(b,v)),y=v}y.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=da(h),m=n.get(p);m||(m=new Set,n.set(p,m)),m.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},G4e=(r,e)=>{let t=[],i=!1,n=new Map,s=q4e(r),o=r.getPackageInformation(r.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=r.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=H.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,dependencyKind:Mn.WORKSPACE},u=new Map,g=(h,p)=>`${da(p)}:${h}`,f=(h,p,m,y,b,v,x,T)=>{var Z,O;let q=g(h,m),Y=u.get(q),$=!!Y;!$&&m.name===a.name&&m.reference===a.reference&&(Y=c,u.set(q,c));let _=bL(p,m,r,l);if(!Y){let L=Mn.REGULAR;_?L=Mn.EXTERNAL_SOFT_LINK:p.linkType===wo.SOFT&&m.name.endsWith(Su)&&(L=Mn.WORKSPACE),Y={name:h,identName:m.name,reference:m.reference,dependencies:new Set,peerNames:L===Mn.WORKSPACE?new Set:p.packagePeers,dependencyKind:L},u.set(q,Y)}let ne;if(_?ne=2:b.linkType===wo.SOFT?ne=1:ne=0,Y.hoistPriority=Math.max(Y.hoistPriority||0,ne),T&&!_){let L=da({name:y.identName,reference:y.reference}),de=n.get(L)||new Set;n.set(L,de),de.add(Y.name)}let ee=new Map(p.packageDependencies);if(e.project){let L=e.project.workspacesByCwd.get(H.toPortablePath(p.packageLocation.slice(0,-1)));if(L){let de=new Set([...Array.from(L.manifest.peerDependencies.values(),Be=>P.stringifyIdent(Be)),...Array.from(L.manifest.peerDependenciesMeta.keys())]);for(let Be of de)ee.has(Be)||(ee.set(Be,v.get(Be)||null),Y.peerNames.add(Be))}}let A=da({name:m.name.replace(Su,""),reference:m.reference}),oe=s.get(A);if(oe)for(let L of oe)ee.set(`${L.name}${Su}`,L.reference);(p!==b||p.linkType!==wo.SOFT||!_&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(x)))&&y.dependencies.add(Y);let ce=m!==a&&p.linkType===wo.SOFT&&!m.name.endsWith(Su)&&!_;if(!$&&!ce){let L=new Map;for(let[de,Be]of ee)if(Be!==null){let je=r.getLocator(de,Be),re=r.getLocator(de.replace(Su,""),Be),se=r.getPackageInformation(re);if(se===null)throw new Error("Assertion failed: Expected the package to have been registered");let be=bL(se,je,r,l);if(e.validateExternalSoftLinks&&e.project&&be){se.packageDependencies.size>0&&(i=!0);for(let[ve,pe]of se.packageDependencies)if(pe!==null){let V=P.parseLocator(Array.isArray(pe)?`${pe[0]}@${pe[1]}`:`${ve}@${pe}`);if(da(V)!==da(je)){let Qe=ee.get(ve);if(Qe){let le=P.parseLocator(Array.isArray(Qe)?`${Qe[0]}@${Qe[1]}`:`${ve}@${Qe}`);mAe(le,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with parent dependency ${P.prettyLocator(e.project.configuration,le)}`})}else{let le=L.get(ve);if(le){let fe=le.target,gt=P.parseLocator(Array.isArray(fe)?`${fe[0]}@${fe[1]}`:`${ve}@${fe}`);mAe(gt,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with dependency ${P.prettyLocator(e.project.configuration,gt)} from sibling portal ${P.prettyIdent(e.project.configuration,P.parseIdent(le.portal.name))}`})}else L.set(ve,{target:V.reference,portal:je})}}}}let he=(Z=e.hoistingLimitsByCwd)==null?void 0:Z.get(x),Fe=be?x:k.relative(l,H.toPortablePath(se.packageLocation))||Me.dot,Ke=(O=e.hoistingLimitsByCwd)==null?void 0:O.get(Fe),ke=he===Kn.DEPENDENCIES||Ke===Kn.DEPENDENCIES||Ke===Kn.WORKSPACES;f(de,se,je,Y,p,ee,Fe,ke)}}};return f(a.name,o,a,c,o,o.packageDependencies,Me.dot,!1),{packageTree:c,hoistingLimits:n,errors:t,preserveSymlinksRequired:i}};function EAe(r,e,t){let i=t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation;return H.toPortablePath(i||r.packageLocation)}function J4e(r,e,t){let i=e.getLocator(r.name.replace(Su,""),r.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return t.pnpifyFs?(o=H.toPortablePath(n.packageLocation),s=wo.SOFT):(o=EAe(n,r,e),s=n.linkType),{linkType:s,target:o}}var Y4e=(r,e,t)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=J4e(u,r,t);return{locator:da(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:Jr(g),name:Jr(f)}:{scope:null,name:Jr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),m={name:h.identName,reference:p[0]},{name:y,scope:b}=s(h.name),v=b?[b,y]:[y],x=k.join(g,CAe),T=k.join(x,...v),q=`${f}/${m.name}`,Y=n(m,f,p.slice(1)),$=!1;if(Y.linkType===wo.SOFT&&t.project){let _=t.project.workspacesByCwd.get(Y.target.slice(0,-1));$=!!(_&&!_.manifest.name)}if(!h.name.endsWith(Su)&&!$){let _=i.get(T);if(_){if(_.dirList)throw new Error(`Assertion failed: ${T} cannot merge dir node with leaf node`);{let oe=P.parseLocator(_.locator),ce=P.parseLocator(Y.locator);if(_.linkType!==Y.linkType)throw new Error(`Assertion failed: ${T} cannot merge nodes with different link types ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/${P.stringifyLocator(ce)}`);if(oe.identHash!==ce.identHash)throw new Error(`Assertion failed: ${T} cannot merge nodes with different idents ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/s${P.stringifyLocator(ce)}`);Y.aliases=[...Y.aliases,..._.aliases,P.parseLocator(_.locator).reference]}}i.set(T,Y);let ne=T.split("/"),ee=ne.indexOf(CAe),A=ne.length-1;for(;ee>=0&&A>ee;){let oe=H.toPortablePath(ne.slice(0,A).join(k.sep)),ce=Jr(ne[A]),Z=i.get(oe);if(!Z)i.set(oe,{dirList:new Set([ce])});else if(Z.dirList){if(Z.dirList.has(ce))break;Z.dirList.add(ce)}A--}}a(h,Y.linkType===wo.SOFT?Y.target:T,q)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var LL={};ft(LL,{PnpInstaller:()=>oh,PnpLinker:()=>xu,default:()=>d8e,getPnpPath:()=>Tl,jsInstallUtils:()=>Ca,pnpUtils:()=>FL,quotePathIfNeeded:()=>GAe});var HAe=ge(ri()),jAe=ge(require("url"));var IAe;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(IAe||(IAe={}));var er;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(er||(er={}));var yAe={[er.DEFAULT]:{collapsed:!1,next:{["*"]:er.DEFAULT}},[er.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:er.FALLBACK_EXCLUSION_LIST,packageRegistryData:er.PACKAGE_REGISTRY_DATA,["*"]:er.DEFAULT}},[er.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:er.FALLBACK_EXCLUSION_ENTRIES}},[er.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:er.FALLBACK_EXCLUSION_DATA}},[er.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:er.DEFAULT}},[er.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_REGISTRY_ENTRIES}},[er.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_STORE_DATA}},[er.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_STORE_ENTRIES}},[er.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_INFORMATION_DATA}},[er.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:er.PACKAGE_DEPENDENCIES,["*"]:er.DEFAULT}},[er.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:er.PACKAGE_DEPENDENCY}},[er.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:er.DEFAULT}}};function W4e(r,e,t){let i="";i+="[";for(let n=0,s=r.length;ns(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function X4e(r){let e=new Map,t=Mm(r.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of t){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function Z4e(r){return Mm(r.fallbackPool||[],([e])=>e)}function $4e(r){let e=[];for(let[t,i]of Mm(r.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([t,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of Mm(i,([g])=>g===null?"0":`1${g}`)){let g=[];t!==null&&s!==null&&!a.has(t)&&g.push([t,s]);for(let[p,m]of Mm(a.entries(),([y])=>y))g.push([p,m]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function Km(r){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:r.dependencyTreeRoots,enableTopLevelFallback:r.enableTopLevelFallback||!1,ignorePatternData:r.ignorePattern||null,fallbackExclusionList:X4e(r),fallbackPool:Z4e(r),packageRegistryData:$4e(r)}}var SAe=ge(QAe());function vAe(r,e){return[r?`${r} -`:"",`/* eslint-disable */ - -`,`try { -`,` Object.freeze({}).detectStrictMode = true; -`,`} catch (error) { -`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} -`,` -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,e.replace(/^/gm," "),`} -`,` -`,(0,SAe.default)()].join("")}function e8e(r){return JSON.stringify(r,null,2)}function t8e(r){return`'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ -`)}'`}function r8e(r){return[`return hydrateRuntimeState(JSON.parse(${t8e(BAe(r))}), {basePath: basePath || __dirname}); -`].join("")}function i8e(r){return[`var path = require('path'); -`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(r)}); -`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); -`].join("")}function xAe(r){let e=Km(r),t=r8e(e);return vAe(r.shebang,t)}function kAe(r){let e=Km(r),t=i8e(r.dataLocation),i=vAe(r.shebang,t);return{dataFile:e8e(e),loaderFile:i}}var RAe=ge(require("fs")),l8e=ge(require("path")),FAe=ge(require("util"));function SL(r,{basePath:e}){let t=H.toPortablePath(e),i=k.resolve(t),n=r.ignorePatternData!==null?new RegExp(r.ignorePatternData):null,s=new Map,o=new Map(r.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var x;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let m=(x=p.discardFromLookup)!=null?x:!1,y={name:g,reference:h},b=s.get(p.packageLocation);b?(b.discardFromLookup=b.discardFromLookup&&m,m||(b.locator=y)):s.set(p.packageLocation,{locator:y,discardFromLookup:m});let v=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:m,get packageLocation(){return v||(v=k.join(i,p.packageLocation))}}]}))])),a=new Map(r.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(r.fallbackPool),c=r.dependencyTreeRoots,u=r.enableTopLevelFallback;return{basePath:t,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var Um=ge(require("module"));function sh(r,e){if(typeof r=="string")return r;if(r){let t,i;if(Array.isArray(r)){for(t=0;t0)return(f=sh(n[g],u))?f.replace("*",c.substring(g.length-1)):vu(i,c,1)}return vu(i,c)}}var vL=ge(require("util"));var ur;(function(c){c.API_ERROR="API_ERROR",c.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",c.EXPORTS_RESOLUTION_FAILED="EXPORTS_RESOLUTION_FAILED",c.MISSING_DEPENDENCY="MISSING_DEPENDENCY",c.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",c.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",c.INTERNAL="INTERNAL",c.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",c.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var s8e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ai(r,e,t={},i){i!=null||(i=s8e.has(r)?"MODULE_NOT_FOUND":r);let n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:te(N({},n),{value:i}),pnpCode:te(N({},n),{value:r}),data:te(N({},n),{value:t})})}function Bo(r){return H.normalize(H.fromPortablePath(r))}var o8e=ge(require("fs")),DAe=ge(require("module")),a8e=ge(require("path")),A8e=new Set(DAe.Module.builtinModules||Object.keys(process.binding("natives"))),tb=r=>r.startsWith("node:")||A8e.has(r);function xL(r,e){let t=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,s=/^(\/|\.{1,2}(\/|$))/,o=/\/$/,a=/^\.{0,2}\//,l={name:null,reference:null},c=[],u=new Set;if(r.enableTopLevelFallback===!0&&c.push(l),e.compatibilityMode!==!1)for(let re of["react-scripts","gatsby"]){let se=r.packageRegistry.get(re);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");c.push({name:re,reference:be})}}let{ignorePattern:g,packageRegistry:f,packageLocatorsByLocations:h}=r;function p(re,se){return{fn:re,args:se,error:null,result:null}}function m(re){var Ke,ke,ve,pe,V,Qe;let se=(ve=(ke=(Ke=process.stderr)==null?void 0:Ke.hasColors)==null?void 0:ke.call(Ke))!=null?ve:process.stdout.isTTY,be=(le,fe)=>`[${le}m${fe}`,he=re.error;console.error(he?be("31;1",`\u2716 ${(pe=re.error)==null?void 0:pe.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),re.args.length>0&&console.error();for(let le of re.args)console.error(` ${be("37;1","In \u2190")} ${(0,vL.inspect)(le,{colors:se,compact:!0})}`);re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,vL.inspect)(re.result,{colors:se,compact:!0})}`));let Fe=(Qe=(V=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:V.slice(2))!=null?Qe:[];if(Fe.length>0){console.error();for(let le of Fe)console.error(` ${be("38;5;244",le)}`)}console.error()}function y(re,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let he=p(re,be);try{return he.result=se(...be)}catch(Fe){throw he.error=Fe}finally{m(he)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(he){let Fe=p(re,be);throw Fe.error=he,m(Fe),he}}}return se}function b(re){let se=A(re);if(!se)throw ai(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function v(re){if(re.name===null)return!0;for(let se of r.dependencyTreeRoots)if(se.name===re.name&&se.reference===re.reference)return!0;return!1}let x=new Set(["default","node","require"]);function T(re,se=x){let be=Z(k.join(re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ai(ur.INTERNAL,`The locator that owns the "${re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:he}=b(be),Fe=k.join(he,kt.manifest);if(!e.fakeFs.existsSync(Fe))return null;let Ke=JSON.parse(e.fakeFs.readFileSync(Fe,"utf8")),ke=k.contains(he,re);if(ke===null)throw ai(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");a.test(ke)||(ke=`./${ke}`);let ve;try{ve=PAe(Ke,k.normalize(ke),{conditions:se,unsafe:!0})}catch(pe){throw ai(ur.EXPORTS_RESOLUTION_FAILED,pe.message,{unqualifiedPath:Bo(re),locator:be,pkgJson:Ke,subpath:Bo(ke),conditions:se},"ERR_PACKAGE_PATH_NOT_EXPORTED")}return typeof ve=="string"?k.join(he,ve):null}function q(re,se,{extensions:be}){let he;try{se.push(re),he=e.fakeFs.statSync(re)}catch(Fe){}if(he&&!he.isDirectory())return e.fakeFs.realpathSync(re);if(he&&he.isDirectory()){let Fe;try{Fe=JSON.parse(e.fakeFs.readFileSync(k.join(re,kt.manifest),"utf8"))}catch(ke){}let Ke;if(Fe&&Fe.main&&(Ke=k.resolve(re,Fe.main)),Ke&&Ke!==re){let ke=q(Ke,se,{extensions:be});if(ke!==null)return ke}}for(let Fe=0,Ke=be.length;Fe{let ve=JSON.stringify(ke.name);if(he.has(ve))return;he.add(ve);let pe=oe(ke);for(let V of pe)if(b(V).packagePeers.has(re))Fe(V);else{let le=be.get(V.name);typeof le=="undefined"&&be.set(V.name,le=new Set),le.add(V.reference)}};Fe(se);let Ke=[];for(let ke of[...be.keys()].sort())for(let ve of[...be.get(ke)].sort())Ke.push({name:ke,reference:ve});return Ke}function Z(re,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(_(re)&&!se)return null;let he=k.relative(r.basePath,re);he.match(s)||(he=`./${he}`),he.endsWith("/")||(he=`${he}/`);do{let Fe=h.get(he);if(typeof Fe=="undefined"||Fe.discardFromLookup&&!be){he=he.substring(0,he.lastIndexOf("/",he.length-2)+1);continue}return Fe.locator}while(he!=="");return null}function O(re,se,{considerBuiltins:be=!0}={}){if(re==="pnpapi")return H.toPortablePath(e.pnpapiResolution);if(be&&tb(re))return null;let he=Bo(re),Fe=se&&Bo(se);if(se&&_(se)&&(!k.isAbsolute(re)||Z(re)===null)){let ve=$(re,se);if(ve===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(ve)}let Ke,ke=re.match(n);if(ke){if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let[,ve,pe]=ke,V=Z(se);if(!V){let jt=$(re,se);if(jt===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(jt)}let le=b(V).packageDependencies.get(ve),fe=null;if(le==null&&V.name!==null){let jt=r.fallbackExclusionList.get(V.name);if(!jt||!jt.has(V.reference)){for(let Oi=0,Xs=c.length;Oiv(Qr))?gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt}):gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) - -${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt})}else le===void 0&&(!be&&tb(re)?v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in ${V.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}):v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}));if(le==null){if(fe===null||gt===null)throw gt||new Error("Assertion failed: Expected an error to have been set");le=fe;let jt=gt.message.replace(/\n.*/g,"");gt.message=jt,!u.has(jt)&&i!==0&&(u.add(jt),process.emitWarning(gt))}let Ht=Array.isArray(le)?{name:le[0],reference:le[1]}:{name:ve,reference:le},Mt=b(Ht);if(!Mt.packageLocation)throw ai(ur.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${Ht.name}@${Ht.reference}${Ht.name!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,dependencyLocator:Object.assign({},Ht)});let Ei=Mt.packageLocation;pe?Ke=k.join(Ei,pe):Ke=Ei}else if(k.isAbsolute(re))Ke=k.normalize(re);else{if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let ve=k.resolve(se);se.match(o)?Ke=k.normalize(k.join(ve,re)):Ke=k.normalize(k.join(k.dirname(ve),re))}return k.normalize(Ke)}function L(re,se,be=x){if(s.test(re))return se;let he=T(se,be);return he?k.normalize(he):se}function de(re,{extensions:se=Object.keys(Um.Module._extensions)}={}){var Fe,Ke;let be=[],he=q(re,be,{extensions:se});if(he)return k.normalize(he);{let ke=Bo(re),ve=Z(re);if(ve){let{packageLocation:pe}=b(ve),V=!0;try{e.fakeFs.accessSync(pe)}catch(Qe){if((Qe==null?void 0:Qe.code)==="ENOENT")V=!1;else{let le=((Ke=(Fe=Qe==null?void 0:Qe.message)!=null?Fe:Qe)!=null?Ke:"empty exception thrown").replace(/^[A-Z]/,fe=>fe.toLowerCase());throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Required package exists but could not be accessed (${le}). - -Missing package: ${ve.name}@${ve.reference} -Expected package location: ${Bo(pe)} -`,{unqualifiedPath:ke,extensions:se})}}if(!V){let Qe=pe.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${Qe} - -Missing package: ${ve.name}@${ve.reference} -Expected package location: ${Bo(pe)} -`,{unqualifiedPath:ke,extensions:se})}}throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed: we looked for the following paths, but none could be accessed. - -Source path: ${ke} -${be.map(pe=>`Not found: ${Bo(pe)} -`).join("")}`,{unqualifiedPath:ke,extensions:se})}}function Be(re,se,{considerBuiltins:be,extensions:he,conditions:Fe}={}){try{let Ke=O(re,se,{considerBuiltins:be});if(re==="pnpapi")return Ke;if(Ke===null)return null;let ke=()=>se!==null?_(se):!1,ve=(!be||!tb(re))&&!ke()?L(re,Ke,Fe):Ke;return de(ve,{extensions:he})}catch(Ke){throw Object.prototype.hasOwnProperty.call(Ke,"pnpCode")&&Object.assign(Ke.data,{request:Bo(re),issuer:se&&Bo(se)}),Ke}}function je(re){let se=k.normalize(re),be=Wr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:ne,topLevel:ee,getLocator:(re,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:re,reference:se},getDependencyTreeRoots:()=>[...r.dependencyTreeRoots],getAllLocators(){let re=[];for(let[se,be]of f)for(let he of be.keys())se!==null&&he!==null&&re.push({name:se,reference:he});return re},getPackageInformation:re=>{let se=A(re);if(se===null)return null;let be=H.fromPortablePath(se.packageLocation);return te(N({},se),{packageLocation:be})},findPackageLocator:re=>Z(H.toPortablePath(re)),resolveToUnqualified:y("resolveToUnqualified",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=O(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveUnqualified:y("resolveUnqualified",(re,se)=>H.fromPortablePath(de(H.toPortablePath(re),se))),resolveRequest:y("resolveRequest",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=Be(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveVirtual:y("resolveVirtual",re=>{let se=je(H.toPortablePath(re));return se!==null?H.fromPortablePath(se):null})}}var O0t=(0,FAe.promisify)(RAe.readFile);var NAe=(r,e,t)=>{let i=Km(r),n=SL(i,{basePath:e}),s=H.join(e,kt.pnpCjs);return xL(n,{fakeFs:t,pnpapiResolution:s})};var PL=ge(TAe());var Ca={};ft(Ca,{checkAndReportManifestCompatibility:()=>MAe,checkManifestCompatibility:()=>OAe,extractBuildScripts:()=>rb,getExtractHint:()=>DL,hasBindingGyp:()=>RL});function OAe(r){return P.isPackageCompatible(r,Vg.getArchitectureSet())}function MAe(r,e,{configuration:t,report:i}){return OAe(r)?!0:(i==null||i.reportWarningOnce(X.INCOMPATIBLE_ARCHITECTURE,`${P.prettyLocator(t,r)} The ${Vg.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function rb(r,e,t,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([cs.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([cs.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:r.linkType!==Qt.HARD?(n==null||n.reportWarningOnce(X.SOFT_LINK_BUILD,`${P.prettyLocator(i,r)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):t&&t.built===!1?(n==null||n.reportInfoOnce(X.BUILD_DISABLED,`${P.prettyLocator(i,r)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!t.built?(n==null||n.reportWarningOnce(X.DISABLED_BUILD_SCRIPTS,`${P.prettyLocator(i,r)} lists build scripts, but all build scripts have been disabled.`),[]):MAe(r,"build",{configuration:i,report:n})?s:[]}var c8e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function DL(r){return r.packageFs.getExtractHint({relevantExtensions:c8e})}function RL(r){let e=k.join(r.prefixPath,"binding.gyp");return r.packageFs.existsSync(e)}var FL={};ft(FL,{getUnpluggedPath:()=>Hm});function Hm(r,{configuration:e}){return k.resolve(e.get("pnpUnpluggedFolder"),P.slugifyLocator(r))}var u8e=new Set([P.makeIdent(null,"nan").identHash,P.makeIdent(null,"node-gyp").identHash,P.makeIdent(null,"node-pre-gyp").identHash,P.makeIdent(null,"node-addon-api").identHash,P.makeIdent(null,"fsevents").identHash,P.makeIdent(null,"open").identHash,P.makeIdent(null,"opn").identHash]),xu=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let i=Tl(t.project).cjs;if(!K.existsSync(i))throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})),s={name:P.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return H.toPortablePath(o.packageLocation)}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=Tl(t.project).cjs;if(!K.existsSync(i))return null;let s=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})).findPackageLocator(H.fromPortablePath(e));return s?P.makeLocator(P.parseIdent(s.name),s.reference):null}makeInstaller(e){return new oh(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},oh=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new Se.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t,i){let n=P.stringifyIdent(e),s=e.reference,o=!!this.opts.project.tryWorkspaceByLocator(e),a=P.isVirtualLocator(e),l=e.peerDependencies.size>0&&!a,c=!l&&!o,u=!l&&e.linkType!==Qt.SOFT,g,f;if(c||u){let x=a?P.devirtualizeLocator(e):e;g=this.customData.store.get(x.locatorHash),typeof g=="undefined"&&(g=await g8e(t),e.linkType===Qt.HARD&&this.customData.store.set(x.locatorHash,g)),g.manifest.type==="module"&&(this.isESMLoaderRequired=!0),f=this.opts.project.getDependencyMeta(x,e.version)}let h=c?rb(e,g,f,{configuration:this.opts.project.configuration,report:this.opts.report}):[],p=u?await this.unplugPackageIfNeeded(e,g,t,f,i):t.packageFs;if(k.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);let m=k.resolve(p.getRealPath(),t.prefixPath),y=NL(this.opts.project.cwd,m),b=new Map,v=new Set;if(a){for(let x of e.peerDependencies.values())b.set(P.stringifyIdent(x),null),v.add(P.stringifyIdent(x));if(!o){let x=P.devirtualizeLocator(e);this.virtualTemplates.set(x.locatorHash,{location:NL(this.opts.project.cwd,Wr.resolveVirtual(m)),locator:x})}}return Se.getMapWithDefault(this.packageRegistry,n).set(s,{packageLocation:y,packageDependencies:b,packagePeers:v,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),{packageLocation:m,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,t){let i=this.getPackageInformation(e);for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){for(let i of t)this.getDiskInformation(i).packageDependencies.set(P.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=Tl(this.opts.project);if(K.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(X.UNNAMED,`Removing the old ${ae.pretty(this.opts.project.configuration,kt.pnpJs,ae.Type.PATH)} file. You might need to manually update existing references to reference the new ${ae.pretty(this.opts.project.configuration,kt.pnpCjs,ae.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ae.pretty(this.opts.project.configuration,"yarn sdks",ae.Type.CODE)}.`),await K.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await K.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await K.removePromise(e.cjs),await K.removePromise(this.opts.project.configuration.get("pnpDataPath")),await K.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())Se.getMapWithDefault(this.packageRegistry,P.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let t=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:P.stringifyIdent(u),reference:u.reference})),n=t!=="none",s=[],o=new Map,a=Se.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(t==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:P.stringifyIdent(u),reference:u.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let t=Tl(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(X.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await K.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=xAe(e);await K.changeFilePromise(t.cjs,o,{automaticNewlines:!0,mode:493}),await K.removePromise(i)}else{let o=k.relative(k.dirname(t.cjs),i),{dataFile:a,loaderFile:l}=kAe(te(N({},e),{dataLocation:o}));await K.changeFilePromise(t.cjs,l,{automaticNewlines:!0,mode:493}),await K.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(X.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await K.changeFilePromise(t.esmLoader,(0,PL.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await K.removePromise(s);else for(let o of await K.readdirPromise(s)){let a=k.resolve(s,o);this.unpluggedPaths.has(a)||await K.removePromise(a)}}async locateNodeModules(e){let t=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=k.join(n.cwd,"node_modules");if(i&&i.test(k.relative(this.opts.project.cwd,n.cwd))||!K.existsSync(s))continue;let o=await K.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)t.push(s);else for(let l of a)t.push(k.join(s,l.name))}return t}async unplugPackageIfNeeded(e,t,i,n,s){return this.shouldBeUnplugged(e,t,n)?this.unplugPackage(e,i,s):i.packageFs}shouldBeUnplugged(e,t,i){return typeof i.unplugged!="undefined"?i.unplugged:u8e.has(e.identHash)||e.conditions!=null?!0:t.manifest.preferUnplugged!==null?t.manifest.preferUnplugged:!!(rb(e,t,i,{configuration:this.opts.project.configuration}).length>0||t.misc.extractHint)}async unplugPackage(e,t,i){let n=Hm(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new Na(n,{baseFs:t.packageFs,pathUtils:k}):(this.unpluggedPaths.add(n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let s=k.join(n,t.prefixPath,".ready");await K.existsPromise(s)||(this.opts.project.storedBuildState.delete(e.locatorHash),await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,Me.dot,{baseFs:t.packageFs,overwrite:!1}),await K.writeFilePromise(s,""))})),new _t(n))}getPackageInformation(e){let t=P.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(t);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${P.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${P.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let t=Se.getMapWithDefault(this.packageRegistry,"@@disk"),i=NL(this.opts.project.cwd,e);return Se.getFactoryWithDefault(t,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1}))}};function NL(r,e){let t=k.relative(r,e);return t.match(/^\.{0,2}\//)||(t=`./${t}`),t.replace(/\/?$/,"/")}async function g8e(r){var i;let e=(i=await At.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?i:new At,t=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())t.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:DL(r),hasBindingGyp:RL(r)}}}var KAe=ge(is());var jm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new Pe("This command can only be used if the `nodeLinker` option is set to `pnp`");await t.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=P.parseDescriptor(f),p=h.range!=="unknown"?h:P.makeDescriptor(h,"*");if(!Wt.validRange(p.range))throw new Pe(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(e,p)})`);return m=>{let y=P.stringifyIdent(m);return!KAe.default.isMatch(y,P.stringifyIdent(p))||m.version&&!Wt.satisfiesWithPrereleases(m.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of t.storedPackages.values())!t.tryWorkspaceByLocator(h)&&!P.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],m=(y,b)=>{if(!h.has(y.locatorHash)&&(h.add(y.locatorHash),!t.tryWorkspaceByLocator(y)&&o.some(v=>v(y))&&p.push(y),!(b>0&&!this.recursive)))for(let v of y.dependencies.values()){let x=t.storedResolutions.get(v.descriptorHash);if(!x)throw new Error("Assertion failed: The resolution should have been registered");let T=t.storedPackages.get(x);if(!T)throw new Error("Assertion failed: The package should have been registered");m(T,b+1)}};for(let y of f){let b=t.storedPackages.get(y.anchoredLocator.locatorHash);if(!b)throw new Error("Assertion failed: The package should have been registered");m(b,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(t.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new Pe(`Patterns ${ae.prettyList(e,s,ae.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new Pe(`Pattern ${ae.prettyList(e,s,ae.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=Se.sortMap(c,f=>P.stringifyLocator(f)),(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let m=(h=p.version)!=null?h:"unknown",y=t.topLevelWorkspace.manifest.ensureDependencyMeta(P.makeDescriptor(p,m));y.unplugged=!0,f.reportInfo(X.UNNAMED,`Will unpack ${P.prettyLocator(e,p)} to ${ae.pretty(e,Hm(p,{configuration:e}),ae.Type.PATH)}`),f.reportJson({locator:P.stringifyLocator(p),version:m})}await t.topLevelWorkspace.persistManifest(),f.reportSeparator(),await t.install({cache:n,report:f})})).exitCode()}};jm.paths=[["unplug"]],jm.usage=Re.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var UAe=jm;var Tl=r=>({cjs:k.join(r.cwd,kt.pnpCjs),cjsLegacy:k.join(r.cwd,kt.pnpJs),esmLoader:k.join(r.cwd,".pnp.loader.mjs")}),GAe=r=>/\s/.test(r)?JSON.stringify(r):r;async function f8e(r,e,t){let i=Tl(r),n=`--require ${GAe(H.fromPortablePath(i.cjs))}`;if(K.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,jAe.pathToFileURL)(H.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&HAe.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(K.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function h8e(r,e){let t=Tl(r);e(t.cjs),e(t.esmLoader),e(r.configuration.get("pnpDataPath")),e(r.configuration.get("pnpUnpluggedFolder"))}var p8e={hooks:{populateYarnPaths:h8e,setupScriptEnvironment:f8e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:Ie.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:Ie.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:Ie.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:Ie.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:Ie.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:Ie.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:Ie.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:Ie.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:Ie.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[xu],commands:[UAe]},d8e=p8e;var _Ae=ge(zAe());var UL=ge(require("crypto")),VAe=ge(require("fs")),XAe=1,jr="node_modules",ib=".bin",ZAe=".yarn-state.yml",Ti;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Ti||(Ti={}));var HL=class{constructor(){this.installStateCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let i=t.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(n===null)throw new Pe("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(P.stringifyLocator(e));if(!s){let a=new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=t.project.configuration.startingCwd;return s.locations.find(a=>k.contains(o,a))||s.locations[0]}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=nb(k.resolve(e),{skipPrefix:t.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return P.parseLocator(a)}makeInstaller(e){return new $Ae(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},$Ae=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t){var u;let i=k.resolve(t.packageFs.getRealPath(),t.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await F8e(e,t),e.linkType===Qt.HARD&&this.customData.store.set(e.locatorHash,n)),!P.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(P.stringifyIdent(e))||s.set(P.stringifyIdent(e),e.reference);let a=e;if(P.isVirtualLocator(e)){a=P.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(P.stringifyIdent(g),null),o.add(P.stringifyIdent(g))}let l={packageLocation:`${H.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=t.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=t.checksum?t.checksum.substring(t.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,t){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),t=await jL(this.opts.project),i=this.opts.project.configuration.get("nmMode");(t===null||i!==t.nmMode)&&(this.opts.project.storedBuildState.clear(),t={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i,mtimeMs:0});let n=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=Se.validateEnum(Kn,(m=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?m:h)}catch(y){let b=P.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(X.INVALID_MANIFEST,`${b}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Kn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(m=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?m:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:P.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:P.makeLocator(P.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(H.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:P.stringifyIdent(p),reference:p.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:f=>H.fromPortablePath(Wr.resolveVirtual(H.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=Om(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=BL(a);await N8e(t,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=P.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(ele(f))continue;let p=P.parseLocator(f),m=this.localStore.get(p.locatorHash);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(m.pkg))continue;let y=Ca.extractBuildScripts(m.pkg,m.customPackageData,m.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});y.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:y})}return c&&this.opts.report.reportWarning(X.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${ae.pretty(this.opts.project.configuration,"--preserve-symlinks",ae.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function F8e(r,e){var n;let t=(n=await At.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new At,i=new Set(["preinstall","install","postinstall"]);for(let s of t.scripts.keys())i.has(s)||t.scripts.delete(s);return{manifest:{bin:t.bin,scripts:t.scripts},misc:{extractHint:Ca.getExtractHint(e),hasBindingGyp:Ca.hasBindingGyp(e)}}}async function L8e(r,e,t,i,{installChangedByUser:n}){let s="";s+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,s+=`# cause your node_modules installation to become invalidated. -`,s+=` -`,s+=`__metadata: -`,s+=` version: ${XAe} -`,s+=` nmMode: ${i.value} -`;let o=Array.from(e.keys()).sort(),a=P.stringifyLocator(r.topLevelWorkspace.anchoredLocator);for(let u of o){let g=e.get(u);s+=` -`,s+=`${JSON.stringify(u)}: -`,s+=` locations: -`;for(let f of g.locations){let h=k.contains(r.cwd,f);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` - ${JSON.stringify(h)} -`}if(g.aliases.length>0){s+=` aliases: -`;for(let f of g.aliases)s+=` - ${JSON.stringify(f)} -`}if(u===a&&t.size>0){s+=` bin: -`;for(let[f,h]of t){let p=k.contains(r.cwd,f);if(p===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` ${JSON.stringify(p)}: -`;for(let[m,y]of h){let b=k.relative(k.join(f,jr),y);s+=` ${JSON.stringify(m)}: ${JSON.stringify(b)} -`}}}}let l=r.cwd,c=k.join(l,jr,ZAe);n&&await K.removePromise(c),await K.changeFilePromise(c,s,{automaticNewlines:!0})}async function jL(r,{unrollAliases:e=!1}={}){let t=r.cwd,i=k.join(t,jr,ZAe),n;try{n=await K.statPromise(i)}catch(c){}if(!n)return null;let s=Si(await K.readFilePromise(i,"utf8"));if(s.__metadata.version>XAe)return null;let o=s.__metadata.nmMode||Ti.CLASSIC,a=new Map,l=new Map;delete s.__metadata;for(let[c,u]of Object.entries(s)){let g=u.locations.map(h=>k.join(t,h)),f=u.bin;if(f)for(let[h,p]of Object.entries(f)){let m=k.join(t,H.toPortablePath(h)),y=Se.getMapWithDefault(l,m);for(let[b,v]of Object.entries(p))y.set(Jr(b),H.toPortablePath([m,jr,v].join(k.sep)))}if(a.set(c,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:u.aliases||[]}),e&&u.aliases)for(let h of u.aliases){let{scope:p,name:m}=P.parseLocator(c),y=P.makeLocator(P.makeIdent(p,m),h),b=P.stringifyLocator(y);a.set(b,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:[]})}}return{locatorMap:a,binSymlinks:l,locationTree:tle(a,{skipPrefix:r.cwd}),nmMode:o,mtimeMs:n.mtimeMs}}var Ah=async(r,e)=>{if(r.split(k.sep).indexOf(jr)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${r}`);try{if(!e.innerLoop){let i=e.allowSymlink?await K.statPromise(r):await K.lstatPromise(r);if(e.allowSymlink&&!i.isDirectory()||!e.allowSymlink&&i.isSymbolicLink()){await K.unlinkPromise(r);return}}let t=await K.readdirPromise(r,{withFileTypes:!0});for(let i of t){let n=k.join(r,Jr(i.name));i.isDirectory()?(i.name!==jr||e&&e.innerLoop)&&await Ah(n,{innerLoop:!0,contentsOnly:!1}):await K.unlinkPromise(n)}e.contentsOnly||await K.rmdirPromise(r)}catch(t){if(t.code!=="ENOENT"&&t.code!=="ENOTEMPTY")throw t}},rle=4,nb=(r,{skipPrefix:e})=>{let t=k.contains(e,r);if(t===null)throw new Error(`Assertion failed: Writing attempt prevented to ${r} which is outside project root: ${e}`);let i=t.split(k.sep).filter(l=>l!==""),n=i.indexOf(jr),s=i.slice(0,n).join(k.sep),o=k.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},tle=(r,{skipPrefix:e})=>{let t=new Map;if(r===null)return t;let i=()=>({children:new Map,linkType:Qt.HARD});for(let[n,s]of r.entries()){if(s.linkType===Qt.SOFT&&k.contains(e,s.target)!==null){let a=Se.getFactoryWithDefault(t,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=nb(o,{skipPrefix:e}),c=Se.getFactoryWithDefault(t,a,i);for(let u=0;u{let t;try{process.platform==="win32"&&(t=await K.lstatPromise(r))}catch(i){}process.platform=="win32"&&(!t||t.isDirectory())?await K.symlinkPromise(r,e,"junction"):await K.symlinkPromise(k.relative(k.dirname(e),r),e)};async function ile(r,e,t){let i=k.join(r,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));try{await K.writeFilePromise(i,t);try{await K.linkPromise(i,e)}catch(n){}}finally{await K.unlinkPromise(i)}}async function T8e({srcPath:r,dstPath:e,srcMode:t,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Ti.HARDLINKS_GLOBAL&&i&&o){let l=k.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await Dn.checksumFile(l,{baseFs:K,algorithm:"sha1"})!==o){let g=k.join(i,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));await K.renamePromise(l,g);let f=await n.readFilePromise(r);await K.writeFilePromise(g,f);try{await K.linkPromise(g,l),await K.unlinkPromise(g)}catch(h){}}await K.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(r);await ile(i,l,u);try{await K.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Ti.HARDLINKS_LOCAL,await n.copyFilePromise(r,e))}}}else await n.copyFilePromise(r,e);let a=t&511;a!==420&&await K.chmodPromise(e,a)}var Ol;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(Ol||(Ol={}));var O8e=async(r,e,{baseFs:t,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await K.mkdirPromise(r,{recursive:!0});let o=async(l=Me.dot)=>{let c=k.join(e,l),u=await t.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=k.join(l,f.name),p,m=k.join(c,f.name);if(f.isFile()){if(p={kind:Ol.FILE,mode:(await t.lstatPromise(m)).mode},n.value===Ti.HARDLINKS_GLOBAL){let y=await Dn.checksumFile(m,{baseFs:t,algorithm:"sha1"});p.digest=y}}else if(f.isDirectory())p={kind:Ol.DIRECTORY};else if(f.isSymbolicLink())p={kind:Ol.SYMLINK,symlinkTo:await t.readlinkPromise(m)};else throw new Error(`Unsupported file type (file: ${m}, mode: 0o${await t.statSync(m).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==jr){let y=await o(h);for(let[b,v]of y)g.set(b,v)}}return g},a;if(n.value===Ti.HARDLINKS_GLOBAL&&i&&s){let l=k.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await K.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await ile(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=k.join(e,l),g=k.join(r,l);c.kind===Ol.DIRECTORY?await K.mkdirPromise(g,{recursive:!0}):c.kind===Ol.FILE?await T8e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:t,globalHardlinksStore:i}):c.kind===Ol.SYMLINK&&await GL(k.resolve(k.dirname(g),c.symlinkTo),g)}};function M8e(r,e,t,i){let n=new Map,s=new Map,o=new Map,a=!1,l=(c,u,g,f,h)=>{let p=!0,m=k.join(c,u),y=new Set;if(u===jr||u.startsWith("@")){let v;try{v=K.statSync(m)}catch(T){}p=!!v,v?v.mtimeMs>t?(a=!0,y=new Set(K.readdirSync(m))):y=new Set(g.children.get(u).children.keys()):a=!0;let x=e.get(c);if(x){let T=k.join(c,jr,ib),q;try{q=K.statSync(T)}catch(Y){}if(!q)a=!0;else if(q.mtimeMs>t){a=!0;let Y=new Set(K.readdirSync(T)),$=new Map;s.set(c,$);for(let[_,ne]of x)Y.has(_)&&$.set(_,ne)}else s.set(c,x)}}else p=h.has(u);let b=g.children.get(u);if(p){let{linkType:v,locator:x}=b,T={children:new Map,linkType:v,locator:x};if(f.children.set(u,T),x){let q=Se.getSetWithDefault(o,x);q.add(m),o.set(x,q)}for(let q of b.children.keys())l(m,q,b,T,y)}else b.locator&&i.storedBuildState.delete(P.parseLocator(b.locator).locatorHash)};for(let[c,u]of r){let{linkType:g,locator:f}=u,h={children:new Map,linkType:g,locator:f};if(n.set(c,h),f){let p=Se.getSetWithDefault(o,u.locator);p.add(c),o.set(u.locator,p)}u.children.has(jr)&&l(c,jr,u,h,new Set)}return{locationTree:n,binSymlinks:s,locatorLocations:o,installChangedByUser:a}}function ele(r){let e=P.parseDescriptor(r);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function K8e(r,e,t,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of r){let c=ele(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=k.join(l[0],f);f!==""&&K.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=k.contains(t,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let m=k.join(a,H.toPortablePath(p));u.set(Jr(h),m)}for(let[h,p]of c.children){let m=k.join(a,h),y=o(m,m,p);y.size>0&&s.set(a,new Map([...s.get(a)||new Map,...y]))}}else for(let[f,h]of c.children){let p=o(k.join(a,f),l,h);for(let[m,y]of p)u.set(m,y)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var nle=(r,e)=>{if(!r||!e)return r===e;let t=P.parseLocator(r);P.isVirtualLocator(t)&&(t=P.devirtualizeLocator(t));let i=P.parseLocator(e);return P.isVirtualLocator(i)&&(i=P.devirtualizeLocator(i)),P.areLocatorsEqual(t,i)};function YL(r){return k.join(r.get("globalFolder"),"store")}async function N8e(r,e,{baseFs:t,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=k.join(i.cwd,jr),{locationTree:l,binSymlinks:c,locatorLocations:u,installChangedByUser:g}=M8e(r.locationTree,r.binSymlinks,r.mtimeMs,i),f=tle(e,{skipPrefix:i.cwd}),h=[],p=async({srcDir:_,dstDir:ne,linkType:ee,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})=>{let Z=(async()=>{try{ee===Qt.SOFT?(await K.mkdirPromise(k.dirname(ne),{recursive:!0}),await GL(k.resolve(_),ne)):await O8e(ne,_,{baseFs:t,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})}catch(O){throw O.message=`While persisting ${_} -> ${ne} ${O.message}`,O}finally{T.tick()}})().then(()=>h.splice(h.indexOf(Z),1));h.push(Z),h.length>rle&&await Promise.race(h)},m=async(_,ne,ee)=>{let A=(async()=>{let oe=async(ce,Z,O)=>{try{O.innerLoop||await K.mkdirPromise(Z,{recursive:!0});let L=await K.readdirPromise(ce,{withFileTypes:!0});for(let de of L){if(!O.innerLoop&&de.name===ib)continue;let Be=k.join(ce,de.name),je=k.join(Z,de.name);de.isDirectory()?(de.name!==jr||O&&O.innerLoop)&&(await K.mkdirPromise(je,{recursive:!0}),await oe(Be,je,te(N({},O),{innerLoop:!0}))):$.value===Ti.HARDLINKS_LOCAL||$.value===Ti.HARDLINKS_GLOBAL?await K.linkPromise(Be,je):await K.copyFilePromise(Be,je,VAe.default.constants.COPYFILE_FICLONE)}}catch(L){throw O.innerLoop||(L.message=`While cloning ${ce} -> ${Z} ${L.message}`),L}finally{O.innerLoop||T.tick()}};await oe(_,ne,ee)})().then(()=>h.splice(h.indexOf(A),1));h.push(A),h.length>rle&&await Promise.race(h)},y=async(_,ne,ee)=>{if(ee)for(let[A,oe]of ne.children){let ce=ee.children.get(A);await y(k.join(_,A),oe,ce)}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!1});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:_===a,allowSymlink:A})}};for(let[_,ne]of l){let ee=f.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A),Z=k.join(_,A);await y(Z,oe,ce)}}let b=async(_,ne,ee)=>{if(ee){nle(ne.locator,ee.locator)||await Ah(_,{contentsOnly:ne.linkType===Qt.HARD});for(let[A,oe]of ne.children){let ce=ee.children.get(A);await b(k.join(_,A),oe,ce)}}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!0});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:ne.linkType===Qt.HARD,allowSymlink:A})}};for(let[_,ne]of f){let ee=l.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A);await b(k.join(_,A),oe,ce)}}let v=new Map,x=[];for(let[_,ne]of u)for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=f.get(A),Z=A;if(ce){for(let O of oe)if(Z=k.join(Z,O),ce=ce.children.get(O),!ce)break;if(ce){let O=nle(ce.locator,_),L=e.get(ce.locator),de=L.target,Be=Z,je=L.linkType;if(O)v.has(de)||v.set(de,Be);else if(de!==Be){let re=P.parseLocator(ce.locator);P.isVirtualLocator(re)&&(re=P.devirtualizeLocator(re)),x.push({srcDir:de,dstDir:Be,linkType:je,realLocatorHash:re.locatorHash})}}}}for(let[_,{locations:ne}]of e.entries())for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=l.get(A),Z=f.get(A),O=A,L=e.get(_),de=P.parseLocator(_);P.isVirtualLocator(de)&&(de=P.devirtualizeLocator(de));let Be=de.locatorHash,je=L.target,re=ee;if(je===re)continue;let se=L.linkType;for(let be of oe)Z=Z.children.get(be);if(!ce)x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});else for(let be of oe)if(O=k.join(O,be),ce=ce.children.get(be),!ce){x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});break}}let T=Ji.progressViaCounter(x.length),q=n.reportProgress(T),Y=i.configuration.get("nmMode"),$={value:Y};try{let _=$.value===Ti.HARDLINKS_GLOBAL?`${YL(i.configuration)}/v1`:null;if(_&&!await K.existsPromise(_)){await K.mkdirpPromise(_);for(let ee=0;ee<256;ee++)await K.mkdirPromise(k.join(_,ee.toString(16).padStart(2,"0")))}for(let ee of x)(ee.linkType===Qt.SOFT||!v.has(ee.srcDir))&&(v.set(ee.srcDir,ee.dstDir),await p(te(N({},ee),{globalHardlinksStore:_,nmMode:$,packageChecksum:o.get(ee.realLocatorHash)||null})));await Promise.all(h),h.length=0;for(let ee of x){let A=v.get(ee.srcDir);ee.linkType!==Qt.SOFT&&ee.dstDir!==A&&await m(A,ee.dstDir,{nmMode:$})}await Promise.all(h),await K.mkdirPromise(a,{recursive:!0});let ne=await K8e(e,f,i.cwd,{loadManifest:s});await U8e(c,ne,i.cwd),await L8e(i,e,ne,$,{installChangedByUser:g}),Y==Ti.HARDLINKS_GLOBAL&&$.value==Ti.HARDLINKS_LOCAL&&n.reportWarningOnce(X.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{q.stop()}}async function U8e(r,e,t){for(let i of r.keys()){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=k.join(i,jr,ib);await K.removePromise(n)}}for(let[i,n]of e){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=k.join(i,jr,ib),o=r.get(i)||new Map;await K.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await K.removePromise(k.join(s,a)),process.platform==="win32"&&await K.removePromise(k.join(s,Jr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=k.join(s,a);c!==l&&(process.platform==="win32"?await(0,_Ae.default)(H.fromPortablePath(l),H.fromPortablePath(u),{createPwshFile:!1}):(await K.removePromise(u),await GL(l,u),k.contains(t,await K.realpathPromise(l))!==null&&await K.chmodPromise(l,493)))}}}var qL=class extends xu{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new sle(e)}},sle=class extends oh{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let t=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),i=NAe(e,this.opts.project.cwd,t),{tree:n,errors:s}=Om(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=P.parseLocator(g.locator),h=P.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=k.join(this.opts.project.cwd,kt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=k.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=k.join(g,h),m=n.get(p);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in m)a(`${u}/${h}`,m);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var H8e={hooks:{cleanGlobalArtifacts:async r=>{let e=YL(r);await K.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:Ie.STRING,values:[Kn.WORKSPACES,Kn.DEPENDENCIES,Kn.NONE],default:Kn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:Ie.STRING,values:[Ti.CLASSIC,Ti.HARDLINKS_LOCAL,Ti.HARDLINKS_GLOBAL],default:Ti.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:Ie.BOOLEAN,default:!0}},linkers:[HL,qL]},j8e=H8e;var qT={};ft(qT,{default:()=>V9e,npmConfigUtils:()=>br,npmHttpUtils:()=>zt,npmPublishUtils:()=>wh});var cle=ge(ri());var Cr="npm:";var zt={};ft(zt,{AuthType:()=>us,customPackageError:()=>q8e,del:()=>z8e,get:()=>bo,getIdentUrl:()=>Kl,handleInvalidAuthenticationError:()=>Ml,post:()=>J8e,put:()=>W8e});var Ale=ge(WC()),lle=ge(require("url"));var br={};ft(br,{RegistryType:()=>QA,getAuditRegistry:()=>G8e,getAuthConfiguration:()=>zL,getDefaultRegistry:()=>sb,getPublishRegistry:()=>ole,getRegistryConfiguration:()=>ale,getScopeConfiguration:()=>WL,getScopeRegistry:()=>SA,normalizeRegistry:()=>ma});var QA;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(QA||(QA={}));function ma(r){return r.replace(/\/$/,"")}function G8e(r,{configuration:e}){let t=e.get(QA.AUDIT_REGISTRY);return t!==null?ma(t):ole(r,{configuration:e})}function ole(r,{configuration:e}){var t;return((t=r.publishConfig)==null?void 0:t.registry)?ma(r.publishConfig.registry):r.name?SA(r.name.scope,{configuration:e,type:QA.PUBLISH_REGISTRY}):sb({configuration:e,type:QA.PUBLISH_REGISTRY})}function SA(r,{configuration:e,type:t=QA.FETCH_REGISTRY}){let i=WL(r,{configuration:e});if(i===null)return sb({configuration:e,type:t});let n=i.get(t);return n===null?sb({configuration:e,type:t}):ma(n)}function sb({configuration:r,type:e=QA.FETCH_REGISTRY}){let t=r.get(e);return ma(t!==null?t:r.get(QA.FETCH_REGISTRY))}function ale(r,{configuration:e}){let t=e.get("npmRegistries"),i=ma(r),n=t.get(i);if(typeof n!="undefined")return n;let s=t.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function WL(r,{configuration:e}){if(r===null)return null;let i=e.get("npmScopes").get(r);return i||null}function zL(r,{configuration:e,ident:t}){let i=t&&WL(t.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:ale(r,{configuration:e})||e}var us;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(us||(us={}));async function Ml(r,{attemptedAs:e,registry:t,headers:i,configuration:n}){var s,o;if(ob(r))throw new ct(X.AUTHENTICATION_INVALID,"Invalid OTP token");if(((s=r.originalError)==null?void 0:s.name)==="HTTPError"&&((o=r.originalError)==null?void 0:o.response.statusCode)===401)throw new ct(X.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await Y8e(t,i,{configuration:n})}`:`attempted as ${e}`})`)}function q8e(r){var e;return((e=r.response)==null?void 0:e.statusCode)===404?"Package not found":null}function Kl(r){return r.scope?`/@${r.scope}%2f${r.name}`:`/${r.name}`}async function bo(r,a){var l=a,{configuration:e,headers:t,ident:i,authType:n,registry:s}=l,o=Or(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=SA(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await ab(s,{authType:n,configuration:e,ident:i});c&&(t=te(N({},t),{authorization:c}));try{return await ir.get(r.charAt(0)==="/"?`${s}${r}`:r,N({configuration:e,headers:t},o))}catch(u){throw await Ml(u,{registry:s,configuration:e,headers:t}),u}}async function J8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.post(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h)||l)throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.post(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function W8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.put(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h))throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.put(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function z8e(r,c){var u=c,{attemptedAs:e,configuration:t,headers:i,ident:n,authType:s=3,registry:o,otp:a}=u,l=Or(u,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(n&&typeof o=="undefined"&&(o=SA(n.scope,{configuration:t})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let g=await ab(o,{authType:s,configuration:t,ident:n});g&&(i=te(N({},i),{authorization:g})),a&&(i=N(N({},i),lh(a)));try{return await ir.del(o+r,N({configuration:t,headers:i},l))}catch(f){if(!ob(f)||a)throw await Ml(f,{attemptedAs:e,registry:o,configuration:t,headers:i}),f;a=await _L();let h=N(N({},i),lh(a));try{return await ir.del(`${o}${r}`,N({configuration:t,headers:h},l))}catch(p){throw await Ml(p,{attemptedAs:e,registry:o,configuration:t,headers:i}),p}}}async function ab(r,{authType:e=2,configuration:t,ident:i}){let n=zL(r,{configuration:t,ident:i}),s=_8e(n,e);if(!s)return null;let o=await t.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,r,{configuration:t,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new ct(X.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function _8e(r,e){switch(e){case 2:return r.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function Y8e(r,e,{configuration:t}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await ir.get(new lle.URL(`${r}/-/whoami`).href,{configuration:t,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function _L(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:r}=await(0,Ale.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return r}function ob(r){var e,t;if(((e=r.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((t=r.originalError)==null?void 0:t.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function lh(r){return{["npm-otp"]:r}}var VL=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!cle.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let{params:i}=P.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await bo(i.__archiveUrl,{configuration:t.project.configuration,ident:e});return await Bi.convertToZip(n,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var XL=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!P.tryParseDescriptor(e.range.slice(Cr.length),!0))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){let i=P.parseDescriptor(e.range.slice(Cr.length),!0);return t.resolver.getResolutionDependencies(i,t)}async getCandidates(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return await i.resolver.getCandidates(n,t,i)}async getSatisfying(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return i.resolver.getSatisfying(n,t,i)}resolve(e,t){throw new Error("Unreachable")}};var ule=ge(ri()),gle=ge(require("url"));var Qo=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let i=new gle.URL(e.reference);return!(!ule.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i;try{i=await bo(Qo.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch(n){i=await bo(Qo.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:t.project.configuration,ident:e})}return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:i}){let n=SA(e.scope,{configuration:i}),s=Qo.getLocatorUrl(e);return t=t.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t=t.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t===n+s||t===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let t=Wt.clean(e.reference.slice(Cr.length));if(t===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${Kl(e)}/-/${e.name}-${t}.tgz`}};var fle=ge(ri());var Ab=P.makeIdent(null,"node-gyp"),V8e=/\b(node-gyp|prebuild-install)\b/,ZL=class{supportsDescriptor(e,t){return e.range.startsWith(Cr)?!!Wt.validRange(e.range.slice(Cr.length)):!1}supportsLocator(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i}=P.parseRange(e.reference);return!!fle.default.valid(i)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);let s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=Se.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new Wt.SemVer(c);if(n.test(u))return u}catch{}return Se.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=P.makeLocator(e,`${Cr}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Qo.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:P.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);return Se.mapAndFilter(t,s=>{try{let{selector:o}=P.parseRange(s,{requireProtocol:Cr}),a=new Wt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return Se.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>P.makeLocator(e,s))}async resolve(e,t){let{selector:i}=P.parseRange(e.reference),n=Wt.clean(i);if(n===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await bo(Kl(e),{configuration:t.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new At;if(o.load(s.versions[n]),!o.dependencies.has(Ab.identHash)&&!o.peerDependencies.has(Ab.identHash)){for(let a of o.scripts.values())if(a.match(V8e)){o.dependencies.set(Ab.identHash,P.makeDescriptor(Ab,"latest")),t.report.reportWarningOnce(X.NODE_GYP_INJECTED,`${P.prettyLocator(t.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof o.raw.deprecated=="string"&&o.raw.deprecated!==""){let a=P.prettyLocator(t.project.configuration,e),l=o.raw.deprecated.match(/\S/)?`${a} is deprecated: ${o.raw.deprecated}`:`${a} is deprecated`;t.report.reportWarningOnce(X.DEPRECATED_PACKAGE,l)}return te(N({},e),{version:n,languageName:"node",linkType:Qt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var $L=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!zg.test(e.range.slice(Cr.length)))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(Cr.length),s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=P.makeLocator(e,`${Cr}${a}`),c=s.versions[a].dist.tarball;return Qo.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[P.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Unreachable")}};var wh={};ft(wh,{getGitHead:()=>z9e,makePublishBody:()=>W9e});var HT={};ft(HT,{default:()=>k9e,packUtils:()=>PA});var PA={};ft(PA,{genPackList:()=>Pb,genPackStream:()=>UT,genPackageManifest:()=>Hce,hasPackScripts:()=>MT,prepareForPack:()=>KT});var OT=ge(is()),Kce=ge(Mce()),Uce=ge(require("zlib")),m9e=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],E9e=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function MT(r){return!!(Zt.hasWorkspaceScript(r,"prepack")||Zt.hasWorkspaceScript(r,"postpack"))}async function KT(r,{report:e},t){await Zt.maybeExecuteWorkspaceLifecycleScript(r,"prepack",{report:e});try{let i=k.join(r.cwd,At.fileName);await K.existsPromise(i)&&await r.manifest.loadFile(i,{baseFs:K}),await t()}finally{await Zt.maybeExecuteWorkspaceLifecycleScript(r,"postpack",{report:e})}}async function UT(r,e){var s,o;typeof e=="undefined"&&(e=await Pb(r));let t=new Set;for(let a of(o=(s=r.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)t.add(k.normalize(a));for(let a of r.manifest.bin.values())t.add(k.normalize(a));let i=Kce.default.pack();process.nextTick(async()=>{for(let a of e){let l=k.normalize(a),c=k.resolve(r.cwd,l),u=k.join("package",l),g=await K.lstatPromise(c),f={name:u,mtime:new Date(Rr.SAFE_TIME*1e3)},h=t.has(l)?493:420,p,m,y=new Promise((v,x)=>{p=v,m=x}),b=v=>{v?m(v):p()};if(g.isFile()){let v;l==="package.json"?v=Buffer.from(JSON.stringify(await Hce(r),null,2)):v=await K.readFilePromise(c),i.entry(te(N({},f),{mode:h,type:"file"}),v,b)}else g.isSymbolicLink()?i.entry(te(N({},f),{mode:h,type:"symlink",linkname:await K.readlinkPromise(c)}),b):b(new Error(`Unsupported file type ${g.mode} for ${H.fromPortablePath(l)}`));await y}i.finalize()});let n=(0,Uce.createGzip)();return i.pipe(n),n}async function Hce(r){let e=JSON.parse(JSON.stringify(r.manifest.raw));return await r.project.configuration.triggerHook(t=>t.beforeWorkspacePacking,r,e),e}async function Pb(r){var g,f,h,p,m,y,b,v;let e=r.project,t=e.configuration,i={accept:[],reject:[]};for(let x of E9e)i.reject.push(x);for(let x of m9e)i.accept.push(x);i.reject.push(t.get("rcFilename"));let n=x=>{if(x===null||!x.startsWith(`${r.cwd}/`))return;let T=k.relative(r.cwd,x),q=k.resolve(Me.root,T);i.reject.push(q)};n(k.resolve(e.cwd,t.get("lockfileFilename"))),n(t.get("cacheFolder")),n(t.get("globalFolder")),n(t.get("installStatePath")),n(t.get("virtualFolder")),n(t.get("yarnPath")),await t.triggerHook(x=>x.populateYarnPaths,e,x=>{n(x)});for(let x of e.workspaces){let T=k.relative(r.cwd,x.cwd);T!==""&&!T.match(/^(\.\.)?\//)&&i.reject.push(`/${T}`)}let s={accept:[],reject:[]},o=(f=(g=r.manifest.publishConfig)==null?void 0:g.main)!=null?f:r.manifest.main,a=(p=(h=r.manifest.publishConfig)==null?void 0:h.module)!=null?p:r.manifest.module,l=(y=(m=r.manifest.publishConfig)==null?void 0:m.browser)!=null?y:r.manifest.browser,c=(v=(b=r.manifest.publishConfig)==null?void 0:b.bin)!=null?v:r.manifest.bin;o!=null&&s.accept.push(k.resolve(Me.root,o)),a!=null&&s.accept.push(k.resolve(Me.root,a)),typeof l=="string"&&s.accept.push(k.resolve(Me.root,l));for(let x of c.values())s.accept.push(k.resolve(Me.root,x));if(l instanceof Map)for(let[x,T]of l.entries())s.accept.push(k.resolve(Me.root,x)),typeof T=="string"&&s.accept.push(k.resolve(Me.root,T));let u=r.manifest.files!==null;if(u){s.reject.push("/*");for(let x of r.manifest.files)jce(s.accept,x,{cwd:Me.root})}return await I9e(r.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function I9e(r,{hasExplicitFileList:e,globalList:t,ignoreList:i}){let n=[],s=new La(r),o=[[Me.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!Yce(a,{globalList:t,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Me.root)for(let m of u)g=g||m===".gitignore",f=f||m===".npmignore";let h=f?await Gce(s,a,".npmignore"):g?await Gce(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;Yce(a,{globalList:t,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let m of u)o.push([k.resolve(a,m),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(k.relative(Me.root,a))}return n.sort()}async function Gce(r,e,t){let i={accept:[],reject:[]},n=await r.readFilePromise(k.join(e,t),"utf8");for(let s of n.split(/\n/g))jce(i.reject,s,{cwd:e});return i}function y9e(r,{cwd:e}){let t=r[0]==="!";return t&&(r=r.slice(1)),r.match(/\.{0,1}\//)&&(r=k.resolve(e,r)),t&&(r=`!${r}`),r}function jce(r,e,{cwd:t}){let i=e.trim();i===""||i[0]==="#"||r.push(y9e(i,{cwd:t}))}var gs;(function(i){i[i.None=0]="None",i[i.Match=1]="Match",i[i.NegatedMatch=2]="NegatedMatch"})(gs||(gs={}));function Yce(r,{globalList:e,ignoreLists:t}){let i=Db(r,e.accept);if(i!==0)return i===2;let n=Db(r,e.reject);if(n!==0)return n===1;if(t!==null)for(let s of t){let o=Db(r,s.accept);if(o!==0)return o===2;let a=Db(r,s.reject);if(a!==0)return a===1}return!1}function Db(r,e){let t=e,i=[];for(let n=0;n{await KT(i,{report:l},async()=>{l.reportJson({base:H.fromPortablePath(i.cwd)});let c=await Pb(i);for(let u of c)l.reportInfo(null,H.fromPortablePath(u)),l.reportJson({location:H.fromPortablePath(u)});if(!this.dryRun){let u=await UT(i,c),g=K.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo(X.UNNAMED,`Package archive generated in ${ae.pretty(e,s,ae.Type.PATH)}`),l.reportJson({output:H.fromPortablePath(s)}))})).exitCode()}};rE.paths=[["pack"]],rE.usage=Re.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var Jce=rE;function w9e(r,{workspace:e}){let t=r.replace("%s",B9e(e)).replace("%v",b9e(e));return H.toPortablePath(t)}function B9e(r){return r.manifest.name!==null?P.slugifyIdent(r.manifest.name):"package"}function b9e(r){return r.manifest.version!==null?r.manifest.version:"unknown"}var Q9e=["dependencies","devDependencies","peerDependencies"],S9e="workspace:",v9e=(r,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let t=r.project;for(let s of Q9e)for(let o of r.manifest.getForScope(s).values()){let a=t.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===S9e)if(a===null){if(t.tryWorkspaceByIdent(o)===null)throw new ct(X.WORKSPACE_NOT_FOUND,`${P.prettyDescriptor(t.configuration,o)}: No local workspace found for this range`)}else{let c;P.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector;let u=s==="dependencies"?P.makeDescriptor(o,"unknown"):null,g=u!==null&&r.manifest.ensureDependencyMeta(u).optional?"optionalDependencies":s;e[g][P.stringifyIdent(o)]=c}}},x9e={hooks:{beforeWorkspacePacking:v9e},commands:[Jce]},k9e=x9e;var tue=ge(require("crypto")),rue=ge(eue()),iue=ge(require("url"));async function W9e(r,e,{access:t,tag:i,registry:n,gitHead:s}){let o=r.project.configuration,a=r.manifest.name,l=r.manifest.version,c=P.stringifyIdent(a),u=(0,tue.createHash)("sha1").update(e).digest("hex"),g=rue.default.fromData(e).toString();typeof t=="undefined"&&(r.manifest.publishConfig&&typeof r.manifest.publishConfig.access=="string"?t=r.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?t=o.get("npmPublishAccess"):a.scope?t="restricted":t="public");let f=await PA.genPackageManifest(r),h=`${c}-${l}.tgz`,p=new iue.URL(`${ma(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:t,["dist-tags"]:{[i]:l},versions:{[l]:te(N({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function z9e(r){try{let{stdout:e}=await Nr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:r});return e.trim()===""?void 0:e.trim()}catch{return}}var JT={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:Ie.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:Ie.SECRET,default:null}},nue={npmAuditRegistry:{description:"Registry to query for audit reports",type:Ie.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:Ie.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.STRING,default:"https://registry.yarnpkg.com"}},_9e={configuration:te(N(N({},JT),nue),{npmScopes:{description:"Settings per package scope",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:N(N({},JT),nue)}},npmRegistries:{description:"Settings per registry",type:Ie.MAP,normalizeKeys:ma,valueDefinition:{description:"",type:Ie.SHAPE,properties:N({},JT)}}}),fetchers:[VL,Qo],resolvers:[XL,ZL,$L]},V9e=_9e;var VT={};ft(VT,{default:()=>s_e});ys();var Ba;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ba||(Ba={}));var vo;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(vo||(vo={}));var Rb=[vo.Info,vo.Low,vo.Moderate,vo.High,vo.Critical];function sue(r,e){let t=[],i=new Set,n=o=>{i.has(o)||(i.add(o),t.push(o))};for(let o of e)n(o);let s=new Set;for(;t.length>0;){let o=t.shift(),a=r.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=r.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function X9e(r,e){return new Set([...r].filter(t=>!e.has(t)))}function Z9e(r,e,{all:t}){let i=t?r.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=sue(r,l),g=sue(r,c);return X9e(g,u)}function oue(r){let e={};for(let t of r)e[P.stringifyIdent(t)]=P.parseRange(t.range).selector;return e}function aue(r){if(typeof r=="undefined")return new Set;let e=Rb.indexOf(r),t=Rb.slice(e);return new Set(t)}function $9e(r,e){let t=aue(e),i={};for(let n of t)i[n]=r[n];return i}function Aue(r,e){var i;let t=$9e(r,e);for(let n of Object.keys(t))if((i=t[n])!=null?i:0>0)return!0;return!1}function lue(r,e){var s;let t={},i={children:t},n=Object.values(r.advisories);if(e!=null){let o=aue(e);n=n.filter(a=>o.has(a.severity))}for(let o of Se.sortMap(n,a=>a.module_name))t[o.module_name]={label:o.module_name,value:ae.tuple(ae.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:ae.tuple(ae.Type.NO_HINT,o.title)},URL:{label:"URL",value:ae.tuple(ae.Type.URL,o.url)},Severity:{label:"Severity",value:ae.tuple(ae.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ae.tuple(ae.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ae.tuple(ae.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:ae.tuple(ae.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ae.tuple(ae.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function cue(r,e,{all:t,environment:i}){let n=t?r.workspaces:[e],s=[Ba.All,Ba.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ba.All,Ba.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return oue([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function uue(r,e,{all:t}){var s;let i=Z9e(r,e,{all:t}),n={};for(let o of r.storedPackages.values())n[P.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:oue(o.dependencies.values()),dev:i.has(P.convertLocatorToDescriptor(o).descriptorHash)};return n}var sE=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=J.String("--environment",Ba.All,{description:"Which environments to cover",validator:nn(Ba)});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=J.String("--severity",vo.Info,{description:"Minimal severity requested for packages to be displayed",validator:nn(vo)})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=cue(t,i,{all:this.all,environment:this.environment}),s=uue(t,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=br.getAuditRegistry(i.manifest,{configuration:e}),l,c=await pA.start({configuration:e,stdout:this.context.stdout},async()=>{l=await zt.post("/-/npm/v1/security/audits/quick",o,{authType:zt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=Aue(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(ls.emitTree(lue(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo(X.EXCEPTION,"No audit suggestions")})).exitCode()}};sE.paths=[["npm","audit"]],sE.usage=Re.Usage({description:"perform a vulnerability audit against the installed packages",details:` - This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). - - For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${Rb.map(e=>`\`${e}\``).join(", ")}. - - If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. - - To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. - `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var gue=sE;var WT=ge(ri()),zT=ge(require("util")),oE=class extends Le{constructor(){super(...arguments);this.fields=J.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let x=t.topLevelWorkspace;if(!x.manifest.name)throw new Pe(`Missing ${ae.pretty(e,"name",ae.Type.CODE)} field in ${H.fromPortablePath(k.join(x.cwd,kt.manifest))}`);c=P.makeDescriptor(x.manifest.name,"unknown")}else c=P.parseDescriptor(l);let u=zt.getIdentUrl(c),g=_T(await zt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:zt.customPackageError})),f=Object.keys(g.versions).sort(WT.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],m=Wt.validRange(c.range);if(m){let x=WT.default.maxSatisfying(f,m);x!==null?p=x:(a.reportWarning(X.UNNAMED,`Unmet range ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else Object.prototype.hasOwnProperty.call(g["dist-tags"],c.range)?p=g["dist-tags"][c.range]:c.range!=="unknown"&&(a.reportWarning(X.UNNAMED,`Unknown tag ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let y=g.versions[p],b=te(N(N({},g),y),{version:p,versions:f}),v;if(i!==null){v={};for(let x of i){let T=b[x];if(typeof T!="undefined")v[x]=T;else{a.reportWarning(X.EXCEPTION,`The ${ae.pretty(e,x,ae.Type.CODE)} field doesn't exist inside ${P.prettyIdent(e,c)}'s information`),s=!0;continue}}}else this.json||(delete b.dist,delete b.readme,delete b.users),v=b;a.reportJson(v),this.json||n.push(v)}});zT.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,zT.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} -`);return o.exitCode()}};oE.paths=[["npm","info"]],oE.usage=Re.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var fue=oE;function _T(r){if(Array.isArray(r)){let e=[];for(let t of r)t=_T(t),t&&e.push(t);return e}else if(typeof r=="object"&&r!==null){let e={};for(let t of Object.keys(r)){if(t.startsWith("_"))continue;let i=_T(r[t]);i&&(e[t]=i)}return e}else return r||null}var hue=ge(WC()),aE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await t_e({registry:t,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await zt.put(o,s,{attemptedAs:s.name,configuration:e,registry:t,jsonResponse:!0,authType:zt.AuthType.NO_AUTH});return await e_e(t,a.token,{configuration:e,scope:this.scope}),n.reportInfo(X.UNNAMED,"Successfully logged in")})).exitCode()}};aE.paths=[["npm","login"]],aE.usage=Re.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var pue=aE;async function Fb({scope:r,publish:e,configuration:t,cwd:i}){return r&&e?br.getScopeRegistry(r,{configuration:t,type:br.RegistryType.PUBLISH_REGISTRY}):r?br.getScopeRegistry(r,{configuration:t}):e?br.getPublishRegistry((await Wf(t,i)).manifest,{configuration:t}):br.getDefaultRegistry({configuration:t})}async function e_e(r,e,{configuration:t,scope:i}){let n=o=>a=>{let l=Se.isIndexableObject(a)?a:{},c=l[o],u=Se.isIndexableObject(c)?c:{};return te(N({},l),{[o]:te(N({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(r)};return await ye.updateHomeConfiguration(s)}async function t_e({registry:r,report:e,stdin:t,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(X.UNNAMED,`Logging in to ${r}`);let n=!1;r.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(X.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,hue.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var Bh=new Set(["npmAuthIdent","npmAuthToken"]),AE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=J.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=async()=>{var l;let n=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await ye.find(this.context.cwd,this.context.plugins),o=P.makeIdent((l=this.scope)!=null?l:null,"pkg");return!br.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await r_e(),n.reportInfo(X.UNNAMED,"Successfully logged out from everything")),this.scope){await due("npmScopes",this.scope),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(X.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish});await due("npmRegistries",s),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(X.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};AE.paths=[["npm","logout"]],AE.usage=Re.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Cue=AE;function i_e(r,e){let t=r[e];if(!Se.isIndexableObject(t))return!1;let i=new Set(Object.keys(t));if([...Bh].every(s=>!i.has(s)))return!1;for(let s of Bh)i.delete(s);if(i.size===0)return r[e]=void 0,!0;let n=N({},t);for(let s of Bh)delete n[s];return r[e]=n,!0}async function r_e(){let r=e=>{let t=!1,i=Se.isIndexableObject(e)?N({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,t=!0);for(let n of Object.keys(i))i_e(i,n)&&(t=!0);if(Object.keys(i).length!==0)return t?i:e};return await ye.updateHomeConfiguration({npmRegistries:r,npmScopes:r})}async function due(r,e){return await ye.updateHomeConfiguration({[r]:t=>{let i=Se.isIndexableObject(t)?t:{};if(!Object.prototype.hasOwnProperty.call(i,e))return t;let n=i[e],s=Se.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...Bh].every(l=>!o.has(l)))return t;for(let l of Bh)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:te(N({},i),{[e]:void 0});let a={};for(let l of Bh)a[l]=void 0;return te(N({},i),{[e]:N(N({},s),a)})}})}var lE=class extends Le{constructor(){super(...arguments);this.access=J.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=J.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=J.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=J.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);if(i.manifest.private)throw new Pe("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new Pe("Workspaces must have valid names and versions to be published on an external registry");await t.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=br.getPublishRegistry(i.manifest,{configuration:e});return(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await zt.get(zt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(X.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Zt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await PA.prepareForPack(i,{report:l},async()=>{let g=await PA.genPackList(i);for(let y of g)l.reportInfo(null,y);let f=await PA.genPackStream(i,g),h=await Se.bufferStream(f),p=await wh.getGitHead(i.cwd),m=await wh.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await zt.put(zt.getIdentUrl(n),m,{configuration:e,registry:o,ident:n,otp:this.otp,jsonResponse:!0})}),l.reportInfo(X.UNNAMED,"Package archive published")})).exitCode()}};lE.paths=[["npm","publish"]],lE.usage=Re.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var mue=lE;var Iue=ge(ri());var cE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=P.parseIdent(this.package);else{if(!i)throw new ht(t.cwd,this.context.cwd);if(!i.manifest.name)throw new Pe(`Missing 'name' field in ${H.fromPortablePath(k.join(i.cwd,kt.manifest))}`);n=i.manifest.name}let s=await uE(n,e),a={children:Se.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:ae.tuple(ae.Type.RESOLUTION,{descriptor:P.makeDescriptor(n,l),locator:P.makeLocator(n,c)})}))};return ls.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};cE.paths=[["npm","tag","list"]],cE.usage=Re.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Eue=cE;async function uE(r,e){let t=`/-/package${zt.getIdentUrl(r)}/dist-tags`;return zt.get(t,{configuration:e,ident:r,jsonResponse:!0,customErrorMessage:zt.customPackageError})}var gE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseDescriptor(this.package,!0),s=n.range;if(!Iue.default.valid(s))throw new Pe(`The range ${ae.pretty(e,n.range,ae.Type.RANGE)} must be a valid semver version`);let o=br.getPublishRegistry(i.manifest,{configuration:e}),a=ae.pretty(e,n,ae.Type.IDENT),l=ae.pretty(e,s,ae.Type.RANGE),c=ae.pretty(e,this.tag,ae.Type.CODE);return(await Je.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await uE(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning(X.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(X.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};gE.paths=[["npm","tag","add"]],gE.usage=Re.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. - `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var yue=gE;var fE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){if(this.tag==="latest")throw new Pe("The 'latest' tag cannot be removed.");let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseIdent(this.package),s=br.getPublishRegistry(i.manifest,{configuration:e}),o=ae.pretty(e,this.tag,ae.Type.CODE),a=ae.pretty(e,n,ae.Type.IDENT),l=await uE(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new Pe(`${o} is not a tag of package ${a}`);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(X.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};fE.paths=[["npm","tag","remove"]],fE.usage=Re.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var wue=fE;var hE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t;return this.scope&&this.publish?t=br.getScopeRegistry(this.scope,{configuration:e,type:br.RegistryType.PUBLISH_REGISTRY}):this.scope?t=br.getScopeRegistry(this.scope,{configuration:e}):this.publish?t=br.getPublishRegistry((await Wf(e,this.context.cwd)).manifest,{configuration:e}):t=br.getDefaultRegistry({configuration:e}),(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await zt.get("/-/whoami",{configuration:e,registry:t,authType:zt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?P.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(X.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(X.UNNAMED,s.username)})).exitCode()}};hE.paths=[["npm","whoami"]],hE.usage=Re.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var Bue=hE;var n_e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:Ie.STRING,default:null}},commands:[gue,fue,pue,Cue,mue,yue,Eue,wue,Bue]},s_e=n_e;var nO={};ft(nO,{default:()=>y_e,patchUtils:()=>XT});var XT={};ft(XT,{applyPatchFile:()=>Tb,diffFolders:()=>tO,extractPackageToDisk:()=>eO,extractPatchFlags:()=>Due,isParentRequired:()=>$T,loadPatchFiles:()=>mE,makeDescriptor:()=>m_e,makeLocator:()=>ZT,parseDescriptor:()=>dE,parseLocator:()=>CE,parsePatchFile:()=>Lb});var pE=class extends Error{constructor(e,t){super(`Cannot apply hunk #${e+1}`);this.hunk=t}};var o_e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function bh(r){return k.relative(Me.root,k.resolve(Me.root,H.toPortablePath(r)))}function a_e(r){let e=r.trim().match(o_e);if(!e)throw new Error(`Bad header line: '${r}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var A_e=420,l_e=493,Zr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Zr||(Zr={}));var bue=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),c_e=r=>({header:a_e(r),parts:[]}),u_e={["@"]:"header",["-"]:Zr.Deletion,["+"]:Zr.Insertion,[" "]:Zr.Context,["\\"]:"pragma",undefined:Zr.Context};function f_e(r){let e=[],t=bue(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),t.hunks.push(n),n=null)}function a(){o(),e.push(t),t=bue()}for(let l=0;l0?"patch":"mode change",v=null;switch(b){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:bh(u),toPath:bh(g)}),v=g}break;case"file deletion":{let x=n||p;if(!x)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(l),hash:f})}break;case"file creation":{let x=s||m;if(!x)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(c),hash:h})}break;case"patch":case"mode change":v=m||s;break;default:Se.assertNever(b);break}v&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:bh(v),oldMode:Nb(o),newMode:Nb(a)}),v&&y&&y.length&&e.push({type:"patch",semverExclusivity:i,path:bh(v),hunks:y,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function Nb(r){let e=parseInt(r,8)&511;if(e!==A_e&&e!==l_e)throw new Error(`Unexpected file mode string: ${r}`);return e}function Lb(r){let e=r.split(/\n/g);return e[e.length-1]===""&&e.pop(),h_e(f_e(e))}function g_e(r){let e=0,t=0;for(let{type:i,lines:n}of r.parts)switch(i){case Zr.Context:t+=n.length,e+=n.length;break;case Zr.Deletion:e+=n.length;break;case Zr.Insertion:t+=n.length;break;default:Se.assertNever(i);break}if(e!==r.header.original.length||t!==r.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(r.header.original.length)} ${i(r.header.patched.length)} @@, got @@ ${i(e)} ${i(t)} @@)`)}}async function Qh(r,e,t){let i=await r.lstatPromise(e),n=await t();if(typeof n!="undefined"&&(e=n),r.lutimesPromise)await r.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await r.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function Tb(r,{baseFs:e=new ar,dryRun:t=!1,version:i=null}={}){for(let n of r)if(!(n.semverExclusivity!==null&&i!==null&&!Wt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(t){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await Qh(e,k.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(t){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await Qh(e,k.dirname(n.fromPath),async()=>{await Qh(e,k.dirname(n.toPath),async()=>{await Qh(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(t){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` -`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(k.dirname(n.path),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,Rr.SAFE_TIME,Rr.SAFE_TIME)}break;case"patch":await Qh(e,n.path,async()=>{await p_e(n,{baseFs:e,dryRun:t})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(Que(n.newMode)!==Que(o))continue;await Qh(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:Se.assertNever(n);break}}function Que(r){return(r&64)>0}function Sue(r){return r.replace(/\s+$/,"")}function d_e(r,e){return Sue(r)===Sue(e)}async function p_e({hunks:r,path:e},{baseFs:t,dryRun:i=!1}){let n=await t.statSync(e).mode,o=(await t.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of r){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),m=Math.max(h,p),y=0,b=0,v=null;for(;y<=m;){if(y<=h&&(b=f-y,v=vue(g,o,b),v!==null)){y=-y;break}if(y<=p&&(b=f+y,v=vue(g,o,b),v!==null))break;y+=1}if(v===null)throw new pE(r.indexOf(g),g);a.push(v),l+=y,c=b+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:Se.assertNever(f);break}await t.writeFilePromise(e,o.join(` -`),{mode:n})}function vue(r,e,t){let i=[];for(let n of r.parts)switch(n.type){case Zr.Context:case Zr.Deletion:{for(let s of n.lines){let o=e[t];if(o==null||!d_e(o,s))return null;t+=1}n.type===Zr.Deletion&&(i.push({type:"splice",index:t-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Zr.Insertion:i.push({type:"splice",index:t,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:Se.assertNever(n.type);break}return i}var C_e=/^builtin<([^>]+)>$/;function xue(r,e){let{source:t,selector:i,params:n}=P.parseRange(r);if(t===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>H.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?P.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(t);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function dE(r){let i=xue(r.range,P.parseDescriptor),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceDescriptor:e})}function CE(r){let i=xue(r.reference,P.parseLocator),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceLocator:e})}function kue({parentLocator:r,sourceItem:e,patchPaths:t,sourceVersion:i,patchHash:n},s){let o=r!==null?{locator:P.stringifyLocator(r)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return P.makeRange({protocol:"patch:",source:s(e),selector:t.join("&"),params:N(N(N({},a),l),o)})}function m_e(r,{parentLocator:e,sourceDescriptor:t,patchPaths:i}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,patchPaths:i},P.stringifyDescriptor))}function ZT(r,{parentLocator:e,sourcePackage:t,patchPaths:i,patchHash:n}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,sourceVersion:t.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function Pue({onAbsolute:r,onRelative:e,onBuiltin:t},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(C_e);return s!==null?t(s[1]):k.isAbsolute(i)?r(i):e(i)}function Due(r){let e=r.startsWith("~");return e&&(r=r.slice(1)),{optional:e}}function $T(r){return Pue({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},r)}async function mE(r,e,t){let i=r!==null?await t.fetcher.fetch(r,t):null,n=i&&i.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await Se.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Due(o),l=await Pue({onAbsolute:async()=>await K.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(k.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await t.project.configuration.firstHook(u=>u.getBuiltinPatch,t.project,c)},o);return te(N({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` -`));return s}async function eO(r,{cache:e,project:t}){let i=t.storedPackages.get(r.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=t.storedChecksums,s=new di,o=t.configuration.makeFetcher(),a=await o.fetch(r,{cache:e,project:t,fetcher:o,checksums:n,report:s}),l=await K.mktempPromise(),c=k.join(l,"source"),u=k.join(l,"user"),g=k.join(l,".yarn-patch.json");return await Promise.all([K.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),K.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),K.writeJsonPromise(g,{locator:P.stringifyLocator(r),version:i.version})]),K.detachTemp(l),u}async function tO(r,e){let t=H.fromPortablePath(r).replace(/\\/g,"/"),i=H.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await Nr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",t,i],{cwd:H.toPortablePath(process.cwd()),env:te(N({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${s}`);let o=t.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${Se.escapeRegExp(`/${o(t)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${Se.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(Se.escapeRegExp(`${t}/`),"g"),"").replace(new RegExp(Se.escapeRegExp(`${i}/`),"g"),"")}function Rue(r,{configuration:e,report:t}){for(let i of r.parts)for(let n of i.lines)switch(i.type){case Zr.Context:t.reportInfo(null,` ${ae.pretty(e,n,"grey")}`);break;case Zr.Deletion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`- ${ae.pretty(e,n,ae.Type.REMOVED)}`);break;case Zr.Insertion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`+ ${ae.pretty(e,n,ae.Type.ADDED)}`);break;default:Se.assertNever(i.type)}}var rO=class{supports(e,t){return!!e.reference.startsWith("patch:")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async patchPackage(e,t){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=CE(e),a=await mE(i,o,t),l=await K.mktempPromise(),c=k.join(l,"current.zip"),u=await t.fetcher.fetch(n,t),g=P.getIdentVendorPath(e),f=await fn(),h=new li(c,{libzip:f,create:!0,level:t.project.configuration.get("compressionLevel")});await Se.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:m}of a){if(p===null)continue;let y=new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")}),b=new _t(k.resolve(Me.root,g),{baseFs:y});try{await Tb(Lb(p),{baseFs:b,version:s})}catch(v){if(!(v instanceof pE))throw v;let x=t.project.configuration.get("enableInlineHunks"),T=!x&&!m?" (set enableInlineHunks for details)":"",q=`${P.prettyLocator(t.project.configuration,e)}: ${v.message}${T}`,Y=$=>{!x||Rue(v.hunk,{configuration:t.project.configuration,report:$})};if(y.discardAndClose(),m){t.report.reportWarningOnce(X.PATCH_HUNK_FAILED,q,{reportExtra:Y});continue}else throw new ct(X.PATCH_HUNK_FAILED,q,Y)}y.saveAndClose()}return new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")})}};var E_e=3,iO=class{supportsDescriptor(e,t){return!!e.range.startsWith("patch:")}supportsLocator(e,t){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){let{patchPaths:n}=dE(e);return n.every(s=>!$T(s))?e:P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){let{sourceDescriptor:i}=dE(e);return[i]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=dE(e),a=await mE(n,o,i.fetchOptions),l=t.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=Dn.makeHash(`${E_e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[ZT(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){let{sourceLocator:i}=CE(e),n=await t.resolver.resolve(i,t);return N(N({},n),e)}};var EE=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=k.resolve(this.context.cwd,H.toPortablePath(this.patchFolder)),s=k.join(n,"../source"),o=k.join(n,"../.yarn-patch.json");if(!K.existsSync(s))throw new Pe("The argument folder didn't get created by 'yarn patch'");let a=await tO(s,n),l=await K.readJsonPromise(o),c=P.parseLocator(l.locator,!0);if(!t.storedPackages.has(c.locatorHash))throw new Pe("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=k.join(u,`${P.slugifyLocator(c)}.patch`);await K.mkdirPromise(u,{recursive:!0}),await K.writeFilePromise(g,a);let f=k.relative(t.cwd,g);t.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:P.stringifyIdent(c),description:l.version}},reference:`patch:${P.stringifyLocator(c)}#${f}`}),await t.persist()}};EE.paths=[["patch-commit"]],EE.usage=Re.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var Fue=EE;var IE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=P.parseLocator(this.package);if(s.reference==="unknown"){let o=Se.mapAndFilter([...t.storedPackages.values()],a=>a.identHash!==s.identHash?Se.mapAndFilter.skip:P.isVirtualLocator(a)?Se.mapAndFilter.skip:a);if(o.length===0)throw new Pe("No package found in the project for the given locator");if(o.length>1)throw new Pe(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${o.map(a=>` -- ${P.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!t.storedPackages.has(s.locatorHash))throw new Pe("No package found in the project for the given locator");await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await eO(s,{cache:n,project:t});o.reportJson({locator:P.stringifyLocator(s),path:H.fromPortablePath(a)}),o.reportInfo(X.UNNAMED,`Package ${P.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(X.UNNAMED,`You can now edit the following folder: ${ae.pretty(e,H.fromPortablePath(a),"magenta")}`),o.reportInfo(X.UNNAMED,`Once you are done run ${ae.pretty(e,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${H.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};IE.paths=[["patch"]],IE.usage=Re.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n \n Once you're done with your changes, run `yarn patch-commit -s ` (with `` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n "});var Nue=IE;var I_e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:Ie.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[Fue,Nue],fetchers:[rO],resolvers:[iO]},y_e=I_e;var AO={};ft(AO,{default:()=>b_e});var sO=class{supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=n.pathByLocator.get(e.locatorHash);if(typeof s=="undefined")throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return s}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=k.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new Lue(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},Lue=class{constructor(e){this.opts=e;this.asyncActions=new Se.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return oO()}attachCustomData(e){}async installPackage(e,t,i){switch(e.linkType){case Qt.SOFT:return this.installPackageSoft(e,t,i);case Qt.HARD:return this.installPackageHard(e,t,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,t,i){let n=k.resolve(t.packageFs.getRealPath(),t.prefixPath);return this.customData.pathByLocator.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,t,i){var u;let n=w_e(e,{project:this.opts.project});this.customData.locatorByPath.set(n,P.stringifyLocator(e)),this.customData.pathByLocator.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,t.prefixPath,{baseFs:t.packageFs,overwrite:!1})}));let o=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e,a={manifest:(u=await At.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?u:new At,misc:{hasBindingGyp:Ca.hasBindingGyp(t)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Ca.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,t){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!Mue(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.customData.pathByLocator.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(e)})`);let s=k.join(n,kt.nodeModules),o=[],a=await Kue(s);for(let[l,c]of t){let u=c;Mue(c,{project:this.opts.project})||(this.opts.report.reportWarning(X.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=P.devirtualizeLocator(c));let g=this.customData.pathByLocator.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(c)})`);let f=P.stringifyIdent(l),h=k.join(s,f),p=k.relative(k.dirname(h),g),m=a.get(f);a.delete(f),o.push(Promise.resolve().then(async()=>{if(m){if(m.isSymbolicLink()&&await K.readlinkPromise(h)===p)return;await K.removePromise(h)}await K.mkdirpPromise(k.dirname(h)),process.platform=="win32"?await K.symlinkPromise(g,h,"junction"):await K.symlinkPromise(p,h)}))}o.push(Uue(s,a)),await Promise.all(o)}))}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=Oue(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await K.removePromise(e);else{let t=[],i=new Set;for(let s of this.customData.pathByLocator.values()){let o=k.contains(e,s);if(o!==null){let[a,,...l]=o.split(k.sep);i.add(a);let c=k.join(e,a);t.push(K.readdirPromise(c).then(u=>Promise.all(u.map(async g=>{let f=k.join(c,g);if(g===kt.nodeModules){let h=await Kue(f);return h.delete(l.join(k.sep)),Uue(f,h)}else return K.removePromise(f)}))).catch(u=>{if(u.code!=="ENOENT")throw u}))}}let n;try{n=await K.readdirPromise(e)}catch{n=[]}for(let s of n)i.has(s)||t.push(K.removePromise(k.join(e,s)));await Promise.all(t)}return await this.asyncActions.wait(),await aO(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await aO(Tue(this.opts.project)),{customData:this.customData}}};function oO(){return JSON.stringify({name:"PnpmInstaller",version:2})}function Tue(r){return k.join(r.cwd,kt.nodeModules)}function Oue(r){return k.join(Tue(r),".store")}function w_e(r,{project:e}){let t=P.slugifyLocator(r),i=P.getIdentVendorPath(r);return k.join(Oue(e),t,i)}function Mue(r,{project:e}){return!P.isVirtualLocator(r)||!e.tryWorkspaceByLocator(r)}async function Kue(r){let e=new Map,t=[];try{t=await K.readdirPromise(r,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of t)if(!i.name.startsWith("."))if(i.name.startsWith("@")){let n=await K.readdirPromise(k.join(r,i.name),{withFileTypes:!0});if(n.length===0)e.set(i.name,i);else for(let s of n)e.set(`${i.name}/${s.name}`,s)}else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}async function Uue(r,e){var n;let t=[],i=new Set;for(let s of e.keys()){t.push(K.removePromise(k.join(r,s)));let o=(n=P.tryParseIdent(s))==null?void 0:n.scope;o&&i.add(`@${o}`)}return Promise.all(t).then(()=>Promise.all([...i].map(s=>aO(k.join(r,s)))))}async function aO(r){try{await K.rmdirPromise(r)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var B_e={linkers:[sO]},b_e=B_e;var L0=()=>({modules:new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",cZ(Cp)],["semver",Q_e],["typanion",cg],["yup",S_e],["@yarnpkg/plugin-essentials",GN],["@yarnpkg/plugin-compat",zN],["@yarnpkg/plugin-dlx",_N],["@yarnpkg/plugin-file",nL],["@yarnpkg/plugin-git",jN],["@yarnpkg/plugin-github",oL],["@yarnpkg/plugin-http",lL],["@yarnpkg/plugin-init",fL],["@yarnpkg/plugin-link",mL],["@yarnpkg/plugin-nm",JL],["@yarnpkg/plugin-npm",qT],["@yarnpkg/plugin-npm-cli",VT],["@yarnpkg/plugin-pack",HT],["@yarnpkg/plugin-patch",nO],["@yarnpkg/plugin-pnp",LL],["@yarnpkg/plugin-pnpm",AO]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});s0({binaryVersion:Ur||"",pluginConfiguration:L0()});})(); -/*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - */ -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ From de55ffd9448f7942e9ed27a7cd417a67561abb67 Mon Sep 17 00:00:00 2001 From: benedettadavico Date: Thu, 26 Jan 2023 12:49:43 +0100 Subject: [PATCH 247/591] pretty --- .../circulating-supply.test.ts | 12 +- .../contract-cache-epochs.test.ts | 39 +++--- .../gateway/contract-cache-gateway.test.ts | 31 +++-- .../mixnode/contract-cache-mixnode.test.ts | 114 +++++++++--------- nym-api/tests/package.json | 2 +- nym-api/tests/src/config/configHandler.ts | 2 +- .../tests/src/endpoints/CirculatingSupply.ts | 6 +- nym-api/tests/src/endpoints/ContractCache.ts | 6 +- nym-api/tests/src/endpoints/Status.ts | 11 +- .../tests/src/types/CirculatingSupplyTypes.ts | 44 +++---- nym-api/tests/src/types/ContractCacheTypes.ts | 53 ++++---- nym-api/tests/src/types/StatusInterfaces.ts | 22 ++-- 12 files changed, 159 insertions(+), 183 deletions(-) diff --git a/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts b/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts index 1b60887e3a..e2961d380d 100644 --- a/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts +++ b/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts @@ -3,7 +3,6 @@ import ContractCache from "../../src/endpoints/CirculatingSupply"; let contract: ContractCache; let config: ConfigHandler; - describe("Get circulating supply", (): void => { beforeAll(async (): Promise => { contract = new ContractCache(); @@ -13,13 +12,12 @@ describe("Get circulating supply", (): void => { it("Get circulating supply amounts", async (): Promise => { const response = await contract.getCirculatingSupply(); - let initial: number = +(response.initial_supply.amount); - let mixmining: number = +(response.mixmining_reserve.amount); - let vest: number = +(response.vesting_tokens.amount); - let circsupply: number = +(response.circulating_supply.amount); + let initial: number = +response.initial_supply.amount; + let mixmining: number = +response.mixmining_reserve.amount; + let vest: number = +response.vesting_tokens.amount; + let circsupply: number = +response.circulating_supply.amount; - expect(typeof response.vesting_tokens.amount).toBe('string'); + expect(typeof response.vesting_tokens.amount).toBe("string"); expect(initial - mixmining - vest).toStrictEqual(circsupply); - }); }); \ No newline at end of file diff --git a/nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts b/nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts index 11239d01be..482817f669 100644 --- a/nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts +++ b/nym-api/tests/functional_test/contract_cache/contract-cache-epochs.test.ts @@ -4,7 +4,6 @@ import ConfigHandler from "../../src/config/configHandler"; let contract: ContractCache; let config: ConfigHandler; - describe("Get epoch info", (): void => { beforeAll(async (): Promise => { contract = new ContractCache(); @@ -13,28 +12,26 @@ describe("Get epoch info", (): void => { it("Get epoch reward params", async (): Promise => { const response = await contract.getEpochRewardParams(); - expect(typeof response.interval.reward_pool).toBe('string'); - expect(typeof response.interval.staking_supply_scale_factor).toBe('string'); - expect(typeof response.interval.staking_supply).toBe('string'); - expect(typeof response.interval.epoch_reward_budget).toBe('string'); - expect(typeof response.interval.stake_saturation_point).toBe('string'); - expect(typeof response.interval.sybil_resistance).toBe('string'); - expect(typeof response.interval.active_set_work_factor).toBe('string'); - expect(typeof response.interval.interval_pool_emission).toBe('string'); - expect(typeof response.active_set_size).toBe('number'); - expect(typeof response.rewarded_set_size).toBe('number'); + expect(typeof response.interval.reward_pool).toBe("string"); + expect(typeof response.interval.staking_supply_scale_factor).toBe("string"); + expect(typeof response.interval.staking_supply).toBe("string"); + expect(typeof response.interval.epoch_reward_budget).toBe("string"); + expect(typeof response.interval.stake_saturation_point).toBe("string"); + expect(typeof response.interval.sybil_resistance).toBe("string"); + expect(typeof response.interval.active_set_work_factor).toBe("string"); + expect(typeof response.interval.interval_pool_emission).toBe("string"); + expect(typeof response.active_set_size).toBe("number"); + expect(typeof response.rewarded_set_size).toBe("number"); }); it("Get current epoch", async (): Promise => { const response = await contract.getCurrentEpoch(); - expect(typeof response.id).toBe('number'); - expect(typeof response.epochs_in_interval).toBe('number'); - expect(typeof response.current_epoch_id).toBe('number'); - expect(typeof response.current_epoch_start).toBe('string'); - expect(typeof response.epoch_length.secs).toBe('number'); - expect(typeof response.epoch_length.nanos).toBe('number'); - expect(typeof response.total_elapsed_epochs).toBe('number'); + expect(typeof response.id).toBe("number"); + expect(typeof response.epochs_in_interval).toBe("number"); + expect(typeof response.current_epoch_id).toBe("number"); + expect(typeof response.current_epoch_start).toBe("string"); + expect(typeof response.epoch_length.secs).toBe("number"); + expect(typeof response.epoch_length.nanos).toBe("number"); + expect(typeof response.total_elapsed_epochs).toBe("number"); }); - - -}); \ No newline at end of file +}); diff --git a/nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts b/nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts index 6f1546f2d2..465b6a9a12 100644 --- a/nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts +++ b/nym-api/tests/functional_test/contract_cache/gateway/contract-cache-gateway.test.ts @@ -4,7 +4,6 @@ import ConfigHandler from "../../../src/config/configHandler"; let contract: ContractCache; let config: ConfigHandler; - describe("Get gateway data", (): void => { beforeAll(async (): Promise => { contract = new ContractCache(); @@ -15,36 +14,34 @@ describe("Get gateway data", (): void => { const response = await contract.getGateways(); response.forEach((gateway) => { //overview - expect(typeof gateway.owner).toBe('string'); - expect(typeof gateway.block_height).toBe('number'); + expect(typeof gateway.owner).toBe("string"); + expect(typeof gateway.block_height).toBe("number"); if (gateway.proxy === null) { return true; - } - else { - expect(typeof gateway.proxy).toBe('string'); + } else { + expect(typeof gateway.proxy).toBe("string"); } //pledge_amount - expect(typeof gateway.pledge_amount.denom).toBe('string'); - expect(typeof gateway.pledge_amount.amount).toBe('string'); + expect(typeof gateway.pledge_amount.denom).toBe("string"); + expect(typeof gateway.pledge_amount.amount).toBe("string"); //gateway - expect(typeof gateway.gateway.host).toBe('string'); - expect(typeof gateway.gateway.mix_port).toBe('number'); - expect(typeof gateway.gateway.clients_port).toBe('number'); - expect(typeof gateway.gateway.location).toBe('string'); - expect(typeof gateway.gateway.sphinx_key).toBe('string'); - expect(typeof gateway.gateway.identity_key).toBe('string'); - expect(typeof gateway.gateway.version).toBe('string'); + expect(typeof gateway.gateway.host).toBe("string"); + expect(typeof gateway.gateway.mix_port).toBe("number"); + expect(typeof gateway.gateway.clients_port).toBe("number"); + expect(typeof gateway.gateway.location).toBe("string"); + expect(typeof gateway.gateway.sphinx_key).toBe("string"); + expect(typeof gateway.gateway.identity_key).toBe("string"); + expect(typeof gateway.gateway.version).toBe("string"); }); }); it("Get blacklisted gateways", async (): Promise => { const response = await contract.getBlacklistedGateways(); response.forEach(function (value) { - expect(typeof value).toBe('string'); + expect(typeof value).toBe("string"); }); }); - }); diff --git a/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts index 1cfa93cbac..e3637a3fe7 100644 --- a/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts +++ b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts @@ -4,7 +4,6 @@ import ConfigHandler from "../../../src/config/configHandler"; let contract: ContractCache; let config: ConfigHandler; - describe("Get mixnode data", (): void => { beforeAll(async (): Promise => { contract = new ContractCache(); @@ -16,39 +15,38 @@ describe("Get mixnode data", (): void => { response.forEach((mixnode) => { //bond information overview - expect(typeof mixnode.bond_information.mix_id).toBe('number'); - expect(typeof mixnode.bond_information.owner).toBe('string'); - expect(typeof mixnode.bond_information.original_pledge.amount).toBe('string'); - expect(typeof mixnode.bond_information.original_pledge.denom).toBe('string'); - expect(typeof mixnode.bond_information.layer).toBe('number'); - expect(typeof mixnode.bond_information.bonding_height).toBe('number'); - expect(typeof mixnode.bond_information.is_unbonding).toBe('boolean'); + expect(typeof mixnode.bond_information.mix_id).toBe("number"); + expect(typeof mixnode.bond_information.owner).toBe("string"); + expect(typeof mixnode.bond_information.original_pledge.amount).toBe("string"); + expect(typeof mixnode.bond_information.original_pledge.denom).toBe("string"); + expect(typeof mixnode.bond_information.layer).toBe("number"); + expect(typeof mixnode.bond_information.bonding_height).toBe("number"); + expect(typeof mixnode.bond_information.is_unbonding).toBe("boolean"); if (mixnode.bond_information.proxy === null) { return true; - } - else { - expect(typeof mixnode.bond_information.proxy).toBe('string'); + } else { + expect(typeof mixnode.bond_information.proxy).toBe("string"); } //mixnode - expect(typeof mixnode.bond_information.mix_node.host).toBe('string') + expect(typeof mixnode.bond_information.mix_node.host).toBe("string"); expect(mixnode.bond_information.mix_node.http_api_port).toStrictEqual(8000); - expect(typeof mixnode.bond_information.mix_node.verloc_port).toBe('number') - expect(typeof mixnode.bond_information.mix_node.mix_port).toBe('number') + expect(typeof mixnode.bond_information.mix_node.verloc_port).toBe("number"); + expect(typeof mixnode.bond_information.mix_node.mix_port).toBe("number"); expect(mixnode.bond_information.mix_node.mix_port).toStrictEqual(1789); - expect(mixnode.bond_information.mix_node.verloc_port).toStrictEqual(1790) + expect(mixnode.bond_information.mix_node.verloc_port).toStrictEqual(1790); - let identitykey = mixnode.bond_information.mix_node.identity_key - if (typeof identitykey === 'string') { + const identitykey = mixnode.bond_information.mix_node.identity_key; + if (typeof identitykey === "string") { if (identitykey.length === 43) { return true } else expect(identitykey).toHaveLength(44); } - let sphinx = mixnode.bond_information.mix_node.sphinx_key - if (typeof sphinx === 'string') { + const sphinx = mixnode.bond_information.mix_node.sphinx_key + if (typeof sphinx === "string") { if (sphinx.length === 43) { return true } @@ -56,15 +54,15 @@ describe("Get mixnode data", (): void => { } //rewarding details - expect(typeof mixnode.rewarding_details.cost_params.profit_margin_percent).toBe('string') - expect(typeof mixnode.rewarding_details.cost_params.interval_operating_cost.denom).toBe('string') - expect(typeof mixnode.rewarding_details.cost_params.interval_operating_cost.amount).toBe('string') - expect(typeof mixnode.rewarding_details.operator).toBe('string') - expect(typeof mixnode.rewarding_details.delegates).toBe('string') - expect(typeof mixnode.rewarding_details.total_unit_reward).toBe('string') - expect(typeof mixnode.rewarding_details.unit_delegation).toBe('string') - expect(typeof mixnode.rewarding_details.last_rewarded_epoch).toBe('number') - expect(typeof mixnode.rewarding_details.unique_delegations).toBe('number') + expect(typeof mixnode.rewarding_details.cost_params.profit_margin_percent).toBe("string"); + expect(typeof mixnode.rewarding_details.cost_params.interval_operating_cost.denom).toBe("string"); + expect(typeof mixnode.rewarding_details.cost_params.interval_operating_cost.amount).toBe("string"); + expect(typeof mixnode.rewarding_details.operator).toBe("string"); + expect(typeof mixnode.rewarding_details.delegates).toBe("string"); + expect(typeof mixnode.rewarding_details.total_unit_reward).toBe("string"); + expect(typeof mixnode.rewarding_details.unit_delegation).toBe("string"); + expect(typeof mixnode.rewarding_details.last_rewarded_epoch).toBe("number"); + expect(typeof mixnode.rewarding_details.unique_delegations).toBe("number"); }); }); @@ -73,39 +71,39 @@ describe("Get mixnode data", (): void => { const response = await contract.getMixnodesDetailed(); response.forEach((mixnode) => { // overview details - expect(typeof mixnode.estimated_delegators_apy).toBe('string'); - expect(typeof mixnode.estimated_operator_apy).toBe('string'); - expect(typeof mixnode.performance).toBe('string'); - expect(typeof mixnode.uncapped_stake_saturation).toBe('string'); - expect(typeof mixnode.stake_saturation).toBe('string'); - expect(typeof mixnode.family).toBe('string'); + expect(typeof mixnode.estimated_delegators_apy).toBe("string"); + expect(typeof mixnode.estimated_operator_apy).toBe("string"); + expect(typeof mixnode.performance).toBe("string"); + expect(typeof mixnode.uncapped_stake_saturation).toBe("string"); + expect(typeof mixnode.stake_saturation).toBe("string"); + expect(typeof mixnode.family).toBe("string"); //mixnode details bond info - expect(typeof mixnode.mixnode_details.bond_information.mix_id).toBe('number') - expect(typeof mixnode.mixnode_details.bond_information.owner).toBe('string'); - expect(typeof mixnode.mixnode_details.bond_information.original_pledge.amount).toBe('string'); - expect(typeof mixnode.mixnode_details.bond_information.original_pledge.denom).toBe('string'); - expect(typeof mixnode.mixnode_details.bond_information.layer).toBe('number'); - expect(typeof mixnode.mixnode_details.bond_information.bonding_height).toBe('number'); - expect(typeof mixnode.mixnode_details.bond_information.is_unbonding).toBe('boolean'); + expect(typeof mixnode.mixnode_details.bond_information.mix_id).toBe("number") + expect(typeof mixnode.mixnode_details.bond_information.owner).toBe("string"); + expect(typeof mixnode.mixnode_details.bond_information.original_pledge.amount).toBe("string"); + expect(typeof mixnode.mixnode_details.bond_information.original_pledge.denom).toBe("string"); + expect(typeof mixnode.mixnode_details.bond_information.layer).toBe("number"); + expect(typeof mixnode.mixnode_details.bond_information.bonding_height).toBe("number"); + expect(typeof mixnode.mixnode_details.bond_information.is_unbonding).toBe("boolean"); if (mixnode.mixnode_details.bond_information.proxy === null) { return true; } else { - expect(typeof mixnode.mixnode_details.bond_information.proxy).toBe('string'); + expect(typeof mixnode.mixnode_details.bond_information.proxy).toBe("string"); } //mixnode - expect(typeof mixnode.mixnode_details.bond_information.mix_node.host).toBe('string') + expect(typeof mixnode.mixnode_details.bond_information.mix_node.host).toBe("string") expect(mixnode.mixnode_details.bond_information.mix_node.http_api_port).toStrictEqual(8000); - expect(typeof mixnode.mixnode_details.bond_information.mix_node.verloc_port).toBe('number') - expect(typeof mixnode.mixnode_details.bond_information.mix_node.mix_port).toBe('number') + expect(typeof mixnode.mixnode_details.bond_information.mix_node.verloc_port).toBe("number") + expect(typeof mixnode.mixnode_details.bond_information.mix_node.mix_port).toBe("number") expect(mixnode.mixnode_details.bond_information.mix_node.mix_port).toStrictEqual(1789); expect(mixnode.mixnode_details.bond_information.mix_node.verloc_port).toStrictEqual(1790) let identitykey2 = mixnode.mixnode_details.bond_information.mix_node.identity_key - if (typeof identitykey2 === 'string') { + if (typeof identitykey2 === "string") { if (identitykey2.length === 43) { return true } @@ -113,7 +111,7 @@ describe("Get mixnode data", (): void => { } let sphinx2 = mixnode.mixnode_details.bond_information.mix_node.sphinx_key - if (typeof sphinx2 === 'string') { + if (typeof sphinx2 === "string") { if (sphinx2.length === 43) { return true } @@ -121,15 +119,15 @@ describe("Get mixnode data", (): void => { } //mixnode rewarding info - expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBe('string') - expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.denom).toBe('string') - expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.amount).toBe('string') - expect(typeof mixnode.mixnode_details.rewarding_details.operator).toBe('string') - expect(typeof mixnode.mixnode_details.rewarding_details.delegates).toBe('string') - expect(typeof mixnode.mixnode_details.rewarding_details.total_unit_reward).toBe('string') - expect(typeof mixnode.mixnode_details.rewarding_details.unit_delegation).toBe('string') - expect(typeof mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBe('number') - expect(typeof mixnode.mixnode_details.rewarding_details.unique_delegations).toBe('number') + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBe("string") + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.denom).toBe("string") + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.amount).toBe("string") + expect(typeof mixnode.mixnode_details.rewarding_details.operator).toBe("string") + expect(typeof mixnode.mixnode_details.rewarding_details.delegates).toBe("string") + expect(typeof mixnode.mixnode_details.rewarding_details.total_unit_reward).toBe("string") + expect(typeof mixnode.mixnode_details.rewarding_details.unit_delegation).toBe("string") + expect(typeof mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBe("number") + expect(typeof mixnode.mixnode_details.rewarding_details.unique_delegations).toBe("number") }); }); @@ -138,7 +136,7 @@ describe("Get mixnode data", (): void => { const response = await contract.getActiveMixnodes(); response.forEach(function (mixnode) { expect(mixnode.rewarding_details.cost_params.profit_margin_percent).toBeTruthy() - expect(typeof mixnode.bond_information.layer).toBe('number') + expect(typeof mixnode.bond_information.layer).toBe("number") }); }); @@ -166,7 +164,7 @@ describe("Get mixnode data", (): void => { it("Get blacklisted mixnodes", async (): Promise => { const response = await contract.getBlacklistedMixnodes(); response.forEach(function (value) { - expect(typeof value).toBe('number'); + expect(typeof value).toBe("number"); }); }); diff --git a/nym-api/tests/package.json b/nym-api/tests/package.json index b249270f71..2beba94f14 100644 --- a/nym-api/tests/package.json +++ b/nym-api/tests/package.json @@ -11,7 +11,7 @@ "test:prod": "TEST_ENV=prod jest --forceExit --detectOpenHandles --passWithNoTests", "build": "tsc", "lint": "eslint --ext .js,.ts,.tsx .", - "lint:fix": "eslint --fix", + "lint:fix": "eslint src --fix", "cleanup": "rm -rf node_modules; rm -rf dist; yarn install" }, "author": "Nymtech", diff --git a/nym-api/tests/src/config/configHandler.ts b/nym-api/tests/src/config/configHandler.ts index cd214061c5..44177f0866 100644 --- a/nym-api/tests/src/config/configHandler.ts +++ b/nym-api/tests/src/config/configHandler.ts @@ -23,7 +23,7 @@ class ConfigHandler { private constructor() { this.setCommonConfig(); - this.setEnvironmentConfig(process.env.TEST_ENV || "qa" || "prod" ); + this.setEnvironmentConfig(process.env.TEST_ENV || "qa" || "prod"); } public static getInstance(): ConfigHandler { diff --git a/nym-api/tests/src/endpoints/CirculatingSupply.ts b/nym-api/tests/src/endpoints/CirculatingSupply.ts index 553a7172ab..8d5153d9a1 100644 --- a/nym-api/tests/src/endpoints/CirculatingSupply.ts +++ b/nym-api/tests/src/endpoints/CirculatingSupply.ts @@ -1,6 +1,4 @@ -import { - Detailed -} from "../types/CirculatingSupplyTypes"; +import { Detailed } from "../types/CirculatingSupplyTypes"; import { APIClient } from "./abstracts/APIClient"; export default class ContractCache extends APIClient { @@ -13,5 +11,5 @@ export default class ContractCache extends APIClient { route: `circulating-supply`, }); return response.data; - } } +} diff --git a/nym-api/tests/src/endpoints/ContractCache.ts b/nym-api/tests/src/endpoints/ContractCache.ts index 9e6cb95997..7ca044d8d1 100644 --- a/nym-api/tests/src/endpoints/ContractCache.ts +++ b/nym-api/tests/src/endpoints/ContractCache.ts @@ -6,7 +6,6 @@ import { BlacklistedGateways, BlacklistedMixnodes, CurrentEpoch, - Mixnode } from "../types/ContractCacheTypes"; import { APIClient } from "./abstracts/APIClient"; @@ -81,16 +80,15 @@ export default class ContractCache extends APIClient { public async getEpochRewardParams(): Promise { const response = await this.restClient.sendGet({ - route: `epoch/reward_params` + route: `epoch/reward_params`, }); return response.data; } public async getCurrentEpoch(): Promise { const response = await this.restClient.sendGet({ - route: `epoch/current` + route: `epoch/current`, }); return response.data; } - } diff --git a/nym-api/tests/src/endpoints/Status.ts b/nym-api/tests/src/endpoints/Status.ts index 1c10aae124..53c121859a 100644 --- a/nym-api/tests/src/endpoints/Status.ts +++ b/nym-api/tests/src/endpoints/Status.ts @@ -1,8 +1,6 @@ -import { AxiosResponse } from "axios"; import { ActiveStatus, AvgUptime, - ComputeRewardEstimation, CoreCount, DetailedGateway, DetailedMixnodes, @@ -54,7 +52,6 @@ export default class Status extends APIClient { return response.data; } - // MIXNODES public async getMixnodeStatusReport(mix_id: number): Promise { @@ -98,7 +95,7 @@ export default class Status extends APIClient { ): Promise { const response = await this.restClient.sendPost({ route: `/mixnode/${mix_id}/compute-reward-estimation`, - data: { + data: { // performance: "10", active_in_rewarded_set: true, // pledge_amount: 10, @@ -108,7 +105,7 @@ export default class Status extends APIClient { // amount: "250000000" // }, // profit_margin_percent: 10 - } + }, }); return response.data; @@ -122,9 +119,7 @@ export default class Status extends APIClient { return response.data; } - public async getMixnodeAverageUptime( - mix_id: number - ): Promise { + public async getMixnodeAverageUptime(mix_id: number): Promise { const response = await this.restClient.sendGet({ route: `/mixnode/${mix_id}/avg_uptime`, }); diff --git a/nym-api/tests/src/types/CirculatingSupplyTypes.ts b/nym-api/tests/src/types/CirculatingSupplyTypes.ts index c637b53d21..e2b3abbf2e 100644 --- a/nym-api/tests/src/types/CirculatingSupplyTypes.ts +++ b/nym-api/tests/src/types/CirculatingSupplyTypes.ts @@ -1,26 +1,26 @@ export type Detailed = { - initial_supply: InitialSupply; - mixmining_reserve: MixminingReserve; - vesting_tokens: VestingTokens; - circulating_supply: CirculatingSupply; - }; - - export type InitialSupply = { - demon: "unym"; - amount: string; - }; + initial_supply: InitialSupply; + mixmining_reserve: MixminingReserve; + vesting_tokens: VestingTokens; + circulating_supply: CirculatingSupply; +}; - export type MixminingReserve = { - demon: "unym"; - amount: string; - }; +export type InitialSupply = { + demon: "unym"; + amount: string; +}; - export type VestingTokens = { - demon: "unym"; - amount: string; - }; +export type MixminingReserve = { + demon: "unym"; + amount: string; +}; - export type CirculatingSupply = { - demon: "unym"; - amount: string; - }; \ No newline at end of file +export type VestingTokens = { + demon: "unym"; + amount: string; +}; + +export type CirculatingSupply = { + demon: "unym"; + amount: string; +}; diff --git a/nym-api/tests/src/types/ContractCacheTypes.ts b/nym-api/tests/src/types/ContractCacheTypes.ts index 771faa702b..05cfaa2aa8 100644 --- a/nym-api/tests/src/types/ContractCacheTypes.ts +++ b/nym-api/tests/src/types/ContractCacheTypes.ts @@ -1,9 +1,9 @@ -export type AllMixnodes = { +export interface AllMixnodes { bond_information: BondInformation; rewarding_details: RewardingDetails; -}; +} -export type BondInformation = { +export interface BondInformation { mix_id: number; owner: string; original_pledge: OriginalPledge; @@ -14,7 +14,7 @@ export type BondInformation = { is_unbonding: boolean; } -export type RewardingDetails = { +export interface RewardingDetails { cost_params: CostParams; operator: string; delegates: string; @@ -24,27 +24,27 @@ export type RewardingDetails = { unique_delegations: number; } -export type CostParams = { +export interface CostParams { profit_margin_percent: string; interval_operating_cost: IntervalOperatingCost; } -export type IntervalOperatingCost = { +export interface IntervalOperatingCost { denom: string; amount: string; } -export type OriginalPledge = { +export interface OriginalPledge { denom: string; amount: string; } -export type TotalDelegation = { +export interface TotalDelegation { denom: string; amount: string; -}; +} -export type Mixnode = { +export interface Mixnode { host: string; mix_port: number; verloc_port: number; @@ -52,9 +52,9 @@ export type Mixnode = { sphinx_key: string; identity_key: string; version: string; -}; +} -export type MixnodeBond = { +export interface MixnodeBond { pledge_amount: OriginalPledge; total_delegation: TotalDelegation; owner: string; @@ -65,21 +65,19 @@ export type MixnodeBond = { accumulated_rewards: string; } -export type MixnodesDetailed = { +export interface MixnodesDetailed { mixnode_details: AllMixnodes; stake_saturation: string; uncapped_stake_saturation: string; performance: string; - estimated_operator_apy: string + estimated_operator_apy: string; estimated_delegators_apy: string; - family: string -}; + family: string; +} -export type BlacklistedMixnodes = { -}; +export interface BlacklistedMixnodes {} -export type BlacklistedGateways = { -}; +export interface BlacklistedGateways {} export interface Gateway { host: string; @@ -99,13 +97,13 @@ export interface AllGateways { proxy: string; } -export type EpochRewardParams = { +export interface EpochRewardParams { interval: Interval; rewarded_set_size: number; active_set_size: number; -}; +} -export type Interval = { +export interface Interval { reward_pool: string; staking_supply: string; staking_supply_scale_factor: string; @@ -116,17 +114,16 @@ export type Interval = { interval_pool_emission: string; } -export type CurrentEpoch = { +export interface CurrentEpoch { id: number; epochs_in_interval: number; current_epoch_start: string; current_epoch_id: number; epoch_length: EpochLength; total_elapsed_epochs: number; -}; +} -export type EpochLength = { +export interface EpochLength { secs: number; nanos: number; -}; - +} diff --git a/nym-api/tests/src/types/StatusInterfaces.ts b/nym-api/tests/src/types/StatusInterfaces.ts index 03b797db56..3c14f0c485 100644 --- a/nym-api/tests/src/types/StatusInterfaces.ts +++ b/nym-api/tests/src/types/StatusInterfaces.ts @@ -7,7 +7,6 @@ export interface CurrentEpoch { active_set_work_factor: number; } - export interface Epoch { id: number; epochs_in_interval: number; @@ -49,17 +48,17 @@ export interface RewardParams { } export interface ComputeRewardEstimation { - performance: string, - active_in_rewarded_set: boolean, - pledge_amount: number, - total_delegation: number, + performance: string; + active_in_rewarded_set: boolean; + pledge_amount: number; + total_delegation: number; interval_operating_cost: IntervalOperatingCost; - profit_margin_percent: string + profit_margin_percent: string; } export interface IntervalOperatingCost { - denom: string, - amount: string + denom: string; + amount: string; } export interface Interval { @@ -124,14 +123,14 @@ export interface History { } export interface NodeHistory { - mix_id: number, + mix_id: number; identity: string; owner: string; history: History[]; } export interface CoreCount { - mix_id: number, + mix_id: number; identity: string; count: number; } @@ -140,7 +139,6 @@ export interface ActiveStatus { status: string; } - export interface PledgeAmount { denom: string; amount: string; @@ -228,4 +226,4 @@ export interface DetailedMixnodes { estimated_operator_apy: string; estimated_delegators_apy: string; family: string; -} \ No newline at end of file +} From 854d548c206041cbda3452a413efb2aeabdf48b8 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 26 Jan 2023 12:27:59 +0100 Subject: [PATCH 248/591] Delete yarn-stable-temp.cjs --- .../tests/.yarn/releases/yarn-stable-temp.cjs | 783 ------------------ 1 file changed, 783 deletions(-) delete mode 100755 nym-api/tests/.yarn/releases/yarn-stable-temp.cjs diff --git a/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs b/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs deleted file mode 100755 index 0912bea85e..0000000000 --- a/nym-api/tests/.yarn/releases/yarn-stable-temp.cjs +++ /dev/null @@ -1,783 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var nge=Object.create,Mh=Object.defineProperty,sge=Object.defineProperties,oge=Object.getOwnPropertyDescriptor,age=Object.getOwnPropertyDescriptors,Age=Object.getOwnPropertyNames,DE=Object.getOwnPropertySymbols,lge=Object.getPrototypeOf,eQ=Object.prototype.hasOwnProperty,OO=Object.prototype.propertyIsEnumerable;var MO=(r,e,t)=>e in r?Mh(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,N=(r,e)=>{for(var t in e||(e={}))eQ.call(e,t)&&MO(r,t,e[t]);if(DE)for(var t of DE(e))OO.call(e,t)&&MO(r,t,e[t]);return r},te=(r,e)=>sge(r,age(e)),cge=r=>Mh(r,"__esModule",{value:!0});var Or=(r,e)=>{var t={};for(var i in r)eQ.call(r,i)&&e.indexOf(i)<0&&(t[i]=r[i]);if(r!=null&&DE)for(var i of DE(r))e.indexOf(i)<0&&OO.call(r,i)&&(t[i]=r[i]);return t},uge=(r,e)=>()=>(r&&(e=r(r=0)),e),w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ft=(r,e)=>{for(var t in e)Mh(r,t,{get:e[t],enumerable:!0})},gge=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Age(e))!eQ.call(r,i)&&i!=="default"&&Mh(r,i,{get:()=>e[i],enumerable:!(t=oge(e,i))||t.enumerable});return r},ge=r=>gge(cge(Mh(r!=null?nge(lge(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var cM=w((i7e,oM)=>{oM.exports=aM;aM.sync=xge;var AM=require("fs");function kge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{uM.exports=gM;gM.sync=Pge;var fM=require("fs");function gM(r,e,t){fM.stat(r,function(i,n){t(i,i?!1:hM(n,e))})}function Pge(r,e){return hM(fM.statSync(r),e)}function hM(r,e){return r.isFile()&&Dge(r,e)}function Dge(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var CM=w((o7e,dM)=>{var s7e=require("fs"),zE;process.platform==="win32"||global.TESTING_WINDOWS?zE=cM():zE=pM();dM.exports=CQ;CQ.sync=Rge;function CQ(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){CQ(r,e||{},function(s,o){s?n(s):i(o)})})}zE(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function Rge(r,e){try{return zE.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var bM=w((a7e,mM)=>{var Xu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",EM=require("path"),Fge=Xu?";":":",IM=CM(),yM=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),wM=(r,e)=>{let t=e.colon||Fge,i=r.match(/\//)||Xu&&r.match(/\\/)?[""]:[...Xu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=Xu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Xu?n.split(t):[""];return Xu&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},BM=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=wM(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(yM(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=EM.join(h,r),m=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(m,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];IM(c+p,{pathExt:s},(m,y)=>{if(!m&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},Nge=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=wM(r,e),s=[];for(let o=0;o{"use strict";var QM=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};mQ.exports=QM;mQ.exports.default=QM});var PM=w((l7e,vM)=>{"use strict";var xM=require("path"),Lge=bM(),Tge=SM();function kM(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch(a){}let o;try{o=Lge.sync(r.command,{path:t[Tge({env:t})],pathExt:e?xM.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=xM.resolve(n?r.options.cwd:"",o)),o}function Oge(r){return kM(r)||kM(r,!0)}vM.exports=Oge});var DM=w((c7e,EQ)=>{"use strict";var IQ=/([()\][%!^"`<>&|;, *?])/g;function Mge(r){return r=r.replace(IQ,"^$1"),r}function Kge(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(IQ,"^$1"),e&&(r=r.replace(IQ,"^$1")),r}EQ.exports.command=Mge;EQ.exports.argument=Kge});var FM=w((u7e,RM)=>{"use strict";RM.exports=/^#!(.*)/});var LM=w((g7e,NM)=>{"use strict";var Uge=FM();NM.exports=(r="")=>{let e=r.match(Uge);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var OM=w((f7e,TM)=>{"use strict";var yQ=require("fs"),Hge=LM();function jge(r){let e=150,t=Buffer.alloc(e),i;try{i=yQ.openSync(r,"r"),yQ.readSync(i,t,0,e,0),yQ.closeSync(i)}catch(n){}return Hge(t.toString())}TM.exports=jge});var HM=w((h7e,MM)=>{"use strict";var Gge=require("path"),KM=PM(),UM=DM(),Yge=OM(),qge=process.platform==="win32",Jge=/\.(?:com|exe)$/i,Wge=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function zge(r){r.file=KM(r);let e=r.file&&Yge(r.file);return e?(r.args.unshift(r.file),r.command=e,KM(r)):r.file}function _ge(r){if(!qge)return r;let e=zge(r),t=!Jge.test(e);if(r.options.forceShell||t){let i=Wge.test(e);r.command=Gge.normalize(r.command),r.command=UM.command(r.command),r.args=r.args.map(s=>UM.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Vge(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:_ge(i)}MM.exports=Vge});var YM=w((p7e,jM)=>{"use strict";var wQ=process.platform==="win32";function BQ(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Xge(r,e){if(!wQ)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=GM(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function GM(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawn"):null}function Zge(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawnSync"):null}jM.exports={hookChildProcess:Xge,verifyENOENT:GM,verifyENOENTSync:Zge,notFoundError:BQ}});var SQ=w((d7e,Zu)=>{"use strict";var qM=require("child_process"),bQ=HM(),QQ=YM();function JM(r,e,t){let i=bQ(r,e,t),n=qM.spawn(i.command,i.args,i.options);return QQ.hookChildProcess(n,i),n}function $ge(r,e,t){let i=bQ(r,e,t),n=qM.spawnSync(i.command,i.args,i.options);return n.error=n.error||QQ.verifyENOENTSync(n.status,i),n}Zu.exports=JM;Zu.exports.spawn=JM;Zu.exports.sync=$ge;Zu.exports._parse=bQ;Zu.exports._enoent=QQ});var zM=w((C7e,WM)=>{"use strict";function efe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function cc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,cc)}efe(cc,Error);cc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",le=me(">>",!1),fe=">&",gt=me(">&",!1),Ht=">",Mt=me(">",!1),Ei="<<<",jt=me("<<<",!1),Qr="<&",Oi=me("<&",!1),Xs="<",Un=me("<",!1),Hn=function(C){return{type:"argument",segments:[].concat(...C)}},Sr=function(C){return C},jn="$'",fs=me("$'",!1),ba="'",DA=me("'",!1),Nu=function(C){return[{type:"text",text:C}]},hs='""',RA=me('""',!1),Qa=function(){return{type:"text",text:""}},Lu='"',FA=me('"',!1),NA=function(C){return C},vr=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},zl=function(C){return{type:"shell",shell:C,quoted:!0}},Tu=function(C){return te(N({type:"variable"},C),{quoted:!0})},xo=function(C){return{type:"text",text:C}},Ou=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},Sh=function(C){return{type:"shell",shell:C,quoted:!1}},vh=function(C){return te(N({type:"variable"},C),{quoted:!1})},Dr=function(C){return{type:"glob",pattern:C}},Ae=/^[^']/,ko=_e(["'"],!0,!1),Gn=function(C){return C.join("")},Mu=/^[^$"]/,St=_e(["$",'"'],!0,!1),_l=`\\ -`,Yn=me(`\\ -`,!1),ps=function(){return""},ds="\\",pt=me("\\",!1),Po=/^[\\$"`]/,lt=_e(["\\","$",'"',"`"],!1,!1),mn=function(C){return C},S="\\a",Tt=me("\\a",!1),Ku=function(){return"a"},Vl="\\b",xh=me("\\b",!1),kh=function(){return"\b"},Ph=/^[Ee]/,Dh=_e(["E","e"],!1,!1),Rh=function(){return""},j="\\f",wt=me("\\f",!1),LA=function(){return"\f"},$i="\\n",Xl=me("\\n",!1),$e=function(){return` -`},Sa="\\r",Uu=me("\\r",!1),yE=function(){return"\r"},Fh="\\t",wE=me("\\t",!1),gr=function(){return" "},qn="\\v",Zl=me("\\v",!1),Nh=function(){return"\v"},Zs=/^[\\'"?]/,va=_e(["\\","'",'"',"?"],!1,!1),En=function(C){return String.fromCharCode(parseInt(C,16))},Oe="\\x",Hu=me("\\x",!1),$l="\\u",$s=me("\\u",!1),ec="\\U",TA=me("\\U",!1),ju=function(C){return String.fromCodePoint(parseInt(C,16))},Gu=/^[0-7]/,xa=_e([["0","7"]],!1,!1),ka=/^[0-9a-fA-f]/,nt=_e([["0","9"],["a","f"],["A","f"]],!1,!1),Do=ot(),OA="-",tc=me("-",!1),eo="+",rc=me("+",!1),BE=".",Lh=me(".",!1),Yu=function(C,Q,F){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+F.join(""))}},Th=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},bE=function(C){return N({type:"variable"},C)},ic=function(C){return{type:"variable",name:C}},QE=function(C){return C},qu="*",MA=me("*",!1),Tr="/",SE=me("/",!1),to=function(C,Q,F){return{type:Q==="*"?"multiplication":"division",right:F}},ro=function(C,Q){return Q.reduce((F,U)=>N({left:F},U),C)},Ju=function(C,Q,F){return{type:Q==="+"?"addition":"subtraction",right:F}},KA="$((",R=me("$((",!1),G="))",Ce=me("))",!1),He=function(C){return C},Te="$(",Xe=me("$(",!1),Et=function(C){return C},Rt="${",Jn=me("${",!1),Ob=":-",lO=me(":-",!1),cO=function(C,Q){return{name:C,defaultValue:Q}},Mb=":-}",uO=me(":-}",!1),gO=function(C){return{name:C,defaultValue:[]}},Kb=":+",fO=me(":+",!1),hO=function(C,Q){return{name:C,alternativeValue:Q}},Ub=":+}",pO=me(":+}",!1),dO=function(C){return{name:C,alternativeValue:[]}},Hb=function(C){return{name:C}},CO="$",mO=me("$",!1),EO=function(C){return e.isGlobPattern(C)},IO=function(C){return C},jb=/^[a-zA-Z0-9_]/,Gb=_e([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Yb=function(){return M()},qb=/^[$@*?#a-zA-Z0-9_\-]/,Jb=_e(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),yO=/^[(){}<>$|&; \t"']/,Wu=_e(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Wb=/^[<>&; \t"']/,zb=_e(["<",">","&",";"," "," ",'"',"'"],!1,!1),vE=/^[ \t]/,xE=_e([" "," "],!1,!1),B=0,Ue=0,UA=[{line:1,column:1}],d=0,E=[],I=0,D;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function M(){return r.substring(Ue,B)}function z(){return yt(Ue,B)}function ie(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Mi([ut(C)],r.substring(Ue,B),Q)}function we(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Wn(C,Q)}function me(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function _e(C,Q,F){return{type:"class",parts:C,inverted:Q,ignoreCase:F}}function ot(){return{type:"any"}}function Bt(){return{type:"end"}}function ut(C){return{type:"other",description:C}}function st(C){var Q=UA[C],F;if(Q)return Q;for(F=C-1;!UA[F];)F--;for(Q=UA[F],Q={line:Q.line,column:Q.column};Fd&&(d=B,E=[]),E.push(C))}function Wn(C,Q){return new cc(C,null,null,Q)}function Mi(C,Q,F){return new cc(cc.buildMessage(C,Q),C,Q,F)}function HA(){var C,Q;return C=B,Q=Yr(),Q===t&&(Q=null),Q!==t&&(Ue=C,Q=s(Q)),C=Q,C}function Yr(){var C,Q,F,U,ue;if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U!==t?(ue=Cs(),ue===t&&(ue=null),ue!==t?(Ue=C,Q=o(Q,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;if(C===t)if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U===t&&(U=null),U!==t?(Ue=C,Q=a(Q,U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Cs(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yr(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=l(F),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function Pa(){var C;return r.charCodeAt(B)===59?(C=c,B++):(C=t,I===0&&xe(u)),C===t&&(r.charCodeAt(B)===38?(C=g,B++):(C=t,I===0&&xe(f))),C}function qr(){var C,Q,F;return C=B,Q=wO(),Q!==t?(F=Hue(),F===t&&(F=null),F!==t?(Ue=C,Q=h(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Hue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=jue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=qr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=p(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function jue(){var C;return r.substr(B,2)===m?(C=m,B+=2):(C=t,I===0&&xe(y)),C===t&&(r.substr(B,2)===b?(C=b,B+=2):(C=t,I===0&&xe(v))),C}function wO(){var C,Q,F;return C=B,Q=que(),Q!==t?(F=Gue(),F===t&&(F=null),F!==t?(Ue=C,Q=x(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Gue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=wO(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=T(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function Yue(){var C;return r.substr(B,2)===q?(C=q,B+=2):(C=t,I===0&&xe(Y)),C===t&&(r.charCodeAt(B)===124?(C=$,B++):(C=t,I===0&&xe(_))),C}function kE(){var C,Q,F,U,ue,De;if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t)if(U=QO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(Ue=C,Q=A(Q,U),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;else B=C,C=t;if(C===t)if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=oe(Q),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function que(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===40?(F=ce,B++):(F=t,I===0&&xe(Z)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===41?(Ct=O,B++):(Ct=t,I===0&&xe(L)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=de(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===123?(F=Be,B++):(F=t,I===0&&xe(je)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===125?(Ct=re,B++):(Ct=t,I===0&&xe(se)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=be(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){for(F=[],U=kE();U!==t;)F.push(U),U=kE();if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t){if(ue=[],De=bO(),De!==t)for(;De!==t;)ue.push(De),De=bO();else ue=t;if(ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=he(F,ue),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t}else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=kE(),U!==t)for(;U!==t;)F.push(U),U=kE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Fe(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}}}return C}function BO(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=PE(),U!==t)for(;U!==t;)F.push(U),U=PE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Ke(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t;return C}function bO(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t?(F=Oh(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();Q!==t?(F=PE(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t)}return C}function Oh(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(ve.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(pe)),F===t&&(F=null),F!==t?(U=Jue(),U!==t?(ue=PE(),ue!==t?(Ue=C,Q=V(F,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Jue(){var C;return r.substr(B,2)===Qe?(C=Qe,B+=2):(C=t,I===0&&xe(le)),C===t&&(r.substr(B,2)===fe?(C=fe,B+=2):(C=t,I===0&&xe(gt)),C===t&&(r.charCodeAt(B)===62?(C=Ht,B++):(C=t,I===0&&xe(Mt)),C===t&&(r.substr(B,3)===Ei?(C=Ei,B+=3):(C=t,I===0&&xe(jt)),C===t&&(r.substr(B,2)===Qr?(C=Qr,B+=2):(C=t,I===0&&xe(Oi)),C===t&&(r.charCodeAt(B)===60?(C=Xs,B++):(C=t,I===0&&xe(Un))))))),C}function PE(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(F=QO(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C}function QO(){var C,Q,F;if(C=B,Q=[],F=SO(),F!==t)for(;F!==t;)Q.push(F),F=SO();else Q=t;return Q!==t&&(Ue=C,Q=Hn(Q)),C=Q,C}function SO(){var C,Q;return C=B,Q=Wue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=zue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=_ue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=Vue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q))),C}function Wue(){var C,Q,F,U;return C=B,r.substr(B,2)===jn?(Q=jn,B+=2):(Q=t,I===0&&xe(fs)),Q!==t?(F=$ue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function zue(){var C,Q,F,U;return C=B,r.charCodeAt(B)===39?(Q=ba,B++):(Q=t,I===0&&xe(DA)),Q!==t?(F=Xue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function _ue(){var C,Q,F,U;if(C=B,r.substr(B,2)===hs?(Q=hs,B+=2):(Q=t,I===0&&xe(RA)),Q!==t&&(Ue=C,Q=Qa()),C=Q,C===t)if(C=B,r.charCodeAt(B)===34?(Q=Lu,B++):(Q=t,I===0&&xe(FA)),Q!==t){for(F=[],U=vO();U!==t;)F.push(U),U=vO();F!==t?(r.charCodeAt(B)===34?(U=Lu,B++):(U=t,I===0&&xe(FA)),U!==t?(Ue=C,Q=NA(F),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Vue(){var C,Q,F;if(C=B,Q=[],F=xO(),F!==t)for(;F!==t;)Q.push(F),F=xO();else Q=t;return Q!==t&&(Ue=C,Q=NA(Q)),C=Q,C}function vO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=vr(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=zl(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=Tu(Q)),C=Q,C===t&&(C=B,Q=Zue(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q))),C}function xO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=Ou(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=Sh(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=vh(Q)),C=Q,C===t&&(C=B,Q=rge(),Q!==t&&(Ue=C,Q=Dr(Q)),C=Q,C===t&&(C=B,Q=tge(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q)))),C}function Xue(){var C,Q,F;for(C=B,Q=[],Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));F!==t;)Q.push(F),Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Zue(){var C,Q,F;if(C=B,Q=[],F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St))),F!==t)for(;F!==t;)Q.push(F),F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St)));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function kO(){var C,Q,F;return C=B,r.substr(B,2)===_l?(Q=_l,B+=2):(Q=t,I===0&&xe(Yn)),Q!==t&&(Ue=C,Q=ps()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Po.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(lt)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t)),C}function $ue(){var C,Q,F;for(C=B,Q=[],F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));F!==t;)Q.push(F),F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function PO(){var C,Q,F;return C=B,r.substr(B,2)===S?(Q=S,B+=2):(Q=t,I===0&&xe(Tt)),Q!==t&&(Ue=C,Q=Ku()),C=Q,C===t&&(C=B,r.substr(B,2)===Vl?(Q=Vl,B+=2):(Q=t,I===0&&xe(xh)),Q!==t&&(Ue=C,Q=kh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Ph.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Dh)),F!==t?(Ue=C,Q=Rh(),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===j?(Q=j,B+=2):(Q=t,I===0&&xe(wt)),Q!==t&&(Ue=C,Q=LA()),C=Q,C===t&&(C=B,r.substr(B,2)===$i?(Q=$i,B+=2):(Q=t,I===0&&xe(Xl)),Q!==t&&(Ue=C,Q=$e()),C=Q,C===t&&(C=B,r.substr(B,2)===Sa?(Q=Sa,B+=2):(Q=t,I===0&&xe(Uu)),Q!==t&&(Ue=C,Q=yE()),C=Q,C===t&&(C=B,r.substr(B,2)===Fh?(Q=Fh,B+=2):(Q=t,I===0&&xe(wE)),Q!==t&&(Ue=C,Q=gr()),C=Q,C===t&&(C=B,r.substr(B,2)===qn?(Q=qn,B+=2):(Q=t,I===0&&xe(Zl)),Q!==t&&(Ue=C,Q=Nh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Zs.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(va)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=ege()))))))))),C}function ege(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms,$b;return C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(F=_b(),F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Oe?(Q=Oe,B+=2):(Q=t,I===0&&xe(Hu)),Q!==t?(F=B,U=B,ue=_b(),ue!==t?(De=zn(),De!==t?(ue=[ue,De],U=ue):(B=U,U=t)):(B=U,U=t),U===t&&(U=_b()),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===$l?(Q=$l,B+=2):(Q=t,I===0&&xe($s)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?(ue=[ue,De,Ct,bt],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===ec?(Q=ec,B+=2):(Q=t,I===0&&xe(TA)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?($r=zn(),$r!==t?(Ii=zn(),Ii!==t?(ms=zn(),ms!==t?($b=zn(),$b!==t?(ue=[ue,De,Ct,bt,$r,Ii,ms,$b],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=ju(F),C=Q):(B=C,C=t)):(B=C,C=t)))),C}function _b(){var C;return Gu.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(xa)),C}function zn(){var C;return ka.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(nt)),C}function tge(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t)),F!==t)for(;F!==t;)Q.push(F),F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Vb(){var C,Q,F,U,ue,De;if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;if(F!==t)if(r.charCodeAt(B)===46?(U=BE,B++):(U=t,I===0&&xe(Lh)),U!==t){if(ue=[],ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe)),De!==t)for(;De!==t;)ue.push(De),ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe));else ue=t;ue!==t?(Ue=C,Q=Yu(Q,F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;if(C===t){if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;F!==t?(Ue=C,Q=Th(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;if(C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=bE(Q)),C=Q,C===t&&(C=B,Q=nc(),Q!==t&&(Ue=C,Q=ic(Q)),C=Q,C===t)))if(C=B,r.charCodeAt(B)===40?(Q=ce,B++):(Q=t,I===0&&xe(Z)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.charCodeAt(B)===41?(De=O,B++):(De=t,I===0&&xe(L)),De!==t?(Ue=C,Q=QE(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t}return C}function Xb(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Vb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function DO(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Xb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function RO(){var C,Q,F,U,ue,De;if(C=B,r.substr(B,3)===KA?(Q=KA,B+=3):(Q=t,I===0&&xe(R)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.substr(B,2)===G?(De=G,B+=2):(De=t,I===0&&xe(Ce)),De!==t?(Ue=C,Q=He(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;return C}function FO(){var C,Q,F,U;return C=B,r.substr(B,2)===Te?(Q=Te,B+=2):(Q=t,I===0&&xe(Xe)),Q!==t?(F=Yr(),F!==t?(r.charCodeAt(B)===41?(U=O,B++):(U=t,I===0&&xe(L)),U!==t?(Ue=C,Q=Et(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Zb(){var C,Q,F,U,ue,De;return C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Ob?(U=Ob,B+=2):(U=t,I===0&&xe(lO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=cO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Mb?(U=Mb,B+=3):(U=t,I===0&&xe(uO)),U!==t?(Ue=C,Q=gO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Kb?(U=Kb,B+=2):(U=t,I===0&&xe(fO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=hO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Ub?(U=Ub,B+=3):(U=t,I===0&&xe(pO)),U!==t?(Ue=C,Q=dO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.charCodeAt(B)===125?(U=re,B++):(U=t,I===0&&xe(se)),U!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.charCodeAt(B)===36?(Q=CO,B++):(Q=t,I===0&&xe(mO)),Q!==t?(F=nc(),F!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)))))),C}function rge(){var C,Q,F;return C=B,Q=ige(),Q!==t?(Ue=B,F=EO(Q),F?F=void 0:F=t,F!==t?(Ue=C,Q=IO(Q),C=Q):(B=C,C=t)):(B=C,C=t),C}function ige(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F!==t)for(;F!==t;)Q.push(F),F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t);else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function NO(){var C,Q,F;if(C=B,Q=[],jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb)),F!==t)for(;F!==t;)Q.push(F),jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function nc(){var C,Q,F;if(C=B,Q=[],qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb)),F!==t)for(;F!==t;)Q.push(F),qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function LO(){var C;return yO.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(Wu)),C}function TO(){var C;return Wb.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(zb)),C}function Ye(){var C,Q;if(C=[],vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE)),Q!==t)for(;Q!==t;)C.push(Q),vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE));else C=t;return C}if(D=n(),D!==t&&B===r.length)return D;throw D!==t&&B{"use strict";function rfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function gc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,gc)}rfe(gc,Error);gc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gq&&(q=v,Y=[]),Y.push(pe))}function se(pe,V){return new gc(pe,null,null,V)}function be(pe,V,Qe){return new gc(gc.buildMessage(pe,V),pe,V,Qe)}function he(){var pe,V,Qe,le;return pe=v,V=Fe(),V!==t?(r.charCodeAt(v)===47?(Qe=s,v++):(Qe=t,$===0&&re(o)),Qe!==t?(le=Fe(),le!==t?(x=pe,V=a(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Fe(),V!==t&&(x=pe,V=l(V)),pe=V),pe}function Fe(){var pe,V,Qe,le;return pe=v,V=Ke(),V!==t?(r.charCodeAt(v)===64?(Qe=c,v++):(Qe=t,$===0&&re(u)),Qe!==t?(le=ve(),le!==t?(x=pe,V=g(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Ke(),V!==t&&(x=pe,V=f(V)),pe=V),pe}function Ke(){var pe,V,Qe,le,fe;return pe=v,r.charCodeAt(v)===64?(V=c,v++):(V=t,$===0&&re(u)),V!==t?(Qe=ke(),Qe!==t?(r.charCodeAt(v)===47?(le=s,v++):(le=t,$===0&&re(o)),le!==t?(fe=ke(),fe!==t?(x=pe,V=h(),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=ke(),V!==t&&(x=pe,V=h()),pe=V),pe}function ke(){var pe,V,Qe;if(pe=v,V=[],p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m)),Qe!==t)for(;Qe!==t;)V.push(Qe),p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}function ve(){var pe,V,Qe;if(pe=v,V=[],y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b)),Qe!==t)for(;Qe!==t;)V.push(Qe),y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}if(_=n(),_!==t&&v===r.length)return _;throw _!==t&&v{"use strict";function $M(r){return typeof r=="undefined"||r===null}function nfe(r){return typeof r=="object"&&r!==null}function sfe(r){return Array.isArray(r)?r:$M(r)?[]:[r]}function ofe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function ep(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}ep.prototype=Object.create(Error.prototype);ep.prototype.constructor=ep;ep.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};e1.exports=ep});var i1=w((L7e,t1)=>{"use strict";var r1=hc();function RQ(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}RQ.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),r1.repeat(" ",e)+i+a+s+` -`+r1.repeat(" ",e+this.position-n+i.length)+"^"};RQ.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: -`+t)),i};t1.exports=RQ});var ci=w((T7e,n1)=>{"use strict";var s1=tg(),lfe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],cfe=["scalar","sequence","mapping"];function ufe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function gfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(lfe.indexOf(t)===-1)throw new s1('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=ufe(e.styleAliases||null),cfe.indexOf(this.kind)===-1)throw new s1('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}n1.exports=gfe});var pc=w((O7e,o1)=>{"use strict";var a1=hc(),tI=tg(),ffe=ci();function FQ(r,e,t){var i=[];return r.include.forEach(function(n){t=FQ(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function hfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var pfe=ci();A1.exports=new pfe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var u1=w((K7e,c1)=>{"use strict";var dfe=ci();c1.exports=new dfe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var f1=w((U7e,g1)=>{"use strict";var Cfe=ci();g1.exports=new Cfe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var rI=w((H7e,h1)=>{"use strict";var mfe=pc();h1.exports=new mfe({explicit:[l1(),u1(),f1()]})});var d1=w((j7e,p1)=>{"use strict";var Efe=ci();function Ife(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function yfe(){return null}function wfe(r){return r===null}p1.exports=new Efe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Ife,construct:yfe,predicate:wfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var m1=w((G7e,C1)=>{"use strict";var Bfe=ci();function bfe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function Qfe(r){return r==="true"||r==="True"||r==="TRUE"}function Sfe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}C1.exports=new Bfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:bfe,construct:Qfe,predicate:Sfe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var I1=w((Y7e,E1)=>{"use strict";var vfe=hc(),xfe=ci();function kfe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function Pfe(r){return 48<=r&&r<=55}function Dfe(r){return 48<=r&&r<=57}function Rfe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var B1=w((q7e,y1)=>{"use strict";var w1=hc(),Lfe=ci(),Tfe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Ofe(r){return!(r===null||!Tfe.test(r)||r[r.length-1]==="_")}function Mfe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var Kfe=/^[-+]?[0-9]+e/;function Ufe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(w1.isNegativeZero(r))return"-0.0";return t=r.toString(10),Kfe.test(t)?t.replace("e",".e"):t}function Hfe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!=0||w1.isNegativeZero(r))}y1.exports=new Lfe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Ofe,construct:Mfe,predicate:Hfe,represent:Ufe,defaultStyle:"lowercase"})});var NQ=w((J7e,b1)=>{"use strict";var jfe=pc();b1.exports=new jfe({include:[rI()],implicit:[d1(),m1(),I1(),B1()]})});var LQ=w((W7e,Q1)=>{"use strict";var Gfe=pc();Q1.exports=new Gfe({include:[NQ()]})});var k1=w((z7e,S1)=>{"use strict";var Yfe=ci(),v1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),x1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function qfe(r){return r===null?!1:v1.exec(r)!==null||x1.exec(r)!==null}function Jfe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=v1.exec(r),e===null&&(e=x1.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Wfe(r){return r.toISOString()}S1.exports=new Yfe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:qfe,construct:Jfe,instanceOf:Date,represent:Wfe})});var D1=w((_7e,P1)=>{"use strict";var zfe=ci();function _fe(r){return r==="<<"||r===null}P1.exports=new zfe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:_fe})});var N1=w((V7e,R1)=>{"use strict";var dc;try{F1=require,dc=F1("buffer").Buffer}catch(r){}var F1,Vfe=ci(),TQ=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function Xfe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=TQ;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8==0}function Zfe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=TQ,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),dc?dc.from?dc.from(a):new dc(a):a}function $fe(r){var e="",t=0,i,n,s=r.length,o=TQ;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function ehe(r){return dc&&dc.isBuffer(r)}R1.exports=new Vfe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Xfe,construct:Zfe,predicate:ehe,represent:$fe})});var T1=w((X7e,L1)=>{"use strict";var the=ci(),rhe=Object.prototype.hasOwnProperty,ihe=Object.prototype.toString;function nhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var ohe=ci(),ahe=Object.prototype.toString;function Ahe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var che=ci(),uhe=Object.prototype.hasOwnProperty;function ghe(r){if(r===null)return!0;var e,t=r;for(e in t)if(uhe.call(t,e)&&t[e]!==null)return!1;return!0}function fhe(r){return r!==null?r:{}}K1.exports=new che("tag:yaml.org,2002:set",{kind:"mapping",resolve:ghe,construct:fhe})});var ig=w((eXe,H1)=>{"use strict";var hhe=pc();H1.exports=new hhe({include:[LQ()],implicit:[k1(),D1()],explicit:[N1(),T1(),M1(),U1()]})});var G1=w((tXe,j1)=>{"use strict";var phe=ci();function dhe(){return!0}function Che(){}function mhe(){return""}function Ehe(r){return typeof r=="undefined"}j1.exports=new phe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:dhe,construct:Che,predicate:Ehe,represent:mhe})});var q1=w((rXe,Y1)=>{"use strict";var Ihe=ci();function yhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function whe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Bhe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function bhe(r){return Object.prototype.toString.call(r)==="[object RegExp]"}Y1.exports=new Ihe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:yhe,construct:whe,predicate:bhe,represent:Bhe})});var z1=w((iXe,J1)=>{"use strict";var iI;try{W1=require,iI=W1("esprima")}catch(r){typeof window!="undefined"&&(iI=window.esprima)}var W1,Qhe=ci();function She(r){if(r===null)return!1;try{var e="("+r+")",t=iI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function vhe(r){var e="("+r+")",t=iI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function xhe(r){return r.toString()}function khe(r){return Object.prototype.toString.call(r)==="[object Function]"}J1.exports=new Qhe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:She,construct:vhe,predicate:khe,represent:xhe})});var tp=w((nXe,_1)=>{"use strict";var V1=pc();_1.exports=V1.DEFAULT=new V1({include:[ig()],explicit:[G1(),q1(),z1()]})});var pK=w((sXe,rp)=>{"use strict";var Oa=hc(),X1=tg(),Phe=i1(),Z1=ig(),Dhe=tp(),JA=Object.prototype.hasOwnProperty,nI=1,$1=2,eK=3,sI=4,OQ=1,Rhe=2,tK=3,Fhe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Nhe=/[\x85\u2028\u2029]/,Lhe=/[,\[\]\{\}]/,rK=/^(?:!|!!|![a-z\-]+!)$/i,iK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function nK(r){return Object.prototype.toString.call(r)}function Lo(r){return r===10||r===13}function Cc(r){return r===9||r===32}function yn(r){return r===9||r===32||r===10||r===13}function ng(r){return r===44||r===91||r===93||r===123||r===125}function The(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Ohe(r){return r===120?2:r===117?4:r===85?8:0}function Mhe(r){return 48<=r&&r<=57?r-48:-1}function sK(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` -`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function Khe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var oK=new Array(256),aK=new Array(256);for(var sg=0;sg<256;sg++)oK[sg]=sK(sg)?1:0,aK[sg]=sK(sg);function Uhe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||Dhe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function AK(r,e){return new X1(e,new Phe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function dt(r,e){throw AK(r,e)}function oI(r,e){r.onWarning&&r.onWarning.call(null,AK(r,e))}var lK={YAML:function(e,t,i){var n,s,o;e.version!==null&&dt(e,"duplication of %YAML directive"),i.length!==1&&dt(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&dt(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&dt(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&oI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&dt(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],rK.test(n)||dt(e,"ill-formed tag handle (first argument) of the TAG directive"),JA.call(e.tagMap,n)&&dt(e,'there is a previously declared suffix for "'+n+'" tag handle'),iK.test(s)||dt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function WA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Oa.repeat(` -`,e-1))}function Hhe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),yn(h)||ng(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),yn(i))break}else{if(r.position===r.lineStart&&aI(r)||t&&ng(h))break;if(Lo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,ei(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(WA(r,s,o,!1),KQ(r,r.line-l),s=o=r.position,a=!1),Cc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return WA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function jhe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(WA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else Lo(t)?(WA(r,i,n,!0),KQ(r,ei(r,!1,e)),i=n=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);dt(r,"unexpected end of the stream within a single quoted scalar")}function Ghe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return WA(r,t,r.position,!0),r.position++,!0;if(a===92){if(WA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),Lo(a))ei(r,!1,e);else if(a<256&&oK[a])r.result+=aK[a],r.position++;else if((o=Ohe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=The(a))>=0?s=(s<<4)+o:dt(r,"expected hexadecimal character");r.result+=Khe(s),r.position++}else dt(r,"unknown escape sequence");t=i=r.position}else Lo(a)?(WA(r,t,i,!0),KQ(r,ei(r,!1,e)),t=i=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}dt(r,"unexpected end of the stream within a double quoted scalar")}function Yhe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,m,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(ei(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||dt(r,"missed comma between flow collection entries"),p=h=m=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),yn(a)&&(c=u=!0,r.position++,ei(r,!0,e))),i=r.line,ag(r,e,nI,!1,!0),p=r.tag,h=r.result,ei(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),ei(r,!0,e),ag(r,e,nI,!1,!0),m=r.result),g?og(r,s,f,p,h,m):c?s.push(og(r,null,f,p,h,m)):s.push(h),ei(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}dt(r,"unexpected end of the stream within a flow collection")}function qhe(r,e){var t,i,n=OQ,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)OQ===n?n=g===43?tK:Rhe:dt(r,"repeat of a chomping mode identifier");else if((u=Mhe(g))>=0)u===0?dt(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?dt(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Cc(g)){do g=r.input.charCodeAt(++r.position);while(Cc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!Lo(g)&&g!==0)}for(;g!==0;){for(MQ(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),Lo(g)){l++;continue}if(r.lineIndente)&&l!==0)dt(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(ag(r,e,sI,!0,n)&&(p?f=r.result:h=r.result),p||(og(r,c,u,g,f,h,s,o),g=f=h=null),ei(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)dt(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):dt(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):dt(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function Vhe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(ei(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&dt(r,"directive name must not be less than one character in length");o!==0;){for(;Cc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!Lo(o));break}if(Lo(o))break;for(t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&MQ(r),JA.call(lK,i)?lK[i](r,i,n):oI(r,'unknown document directive "'+i+'"')}if(ei(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,ei(r,!0,-1)):s&&dt(r,"directives end mark is expected"),ag(r,r.lineIndent-1,sI,!1,!0),ei(r,!0,-1),r.checkLineBreaks&&Nhe.test(r.input.slice(e,r.position))&&oI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&aI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,ei(r,!0,-1));return}if(r.position{"use strict";var ip=hc(),np=tg(),$he=tp(),epe=ig(),dK=Object.prototype.toString,CK=Object.prototype.hasOwnProperty,tpe=9,sp=10,rpe=13,ipe=32,npe=33,spe=34,mK=35,ope=37,ape=38,Ape=39,lpe=42,EK=44,cpe=45,IK=58,upe=61,gpe=62,fpe=63,hpe=64,yK=91,wK=93,ppe=96,BK=123,dpe=124,bK=125,Ki={};Ki[0]="\\0";Ki[7]="\\a";Ki[8]="\\b";Ki[9]="\\t";Ki[10]="\\n";Ki[11]="\\v";Ki[12]="\\f";Ki[13]="\\r";Ki[27]="\\e";Ki[34]='\\"';Ki[92]="\\\\";Ki[133]="\\N";Ki[160]="\\_";Ki[8232]="\\L";Ki[8233]="\\P";var Cpe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function mpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Ag(o))return AI;a=s>0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?kK:PK:t>9&&xK(r)?AI:c?RK:DK}function Spe(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&Cpe.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Ipe(r,l)}switch(Bpe(e,o,r.indent,s,a)){case kK:return e;case PK:return"'"+e.replace(/'/g,"''")+"'";case DK:return"|"+FK(e,r.indent)+NK(SK(e,n));case RK:return">"+FK(e,r.indent)+NK(SK(bpe(e,s),n));case AI:return'"'+Qpe(e,s)+'"';default:throw new np("impossible error: invalid scalar style")}}()}function FK(r,e){var t=xK(r)?String(e):"",i=r[r.length-1]===` -`,n=i&&(r[r.length-2]===` -`||r===` -`),s=n?"+":i?"":"-";return t+s+` -`}function NK(r){return r[r.length-1]===` -`?r.slice(0,-1):r}function bpe(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` -`);return c=c!==-1?c:r.length,t.lastIndex=c,LK(r.slice(0,c),e)}(),n=r[0]===` -`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+LK(l,e),n=s}return i}function LK(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+r.slice(n,s),n=s+1),o=a;return l+=` -`,r.length-n>e&&o>n?l+=r.slice(n,o)+` -`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Qpe(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=QK((t-55296)*1024+i-56320+65536),s++;continue}n=Ki[t],e+=!n&&Ag(t)?r[s]:n||QK(t)}return e}function vpe(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),!!mc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function Ppe(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new np("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&sp===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=HQ(r,e)),!!mc(r,e+1,u,!0,g)&&(r.dump&&sp===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function TK(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function mc(r,e,t,i,n,s){r.tag=null,r.dump=t,TK(r,t,!1)||TK(r,t,!0);var o=dK.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(Ppe(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(kpe(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(xpe(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(vpe(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&Spe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new np("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function Dpe(r,e){var t=[],i=[],n,s;for(GQ(r,t,i),n=0,s=i.length;n{"use strict";var lI=pK(),KK=MK();function cI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Mr.exports.Type=ci();Mr.exports.Schema=pc();Mr.exports.FAILSAFE_SCHEMA=rI();Mr.exports.JSON_SCHEMA=NQ();Mr.exports.CORE_SCHEMA=LQ();Mr.exports.DEFAULT_SAFE_SCHEMA=ig();Mr.exports.DEFAULT_FULL_SCHEMA=tp();Mr.exports.load=lI.load;Mr.exports.loadAll=lI.loadAll;Mr.exports.safeLoad=lI.safeLoad;Mr.exports.safeLoadAll=lI.safeLoadAll;Mr.exports.dump=KK.dump;Mr.exports.safeDump=KK.safeDump;Mr.exports.YAMLException=tg();Mr.exports.MINIMAL_SCHEMA=rI();Mr.exports.SAFE_SCHEMA=ig();Mr.exports.DEFAULT_SCHEMA=tp();Mr.exports.scan=cI("scan");Mr.exports.parse=cI("parse");Mr.exports.compose=cI("compose");Mr.exports.addConstructor=cI("addConstructor")});var jK=w((AXe,HK)=>{"use strict";var Fpe=UK();HK.exports=Fpe});var YK=w((lXe,GK)=>{"use strict";function Npe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ec(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ec)}Npe(Ec,Error);Ec.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[He]:Ce})))},q=function(R){return R},Y=function(R){return R},$=Zs("correct indentation"),_=" ",ne=gr(" ",!1),ee=function(R){return R.length===KA*Ju},A=function(R){return R.length===(KA+1)*Ju},oe=function(){return KA++,!0},ce=function(){return KA--,!0},Z=function(){return Uu()},O=Zs("pseudostring"),L=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,de=qn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Be=/^[^\r\n\t ,\][{}:#"']/,je=qn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),re=function(){return Uu().replace(/^ *| *$/g,"")},se="--",be=gr("--",!1),he=/^[a-zA-Z\/0-9]/,Fe=qn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ke=/^[^\r\n\t :,]/,ke=qn(["\r",` -`," "," ",":",","],!0,!1),ve="null",pe=gr("null",!1),V=function(){return null},Qe="true",le=gr("true",!1),fe=function(){return!0},gt="false",Ht=gr("false",!1),Mt=function(){return!1},Ei=Zs("string"),jt='"',Qr=gr('"',!1),Oi=function(){return""},Xs=function(R){return R},Un=function(R){return R.join("")},Hn=/^[^"\\\0-\x1F\x7F]/,Sr=qn(['"',"\\",["\0",""],"\x7F"],!0,!1),jn='\\"',fs=gr('\\"',!1),ba=function(){return'"'},DA="\\\\",Nu=gr("\\\\",!1),hs=function(){return"\\"},RA="\\/",Qa=gr("\\/",!1),Lu=function(){return"/"},FA="\\b",NA=gr("\\b",!1),vr=function(){return"\b"},zl="\\f",Tu=gr("\\f",!1),xo=function(){return"\f"},Ou="\\n",Sh=gr("\\n",!1),vh=function(){return` -`},Dr="\\r",Ae=gr("\\r",!1),ko=function(){return"\r"},Gn="\\t",Mu=gr("\\t",!1),St=function(){return" "},_l="\\u",Yn=gr("\\u",!1),ps=function(R,G,Ce,He){return String.fromCharCode(parseInt(`0x${R}${G}${Ce}${He}`))},ds=/^[0-9a-fA-F]/,pt=qn([["0","9"],["a","f"],["A","F"]],!1,!1),Po=Zs("blank space"),lt=/^[ \t]/,mn=qn([" "," "],!1,!1),S=Zs("white space"),Tt=/^[ \t\n\r]/,Ku=qn([" "," ",` -`,"\r"],!1,!1),Vl=`\r -`,xh=gr(`\r -`,!1),kh=` -`,Ph=gr(` -`,!1),Dh="\r",Rh=gr("\r",!1),j=0,wt=0,LA=[{line:1,column:1}],$i=0,Xl=[],$e=0,Sa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Uu(){return r.substring(wt,j)}function yE(){return En(wt,j)}function Fh(R,G){throw G=G!==void 0?G:En(wt,j),$l([Zs(R)],r.substring(wt,j),G)}function wE(R,G){throw G=G!==void 0?G:En(wt,j),Hu(R,G)}function gr(R,G){return{type:"literal",text:R,ignoreCase:G}}function qn(R,G,Ce){return{type:"class",parts:R,inverted:G,ignoreCase:Ce}}function Zl(){return{type:"any"}}function Nh(){return{type:"end"}}function Zs(R){return{type:"other",description:R}}function va(R){var G=LA[R],Ce;if(G)return G;for(Ce=R-1;!LA[Ce];)Ce--;for(G=LA[Ce],G={line:G.line,column:G.column};Ce$i&&($i=j,Xl=[]),Xl.push(R))}function Hu(R,G){return new Ec(R,null,null,G)}function $l(R,G,Ce){return new Ec(Ec.buildMessage(R,G),R,G,Ce)}function $s(){var R;return R=ju(),R}function ec(){var R,G,Ce;for(R=j,G=[],Ce=TA();Ce!==t;)G.push(Ce),Ce=TA();return G!==t&&(wt=R,G=s(G)),R=G,R}function TA(){var R,G,Ce,He,Te;return R=j,G=ka(),G!==t?(r.charCodeAt(j)===45?(Ce=o,j++):(Ce=t,$e===0&&Oe(a)),Ce!==t?(He=Tr(),He!==t?(Te=xa(),Te!==t?(wt=R,G=l(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R}function ju(){var R,G,Ce;for(R=j,G=[],Ce=Gu();Ce!==t;)G.push(Ce),Ce=Gu();return G!==t&&(wt=R,G=c(G)),R=G,R}function Gu(){var R,G,Ce,He,Te,Xe,Et,Rt,Jn;if(R=j,G=Tr(),G===t&&(G=null),G!==t){if(Ce=j,r.charCodeAt(j)===35?(He=u,j++):(He=t,$e===0&&Oe(g)),He!==t){if(Te=[],Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t),Xe!==t)for(;Xe!==t;)Te.push(Xe),Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t);else Te=t;Te!==t?(He=[He,Te],Ce=He):(j=Ce,Ce=t)}else j=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(He=[],Te=to(),Te!==t)for(;Te!==t;)He.push(Te),Te=to();else He=t;He!==t?(wt=R,G=h(),R=G):(j=R,R=t)}else j=R,R=t}else j=R,R=t;if(R===t&&(R=j,G=ka(),G!==t?(Ce=tc(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ka(),G!==t?(Ce=eo(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))){if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t)if(He=Tr(),He!==t)if(Te=BE(),Te!==t){if(Xe=[],Et=to(),Et!==t)for(;Et!==t;)Xe.push(Et),Et=to();else Xe=t;Xe!==t?(wt=R,G=y(Ce,Te),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;else j=R,R=t;else j=R,R=t;if(R===t)if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t){if(He=[],Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t),Te!==t)for(;Te!==t;)He.push(Te),Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t);else He=t;He!==t?(Te=Tr(),Te===t&&(Te=null),Te!==t?(r.charCodeAt(j)===58?(Xe=p,j++):(Xe=t,$e===0&&Oe(m)),Xe!==t?(Et=Tr(),Et===t&&(Et=null),Et!==t?(Rt=xa(),Rt!==t?(wt=R,G=T(Ce,He,Rt),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)}else j=R,R=t;else j=R,R=t}return R}function xa(){var R,G,Ce,He,Te,Xe,Et;if(R=j,G=j,$e++,Ce=j,He=ro(),He!==t?(Te=nt(),Te!==t?(r.charCodeAt(j)===45?(Xe=o,j++):(Xe=t,$e===0&&Oe(a)),Xe!==t?(Et=Tr(),Et!==t?(He=[He,Te,Xe,Et],Ce=He):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t),$e--,Ce!==t?(j=G,G=void 0):G=t,G!==t?(Ce=to(),Ce!==t?(He=Do(),He!==t?(Te=ec(),Te!==t?(Xe=OA(),Xe!==t?(wt=R,G=q(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ro(),G!==t?(Ce=Do(),Ce!==t?(He=ju(),He!==t?(Te=OA(),Te!==t?(wt=R,G=q(He),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))if(R=j,G=rc(),G!==t){if(Ce=[],He=to(),He!==t)for(;He!==t;)Ce.push(He),He=to();else Ce=t;Ce!==t?(wt=R,G=Y(G),R=G):(j=R,R=t)}else j=R,R=t;return R}function ka(){var R,G,Ce;for($e++,R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=ee(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),$e--,R===t&&(G=t,$e===0&&Oe($)),R}function nt(){var R,G,Ce;for(R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=A(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),R}function Do(){var R;return wt=j,R=oe(),R?R=void 0:R=t,R}function OA(){var R;return wt=j,R=ce(),R?R=void 0:R=t,R}function tc(){var R;return R=ic(),R===t&&(R=Lh()),R}function eo(){var R,G,Ce;if(R=ic(),R===t){if(R=j,G=[],Ce=Yu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=Yu();else G=t;G!==t&&(wt=R,G=Z()),R=G}return R}function rc(){var R;return R=Th(),R===t&&(R=bE(),R===t&&(R=ic(),R===t&&(R=Lh()))),R}function BE(){var R;return R=Th(),R===t&&(R=ic(),R===t&&(R=Yu())),R}function Lh(){var R,G,Ce,He,Te,Xe;if($e++,R=j,L.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(de)),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;return $e--,R===t&&(G=t,$e===0&&Oe(O)),R}function Yu(){var R,G,Ce,He,Te;if(R=j,r.substr(j,2)===se?(G=se,j+=2):(G=t,$e===0&&Oe(be)),G===t&&(G=null),G!==t)if(he.test(r.charAt(j))?(Ce=r.charAt(j),j++):(Ce=t,$e===0&&Oe(Fe)),Ce!==t){for(He=[],Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));Te!==t;)He.push(Te),Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));He!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;return R}function Th(){var R,G;return R=j,r.substr(j,4)===ve?(G=ve,j+=4):(G=t,$e===0&&Oe(pe)),G!==t&&(wt=R,G=V()),R=G,R}function bE(){var R,G;return R=j,r.substr(j,4)===Qe?(G=Qe,j+=4):(G=t,$e===0&&Oe(le)),G!==t&&(wt=R,G=fe()),R=G,R===t&&(R=j,r.substr(j,5)===gt?(G=gt,j+=5):(G=t,$e===0&&Oe(Ht)),G!==t&&(wt=R,G=Mt()),R=G),R}function ic(){var R,G,Ce,He;return $e++,R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(r.charCodeAt(j)===34?(Ce=jt,j++):(Ce=t,$e===0&&Oe(Qr)),Ce!==t?(wt=R,G=Oi(),R=G):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(Ce=QE(),Ce!==t?(r.charCodeAt(j)===34?(He=jt,j++):(He=t,$e===0&&Oe(Qr)),He!==t?(wt=R,G=Xs(Ce),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)),$e--,R===t&&(G=t,$e===0&&Oe(Ei)),R}function QE(){var R,G,Ce;if(R=j,G=[],Ce=qu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=qu();else G=t;return G!==t&&(wt=R,G=Un(G)),R=G,R}function qu(){var R,G,Ce,He,Te,Xe;return Hn.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(Sr)),R===t&&(R=j,r.substr(j,2)===jn?(G=jn,j+=2):(G=t,$e===0&&Oe(fs)),G!==t&&(wt=R,G=ba()),R=G,R===t&&(R=j,r.substr(j,2)===DA?(G=DA,j+=2):(G=t,$e===0&&Oe(Nu)),G!==t&&(wt=R,G=hs()),R=G,R===t&&(R=j,r.substr(j,2)===RA?(G=RA,j+=2):(G=t,$e===0&&Oe(Qa)),G!==t&&(wt=R,G=Lu()),R=G,R===t&&(R=j,r.substr(j,2)===FA?(G=FA,j+=2):(G=t,$e===0&&Oe(NA)),G!==t&&(wt=R,G=vr()),R=G,R===t&&(R=j,r.substr(j,2)===zl?(G=zl,j+=2):(G=t,$e===0&&Oe(Tu)),G!==t&&(wt=R,G=xo()),R=G,R===t&&(R=j,r.substr(j,2)===Ou?(G=Ou,j+=2):(G=t,$e===0&&Oe(Sh)),G!==t&&(wt=R,G=vh()),R=G,R===t&&(R=j,r.substr(j,2)===Dr?(G=Dr,j+=2):(G=t,$e===0&&Oe(Ae)),G!==t&&(wt=R,G=ko()),R=G,R===t&&(R=j,r.substr(j,2)===Gn?(G=Gn,j+=2):(G=t,$e===0&&Oe(Mu)),G!==t&&(wt=R,G=St()),R=G,R===t&&(R=j,r.substr(j,2)===_l?(G=_l,j+=2):(G=t,$e===0&&Oe(Yn)),G!==t?(Ce=MA(),Ce!==t?(He=MA(),He!==t?(Te=MA(),Te!==t?(Xe=MA(),Xe!==t?(wt=R,G=ps(Ce,He,Te,Xe),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)))))))))),R}function MA(){var R;return ds.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(pt)),R}function Tr(){var R,G;if($e++,R=[],lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn)),G!==t)for(;G!==t;)R.push(G),lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(Po)),R}function SE(){var R,G;if($e++,R=[],Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku)),G!==t)for(;G!==t;)R.push(G),Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(S)),R}function to(){var R,G,Ce,He,Te,Xe;if(R=j,G=ro(),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)}else j=R,R=t;return R}function ro(){var R;return r.substr(j,2)===Vl?(R=Vl,j+=2):(R=t,$e===0&&Oe(xh)),R===t&&(r.charCodeAt(j)===10?(R=kh,j++):(R=t,$e===0&&Oe(Ph)),R===t&&(r.charCodeAt(j)===13?(R=Dh,j++):(R=t,$e===0&&Oe(Rh)))),R}let Ju=2,KA=0;if(Sa=n(),Sa!==t&&j===r.length)return Sa;throw Sa!==t&&j{"use strict";var Upe=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=Upe(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};JQ.exports=_K;JQ.exports.default=_K});var ZK=w((pXe,XK)=>{XK.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Ic=w(Xn=>{"use strict";var $K=ZK(),To=process.env;Object.defineProperty(Xn,"_vendors",{value:$K.map(function(r){return r.constant})});Xn.name=null;Xn.isPR=null;$K.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return eU(i)});if(Xn[r.constant]=t,t)switch(Xn.name=r.name,typeof r.pr){case"string":Xn.isPR=!!To[r.pr];break;case"object":"env"in r.pr?Xn.isPR=r.pr.env in To&&To[r.pr.env]!==r.pr.ne:"any"in r.pr?Xn.isPR=r.pr.any.some(function(i){return!!To[i]}):Xn.isPR=eU(r.pr);break;default:Xn.isPR=null}});Xn.isCI=!!(To.CI||To.CONTINUOUS_INTEGRATION||To.BUILD_NUMBER||To.RUN_ID||Xn.name);function eU(r){return typeof r=="string"?!!To[r]:Object.keys(r).every(function(e){return To[e]===r[e]})}});var cg={};ft(cg,{KeyRelationship:()=>Bc,applyCascade:()=>fp,base64RegExp:()=>sU,colorStringAlphaRegExp:()=>nU,colorStringRegExp:()=>iU,computeKey:()=>zA,getPrintable:()=>ti,hasExactLength:()=>cU,hasForbiddenKeys:()=>mde,hasKeyRelationship:()=>eS,hasMaxLength:()=>tde,hasMinLength:()=>ede,hasMutuallyExclusiveKeys:()=>Ede,hasRequiredKeys:()=>Cde,hasUniqueItems:()=>rde,isArray:()=>Jpe,isAtLeast:()=>sde,isAtMost:()=>ode,isBase64:()=>pde,isBoolean:()=>Gpe,isDate:()=>qpe,isDict:()=>zpe,isEnum:()=>nn,isHexColor:()=>hde,isISO8601:()=>fde,isInExclusiveRange:()=>Ade,isInInclusiveRange:()=>ade,isInstanceOf:()=>Vpe,isInteger:()=>lde,isJSON:()=>dde,isLiteral:()=>Hpe,isLowerCase:()=>cde,isNegative:()=>ide,isNullable:()=>$pe,isNumber:()=>Ype,isObject:()=>_pe,isOneOf:()=>Xpe,isOptional:()=>Zpe,isPositive:()=>nde,isString:()=>gp,isTuple:()=>Wpe,isUUID4:()=>gde,isUnknown:()=>lU,isUpperCase:()=>ude,iso8601RegExp:()=>$Q,makeCoercionFn:()=>wc,makeSetter:()=>AU,makeTrait:()=>aU,makeValidator:()=>vt,matchesRegExp:()=>hp,plural:()=>hI,pushError:()=>mt,simpleKeyRegExp:()=>rU,uuid4RegExp:()=>oU});function vt({test:r}){return aU(r)()}function ti(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function zA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:rU.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function wc(r,e){return t=>{let i=r[e];return r[e]=t,wc(r,e).bind(null,i)}}function AU(r,e){return t=>{r[e]=t}}function hI(r,e,t){return r===1?e:t}function mt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function Hpe(r){return vt({test:(e,t)=>e!==r?mt(t,`Expected a literal (got ${ti(r)})`):!0})}function nn(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return vt({test:(i,n)=>t.has(i)?!0:mt(n,`Expected a valid enumeration value (got ${ti(i)})`)})}var rU,iU,nU,sU,oU,$Q,aU,lU,gp,jpe,Gpe,Ype,qpe,Jpe,Wpe,zpe,_pe,Vpe,Xpe,fp,Zpe,$pe,ede,tde,cU,rde,ide,nde,sde,ode,ade,Ade,lde,hp,cde,ude,gde,fde,hde,pde,dde,Cde,mde,Ede,Bc,Ide,eS,ys=uge(()=>{rU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,iU=/^#[0-9a-f]{6}$/i,nU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,sU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,oU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,$Q=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,aU=r=>()=>r;lU=()=>vt({test:(r,e)=>!0});gp=()=>vt({test:(r,e)=>typeof r!="string"?mt(e,`Expected a string (got ${ti(r)})`):!0});jpe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Gpe=()=>vt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i=jpe.get(r);if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a boolean (got ${ti(r)})`)}return!0}}),Ype=()=>vt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return mt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a number (got ${ti(r)})`)}return!0}}),qpe=()=>vt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"&&$Q.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch(o){}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return mt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a date (got ${ti(r)})`)}return!0}}),Jpe=(r,{delimiter:e}={})=>vt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return mt(i,`Expected an array (got ${ti(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=cU(r.length);return vt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return mt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return mt(n,`Expected a tuple (got ${ti(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;avt({test:(t,i)=>{if(typeof t!="object"||t===null)return mt(i,`Expected an object (got ${ti(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return vt({test:(i,n)=>{if(typeof i!="object"||i===null)return mt(n,`Expected an object (got ${ti(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:zA(n,l),coercion:wc(i,l)}))&&a:e===null?a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),`Extraneous property (got ${ti(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:AU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Vpe=r=>vt({test:(e,t)=>e instanceof r?!0:mt(t,`Expected an instance of ${r.name} (got ${ti(e)})`)}),Xpe=(r,{exclusive:e=!1}={})=>vt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=r.length;c1?mt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),fp=(r,e)=>vt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)!="undefined"?wc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Zpe=r=>vt({test:(e,t)=>typeof e=="undefined"?!0:r(e,t)}),$pe=r=>vt({test:(e,t)=>e===null?!0:r(e,t)}),ede=r=>vt({test:(e,t)=>e.length>=r?!0:mt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),tde=r=>vt({test:(e,t)=>e.length<=r?!0:mt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),cU=r=>vt({test:(e,t)=>e.length!==r?mt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),rde=({map:r}={})=>vt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;svt({test:(r,e)=>r<=0?!0:mt(e,`Expected to be negative (got ${r})`)}),nde=()=>vt({test:(r,e)=>r>=0?!0:mt(e,`Expected to be positive (got ${r})`)}),sde=r=>vt({test:(e,t)=>e>=r?!0:mt(t,`Expected to be at least ${r} (got ${e})`)}),ode=r=>vt({test:(e,t)=>e<=r?!0:mt(t,`Expected to be at most ${r} (got ${e})`)}),ade=(r,e)=>vt({test:(t,i)=>t>=r&&t<=e?!0:mt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Ade=(r,e)=>vt({test:(t,i)=>t>=r&&tvt({test:(e,t)=>e!==Math.round(e)?mt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:mt(t,`Expected to be a safe integer (got ${e})`)}),hp=r=>vt({test:(e,t)=>r.test(e)?!0:mt(t,`Expected to match the pattern ${r.toString()} (got ${ti(e)})`)}),cde=()=>vt({test:(r,e)=>r!==r.toLowerCase()?mt(e,`Expected to be all-lowercase (got ${r})`):!0}),ude=()=>vt({test:(r,e)=>r!==r.toUpperCase()?mt(e,`Expected to be all-uppercase (got ${r})`):!0}),gde=()=>vt({test:(r,e)=>oU.test(r)?!0:mt(e,`Expected to be a valid UUID v4 (got ${ti(r)})`)}),fde=()=>vt({test:(r,e)=>$Q.test(r)?!1:mt(e,`Expected to be a valid ISO 8601 date string (got ${ti(r)})`)}),hde=({alpha:r=!1})=>vt({test:(e,t)=>(r?iU.test(e):nU.test(e))?!0:mt(t,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)}),pde=()=>vt({test:(r,e)=>sU.test(r)?!0:mt(e,`Expected to be a valid base 64 string (got ${ti(r)})`)}),dde=(r=lU())=>vt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch(n){return mt(t,`Expected to be a valid JSON string (got ${ti(e)})`)}return r(i,t)}}),Cde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?mt(i,`Missing required ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},mde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?mt(i,`Forbidden ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Ede=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?mt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(Bc||(Bc={}));Ide={[Bc.Forbids]:{expect:!1,message:"forbids using"},[Bc.Requires]:{expect:!0,message:"requires using"}},eS=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=Ide[e];return vt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?mt(l,`Property "${r}" ${o.message} ${hI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var kU=w((dZe,xU)=>{"use strict";xU.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var gg=w((CZe,aS)=>{"use strict";var Ode=kU(),PU=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Ode(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};aS.exports=PU;aS.exports.default=PU});var mp=w((EZe,DU)=>{var Mde="2.0.0",Kde=256,Ude=Number.MAX_SAFE_INTEGER||9007199254740991,Hde=16;DU.exports={SEMVER_SPEC_VERSION:Mde,MAX_LENGTH:Kde,MAX_SAFE_INTEGER:Ude,MAX_SAFE_COMPONENT_LENGTH:Hde}});var Ep=w((IZe,RU)=>{var jde=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};RU.exports=jde});var bc=w((VA,FU)=>{var{MAX_SAFE_COMPONENT_LENGTH:AS}=mp(),Gde=Ep();VA=FU.exports={};var Yde=VA.re=[],rt=VA.src=[],it=VA.t={},qde=0,xt=(r,e,t)=>{let i=qde++;Gde(i,e),it[r]=i,rt[i]=e,Yde[i]=new RegExp(e,t?"g":void 0)};xt("NUMERICIDENTIFIER","0|[1-9]\\d*");xt("NUMERICIDENTIFIERLOOSE","[0-9]+");xt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");xt("MAINVERSION",`(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})`);xt("MAINVERSIONLOOSE",`(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})`);xt("PRERELEASEIDENTIFIER",`(?:${rt[it.NUMERICIDENTIFIER]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASEIDENTIFIERLOOSE",`(?:${rt[it.NUMERICIDENTIFIERLOOSE]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASE",`(?:-(${rt[it.PRERELEASEIDENTIFIER]}(?:\\.${rt[it.PRERELEASEIDENTIFIER]})*))`);xt("PRERELEASELOOSE",`(?:-?(${rt[it.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${rt[it.PRERELEASEIDENTIFIERLOOSE]})*))`);xt("BUILDIDENTIFIER","[0-9A-Za-z-]+");xt("BUILD",`(?:\\+(${rt[it.BUILDIDENTIFIER]}(?:\\.${rt[it.BUILDIDENTIFIER]})*))`);xt("FULLPLAIN",`v?${rt[it.MAINVERSION]}${rt[it.PRERELEASE]}?${rt[it.BUILD]}?`);xt("FULL",`^${rt[it.FULLPLAIN]}$`);xt("LOOSEPLAIN",`[v=\\s]*${rt[it.MAINVERSIONLOOSE]}${rt[it.PRERELEASELOOSE]}?${rt[it.BUILD]}?`);xt("LOOSE",`^${rt[it.LOOSEPLAIN]}$`);xt("GTLT","((?:<|>)?=?)");xt("XRANGEIDENTIFIERLOOSE",`${rt[it.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);xt("XRANGEIDENTIFIER",`${rt[it.NUMERICIDENTIFIER]}|x|X|\\*`);xt("XRANGEPLAIN",`[v=\\s]*(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:${rt[it.PRERELEASE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGEPLAINLOOSE",`[v=\\s]*(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:${rt[it.PRERELEASELOOSE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAIN]}$`);xt("XRANGELOOSE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAINLOOSE]}$`);xt("COERCE",`(^|[^\\d])(\\d{1,${AS}})(?:\\.(\\d{1,${AS}}))?(?:\\.(\\d{1,${AS}}))?(?:$|[^\\d])`);xt("COERCERTL",rt[it.COERCE],!0);xt("LONETILDE","(?:~>?)");xt("TILDETRIM",`(\\s*)${rt[it.LONETILDE]}\\s+`,!0);VA.tildeTrimReplace="$1~";xt("TILDE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAIN]}$`);xt("TILDELOOSE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("LONECARET","(?:\\^)");xt("CARETTRIM",`(\\s*)${rt[it.LONECARET]}\\s+`,!0);VA.caretTrimReplace="$1^";xt("CARET",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAIN]}$`);xt("CARETLOOSE",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("COMPARATORLOOSE",`^${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]})$|^$`);xt("COMPARATOR",`^${rt[it.GTLT]}\\s*(${rt[it.FULLPLAIN]})$|^$`);xt("COMPARATORTRIM",`(\\s*)${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]}|${rt[it.XRANGEPLAIN]})`,!0);VA.comparatorTrimReplace="$1$2$3";xt("HYPHENRANGE",`^\\s*(${rt[it.XRANGEPLAIN]})\\s+-\\s+(${rt[it.XRANGEPLAIN]})\\s*$`);xt("HYPHENRANGELOOSE",`^\\s*(${rt[it.XRANGEPLAINLOOSE]})\\s+-\\s+(${rt[it.XRANGEPLAINLOOSE]})\\s*$`);xt("STAR","(<|>)?=?\\s*\\*");xt("GTE0","^\\s*>=\\s*0.0.0\\s*$");xt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var Ip=w((yZe,NU)=>{var Jde=["includePrerelease","loose","rtl"],Wde=r=>r?typeof r!="object"?{loose:!0}:Jde.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};NU.exports=Wde});var yI=w((wZe,LU)=>{var TU=/^[0-9]+$/,OU=(r,e)=>{let t=TU.test(r),i=TU.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rOU(e,r);LU.exports={compareIdentifiers:OU,rcompareIdentifiers:zde}});var Hi=w((BZe,MU)=>{var wI=Ep(),{MAX_LENGTH:KU,MAX_SAFE_INTEGER:BI}=mp(),{re:UU,t:HU}=bc(),_de=Ip(),{compareIdentifiers:yp}=yI(),Bs=class{constructor(e,t){if(t=_de(t),e instanceof Bs){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>KU)throw new TypeError(`version is longer than ${KU} characters`);wI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?UU[HU.LOOSE]:UU[HU.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>BI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>BI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>BI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};MU.exports=Bs});var Qc=w((bZe,jU)=>{var{MAX_LENGTH:Vde}=mp(),{re:GU,t:YU}=bc(),qU=Hi(),Xde=Ip(),Zde=(r,e)=>{if(e=Xde(e),r instanceof qU)return r;if(typeof r!="string"||r.length>Vde||!(e.loose?GU[YU.LOOSE]:GU[YU.FULL]).test(r))return null;try{return new qU(r,e)}catch(i){return null}};jU.exports=Zde});var WU=w((QZe,JU)=>{var $de=Qc(),eCe=(r,e)=>{let t=$de(r,e);return t?t.version:null};JU.exports=eCe});var _U=w((SZe,zU)=>{var tCe=Qc(),rCe=(r,e)=>{let t=tCe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};zU.exports=rCe});var XU=w((vZe,VU)=>{var iCe=Hi(),nCe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new iCe(r,t).inc(e,i).version}catch(n){return null}};VU.exports=nCe});var bs=w((xZe,ZU)=>{var $U=Hi(),sCe=(r,e,t)=>new $U(r,t).compare(new $U(e,t));ZU.exports=sCe});var bI=w((kZe,e2)=>{var oCe=bs(),aCe=(r,e,t)=>oCe(r,e,t)===0;e2.exports=aCe});var i2=w((PZe,t2)=>{var r2=Qc(),ACe=bI(),lCe=(r,e)=>{if(ACe(r,e))return null;{let t=r2(r),i=r2(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};t2.exports=lCe});var s2=w((DZe,n2)=>{var cCe=Hi(),uCe=(r,e)=>new cCe(r,e).major;n2.exports=uCe});var a2=w((RZe,o2)=>{var gCe=Hi(),fCe=(r,e)=>new gCe(r,e).minor;o2.exports=fCe});var l2=w((FZe,A2)=>{var hCe=Hi(),pCe=(r,e)=>new hCe(r,e).patch;A2.exports=pCe});var u2=w((NZe,c2)=>{var dCe=Qc(),CCe=(r,e)=>{let t=dCe(r,e);return t&&t.prerelease.length?t.prerelease:null};c2.exports=CCe});var f2=w((LZe,g2)=>{var mCe=bs(),ECe=(r,e,t)=>mCe(e,r,t);g2.exports=ECe});var p2=w((TZe,h2)=>{var ICe=bs(),yCe=(r,e)=>ICe(r,e,!0);h2.exports=yCe});var QI=w((OZe,d2)=>{var C2=Hi(),wCe=(r,e,t)=>{let i=new C2(r,t),n=new C2(e,t);return i.compare(n)||i.compareBuild(n)};d2.exports=wCe});var E2=w((MZe,m2)=>{var BCe=QI(),bCe=(r,e)=>r.sort((t,i)=>BCe(t,i,e));m2.exports=bCe});var y2=w((KZe,I2)=>{var QCe=QI(),SCe=(r,e)=>r.sort((t,i)=>QCe(i,t,e));I2.exports=SCe});var wp=w((UZe,w2)=>{var vCe=bs(),xCe=(r,e,t)=>vCe(r,e,t)>0;w2.exports=xCe});var SI=w((HZe,B2)=>{var kCe=bs(),PCe=(r,e,t)=>kCe(r,e,t)<0;B2.exports=PCe});var lS=w((jZe,b2)=>{var DCe=bs(),RCe=(r,e,t)=>DCe(r,e,t)!==0;b2.exports=RCe});var vI=w((GZe,Q2)=>{var FCe=bs(),NCe=(r,e,t)=>FCe(r,e,t)>=0;Q2.exports=NCe});var xI=w((YZe,S2)=>{var LCe=bs(),TCe=(r,e,t)=>LCe(r,e,t)<=0;S2.exports=TCe});var cS=w((qZe,v2)=>{var OCe=bI(),MCe=lS(),KCe=wp(),UCe=vI(),HCe=SI(),jCe=xI(),GCe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return OCe(r,t,i);case"!=":return MCe(r,t,i);case">":return KCe(r,t,i);case">=":return UCe(r,t,i);case"<":return HCe(r,t,i);case"<=":return jCe(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};v2.exports=GCe});var k2=w((JZe,x2)=>{var YCe=Hi(),qCe=Qc(),{re:kI,t:PI}=bc(),JCe=(r,e)=>{if(r instanceof YCe)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(kI[PI.COERCE]);else{let i;for(;(i=kI[PI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),kI[PI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;kI[PI.COERCERTL].lastIndex=-1}return t===null?null:qCe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};x2.exports=JCe});var D2=w((WZe,P2)=>{"use strict";P2.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Bp=w((zZe,R2)=>{"use strict";R2.exports=Gt;Gt.Node=Sc;Gt.create=Gt;function Gt(r){var e=this;if(e instanceof Gt||(e=new Gt),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Gt.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Gt.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Gt.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Gt.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Gt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Gt.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var VCe=Bp(),vc=Symbol("max"),Ua=Symbol("length"),fg=Symbol("lengthCalculator"),bp=Symbol("allowStale"),xc=Symbol("maxAge"),Ha=Symbol("dispose"),N2=Symbol("noDisposeOnSet"),yi=Symbol("lruList"),oo=Symbol("cache"),L2=Symbol("updateAgeOnGet"),uS=()=>1,T2=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[vc]=e.max||Infinity,i=e.length||uS;if(this[fg]=typeof i!="function"?uS:i,this[bp]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[xc]=e.maxAge||0,this[Ha]=e.dispose,this[N2]=e.noDisposeOnSet||!1,this[L2]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[vc]=e||Infinity,Qp(this)}get max(){return this[vc]}set allowStale(e){this[bp]=!!e}get allowStale(){return this[bp]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[xc]=e,Qp(this)}get maxAge(){return this[xc]}set lengthCalculator(e){typeof e!="function"&&(e=uS),e!==this[fg]&&(this[fg]=e,this[Ua]=0,this[yi].forEach(t=>{t.length=this[fg](t.value,t.key),this[Ua]+=t.length})),Qp(this)}get lengthCalculator(){return this[fg]}get length(){return this[Ua]}get itemCount(){return this[yi].length}rforEach(e,t){t=t||this;for(let i=this[yi].tail;i!==null;){let n=i.prev;M2(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[yi].head;i!==null;){let n=i.next;M2(this,e,i,t),i=n}}keys(){return this[yi].toArray().map(e=>e.key)}values(){return this[yi].toArray().map(e=>e.value)}reset(){this[Ha]&&this[yi]&&this[yi].length&&this[yi].forEach(e=>this[Ha](e.key,e.value)),this[oo]=new Map,this[yi]=new VCe,this[Ua]=0}dump(){return this[yi].map(e=>DI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[yi]}set(e,t,i){if(i=i||this[xc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[fg](t,e);if(this[oo].has(e)){if(s>this[vc])return hg(this,this[oo].get(e)),!1;let l=this[oo].get(e).value;return this[Ha]&&(this[N2]||this[Ha](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Ua]+=s-l.length,l.length=s,this.get(e),Qp(this),!0}let o=new O2(e,t,s,n,i);return o.length>this[vc]?(this[Ha]&&this[Ha](e,t),!1):(this[Ua]+=o.length,this[yi].unshift(o),this[oo].set(e,this[yi].head),Qp(this),!0)}has(e){if(!this[oo].has(e))return!1;let t=this[oo].get(e).value;return!DI(this,t)}get(e){return gS(this,e,!0)}peek(e){return gS(this,e,!1)}pop(){let e=this[yi].tail;return e?(hg(this,e),e.value):null}del(e){hg(this,this[oo].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[oo].forEach((e,t)=>gS(this,t,!1))}},gS=(r,e,t)=>{let i=r[oo].get(e);if(i){let n=i.value;if(DI(r,n)){if(hg(r,i),!r[bp])return}else t&&(r[L2]&&(i.value.now=Date.now()),r[yi].unshiftNode(i));return n.value}},DI=(r,e)=>{if(!e||!e.maxAge&&!r[xc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[xc]&&t>r[xc]},Qp=r=>{if(r[Ua]>r[vc])for(let e=r[yi].tail;r[Ua]>r[vc]&&e!==null;){let t=e.prev;hg(r,e),e=t}},hg=(r,e)=>{if(e){let t=e.value;r[Ha]&&r[Ha](t.key,t.value),r[Ua]-=t.length,r[oo].delete(t.key),r[yi].removeNode(e)}},O2=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},M2=(r,e,t,i)=>{let n=t.value;DI(r,n)&&(hg(r,t),r[bp]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};F2.exports=T2});var Qs=w((VZe,U2)=>{var pg=class{constructor(e,t){if(t=XCe(t),e instanceof pg)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new pg(e.raw,t);if(e instanceof fS)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!j2(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&rme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=H2.get(i);if(n)return n;let s=this.options.loose,o=s?ji[ki.HYPHENRANGELOOSE]:ji[ki.HYPHENRANGE];e=e.replace(o,sme(this.options.includePrerelease)),zr("hyphen replace",e),e=e.replace(ji[ki.COMPARATORTRIM],$Ce),zr("comparator trim",e,ji[ki.COMPARATORTRIM]),e=e.replace(ji[ki.TILDETRIM],eme),e=e.replace(ji[ki.CARETTRIM],tme),e=e.split(/\s+/).join(" ");let a=s?ji[ki.COMPARATORLOOSE]:ji[ki.COMPARATOR],l=e.split(" ").map(f=>ime(f,this.options)).join(" ").split(/\s+/).map(f=>nme(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new fS(f,this.options)),c=l.length,u=new Map;for(let f of l){if(j2(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return H2.set(i,g),g}intersects(e,t){if(!(e instanceof pg))throw new TypeError("a Range is required");return this.set.some(i=>G2(i,t)&&e.set.some(n=>G2(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new ZCe(e,this.options)}catch(t){return!1}for(let t=0;tr.value==="<0.0.0-0",rme=r=>r.value==="",G2=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},ime=(r,e)=>(zr("comp",r,e),r=lme(r,e),zr("caret",r),r=Ame(r,e),zr("tildes",r),r=cme(r,e),zr("xrange",r),r=ume(r,e),zr("stars",r),r),on=r=>!r||r.toLowerCase()==="x"||r==="*",Ame=(r,e)=>r.trim().split(/\s+/).map(t=>gme(t,e)).join(" "),gme=(r,e)=>{let t=e.loose?ji[ki.TILDELOOSE]:ji[ki.TILDE];return r.replace(t,(i,n,s,o,a)=>{zr("tilde",r,i,n,s,o,a);let l;return on(n)?l="":on(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:on(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(zr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,zr("tilde return",l),l})},lme=(r,e)=>r.trim().split(/\s+/).map(t=>fme(t,e)).join(" "),fme=(r,e)=>{zr("caret",r,e);let t=e.loose?ji[ki.CARETLOOSE]:ji[ki.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{zr("caret",r,n,s,o,a,l);let c;return on(s)?c="":on(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:on(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(zr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(zr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),zr("caret return",c),c})},cme=(r,e)=>(zr("replaceXRanges",r,e),r.split(/\s+/).map(t=>hme(t,e)).join(" ")),hme=(r,e)=>{r=r.trim();let t=e.loose?ji[ki.XRANGELOOSE]:ji[ki.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{zr("xRange",r,i,n,s,o,a,l);let c=on(s),u=c||on(o),g=u||on(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),zr("xRange return",i),i})},ume=(r,e)=>(zr("replaceStars",r,e),r.trim().replace(ji[ki.STAR],"")),nme=(r,e)=>(zr("replaceGTE0",r,e),r.trim().replace(ji[e.includePrerelease?ki.GTE0PRE:ki.GTE0],"")),sme=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(on(i)?t="":on(n)?t=`>=${i}.0.0${r?"-0":""}`:on(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,on(c)?l="":on(u)?l=`<${+c+1}.0.0-0`:on(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),ome=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Sp=w((XZe,Y2)=>{var vp=Symbol("SemVer ANY"),xp=class{static get ANY(){return vp}constructor(e,t){if(t=pme(t),e instanceof xp){if(e.loose===!!t.loose)return e;e=e.value}pS("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===vp?this.value="":this.value=this.operator+this.semver.version,pS("comp",this)}parse(e){let t=this.options.loose?q2[J2.COMPARATORLOOSE]:q2[J2.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new W2(i[2],this.options.loose):this.semver=vp}toString(){return this.value}test(e){if(pS("Comparator.test",e,this.options.loose),this.semver===vp||e===vp)return!0;if(typeof e=="string")try{e=new W2(e,this.options)}catch(t){return!1}return hS(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof xp))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new z2(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new z2(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=hS(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=hS(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};Y2.exports=xp;var pme=Ip(),{re:q2,t:J2}=bc(),hS=cS(),pS=Ep(),W2=Hi(),z2=Qs()});var kp=w((ZZe,_2)=>{var dme=Qs(),Cme=(r,e,t)=>{try{e=new dme(e,t)}catch(i){return!1}return e.test(r)};_2.exports=Cme});var X2=w(($Ze,V2)=>{var mme=Qs(),Eme=(r,e)=>new mme(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));V2.exports=Eme});var $2=w((e$e,Z2)=>{var Ime=Hi(),yme=Qs(),wme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new yme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new Ime(i,t))}),i};Z2.exports=wme});var tH=w((t$e,eH)=>{var Bme=Hi(),bme=Qs(),Qme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new bme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Bme(i,t))}),i};eH.exports=Qme});var nH=w((r$e,rH)=>{var dS=Hi(),Sme=Qs(),iH=wp(),vme=(r,e)=>{r=new Sme(r,e);let t=new dS("0.0.0");if(r.test(t)||(t=new dS("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new dS(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||iH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||iH(t,s))&&(t=s)}return t&&r.test(t)?t:null};rH.exports=vme});var oH=w((i$e,sH)=>{var xme=Qs(),kme=(r,e)=>{try{return new xme(r,e).range||"*"}catch(t){return null}};sH.exports=kme});var RI=w((n$e,aH)=>{var Pme=Hi(),AH=Sp(),{ANY:Dme}=AH,Rme=Qs(),Fme=kp(),lH=wp(),cH=SI(),Nme=xI(),Lme=vI(),Tme=(r,e,t,i)=>{r=new Pme(r,i),e=new Rme(e,i);let n,s,o,a,l;switch(t){case">":n=lH,s=Nme,o=cH,a=">",l=">=";break;case"<":n=cH,s=Lme,o=lH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Fme(r,e,i))return!1;for(let c=0;c{h.semver===Dme&&(h=new AH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};aH.exports=Tme});var gH=w((s$e,uH)=>{var Ome=RI(),Mme=(r,e,t)=>Ome(r,e,">",t);uH.exports=Mme});var hH=w((o$e,fH)=>{var Kme=RI(),Ume=(r,e,t)=>Kme(r,e,"<",t);fH.exports=Ume});var CH=w((a$e,pH)=>{var dH=Qs(),Hme=(r,e,t)=>(r=new dH(r,t),e=new dH(e,t),r.intersects(e));pH.exports=Hme});var EH=w((A$e,mH)=>{var jme=kp(),Gme=bs();mH.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>Gme(u,g,t));for(let u of o)jme(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var yH=Qs(),FI=Sp(),{ANY:CS}=FI,Pp=kp(),mS=bs(),qme=(r,e,t={})=>{if(r===e)return!0;r=new yH(r,t),e=new yH(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=Yme(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},Yme=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===CS){if(e.length===1&&e[0].semver===CS)return!0;t.includePrerelease?r=[new FI(">=0.0.0-0")]:r=[new FI(">=0.0.0")]}if(e.length===1&&e[0].semver===CS){if(t.includePrerelease)return!0;e=[new FI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=wH(n,h,t):h.operator==="<"||h.operator==="<="?s=BH(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=mS(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Pp(h,String(n),t)||s&&!Pp(h,String(s),t))return null;for(let p of e)if(!Pp(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=wH(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!Pp(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=BH(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Pp(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},wH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},BH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};IH.exports=qme});var ri=w((c$e,QH)=>{var ES=bc();QH.exports={re:ES.re,src:ES.src,tokens:ES.t,SEMVER_SPEC_VERSION:mp().SEMVER_SPEC_VERSION,SemVer:Hi(),compareIdentifiers:yI().compareIdentifiers,rcompareIdentifiers:yI().rcompareIdentifiers,parse:Qc(),valid:WU(),clean:_U(),inc:XU(),diff:i2(),major:s2(),minor:a2(),patch:l2(),prerelease:u2(),compare:bs(),rcompare:f2(),compareLoose:p2(),compareBuild:QI(),sort:E2(),rsort:y2(),gt:wp(),lt:SI(),eq:bI(),neq:lS(),gte:vI(),lte:xI(),cmp:cS(),coerce:k2(),Comparator:Sp(),Range:Qs(),satisfies:kp(),toComparators:X2(),maxSatisfying:$2(),minSatisfying:tH(),minVersion:nH(),validRange:oH(),outside:RI(),gtr:gH(),ltr:hH(),intersects:CH(),simplifyRange:EH(),subset:bH()}});var IS=w(NI=>{"use strict";Object.defineProperty(NI,"__esModule",{value:!0});NI.VERSION=void 0;NI.VERSION="9.1.0"});var Yt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof LI=="object"&&LI.exports?LI.exports=e():r.regexpToAst=e()})(typeof self!="undefined"?self:SH,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var m=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:m,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],m=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(m)}},r.prototype.alternative=function(){for(var p=[],m=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(m)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var m;switch(this.popChar()){case"=":m="Lookahead";break;case"!":m="NegativeLookahead";break}a(m);var y=this.disjunction();return this.consumeChar(")"),{type:m,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var m,y=this.idx;switch(this.popChar()){case"*":m={atLeast:0,atMost:Infinity};break;case"+":m={atLeast:1,atMost:Infinity};break;case"?":m={atLeast:0,atMost:1};break;case"{":var b=this.integerIncludingZero();switch(this.popChar()){case"}":m={atLeast:b,atMost:b};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),m={atLeast:b,atMost:v}):m={atLeast:b,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&m===void 0)return;a(m);break}if(!(p===!0&&m===void 0))return a(m),this.peekChar(0)==="?"?(this.consumeChar("?"),m.greedy=!1):m.greedy=!0,m.type="Quantifier",m.loc=this.loc(y),m},r.prototype.atom=function(){var p,m=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(m),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,m=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,m=!0;break;case"s":p=f;break;case"S":p=f,m=!0;break;case"w":p=g;break;case"W":p=g,m=!0;break}return a(p),{type:"Set",value:p,complement:m}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var m=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:m}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],m=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),m=!0);this.isClassAtom();){var y=this.classAtom(),b=y.type==="Character";if(b&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),x=v.type==="Character";if(x){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,m){p.length!==void 0?p.forEach(function(y){m.push(y)}):m.push(p)}function o(p,m){if(p[m]===!0)throw"duplicate flag "+m;p[m]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var m in p){var y=p[m];p.hasOwnProperty(m)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(b){this.visit(b)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var MI=w(dg=>{"use strict";Object.defineProperty(dg,"__esModule",{value:!0});dg.clearRegExpParserCache=dg.getRegExpAst=void 0;var Jme=TI(),OI={},Wme=new Jme.RegExpParser;function zme(r){var e=r.toString();if(OI.hasOwnProperty(e))return OI[e];var t=Wme.pattern(e);return OI[e]=t,t}dg.getRegExpAst=zme;function _me(){OI={}}dg.clearRegExpParserCache=_me});var DH=w(Bn=>{"use strict";var Vme=Bn&&Bn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.canMatchCharCode=Bn.firstCharOptimizedIndices=Bn.getOptimizedStartCodesIndices=Bn.failedOptimizationPrefixMsg=void 0;var vH=TI(),Ss=Yt(),xH=MI(),ja=yS(),kH="Complement Sets are not supported for first char optimization";Bn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function Xme(r,e){e===void 0&&(e=!1);try{var t=(0,xH.getRegExpAst)(r),i=KI(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===kH)e&&(0,Ss.PRINT_WARNING)(""+Bn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,Ss.PRINT_ERROR)(Bn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+r.toString()+` > -`)+(" Using the regexp-to-ast library version: "+vH.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}Bn.getOptimizedStartCodesIndices=Xme;function KI(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=ja.minOptimizationVal)for(var f=u.from>=ja.minOptimizationVal?u.from:ja.minOptimizationVal,h=u.to,p=(0,ja.charCodeToOptimizedIndex)(f),m=(0,ja.charCodeToOptimizedIndex)(h),y=p;y<=m;y++)e[y]=y}}});break;case"Group":KI(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&wS(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,Ss.values)(e)}Bn.firstCharOptimizedIndices=KI;function UI(r,e,t){var i=(0,ja.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&Zme(r,e)}function Zme(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,ja.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,ja.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function PH(r,e){return(0,Ss.find)(r.value,function(t){if(typeof t=="number")return(0,Ss.contains)(e,t);var i=t;return(0,Ss.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function wS(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,Ss.isArray)(r.value)?(0,Ss.every)(r.value,wS):wS(r.value):!1}var $me=function(r){Vme(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,Ss.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?PH(t,this.targetCharCodes)===void 0&&(this.found=!0):PH(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(vH.BaseRegExpVisitor);function eEe(r,e){if(e instanceof RegExp){var t=(0,xH.getRegExpAst)(e),i=new $me(r);return i.visit(t),i.found}else return(0,Ss.find)(e,function(n){return(0,Ss.contains)(r,n.charCodeAt(0))})!==void 0}Bn.canMatchCharCode=eEe});var yS=w(Ze=>{"use strict";var RH=Ze&&Ze.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ze,"__esModule",{value:!0});Ze.charCodeToOptimizedIndex=Ze.minOptimizationVal=Ze.buildLineBreakIssueMessage=Ze.LineTerminatorOptimizedTester=Ze.isShortPattern=Ze.isCustomPattern=Ze.cloneEmptyGroups=Ze.performWarningRuntimeChecks=Ze.performRuntimeChecks=Ze.addStickyFlag=Ze.addStartOfInput=Ze.findUnreachablePatterns=Ze.findModesThatDoNotExist=Ze.findInvalidGroupType=Ze.findDuplicatePatterns=Ze.findUnsupportedFlags=Ze.findStartOfInputAnchor=Ze.findEmptyMatchRegExps=Ze.findEndOfInputAnchor=Ze.findInvalidPatterns=Ze.findMissingPatterns=Ze.validatePatterns=Ze.analyzeTokenTypes=Ze.enableSticky=Ze.disableSticky=Ze.SUPPORT_STICKY=Ze.MODES=Ze.DEFAULT_MODE=void 0;var FH=TI(),Ar=Dp(),Ne=Yt(),Cg=DH(),NH=MI(),Mo="PATTERN";Ze.DEFAULT_MODE="defaultMode";Ze.MODES="modes";Ze.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function tEe(){Ze.SUPPORT_STICKY=!1}Ze.disableSticky=tEe;function rEe(){Ze.SUPPORT_STICKY=!0}Ze.enableSticky=rEe;function nEe(r,e){e=(0,Ne.defaults)(e,{useSticky:Ze.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(v,x){return x()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){iEe()});var i;t("Reject Lexer.NA",function(){i=(0,Ne.reject)(r,function(v){return v[Mo]===Ar.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,Ne.map)(i,function(v){var x=v[Mo];if((0,Ne.isRegExp)(x)){var T=x.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!x.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,Ne.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?bS(x):BS(x)}else{if((0,Ne.isFunction)(x))return n=!0,{exec:x};if((0,Ne.has)(x,"exec"))return n=!0,x;if(typeof x=="string"){if(x.length===1)return x;var q=x.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),Y=new RegExp(q);return e.useSticky?bS(Y):BS(Y)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,Ne.map)(i,function(v){return v.tokenTypeIdx}),a=(0,Ne.map)(i,function(v){var x=v.GROUP;if(x!==Ar.Lexer.SKIPPED){if((0,Ne.isString)(x))return x;if((0,Ne.isUndefined)(x))return!1;throw Error("non exhaustive match")}}),l=(0,Ne.map)(i,function(v){var x=v.LONGER_ALT;if(x){var T=(0,Ne.isArray)(x)?(0,Ne.map)(x,function(q){return(0,Ne.indexOf)(i,q)}):[(0,Ne.indexOf)(i,x)];return T}}),c=(0,Ne.map)(i,function(v){return v.PUSH_MODE}),u=(0,Ne.map)(i,function(v){return(0,Ne.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=OH(e.lineTerminatorCharacters);g=(0,Ne.map)(i,function(x){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ne.map)(i,function(x){if((0,Ne.has)(x,"LINE_BREAKS"))return x.LINE_BREAKS;if(TH(x,v)===!1)return(0,Cg.canMatchCharCode)(v,x.PATTERN)}))});var f,h,p,m;t("Misc Mapping #2",function(){f=(0,Ne.map)(i,QS),h=(0,Ne.map)(s,LH),p=(0,Ne.reduce)(i,function(v,x){var T=x.GROUP;return(0,Ne.isString)(T)&&T!==Ar.Lexer.SKIPPED&&(v[T]=[]),v},{}),m=(0,Ne.map)(s,function(v,x){return{pattern:s[x],longerAlt:l[x],canLineTerminator:g[x],isCustom:f[x],short:h[x],group:a[x],push:c[x],pop:u[x],tokenTypeIdx:o[x],tokenType:i[x]}})});var y=!0,b=[];return e.safeMode||t("First Char Optimization",function(){b=(0,Ne.reduce)(i,function(v,x,T){if(typeof x.PATTERN=="string"){var q=x.PATTERN.charCodeAt(0),Y=vS(q);SS(v,Y,m[T])}else if((0,Ne.isArray)(x.START_CHARS_HINT)){var $;(0,Ne.forEach)(x.START_CHARS_HINT,function(ne){var ee=typeof ne=="string"?ne.charCodeAt(0):ne,A=vS(ee);$!==A&&($=A,SS(v,A,m[T]))})}else if((0,Ne.isRegExp)(x.PATTERN))if(x.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" Unable to analyze < "+x.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var _=(0,Cg.getOptimizedStartCodesIndices)(x.PATTERN,e.ensureOptimizations);(0,Ne.isEmpty)(_)&&(y=!1),(0,Ne.forEach)(_,function(ne){SS(v,ne,m[T])})}else e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" TokenType: <"+x.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){b=(0,Ne.packArray)(b)}),{emptyGroups:p,patternIdxToConfig:m,charCodeToPatternIdxToConfig:b,hasCustom:n,canBeOptimized:y}}Ze.analyzeTokenTypes=nEe;function oEe(r,e){var t=[],i=MH(r);t=t.concat(i.errors);var n=KH(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(sEe(s)),t=t.concat(UH(s)),t=t.concat(HH(s,e)),t=t.concat(jH(s)),t}Ze.validatePatterns=oEe;function sEe(r){var e=[],t=(0,Ne.filter)(r,function(i){return(0,Ne.isRegExp)(i[Mo])});return e=e.concat(GH(t)),e=e.concat(qH(t)),e=e.concat(JH(t)),e=e.concat(WH(t)),e=e.concat(YH(t)),e}function MH(r){var e=(0,Ne.filter)(r,function(n){return!(0,Ne.has)(n,Mo)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:Ar.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findMissingPatterns=MH;function KH(r){var e=(0,Ne.filter)(r,function(n){var s=n[Mo];return!(0,Ne.isRegExp)(s)&&!(0,Ne.isFunction)(s)&&!(0,Ne.has)(s,"exec")&&!(0,Ne.isString)(s)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Ar.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findInvalidPatterns=KH;var aEe=/[^\\][\$]/;function GH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return aEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findEndOfInputAnchor=GH;function YH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n.test("")}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:Ar.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ze.findEmptyMatchRegExps=YH;var AEe=/[^\\[][\^]|^\^/;function qH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return AEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findStartOfInputAnchor=qH;function JH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Ar.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ze.findUnsupportedFlags=JH;function WH(r){var e=[],t=(0,Ne.map)(r,function(s){return(0,Ne.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ne.contains)(e,a)&&a.PATTERN!==Ar.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,Ne.compact)(t);var i=(0,Ne.filter)(t,function(s){return s.length>1}),n=(0,Ne.map)(i,function(s){var o=(0,Ne.map)(s,function(l){return l.name}),a=(0,Ne.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:Ar.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ze.findDuplicatePatterns=WH;function UH(r){var e=(0,Ne.filter)(r,function(i){if(!(0,Ne.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==Ar.Lexer.SKIPPED&&n!==Ar.Lexer.NA&&!(0,Ne.isString)(n)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Ar.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ze.findInvalidGroupType=UH;function HH(r,e){var t=(0,Ne.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,Ne.contains)(e,n.PUSH_MODE)}),i=(0,Ne.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:Ar.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ze.findModesThatDoNotExist=HH;function jH(r){var e=[],t=(0,Ne.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===Ar.Lexer.NA||((0,Ne.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ne.isRegExp)(o)&&cEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ne.forEach)(r,function(i,n){(0,Ne.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:Ar.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ze.findUnreachablePatterns=jH;function lEe(r,e){if((0,Ne.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,Ne.isFunction)(e))return e(r,0,[],{});if((0,Ne.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function cEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ne.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function BS(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ze.addStartOfInput=BS;function bS(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ze.addStickyFlag=bS;function uEe(r,e,t){var i=[];return(0,Ne.has)(r,Ze.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.DEFAULT_MODE+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ne.has)(r,Ze.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.MODES+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.has)(r,Ze.DEFAULT_MODE)&&!(0,Ne.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ze.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.forEach)(r.modes,function(n,s){(0,Ne.forEach)(n,function(o,a){(0,Ne.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:Ar.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ze.performRuntimeChecks=uEe;function gEe(r,e,t){var i=[],n=!1,s=(0,Ne.compact)((0,Ne.flatten)((0,Ne.mapValues)(r.modes,function(l){return l}))),o=(0,Ne.reject)(s,function(l){return l[Mo]===Ar.Lexer.NA}),a=OH(t);return e&&(0,Ne.forEach)(o,function(l){var c=TH(l,a);if(c!==!1){var u=zH(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ne.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Cg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:Ar.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ze.performWarningRuntimeChecks=gEe;function fEe(r){var e={},t=(0,Ne.keys)(r);return(0,Ne.forEach)(t,function(i){var n=r[i];if((0,Ne.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ze.cloneEmptyGroups=fEe;function QS(r){var e=r.PATTERN;if((0,Ne.isRegExp)(e))return!1;if((0,Ne.isFunction)(e))return!0;if((0,Ne.has)(e,"exec"))return!0;if((0,Ne.isString)(e))return!1;throw Error("non exhaustive match")}Ze.isCustomPattern=QS;function LH(r){return(0,Ne.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ze.isShortPattern=LH;Ze.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===Ar.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+r.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ze.buildLineBreakIssueMessage=zH;function OH(r){var e=(0,Ne.map)(r,function(t){return(0,Ne.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function SS(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ze.minOptimizationVal=256;var HI=[];function vS(r){return r255?255+~~(r/255):r}}});var mg=w(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});Ft.isTokenType=Ft.hasExtendingTokensTypesMapProperty=Ft.hasExtendingTokensTypesProperty=Ft.hasCategoriesProperty=Ft.hasShortKeyProperty=Ft.singleAssignCategoriesToksMap=Ft.assignCategoriesMapProp=Ft.assignCategoriesTokensProp=Ft.assignTokenDefaultProps=Ft.expandCategories=Ft.augmentTokenTypes=Ft.tokenIdxToClass=Ft.tokenShortNameIdx=Ft.tokenStructuredMatcherNoCategories=Ft.tokenStructuredMatcher=void 0;var ii=Yt();function hEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Ft.tokenStructuredMatcher=hEe;function pEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Ft.tokenStructuredMatcherNoCategories=pEe;Ft.tokenShortNameIdx=1;Ft.tokenIdxToClass={};function dEe(r){var e=_H(r);VH(e),ZH(e),XH(e),(0,ii.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Ft.augmentTokenTypes=dEe;function _H(r){for(var e=(0,ii.cloneArr)(r),t=r,i=!0;i;){t=(0,ii.compact)((0,ii.flatten)((0,ii.map)(t,function(s){return s.CATEGORIES})));var n=(0,ii.difference)(t,e);e=e.concat(n),(0,ii.isEmpty)(n)?i=!1:t=n}return e}Ft.expandCategories=_H;function VH(r){(0,ii.forEach)(r,function(e){$H(e)||(Ft.tokenIdxToClass[Ft.tokenShortNameIdx]=e,e.tokenTypeIdx=Ft.tokenShortNameIdx++),xS(e)&&!(0,ii.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),xS(e)||(e.CATEGORIES=[]),ej(e)||(e.categoryMatches=[]),tj(e)||(e.categoryMatchesMap={})})}Ft.assignTokenDefaultProps=VH;function XH(r){(0,ii.forEach)(r,function(e){e.categoryMatches=[],(0,ii.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Ft.tokenIdxToClass[i].tokenTypeIdx)})})}Ft.assignCategoriesTokensProp=XH;function ZH(r){(0,ii.forEach)(r,function(e){kS([],e)})}Ft.assignCategoriesMapProp=ZH;function kS(r,e){(0,ii.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,ii.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,ii.contains)(i,t)||kS(i,t)})}Ft.singleAssignCategoriesToksMap=kS;function $H(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.hasShortKeyProperty=$H;function xS(r){return(0,ii.has)(r,"CATEGORIES")}Ft.hasCategoriesProperty=xS;function ej(r){return(0,ii.has)(r,"categoryMatches")}Ft.hasExtendingTokensTypesProperty=ej;function tj(r){return(0,ii.has)(r,"categoryMatchesMap")}Ft.hasExtendingTokensTypesMapProperty=tj;function CEe(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.isTokenType=CEe});var PS=w(jI=>{"use strict";Object.defineProperty(jI,"__esModule",{value:!0});jI.defaultLexerErrorProvider=void 0;jI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Dp=w(kc=>{"use strict";Object.defineProperty(kc,"__esModule",{value:!0});kc.Lexer=kc.LexerDefinitionErrorType=void 0;var ao=yS(),lr=Yt(),mEe=mg(),EEe=PS(),IEe=MI(),yEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(yEe=kc.LexerDefinitionErrorType||(kc.LexerDefinitionErrorType={}));var Rp={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:EEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Rp);var wEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=Rp),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,lr.merge)(Rp,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===Rp.lineTerminatorsPattern)i.config.lineTerminatorsPattern=ao.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Rp.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,lr.isArray)(e)?(s={modes:{}},s.modes[ao.DEFAULT_MODE]=(0,lr.cloneArr)(e),s[ao.DEFAULT_MODE]=ao.DEFAULT_MODE):(o=!1,s=(0,lr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,ao.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,lr.forEach)(s.modes,function(u,g){s.modes[g]=(0,lr.reject)(u,function(f){return(0,lr.isUndefined)(f)})});var a=(0,lr.keys)(s.modes);if((0,lr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.validatePatterns)(u,a))}),(0,lr.isEmpty)(i.lexerDefinitionErrors)){(0,mEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,ao.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,lr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,lr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,lr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,lr.forEach)(i.lexerDefinitionWarning,function(u){(0,lr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(ao.SUPPORT_STICKY?(i.chopInput=lr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=lr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=lr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=lr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=lr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,lr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,lr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,IEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,lr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,lr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,lr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,m,y,b,v,x,T=e,q=T.length,Y=0,$=0,_=this.hasCustom?0:Math.floor(e.length/10),ne=new Array(_),ee=[],A=this.trackStartLines?1:void 0,oe=this.trackStartLines?1:void 0,ce=(0,ao.cloneEmptyGroups)(this.emptyGroups),Z=this.trackStartLines,O=this.config.lineTerminatorsPattern,L=0,de=[],Be=[],je=[],re=[];Object.freeze(re);var se=void 0;function be(){return de}function he(Sr){var jn=(0,ao.charCodeToOptimizedIndex)(Sr),fs=Be[jn];return fs===void 0?re:fs}var Fe=function(Sr){if(je.length===1&&Sr.tokenType.PUSH_MODE===void 0){var jn=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(Sr);ee.push({offset:Sr.startOffset,line:Sr.startLine!==void 0?Sr.startLine:void 0,column:Sr.startColumn!==void 0?Sr.startColumn:void 0,length:Sr.image.length,message:jn})}else{je.pop();var fs=(0,lr.last)(je);de=i.patternIdxToConfig[fs],Be=i.charCodeToPatternIdxToConfig[fs],L=de.length;var ba=i.canModeBeOptimized[fs]&&i.config.safeMode===!1;Be&&ba?se=he:se=be}};function Ke(Sr){je.push(Sr),Be=this.charCodeToPatternIdxToConfig[Sr],de=this.patternIdxToConfig[Sr],L=de.length,L=de.length;var jn=this.canModeBeOptimized[Sr]&&this.config.safeMode===!1;Be&&jn?se=he:se=be}Ke.call(this,t);for(var ke;Yc.length){c=a,u=g,ke=gt;break}}}break}}if(c!==null){if(f=c.length,h=ke.group,h!==void 0&&(p=ke.tokenTypeIdx,m=this.createTokenInstance(c,Y,p,ke.tokenType,A,oe,f),this.handlePayload(m,u),h===!1?$=this.addToken(ne,$,m):ce[h].push(m)),e=this.chopInput(e,f),Y=Y+f,oe=this.computeNewColumn(oe,f),Z===!0&&ke.canLineTerminator===!0){var Mt=0,Ei=void 0,jt=void 0;O.lastIndex=0;do Ei=O.test(c),Ei===!0&&(jt=O.lastIndex-1,Mt++);while(Ei===!0);Mt!==0&&(A=A+Mt,oe=f-jt,this.updateTokenEndLineColumnLocation(m,h,jt,Mt,A,oe,f))}this.handleModes(ke,Fe,Ke,m)}else{for(var Qr=Y,Oi=A,Xs=oe,Un=!1;!Un&&Y <"+e+">");var n=(0,lr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();kc.Lexer=wEe});var XA=w(Pi=>{"use strict";Object.defineProperty(Pi,"__esModule",{value:!0});Pi.tokenMatcher=Pi.createTokenInstance=Pi.EOF=Pi.createToken=Pi.hasTokenLabel=Pi.tokenName=Pi.tokenLabel=void 0;var Ao=Yt(),BEe=Dp(),DS=mg();function bEe(r){return rj(r)?r.LABEL:r.name}Pi.tokenLabel=bEe;function QEe(r){return r.name}Pi.tokenName=QEe;function rj(r){return(0,Ao.isString)(r.LABEL)&&r.LABEL!==""}Pi.hasTokenLabel=rj;var SEe="parent",ij="categories",nj="label",sj="group",oj="push_mode",aj="pop_mode",Aj="longer_alt",lj="line_breaks",cj="start_chars_hint";function uj(r){return vEe(r)}Pi.createToken=uj;function vEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,Ao.isUndefined)(e)||(t.PATTERN=e),(0,Ao.has)(r,SEe))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Ao.has)(r,ij)&&(t.CATEGORIES=r[ij]),(0,DS.augmentTokenTypes)([t]),(0,Ao.has)(r,nj)&&(t.LABEL=r[nj]),(0,Ao.has)(r,sj)&&(t.GROUP=r[sj]),(0,Ao.has)(r,aj)&&(t.POP_MODE=r[aj]),(0,Ao.has)(r,oj)&&(t.PUSH_MODE=r[oj]),(0,Ao.has)(r,Aj)&&(t.LONGER_ALT=r[Aj]),(0,Ao.has)(r,lj)&&(t.LINE_BREAKS=r[lj]),(0,Ao.has)(r,cj)&&(t.START_CHARS_HINT=r[cj]),t}Pi.EOF=uj({name:"EOF",pattern:BEe.Lexer.NA});(0,DS.augmentTokenTypes)([Pi.EOF]);function xEe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Pi.createTokenInstance=xEe;function kEe(r,e){return(0,DS.tokenStructuredMatcher)(r,e)}Pi.tokenMatcher=kEe});var bn=w(Vt=>{"use strict";var Ga=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,"__esModule",{value:!0});Vt.serializeProduction=Vt.serializeGrammar=Vt.Terminal=Vt.Alternation=Vt.RepetitionWithSeparator=Vt.Repetition=Vt.RepetitionMandatoryWithSeparator=Vt.RepetitionMandatory=Vt.Option=Vt.Alternative=Vt.Rule=Vt.NonTerminal=Vt.AbstractProduction=void 0;var fr=Yt(),PEe=XA(),Ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,fr.forEach)(this.definition,function(t){t.accept(e)})},r}();Vt.AbstractProduction=Ko;var gj=function(r){Ga(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(Ko);Vt.NonTerminal=gj;var fj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Rule=fj;var hj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Alternative=hj;var pj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Option=pj;var dj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatory=dj;var Cj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatoryWithSeparator=Cj;var mj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Repetition=mj;var Ej=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionWithSeparator=Ej;var Ij=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(Ko);Vt.Alternation=Ij;var GI=function(){function r(e){this.idx=1,(0,fr.assign)(this,(0,fr.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Vt.Terminal=GI;function DEe(r){return(0,fr.map)(r,Fp)}Vt.serializeGrammar=DEe;function Fp(r){function e(s){return(0,fr.map)(s,Fp)}if(r instanceof gj){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,fr.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof hj)return{type:"Alternative",definition:e(r.definition)};if(r instanceof pj)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof dj)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Cj)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Ej)return{type:"RepetitionWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof mj)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Ij)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof GI){var i={type:"Terminal",name:r.terminalType.name,label:(0,PEe.tokenLabel)(r.terminalType),idx:r.idx};(0,fr.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,fr.isRegExp)(n)?n.source:n),i}else{if(r instanceof fj)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Vt.serializeProduction=Fp});var qI=w(YI=>{"use strict";Object.defineProperty(YI,"__esModule",{value:!0});YI.RestWalker=void 0;var RS=Yt(),Qn=bn(),REe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,RS.forEach)(e.definition,function(n,s){var o=(0,RS.drop)(e.definition,s+1);if(n instanceof Qn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof Qn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof Qn.Alternative)i.walkFlat(n,o,t);else if(n instanceof Qn.Option)i.walkOption(n,o,t);else if(n instanceof Qn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof Qn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof Qn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof Qn.Repetition)i.walkMany(n,o,t);else if(n instanceof Qn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,RS.forEach)(e.definition,function(o){var a=new Qn.Alternative({definition:[o]});n.walk(a,s)})},r}();YI.RestWalker=REe;function yj(r,e,t){var i=[new Qn.Option({definition:[new Qn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Eg=w(JI=>{"use strict";Object.defineProperty(JI,"__esModule",{value:!0});JI.GAstVisitor=void 0;var Uo=bn(),FEe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Uo.NonTerminal:return this.visitNonTerminal(t);case Uo.Alternative:return this.visitAlternative(t);case Uo.Option:return this.visitOption(t);case Uo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Uo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Uo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Uo.Repetition:return this.visitRepetition(t);case Uo.Alternation:return this.visitAlternation(t);case Uo.Terminal:return this.visitTerminal(t);case Uo.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();JI.GAstVisitor=FEe});var Lp=w(Gi=>{"use strict";var NEe=Gi&&Gi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Gi,"__esModule",{value:!0});Gi.collectMethods=Gi.DslMethodsCollectorVisitor=Gi.getProductionDslName=Gi.isBranchingProd=Gi.isOptionalProd=Gi.isSequenceProd=void 0;var Np=Yt(),xr=bn(),LEe=Eg();function TEe(r){return r instanceof xr.Alternative||r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionMandatory||r instanceof xr.RepetitionMandatoryWithSeparator||r instanceof xr.RepetitionWithSeparator||r instanceof xr.Terminal||r instanceof xr.Rule}Gi.isSequenceProd=TEe;function FS(r,e){e===void 0&&(e=[]);var t=r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionWithSeparator;return t?!0:r instanceof xr.Alternation?(0,Np.some)(r.definition,function(i){return FS(i,e)}):r instanceof xr.NonTerminal&&(0,Np.contains)(e,r)?!1:r instanceof xr.AbstractProduction?(r instanceof xr.NonTerminal&&e.push(r),(0,Np.every)(r.definition,function(i){return FS(i,e)})):!1}Gi.isOptionalProd=FS;function OEe(r){return r instanceof xr.Alternation}Gi.isBranchingProd=OEe;function MEe(r){if(r instanceof xr.NonTerminal)return"SUBRULE";if(r instanceof xr.Option)return"OPTION";if(r instanceof xr.Alternation)return"OR";if(r instanceof xr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof xr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof xr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof xr.Repetition)return"MANY";if(r instanceof xr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Gi.getProductionDslName=MEe;var wj=function(r){NEe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(LEe.GAstVisitor);Gi.DslMethodsCollectorVisitor=wj;var WI=new wj;function KEe(r){WI.reset(),r.accept(WI);var e=WI.dslMethods;return WI.reset(),e}Gi.collectMethods=KEe});var LS=w(Ho=>{"use strict";Object.defineProperty(Ho,"__esModule",{value:!0});Ho.firstForTerminal=Ho.firstForBranching=Ho.firstForSequence=Ho.first=void 0;var zI=Yt(),Bj=bn(),NS=Lp();function _I(r){if(r instanceof Bj.NonTerminal)return _I(r.referencedRule);if(r instanceof Bj.Terminal)return Sj(r);if((0,NS.isSequenceProd)(r))return bj(r);if((0,NS.isBranchingProd)(r))return Qj(r);throw Error("non exhaustive match")}Ho.first=_I;function bj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,NS.isOptionalProd)(s),e=e.concat(_I(s)),i=i+1,n=t.length>i;return(0,zI.uniq)(e)}Ho.firstForSequence=bj;function Qj(r){var e=(0,zI.map)(r.definition,function(t){return _I(t)});return(0,zI.uniq)((0,zI.flatten)(e))}Ho.firstForBranching=Qj;function Sj(r){return[r.terminalType]}Ho.firstForTerminal=Sj});var TS=w(VI=>{"use strict";Object.defineProperty(VI,"__esModule",{value:!0});VI.IN=void 0;VI.IN="_~IN~_"});var Dj=w(vs=>{"use strict";var UEe=vs&&vs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(vs,"__esModule",{value:!0});vs.buildInProdFollowPrefix=vs.buildBetweenProdsFollowPrefix=vs.computeAllProdsFollows=vs.ResyncFollowsWalker=void 0;var HEe=qI(),jEe=LS(),vj=Yt(),xj=TS(),GEe=bn(),Pj=function(r){UEe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=kj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new GEe.Alternative({definition:o}),l=(0,jEe.first)(a);this.follows[s]=l},e}(HEe.RestWalker);vs.ResyncFollowsWalker=Pj;function YEe(r){var e={};return(0,vj.forEach)(r,function(t){var i=new Pj(t).startWalking();(0,vj.assign)(e,i)}),e}vs.computeAllProdsFollows=YEe;function kj(r,e){return r.name+e+xj.IN}vs.buildBetweenProdsFollowPrefix=kj;function qEe(r){var e=r.terminalType.name;return e+r.idx+xj.IN}vs.buildInProdFollowPrefix=qEe});var Tp=w(Ya=>{"use strict";Object.defineProperty(Ya,"__esModule",{value:!0});Ya.defaultGrammarValidatorErrorProvider=Ya.defaultGrammarResolverErrorProvider=Ya.defaultParserErrorProvider=void 0;var Ig=XA(),JEe=Yt(),lo=Yt(),OS=bn(),Rj=Lp();Ya.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,Ig.hasTokenLabel)(e),o=s?"--> "+(0,Ig.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,lo.first)(t).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,lo.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,lo.map)(c,function(h){return"["+(0,lo.map)(h,function(p){return(0,Ig.tokenLabel)(p)}).join(", ")+"]"}),g=(0,lo.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,lo.first)(t).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,lo.map)(e,function(u){return"["+(0,lo.map)(u,function(g){return(0,Ig.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ya.defaultParserErrorProvider);Ya.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+r.name+"<-";return t}};Ya.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof OS.Terminal?u.terminalType.name:u instanceof OS.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,lo.first)(e),s=n.idx,o=(0,Rj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,Rj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+r.topLevelRule.name+`> Rule. - has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=JEe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof OS.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Lj=w(ZA=>{"use strict";var WEe=ZA&&ZA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(ZA,"__esModule",{value:!0});ZA.GastRefResolverVisitor=ZA.resolveGrammar=void 0;var zEe=$n(),Fj=Yt(),_Ee=Eg();function VEe(r,e){var t=new Nj(r,e);return t.resolveRefs(),t.errors}ZA.resolveGrammar=VEe;var Nj=function(r){WEe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,Fj.forEach)((0,Fj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:zEe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(_Ee.GAstVisitor);ZA.GastRefResolverVisitor=Nj});var Mp=w(Kr=>{"use strict";var Pc=Kr&&Kr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Kr,"__esModule",{value:!0});Kr.nextPossibleTokensAfter=Kr.possiblePathsFrom=Kr.NextTerminalAfterAtLeastOneSepWalker=Kr.NextTerminalAfterAtLeastOneWalker=Kr.NextTerminalAfterManySepWalker=Kr.NextTerminalAfterManyWalker=Kr.AbstractNextTerminalAfterProductionWalker=Kr.NextAfterTokenWalker=Kr.AbstractNextPossibleTokensWalker=void 0;var Tj=qI(),Kt=Yt(),XEe=LS(),Dt=bn(),Oj=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(Tj.RestWalker);Kr.AbstractNextPossibleTokensWalker=Oj;var ZEe=function(r){Pc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Dt.Alternative({definition:s});this.possibleTokTypes=(0,XEe.first)(o),this.found=!0}},e}(Oj);Kr.NextAfterTokenWalker=ZEe;var Op=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(Tj.RestWalker);Kr.AbstractNextTerminalAfterProductionWalker=Op;var $Ee=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManyWalker=$Ee;var eIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManySepWalker=eIe;var tIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneWalker=tIe;var rIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneSepWalker=rIe;function Mj(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Mj(s(c),e,t);return i.concat(u)}for(;t.length=0;ce--){var Z=b.definition[ce],O={idx:p,def:Z.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y};g.push(O),g.push(o)}else if(b instanceof Dt.Alternative)g.push({idx:p,def:b.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y});else if(b instanceof Dt.Rule)g.push(iIe(b,p,m,y));else throw Error("non exhaustive match")}}return u}Kr.nextPossibleTokensAfter=nIe;function iIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Kp=w(tr=>{"use strict";var Kj=tr&&tr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(tr,"__esModule",{value:!0});tr.areTokenCategoriesNotUsed=tr.isStrictPrefixOfPath=tr.containsPath=tr.getLookaheadPathsForOptionalProd=tr.getLookaheadPathsForOr=tr.lookAheadSequenceFromAlternatives=tr.buildSingleAlternativeLookaheadFunction=tr.buildAlternativesLookAheadFunc=tr.buildLookaheadFuncForOptionalProd=tr.buildLookaheadFuncForOr=tr.getProdType=tr.PROD_TYPE=void 0;var cr=Yt(),Uj=Mp(),sIe=qI(),XI=mg(),$A=bn(),oIe=Eg(),ui;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(ui=tr.PROD_TYPE||(tr.PROD_TYPE={}));function aIe(r){if(r instanceof $A.Option)return ui.OPTION;if(r instanceof $A.Repetition)return ui.REPETITION;if(r instanceof $A.RepetitionMandatory)return ui.REPETITION_MANDATORY;if(r instanceof $A.RepetitionMandatoryWithSeparator)return ui.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof $A.RepetitionWithSeparator)return ui.REPETITION_WITH_SEPARATOR;if(r instanceof $A.Alternation)return ui.ALTERNATION;throw Error("non exhaustive match")}tr.getProdType=aIe;function AIe(r,e,t,i,n,s){var o=Hj(r,e,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o,i,a,n)}tr.buildLookaheadFuncForOr=AIe;function lIe(r,e,t,i,n,s){var o=jj(r,e,n,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o[0],a,i)}tr.buildLookaheadFuncForOptionalProd=lIe;function cIe(r,e,t,i){var n=r.length,s=(0,cr.every)(r,function(l){return(0,cr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,cr.map)(l,function(x){return x.GATE}),u=0;u{"use strict";var HS=Xt&&Xt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Xt,"__esModule",{value:!0});Xt.checkPrefixAlternativesAmbiguities=Xt.validateSomeNonEmptyLookaheadPath=Xt.validateTooManyAlts=Xt.RepetionCollector=Xt.validateAmbiguousAlternationAlternatives=Xt.validateEmptyOrAlternative=Xt.getFirstNoneTerminal=Xt.validateNoLeftRecursion=Xt.validateRuleIsOverridden=Xt.validateRuleDoesNotAlreadyExist=Xt.OccurrenceValidationCollector=Xt.identifyProductionForDuplicates=Xt.validateGrammar=void 0;var nr=Yt(),kr=Yt(),jo=$n(),jS=Lp(),yg=Kp(),pIe=Mp(),co=bn(),GS=Eg();function mIe(r,e,t,i,n){var s=nr.map(r,function(h){return dIe(h,i)}),o=nr.map(r,function(h){return YS(h,h,i)}),a=[],l=[],c=[];(0,kr.every)(o,kr.isEmpty)&&(a=(0,kr.map)(r,function(h){return Wj(h,i)}),l=(0,kr.map)(r,function(h){return zj(h,e,i)}),c=Vj(r,e,i));var u=CIe(r,t,i),g=(0,kr.map)(r,function(h){return _j(h,i)}),f=(0,kr.map)(r,function(h){return Jj(h,r,n,i)});return nr.flatten(s.concat(c,o,a,l,u,g,f))}Xt.validateGrammar=mIe;function dIe(r,e){var t=new $j;r.accept(t);var i=t.allProductions,n=nr.groupBy(i,Xj),s=nr.pick(n,function(a){return a.length>1}),o=nr.map(nr.values(s),function(a){var l=nr.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,jS.getProductionDslName)(l),g={message:c,type:jo.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=Zj(l);return f&&(g.parameter=f),g});return o}function Xj(r){return(0,jS.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+Zj(r)}Xt.identifyProductionForDuplicates=Xj;function Zj(r){return r instanceof co.Terminal?r.terminalType.name:r instanceof co.NonTerminal?r.nonTerminalName:""}var $j=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.OccurrenceValidationCollector=$j;function Jj(r,e,t,i){var n=[],s=(0,kr.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:jo.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Xt.validateRuleDoesNotAlreadyExist=Jj;function EIe(r,e,t){var i=[],n;return nr.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:jo.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Xt.validateRuleIsOverridden=EIe;function YS(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Up(e.definition);if(nr.isEmpty(s))return[];var o=r.name,a=nr.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:jo.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=nr.difference(s,i.concat([r])),c=nr.map(l,function(u){var g=nr.cloneArr(i);return g.push(u),YS(r,u,t,g)});return n.concat(nr.flatten(c))}Xt.validateNoLeftRecursion=YS;function Up(r){var e=[];if(nr.isEmpty(r))return e;var t=nr.first(r);if(t instanceof co.NonTerminal)e.push(t.referencedRule);else if(t instanceof co.Alternative||t instanceof co.Option||t instanceof co.RepetitionMandatory||t instanceof co.RepetitionMandatoryWithSeparator||t instanceof co.RepetitionWithSeparator||t instanceof co.Repetition)e=e.concat(Up(t.definition));else if(t instanceof co.Alternation)e=nr.flatten(nr.map(t.definition,function(o){return Up(o.definition)}));else if(!(t instanceof co.Terminal))throw Error("non exhaustive match");var i=(0,jS.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=nr.drop(r);return e.concat(Up(s))}else return e}Xt.getFirstNoneTerminal=Up;var qS=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(GS.GAstVisitor);function Wj(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){var a=nr.dropRight(o.definition),l=nr.map(a,function(c,u){var g=(0,pIe.nextPossibleTokensAfter)([c],[],null,1);return nr.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:jo.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(nr.compact(l))},[]);return n}Xt.validateEmptyOrAlternative=Wj;function zj(r,e,t){var i=new qS;r.accept(i);var n=i.alternations;n=(0,kr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=nr.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,yg.getLookaheadPathsForOr)(l,r,c,a),g=IIe(u,a,r,t),f=eG(u,a,r,t);return o.concat(g,f)},[]);return s}Xt.validateAmbiguousAlternationAlternatives=zj;var tG=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.RepetionCollector=tG;function _j(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:jo.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Xt.validateTooManyAlts=_j;function Vj(r,e,t){var i=[];return(0,kr.forEach)(r,function(n){var s=new tG;n.accept(s);var o=s.allProductions;(0,kr.forEach)(o,function(a){var l=(0,yg.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,yg.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,kr.isEmpty)((0,kr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:jo.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Xt.validateSomeNonEmptyLookaheadPath=Vj;function IIe(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,kr.forEach)(l,function(u){var g=[c];(0,kr.forEach)(r,function(f,h){c!==h&&(0,yg.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,yg.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=nr.map(s,function(a){var l=(0,kr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:jo.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function eG(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(o,a,l){var c=(0,kr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,kr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,kr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(wg,"__esModule",{value:!0});wg.validateGrammar=wg.resolveGrammar=void 0;var WS=Yt(),yIe=Lj(),wIe=JS(),rG=Tp();function BIe(r){r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarResolverErrorProvider});var e={};return(0,WS.forEach)(r.rules,function(t){e[t.name]=t}),(0,yIe.resolveGrammar)(e,r.errMsgProvider)}wg.resolveGrammar=BIe;function bIe(r){return r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarValidatorErrorProvider}),(0,wIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}wg.validateGrammar=bIe});var Bg=w(Sn=>{"use strict";var Hp=Sn&&Sn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Sn,"__esModule",{value:!0});Sn.EarlyExitException=Sn.NotAllInputParsedException=Sn.NoViableAltException=Sn.MismatchedTokenException=Sn.isRecognitionException=void 0;var QIe=Yt(),nG="MismatchedTokenException",sG="NoViableAltException",oG="EarlyExitException",aG="NotAllInputParsedException",AG=[nG,sG,oG,aG];Object.freeze(AG);function SIe(r){return(0,QIe.contains)(AG,r.name)}Sn.isRecognitionException=SIe;var ZI=function(r){Hp(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),vIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=nG,s}return e}(ZI);Sn.MismatchedTokenException=vIe;var xIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=sG,s}return e}(ZI);Sn.NoViableAltException=xIe;var kIe=function(r){Hp(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=aG,n}return e}(ZI);Sn.NotAllInputParsedException=kIe;var PIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=oG,s}return e}(ZI);Sn.EarlyExitException=PIe});var _S=w(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.attemptInRepetitionRecovery=Yi.Recoverable=Yi.InRuleRecoveryException=Yi.IN_RULE_RECOVERY_EXCEPTION=Yi.EOF_FOLLOW_KEY=void 0;var $I=XA(),xs=Yt(),DIe=Bg(),RIe=TS(),FIe=$n();Yi.EOF_FOLLOW_KEY={};Yi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function zS(r){this.name=Yi.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Yi.InRuleRecoveryException=zS;zS.prototype=Error.prototype;var NIe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,xs.has)(e,"recoveryEnabled")?e.recoveryEnabled:FIe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=lG)},r.prototype.getTokenToInsert=function(e){var t=(0,$I.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),m=new DIe.MismatchedTokenException(p,u,s.LA(0));m.resyncedTokens=(0,xs.dropRight)(l),s.SAVE_ERROR(m)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new zS("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,xs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,xs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,xs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,xs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Yi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,xs.map)(t,function(n,s){return s===0?Yi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,xs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,xs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Yi.EOF_FOLLOW_KEY)return[$I.EOF];var t=e.ruleName+e.idxInCallingRule+RIe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,$I.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,xs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,xs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,xs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Yi.Recoverable=NIe;function lG(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=$I.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Yi.attemptInRepetitionRecovery=lG});var ey=w(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.LooksAhead=void 0;var qa=Kp(),uo=Yt(),cG=$n(),Ja=ey(),Dc=Lp(),TIe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,uo.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:cG.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,uo.has)(e,"maxLookahead")?e.maxLookahead:cG.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,uo.isES2015MapSupported)()?new Map:[],(0,uo.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,uo.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Dc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,uo.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,Dc.getProductionDslName)(g)+f,function(){var h=(0,qa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Ja.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Ja.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,uo.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_IDX,qa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Ja.OPTION_IDX,qa.PROD_TYPE.OPTION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_IDX,qa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_SEP_IDX,qa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_SEP_IDX,qa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,qa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Ja.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,qa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,qa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Ja.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();ty.LooksAhead=TIe});var gG=w(Go=>{"use strict";Object.defineProperty(Go,"__esModule",{value:!0});Go.addNoneTerminalToCst=Go.addTerminalToCst=Go.setNodeLocationFull=Go.setNodeLocationOnlyOffset=void 0;function OIe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(el,"__esModule",{value:!0});el.defineNameProp=el.functionName=el.classNameFromInstance=void 0;var HIe=Yt();function jIe(r){return fG(r.constructor)}el.classNameFromInstance=jIe;var hG="name";function fG(r){var e=r.name;return e||"anonymous"}el.functionName=fG;function GIe(r,e){var t=Object.getOwnPropertyDescriptor(r,hG);return(0,HIe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,hG,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}el.defineNameProp=GIe});var EG=w(Di=>{"use strict";Object.defineProperty(Di,"__esModule",{value:!0});Di.validateRedundantMethods=Di.validateMissingCstMethods=Di.validateVisitor=Di.CstVisitorDefinitionError=Di.createBaseVisitorConstructorWithDefaults=Di.createBaseSemanticVisitorConstructor=Di.defaultVisit=void 0;var ks=Yt(),jp=VS();function pG(r,e){for(var t=(0,ks.keys)(r),i=t.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Di.createBaseSemanticVisitorConstructor=YIe;function qIe(r,e,t){var i=function(){};(0,jp.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,ks.forEach)(e,function(s){n[s]=pG}),i.prototype=n,i.prototype.constructor=i,i}Di.createBaseVisitorConstructorWithDefaults=qIe;var XS;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(XS=Di.CstVisitorDefinitionError||(Di.CstVisitorDefinitionError={}));function dG(r,e){var t=CG(r,e),i=mG(r,e);return t.concat(i)}Di.validateVisitor=dG;function CG(r,e){var t=(0,ks.map)(e,function(i){if(!(0,ks.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+" CST Visitor.",type:XS.MISSING_METHOD,methodName:i}});return(0,ks.compact)(t)}Di.validateMissingCstMethods=CG;var JIe=["constructor","visit","validateVisitor"];function mG(r,e){var t=[];for(var i in r)(0,ks.isFunction)(r[i])&&!(0,ks.contains)(JIe,i)&&!(0,ks.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:XS.REDUNDANT_METHOD,methodName:i});return t}Di.validateRedundantMethods=mG});var yG=w(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.TreeBuilder=void 0;var bg=gG(),ni=Yt(),IG=EG(),WIe=$n(),zIe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,ni.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:WIe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ni.NOOP,this.cstFinallyStateUpdate=ni.NOOP,this.cstPostTerminal=ni.NOOP,this.cstPostNonTerminal=ni.NOOP,this.cstPostRule=ni.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationFull,this.setNodeLocationFromNode=bg.setNodeLocationFull,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=bg.setNodeLocationOnlyOffset,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=ni.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,ni.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,IG.createBaseSemanticVisitorConstructor)(this.className,(0,ni.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,ni.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,IG.createBaseVisitorConstructorWithDefaults)(this.className,(0,ni.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();ry.TreeBuilder=zIe});var BG=w(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.LexerAdapter=void 0;var wG=$n(),_Ie=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):wG.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?wG.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();iy.LexerAdapter=_Ie});var QG=w(ny=>{"use strict";Object.defineProperty(ny,"__esModule",{value:!0});ny.RecognizerApi=void 0;var bG=Yt(),VIe=Bg(),ZS=$n(),XIe=Tp(),ZIe=JS(),$Ie=bn(),eye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG),(0,bG.contains)(this.definedRulesNames,e)){var n=XIe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:ZS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,ZIe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,VIe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,$Ie.serializeGrammar)((0,bG.values)(this.gastProductionsCache))},r}();ny.RecognizerApi=eye});var kG=w(sy=>{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.RecognizerEngine=void 0;var Fr=Yt(),es=ey(),oy=Bg(),SG=Kp(),Qg=Mp(),vG=$n(),tye=_S(),xG=XA(),Gp=mg(),rye=VS(),iye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,rye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Gp.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Fr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,Fr.isArray)(e)){if((0,Fr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,Fr.isArray)(e))this.tokensMap=(0,Fr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Fr.has)(e,"modes")&&(0,Fr.every)((0,Fr.flatten)((0,Fr.values)(e.modes)),Gp.isTokenType)){var i=(0,Fr.flatten)((0,Fr.values)(e.modes)),n=(0,Fr.uniq)(i);this.tokensMap=(0,Fr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Fr.isObject)(e))this.tokensMap=(0,Fr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=xG.EOF;var s=(0,Fr.every)((0,Fr.values)(e),function(o){return(0,Fr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Gp.tokenStructuredMatcherNoCategories:Gp.tokenStructuredMatcher,(0,Gp.augmentTokenTypes)((0,Fr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Fr.has)(i,"resyncEnabled")?i.resyncEnabled:vG.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Fr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:vG.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(es.OR_IDX,t),n=(0,Fr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new oy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,oy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new oy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===tye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Fr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),xG.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();sy.RecognizerEngine=iye});var DG=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.ErrorHandler=void 0;var $S=Bg(),ev=Yt(),PG=Kp(),nye=$n(),sye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,ev.has)(e,"errorMessageProvider")?e.errorMessageProvider:nye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,$S.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,ev.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,ev.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,PG.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new $S.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,PG.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new $S.NoViableAltException(c,this.LA(1),l))},r}();ay.ErrorHandler=sye});var NG=w(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.ContentAssist=void 0;var RG=Mp(),FG=Yt(),oye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,FG.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,RG.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,FG.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new RG.NextAfterTokenWalker(n,e).startWalking();return s},r}();Ay.ContentAssist=oye});var jG=w(ly=>{"use strict";Object.defineProperty(ly,"__esModule",{value:!0});ly.GastRecorder=void 0;var vn=Yt(),Yo=bn(),aye=Dp(),LG=mg(),TG=XA(),Aye=$n(),lye=ey(),cy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(cy);var OG=!0,MG=Math.pow(2,lye.BITS_FOR_OCCURRENCE_IDX)-1,KG=(0,TG.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:aye.Lexer.NA});(0,LG.augmentTokenTypes)([KG]);var UG=(0,TG.createTokenInstance)(KG,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(UG);var cye={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},gye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Aye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Yo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Yp.call(this,Yo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatoryWithSeparator,t,e,OG)},r.prototype.manyInternalRecord=function(e,t){Yp.call(this,Yo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionWithSeparator,t,e,OG)},r.prototype.orInternalRecord=function(e,t){return uye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(uy(t),!e||(0,vn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=e.ruleName,a=new Yo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?cye:cy},r.prototype.consumeInternalRecord=function(e,t,i){if(uy(t),!(0,LG.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=new Yo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),UG},r}();ly.GastRecorder=gye;function Yp(r,e,t,i){i===void 0&&(i=!1),uy(t);var n=(0,vn.peek)(this.recordingProdStack),s=(0,vn.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,vn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),cy}function uye(r,e){var t=this;uy(e);var i=(0,vn.peek)(this.recordingProdStack),n=(0,vn.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Yo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,vn.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,vn.some)(s,function(l){return(0,vn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,vn.forEach)(s,function(l){var c=new Yo.Alternative({definition:[]});o.definition.push(c),(0,vn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,vn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),cy}function HG(r){return r===0?"":""+r}function uy(r){if(r<0||r>MG){var e=new Error("Invalid DSL Method idx value: <"+r+`> - `+("Idx value must be a none negative value smaller than "+(MG+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var YG=w(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.PerformanceTracer=void 0;var GG=Yt(),fye=$n(),hye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,GG.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:Infinity,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=fye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,GG.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();gy.PerformanceTracer=hye});var qG=w(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.applyMixins=void 0;function pye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}fy.applyMixins=pye});var $n=w(Er=>{"use strict";var JG=Er&&Er.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Er,"__esModule",{value:!0});Er.EmbeddedActionsParser=Er.CstParser=Er.Parser=Er.EMPTY_ALT=Er.ParserDefinitionErrorType=Er.DEFAULT_RULE_CONFIG=Er.DEFAULT_PARSER_CONFIG=Er.END_OF_FILE=void 0;var an=Yt(),dye=Dj(),WG=XA(),zG=Tp(),_G=iG(),Cye=_S(),mye=uG(),Eye=yG(),Iye=BG(),yye=QG(),wye=kG(),Bye=DG(),bye=NG(),Qye=jG(),Sye=YG(),vye=qG();Er.END_OF_FILE=(0,WG.createTokenInstance)(WG.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Er.END_OF_FILE);Er.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:zG.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});Er.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var xye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(xye=Er.ParserDefinitionErrorType||(Er.ParserDefinitionErrorType={}));function kye(r){return r===void 0&&(r=void 0),function(){return r}}Er.EMPTY_ALT=kye;var hy=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,an.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,an.has)(t,"skipValidations")?t.skipValidations:Er.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,an.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,an.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,_G.resolveGrammar)({rules:(0,an.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,an.isEmpty)(n)&&e.skipValidations===!1){var s=(0,_G.validateGrammar)({rules:(0,an.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,an.values)(e.tokensMap),errMsgProvider:zG.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,an.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,dye.computeAllProdsFollows)((0,an.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,an.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,an.isEmpty)(e.definitionErrors))throw t=(0,an.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+t.join(` -------------------------------- -`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();Er.Parser=hy;(0,vye.applyMixins)(hy,[Cye.Recoverable,mye.LooksAhead,Eye.TreeBuilder,Iye.LexerAdapter,wye.RecognizerEngine,yye.RecognizerApi,Bye.ErrorHandler,bye.ContentAssist,Qye.GastRecorder,Sye.PerformanceTracer]);var Pye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(hy);Er.CstParser=Pye;var Dye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(hy);Er.EmbeddedActionsParser=Dye});var XG=w(py=>{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.createSyntaxDiagramsCode=void 0;var VG=IS();function Rye(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` - - - - -`,u=` -
-`,g=` - -`,f=` - -`;return a+l+c+u+g+f}py.createSyntaxDiagramsCode=Rye});var eY=w(Ve=>{"use strict";Object.defineProperty(Ve,"__esModule",{value:!0});Ve.Parser=Ve.createSyntaxDiagramsCode=Ve.clearCache=Ve.GAstVisitor=Ve.serializeProduction=Ve.serializeGrammar=Ve.Terminal=Ve.Rule=Ve.RepetitionWithSeparator=Ve.RepetitionMandatoryWithSeparator=Ve.RepetitionMandatory=Ve.Repetition=Ve.Option=Ve.NonTerminal=Ve.Alternative=Ve.Alternation=Ve.defaultLexerErrorProvider=Ve.NoViableAltException=Ve.NotAllInputParsedException=Ve.MismatchedTokenException=Ve.isRecognitionException=Ve.EarlyExitException=Ve.defaultParserErrorProvider=Ve.tokenName=Ve.tokenMatcher=Ve.tokenLabel=Ve.EOF=Ve.createTokenInstance=Ve.createToken=Ve.LexerDefinitionErrorType=Ve.Lexer=Ve.EMPTY_ALT=Ve.ParserDefinitionErrorType=Ve.EmbeddedActionsParser=Ve.CstParser=Ve.VERSION=void 0;var Fye=IS();Object.defineProperty(Ve,"VERSION",{enumerable:!0,get:function(){return Fye.VERSION}});var dy=$n();Object.defineProperty(Ve,"CstParser",{enumerable:!0,get:function(){return dy.CstParser}});Object.defineProperty(Ve,"EmbeddedActionsParser",{enumerable:!0,get:function(){return dy.EmbeddedActionsParser}});Object.defineProperty(Ve,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return dy.ParserDefinitionErrorType}});Object.defineProperty(Ve,"EMPTY_ALT",{enumerable:!0,get:function(){return dy.EMPTY_ALT}});var ZG=Dp();Object.defineProperty(Ve,"Lexer",{enumerable:!0,get:function(){return ZG.Lexer}});Object.defineProperty(Ve,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return ZG.LexerDefinitionErrorType}});var Sg=XA();Object.defineProperty(Ve,"createToken",{enumerable:!0,get:function(){return Sg.createToken}});Object.defineProperty(Ve,"createTokenInstance",{enumerable:!0,get:function(){return Sg.createTokenInstance}});Object.defineProperty(Ve,"EOF",{enumerable:!0,get:function(){return Sg.EOF}});Object.defineProperty(Ve,"tokenLabel",{enumerable:!0,get:function(){return Sg.tokenLabel}});Object.defineProperty(Ve,"tokenMatcher",{enumerable:!0,get:function(){return Sg.tokenMatcher}});Object.defineProperty(Ve,"tokenName",{enumerable:!0,get:function(){return Sg.tokenName}});var Nye=Tp();Object.defineProperty(Ve,"defaultParserErrorProvider",{enumerable:!0,get:function(){return Nye.defaultParserErrorProvider}});var qp=Bg();Object.defineProperty(Ve,"EarlyExitException",{enumerable:!0,get:function(){return qp.EarlyExitException}});Object.defineProperty(Ve,"isRecognitionException",{enumerable:!0,get:function(){return qp.isRecognitionException}});Object.defineProperty(Ve,"MismatchedTokenException",{enumerable:!0,get:function(){return qp.MismatchedTokenException}});Object.defineProperty(Ve,"NotAllInputParsedException",{enumerable:!0,get:function(){return qp.NotAllInputParsedException}});Object.defineProperty(Ve,"NoViableAltException",{enumerable:!0,get:function(){return qp.NoViableAltException}});var Lye=PS();Object.defineProperty(Ve,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return Lye.defaultLexerErrorProvider}});var qo=bn();Object.defineProperty(Ve,"Alternation",{enumerable:!0,get:function(){return qo.Alternation}});Object.defineProperty(Ve,"Alternative",{enumerable:!0,get:function(){return qo.Alternative}});Object.defineProperty(Ve,"NonTerminal",{enumerable:!0,get:function(){return qo.NonTerminal}});Object.defineProperty(Ve,"Option",{enumerable:!0,get:function(){return qo.Option}});Object.defineProperty(Ve,"Repetition",{enumerable:!0,get:function(){return qo.Repetition}});Object.defineProperty(Ve,"RepetitionMandatory",{enumerable:!0,get:function(){return qo.RepetitionMandatory}});Object.defineProperty(Ve,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionMandatoryWithSeparator}});Object.defineProperty(Ve,"RepetitionWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionWithSeparator}});Object.defineProperty(Ve,"Rule",{enumerable:!0,get:function(){return qo.Rule}});Object.defineProperty(Ve,"Terminal",{enumerable:!0,get:function(){return qo.Terminal}});var $G=bn();Object.defineProperty(Ve,"serializeGrammar",{enumerable:!0,get:function(){return $G.serializeGrammar}});Object.defineProperty(Ve,"serializeProduction",{enumerable:!0,get:function(){return $G.serializeProduction}});var Tye=Eg();Object.defineProperty(Ve,"GAstVisitor",{enumerable:!0,get:function(){return Tye.GAstVisitor}});function Oye(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. - It performs no action other than printing this message. - Please avoid using it as it will be completely removed in the future`)}Ve.clearCache=Oye;var Mye=XG();Object.defineProperty(Ve,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return Mye.createSyntaxDiagramsCode}});var Kye=function(){function r(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. -See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return r}();Ve.Parser=Kye});var iY=w((Z$e,tY)=>{var Cy=eY(),Wa=Cy.createToken,rY=Cy.tokenMatcher,tv=Cy.Lexer,Uye=Cy.EmbeddedActionsParser;tY.exports=r=>{let e=Wa({name:"LogicalOperator",pattern:tv.NA}),t=Wa({name:"Or",pattern:/\|/,categories:e}),i=Wa({name:"Xor",pattern:/\^/,categories:e}),n=Wa({name:"And",pattern:/&/,categories:e}),s=Wa({name:"Not",pattern:/!/}),o=Wa({name:"LParen",pattern:/\(/}),a=Wa({name:"RParen",pattern:/\)/}),l=Wa({name:"Query",pattern:r}),u=[Wa({name:"WhiteSpace",pattern:/\s+/,group:tv.SKIPPED}),t,i,n,o,a,s,e,l],g=new tv(u);class f extends Uye{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let y=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let b=y,v=this.CONSUME(e),x=this.SUBRULE2(this.atomicExpression);rY(v,t)?y=T=>b(T)||x(T):rY(v,i)?y=T=>!!(b(T)^x(T)):y=T=>b(T)&&x(T)}),y}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:m}=this.CONSUME(l);return y=>y(m)}},{ALT:()=>{this.CONSUME(s);let m=this.SUBRULE(this.atomicExpression);return y=>!m(y)}}])),this.RULE("parenthesisExpression",()=>{let m;return this.CONSUME(o),m=this.SUBRULE(this.expression),this.CONSUME(a),m}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var nY=w(my=>{var Hye=iY();my.makeParser=(r=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:t}=Hye(r),i=new t;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};my.parse=my.makeParser()});var oY=w((eet,sY)=>{"use strict";sY.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var rv=w((tet,aY)=>{var Jp=oY(),AY={};for(let r of Object.keys(Jp))AY[Jp[r]]=r;var at={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};aY.exports=at;for(let r of Object.keys(at)){if(!("channels"in at[r]))throw new Error("missing channels property: "+r);if(!("labels"in at[r]))throw new Error("missing channel labels property: "+r);if(at[r].labels.length!==at[r].channels)throw new Error("channel and label counts mismatch: "+r);let{channels:e,labels:t}=at[r];delete at[r].channels,delete at[r].labels,Object.defineProperty(at[r],"channels",{value:e}),Object.defineProperty(at[r],"labels",{value:t})}at.rgb.hsl=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(e,t,i),s=Math.max(e,t,i),o=s-n,a,l;s===n?a=0:e===s?a=(t-i)/o:t===s?a=2+(i-e)/o:i===s&&(a=4+(e-t)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};at.rgb.hsv=function(r){let e,t,i,n,s,o=r[0]/255,a=r[1]/255,l=r[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),t=g(a),i=g(l),o===c?n=i-t:a===c?n=1/3+e-i:l===c&&(n=2/3+t-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};at.rgb.hwb=function(r){let e=r[0],t=r[1],i=r[2],n=at.rgb.hsl(r)[0],s=1/255*Math.min(e,Math.min(t,i));return i=1-1/255*Math.max(e,Math.max(t,i)),[n,s*100,i*100]};at.rgb.cmyk=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(1-e,1-t,1-i),s=(1-e-n)/(1-n)||0,o=(1-t-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function jye(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}at.rgb.keyword=function(r){let e=AY[r];if(e)return e;let t=Infinity,i;for(let n of Object.keys(Jp)){let s=Jp[n],o=jye(r,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+t*.3576+i*.1805,s=e*.2126+t*.7152+i*.0722,o=e*.0193+t*.1192+i*.9505;return[n*100,s*100,o*100]};at.rgb.lab=function(r){let e=at.rgb.xyz(r),t=e[0],i=e[1],n=e[2];t/=95.047,i/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(t-i),a=200*(i-n);return[s,o,a]};at.hsl.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n,s,o;if(t===0)return o=i*255,[o,o,o];i<.5?n=i*(1+t):n=i+t-i*t;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};at.hsl.hsv=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=t,s=Math.max(i,.01);i*=2,t*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+t)/2,a=i===0?2*n/(s+n):2*t/(i+t);return[e,a*100,o*100]};at.hsv.rgb=function(r){let e=r[0]/60,t=r[1]/100,i=r[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-t),a=255*i*(1-t*s),l=255*i*(1-t*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};at.hsv.hsl=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=Math.max(i,.01),s,o;o=(2-t)*i;let a=(2-t)*n;return s=t*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};at.hwb.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n=t+i,s;n>1&&(t/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=t+s*(a-t),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=t;break;case 1:c=l,u=a,g=t;break;case 2:c=t,u=a,g=l;break;case 3:c=t,u=l,g=a;break;case 4:c=l,u=t,g=a;break;case 5:c=a,u=t,g=l;break}return[c*255,u*255,g*255]};at.cmyk.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n=r[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,t*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};at.xyz.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n,s,o;return n=e*3.2406+t*-1.5372+i*-.4986,s=e*-.9689+t*1.8758+i*.0415,o=e*.0557+t*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};at.xyz.lab=function(r){let e=r[0],t=r[1],i=r[2];e/=95.047,t/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*t-16,s=500*(e-t),o=200*(t-i);return[n,s,o]};at.lab.xyz=function(r){let e=r[0],t=r[1],i=r[2],n,s,o;s=(e+16)/116,n=t/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};at.lab.lch=function(r){let e=r[0],t=r[1],i=r[2],n;n=Math.atan2(i,t)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(t*t+i*i);return[e,o,n]};at.lch.lab=function(r){let e=r[0],t=r[1],n=r[2]/360*2*Math.PI,s=t*Math.cos(n),o=t*Math.sin(n);return[e,s,o]};at.rgb.ansi16=function(r,e=null){let[t,i,n]=r,s=e===null?at.rgb.hsv(r)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(t/255));return s===2&&(o+=60),o};at.hsv.ansi16=function(r){return at.rgb.ansi16(at.hsv.rgb(r),r[2])};at.rgb.ansi256=function(r){let e=r[0],t=r[1],i=r[2];return e===t&&t===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(i/255*5)};at.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let t=(~~(r>50)+1)*.5,i=(e&1)*t*255,n=(e>>1&1)*t*255,s=(e>>2&1)*t*255;return[i,n,s]};at.ansi256.rgb=function(r){if(r>=232){let s=(r-232)*10+8;return[s,s,s]}r-=16;let e,t=Math.floor(r/36)/5*255,i=Math.floor((e=r%36)/6)/5*255,n=e%6/5*255;return[t,i,n]};at.rgb.hex=function(r){let t=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return"000000".substring(t.length)+t};at.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let t=e[0];e[0].length===3&&(t=t.split("").map(a=>a+a).join(""));let i=parseInt(t,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};at.rgb.hcg=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.max(Math.max(e,t),i),s=Math.min(Math.min(e,t),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(t-i)/o%6:n===t?l=2+(i-e)/o:l=4+(e-t)/o,l/=6,l%=1,[l*360,o*100,a*100]};at.hsl.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=t<.5?2*e*t:2*e*(1-t),n=0;return i<1&&(n=(t-.5*i)/(1-i)),[r[0],i*100,n*100]};at.hsv.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=e*t,n=0;return i<1&&(n=(t-i)/(1-i)),[r[0],i*100,n*100]};at.hcg.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100;if(t===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-t)*i,[(t*n[0]+l)*255,(t*n[1]+l)*255,(t*n[2]+l)*255]};at.hcg.hsv=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e),n=0;return i>0&&(n=e/i),[r[0],n*100,i*100]};at.hcg.hsl=function(r){let e=r[1]/100,i=r[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[r[0],n*100,i*100]};at.hcg.hwb=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e);return[r[0],(i-e)*100,(1-i)*100]};at.hwb.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=1-t,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[r[0],n*100,s*100]};at.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]};at.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]};at.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]};at.gray.hsl=function(r){return[0,0,r[0]]};at.gray.hsv=at.gray.hsl;at.gray.hwb=function(r){return[0,100,r[0]]};at.gray.cmyk=function(r){return[0,0,0,r[0]]};at.gray.lab=function(r){return[r[0],0,0]};at.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};at.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var cY=w((ret,lY)=>{var Ey=rv();function Gye(){let r={},e=Object.keys(Ey);for(let t=e.length,i=0;i{var iv=rv(),Wye=cY(),vg={},zye=Object.keys(iv);function _ye(r){let e=function(...t){let i=t[0];return i==null?i:(i.length>1&&(t=i),r(t))};return"conversion"in r&&(e.conversion=r.conversion),e}function Vye(r){let e=function(...t){let i=t[0];if(i==null)return i;i.length>1&&(t=i);let n=r(t);if(typeof n=="object")for(let s=n.length,o=0;o{vg[r]={},Object.defineProperty(vg[r],"channels",{value:iv[r].channels}),Object.defineProperty(vg[r],"labels",{value:iv[r].labels});let e=Wye(r);Object.keys(e).forEach(i=>{let n=e[i];vg[r][i]=Vye(n),vg[r][i].raw=_ye(n)})});uY.exports=vg});var mY=w((net,fY)=>{"use strict";var hY=(r,e)=>(...t)=>`[${r(...t)+e}m`,pY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};5;${i}m`},dY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},Iy=r=>r,CY=(r,e,t)=>[r,e,t],xg=(r,e,t)=>{Object.defineProperty(r,e,{get:()=>{let i=t();return Object.defineProperty(r,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},nv,kg=(r,e,t,i)=>{nv===void 0&&(nv=gY());let n=i?10:0,s={};for(let[o,a]of Object.entries(nv)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=r(t,n):typeof a=="object"&&(s[l]=r(a[e],n))}return s};function Xye(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[t,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],r.set(s[0],s[1]);Object.defineProperty(e,t,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:r,enumerable:!1}),e.color.close="",e.bgColor.close="",xg(e.color,"ansi",()=>kg(hY,"ansi16",Iy,!1)),xg(e.color,"ansi256",()=>kg(pY,"ansi256",Iy,!1)),xg(e.color,"ansi16m",()=>kg(dY,"rgb",CY,!1)),xg(e.bgColor,"ansi",()=>kg(hY,"ansi16",Iy,!0)),xg(e.bgColor,"ansi256",()=>kg(pY,"ansi256",Iy,!0)),xg(e.bgColor,"ansi16m",()=>kg(dY,"rgb",CY,!0)),e}Object.defineProperty(fY,"exports",{enumerable:!0,get:Xye})});var IY=w((set,EY)=>{"use strict";EY.exports=(r,e=process.argv)=>{let t=r.startsWith("-")?"":r.length===1?"-":"--",i=e.indexOf(t+r),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var Zye=require("os"),wY=require("tty"),Ps=IY(),{env:gi}=process,tl;Ps("no-color")||Ps("no-colors")||Ps("color=false")||Ps("color=never")?tl=0:(Ps("color")||Ps("colors")||Ps("color=true")||Ps("color=always"))&&(tl=1);"FORCE_COLOR"in gi&&(gi.FORCE_COLOR==="true"?tl=1:gi.FORCE_COLOR==="false"?tl=0:tl=gi.FORCE_COLOR.length===0?1:Math.min(parseInt(gi.FORCE_COLOR,10),3));function sv(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function ov(r,e){if(tl===0)return 0;if(Ps("color=16m")||Ps("color=full")||Ps("color=truecolor"))return 3;if(Ps("color=256"))return 2;if(r&&!e&&tl===void 0)return 0;let t=tl||0;if(gi.TERM==="dumb")return t;if(process.platform==="win32"){let i=Zye.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in gi)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in gi)||gi.CI_NAME==="codeship"?1:t;if("TEAMCITY_VERSION"in gi)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(gi.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in gi)return 1;if(gi.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in gi){let i=parseInt((gi.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(gi.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(gi.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(gi.TERM)||"COLORTERM"in gi?1:t}function $ye(r){let e=ov(r,r&&r.isTTY);return sv(e)}yY.exports={supportsColor:$ye,stdout:sv(ov(!0,wY.isatty(1))),stderr:sv(ov(!0,wY.isatty(2)))}});var QY=w((aet,bY)=>{"use strict";var ewe=(r,e,t)=>{let i=r.indexOf(e);if(i===-1)return r;let n=e.length,s=0,o="";do o+=r.substr(s,i-s)+e+t,s=i+n,i=r.indexOf(e,s);while(i!==-1);return o+=r.substr(s),o},twe=(r,e,t,i)=>{let n=0,s="";do{let o=r[i-1]==="\r";s+=r.substr(n,(o?i-1:i)-n)+e+(o?`\r -`:` -`)+t,n=i+1,i=r.indexOf(` -`,n)}while(i!==-1);return s+=r.substr(n),s};bY.exports={stringReplaceAll:ewe,stringEncaseCRLFWithFirstIndex:twe}});var PY=w((Aet,SY)=>{"use strict";var rwe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,vY=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,iwe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,nwe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,swe=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function xY(r){let e=r[0]==="u",t=r[1]==="{";return e&&!t&&r.length===5||r[0]==="x"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&t?String.fromCodePoint(parseInt(r.slice(2,-1),16)):swe.get(r)||r}function owe(r,e){let t=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))t.push(o);else if(n=s.match(iwe))t.push(n[2].replace(nwe,(a,l,c)=>l?xY(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${r}')`)}return t}function awe(r){vY.lastIndex=0;let e=[],t;for(;(t=vY.exec(r))!==null;){let i=t[1];if(t[2]){let n=owe(i,t[2]);e.push([i].concat(n))}else e.push([i])}return e}function kY(r,e){let t={};for(let n of e)for(let s of n.styles)t[s[0]]=n.inverse?null:s.slice(1);let i=r;for(let[n,s]of Object.entries(t))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}SY.exports=(r,e)=>{let t=[],i=[],n=[];if(e.replace(rwe,(s,o,a,l,c,u)=>{if(o)n.push(xY(o));else if(l){let g=n.join("");n=[],i.push(t.length===0?g:kY(r,t)(g)),t.push({inverse:a,styles:awe(l)})}else if(c){if(t.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(kY(r,t)(n.join(""))),n=[],t.pop()}else n.push(u)}),i.push(n.join("")),t.length>0){let s=`Chalk template literal is missing ${t.length} closing bracket${t.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var uv=w((cet,DY)=>{"use strict";var Wp=mY(),{stdout:av,stderr:Av}=BY(),{stringReplaceAll:Awe,stringEncaseCRLFWithFirstIndex:lwe}=QY(),RY=["ansi","ansi","ansi256","ansi16m"],Pg=Object.create(null),cwe=(r,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let t=av?av.level:0;r.level=e.level===void 0?t:e.level},FY=class{constructor(e){return NY(e)}},NY=r=>{let e={};return cwe(e,r),e.template=(...t)=>uwe(e.template,...t),Object.setPrototypeOf(e,yy.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=FY,e.template};function yy(r){return NY(r)}for(let[r,e]of Object.entries(Wp))Pg[r]={get(){let t=wy(this,lv(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:t}),t}};Pg.visible={get(){let r=wy(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:r}),r}};var LY=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let r of LY)Pg[r]={get(){let{level:e}=this;return function(...t){let i=lv(Wp.color[RY[e]][r](...t),Wp.color.close,this._styler);return wy(this,i,this._isEmpty)}}};for(let r of LY){let e="bg"+r[0].toUpperCase()+r.slice(1);Pg[e]={get(){let{level:t}=this;return function(...i){let n=lv(Wp.bgColor[RY[t]][r](...i),Wp.bgColor.close,this._styler);return wy(this,n,this._isEmpty)}}}}var gwe=Object.defineProperties(()=>{},te(N({},Pg),{level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}})),lv=(r,e,t)=>{let i,n;return t===void 0?(i=r,n=e):(i=t.openAll+r,n=e+t.closeAll),{open:r,close:e,openAll:i,closeAll:n,parent:t}},wy=(r,e,t)=>{let i=(...n)=>fwe(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=gwe,i._generator=r,i._styler=e,i._isEmpty=t,i},fwe=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?"":e;let t=r._styler;if(t===void 0)return e;let{openAll:i,closeAll:n}=t;if(e.indexOf("")!==-1)for(;t!==void 0;)e=Awe(e,t.close,t.open),t=t.parent;let s=e.indexOf(` -`);return s!==-1&&(e=lwe(e,n,i,s)),i+e+n},cv,uwe=(r,...e)=>{let[t]=e;if(!Array.isArray(t))return e.join(" ");let i=e.slice(1),n=[t.raw[0]];for(let s=1;s{"use strict";Ds.isInteger=r=>typeof r=="number"?Number.isInteger(r):typeof r=="string"&&r.trim()!==""?Number.isInteger(Number(r)):!1;Ds.find=(r,e)=>r.nodes.find(t=>t.type===e);Ds.exceedsLimit=(r,e,t=1,i)=>i===!1||!Ds.isInteger(r)||!Ds.isInteger(e)?!1:(Number(e)-Number(r))/Number(t)>=i;Ds.escapeNode=(r,e=0,t)=>{let i=r.nodes[e];!i||(t&&i.type===t||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};Ds.encloseBrace=r=>r.type!=="brace"?!1:r.commas>>0+r.ranges>>0==0?(r.invalid=!0,!0):!1;Ds.isInvalidBrace=r=>r.type!=="brace"?!1:r.invalid===!0||r.dollar?!0:r.commas>>0+r.ranges>>0==0||r.open!==!0||r.close!==!0?(r.invalid=!0,!0):!1;Ds.isOpenOrClose=r=>r.type==="open"||r.type==="close"?!0:r.open===!0||r.close===!0;Ds.reduce=r=>r.reduce((e,t)=>(t.type==="text"&&e.push(t.value),t.type==="range"&&(t.type="text"),e),[]);Ds.flatten=(...r)=>{let e=[],t=i=>{for(let n=0;n{"use strict";var OY=By();TY.exports=(r,e={})=>{let t=(i,n={})=>{let s=e.escapeInvalid&&OY.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&OY.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=t(l);return a};return t(r)}});var KY=w((fet,MY)=>{"use strict";MY.exports=function(r){return typeof r=="number"?r-r==0:typeof r=="string"&&r.trim()!==""?Number.isFinite?Number.isFinite(+r):isFinite(+r):!1}});var zY=w((het,UY)=>{"use strict";var HY=KY(),Rc=(r,e,t)=>{if(HY(r)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||r===e)return String(r);if(HY(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=N({relaxZeros:!0},t);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=r+":"+e+"="+n+s+o+a;if(Rc.cache.hasOwnProperty(l))return Rc.cache[l].result;let c=Math.min(r,e),u=Math.max(r,e);if(Math.abs(c-u)===1){let m=r+"|"+e;return i.capture?`(${m})`:i.wrap===!1?m:`(?:${m})`}let g=GY(r)||GY(e),f={min:r,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let m=u<0?Math.abs(u):1;p=jY(m,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=jY(c,u,f,i)),f.negatives=p,f.positives=h,f.result=hwe(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Rc.cache[l]=f,f.result};function hwe(r,e,t){let i=gv(r,e,"-",!1,t)||[],n=gv(e,r,"",!1,t)||[],s=gv(r,e,"-?",!0,t)||[];return i.concat(s).concat(n).join("|")}function dwe(r,e){let t=1,i=1,n=YY(r,t),s=new Set([e]);for(;r<=n&&n<=e;)s.add(n),t+=1,n=YY(r,t);for(n=qY(e+1,i)-1;r1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+JY(a.count),o=c+1;continue}t.isPadded&&(g=Iwe(c,t,i)),u.string=g+u.pattern+JY(u.count),s.push(u),o=c+1,a=u}return s}function gv(r,e,t,i,n){let s=[];for(let o of r){let{string:a}=o;!i&&!WY(e,"string",a)&&s.push(t+a),i&&WY(e,"string",a)&&s.push(t+a)}return s}function Cwe(r,e){let t=[];for(let i=0;ie?1:e>r?-1:0}function WY(r,e,t){return r.some(i=>i[e]===t)}function YY(r,e){return Number(String(r).slice(0,-e)+"9".repeat(e))}function qY(r,e){return r-r%Math.pow(10,e)}function JY(r){let[e=0,t=""]=r;return t||e>1?`{${e+(t?","+t:"")}}`:""}function mwe(r,e,t){return`[${r}${e-r==1?"":"-"}${e}]`}function GY(r){return/^-?(0+)\d/.test(r)}function Iwe(r,e,t){if(!e.isPadded)return r;let i=Math.abs(e.maxLen-String(r).length),n=t.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}Rc.cache={};Rc.clearCache=()=>Rc.cache={};UY.exports=Rc});var pv=w((pet,_Y)=>{"use strict";var ywe=require("util"),VY=zY(),XY=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),wwe=r=>e=>r===!0?Number(e):String(e),fv=r=>typeof r=="number"||typeof r=="string"&&r!=="",_p=r=>Number.isInteger(+r),hv=r=>{let e=`${r}`,t=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++t]==="0";);return t>0},Bwe=(r,e,t)=>typeof r=="string"||typeof e=="string"?!0:t.stringify===!0,bwe=(r,e,t)=>{if(e>0){let i=r[0]==="-"?"-":"";i&&(r=r.slice(1)),r=i+r.padStart(i?e-1:e,"0")}return t===!1?String(r):r},ZY=(r,e)=>{let t=r[0]==="-"?"-":"";for(t&&(r=r.slice(1),e--);r.length{r.negatives.sort((o,a)=>oa?1:0),r.positives.sort((o,a)=>oa?1:0);let t=e.capture?"":"?:",i="",n="",s;return r.positives.length&&(i=r.positives.join("|")),r.negatives.length&&(n=`-(${t}${r.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${t}${s})`:s},$Y=(r,e,t,i)=>{if(t)return VY(r,e,N({wrap:!1},i));let n=String.fromCharCode(r);if(r===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},eq=(r,e,t)=>{if(Array.isArray(r)){let i=t.wrap===!0,n=t.capture?"":"?:";return i?`(${n}${r.join("|")})`:r.join("|")}return VY(r,e,t)},tq=(...r)=>new RangeError("Invalid range arguments: "+ywe.inspect(...r)),rq=(r,e,t)=>{if(t.strictRanges===!0)throw tq([r,e]);return[]},Swe=(r,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${r}" to be a number`);return[]},vwe=(r,e,t=1,i={})=>{let n=Number(r),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw tq([r,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(r),l=String(e),c=String(t);t=Math.max(Math.abs(t),1);let u=hv(a)||hv(l)||hv(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Bwe(r,e,i)===!1,h=i.transform||wwe(f);if(i.toRegex&&t===1)return $Y(ZY(r,g),ZY(e,g),!0,i);let p={negatives:[],positives:[]},m=v=>p[v<0?"negatives":"positives"].push(Math.abs(v)),y=[],b=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&t>1?m(n):y.push(bwe(h(n,b),g,f)),n=o?n-t:n+t,b++;return i.toRegex===!0?t>1?Qwe(p,i):eq(y,null,N({wrap:!1},i)):y},xwe=(r,e,t=1,i={})=>{if(!_p(r)&&r.length>1||!_p(e)&&e.length>1)return rq(r,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${r}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&t===1)return $Y(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-t:s+t,g++;return i.toRegex===!0?eq(u,null,{wrap:!1,options:i}):u},Qy=(r,e,t,i={})=>{if(e==null&&fv(r))return[r];if(!fv(r)||!fv(e))return rq(r,e,i);if(typeof t=="function")return Qy(r,e,1,{transform:t});if(XY(t))return Qy(r,e,0,t);let n=N({},i);return n.capture===!0&&(n.wrap=!0),t=t||n.step||1,_p(t)?_p(r)&&_p(e)?vwe(r,e,t,n):xwe(r,e,Math.max(Math.abs(t),1),n):t!=null&&!XY(t)?Swe(t,n):Qy(r,e,1,t)};_Y.exports=Qy});var sq=w((det,iq)=>{"use strict";var kwe=pv(),nq=By(),Pwe=(r,e={})=>{let t=(i,n={})=>{let s=nq.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=nq.reduce(i.nodes),g=kwe(...u,te(N({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=t(u,i);return c};return t(r)};iq.exports=Pwe});var Aq=w((Cet,oq)=>{"use strict";var Dwe=pv(),aq=by(),Dg=By(),Fc=(r="",e="",t=!1)=>{let i=[];if(r=[].concat(r),e=[].concat(e),!e.length)return r;if(!r.length)return t?Dg.flatten(e).map(n=>`{${n}}`):e;for(let n of r)if(Array.isArray(n))for(let s of n)i.push(Fc(s,e,t));else for(let s of e)t===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?Fc(n,s,t):n+s);return Dg.flatten(i)},Rwe=(r,e={})=>{let t=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(Fc(a.pop(),aq(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(Fc(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=Dg.reduce(n.nodes);if(Dg.exceedsLimit(...g,e.step,t))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=Dwe(...g,e);f.length===0&&(f=aq(n,e)),a.push(Fc(a.pop(),f)),n.nodes=[];return}let l=Dg.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";lq.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` -`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var pq=w((Eet,uq)=>{"use strict";var Fwe=by(),{MAX_LENGTH:gq,CHAR_BACKSLASH:dv,CHAR_BACKTICK:Nwe,CHAR_COMMA:Lwe,CHAR_DOT:Twe,CHAR_LEFT_PARENTHESES:Owe,CHAR_RIGHT_PARENTHESES:Mwe,CHAR_LEFT_CURLY_BRACE:Kwe,CHAR_RIGHT_CURLY_BRACE:Uwe,CHAR_LEFT_SQUARE_BRACKET:fq,CHAR_RIGHT_SQUARE_BRACKET:hq,CHAR_DOUBLE_QUOTE:Hwe,CHAR_SINGLE_QUOTE:jwe,CHAR_NO_BREAK_SPACE:Gwe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Ywe}=cq(),qwe=(r,e={})=>{if(typeof r!="string")throw new TypeError("Expected a string");let t=e||{},i=typeof t.maxLength=="number"?Math.min(gq,t.maxLength):gq;if(r.length>i)throw new SyntaxError(`Input length (${r.length}), exceeds max characters (${i})`);let n={type:"root",input:r,nodes:[]},s=[n],o=n,a=n,l=0,c=r.length,u=0,g=0,f,h={},p=()=>r[u++],m=y=>{if(y.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&y.type==="text"){a.value+=y.value;return}return o.nodes.push(y),y.parent=o,y.prev=a,a=y,y};for(m({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:"text",value:Fwe(o)}]}m({type:"comma",value:f}),o.commas++;continue}if(f===Twe&&g>0&&o.commas===0){let y=o.nodes;if(g===0||y.length===0){m({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){y.pop();let b=y[y.length-1];b.value+=a.value+f,a=b,o.ranges--;continue}m({type:"dot",value:f});continue}m({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(v=>{v.nodes||(v.type==="open"&&(v.isOpen=!0),v.type==="close"&&(v.isClose=!0),v.nodes||(v.type="text"),v.invalid=!0)});let y=s[s.length-1],b=y.nodes.indexOf(o);y.nodes.splice(b,1,...o.nodes)}while(s.length>0);return m({type:"eos"}),n};uq.exports=qwe});var mq=w((Iet,dq)=>{"use strict";var Cq=by(),Jwe=sq(),Wwe=Aq(),zwe=pq(),ts=(r,e={})=>{let t=[];if(Array.isArray(r))for(let i of r){let n=ts.create(i,e);Array.isArray(n)?t.push(...n):t.push(n)}else t=[].concat(ts.create(r,e));return e&&e.expand===!0&&e.nodupes===!0&&(t=[...new Set(t)]),t};ts.parse=(r,e={})=>zwe(r,e);ts.stringify=(r,e={})=>typeof r=="string"?Cq(ts.parse(r,e),e):Cq(r,e);ts.compile=(r,e={})=>(typeof r=="string"&&(r=ts.parse(r,e)),Jwe(r,e));ts.expand=(r,e={})=>{typeof r=="string"&&(r=ts.parse(r,e));let t=Wwe(r,e);return e.noempty===!0&&(t=t.filter(Boolean)),e.nodupes===!0&&(t=[...new Set(t)]),t};ts.create=(r,e={})=>r===""||r.length<3?[r]:e.expand!==!0?ts.compile(r,e):ts.expand(r,e);dq.exports=ts});var Vp=w((yet,Eq)=>{"use strict";var _we=require("path"),Jo="\\\\/",Iq=`[^${Jo}]`,za="\\.",Vwe="\\+",Xwe="\\?",Sy="\\/",Zwe="(?=.)",yq="[^/]",Cv=`(?:${Sy}|$)`,wq=`(?:^|${Sy})`,mv=`${za}{1,2}${Cv}`,$we=`(?!${za})`,eBe=`(?!${wq}${mv})`,tBe=`(?!${za}{0,1}${Cv})`,rBe=`(?!${mv})`,iBe=`[^.${Sy}]`,nBe=`${yq}*?`,Bq={DOT_LITERAL:za,PLUS_LITERAL:Vwe,QMARK_LITERAL:Xwe,SLASH_LITERAL:Sy,ONE_CHAR:Zwe,QMARK:yq,END_ANCHOR:Cv,DOTS_SLASH:mv,NO_DOT:$we,NO_DOTS:eBe,NO_DOT_SLASH:tBe,NO_DOTS_SLASH:rBe,QMARK_NO_DOT:iBe,STAR:nBe,START_ANCHOR:wq},sBe=te(N({},Bq),{SLASH_LITERAL:`[${Jo}]`,QMARK:Iq,STAR:`${Iq}*?`,DOTS_SLASH:`${za}{1,2}(?:[${Jo}]|$)`,NO_DOT:`(?!${za})`,NO_DOTS:`(?!(?:^|[${Jo}])${za}{1,2}(?:[${Jo}]|$))`,NO_DOT_SLASH:`(?!${za}{0,1}(?:[${Jo}]|$))`,NO_DOTS_SLASH:`(?!${za}{1,2}(?:[${Jo}]|$))`,QMARK_NO_DOT:`[^.${Jo}]`,START_ANCHOR:`(?:^|[${Jo}])`,END_ANCHOR:`(?:[${Jo}]|$)`}),oBe={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};Eq.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:oBe,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:_we.sep,extglobChars(r){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${r.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(r){return r===!0?sBe:Bq}}});var Xp=w(xn=>{"use strict";var aBe=require("path"),ABe=process.platform==="win32",{REGEX_BACKSLASH:lBe,REGEX_REMOVE_BACKSLASH:cBe,REGEX_SPECIAL_CHARS:uBe,REGEX_SPECIAL_CHARS_GLOBAL:gBe}=Vp();xn.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);xn.hasRegexChars=r=>uBe.test(r);xn.isRegexChar=r=>r.length===1&&xn.hasRegexChars(r);xn.escapeRegex=r=>r.replace(gBe,"\\$1");xn.toPosixSlashes=r=>r.replace(lBe,"/");xn.removeBackslashes=r=>r.replace(cBe,e=>e==="\\"?"":e);xn.supportsLookbehinds=()=>{let r=process.version.slice(1).split(".").map(Number);return r.length===3&&r[0]>=9||r[0]===8&&r[1]>=10};xn.isWindows=r=>r&&typeof r.windows=="boolean"?r.windows:ABe===!0||aBe.sep==="\\";xn.escapeLast=(r,e,t)=>{let i=r.lastIndexOf(e,t);return i===-1?r:r[i-1]==="\\"?xn.escapeLast(r,e,i-1):`${r.slice(0,i)}\\${r.slice(i)}`};xn.removePrefix=(r,e={})=>{let t=r;return t.startsWith("./")&&(t=t.slice(2),e.prefix="./"),t};xn.wrapOutput=(r,e={},t={})=>{let i=t.contains?"":"^",n=t.contains?"":"$",s=`${i}(?:${r})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var Dq=w((Bet,bq)=>{"use strict";var Qq=Xp(),{CHAR_ASTERISK:Ev,CHAR_AT:fBe,CHAR_BACKWARD_SLASH:Zp,CHAR_COMMA:hBe,CHAR_DOT:Iv,CHAR_EXCLAMATION_MARK:yv,CHAR_FORWARD_SLASH:Sq,CHAR_LEFT_CURLY_BRACE:wv,CHAR_LEFT_PARENTHESES:Bv,CHAR_LEFT_SQUARE_BRACKET:pBe,CHAR_PLUS:dBe,CHAR_QUESTION_MARK:vq,CHAR_RIGHT_CURLY_BRACE:CBe,CHAR_RIGHT_PARENTHESES:xq,CHAR_RIGHT_SQUARE_BRACKET:mBe}=Vp(),kq=r=>r===Sq||r===Zp,Pq=r=>{r.isPrefix!==!0&&(r.depth=r.isGlobstar?Infinity:1)},EBe=(r,e)=>{let t=e||{},i=r.length-1,n=t.parts===!0||t.scanToEnd===!0,s=[],o=[],a=[],l=r,c=-1,u=0,g=0,f=!1,h=!1,p=!1,m=!1,y=!1,b=!1,v=!1,x=!1,T=!1,q=!1,Y=0,$,_,ne={value:"",depth:0,isGlob:!1},ee=()=>c>=i,A=()=>l.charCodeAt(c+1),oe=()=>($=_,l.charCodeAt(++c));for(;c0&&(Z=l.slice(0,u),l=l.slice(u),g-=u),ce&&p===!0&&g>0?(ce=l.slice(0,g),O=l.slice(g)):p===!0?(ce="",O=l):ce=l,ce&&ce!==""&&ce!=="/"&&ce!==l&&kq(ce.charCodeAt(ce.length-1))&&(ce=ce.slice(0,-1)),t.unescape===!0&&(O&&(O=Qq.removeBackslashes(O)),ce&&v===!0&&(ce=Qq.removeBackslashes(ce)));let L={prefix:Z,input:r,start:u,base:ce,glob:O,isBrace:f,isBracket:h,isGlob:p,isExtglob:m,isGlobstar:y,negated:x,negatedExtglob:T};if(t.tokens===!0&&(L.maxDepth=0,kq(_)||o.push(ne),L.tokens=o),t.parts===!0||t.tokens===!0){let de;for(let Be=0;Be{"use strict";var vy=Vp(),rs=Xp(),{MAX_LENGTH:xy,POSIX_REGEX_SOURCE:IBe,REGEX_NON_SPECIAL_CHARS:yBe,REGEX_SPECIAL_CHARS_BACKREF:wBe,REPLACEMENTS:Fq}=vy,BBe=(r,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...r,e);r.sort();let t=`[${r.join("-")}]`;try{new RegExp(t)}catch(i){return r.map(n=>rs.escapeRegex(n)).join("..")}return t},Rg=(r,e)=>`Missing ${r}: "${e}" - use "\\\\${e}" to match literal characters`,Nq=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");r=Fq[r]||r;let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:t.prepend||""},o=[s],a=t.capture?"":"?:",l=rs.isWindows(e),c=vy.globChars(l),u=vy.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:m,NO_DOT:y,NO_DOT_SLASH:b,NO_DOTS_SLASH:v,QMARK:x,QMARK_NO_DOT:T,STAR:q,START_ANCHOR:Y}=c,$=V=>`(${a}(?:(?!${Y}${V.dot?m:g}).)*?)`,_=t.dot?"":y,ne=t.dot?x:T,ee=t.bash===!0?$(t):q;t.capture&&(ee=`(${ee})`),typeof t.noext=="boolean"&&(t.noextglob=t.noext);let A={input:r,index:-1,start:0,dot:t.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};r=rs.removePrefix(r,A),n=r.length;let oe=[],ce=[],Z=[],O=s,L,de=()=>A.index===n-1,Be=A.peek=(V=1)=>r[A.index+V],je=A.advance=()=>r[++A.index]||"",re=()=>r.slice(A.index+1),se=(V="",Qe=0)=>{A.consumed+=V,A.index+=Qe},be=V=>{A.output+=V.output!=null?V.output:V.value,se(V.value)},he=()=>{let V=1;for(;Be()==="!"&&(Be(2)!=="("||Be(3)==="?");)je(),A.start++,V++;return V%2==0?!1:(A.negated=!0,A.start++,!0)},Fe=V=>{A[V]++,Z.push(V)},Ke=V=>{A[V]--,Z.pop()},ke=V=>{if(O.type==="globstar"){let Qe=A.braces>0&&(V.type==="comma"||V.type==="brace"),le=V.extglob===!0||oe.length&&(V.type==="pipe"||V.type==="paren");V.type!=="slash"&&V.type!=="paren"&&!Qe&&!le&&(A.output=A.output.slice(0,-O.output.length),O.type="star",O.value="*",O.output=ee,A.output+=O.output)}if(oe.length&&V.type!=="paren"&&(oe[oe.length-1].inner+=V.value),(V.value||V.output)&&be(V),O&&O.type==="text"&&V.type==="text"){O.value+=V.value,O.output=(O.output||"")+V.value;return}V.prev=O,o.push(V),O=V},ve=(V,Qe)=>{let le=te(N({},u[Qe]),{conditions:1,inner:""});le.prev=O,le.parens=A.parens,le.output=A.output;let fe=(t.capture?"(":"")+le.open;Fe("parens"),ke({type:V,value:Qe,output:A.output?"":p}),ke({type:"paren",extglob:!0,value:je(),output:fe}),oe.push(le)},pe=V=>{let Qe=V.close+(t.capture?")":""),le;if(V.type==="negate"){let fe=ee;V.inner&&V.inner.length>1&&V.inner.includes("/")&&(fe=$(t)),(fe!==ee||de()||/^\)+$/.test(re()))&&(Qe=V.close=`)$))${fe}`),V.inner.includes("*")&&(le=re())&&/^\.[^\\/.]+$/.test(le)&&(Qe=V.close=`)${le})${fe})`),V.prev.type==="bos"&&(A.negatedExtglob=!0)}ke({type:"paren",extglob:!0,value:L,output:Qe}),Ke("parens")};if(t.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(r)){let V=!1,Qe=r.replace(wBe,(le,fe,gt,Ht,Mt,Ei)=>Ht==="\\"?(V=!0,le):Ht==="?"?fe?fe+Ht+(Mt?x.repeat(Mt.length):""):Ei===0?ne+(Mt?x.repeat(Mt.length):""):x.repeat(gt.length):Ht==="."?g.repeat(gt.length):Ht==="*"?fe?fe+Ht+(Mt?ee:""):ee:fe?le:`\\${le}`);return V===!0&&(t.unescape===!0?Qe=Qe.replace(/\\/g,""):Qe=Qe.replace(/\\+/g,le=>le.length%2==0?"\\\\":le?"\\":"")),Qe===r&&t.contains===!0?(A.output=r,A):(A.output=rs.wrapOutput(Qe,A,e),A)}for(;!de();){if(L=je(),L==="\0")continue;if(L==="\\"){let le=Be();if(le==="/"&&t.bash!==!0||le==="."||le===";")continue;if(!le){L+="\\",ke({type:"text",value:L});continue}let fe=/^\\+/.exec(re()),gt=0;if(fe&&fe[0].length>2&&(gt=fe[0].length,A.index+=gt,gt%2!=0&&(L+="\\")),t.unescape===!0?L=je():L+=je(),A.brackets===0){ke({type:"text",value:L});continue}}if(A.brackets>0&&(L!=="]"||O.value==="["||O.value==="[^")){if(t.posix!==!1&&L===":"){let le=O.value.slice(1);if(le.includes("[")&&(O.posix=!0,le.includes(":"))){let fe=O.value.lastIndexOf("["),gt=O.value.slice(0,fe),Ht=O.value.slice(fe+2),Mt=IBe[Ht];if(Mt){O.value=gt+Mt,A.backtrack=!0,je(),!s.output&&o.indexOf(O)===1&&(s.output=p);continue}}}(L==="["&&Be()!==":"||L==="-"&&Be()==="]")&&(L=`\\${L}`),L==="]"&&(O.value==="["||O.value==="[^")&&(L=`\\${L}`),t.posix===!0&&L==="!"&&O.value==="["&&(L="^"),O.value+=L,be({value:L});continue}if(A.quotes===1&&L!=='"'){L=rs.escapeRegex(L),O.value+=L,be({value:L});continue}if(L==='"'){A.quotes=A.quotes===1?0:1,t.keepQuotes===!0&&ke({type:"text",value:L});continue}if(L==="("){Fe("parens"),ke({type:"paren",value:L});continue}if(L===")"){if(A.parens===0&&t.strictBrackets===!0)throw new SyntaxError(Rg("opening","("));let le=oe[oe.length-1];if(le&&A.parens===le.parens+1){pe(oe.pop());continue}ke({type:"paren",value:L,output:A.parens?")":"\\)"}),Ke("parens");continue}if(L==="["){if(t.nobracket===!0||!re().includes("]")){if(t.nobracket!==!0&&t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));L=`\\${L}`}else Fe("brackets");ke({type:"bracket",value:L});continue}if(L==="]"){if(t.nobracket===!0||O&&O.type==="bracket"&&O.value.length===1){ke({type:"text",value:L,output:`\\${L}`});continue}if(A.brackets===0){if(t.strictBrackets===!0)throw new SyntaxError(Rg("opening","["));ke({type:"text",value:L,output:`\\${L}`});continue}Ke("brackets");let le=O.value.slice(1);if(O.posix!==!0&&le[0]==="^"&&!le.includes("/")&&(L=`/${L}`),O.value+=L,be({value:L}),t.literalBrackets===!1||rs.hasRegexChars(le))continue;let fe=rs.escapeRegex(O.value);if(A.output=A.output.slice(0,-O.value.length),t.literalBrackets===!0){A.output+=fe,O.value=fe;continue}O.value=`(${a}${fe}|${O.value})`,A.output+=O.value;continue}if(L==="{"&&t.nobrace!==!0){Fe("braces");let le={type:"brace",value:L,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};ce.push(le),ke(le);continue}if(L==="}"){let le=ce[ce.length-1];if(t.nobrace===!0||!le){ke({type:"text",value:L,output:L});continue}let fe=")";if(le.dots===!0){let gt=o.slice(),Ht=[];for(let Mt=gt.length-1;Mt>=0&&(o.pop(),gt[Mt].type!=="brace");Mt--)gt[Mt].type!=="dots"&&Ht.unshift(gt[Mt].value);fe=BBe(Ht,t),A.backtrack=!0}if(le.comma!==!0&&le.dots!==!0){let gt=A.output.slice(0,le.outputIndex),Ht=A.tokens.slice(le.tokensIndex);le.value=le.output="\\{",L=fe="\\}",A.output=gt;for(let Mt of Ht)A.output+=Mt.output||Mt.value}ke({type:"brace",value:L,output:fe}),Ke("braces"),ce.pop();continue}if(L==="|"){oe.length>0&&oe[oe.length-1].conditions++,ke({type:"text",value:L});continue}if(L===","){let le=L,fe=ce[ce.length-1];fe&&Z[Z.length-1]==="braces"&&(fe.comma=!0,le="|"),ke({type:"comma",value:L,output:le});continue}if(L==="/"){if(O.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),O=s;continue}ke({type:"slash",value:L,output:h});continue}if(L==="."){if(A.braces>0&&O.type==="dot"){O.value==="."&&(O.output=g);let le=ce[ce.length-1];O.type="dots",O.output+=L,O.value+=L,le.dots=!0;continue}if(A.braces+A.parens===0&&O.type!=="bos"&&O.type!=="slash"){ke({type:"text",value:L,output:g});continue}ke({type:"dot",value:L,output:g});continue}if(L==="?"){if(!(O&&O.value==="(")&&t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("qmark",L);continue}if(O&&O.type==="paren"){let fe=Be(),gt=L;if(fe==="<"&&!rs.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(O.value==="("&&!/[!=<:]/.test(fe)||fe==="<"&&!/<([!=]|\w+>)/.test(re()))&&(gt=`\\${L}`),ke({type:"text",value:L,output:gt});continue}if(t.dot!==!0&&(O.type==="slash"||O.type==="bos")){ke({type:"qmark",value:L,output:T});continue}ke({type:"qmark",value:L,output:x});continue}if(L==="!"){if(t.noextglob!==!0&&Be()==="("&&(Be(2)!=="?"||!/[!=<:]/.test(Be(3)))){ve("negate",L);continue}if(t.nonegate!==!0&&A.index===0){he();continue}}if(L==="+"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("plus",L);continue}if(O&&O.value==="("||t.regex===!1){ke({type:"plus",value:L,output:f});continue}if(O&&(O.type==="bracket"||O.type==="paren"||O.type==="brace")||A.parens>0){ke({type:"plus",value:L});continue}ke({type:"plus",value:f});continue}if(L==="@"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ke({type:"at",extglob:!0,value:L,output:""});continue}ke({type:"text",value:L});continue}if(L!=="*"){(L==="$"||L==="^")&&(L=`\\${L}`);let le=yBe.exec(re());le&&(L+=le[0],A.index+=le[0].length),ke({type:"text",value:L});continue}if(O&&(O.type==="globstar"||O.star===!0)){O.type="star",O.star=!0,O.value+=L,O.output=ee,A.backtrack=!0,A.globstar=!0,se(L);continue}let V=re();if(t.noextglob!==!0&&/^\([^?]/.test(V)){ve("star",L);continue}if(O.type==="star"){if(t.noglobstar===!0){se(L);continue}let le=O.prev,fe=le.prev,gt=le.type==="slash"||le.type==="bos",Ht=fe&&(fe.type==="star"||fe.type==="globstar");if(t.bash===!0&&(!gt||V[0]&&V[0]!=="/")){ke({type:"star",value:L,output:""});continue}let Mt=A.braces>0&&(le.type==="comma"||le.type==="brace"),Ei=oe.length&&(le.type==="pipe"||le.type==="paren");if(!gt&&le.type!=="paren"&&!Mt&&!Ei){ke({type:"star",value:L,output:""});continue}for(;V.slice(0,3)==="/**";){let jt=r[A.index+4];if(jt&&jt!=="/")break;V=V.slice(3),se("/**",3)}if(le.type==="bos"&&de()){O.type="globstar",O.value+=L,O.output=$(t),A.output=O.output,A.globstar=!0,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&!Ht&&de()){A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=$(t)+(t.strictSlashes?")":"|$)"),O.value+=L,A.globstar=!0,A.output+=le.output+O.output,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&V[0]==="/"){let jt=V[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=`${$(t)}${h}|${h}${jt})`,O.value+=L,A.output+=le.output+O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}if(le.type==="bos"&&V[0]==="/"){O.type="globstar",O.value+=L,O.output=`(?:^|${h}|${$(t)}${h})`,A.output=O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-O.output.length),O.type="globstar",O.output=$(t),O.value+=L,A.output+=O.output,A.globstar=!0,se(L);continue}let Qe={type:"star",value:L,output:ee};if(t.bash===!0){Qe.output=".*?",(O.type==="bos"||O.type==="slash")&&(Qe.output=_+Qe.output),ke(Qe);continue}if(O&&(O.type==="bracket"||O.type==="paren")&&t.regex===!0){Qe.output=L,ke(Qe);continue}(A.index===A.start||O.type==="slash"||O.type==="dot")&&(O.type==="dot"?(A.output+=b,O.output+=b):t.dot===!0?(A.output+=v,O.output+=v):(A.output+=_,O.output+=_),Be()!=="*"&&(A.output+=p,O.output+=p)),ke(Qe)}for(;A.brackets>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));A.output=rs.escapeLast(A.output,"["),Ke("brackets")}for(;A.parens>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing",")"));A.output=rs.escapeLast(A.output,"("),Ke("parens")}for(;A.braces>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","}"));A.output=rs.escapeLast(A.output,"{"),Ke("braces")}if(t.strictSlashes!==!0&&(O.type==="star"||O.type==="bracket")&&ke({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let V of A.tokens)A.output+=V.output!=null?V.output:V.value,V.suffix&&(A.output+=V.suffix)}return A};Nq.fastpaths=(r,e)=>{let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);r=Fq[r]||r;let s=rs.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=vy.globChars(s),m=t.dot?g:u,y=t.dot?f:u,b=t.capture?"":"?:",v={negated:!1,prefix:""},x=t.bash===!0?".*?":h;t.capture&&(x=`(${x})`);let T=_=>_.noglobstar===!0?x:`(${b}(?:(?!${p}${_.dot?c:o}).)*?)`,q=_=>{switch(_){case"*":return`${m}${l}${x}`;case".*":return`${o}${l}${x}`;case"*.*":return`${m}${x}${o}${l}${x}`;case"*/*":return`${m}${x}${a}${l}${y}${x}`;case"**":return m+T(t);case"**/*":return`(?:${m}${T(t)}${a})?${y}${l}${x}`;case"**/*.*":return`(?:${m}${T(t)}${a})?${y}${x}${o}${l}${x}`;case"**/.*":return`(?:${m}${T(t)}${a})?${o}${l}${x}`;default:{let ne=/^(.*?)\.(\w+)$/.exec(_);if(!ne)return;let ee=q(ne[1]);return ee?ee+o+ne[2]:void 0}}},Y=rs.removePrefix(r,v),$=q(Y);return $&&t.strictSlashes!==!0&&($+=`${a}?`),$};Rq.exports=Nq});var Oq=w((Qet,Tq)=>{"use strict";var bBe=require("path"),QBe=Dq(),bv=Lq(),Qv=Xp(),SBe=Vp(),vBe=r=>r&&typeof r=="object"&&!Array.isArray(r),_r=(r,e,t=!1)=>{if(Array.isArray(r)){let u=r.map(f=>_r(f,e,t));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=vBe(r)&&r.tokens&&r.input;if(r===""||typeof r!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=Qv.isWindows(e),o=i?_r.compileRe(r,e):_r.makeRe(r,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=te(N({},e),{ignore:null,onMatch:null,onResult:null});l=_r(n.ignore,u,t)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=_r.test(u,o,e,{glob:r,posix:s}),m={glob:r,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(m),f===!1?(m.isMatch=!1,g?m:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(m),m.isMatch=!1,g?m:!1):(typeof n.onMatch=="function"&&n.onMatch(m),g?m:!0)};return t&&(c.state=a),c};_r.test=(r,e,t,{glob:i,posix:n}={})=>{if(typeof r!="string")throw new TypeError("Expected input to be a string");if(r==="")return{isMatch:!1,output:""};let s=t||{},o=s.format||(n?Qv.toPosixSlashes:null),a=r===i,l=a&&o?o(r):r;return a===!1&&(l=o?o(r):r,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=_r.matchBase(r,e,t,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};_r.matchBase=(r,e,t,i=Qv.isWindows(t))=>(e instanceof RegExp?e:_r.makeRe(e,t)).test(bBe.basename(r));_r.isMatch=(r,e,t)=>_r(e,t)(r);_r.parse=(r,e)=>Array.isArray(r)?r.map(t=>_r.parse(t,e)):bv(r,te(N({},e),{fastpaths:!1}));_r.scan=(r,e)=>QBe(r,e);_r.compileRe=(r,e,t=!1,i=!1)=>{if(t===!0)return r.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${r.output})${o}`;r&&r.negated===!0&&(a=`^(?!${a}).*$`);let l=_r.toRegex(a,e);return i===!0&&(l.state=r),l};_r.makeRe=(r,e={},t=!1,i=!1)=>{if(!r||typeof r!="string")throw new TypeError("Expected a non-empty string");let n={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(r[0]==="."||r[0]==="*")&&(n.output=bv.fastpaths(r,e)),n.output||(n=bv(r,e)),_r.compileRe(n,e,t,i)};_r.toRegex=(r,e)=>{try{let t=e||{};return new RegExp(r,t.flags||(t.nocase?"i":""))}catch(t){if(e&&e.debug===!0)throw t;return/$^/}};_r.constants=SBe;Tq.exports=_r});var Sv=w((vet,Mq)=>{"use strict";Mq.exports=Oq()});var is=w((xet,Kq)=>{"use strict";var Uq=require("util"),Hq=mq(),Wo=Sv(),vv=Xp(),jq=r=>r===""||r==="./",Pr=(r,e,t)=>{e=[].concat(e),r=[].concat(r);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),t&&t.onResult&&t.onResult(u)};for(let u=0;u!i.has(u));if(t&&c.length===0){if(t.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(t.nonull===!0||t.nullglob===!0)return t.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};Pr.match=Pr;Pr.matcher=(r,e)=>Wo(r,e);Pr.isMatch=(r,e,t)=>Wo(e,t)(r);Pr.any=Pr.isMatch;Pr.not=(r,e,t={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{t.onResult&&t.onResult(a),n.push(a.output)},o=Pr(r,e,te(N({},t),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};Pr.contains=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);if(Array.isArray(e))return e.some(i=>Pr.contains(r,i,t));if(typeof e=="string"){if(jq(r)||jq(e))return!1;if(r.includes(e)||r.startsWith("./")&&r.slice(2).includes(e))return!0}return Pr.isMatch(r,e,te(N({},t),{contains:!0}))};Pr.matchKeys=(r,e,t)=>{if(!vv.isObject(r))throw new TypeError("Expected the first argument to be an object");let i=Pr(Object.keys(r),e,t),n={};for(let s of i)n[s]=r[s];return n};Pr.some=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(i.some(o=>s(o)))return!0}return!1};Pr.every=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(!i.every(o=>s(o)))return!1}return!0};Pr.all=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);return[].concat(e).every(i=>Wo(i,t)(r))};Pr.capture=(r,e,t)=>{let i=vv.isWindows(t),s=Wo.makeRe(String(r),te(N({},t),{capture:!0})).exec(i?vv.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};Pr.makeRe=(...r)=>Wo.makeRe(...r);Pr.scan=(...r)=>Wo.scan(...r);Pr.parse=(r,e)=>{let t=[];for(let i of[].concat(r||[]))for(let n of Hq(String(i),e))t.push(Wo.parse(n,e));return t};Pr.braces=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(r)?[r]:Hq(r,e)};Pr.braceExpand=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return Pr.braces(r,te(N({},e),{expand:!0}))};Kq.exports=Pr});var Yq=w((ket,Gq)=>{"use strict";Gq.exports=({onlyFirst:r=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,r?void 0:"g")}});var Jq=w((Pet,qq)=>{"use strict";var xBe=Yq();qq.exports=r=>typeof r=="string"?r.replace(xBe(),""):r});var AJ=w((zet,aJ)=>{"use strict";aJ.exports=(...r)=>[...new Set([].concat(...r))]});var jv=w((_et,lJ)=>{"use strict";var UBe=require("stream"),cJ=UBe.PassThrough,HBe=Array.prototype.slice;lJ.exports=jBe;function jBe(){let r=[],e=!1,t=HBe.call(arguments),i=t[t.length-1];i&&!Array.isArray(i)&&i.pipe==null?t.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=cJ(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(Fy,"__esModule",{value:!0});function GBe(r){return r.reduce((e,t)=>[].concat(e,t),[])}Fy.flatten=GBe;function YBe(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i].push(n);return t}Fy.splitWhen=YBe});var fJ=w(Gv=>{"use strict";Object.defineProperty(Gv,"__esModule",{value:!0});function qBe(r){return r.code==="ENOENT"}Gv.isEnoentCodeError=qBe});var pJ=w(Yv=>{"use strict";Object.defineProperty(Yv,"__esModule",{value:!0});var hJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function JBe(r,e){return new hJ(r,e)}Yv.createDirentFromStats=JBe});var dJ=w(Kg=>{"use strict";Object.defineProperty(Kg,"__esModule",{value:!0});var WBe=require("path"),zBe=2,_Be=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function VBe(r){return r.replace(/\\/g,"/")}Kg.unixify=VBe;function XBe(r,e){return WBe.resolve(r,e)}Kg.makeAbsolute=XBe;function ZBe(r){return r.replace(_Be,"\\$2")}Kg.escape=ZBe;function $Be(r){if(r.charAt(0)==="."){let e=r.charAt(1);if(e==="/"||e==="\\")return r.slice(zBe)}return r}Kg.removeLeadingDotSegment=$Be});var mJ=w((ett,CJ)=>{CJ.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var t;t=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}});var yJ=w((ttt,EJ)=>{var e0e=mJ(),IJ={"{":"}","(":")","[":"]"},t0e=function(r){if(r[0]==="!")return!0;for(var e=0,t=-2,i=-2,n=-2,s=-2,o=-2;ee&&(o===-1||o>i||(o=r.indexOf("\\",e),o===-1||o>i)))||n!==-1&&r[e]==="{"&&r[e+1]!=="}"&&(n=r.indexOf("}",e),n>e&&(o=r.indexOf("\\",e),o===-1||o>n))||s!==-1&&r[e]==="("&&r[e+1]==="?"&&/[:!=]/.test(r[e+2])&&r[e+3]!==")"&&(s=r.indexOf(")",e),s>e&&(o=r.indexOf("\\",e),o===-1||o>s))||t!==-1&&r[e]==="("&&r[e+1]!=="|"&&(tt&&(o=r.indexOf("\\",t),o===-1||o>s))))return!0;if(r[e]==="\\"){var a=r[e+1];e+=2;var l=IJ[a];if(l){var c=r.indexOf(l,e);c!==-1&&(e=c+1)}if(r[e]==="!")return!0}else e++}return!1},r0e=function(r){if(r[0]==="!")return!0;for(var e=0;e{"use strict";var i0e=yJ(),n0e=require("path").posix.dirname,s0e=require("os").platform()==="win32",qv="/",o0e=/\\/g,a0e=/[\{\[].*[\}\]]$/,A0e=/(^|[^\\])([\{\[]|\([^\)]+$)/,l0e=/\\([\!\*\?\|\[\]\(\)\{\}])/g;wJ.exports=function(e,t){var i=Object.assign({flipBackslashes:!0},t);i.flipBackslashes&&s0e&&e.indexOf(qv)<0&&(e=e.replace(o0e,qv)),a0e.test(e)&&(e+=qv),e+="a";do e=n0e(e);while(i0e(e)||A0e.test(e));return e.replace(l0e,"$1")}});var RJ=w(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});var c0e=require("path"),u0e=BJ(),bJ=is(),g0e=Sv(),QJ="**",f0e="\\",h0e=/[*?]|^!/,p0e=/\[.*]/,d0e=/(?:^|[^!*+?@])\(.*\|.*\)/,C0e=/[!*+?@]\(.*\)/,m0e=/{.*(?:,|\.\.).*}/;function vJ(r,e={}){return!SJ(r,e)}si.isStaticPattern=vJ;function SJ(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(f0e)||h0e.test(r)||p0e.test(r)||d0e.test(r)||e.extglob!==!1&&C0e.test(r)||e.braceExpansion!==!1&&m0e.test(r))}si.isDynamicPattern=SJ;function E0e(r){return Ny(r)?r.slice(1):r}si.convertToPositivePattern=E0e;function I0e(r){return"!"+r}si.convertToNegativePattern=I0e;function Ny(r){return r.startsWith("!")&&r[1]!=="("}si.isNegativePattern=Ny;function xJ(r){return!Ny(r)}si.isPositivePattern=xJ;function y0e(r){return r.filter(Ny)}si.getNegativePatterns=y0e;function w0e(r){return r.filter(xJ)}si.getPositivePatterns=w0e;function B0e(r){return u0e(r,{flipBackslashes:!1})}si.getBaseDirectory=B0e;function b0e(r){return r.includes(QJ)}si.hasGlobStar=b0e;function kJ(r){return r.endsWith("/"+QJ)}si.endsWithSlashGlobStar=kJ;function Q0e(r){let e=c0e.basename(r);return kJ(r)||vJ(e)}si.isAffectDepthOfReadingPattern=Q0e;function S0e(r){return r.reduce((e,t)=>e.concat(PJ(t)),[])}si.expandPatternsWithBraceExpansion=S0e;function PJ(r){return bJ.braces(r,{expand:!0,nodupes:!0})}si.expandBraceExpansion=PJ;function v0e(r,e){let t=g0e.scan(r,Object.assign(Object.assign({},e),{parts:!0}));return t.parts.length===0?[r]:t.parts}si.getPatternParts=v0e;function DJ(r,e){return bJ.makeRe(r,e)}si.makeRe=DJ;function x0e(r,e){return r.map(t=>DJ(t,e))}si.convertPatternsToRe=x0e;function k0e(r,e){return e.some(t=>t.test(r))}si.matchAny=k0e});var NJ=w(Jv=>{"use strict";Object.defineProperty(Jv,"__esModule",{value:!0});var P0e=jv();function D0e(r){let e=P0e(r);return r.forEach(t=>{t.once("error",i=>e.emit("error",i))}),e.once("close",()=>FJ(r)),e.once("end",()=>FJ(r)),e}Jv.merge=D0e;function FJ(r){r.forEach(e=>e.emit("close"))}});var LJ=w(Ly=>{"use strict";Object.defineProperty(Ly,"__esModule",{value:!0});function R0e(r){return typeof r=="string"}Ly.isString=R0e;function F0e(r){return r===""}Ly.isEmpty=F0e});var Xa=w(Va=>{"use strict";Object.defineProperty(Va,"__esModule",{value:!0});var N0e=gJ();Va.array=N0e;var L0e=fJ();Va.errno=L0e;var T0e=pJ();Va.fs=T0e;var O0e=dJ();Va.path=O0e;var M0e=RJ();Va.pattern=M0e;var K0e=NJ();Va.stream=K0e;var U0e=LJ();Va.string=U0e});var UJ=w(Za=>{"use strict";Object.defineProperty(Za,"__esModule",{value:!0});var Mc=Xa();function H0e(r,e){let t=TJ(r),i=OJ(r,e.ignore),n=t.filter(l=>Mc.pattern.isStaticPattern(l,e)),s=t.filter(l=>Mc.pattern.isDynamicPattern(l,e)),o=Wv(n,i,!1),a=Wv(s,i,!0);return o.concat(a)}Za.generate=H0e;function Wv(r,e,t){let i=MJ(r);return"."in i?[zv(".",r,e,t)]:KJ(i,e,t)}Za.convertPatternsToTasks=Wv;function TJ(r){return Mc.pattern.getPositivePatterns(r)}Za.getPositivePatterns=TJ;function OJ(r,e){return Mc.pattern.getNegativePatterns(r).concat(e).map(Mc.pattern.convertToPositivePattern)}Za.getNegativePatternsAsPositive=OJ;function MJ(r){let e={};return r.reduce((t,i)=>{let n=Mc.pattern.getBaseDirectory(i);return n in t?t[n].push(i):t[n]=[i],t},e)}Za.groupPatternsByBaseDirectory=MJ;function KJ(r,e,t){return Object.keys(r).map(i=>zv(i,r[i],e,t))}Za.convertPatternGroupsToTasks=KJ;function zv(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patterns:[].concat(e,t.map(Mc.pattern.convertToNegativePattern))}}Za.convertPatternGroupToTask=zv});var jJ=w(Ty=>{"use strict";Object.defineProperty(Ty,"__esModule",{value:!0});Ty.read=void 0;function j0e(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){HJ(t,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){_v(t,n);return}e.fs.stat(r,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){HJ(t,s);return}_v(t,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),_v(t,o)})})}Ty.read=j0e;function HJ(r,e){r(e)}function _v(r,e){r(null,e)}});var GJ=w(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});Oy.read=void 0;function G0e(r,e){let t=e.fs.lstatSync(r);if(!t.isSymbolicLink()||!e.followSymbolicLink)return t;try{let i=e.fs.statSync(r);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return t;throw i}}Oy.read=G0e});var YJ=w(rl=>{"use strict";Object.defineProperty(rl,"__esModule",{value:!0});rl.createFileSystemAdapter=rl.FILE_SYSTEM_ADAPTER=void 0;var My=require("fs");rl.FILE_SYSTEM_ADAPTER={lstat:My.lstat,stat:My.stat,lstatSync:My.lstatSync,statSync:My.statSync};function Y0e(r){return r===void 0?rl.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},rl.FILE_SYSTEM_ADAPTER),r)}rl.createFileSystemAdapter=Y0e});var JJ=w(Vv=>{"use strict";Object.defineProperty(Vv,"__esModule",{value:!0});var q0e=YJ(),qJ=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=q0e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return e!=null?e:t}};Vv.default=qJ});var Kc=w(il=>{"use strict";Object.defineProperty(il,"__esModule",{value:!0});il.statSync=il.stat=il.Settings=void 0;var WJ=jJ(),J0e=GJ(),Xv=JJ();il.Settings=Xv.default;function W0e(r,e,t){if(typeof e=="function"){WJ.read(r,Zv(),e);return}WJ.read(r,Zv(e),t)}il.stat=W0e;function z0e(r,e){let t=Zv(e);return J0e.read(r,t)}il.statSync=z0e;function Zv(r={}){return r instanceof Xv.default?r:new Xv.default(r)}});var _J=w((ftt,zJ)=>{zJ.exports=_0e;function _0e(r,e){var t,i,n,s=!0;Array.isArray(r)?(t=[],i=r.length):(n=Object.keys(r),t={},i=n.length);function o(l){function c(){e&&e(l,t),e=null}s?process.nextTick(c):c()}function a(l,c,u){t[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){r[l](function(c,u){a(l,c,u)})}):r.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var $v=w(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var Uy=process.versions.node.split(".");if(Uy[0]===void 0||Uy[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var VJ=Number.parseInt(Uy[0],10),V0e=Number.parseInt(Uy[1],10),XJ=10,X0e=10,Z0e=VJ>XJ,$0e=VJ===XJ&&V0e>=X0e;Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=Z0e||$0e});var $J=w(Hy=>{"use strict";Object.defineProperty(Hy,"__esModule",{value:!0});Hy.createDirentFromStats=void 0;var ZJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function ebe(r,e){return new ZJ(r,e)}Hy.createDirentFromStats=ebe});var ex=w(jy=>{"use strict";Object.defineProperty(jy,"__esModule",{value:!0});jy.fs=void 0;var tbe=$J();jy.fs=tbe});var tx=w(Gy=>{"use strict";Object.defineProperty(Gy,"__esModule",{value:!0});Gy.joinPathSegments=void 0;function rbe(r,e,t){return r.endsWith(t)?r+e:r+t+e}Gy.joinPathSegments=rbe});var s3=w(nl=>{"use strict";Object.defineProperty(nl,"__esModule",{value:!0});nl.readdir=nl.readdirWithFileTypes=nl.read=void 0;var ibe=Kc(),e3=_J(),nbe=$v(),t3=ex(),r3=tx();function sbe(r,e,t){if(!e.stats&&nbe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){i3(r,e,t);return}n3(r,e,t)}nl.read=sbe;function i3(r,e,t){e.fs.readdir(r,{withFileTypes:!0},(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:r3.joinPathSegments(r,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){rx(t,s);return}let o=s.map(a=>obe(a,e));e3(o,(a,l)=>{if(a!==null){Yy(t,a);return}rx(t,l)})})}nl.readdirWithFileTypes=i3;function obe(r,e){return t=>{if(!r.dirent.isSymbolicLink()){t(null,r);return}e.fs.stat(r.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){t(i);return}t(null,r);return}r.dirent=t3.fs.createDirentFromStats(r.name,n),t(null,r)})}}function n3(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(o=>{let a=r3.joinPathSegments(r,o,e.pathSegmentSeparator);return l=>{ibe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:t3.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});e3(s,(o,a)=>{if(o!==null){Yy(t,o);return}rx(t,a)})})}nl.readdir=n3;function Yy(r,e){r(e)}function rx(r,e){r(null,e)}});var c3=w(sl=>{"use strict";Object.defineProperty(sl,"__esModule",{value:!0});sl.readdir=sl.readdirWithFileTypes=sl.read=void 0;var abe=Kc(),Abe=$v(),o3=ex(),a3=tx();function lbe(r,e){return!e.stats&&Abe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?A3(r,e):l3(r,e)}sl.read=lbe;function A3(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:a3.joinPathSegments(r,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=o3.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}sl.readdirWithFileTypes=A3;function l3(r,e){return e.fs.readdirSync(r).map(i=>{let n=a3.joinPathSegments(r,i,e.pathSegmentSeparator),s=abe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:o3.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}sl.readdir=l3});var u3=w(ol=>{"use strict";Object.defineProperty(ol,"__esModule",{value:!0});ol.createFileSystemAdapter=ol.FILE_SYSTEM_ADAPTER=void 0;var Ug=require("fs");ol.FILE_SYSTEM_ADAPTER={lstat:Ug.lstat,stat:Ug.stat,lstatSync:Ug.lstatSync,statSync:Ug.statSync,readdir:Ug.readdir,readdirSync:Ug.readdirSync};function cbe(r){return r===void 0?ol.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},ol.FILE_SYSTEM_ADAPTER),r)}ol.createFileSystemAdapter=cbe});var f3=w(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var ube=require("path"),gbe=Kc(),fbe=u3(),g3=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=fbe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,ube.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new gbe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};ix.default=g3});var qy=w(al=>{"use strict";Object.defineProperty(al,"__esModule",{value:!0});al.Settings=al.scandirSync=al.scandir=void 0;var h3=s3(),hbe=c3(),nx=f3();al.Settings=nx.default;function pbe(r,e,t){if(typeof e=="function"){h3.read(r,sx(),e);return}h3.read(r,sx(e),t)}al.scandir=pbe;function dbe(r,e){let t=sx(e);return hbe.read(r,t)}al.scandirSync=dbe;function sx(r={}){return r instanceof nx.default?r:new nx.default(r)}});var d3=w((Btt,p3)=>{"use strict";function Cbe(r){var e=new r,t=e;function i(){var s=e;return s.next?e=s.next:(e=new r,t=e),s.next=null,s}function n(s){t.next=s,t=s}return{get:i,release:n}}p3.exports=Cbe});var m3=w((btt,ox)=>{"use strict";var mbe=d3();function C3(r,e,t){if(typeof r=="function"&&(t=e,e=r,r=null),t<1)throw new Error("fastqueue concurrency must be greater than 1");var i=mbe(Ebe),n=null,s=null,o=0,a=null,l={push:m,drain:Vo,saturated:Vo,pause:u,paused:!1,concurrency:t,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:y,empty:Vo,kill:v,killAndDrain:x,error:T};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var q=n,Y=0;q;)q=q.next,Y++;return Y}function f(){for(var q=n,Y=[];q;)Y.push(q.value),q=q.next;return Y}function h(){if(!!l.paused){l.paused=!1;for(var q=0;q{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});Xo.joinPathSegments=Xo.replacePathSegmentSeparator=Xo.isAppliedFilter=Xo.isFatalError=void 0;function ybe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}Xo.isFatalError=ybe;function wbe(r,e){return r===null||r(e)}Xo.isAppliedFilter=wbe;function Bbe(r,e){return r.split(/[/\\]/).join(e)}Xo.replacePathSegmentSeparator=Bbe;function bbe(r,e,t){return r===""?e:r.endsWith(t)?r+e:r+t+e}Xo.joinPathSegments=bbe});var Ax=w(ax=>{"use strict";Object.defineProperty(ax,"__esModule",{value:!0});var Qbe=Jy(),E3=class{constructor(e,t){this._root=e,this._settings=t,this._root=Qbe.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}};ax.default=E3});var cx=w(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var Sbe=require("events"),vbe=qy(),xbe=m3(),Wy=Jy(),kbe=Ax(),I3=class extends kbe.default{constructor(e,t){super(e,t);this._settings=t,this._scandir=vbe.scandir,this._emitter=new Sbe.EventEmitter,this._queue=xbe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,t){let i={directory:e,base:t};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){t(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);t(null,void 0)})}_handleError(e){this._isDestroyed||!Wy.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;let i=e.path;t!==void 0&&(e.path=Wy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),Wy.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&Wy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};lx.default=I3});var w3=w(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var Pbe=cx(),y3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Pbe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{Dbe(e,t)}),this._reader.onEntry(t=>{this._storage.add(t)}),this._reader.onEnd(()=>{Rbe(e,[...this._storage])}),this._reader.read()}};ux.default=y3;function Dbe(r,e){r(e)}function Rbe(r,e){r(null,e)}});var b3=w(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var Fbe=require("stream"),Nbe=cx(),B3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Nbe.default(this._root,this._settings),this._stream=new Fbe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};gx.default=B3});var S3=w(fx=>{"use strict";Object.defineProperty(fx,"__esModule",{value:!0});var Lbe=qy(),zy=Jy(),Tbe=Ax(),Q3=class extends Tbe.default{constructor(){super(...arguments);this._scandir=Lbe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,t)}catch(i){this._handleError(i)}}_handleError(e){if(!!zy.isFatalError(this._settings,e))throw e}_handleEntry(e,t){let i=e.path;t!==void 0&&(e.path=zy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),zy.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&zy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};fx.default=Q3});var x3=w(hx=>{"use strict";Object.defineProperty(hx,"__esModule",{value:!0});var Obe=S3(),v3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Obe.default(this._root,this._settings)}read(){return this._reader.read()}};hx.default=v3});var P3=w(px=>{"use strict";Object.defineProperty(px,"__esModule",{value:!0});var Mbe=require("path"),Kbe=qy(),k3=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Mbe.sep),this.fsScandirSettings=new Kbe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};px.default=k3});var Cx=w(Zo=>{"use strict";Object.defineProperty(Zo,"__esModule",{value:!0});Zo.Settings=Zo.walkStream=Zo.walkSync=Zo.walk=void 0;var D3=w3(),Ube=b3(),Hbe=x3(),dx=P3();Zo.Settings=dx.default;function jbe(r,e,t){if(typeof e=="function"){new D3.default(r,_y()).read(e);return}new D3.default(r,_y(e)).read(t)}Zo.walk=jbe;function Gbe(r,e){let t=_y(e);return new Hbe.default(r,t).read()}Zo.walkSync=Gbe;function Ybe(r,e){let t=_y(e);return new Ube.default(r,t).read()}Zo.walkStream=Ybe;function _y(r={}){return r instanceof dx.default?r:new dx.default(r)}});var Ex=w(mx=>{"use strict";Object.defineProperty(mx,"__esModule",{value:!0});var qbe=require("path"),Jbe=Kc(),R3=Xa(),F3=class{constructor(e){this._settings=e,this._fsStatSettings=new Jbe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return qbe.resolve(this._settings.cwd,e)}_makeEntry(e,t){let i={name:t,path:t,dirent:R3.fs.createDirentFromStats(t,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!R3.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};mx.default=F3});var yx=w(Ix=>{"use strict";Object.defineProperty(Ix,"__esModule",{value:!0});var Wbe=require("stream"),zbe=Kc(),_be=Cx(),Vbe=Ex(),N3=class extends Vbe.default{constructor(){super(...arguments);this._walkStream=_be.walkStream,this._stat=zbe.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){let i=e.map(this._getFullEntryPath,this),n=new Wbe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],t).then(l=>{l!==null&&t.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,t)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((t,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?t(s):i(n))})}};Ix.default=N3});var T3=w(wx=>{"use strict";Object.defineProperty(wx,"__esModule",{value:!0});var Hg=Xa(),L3=class{constructor(e,t,i){this._patterns=e,this._settings=t,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Hg.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let t of e){let i=this._getPatternSegments(t),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:t,segments:i,sections:n})}}_getPatternSegments(e){return Hg.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Hg.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Hg.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Hg.array.splitWhen(e,t=>t.dynamic&&Hg.pattern.hasGlobStar(t.pattern))}};wx.default=L3});var M3=w(Bx=>{"use strict";Object.defineProperty(Bx,"__esModule",{value:!0});var Xbe=T3(),O3=class extends Xbe.default{match(e){let t=e.split("/"),i=t.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||t.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};Bx.default=O3});var U3=w(bx=>{"use strict";Object.defineProperty(bx,"__esModule",{value:!0});var Vy=Xa(),Zbe=M3(),K3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,i){let n=this._getMatcher(t),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new Zbe.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let t=e.filter(Vy.pattern.isAffectDepthOfReadingPattern);return Vy.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,i,n){let s=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(t))return!1;let o=Vy.path.removeLeadingDotSegment(t.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){let i=e.split("/").length;return t.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!Vy.pattern.matchAny(e,t)}};bx.default=K3});var j3=w(Qx=>{"use strict";Object.defineProperty(Qx,"__esModule",{value:!0});var sd=Xa(),H3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){let i=sd.pattern.convertPatternsToRe(e,this._micromatchOptions),n=sd.pattern.convertPatternsToRe(t,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,t,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,t)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;let i=sd.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,t)}_isMatchToPatterns(e,t){let i=sd.path.removeLeadingDotSegment(e);return sd.pattern.matchAny(i,t)}};Qx.default=H3});var Y3=w(Sx=>{"use strict";Object.defineProperty(Sx,"__esModule",{value:!0});var $be=Xa(),G3=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return $be.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};Sx.default=G3});var W3=w(vx=>{"use strict";Object.defineProperty(vx,"__esModule",{value:!0});var q3=Xa(),J3=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=q3.path.makeAbsolute(this._settings.cwd,t),t=q3.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}};vx.default=J3});var Xy=w(xx=>{"use strict";Object.defineProperty(xx,"__esModule",{value:!0});var eQe=require("path"),tQe=U3(),rQe=j3(),iQe=Y3(),nQe=W3(),z3=class{constructor(e){this._settings=e,this.errorFilter=new iQe.default(this._settings),this.entryFilter=new rQe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new tQe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new nQe.default(this._settings)}_getRootDirectory(e){return eQe.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let t=e.base==="."?"":e.base;return{basePath:t,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};xx.default=z3});var V3=w(kx=>{"use strict";Object.defineProperty(kx,"__esModule",{value:!0});var sQe=yx(),oQe=Xy(),_3=class extends oQe.default{constructor(){super(...arguments);this._reader=new sQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(t,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};kx.default=_3});var Z3=w(Px=>{"use strict";Object.defineProperty(Px,"__esModule",{value:!0});var aQe=require("stream"),AQe=yx(),lQe=Xy(),X3=class extends lQe.default{constructor(){super(...arguments);this._reader=new AQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(t,e,i),s=new aQe.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Px.default=X3});var eW=w(Dx=>{"use strict";Object.defineProperty(Dx,"__esModule",{value:!0});var cQe=Kc(),uQe=Cx(),gQe=Ex(),$3=class extends gQe.default{constructor(){super(...arguments);this._walkSync=uQe.walkSync,this._statSync=cQe.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,t);o===null||!t.entryFilter(o)||i.push(o)}return i}_getEntry(e,t,i){try{let n=this._getStat(e);return this._makeEntry(n,t)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};Dx.default=$3});var rW=w(Rx=>{"use strict";Object.defineProperty(Rx,"__esModule",{value:!0});var fQe=eW(),hQe=Xy(),tW=class extends hQe.default{constructor(){super(...arguments);this._reader=new fQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(t,e,i).map(i.transform)}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Rx.default=tW});var nW=w(od=>{"use strict";Object.defineProperty(od,"__esModule",{value:!0});var jg=require("fs"),pQe=require("os"),dQe=pQe.cpus().length;od.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:jg.lstat,lstatSync:jg.lstatSync,stat:jg.stat,statSync:jg.statSync,readdir:jg.readdir,readdirSync:jg.readdirSync};var iW=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,dQe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return e===void 0?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},od.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};od.default=iW});var Zy=w((ztt,sW)=>{"use strict";var oW=UJ(),CQe=V3(),mQe=Z3(),EQe=rW(),Fx=nW(),Uc=Xa();async function Lx(r,e){Gg(r);let t=Nx(r,CQe.default,e),i=await Promise.all(t);return Uc.array.flatten(i)}(function(r){function e(o,a){Gg(o);let l=Nx(o,EQe.default,a);return Uc.array.flatten(l)}r.sync=e;function t(o,a){Gg(o);let l=Nx(o,mQe.default,a);return Uc.stream.merge(l)}r.stream=t;function i(o,a){Gg(o);let l=[].concat(o),c=new Fx.default(a);return oW.generate(l,c)}r.generateTasks=i;function n(o,a){Gg(o);let l=new Fx.default(a);return Uc.pattern.isDynamicPattern(o,l)}r.isDynamicPattern=n;function s(o){return Gg(o),Uc.path.escape(o)}r.escapePath=s})(Lx||(Lx={}));function Nx(r,e,t){let i=[].concat(r),n=new Fx.default(t),s=oW.generate(i,n),o=new e(n);return s.map(o.read,o)}function Gg(r){if(![].concat(r).every(i=>Uc.string.isString(i)&&!Uc.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}sW.exports=Lx});var AW=w(Hc=>{"use strict";var{promisify:IQe}=require("util"),aW=require("fs");async function Tx(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return(await IQe(aW[r])(t))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Ox(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return aW[r](t)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Hc.isFile=Tx.bind(null,"stat","isFile");Hc.isDirectory=Tx.bind(null,"stat","isDirectory");Hc.isSymlink=Tx.bind(null,"lstat","isSymbolicLink");Hc.isFileSync=Ox.bind(null,"statSync","isFile");Hc.isDirectorySync=Ox.bind(null,"statSync","isDirectory");Hc.isSymlinkSync=Ox.bind(null,"lstatSync","isSymbolicLink")});var fW=w((Vtt,Mx)=>{"use strict";var jc=require("path"),lW=AW(),cW=r=>r.length>1?`{${r.join(",")}}`:r[0],uW=(r,e)=>{let t=r[0]==="!"?r.slice(1):r;return jc.isAbsolute(t)?t:jc.join(e,t)},yQe=(r,e)=>jc.extname(r)?`**/${r}`:`**/${r}.${cW(e)}`,gW=(r,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(t=>jc.posix.join(r,yQe(t,e.extensions))):e.files?e.files.map(t=>jc.posix.join(r,`**/${t}`)):e.extensions?[jc.posix.join(r,`**/*.${cW(e.extensions)}`)]:[jc.posix.join(r,"**")]};Mx.exports=async(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=await Promise.all([].concat(r).map(async i=>await lW.isDirectory(uW(i,e.cwd))?gW(i,e):i));return[].concat.apply([],t)};Mx.exports.sync=(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=[].concat(r).map(i=>lW.isDirectorySync(uW(i,e.cwd))?gW(i,e):i);return[].concat.apply([],t)}});var BW=w((Xtt,hW)=>{function pW(r){return Array.isArray(r)?r:[r]}var dW="",CW=" ",Kx="\\",wQe=/^\s+$/,BQe=/^\\!/,bQe=/^\\#/,QQe=/\r?\n/g,SQe=/^\.*\/|^\.+$/,Ux="/",mW=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",vQe=(r,e,t)=>Object.defineProperty(r,e,{value:t}),xQe=/([0-z])-([0-z])/g,kQe=r=>r.replace(xQe,(e,t,i)=>t.charCodeAt(0)<=i.charCodeAt(0)?e:dW),PQe=r=>{let{length:e}=r;return r.slice(0,e-e%2)},DQe=[[/\\?\s+$/,r=>r.indexOf("\\")===0?CW:dW],[/\\\s/g,()=>CW],[/[\\$.|*+(){^]/g,r=>`\\${r}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(r,e,t)=>e+6`${e}[^\\/]*`],[/\\\\\\(?=[$.|*+(){^])/g,()=>Kx],[/\\\\/g,()=>Kx],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(r,e,t,i,n)=>e===Kx?`\\[${t}${PQe(i)}${n}`:n==="]"&&i.length%2==0?`[${kQe(t)}${i}]`:"[]"],[/(?:[^*])$/,r=>/\/$/.test(r)?`${r}$`:`${r}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(r,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],EW=Object.create(null),RQe=(r,e)=>{let t=EW[r];return t||(t=DQe.reduce((i,n)=>i.replace(n[0],n[1].bind(r)),r),EW[r]=t),e?new RegExp(t,"i"):new RegExp(t)},Hx=r=>typeof r=="string",FQe=r=>r&&Hx(r)&&!wQe.test(r)&&r.indexOf("#")!==0,NQe=r=>r.split(QQe),IW=class{constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.regex=n}},LQe=(r,e)=>{let t=r,i=!1;r.indexOf("!")===0&&(i=!0,r=r.substr(1)),r=r.replace(BQe,"!").replace(bQe,"#");let n=RQe(r,e);return new IW(t,r,i,n)},TQe=(r,e)=>{throw new e(r)},$a=(r,e,t)=>Hx(r)?r?$a.isNotRelative(r)?t(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:t("path must not be empty",TypeError):t(`path must be a string, but got \`${e}\``,TypeError),yW=r=>SQe.test(r);$a.isNotRelative=yW;$a.convert=r=>r;var wW=class{constructor({ignorecase:e=!0}={}){vQe(this,mW,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[mW]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(FQe(e)){let t=LQe(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,pW(Hx(e)?NQe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!t)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,t,i,n){let s=e&&$a.convert(e);return $a(s,e,TQe),this._t(s,t,i,n)}_t(e,t,i,n){if(e in t)return t[e];if(n||(n=e.split(Ux)),n.pop(),!n.length)return t[e]=this._testOne(e,i);let s=this._t(n.join(Ux)+Ux,t,i,n);return t[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return pW(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},$y=r=>new wW(r),OQe=()=>!1,MQe=r=>$a(r&&$a.convert(r),r,OQe);$y.isPathValid=MQe;$y.default=$y;hW.exports=$y;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let r=t=>/^\\\\\?\\/.test(t)||/["<>|\u0000-\u001F]+/u.test(t)?t:t.replace(/\\/g,"/");$a.convert=r;let e=/^[a-z]:\//i;$a.isNotRelative=t=>e.test(t)||yW(t)}});var QW=w((Ztt,bW)=>{"use strict";bW.exports=r=>{let e=/^\\\\\?\\/.test(r),t=/[^\u0000-\u0080]+/.test(r);return e||t?r:r.replace(/\\/g,"/")}});var RW=w(($tt,jx)=>{"use strict";var{promisify:KQe}=require("util"),SW=require("fs"),eA=require("path"),vW=Zy(),UQe=BW(),ad=QW(),xW=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],HQe=KQe(SW.readFile),jQe=r=>e=>e.startsWith("!")?"!"+eA.posix.join(r,e.slice(1)):eA.posix.join(r,e),GQe=(r,e)=>{let t=ad(eA.relative(e.cwd,eA.dirname(e.fileName)));return r.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(jQe(t))},kW=r=>{let e=UQe();for(let t of r)e.add(GQe(t.content,{cwd:t.cwd,fileName:t.filePath}));return e},YQe=(r,e)=>{if(r=ad(r),eA.isAbsolute(e)){if(ad(e).startsWith(r))return e;throw new Error(`Path ${e} is not in cwd ${r}`)}return eA.join(r,e)},PW=(r,e)=>t=>r.ignores(ad(eA.relative(e,YQe(e,t.path||t)))),qQe=async(r,e)=>{let t=eA.join(e,r),i=await HQe(t,"utf8");return{cwd:e,filePath:t,content:i}},JQe=(r,e)=>{let t=eA.join(e,r),i=SW.readFileSync(t,"utf8");return{cwd:e,filePath:t,content:i}},DW=({ignore:r=[],cwd:e=ad(process.cwd())}={})=>({ignore:r,cwd:e});jx.exports=async r=>{r=DW(r);let e=await vW("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}),t=await Promise.all(e.map(n=>qQe(n,r.cwd))),i=kW(t);return PW(i,r.cwd)};jx.exports.sync=r=>{r=DW(r);let t=vW.sync("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}).map(n=>JQe(n,r.cwd)),i=kW(t);return PW(i,r.cwd)}});var TW=w((ert,FW)=>{"use strict";var{Transform:WQe}=require("stream"),Gx=class extends WQe{constructor(){super({objectMode:!0})}},NW=class extends Gx{constructor(e){super();this._filter=e}_transform(e,t,i){this._filter(e)&&this.push(e),i()}},LW=class extends Gx{constructor(){super();this._pushed=new Set}_transform(e,t,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};FW.exports={FilterStream:NW,UniqueStream:LW}});var Wx=w((trt,Gc)=>{"use strict";var OW=require("fs"),ew=AJ(),zQe=jv(),tw=Zy(),rw=fW(),Yx=RW(),{FilterStream:_Qe,UniqueStream:VQe}=TW(),MW=()=>!1,KW=r=>r[0]==="!",XQe=r=>{if(!r.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},ZQe=(r={})=>{if(!r.cwd)return;let e;try{e=OW.statSync(r.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},$Qe=r=>r.stats instanceof OW.Stats?r.path:r,iw=(r,e)=>{r=ew([].concat(r)),XQe(r),ZQe(e);let t=[];e=N({ignore:[],expandDirectories:!0},e);for(let[i,n]of r.entries()){if(KW(n))continue;let s=r.slice(i).filter(a=>KW(a)).map(a=>a.slice(1)),o=te(N({},e),{ignore:e.ignore.concat(s)});t.push({pattern:n,options:o})}return t},eSe=(r,e)=>{let t={};return r.options.cwd&&(t.cwd=r.options.cwd),Array.isArray(r.options.expandDirectories)?t=te(N({},t),{files:r.options.expandDirectories}):typeof r.options.expandDirectories=="object"&&(t=N(N({},t),r.options.expandDirectories)),e(r.pattern,t)},qx=(r,e)=>r.options.expandDirectories?eSe(r,e):[r.pattern],UW=r=>r&&r.gitignore?Yx.sync({cwd:r.cwd,ignore:r.ignore}):MW,Jx=r=>e=>{let{options:t}=r;return t.ignore&&Array.isArray(t.ignore)&&t.expandDirectories&&(t.ignore=rw.sync(t.ignore)),{pattern:e,options:t}};Gc.exports=async(r,e)=>{let t=iw(r,e),i=async()=>e&&e.gitignore?Yx({cwd:e.cwd,ignore:e.ignore}):MW,n=async()=>{let l=await Promise.all(t.map(async c=>{let u=await qx(c,rw);return Promise.all(u.map(Jx(c)))}));return ew(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>tw(l.pattern,l.options)));return ew(...a).filter(l=>!s($Qe(l)))};Gc.exports.sync=(r,e)=>{let t=iw(r,e),i=[];for(let o of t){let a=qx(o,rw.sync).map(Jx(o));i.push(...a)}let n=UW(e),s=[];for(let o of i)s=ew(s,tw.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Gc.exports.stream=(r,e)=>{let t=iw(r,e),i=[];for(let a of t){let l=qx(a,rw.sync).map(Jx(a));i.push(...l)}let n=UW(e),s=new _Qe(a=>!n(a)),o=new VQe;return zQe(i.map(a=>tw.stream(a.pattern,a.options))).pipe(s).pipe(o)};Gc.exports.generateGlobTasks=iw;Gc.exports.hasMagic=(r,e)=>[].concat(r).some(t=>tw.isDynamicPattern(t,e));Gc.exports.gitignore=Yx});var Rn=w((xrt,t4)=>{function fSe(r){var e=typeof r;return r!=null&&(e=="object"||e=="function")}t4.exports=fSe});var rk=w((krt,r4)=>{var hSe=typeof global=="object"&&global&&global.Object===Object&&global;r4.exports=hSe});var Ns=w((Prt,i4)=>{var pSe=rk(),dSe=typeof self=="object"&&self&&self.Object===Object&&self,CSe=pSe||dSe||Function("return this")();i4.exports=CSe});var s4=w((Drt,n4)=>{var mSe=Ns(),ESe=function(){return mSe.Date.now()};n4.exports=ESe});var a4=w((Rrt,o4)=>{var ISe=/\s/;function ySe(r){for(var e=r.length;e--&&ISe.test(r.charAt(e)););return e}o4.exports=ySe});var l4=w((Frt,A4)=>{var wSe=a4(),BSe=/^\s+/;function bSe(r){return r&&r.slice(0,wSe(r)+1).replace(BSe,"")}A4.exports=bSe});var Jc=w((Nrt,c4)=>{var QSe=Ns(),SSe=QSe.Symbol;c4.exports=SSe});var h4=w((Lrt,u4)=>{var g4=Jc(),f4=Object.prototype,vSe=f4.hasOwnProperty,xSe=f4.toString,Ed=g4?g4.toStringTag:void 0;function kSe(r){var e=vSe.call(r,Ed),t=r[Ed];try{r[Ed]=void 0;var i=!0}catch(s){}var n=xSe.call(r);return i&&(e?r[Ed]=t:delete r[Ed]),n}u4.exports=kSe});var d4=w((Trt,p4)=>{var PSe=Object.prototype,DSe=PSe.toString;function RSe(r){return DSe.call(r)}p4.exports=RSe});var Wc=w((Ort,C4)=>{var m4=Jc(),FSe=h4(),NSe=d4(),LSe="[object Null]",TSe="[object Undefined]",E4=m4?m4.toStringTag:void 0;function OSe(r){return r==null?r===void 0?TSe:LSe:E4&&E4 in Object(r)?FSe(r):NSe(r)}C4.exports=OSe});var ta=w((Mrt,I4)=>{function MSe(r){return r!=null&&typeof r=="object"}I4.exports=MSe});var Id=w((Krt,y4)=>{var KSe=Wc(),USe=ta(),HSe="[object Symbol]";function jSe(r){return typeof r=="symbol"||USe(r)&&KSe(r)==HSe}y4.exports=jSe});var Q4=w((Urt,w4)=>{var GSe=l4(),B4=Rn(),YSe=Id(),b4=0/0,qSe=/^[-+]0x[0-9a-f]+$/i,JSe=/^0b[01]+$/i,WSe=/^0o[0-7]+$/i,zSe=parseInt;function _Se(r){if(typeof r=="number")return r;if(YSe(r))return b4;if(B4(r)){var e=typeof r.valueOf=="function"?r.valueOf():r;r=B4(e)?e+"":e}if(typeof r!="string")return r===0?r:+r;r=GSe(r);var t=JSe.test(r);return t||WSe.test(r)?zSe(r.slice(2),t?2:8):qSe.test(r)?b4:+r}w4.exports=_Se});var x4=w((Hrt,S4)=>{var VSe=Rn(),ik=s4(),v4=Q4(),XSe="Expected a function",ZSe=Math.max,$Se=Math.min;function eve(r,e,t){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof r!="function")throw new TypeError(XSe);e=v4(e)||0,VSe(t)&&(u=!!t.leading,g="maxWait"in t,s=g?ZSe(v4(t.maxWait)||0,e):s,f="trailing"in t?!!t.trailing:f);function h(Y){var $=i,_=n;return i=n=void 0,c=Y,o=r.apply(_,$),o}function p(Y){return c=Y,a=setTimeout(b,e),u?h(Y):o}function m(Y){var $=Y-l,_=Y-c,ne=e-$;return g?$Se(ne,s-_):ne}function y(Y){var $=Y-l,_=Y-c;return l===void 0||$>=e||$<0||g&&_>=s}function b(){var Y=ik();if(y(Y))return v(Y);a=setTimeout(b,m(Y))}function v(Y){return a=void 0,f&&i?h(Y):(i=n=void 0,o)}function x(){a!==void 0&&clearTimeout(a),c=0,i=l=n=a=void 0}function T(){return a===void 0?o:v(ik())}function q(){var Y=ik(),$=y(Y);if(i=arguments,n=this,l=Y,$){if(a===void 0)return p(l);if(g)return clearTimeout(a),a=setTimeout(b,e),h(l)}return a===void 0&&(a=setTimeout(b,e)),o}return q.cancel=x,q.flush=T,q}S4.exports=eve});var P4=w((jrt,k4)=>{var tve=x4(),rve=Rn(),ive="Expected a function";function nve(r,e,t){var i=!0,n=!0;if(typeof r!="function")throw new TypeError(ive);return rve(t)&&(i="leading"in t?!!t.leading:i,n="trailing"in t?!!t.trailing:n),tve(r,e,{leading:i,maxWait:e,trailing:n})}k4.exports=nve});var iA=w((rA,Bw)=>{"use strict";Object.defineProperty(rA,"__esModule",{value:!0});var M4=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Cve(r){return M4.includes(r)}var mve=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...M4];function Eve(r){return mve.includes(r)}var Ive=["null","undefined","string","number","bigint","boolean","symbol"];function yve(r){return Ive.includes(r)}function Xg(r){return e=>typeof e===r}var{toString:K4}=Object.prototype,vd=r=>{let e=K4.call(r).slice(8,-1);if(/HTML\w+Element/.test(e)&&W.domElement(r))return"HTMLElement";if(Eve(e))return e},hr=r=>e=>vd(e)===r;function W(r){if(r===null)return"null";switch(typeof r){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(W.observable(r))return"Observable";if(W.array(r))return"Array";if(W.buffer(r))return"Buffer";let e=vd(r);if(e)return e;if(r instanceof String||r instanceof Boolean||r instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}W.undefined=Xg("undefined");W.string=Xg("string");var wve=Xg("number");W.number=r=>wve(r)&&!W.nan(r);W.bigint=Xg("bigint");W.function_=Xg("function");W.null_=r=>r===null;W.class_=r=>W.function_(r)&&r.toString().startsWith("class ");W.boolean=r=>r===!0||r===!1;W.symbol=Xg("symbol");W.numericString=r=>W.string(r)&&!W.emptyStringOrWhitespace(r)&&!Number.isNaN(Number(r));W.array=(r,e)=>Array.isArray(r)?W.function_(e)?r.every(e):!0:!1;W.buffer=r=>{var e,t,i,n;return(n=(i=(t=(e=r)===null||e===void 0?void 0:e.constructor)===null||t===void 0?void 0:t.isBuffer)===null||i===void 0?void 0:i.call(t,r))!==null&&n!==void 0?n:!1};W.nullOrUndefined=r=>W.null_(r)||W.undefined(r);W.object=r=>!W.null_(r)&&(typeof r=="object"||W.function_(r));W.iterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.iterator])};W.asyncIterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.asyncIterator])};W.generator=r=>W.iterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.asyncGenerator=r=>W.asyncIterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.nativePromise=r=>hr("Promise")(r);var Bve=r=>{var e,t;return W.function_((e=r)===null||e===void 0?void 0:e.then)&&W.function_((t=r)===null||t===void 0?void 0:t.catch)};W.promise=r=>W.nativePromise(r)||Bve(r);W.generatorFunction=hr("GeneratorFunction");W.asyncGeneratorFunction=r=>vd(r)==="AsyncGeneratorFunction";W.asyncFunction=r=>vd(r)==="AsyncFunction";W.boundFunction=r=>W.function_(r)&&!r.hasOwnProperty("prototype");W.regExp=hr("RegExp");W.date=hr("Date");W.error=hr("Error");W.map=r=>hr("Map")(r);W.set=r=>hr("Set")(r);W.weakMap=r=>hr("WeakMap")(r);W.weakSet=r=>hr("WeakSet")(r);W.int8Array=hr("Int8Array");W.uint8Array=hr("Uint8Array");W.uint8ClampedArray=hr("Uint8ClampedArray");W.int16Array=hr("Int16Array");W.uint16Array=hr("Uint16Array");W.int32Array=hr("Int32Array");W.uint32Array=hr("Uint32Array");W.float32Array=hr("Float32Array");W.float64Array=hr("Float64Array");W.bigInt64Array=hr("BigInt64Array");W.bigUint64Array=hr("BigUint64Array");W.arrayBuffer=hr("ArrayBuffer");W.sharedArrayBuffer=hr("SharedArrayBuffer");W.dataView=hr("DataView");W.directInstanceOf=(r,e)=>Object.getPrototypeOf(r)===e.prototype;W.urlInstance=r=>hr("URL")(r);W.urlString=r=>{if(!W.string(r))return!1;try{return new URL(r),!0}catch(e){return!1}};W.truthy=r=>Boolean(r);W.falsy=r=>!r;W.nan=r=>Number.isNaN(r);W.primitive=r=>W.null_(r)||yve(typeof r);W.integer=r=>Number.isInteger(r);W.safeInteger=r=>Number.isSafeInteger(r);W.plainObject=r=>{if(K4.call(r)!=="[object Object]")return!1;let e=Object.getPrototypeOf(r);return e===null||e===Object.getPrototypeOf({})};W.typedArray=r=>Cve(vd(r));var bve=r=>W.safeInteger(r)&&r>=0;W.arrayLike=r=>!W.nullOrUndefined(r)&&!W.function_(r)&&bve(r.length);W.inRange=(r,e)=>{if(W.number(e))return r>=Math.min(0,e)&&r<=Math.max(e,0);if(W.array(e)&&e.length===2)return r>=Math.min(...e)&&r<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Qve=1,Sve=["innerHTML","ownerDocument","style","attributes","nodeValue"];W.domElement=r=>W.object(r)&&r.nodeType===Qve&&W.string(r.nodeName)&&!W.plainObject(r)&&Sve.every(e=>e in r);W.observable=r=>{var e,t,i,n;return r?r===((t=(e=r)[Symbol.observable])===null||t===void 0?void 0:t.call(e))||r===((n=(i=r)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};W.nodeStream=r=>W.object(r)&&W.function_(r.pipe)&&!W.observable(r);W.infinite=r=>r===Infinity||r===-Infinity;var U4=r=>e=>W.integer(e)&&Math.abs(e%2)===r;W.evenInteger=U4(0);W.oddInteger=U4(1);W.emptyArray=r=>W.array(r)&&r.length===0;W.nonEmptyArray=r=>W.array(r)&&r.length>0;W.emptyString=r=>W.string(r)&&r.length===0;W.nonEmptyString=r=>W.string(r)&&r.length>0;var vve=r=>W.string(r)&&!/\S/.test(r);W.emptyStringOrWhitespace=r=>W.emptyString(r)||vve(r);W.emptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length===0;W.nonEmptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length>0;W.emptySet=r=>W.set(r)&&r.size===0;W.nonEmptySet=r=>W.set(r)&&r.size>0;W.emptyMap=r=>W.map(r)&&r.size===0;W.nonEmptyMap=r=>W.map(r)&&r.size>0;W.propertyKey=r=>W.any([W.string,W.number,W.symbol],r);W.formData=r=>hr("FormData")(r);W.urlSearchParams=r=>hr("URLSearchParams")(r);var H4=(r,e,t)=>{if(!W.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(t.length===0)throw new TypeError("Invalid number of values");return r.call(t,e)};W.any=(r,...e)=>(W.array(r)?r:[r]).some(i=>H4(Array.prototype.some,i,e));W.all=(r,...e)=>H4(Array.prototype.every,r,e);var We=(r,e,t,i={})=>{if(!r){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(t.map(o=>`\`${W(o)}\``))].join(", ")}`:`received value of type \`${W(t)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};rA.assert={undefined:r=>We(W.undefined(r),"undefined",r),string:r=>We(W.string(r),"string",r),number:r=>We(W.number(r),"number",r),bigint:r=>We(W.bigint(r),"bigint",r),function_:r=>We(W.function_(r),"Function",r),null_:r=>We(W.null_(r),"null",r),class_:r=>We(W.class_(r),"Class",r),boolean:r=>We(W.boolean(r),"boolean",r),symbol:r=>We(W.symbol(r),"symbol",r),numericString:r=>We(W.numericString(r),"string with a number",r),array:(r,e)=>{We(W.array(r),"Array",r),e&&r.forEach(e)},buffer:r=>We(W.buffer(r),"Buffer",r),nullOrUndefined:r=>We(W.nullOrUndefined(r),"null or undefined",r),object:r=>We(W.object(r),"Object",r),iterable:r=>We(W.iterable(r),"Iterable",r),asyncIterable:r=>We(W.asyncIterable(r),"AsyncIterable",r),generator:r=>We(W.generator(r),"Generator",r),asyncGenerator:r=>We(W.asyncGenerator(r),"AsyncGenerator",r),nativePromise:r=>We(W.nativePromise(r),"native Promise",r),promise:r=>We(W.promise(r),"Promise",r),generatorFunction:r=>We(W.generatorFunction(r),"GeneratorFunction",r),asyncGeneratorFunction:r=>We(W.asyncGeneratorFunction(r),"AsyncGeneratorFunction",r),asyncFunction:r=>We(W.asyncFunction(r),"AsyncFunction",r),boundFunction:r=>We(W.boundFunction(r),"Function",r),regExp:r=>We(W.regExp(r),"RegExp",r),date:r=>We(W.date(r),"Date",r),error:r=>We(W.error(r),"Error",r),map:r=>We(W.map(r),"Map",r),set:r=>We(W.set(r),"Set",r),weakMap:r=>We(W.weakMap(r),"WeakMap",r),weakSet:r=>We(W.weakSet(r),"WeakSet",r),int8Array:r=>We(W.int8Array(r),"Int8Array",r),uint8Array:r=>We(W.uint8Array(r),"Uint8Array",r),uint8ClampedArray:r=>We(W.uint8ClampedArray(r),"Uint8ClampedArray",r),int16Array:r=>We(W.int16Array(r),"Int16Array",r),uint16Array:r=>We(W.uint16Array(r),"Uint16Array",r),int32Array:r=>We(W.int32Array(r),"Int32Array",r),uint32Array:r=>We(W.uint32Array(r),"Uint32Array",r),float32Array:r=>We(W.float32Array(r),"Float32Array",r),float64Array:r=>We(W.float64Array(r),"Float64Array",r),bigInt64Array:r=>We(W.bigInt64Array(r),"BigInt64Array",r),bigUint64Array:r=>We(W.bigUint64Array(r),"BigUint64Array",r),arrayBuffer:r=>We(W.arrayBuffer(r),"ArrayBuffer",r),sharedArrayBuffer:r=>We(W.sharedArrayBuffer(r),"SharedArrayBuffer",r),dataView:r=>We(W.dataView(r),"DataView",r),urlInstance:r=>We(W.urlInstance(r),"URL",r),urlString:r=>We(W.urlString(r),"string with a URL",r),truthy:r=>We(W.truthy(r),"truthy",r),falsy:r=>We(W.falsy(r),"falsy",r),nan:r=>We(W.nan(r),"NaN",r),primitive:r=>We(W.primitive(r),"primitive",r),integer:r=>We(W.integer(r),"integer",r),safeInteger:r=>We(W.safeInteger(r),"integer",r),plainObject:r=>We(W.plainObject(r),"plain object",r),typedArray:r=>We(W.typedArray(r),"TypedArray",r),arrayLike:r=>We(W.arrayLike(r),"array-like",r),domElement:r=>We(W.domElement(r),"HTMLElement",r),observable:r=>We(W.observable(r),"Observable",r),nodeStream:r=>We(W.nodeStream(r),"Node.js Stream",r),infinite:r=>We(W.infinite(r),"infinite number",r),emptyArray:r=>We(W.emptyArray(r),"empty array",r),nonEmptyArray:r=>We(W.nonEmptyArray(r),"non-empty array",r),emptyString:r=>We(W.emptyString(r),"empty string",r),nonEmptyString:r=>We(W.nonEmptyString(r),"non-empty string",r),emptyStringOrWhitespace:r=>We(W.emptyStringOrWhitespace(r),"empty string or whitespace",r),emptyObject:r=>We(W.emptyObject(r),"empty object",r),nonEmptyObject:r=>We(W.nonEmptyObject(r),"non-empty object",r),emptySet:r=>We(W.emptySet(r),"empty set",r),nonEmptySet:r=>We(W.nonEmptySet(r),"non-empty set",r),emptyMap:r=>We(W.emptyMap(r),"empty map",r),nonEmptyMap:r=>We(W.nonEmptyMap(r),"non-empty map",r),propertyKey:r=>We(W.propertyKey(r),"PropertyKey",r),formData:r=>We(W.formData(r),"FormData",r),urlSearchParams:r=>We(W.urlSearchParams(r),"URLSearchParams",r),evenInteger:r=>We(W.evenInteger(r),"even integer",r),oddInteger:r=>We(W.oddInteger(r),"odd integer",r),directInstanceOf:(r,e)=>We(W.directInstanceOf(r,e),"T",r),inRange:(r,e)=>We(W.inRange(r,e),"in range",r),any:(r,...e)=>We(W.any(r,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(r,...e)=>We(W.all(r,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(W,{class:{value:W.class_},function:{value:W.function_},null:{value:W.null_}});Object.defineProperties(rA.assert,{class:{value:rA.assert.class_},function:{value:rA.assert.function_},null:{value:rA.assert.null_}});rA.default=W;Bw.exports=W;Bw.exports.default=W;Bw.exports.assert=rA.assert});var j4=w((Wit,Bk)=>{"use strict";var bk=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},xd=class{static fn(e){return(...t)=>new xd((i,n,s)=>{t.push(s),e(...t).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,i)=>{this._reject=i;let n=a=>{this._isPending=!1,t(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let t of this._cancelHandlers)t()}catch(t){this._reject(t)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new bk(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(xd.prototype,Promise.prototype);Bk.exports=xd;Bk.exports.CancelError=bk});var G4=w((Qk,Sk)=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});var xve=require("tls"),vk=(r,e)=>{let t;typeof e=="function"?t={connect:e}:t=e;let i=typeof t.connect=="function",n=typeof t.secureConnect=="function",s=typeof t.close=="function",o=()=>{i&&t.connect(),r instanceof xve.TLSSocket&&n&&(r.authorized?t.secureConnect():r.authorizationError||r.once("secureConnect",t.secureConnect)),s&&r.once("close",t.close)};r.writable&&!r.connecting?o():r.connecting?r.once("connect",o):r.destroyed&&s&&t.close(r._hadError)};Qk.default=vk;Sk.exports=vk;Sk.exports.default=vk});var Y4=w((xk,kk)=>{"use strict";Object.defineProperty(xk,"__esModule",{value:!0});var kve=G4(),Pve=Number(process.versions.node.split(".")[0]),Pk=r=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};r.timings=e;let t=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};t(r),r.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||Pve>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),kve.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};r.socket?i(r.socket):r.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof r.writableFinished=="boolean"?r.writableFinished:r.finished&&r.outputSize===0&&(!r.socket||r.socket.writableLength===0))()?n():r.prependOnceListener("finish",n),r.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,t(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};xk.default=Pk;kk.exports=Pk;kk.exports.default=Pk});var X4=w((zit,Dk)=>{"use strict";var{V4MAPPED:Dve,ADDRCONFIG:Rve,ALL:q4,promises:{Resolver:J4},lookup:Fve}=require("dns"),{promisify:Rk}=require("util"),Nve=require("os"),Zg=Symbol("cacheableLookupCreateConnection"),Fk=Symbol("cacheableLookupInstance"),W4=Symbol("expires"),Lve=typeof q4=="number",z4=r=>{if(!(r&&typeof r.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Tve=r=>{for(let e of r)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},_4=()=>{let r=!1,e=!1;for(let t of Object.values(Nve.networkInterfaces()))for(let i of t)if(!i.internal&&(i.family==="IPv6"?e=!0:r=!0,r&&e))return{has4:r,has6:e};return{has4:r,has6:e}},Ove=r=>Symbol.iterator in r,V4={ttl:!0},Mve={all:!0},Nk=class{constructor({cache:e=new Map,maxTtl:t=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new J4,lookup:o=Fve}={}){if(this.maxTtl=t,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Rk(o),this._resolver instanceof J4?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Rk(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Rk(this._resolver.resolve6.bind(this._resolver))),this._iface=_4(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,i){if(typeof t=="function"?(i=t,t={}):typeof t=="number"&&(t={family:t}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,t).then(n=>{t.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,t={}){typeof t=="number"&&(t={family:t});let i=await this.query(e);if(t.family===6){let n=i.filter(s=>s.family===6);t.hints&Dve&&(Lve&&t.hints&q4||n.length===0)?Tve(i):i=n}else t.family===4&&(i=i.filter(n=>n.family===4));if(t.hints&Rve){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return t.all?i:i[0]}async query(e){let t=await this._cache.get(e);if(!t){let i=this._pending[e];if(i)t=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,t=await n}}return t=t.map(i=>N({},i)),t}async _resolve(e){let t=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,V4),this._resolve6(e,V4)].map(c=>t(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(t){return{entries:[],cacheTtl:0}}}async _set(e,t,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,t[W4]=Date.now()+i;try{await this._cache.set(e,t,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Ove(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Mve);try{let t=await this._resolve(e);t.entries.length===0&&this._fallback&&(t=await this._lookup(e),t.entries.length!==0&&this._hostnamesToFallback.add(e));let i=t.entries.length===0?this.errorTtl:t.cacheTtl;return await this._set(e,t.entries,i),delete this._pending[e],t.entries}catch(t){throw delete this._pending[e],t}}_tick(e){let t=this._nextRemovalTime;(!t||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[W4];n>=a?this._cache.delete(s):a("lookup"in t||(t.lookup=this.lookup),e[Zg](t,i))}uninstall(e){if(z4(e),e[Zg]){if(e[Fk]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Zg],delete e[Zg],delete e[Fk]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=_4(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};Dk.exports=Nk;Dk.exports.default=Nk});var e8=w((_it,Lk)=>{"use strict";var Kve=typeof URL=="undefined"?require("url").URL:URL,Uve="text/plain",Hve="us-ascii",Z4=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),jve=(r,{stripHash:e})=>{let t=r.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!t)throw new Error(`Invalid URL: ${r}`);let i=t[1].split(";"),n=t[2],s=e?"":t[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Hve)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==Uve)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},$4=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(r=r.trim(),/^data:/i.test(r))return jve(r,e);let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new Kve(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];Z4(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])Z4(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),r=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};Lk.exports=$4;Lk.exports.default=$4});var i8=w((Vit,t8)=>{t8.exports=r8;function r8(r,e){if(r&&e)return r8(r)(e);if(typeof r!="function")throw new TypeError("need wrapper function");return Object.keys(r).forEach(function(i){t[i]=r[i]}),t;function t(){for(var i=new Array(arguments.length),n=0;n{var n8=i8();Tk.exports=n8(bw);Tk.exports.strict=n8(s8);bw.proto=bw(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return bw(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return s8(this)},configurable:!0})});function bw(r){var e=function(){return e.called?e.value:(e.called=!0,e.value=r.apply(this,arguments))};return e.called=!1,e}function s8(r){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=r.apply(this,arguments)},t=r.name||"Function wrapped with `once`";return e.onceError=t+" shouldn't be called more than once",e.called=!1,e}});var Mk=w((Zit,o8)=>{var Gve=Ok(),Yve=function(){},qve=function(r){return r.setHeader&&typeof r.abort=="function"},Jve=function(r){return r.stdio&&Array.isArray(r.stdio)&&r.stdio.length===3},a8=function(r,e,t){if(typeof e=="function")return a8(r,null,e);e||(e={}),t=Gve(t||Yve);var i=r._writableState,n=r._readableState,s=e.readable||e.readable!==!1&&r.readable,o=e.writable||e.writable!==!1&&r.writable,a=function(){r.writable||l()},l=function(){o=!1,s||t.call(r)},c=function(){s=!1,o||t.call(r)},u=function(p){t.call(r,p?new Error("exited with error code: "+p):null)},g=function(p){t.call(r,p)},f=function(){if(s&&!(n&&n.ended))return t.call(r,new Error("premature close"));if(o&&!(i&&i.ended))return t.call(r,new Error("premature close"))},h=function(){r.req.on("finish",l)};return qve(r)?(r.on("complete",l),r.on("abort",f),r.req?h():r.on("request",h)):o&&!i&&(r.on("end",a),r.on("close",a)),Jve(r)&&r.on("exit",u),r.on("end",c),r.on("finish",l),e.error!==!1&&r.on("error",g),r.on("close",f),function(){r.removeListener("complete",l),r.removeListener("abort",f),r.removeListener("request",h),r.req&&r.req.removeListener("finish",l),r.removeListener("end",a),r.removeListener("close",a),r.removeListener("finish",l),r.removeListener("exit",u),r.removeListener("end",c),r.removeListener("error",g),r.removeListener("close",f)}};o8.exports=a8});var c8=w(($it,A8)=>{var Wve=Ok(),zve=Mk(),Kk=require("fs"),kd=function(){},_ve=/^v?\.0/.test(process.version),Qw=function(r){return typeof r=="function"},Vve=function(r){return!_ve||!Kk?!1:(r instanceof(Kk.ReadStream||kd)||r instanceof(Kk.WriteStream||kd))&&Qw(r.close)},Xve=function(r){return r.setHeader&&Qw(r.abort)},Zve=function(r,e,t,i){i=Wve(i);var n=!1;r.on("close",function(){n=!0}),zve(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Vve(r))return r.close(kd);if(Xve(r))return r.abort();if(Qw(r.destroy))return r.destroy();i(o||new Error("stream was destroyed"))}}},l8=function(r){r()},$ve=function(r,e){return r.pipe(e)},exe=function(){var r=Array.prototype.slice.call(arguments),e=Qw(r[r.length-1]||kd)&&r.pop()||kd;if(Array.isArray(r[0])&&(r=r[0]),r.length<2)throw new Error("pump requires two streams per minimum");var t,i=r.map(function(n,s){var o=s0;return Zve(n,o,a,function(l){t||(t=l),l&&i.forEach(l8),!o&&(i.forEach(l8),e(t))})});return r.reduce($ve)};A8.exports=exe});var g8=w((ent,u8)=>{"use strict";var{PassThrough:txe}=require("stream");u8.exports=r=>{r=N({},r);let{array:e}=r,{encoding:t}=r,i=t==="buffer",n=!1;e?n=!(t||i):t=t||"utf8",i&&(t=null);let s=new txe({objectMode:n});t&&s.setEncoding(t);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var f8=w((tnt,$g)=>{"use strict";var rxe=c8(),ixe=g8(),Uk=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Sw(r,e){if(!r)return Promise.reject(new Error("Expected a stream"));e=N({maxBuffer:Infinity},e);let{maxBuffer:t}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=rxe(r,ixe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>t&&o(new Uk)})}),i.getBufferedValue()}$g.exports=Sw;$g.exports.default=Sw;$g.exports.buffer=(r,e)=>Sw(r,te(N({},e),{encoding:"buffer"}));$g.exports.array=(r,e)=>Sw(r,te(N({},e),{array:!0}));$g.exports.MaxBufferError=Uk});var p8=w((int,h8)=>{"use strict";var nxe=[200,203,204,206,300,301,404,405,410,414,501],sxe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],oxe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},axe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Hk(r){let e={};if(!r)return e;let t=r.trim().split(/\s*,\s*/);for(let i of t){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function Axe(r){let e=[];for(let t in r){let i=r[t];e.push(i===!0?t:t+"="+i)}if(!!e.length)return e.join(", ")}h8.exports=class{constructor(e,t,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!t||!t.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in t?t.status:200,this._resHeaders=t.headers,this._rescc=Hk(t.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=Hk(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Axe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!t.headers["cache-control"]&&/no-cache/.test(t.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&sxe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||nxe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let t=Hk(e.headers["cache-control"]);return t["no-cache"]||/no-cache/.test(e.headers.pragma)||t["max-age"]&&this.age()>t["max-age"]||t["min-fresh"]&&this.timeToLive()<1e3*t["min-fresh"]||this.stale()&&!(t["max-stale"]&&!this._rescc["must-revalidate"]&&(t["max-stale"]===!0||t["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let t=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of t)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let t={};for(let i in e)oxe[i]||(t[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete t[n]}if(t.warning){let i=t.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?t.warning=i.join(",").trim():delete t.warning}return t}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(t)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let t=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let t=(this.now()-this._responseTime)/1e3;return e+t}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,t=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(t-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete t["if-none-match"],delete t["if-modified-since"],t;if(this._resHeaders.etag&&(t["if-none-match"]=t["if-none-match"]?`${t["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),t["accept-ranges"]||t["if-match"]||t["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete t["if-modified-since"],t["if-none-match"]){let n=t["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?t["if-none-match"]=n.join(",").trim():delete t["if-none-match"]}}else this._resHeaders["last-modified"]&&!t["if-modified-since"]&&(t["if-modified-since"]=this._resHeaders["last-modified"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),!t||!t.headers)throw Error("Response headers missing");let i=!1;if(t.status!==void 0&&t.status!=304?i=!1:t.headers.etag&&!/^\s*W\//.test(t.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===t.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!t.headers.etag&&!t.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,t),modified:t.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in t.headers&&!axe[o]?t.headers[o]:this._resHeaders[o];let s=Object.assign({},t,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var vw=w((nnt,d8)=>{"use strict";d8.exports=r=>{let e={};for(let[t,i]of Object.entries(r))e[t.toLowerCase()]=i;return e}});var E8=w((snt,C8)=>{"use strict";var lxe=require("stream").Readable,cxe=vw(),m8=class extends lxe{constructor(e,t,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof t!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=cxe(t),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};C8.exports=m8});var y8=w((ont,I8)=>{"use strict";var uxe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];I8.exports=(r,e)=>{let t=new Set(Object.keys(r).concat(uxe));for(let i of t)i in e||(e[i]=typeof r[i]=="function"?r[i].bind(r):r[i])}});var B8=w((ant,w8)=>{"use strict";var gxe=require("stream").PassThrough,fxe=y8(),hxe=r=>{if(!(r&&r.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new gxe;return fxe(r,e),r.pipe(e)};w8.exports=hxe});var b8=w(jk=>{jk.stringify=function r(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var t="",i=Array.isArray(e);t=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(t+=","),n=!1,i?e[s]==null?t+="null":t+=r(e[s]):e[s]!==void 0&&(t+=r(s)+":"+r(e[s])))}return t+=i?"]":"}",t}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};jk.parse=function(r){return JSON.parse(r,function(e,t){return typeof t=="string"?/^:base64:/.test(t)?Buffer.from(t.substring(8),"base64"):/^:/.test(t)?t.substring(1):t:t})}});var x8=w((lnt,Q8)=>{"use strict";var pxe=require("events"),S8=b8(),dxe=r=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(r.adapter||r.uri){let t=r.adapter||/^[^:]*/.exec(r.uri)[0];return new(require(e[t]))(r)}return new Map},v8=class extends pxe{constructor(e,t){super();if(this.opts=Object.assign({namespace:"keyv",serialize:S8.stringify,deserialize:S8.parse},typeof e=="string"?{uri:e}:e,t),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=dxe(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return t&&t.raw?n:n.value}})}set(e,t,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return t={value:t,expires:s},this.opts.serialize(t)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};Q8.exports=v8});var D8=w((cnt,k8)=>{"use strict";var Cxe=require("events"),xw=require("url"),mxe=e8(),Exe=f8(),Gk=p8(),P8=E8(),Ixe=vw(),yxe=B8(),wxe=x8(),ia=class{constructor(e,t){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new wxe({uri:typeof t=="string"&&t,store:typeof t!="string"&&t,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,i)=>{let n;if(typeof t=="string")n=Yk(xw.parse(t)),t={};else if(t instanceof xw.URL)n=Yk(xw.parse(t.toString())),t={};else{let[g,...f]=(t.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=Yk(te(N({},t),{pathname:g,search:h}))}t=N(N({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},t),Bxe(n)),t.headers=Ixe(t.headers);let s=new Cxe,o=mxe(xw.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${t.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(y=>{h=()=>{f||(f=!0,y())}}),m=y=>{if(l&&!g.forceRefresh){y.status=y.statusCode;let v=Gk.fromObject(l.cachePolicy).revalidatedPolicy(g,y);if(!v.modified){let x=v.policy.responseHeaders();y=new P8(l.statusCode,x,l.body,l.url),y.cachePolicy=v.policy,y.fromCache=!0}}y.fromCache||(y.cachePolicy=new Gk(g,y,g),y.fromCache=!1);let b;g.cache&&y.cachePolicy.storable()?(b=yxe(y),(async()=>{try{let v=Exe.buffer(y);if(await Promise.race([p,new Promise(Y=>y.once("end",Y))]),f)return;let x=await v,T={cachePolicy:y.cachePolicy.toObject(),url:y.url,statusCode:y.fromCache?l.statusCode:y.statusCode,body:x},q=g.strictTtl?y.cachePolicy.timeToLive():void 0;g.maxTtl&&(q=q?Math.min(q,g.maxTtl):g.maxTtl),await this.cache.set(a,T,q)}catch(v){s.emit("error",new ia.CacheError(v))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(v){s.emit("error",new ia.CacheError(v))}})(),s.emit("response",b||y),typeof i=="function"&&i(b||y)};try{let y=e(g,m);y.once("error",h),y.once("abort",h),s.emit("request",y)}catch(y){s.emit("error",new ia.RequestError(y))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let m=Gk.fromObject(p.cachePolicy);if(m.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let y=m.responseHeaders(),b=new P8(p.statusCode,y,p.body,p.url);b.cachePolicy=m,b.fromCache=!0,s.emit("response",b),typeof i=="function"&&i(b)}else l=p,h.headers=m.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new ia.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(t)}catch(h){t.automaticFailover&&!c&&u(t),s.emit("error",new ia.CacheError(h))}})(),s}}};function Bxe(r){let e=N({},r);return e.path=`${r.pathname||"/"}${r.search||""}`,delete e.pathname,delete e.search,e}function Yk(r){return{protocol:r.protocol,auth:r.auth,hostname:r.hostname||r.host||"localhost",port:r.port,pathname:r.pathname,search:r.search}}ia.RequestError=class extends Error{constructor(r){super(r.message);this.name="RequestError",Object.assign(this,r)}};ia.CacheError=class extends Error{constructor(r){super(r.message);this.name="CacheError",Object.assign(this,r)}};k8.exports=ia});var F8=w((unt,R8)=>{"use strict";var bxe=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];R8.exports=(r,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let t=new Set(Object.keys(r).concat(bxe)),i={};for(let n of t)n in e||(i[n]={get(){let s=r[n];return typeof s=="function"?s.bind(r):s},set(s){r[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),r.once("aborted",()=>{e.destroy(),e.emit("aborted")}),r.once("close",()=>{r.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var L8=w((gnt,N8)=>{"use strict";var{Transform:Qxe,PassThrough:Sxe}=require("stream"),qk=require("zlib"),vxe=F8();N8.exports=r=>{let e=(r.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return r;let t=e==="br";if(t&&typeof qk.createBrotliDecompress!="function")return r.destroy(new Error("Brotli is not supported on Node.js < 12")),r;let i=!0,n=new Qxe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new Sxe({autoDestroy:!1,destroy(a,l){r.destroy(),l(a)}}),o=t?qk.createBrotliDecompress():qk.createUnzip();return o.once("error",a=>{if(i&&!r.readable){s.end();return}s.destroy(a)}),vxe(r,s),r.pipe(n).pipe(o).pipe(s),s}});var Jk=w((fnt,T8)=>{"use strict";var O8=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};T8.exports=O8});var zk=w((hnt,M8)=>{"use strict";var xxe=require("events"),kxe=require("tls"),Pxe=require("http2"),Dxe=Jk(),gn=Symbol("currentStreamsCount"),K8=Symbol("request"),Ls=Symbol("cachedOriginSet"),ef=Symbol("gracefullyClosing"),Rxe=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Fxe=(r,e,t)=>{let i=0,n=r.length;for(;i>>1;t(r[s],e)?i=s+1:n=s}return i},Nxe=(r,e)=>r.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,Wk=(r,e)=>{for(let t of r)t[Ls].lengthe[Ls].includes(i))&&t[gn]+e[gn]<=e.remoteSettings.maxConcurrentStreams&&U8(t)},Lxe=(r,e)=>{for(let t of r)e[Ls].lengtht[Ls].includes(i))&&e[gn]+t[gn]<=t.remoteSettings.maxConcurrentStreams&&U8(e)},H8=({agent:r,isFree:e})=>{let t={};for(let i in r.sessions){let s=r.sessions[i].filter(o=>{let a=o[nA.kCurrentStreamsCount]{r[ef]=!0,r[gn]===0&&r.close()},nA=class extends xxe{constructor({timeout:e=6e4,maxSessions:t=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Dxe({maxSize:n})}static normalizeOrigin(e,t){return typeof e=="string"&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t="";if(e)for(let i of Rxe)e[i]&&(t+=`:${e[i]}`);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;let i=this.queue[e][t];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(t),a=nA.normalizeOrigin(e,t&&t.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let m=p.remoteSettings.maxConcurrentStreams;if(m=m||p[ef]||p.destroyed)continue;h||(g=m),y>f&&(h=p,f=y)}}if(h){if(i.length!==1){for(let{reject:p}of i){let m=new Error(`Expected the length of listeners to be 1, got ${i.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);p(m)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=Pxe.connect(e,N({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},t));f[gn]=0,f[ef]=!1;let h=()=>f[gn]{this.tlsSessionCache.set(u,y)}),f.once("error",y=>{for(let{reject:b}of i)b(y);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let y=this.sessions[o];y.splice(y.indexOf(f),1),y.length===0&&delete this.sessions[o]}else{let y=new Error("Session closed without receiving a SETTINGS frame");y.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:b}of i)b(y);l()}this._tryToCreateNewSession(o,a)});let m=()=>{if(!(!(o in this.queue)||!h())){for(let y of f[Ls])if(y in this.queue[o]){let{listeners:b}=this.queue[o][y];for(;b.length!==0&&h();)b.shift().resolve(f);let v=this.queue[o];if(v[y].listeners.length===0&&(delete v[y],Object.keys(v).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[Ls]=f.originSet,!!h()&&(m(),Wk(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let y=new Error("Agent has been destroyed");for(let b of i)b.reject(y);f.destroy();return}f[Ls]=f.originSet;{let y=this.sessions;if(o in y){let b=y[o];b.splice(Fxe(b,f,Nxe),0,f)}else y[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),m(),l(),f[gn]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,t,i),i.length=0),f.on("remoteSettings",()=>{m(),Wk(this.sessions[o],f)})}),f[K8]=f.request,f.request=(y,b)=>{if(f[ef])throw new Error("The session is gracefully closing. No new streams are allowed.");let v=f[K8](y,b);return f.ref(),++f[gn],f[gn]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,v.once("close",()=>{if(p=h(),--f[gn],!f.destroyed&&!f.closed&&(Lxe(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let x=f[gn]===0;x&&f.unref(),x&&(this._freeSessionsCount>this.maxFreeSessions||f[ef])?f.close():(Wk(this.sessions[o],f),m())}}),v}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,t,i,n){return new Promise((s,o)=>{this.getSession(e,t,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,t){return nA.connect(e,t)}static connect(e,t){t.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof t.servername=="undefined"&&(t.servername=n),kxe.connect(i,n,t)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let t of e)t[gn]===0&&t.close()}destroy(e){for(let t of Object.values(this.sessions))for(let i of t)i.destroy(e);for(let t of Object.values(this.queue))for(let i of Object.values(t))i.destroyed=!0;this.queue={}}get freeSessions(){return H8({agent:this,isFree:!0})}get busySessions(){return H8({agent:this,isFree:!1})}};nA.kCurrentStreamsCount=gn;nA.kGracefullyClosing=ef;M8.exports={Agent:nA,globalAgent:new nA}});var _k=w((pnt,j8)=>{"use strict";var{Readable:Txe}=require("stream"),G8=class extends Txe{constructor(e,t){super({highWaterMark:t,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};j8.exports=G8});var Vk=w((dnt,Y8)=>{"use strict";Y8.exports=r=>{let e={protocol:r.protocol,hostname:typeof r.hostname=="string"&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return typeof r.port=="string"&&r.port.length!==0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var J8=w((Cnt,q8)=>{"use strict";q8.exports=(r,e,t)=>{for(let i of t)r.on(i,(...n)=>e.emit(i,...n))}});var z8=w((mnt,W8)=>{"use strict";W8.exports=r=>{switch(r){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var V8=w((Int,_8)=>{"use strict";var tf=(r,e,t)=>{_8.exports[e]=class extends r{constructor(...n){super(typeof t=="string"?t:t(n));this.name=`${super.name} [${e}]`,this.code=e}}};tf(TypeError,"ERR_INVALID_ARG_TYPE",r=>{let e=r[0].includes(".")?"property":"argument",t=r[1],i=Array.isArray(t);return i&&(t=`${t.slice(0,-1).join(", ")} or ${t.slice(-1)}`),`The "${r[0]}" ${e} must be ${i?"one of":"of"} type ${t}. Received ${typeof r[2]}`});tf(TypeError,"ERR_INVALID_PROTOCOL",r=>`Protocol "${r[0]}" not supported. Expected "${r[1]}"`);tf(Error,"ERR_HTTP_HEADERS_SENT",r=>`Cannot ${r[0]} headers after they are sent to the client`);tf(TypeError,"ERR_INVALID_HTTP_TOKEN",r=>`${r[0]} must be a valid HTTP token [${r[1]}]`);tf(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",r=>`Invalid value "${r[0]} for header "${r[1]}"`);tf(TypeError,"ERR_INVALID_CHAR",r=>`Invalid character in ${r[0]} [${r[1]}]`)});var eP=w((ynt,X8)=>{"use strict";var Oxe=require("http2"),{Writable:Mxe}=require("stream"),{Agent:Z8,globalAgent:Kxe}=zk(),Uxe=_k(),Hxe=Vk(),jxe=J8(),Gxe=z8(),{ERR_INVALID_ARG_TYPE:Xk,ERR_INVALID_PROTOCOL:Yxe,ERR_HTTP_HEADERS_SENT:$8,ERR_INVALID_HTTP_TOKEN:qxe,ERR_HTTP_INVALID_HEADER_VALUE:Jxe,ERR_INVALID_CHAR:Wxe}=V8(),{HTTP2_HEADER_STATUS:ez,HTTP2_HEADER_METHOD:tz,HTTP2_HEADER_PATH:rz,HTTP2_METHOD_CONNECT:zxe}=Oxe.constants,Wi=Symbol("headers"),Zk=Symbol("origin"),$k=Symbol("session"),iz=Symbol("options"),kw=Symbol("flushedHeaders"),Pd=Symbol("jobs"),_xe=/^[\^`\-\w!#$%&*+.|~]+$/,Vxe=/[^\t\u0020-\u007E\u0080-\u00FF]/,nz=class extends Mxe{constructor(e,t,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Hxe(e instanceof URL?e:new URL(e))),typeof t=="function"||t===void 0?(i=t,t=n?e:N({},e)):t=N(N({},e),t),t.h2session)this[$k]=t.h2session;else if(t.agent===!1)this.agent=new Z8({maxFreeSessions:0});else if(typeof t.agent=="undefined"||t.agent===null)typeof t.createConnection=="function"?(this.agent=new Z8({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=Kxe;else if(typeof t.agent.request=="function")this.agent=t.agent;else throw new Xk("options.agent",["Agent-like Object","undefined","false"],t.agent);if(t.protocol&&t.protocol!=="https:")throw new Yxe(t.protocol,"https:");let s=t.port||t.defaultPort||this.agent&&this.agent.defaultPort||443,o=t.hostname||t.host||"localhost";delete t.hostname,delete t.host,delete t.port;let{timeout:a}=t;if(t.timeout=void 0,this[Wi]=Object.create(null),this[Pd]=[],this.socket=null,this.connection=null,this.method=t.method||"GET",this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(let[l,c]of Object.entries(t.headers))this.setHeader(l,c);t.auth&&!("authorization"in this[Wi])&&(this[Wi].authorization="Basic "+Buffer.from(t.auth).toString("base64")),t.session=t.tlsSession,t.path=t.socketPath,this[iz]=t,s===443?(this[Zk]=`https://${o}`,":authority"in this[Wi]||(this[Wi][":authority"]=o)):(this[Zk]=`https://${o}:${s}`,":authority"in this[Wi]||(this[Wi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[kw]=!1}get method(){return this[Wi][tz]}set method(e){e&&(this[Wi][tz]=e.toUpperCase())}get path(){return this[Wi][rz]}set path(e){e&&(this[Wi][rz]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,t,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,t,i);this._request?n():this[Pd].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let t=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?t():this[Pd].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[kw]||this.destroyed)return;this[kw]=!0;let e=this.method===zxe,t=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||jxe(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new Uxe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[ez],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[ez]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[Pd])o();this.emit("socket",this.socket)};if(this[$k])try{t(this[$k].request(this[Wi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[Zk],this[iz],this[Wi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new Xk("name","string",e);return this[Wi][e.toLowerCase()]}get headersSent(){return this[kw]}removeHeader(e){if(typeof e!="string")throw new Xk("name","string",e);if(this.headersSent)throw new $8("remove");delete this[Wi][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new $8("set");if(typeof e!="string"||!_xe.test(e)&&!Gxe(e))throw new qxe("Header name",e);if(typeof t=="undefined")throw new Jxe(t,e);if(Vxe.test(t))throw new Wxe("header content",e);this[Wi][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){let i=()=>this._request.setTimeout(e,t);return this._request?i():this[Pd].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};X8.exports=nz});var oz=w((wnt,sz)=>{"use strict";var Xxe=require("tls");sz.exports=(r={})=>new Promise((e,t)=>{let i=Xxe.connect(r,()=>{r.resolveSocket?(i.off("error",t),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",t)})});var Az=w((Bnt,az)=>{"use strict";var Zxe=require("net");az.exports=r=>{let e=r.host,t=r.headers&&r.headers.host;return t&&(t.startsWith("[")?t.indexOf("]")===-1?e=t:e=t.slice(1,-1):e=t.split(":",1)[0]),Zxe.isIP(e)?"":e}});var uz=w((bnt,tP)=>{"use strict";var lz=require("http"),rP=require("https"),$xe=oz(),eke=Jk(),tke=eP(),rke=Az(),ike=Vk(),Pw=new eke({maxSize:100}),Dd=new Map,cz=(r,e,t)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{r.emit("free",e,t)};e.on("free",i);let n=()=>{r.removeSocket(e,t)};e.on("close",n);let s=()=>{r.removeSocket(e,t),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),r.emit("free",e,t)},nke=async r=>{let e=`${r.host}:${r.port}:${r.ALPNProtocols.sort()}`;if(!Pw.has(e)){if(Dd.has(e))return(await Dd.get(e)).alpnProtocol;let{path:t,agent:i}=r;r.path=r.socketPath;let n=$xe(r);Dd.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Pw.set(e,o),r.path=t,o==="h2")s.destroy();else{let{globalAgent:a}=rP,l=rP.Agent.prototype.createConnection;i?i.createConnection===l?cz(i,s,r):s.destroy():a.createConnection===l?cz(a,s,r):s.destroy()}return Dd.delete(e),o}catch(s){throw Dd.delete(e),s}}return Pw.get(e)};tP.exports=async(r,e,t)=>{if((typeof r=="string"||r instanceof URL)&&(r=ike(new URL(r))),typeof e=="function"&&(t=e,e=void 0),e=te(N(N({ALPNProtocols:["h2","http/1.1"]},r),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||rke(e),e.port=e.port||(i?443:80),e._defaultAgent=i?rP.globalAgent:lz.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await nke(e)==="h2"?(n&&(e.agent=n.http2),new tke(e,t)):lz.request(e,t)};tP.exports.protocolCache=Pw});var fz=w((Qnt,gz)=>{"use strict";var ske=require("http2"),oke=zk(),iP=eP(),ake=_k(),Ake=uz(),lke=(r,e,t)=>new iP(r,e,t),cke=(r,e,t)=>{let i=new iP(r,e,t);return i.end(),i};gz.exports=te(N(te(N({},ske),{ClientRequest:iP,IncomingMessage:ake}),oke),{request:lke,get:cke,auto:Ake})});var sP=w(nP=>{"use strict";Object.defineProperty(nP,"__esModule",{value:!0});var hz=iA();nP.default=r=>hz.default.nodeStream(r)&&hz.default.function_(r.getBoundary)});var mz=w(oP=>{"use strict";Object.defineProperty(oP,"__esModule",{value:!0});var pz=require("fs"),dz=require("util"),Cz=iA(),uke=sP(),gke=dz.promisify(pz.stat);oP.default=async(r,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!r)return 0;if(Cz.default.string(r))return Buffer.byteLength(r);if(Cz.default.buffer(r))return r.length;if(uke.default(r))return dz.promisify(r.getLength.bind(r))();if(r instanceof pz.ReadStream){let{size:t}=await gke(r.path);return t===0?void 0:t}}});var AP=w(aP=>{"use strict";Object.defineProperty(aP,"__esModule",{value:!0});function fke(r,e,t){let i={};for(let n of t)i[n]=(...s)=>{e.emit(n,...s)},r.on(n,i[n]);return()=>{for(let n of t)r.off(n,i[n])}}aP.default=fke});var Ez=w(lP=>{"use strict";Object.defineProperty(lP,"__esModule",{value:!0});lP.default=()=>{let r=[];return{once(e,t,i){e.once(t,i),r.push({origin:e,event:t,fn:i})},unhandleAll(){for(let e of r){let{origin:t,event:i,fn:n}=e;t.removeListener(i,n)}r.length=0}}}});var yz=w(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});Rd.TimeoutError=void 0;var hke=require("net"),pke=Ez(),Iz=Symbol("reentry"),dke=()=>{},cP=class extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`);this.event=t,this.name="TimeoutError",this.code="ETIMEDOUT"}};Rd.TimeoutError=cP;Rd.default=(r,e,t)=>{if(Iz in r)return dke;r[Iz]=!0;let i=[],{once:n,unhandleAll:s}=pke.default(),o=(g,f,h)=>{var p;let m=setTimeout(f,g,g,h);(p=m.unref)===null||p===void 0||p.call(m);let y=()=>{clearTimeout(m)};return i.push(y),y},{host:a,hostname:l}=t,c=(g,f)=>{r.destroy(new cP(g,f))},u=()=>{for(let g of i)g();s()};if(r.once("error",g=>{if(u(),r.listenerCount("error")===0)throw g}),r.once("close",u),n(r,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};r.setTimeout(e.socket,g),i.push(()=>{r.removeListener("timeout",g)})}return n(r,"socket",g=>{var f;let{socketPath:h}=r;if(g.connecting){let p=Boolean(h!=null?h:hke.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let m=o(e.lookup,c,"lookup");n(g,"lookup",m)}if(typeof e.connect!="undefined"){let m=()=>o(e.connect,c,"connect");p?n(g,"connect",m()):n(g,"lookup",y=>{y===null&&n(g,"connect",m())})}typeof e.secureConnect!="undefined"&&t.protocol==="https:"&&n(g,"connect",()=>{let m=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",m)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(r,"upload-complete",p())}):n(r,"upload-complete",p())}}),typeof e.response!="undefined"&&n(r,"upload-complete",()=>{let g=o(e.response,c,"response");n(r,"response",g)}),u}});var Bz=w(uP=>{"use strict";Object.defineProperty(uP,"__esModule",{value:!0});var wz=iA();uP.default=r=>{r=r;let e={protocol:r.protocol,hostname:wz.default.string(r.hostname)&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return wz.default.string(r.port)&&r.port.length>0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var bz=w(gP=>{"use strict";Object.defineProperty(gP,"__esModule",{value:!0});var Cke=require("url"),mke=["protocol","host","hostname","port","pathname","search"];gP.default=(r,e)=>{var t,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!r){if(!e.protocol)throw new TypeError("No URL protocol specified");r=`${e.protocol}//${(i=(t=e.hostname)!==null&&t!==void 0?t:e.host)!==null&&i!==void 0?i:""}`}let n=new Cke.URL(r);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of mke)e[s]&&(n[s]=e[s].toString());return n}});var Sz=w(fP=>{"use strict";Object.defineProperty(fP,"__esModule",{value:!0});var Qz=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){typeof e=="object"?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};fP.default=Qz});var pP=w(hP=>{"use strict";Object.defineProperty(hP,"__esModule",{value:!0});var Eke=async r=>{let e=[],t=0;for await(let i of r)e.push(i),t+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,t):Buffer.from(e.join(""))};hP.default=Eke});var xz=w(Vc=>{"use strict";Object.defineProperty(Vc,"__esModule",{value:!0});Vc.dnsLookupIpVersionToFamily=Vc.isDnsLookupIpVersion=void 0;var vz={auto:0,ipv4:4,ipv6:6};Vc.isDnsLookupIpVersion=r=>r in vz;Vc.dnsLookupIpVersionToFamily=r=>{if(Vc.isDnsLookupIpVersion(r))return vz[r];throw new Error("Invalid DNS lookup IP version")}});var dP=w(Dw=>{"use strict";Object.defineProperty(Dw,"__esModule",{value:!0});Dw.isResponseOk=void 0;Dw.isResponseOk=r=>{let{statusCode:e}=r,t=r.request.options.followRedirect?299:399;return e>=200&&e<=t||e===304}});var Pz=w(CP=>{"use strict";Object.defineProperty(CP,"__esModule",{value:!0});var kz=new Set;CP.default=r=>{kz.has(r)||(kz.add(r),process.emitWarning(`Got: ${r}`,{type:"DeprecationWarning"}))}});var Dz=w(mP=>{"use strict";Object.defineProperty(mP,"__esModule",{value:!0});var Ir=iA(),Ike=(r,e)=>{if(Ir.default.null_(r.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Ir.assert.any([Ir.default.string,Ir.default.undefined],r.encoding),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.resolveBodyOnly),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.methodRewriting),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.isStream),Ir.assert.any([Ir.default.string,Ir.default.undefined],r.responseType),r.responseType===void 0&&(r.responseType="text");let{retry:t}=r;if(e?r.retry=N({},e.retry):r.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ir.default.object(t)?(r.retry=N(N({},r.retry),t),r.retry.methods=[...new Set(r.retry.methods.map(i=>i.toUpperCase()))],r.retry.statusCodes=[...new Set(r.retry.statusCodes)],r.retry.errorCodes=[...new Set(r.retry.errorCodes)]):Ir.default.number(t)&&(r.retry.limit=t),Ir.default.undefined(r.retry.maxRetryAfter)&&(r.retry.maxRetryAfter=Math.min(...[r.timeout.request,r.timeout.connect].filter(Ir.default.number))),Ir.default.object(r.pagination)){e&&(r.pagination=N(N({},e.pagination),r.pagination));let{pagination:i}=r;if(!Ir.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Ir.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Ir.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Ir.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return r.responseType==="json"&&r.headers.accept===void 0&&(r.headers.accept="application/json"),r};mP.default=Ike});var Rz=w(Fd=>{"use strict";Object.defineProperty(Fd,"__esModule",{value:!0});Fd.retryAfterStatusCodes=void 0;Fd.retryAfterStatusCodes=new Set([413,429,503]);var yke=({attemptCount:r,retryOptions:e,error:t,retryAfter:i})=>{if(r>e.limit)return 0;let n=e.methods.includes(t.options.method),s=e.errorCodes.includes(t.code),o=t.response&&e.statusCodes.includes(t.response.statusCode);if(!n||!s&&!o)return 0;if(t.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(t.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(r-1)*1e3+a};Fd.default=yke});var Ld=w(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.UnsupportedProtocolError=qt.ReadError=qt.TimeoutError=qt.UploadError=qt.CacheError=qt.HTTPError=qt.MaxRedirectsError=qt.RequestError=qt.setNonEnumerableProperties=qt.knownHookEvents=qt.withoutBody=qt.kIsNormalizedAlready=void 0;var Fz=require("util"),Nz=require("stream"),wke=require("fs"),gl=require("url"),Lz=require("http"),EP=require("http"),Bke=require("https"),bke=Y4(),Qke=X4(),Tz=D8(),Ske=L8(),vke=fz(),xke=vw(),Ee=iA(),kke=mz(),Oz=sP(),Pke=AP(),Mz=yz(),Dke=Bz(),Kz=bz(),Rke=Sz(),Fke=pP(),Uz=xz(),Nke=dP(),fl=Pz(),Lke=Dz(),Tke=Rz(),IP,Fi=Symbol("request"),Rw=Symbol("response"),rf=Symbol("responseSize"),nf=Symbol("downloadedSize"),sf=Symbol("bodySize"),of=Symbol("uploadedSize"),Fw=Symbol("serverResponsesPiped"),Hz=Symbol("unproxyEvents"),jz=Symbol("isFromCache"),yP=Symbol("cancelTimeouts"),Gz=Symbol("startedReading"),af=Symbol("stopReading"),Nw=Symbol("triggerRead"),hl=Symbol("body"),Nd=Symbol("jobs"),Yz=Symbol("originalResponse"),qz=Symbol("retryTimeout");qt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Oke=Ee.default.string(process.versions.brotli);qt.withoutBody=new Set(["GET","HEAD"]);qt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function Mke(r){for(let e in r){let t=r[e];if(!Ee.default.string(t)&&!Ee.default.number(t)&&!Ee.default.boolean(t)&&!Ee.default.null_(t)&&!Ee.default.undefined(t))throw new TypeError(`The \`searchParams\` value '${String(t)}' must be a string, number, boolean or null`)}}function Kke(r){return Ee.default.object(r)&&!("statusCode"in r)}var wP=new Rke.default,Uke=async r=>new Promise((e,t)=>{let i=n=>{t(n)};r.pending||e(),r.once("error",i),r.once("ready",()=>{r.off("error",i),e()})}),Hke=new Set([300,301,302,303,304,307,308]),jke=["context","body","json","form"];qt.setNonEnumerableProperties=(r,e)=>{let t={};for(let i of r)if(!!i)for(let n of jke)n in i&&(t[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,t)};var hi=class extends Error{constructor(e,t,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=t.code,i instanceof BP?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Rw]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,Ee.default.string(t.stack)&&Ee.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` -`).reverse(),a=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split(` -`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` -`)}${a.reverse().join(` -`)}`}}};qt.RequestError=hi;var bP=class extends hi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};qt.MaxRedirectsError=bP;var QP=class extends hi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};qt.HTTPError=QP;var SP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="CacheError"}};qt.CacheError=SP;var vP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="UploadError"}};qt.UploadError=vP;var xP=class extends hi{constructor(e,t,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=t}};qt.TimeoutError=xP;var Lw=class extends hi{constructor(e,t){super(e.message,e,t);this.name="ReadError"}};qt.ReadError=Lw;var kP=class extends hi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};qt.UnsupportedProtocolError=kP;var Gke=["socket","connect","continue","information","upgrade","timeout"],BP=class extends Nz.Duplex{constructor(e,t={},i){super({autoDestroy:!1,highWaterMark:0});this[nf]=0,this[of]=0,this.requestInitialized=!1,this[Fw]=new Set,this.redirects=[],this[af]=!1,this[Nw]=!1,this[Nd]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof EP.IncomingMessage&&(this.options.headers=N(N({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=t;if((o||a||l)&&this._lockWrite(),qt.kIsNormalizedAlready in t)this.options=t;else try{this.options=this.constructor.normalizeArguments(e,t,i)}catch(c){Ee.default.nodeStream(t.body)&&t.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof wke.ReadStream&&await Uke(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Fi])===null||c===void 0||c.destroy();return}for(let g of this[Nd])g();this[Nd].length=0,this.requestInitialized=!0}catch(u){if(u instanceof hi){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,t,i){var n,s,o,a,l;let c=t;if(Ee.default.object(e)&&!Ee.default.urlInstance(e))t=N(N(N({},i),e),t);else{if(e&&t&&t.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");t=N(N({},i),t),e!==void 0&&(t.url=e),Ee.default.urlInstance(t.url)&&(t.url=new gl.URL(t.url.toString()))}if(t.cache===!1&&(t.cache=void 0),t.dnsCache===!1&&(t.dnsCache=void 0),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.method),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.headers),Ee.assert.any([Ee.default.string,Ee.default.urlInstance,Ee.default.undefined],t.prefixUrl),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cookieJar),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.searchParams),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.cache),Ee.assert.any([Ee.default.object,Ee.default.number,Ee.default.undefined],t.timeout),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.context),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.hooks),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.decompress),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.ignoreInvalidCookies),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.followRedirect),Ee.assert.any([Ee.default.number,Ee.default.undefined],t.maxRedirects),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.throwHttpErrors),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.http2),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.allowGetBody),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.localAddress),Ee.assert.any([Uz.isDnsLookupIpVersion,Ee.default.undefined],t.dnsLookupIpVersion),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.https),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.rejectUnauthorized),t.https&&(Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.https.rejectUnauthorized),Ee.assert.any([Ee.default.function_,Ee.default.undefined],t.https.checkServerIdentity),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificateAuthority),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.key),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificate),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.https.passphrase),Ee.assert.any([Ee.default.string,Ee.default.buffer,Ee.default.array,Ee.default.undefined],t.https.pfx)),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cacheOptions),Ee.default.string(t.method)?t.method=t.method.toUpperCase():t.method="GET",t.headers===(i==null?void 0:i.headers)?t.headers=N({},t.headers):t.headers=xke(N(N({},i==null?void 0:i.headers),t.headers)),"slashes"in t)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in t)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in t&&t.searchParams&&t.searchParams!==(i==null?void 0:i.searchParams)){let h;if(Ee.default.string(t.searchParams)||t.searchParams instanceof gl.URLSearchParams)h=new gl.URLSearchParams(t.searchParams);else{Mke(t.searchParams),h=new gl.URLSearchParams;for(let p in t.searchParams){let m=t.searchParams[p];m===null?h.append(p,""):m!==void 0&&h.append(p,m)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,m)=>{h.has(m)||h.append(m,p)}),t.searchParams=h}if(t.username=(s=t.username)!==null&&s!==void 0?s:"",t.password=(o=t.password)!==null&&o!==void 0?o:"",Ee.default.undefined(t.prefixUrl)?t.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(t.prefixUrl=t.prefixUrl.toString(),t.prefixUrl!==""&&!t.prefixUrl.endsWith("/")&&(t.prefixUrl+="/")),Ee.default.string(t.url)){if(t.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");t.url=Kz.default(t.prefixUrl+t.url,t)}else(Ee.default.undefined(t.url)&&t.prefixUrl!==""||t.protocol)&&(t.url=Kz.default(t.prefixUrl,t));if(t.url){"port"in t&&delete t.port;let{prefixUrl:h}=t;Object.defineProperty(t,"prefixUrl",{set:m=>{let y=t.url;if(!y.href.startsWith(m))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${m}: ${y.href}`);t.url=new gl.URL(m+y.href.slice(h.length)),h=m},get:()=>h});let{protocol:p}=t.url;if(p==="unix:"&&(p="http:",t.url=new gl.URL(`http://unix${t.url.pathname}${t.url.search}`)),t.searchParams&&(t.url.search=t.searchParams.toString()),p!=="http:"&&p!=="https:")throw new kP(t);t.username===""?t.username=t.url.username:t.url.username=t.username,t.password===""?t.password=t.url.password:t.url.password=t.password}let{cookieJar:u}=t;if(u){let{setCookie:h,getCookieString:p}=u;Ee.assert.function_(h),Ee.assert.function_(p),h.length===4&&p.length===0&&(h=Fz.promisify(h.bind(t.cookieJar)),p=Fz.promisify(p.bind(t.cookieJar)),t.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=t;if(g&&(wP.has(g)||wP.set(g,new Tz((h,p)=>{let m=h[Fi](h,p);return Ee.default.promise(m)&&(m.once=(y,b)=>{if(y==="error")m.catch(b);else if(y==="abort")(async()=>{try{(await m).once("abort",b)}catch(v){}})();else throw new Error(`Unknown HTTP2 promise event: ${y}`);return m}),m},g))),t.cacheOptions=N({},t.cacheOptions),t.dnsCache===!0)IP||(IP=new Qke.default),t.dnsCache=IP;else if(!Ee.default.undefined(t.dnsCache)&&!t.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${Ee.default(t.dnsCache)}`);Ee.default.number(t.timeout)?t.timeout={request:t.timeout}:i&&t.timeout!==i.timeout?t.timeout=N(N({},i.timeout),t.timeout):t.timeout=N({},t.timeout),t.context||(t.context={});let f=t.hooks===(i==null?void 0:i.hooks);t.hooks=N({},t.hooks);for(let h of qt.knownHookEvents)if(h in t.hooks)if(Ee.default.array(t.hooks[h]))t.hooks[h]=[...t.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${Ee.default(t.hooks[h])}`);else t.hooks[h]=[];if(i&&!f)for(let h of qt.knownHookEvents)i.hooks[h].length>0&&(t.hooks[h]=[...i.hooks[h],...t.hooks[h]]);if("family"in t&&fl.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(t.https=N(N({},i.https),t.https)),"rejectUnauthorized"in t&&fl.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in t&&fl.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in t&&fl.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in t&&fl.default('"options.key" was never documented, please use "options.https.key"'),"cert"in t&&fl.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in t&&fl.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in t&&fl.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in t)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(t.agent){for(let h in t.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return t.maxRedirects=(l=t.maxRedirects)!==null&&l!==void 0?l:0,qt.setNonEnumerableProperties([i,c],t),Lke.default(t,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:t}=e,i=!Ee.default.undefined(e.form),n=!Ee.default.undefined(e.json),s=!Ee.default.undefined(e.body),o=i||n||s,a=qt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof Nz.Readable)&&!Ee.default.string(e.body)&&!Ee.default.buffer(e.body)&&!Oz.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!Ee.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!Ee.default.string(t["content-type"]);s?(Oz.default(e.body)&&l&&(t["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[hl]=e.body):i?(l&&(t["content-type"]="application/x-www-form-urlencoded"),this[hl]=new gl.URLSearchParams(e.form).toString()):(l&&(t["content-type"]="application/json"),this[hl]=e.stringifyJson(e.json));let c=await kke.default(this[hl],e.headers);Ee.default.undefined(t["content-length"])&&Ee.default.undefined(t["transfer-encoding"])&&!a&&!Ee.default.undefined(c)&&(t["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[sf]=Number(t["content-length"])||void 0}async _onResponseBase(e){let{options:t}=this,{url:i}=t;this[Yz]=e,t.decompress&&(e=Ske(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:Lz.STATUS_CODES[n],s.url=t.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[jz]=s.isFromCache,this[rf]=Number(e.headers["content-length"])||void 0,this[Rw]=e,e.once("end",()=>{this[rf]=this[nf],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new Lw(a,this))}),e.once("aborted",()=>{this._beforeError(new Lw({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(Ee.default.object(t.cookieJar)&&o){let a=o.map(async l=>t.cookieJar.setCookie(l,i.toString()));t.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(t.followRedirect&&e.headers.location&&Hke.has(n)){if(e.resume(),this[Fi]&&(this[yP](),delete this[Fi],this[Hz]()),(n===303&&t.method!=="GET"&&t.method!=="HEAD"||!t.methodRewriting)&&(t.method="GET","body"in t&&delete t.body,"json"in t&&delete t.json,"form"in t&&delete t.form,this[hl]=void 0,delete t.headers["content-length"]),this.redirects.length>=t.maxRedirects){this._beforeError(new bP(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new gl.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in t.headers&&delete t.headers.host,"cookie"in t.headers&&delete t.headers.cookie,"authorization"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(t.username="",t.password="")):(c.username=t.username,c.password=t.password),this.redirects.push(u),t.url=c;for(let g of t.hooks.beforeRedirect)await g(t,s);this.emit("redirect",s,t),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(t.isStream&&t.throwHttpErrors&&!Nke.isResponseOk(s)){this._beforeError(new QP(s));return}e.on("readable",()=>{this[Nw]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Fw])if(!a.headersSent){for(let l in e.headers){let c=t.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(t){this._beforeError(t)}}_onRequest(e){let{options:t}=this,{timeout:i,url:n}=t;bke.default(e),this[yP]=Mz.default(e,i,n);let s=t.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof Mz.TimeoutError?new xP(l,this.timings,this):new hi(l.message,l,this),this._beforeError(l)}),this[Hz]=Pke.default(e,this,Gke),this[Fi]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[hl],a=this.redirects.length===0?this:e;Ee.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new vP(l,this))})):(this._unlockWrite(),Ee.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,t){return new Promise((i,n)=>{Object.assign(t,Dke.default(e)),delete t.url;let s,o=wP.get(t.cache)(t,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});t.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,t,i,n,s;let{options:o}=this,{headers:a}=o;for(let b in a)if(Ee.default.undefined(a[b]))delete a[b];else if(Ee.default.null_(a[b]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${b}\` header`);if(o.decompress&&Ee.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=Oke?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let b=await o.cookieJar.getCookieString(o.url.toString());Ee.default.nonEmptyString(b)&&(o.headers.cookie=b)}for(let b of o.hooks.beforeRequest){let v=await b(o);if(!Ee.default.undefined(v)){o.request=()=>v;break}}o.body&&this[hl]!==o.body&&(this[hl]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let b=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(b==null?void 0:b.groups){let{socketPath:v,path:x}=b.groups;Object.assign(o,{socketPath:v,path:x,host:""})}}let f=g.protocol==="https:",h;o.http2?h=vke.auto:h=f?Bke.request:Lz.request;let p=(e=o.request)!==null&&e!==void 0?e:h,m=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Fi]=p,delete o.request,delete o.timeout;let y=o;if(y.shared=(t=o.cacheOptions)===null||t===void 0?void 0:t.shared,y.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,y.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,y.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{y.family=Uz.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(b){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(y.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(y.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(y.ca=o.https.certificateAuthority),o.https.certificate&&(y.cert=o.https.certificate),o.https.key&&(y.key=o.https.key),o.https.passphrase&&(y.passphrase=o.https.passphrase),o.https.pfx&&(y.pfx=o.https.pfx));try{let b=await m(g,y);Ee.default.undefined(b)&&(b=h(g,y)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete y.rejectUnauthorized,o.https.checkServerIdentity&&delete y.checkServerIdentity,o.https.certificateAuthority&&delete y.ca,o.https.certificate&&delete y.cert,o.https.key&&delete y.key,o.https.passphrase&&delete y.passphrase,o.https.pfx&&delete y.pfx),Kke(b)?this._onRequest(b):this.writable?(this.once("finish",()=>{this._onResponse(b)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(b)}catch(b){throw b instanceof Tz.CacheError?new SP(b,this):new hi(b.message,b,this)}}async _error(e){try{for(let t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new hi(t.message,t,this)}this.destroy(e)}_beforeError(e){if(this[af])return;let{options:t}=this,i=this.retryCount+1;this[af]=!0,e instanceof hi||(e=new hi(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await Fke.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await t.retry.calculateDelay({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:Tke.default({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new hi(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new hi(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[qz]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Nw]=!0;let e=this[Rw];if(e&&!this[af]){e.readableLength&&(this[Nw]=!1);let t;for(;(t=e.read())!==null;){this[nf]+=t.length,this[Gz]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(t)}}}_write(e,t,i){let n=()=>{this._writeRequest(e,t,i)};this.requestInitialized?n():this[Nd].push(n)}_writeRequest(e,t,i){this[Fi].destroyed||(this._progressCallbacks.push(()=>{this[of]+=Buffer.byteLength(e,t);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Fi].write(e,t,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let t=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Fi in this)){e();return}if(this[Fi].destroyed){e();return}this[Fi].end(i=>{i||(this[sf]=this[of],this.emit("uploadProgress",this.uploadProgress),this[Fi].emit("upload-complete")),e(i)})};this.requestInitialized?t():this[Nd].push(t)}_destroy(e,t){var i;this[af]=!0,clearTimeout(this[qz]),Fi in this&&(this[yP](),((i=this[Rw])===null||i===void 0?void 0:i.complete)||this[Fi].destroy()),e!==null&&!Ee.default.undefined(e)&&!(e instanceof hi)&&(e=new hi(e.message,e,this)),t(e)}get _isAboutToError(){return this[af]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,t,i;return((t=(e=this[Fi])===null||e===void 0?void 0:e.destroyed)!==null&&t!==void 0?t:this.destroyed)&&!((i=this[Yz])===null||i===void 0?void 0:i.complete)}get socket(){var e,t;return(t=(e=this[Fi])===null||e===void 0?void 0:e.socket)!==null&&t!==void 0?t:void 0}get downloadProgress(){let e;return this[rf]?e=this[nf]/this[rf]:this[rf]===this[nf]?e=1:e=0,{percent:e,transferred:this[nf],total:this[rf]}}get uploadProgress(){let e;return this[sf]?e=this[of]/this[sf]:this[sf]===this[of]?e=1:e=0,{percent:e,transferred:this[of],total:this[sf]}}get timings(){var e;return(e=this[Fi])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[jz]}pipe(e,t){if(this[Gz])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof EP.ServerResponse&&this[Fw].add(e),super.pipe(e,t)}unpipe(e){return e instanceof EP.ServerResponse&&this[Fw].delete(e),super.unpipe(e),this}};qt.default=BP});var Td=w(Co=>{"use strict";var Yke=Co&&Co.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),qke=Co&&Co.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Yke(e,r,t)};Object.defineProperty(Co,"__esModule",{value:!0});Co.CancelError=Co.ParseError=void 0;var Jz=Ld(),Wz=class extends Jz.RequestError{constructor(e,t){let{options:i}=t.request;super(`${e.message} in "${i.url.toString()}"`,e,t.request);this.name="ParseError"}};Co.ParseError=Wz;var zz=class extends Jz.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Co.CancelError=zz;qke(Ld(),Co)});var Vz=w(PP=>{"use strict";Object.defineProperty(PP,"__esModule",{value:!0});var _z=Td(),Jke=(r,e,t,i)=>{let{rawBody:n}=r;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":t(n.toString());if(e==="buffer")return n;throw new _z.ParseError({message:`Unknown body type '${e}'`,name:"Error"},r)}catch(s){throw new _z.ParseError(s,r)}};PP.default=Jke});var DP=w(pl=>{"use strict";var Wke=pl&&pl.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),zke=pl&&pl.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Wke(e,r,t)};Object.defineProperty(pl,"__esModule",{value:!0});var _ke=require("events"),Vke=iA(),Xke=j4(),Tw=Td(),Xz=Vz(),Zz=Ld(),Zke=AP(),$ke=pP(),$z=dP(),ePe=["request","response","redirect","uploadProgress","downloadProgress"];function e5(r){let e,t,i=new _ke.EventEmitter,n=new Xke((o,a,l)=>{let c=u=>{let g=new Zz.default(void 0,r);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Tw.CancelError(g))),e=g,g.once("response",async p=>{var m;if(p.retryCount=u,p.request.aborted)return;let y;try{y=await $ke.default(g),p.rawBody=y}catch(T){return}if(g._isAboutToError)return;let b=((m=p.headers["content-encoding"])!==null&&m!==void 0?m:"").toLowerCase(),v=["gzip","deflate","br"].includes(b),{options:x}=g;if(v&&!x.decompress)p.body=y;else try{p.body=Xz.default(p,x.responseType,x.parseJson,x.encoding)}catch(T){if(p.body=y.toString(),$z.isResponseOk(p)){g._beforeError(T);return}}try{for(let[T,q]of x.hooks.afterResponse.entries())p=await q(p,async Y=>{let $=Zz.default.normalizeArguments(void 0,te(N({},Y),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),x);$.hooks.afterResponse=$.hooks.afterResponse.slice(0,T);for(let ne of $.hooks.beforeRetry)await ne($);let _=e5($);return l(()=>{_.catch(()=>{}),_.cancel()}),_})}catch(T){g._beforeError(new Tw.RequestError(T.message,T,g));return}if(!$z.isResponseOk(p)){g._beforeError(new Tw.HTTPError(p));return}t=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:m}=g;if(p instanceof Tw.HTTPError&&!m.throwHttpErrors){let{response:y}=p;o(g.options.resolveBodyOnly?y.body:y);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,m)=>{var y,b;if(h===((y=m.request)===null||y===void 0?void 0:y.options.body)&&Vke.default.nodeStream((b=m.request)===null||b===void 0?void 0:b.options.body)){f(m);return}c(p)}),Zke.default(g,i,ePe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=t.request;return Xz.default(t,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}pl.default=e5;zke(Td(),pl)});var t5=w(RP=>{"use strict";Object.defineProperty(RP,"__esModule",{value:!0});var tPe=Td();function rPe(r,...e){let t=(async()=>{if(r instanceof tPe.RequestError)try{for(let n of e)if(n)for(let s of n)r=await s(r)}catch(n){r=n}throw r})(),i=()=>t;return t.json=i,t.text=i,t.buffer=i,t.on=i,t}RP.default=rPe});var n5=w(FP=>{"use strict";Object.defineProperty(FP,"__esModule",{value:!0});var r5=iA();function i5(r){for(let e of Object.values(r))(r5.default.plainObject(e)||r5.default.array(e))&&i5(e);return Object.freeze(r)}FP.default=i5});var o5=w(s5=>{"use strict";Object.defineProperty(s5,"__esModule",{value:!0})});var NP=w(Ts=>{"use strict";var iPe=Ts&&Ts.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),nPe=Ts&&Ts.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&iPe(e,r,t)};Object.defineProperty(Ts,"__esModule",{value:!0});Ts.defaultHandler=void 0;var a5=iA(),Os=DP(),sPe=t5(),Ow=Ld(),oPe=n5(),aPe={RequestError:Os.RequestError,CacheError:Os.CacheError,ReadError:Os.ReadError,HTTPError:Os.HTTPError,MaxRedirectsError:Os.MaxRedirectsError,TimeoutError:Os.TimeoutError,ParseError:Os.ParseError,CancelError:Os.CancelError,UnsupportedProtocolError:Os.UnsupportedProtocolError,UploadError:Os.UploadError},APe=async r=>new Promise(e=>{setTimeout(e,r)}),{normalizeArguments:Mw}=Ow.default,A5=(...r)=>{let e;for(let t of r)e=Mw(void 0,t,e);return e},lPe=r=>r.isStream?new Ow.default(void 0,r):Os.default(r),cPe=r=>"defaults"in r&&"options"in r.defaults,uPe=["get","post","put","patch","head","delete"];Ts.defaultHandler=(r,e)=>e(r);var l5=(r,e)=>{if(r)for(let t of r)t(e)},c5=r=>{r._rawHandlers=r.handlers,r.handlers=r.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>r.handlers[l++](u,l===r.handlers.length?lPe:c);if(a5.default.plainObject(i)){let u=N(N({},i),n);Ow.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{l5(r.options.hooks.init,n),l5((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Mw(i,n,s!=null?s:r.options);if(g[Ow.kIsNormalizedAlready]=!0,u)throw new Os.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return sPe.default(u,r.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[r.options],s=[...r._rawHandlers],o;for(let a of i)cPe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==Ts.defaultHandler),s.length===0&&s.push(Ts.defaultHandler),c5({options:A5(...n),handlers:s,mutableDefaults:Boolean(o)})};let t=async function*(i,n){let s=Mw(i,n,r.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!a5.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of t(i,n))s.push(o);return s},e.paginate.each=t,e.stream=(i,n)=>e(i,te(N({},n),{isStream:!0}));for(let i of uPe)e[i]=(n,s)=>e(n,te(N({},s),{method:i})),e.stream[i]=(n,s)=>e(n,te(N({},s),{method:i,isStream:!0}));return Object.assign(e,aPe),Object.defineProperty(e,"defaults",{value:r.mutableDefaults?r:oPe.default(r),writable:r.mutableDefaults,configurable:r.mutableDefaults,enumerable:!0}),e.mergeOptions=A5,e};Ts.default=c5;nPe(o5(),Ts)});var Uw=w((sA,Kw)=>{"use strict";var gPe=sA&&sA.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),u5=sA&&sA.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&gPe(e,r,t)};Object.defineProperty(sA,"__esModule",{value:!0});var fPe=require("url"),g5=NP(),hPe={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:r})=>r},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:r=>r.request.options.responseType==="json"?r.body:JSON.parse(r.body),paginate:r=>{if(!Reflect.has(r.headers,"link"))return!1;let e=r.headers.link.split(","),t;for(let i of e){let n=i.split(";");if(n[1].includes("next")){t=n[0].trimStart().trim(),t=t.slice(1,-1);break}}return t?{url:new fPe.URL(t)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:r=>JSON.parse(r),stringifyJson:r=>JSON.stringify(r),cacheOptions:{}},handlers:[g5.defaultHandler],mutableDefaults:!1},LP=g5.default(hPe);sA.default=LP;Kw.exports=LP;Kw.exports.default=LP;Kw.exports.__esModule=!0;u5(NP(),sA);u5(DP(),sA)});var d5=w(Af=>{"use strict";var znt=require("net"),pPe=require("tls"),TP=require("http"),f5=require("https"),dPe=require("events"),_nt=require("assert"),CPe=require("util");Af.httpOverHttp=mPe;Af.httpsOverHttp=EPe;Af.httpOverHttps=IPe;Af.httpsOverHttps=yPe;function mPe(r){var e=new oA(r);return e.request=TP.request,e}function EPe(r){var e=new oA(r);return e.request=TP.request,e.createSocket=h5,e.defaultPort=443,e}function IPe(r){var e=new oA(r);return e.request=f5.request,e}function yPe(r){var e=new oA(r);return e.request=f5.request,e.createSocket=h5,e.defaultPort=443,e}function oA(r){var e=this;e.options=r||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||TP.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=p5(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};oA.prototype.createSocket=function(e,t){var i=this,n={};i.sockets.push(n);var s=OP({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),dl("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){dl("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){dl("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return dl("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,t(f)}function u(g){o.removeAllListeners(),dl(`tunneling socket could not be established, cause=%s -`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};oA.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(t!==-1){this.sockets.splice(t,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function h5(r,e){var t=this;oA.prototype.createSocket.call(t,r,function(i){var n=r.request.getHeader("host"),s=OP({},t.options,{socket:i,servername:n?n.replace(/:.*$/,""):r.host}),o=pPe.connect(0,s);t.sockets[t.sockets.indexOf(i)]=o,e(o)})}function p5(r,e,t){return typeof r=="string"?{host:r,port:e,localAddress:t}:r}function OP(r){for(var e=1,t=arguments.length;e{C5.exports=d5()});var x5=w((Gw,jP)=>{var v5=Object.assign({},require("fs")),GP=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(e){e=e||{};var t=typeof e!="undefined"?e:{},i,n;t.ready=new Promise(function(d,E){i=d,n=E});var s={},o;for(o in t)t.hasOwnProperty(o)&&(s[o]=t[o]);var a=[],l="./this.program",c=function(d,E){throw E},u=!1,g=!0,f="";function h(d){return t.locateFile?t.locateFile(d,f):f+d}var p,m,y,b;g&&(u?f=require("path").dirname(f)+"/":f=__dirname+"/",p=function(E,I){var D=xa(E);return D?I?D:D.toString():(y||(y=v5),b||(b=require("path")),E=b.normalize(E),y.readFileSync(E,I?null:"utf8"))},m=function(E){var I=p(E,!0);return I.buffer||(I=new Uint8Array(I)),Z(I.buffer),I},process.argv.length>1&&(l=process.argv[1].replace(/\\/g,"/")),a=process.argv.slice(2),c=function(d){process.exit(d)},t.inspect=function(){return"[Emscripten Module object]"});var v=t.print||console.log.bind(console),x=t.printErr||console.warn.bind(console);for(o in s)s.hasOwnProperty(o)&&(t[o]=s[o]);s=null,t.arguments&&(a=t.arguments),t.thisProgram&&(l=t.thisProgram),t.quit&&(c=t.quit);var T=16;function q(d,E){return E||(E=T),Math.ceil(d/E)*E}var Y=0,$=function(d){Y=d},_;t.wasmBinary&&(_=t.wasmBinary);var ne=t.noExitRuntime||!0;typeof WebAssembly!="object"&&vr("no native wasm support detected");function ee(d,E,I){switch(E=E||"i8",E.charAt(E.length-1)==="*"&&(E="i32"),E){case"i1":return pe[d>>0];case"i8":return pe[d>>0];case"i16":return Qe[d>>1];case"i32":return fe[d>>2];case"i64":return fe[d>>2];case"float":return Ht[d>>2];case"double":return Mt[d>>3];default:vr("invalid type for getValue: "+E)}return null}var A,oe=!1,ce;function Z(d,E){d||vr("Assertion failed: "+E)}function O(d){var E=t["_"+d];return Z(E,"Cannot call unknown function "+d+", make sure it is exported"),E}function L(d,E,I,D,M){var z={string:function(st){var yt=0;if(st!=null&&st!==0){var xe=(st.length<<2)+1;yt=B(xe),be(st,yt,xe)}return yt},array:function(st){var yt=B(st.length);return Ke(st,yt),yt}};function ie(st){return E==="string"?re(st):E==="boolean"?Boolean(st):st}var we=O(d),me=[],_e=0;if(D)for(var ot=0;ot=D);)++M;if(M-E>16&&d.subarray&&Be)return Be.decode(d.subarray(E,M));for(var z="";E>10,56320|_e&1023)}}return z}function re(d,E){return d?je(V,d,E):""}function se(d,E,I,D){if(!(D>0))return 0;for(var M=I,z=I+D-1,ie=0;ie=55296&&we<=57343){var me=d.charCodeAt(++ie);we=65536+((we&1023)<<10)|me&1023}if(we<=127){if(I>=z)break;E[I++]=we}else if(we<=2047){if(I+1>=z)break;E[I++]=192|we>>6,E[I++]=128|we&63}else if(we<=65535){if(I+2>=z)break;E[I++]=224|we>>12,E[I++]=128|we>>6&63,E[I++]=128|we&63}else{if(I+3>=z)break;E[I++]=240|we>>18,E[I++]=128|we>>12&63,E[I++]=128|we>>6&63,E[I++]=128|we&63}}return E[I]=0,I-M}function be(d,E,I){return se(d,V,E,I)}function he(d){for(var E=0,I=0;I=55296&&D<=57343&&(D=65536+((D&1023)<<10)|d.charCodeAt(++I)&1023),D<=127?++E:D<=2047?E+=2:D<=65535?E+=3:E+=4}return E}function Fe(d){var E=he(d)+1,I=Et(E);return I&&se(d,pe,I,E),I}function Ke(d,E){pe.set(d,E)}function ke(d,E){return d%E>0&&(d+=E-d%E),d}var ve,pe,V,Qe,le,fe,gt,Ht,Mt;function Ei(d){ve=d,t.HEAP8=pe=new Int8Array(d),t.HEAP16=Qe=new Int16Array(d),t.HEAP32=fe=new Int32Array(d),t.HEAPU8=V=new Uint8Array(d),t.HEAPU16=le=new Uint16Array(d),t.HEAPU32=gt=new Uint32Array(d),t.HEAPF32=Ht=new Float32Array(d),t.HEAPF64=Mt=new Float64Array(d)}var jt=t.INITIAL_MEMORY||16777216,Qr,Oi=[],Xs=[],Un=[],Hn=!1;function Sr(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)ba(t.preRun.shift());ko(Oi)}function jn(){Hn=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ps.init(),ko(Xs)}function fs(){if(t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;)Nu(t.postRun.shift());ko(Un)}function ba(d){Oi.unshift(d)}function DA(d){Xs.unshift(d)}function Nu(d){Un.unshift(d)}var hs=0,RA=null,Qa=null;function Lu(d){return d}function FA(d){hs++,t.monitorRunDependencies&&t.monitorRunDependencies(hs)}function NA(d){if(hs--,t.monitorRunDependencies&&t.monitorRunDependencies(hs),hs==0&&(RA!==null&&(clearInterval(RA),RA=null),Qa)){var E=Qa;Qa=null,E()}}t.preloadedImages={},t.preloadedAudios={};function vr(d){t.onAbort&&t.onAbort(d),d+="",x(d),oe=!0,ce=1,d="abort("+d+"). Build with -s ASSERTIONS=1 for more info.";var E=new WebAssembly.RuntimeError(d);throw n(E),E}var zl="data:application/octet-stream;base64,";function Tu(d){return d.startsWith(zl)}var xo="data:application/octet-stream;base64,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ACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYC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NgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIc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DQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABog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AS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyABKAJcQYUPNgIYIAEoAlRB0f4ANgIEDAQLDAILIAEoAgxBwABxRQRAIAEgASgCJCABLwESIAEoAixBASABKAIMdEEBa3FqQQJ0aigBADYBEAwBCwsgASgCDEEgcQRAIAEoAlRBv/4ANgIEDAILIAEoAlxB6Q42AhggASgCVEHR/gA2AgQMAQsgASgCUCABKAJMSQR/IAEoAkggASgCQEkFQQALQQFxDQELCyABIAEoAihBA3Y2AgggASABKAJQIAEoAghrNgJQIAEgASgCKCABKAIIQQN0azYCKCABIAEoAixBASABKAIodEEBa3E2AiwgASgCXCABKAJQNgIAIAEoAlwgASgCSDYCDCABKAJcAn8gASgCUCABKAJMSQRAIAEoAkwgASgCUGtBBWoMAQtBBSABKAJQIAEoAkxraws2AgQgASgCXAJ/IAEoAkggASgCQEkEQCABKAJAIAEoAkhrQYECagwBC0GBAiABKAJIIAEoAkBraws2AhAgASgCVCABKAIsNgI8IAEoAlQgASgCKDYCQCAAIAAoAlgoAgw2AkggACAAKAJYKAIQNgJAIAAgACgCWCgCADYCTCAAIAAoAlgoAgQ2AkQgACAAKAJQKAI8NgI8IAAgACgCUCgCQDYCOCAAKAJQKAIEQb/+AEYEQCAAKAJQQX82Asg3CwwNCyAAKAJQQQA2Asg3A0ACQCAAIAAoAlAoAlAgACgCPEEBIAAoAlAoAlh0QQFrcUECdGooAQA2ASAgAC0AISAAKAI4TQ0AIAAoAkRFDQ0gACAAKAJEQQFrNgJEIAAgACgCTCIBQQFqNgJMIAAgACgCPCABLQAAIAAoAjh0ajYCPCAAIAAoAjhBCGo2AjgMAQsLAkAgAC0AIEUNACAALQAgQfABcQ0AIAAgACgBIDYBGANAAkAgACAAKAJQKAJQIAAvARogACgCPEEBIAAtABkgAC0AGGp0QQFrcSAALQAZdmpBAnRqKAEANgEgIAAoAjggAC0AGSAALQAhak8NACAAKAJERQ0OIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAIAAoAjwgAC0AGXY2AjwgACAAKAI4IAAtABlrNgI4IAAoAlAiASAALQAZIAEoAsg3ajYCyDcLIAAgACgCPCAALQAhdjYCPCAAIAAoAjggAC0AIWs2AjggACgCUCIBIAAtACEgASgCyDdqNgLINyAAKAJQIAAvASI2AkQgAC0AIEUEQCAAKAJQQc3+ADYCBAwNCyAALQAgQSBxBEAgACgCUEF/NgLINyAAKAJQQb/+ADYCBAwNCyAALQAgQcAAcQRAIAAoAlhB6Q42AhggACgCUEHR/gA2AgQMDQsgACgCUCAALQAgQQ9xNgJMIAAoAlBByf4ANgIECyAAKAJQKAJMBEADQCAAKAI4IAAoAlAoAkxJBEAgACgCREUNDSAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACgCUCIBIAEoAkQgACgCPEEBIAAoAlAoAkx0QQFrcWo2AkQgACAAKAI8IAAoAlAoAkx2NgI8IAAgACgCOCAAKAJQKAJMazYCOCAAKAJQIgEgACgCUCgCTCABKALIN2o2Asg3CyAAKAJQIAAoAlAoAkQ2Asw3IAAoAlBByv4ANgIECwNAAkAgACAAKAJQKAJUIAAoAjxBASAAKAJQKAJcdEEBa3FBAnRqKAEANgEgIAAtACEgACgCOE0NACAAKAJERQ0LIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAALQAgQfABcUUEQCAAIAAoASA2ARgDQAJAIAAgACgCUCgCVCAALwEaIAAoAjxBASAALQAZIAAtABhqdEEBa3EgAC0AGXZqQQJ0aigBADYBICAAKAI4IAAtABkgAC0AIWpPDQAgACgCREUNDCAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACAAKAI8IAAtABl2NgI8IAAgACgCOCAALQAZazYCOCAAKAJQIgEgAC0AGSABKALIN2o2Asg3CyAAIAAoAjwgAC0AIXY2AjwgACAAKAI4IAAtACFrNgI4IAAoAlAiASAALQAhIAEoAsg3ajYCyDcgAC0AIEHAAHEEQCAAKAJYQYUPNgIYIAAoAlBB0f4ANgIEDAsLIAAoAlAgAC8BIjYCSCAAKAJQIAAtACBBD3E2AkwgACgCUEHL/gA2AgQLIAAoAlAoAkwEQANAIAAoAjggACgCUCgCTEkEQCAAKAJERQ0LIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAKAJQIgEgASgCSCAAKAI8QQEgACgCUCgCTHRBAWtxajYCSCAAIAAoAjwgACgCUCgCTHY2AjwgACAAKAI4IAAoAlAoAkxrNgI4IAAoAlAiASAAKAJQKAJMIAEoAsg3ajYCyDcLIAAoAlBBzP4ANgIECyAAKAJARQ0HIAAgACgCMCAAKAJAazYCLAJAIAAoAlAoAkggACgCLEsEQCAAIAAoAlAoAkggACgCLGs2AiwgACgCLCAAKAJQKAIwSwRAIAAoAlAoAsQ3BEAgACgCWEHdDDYCGCAAKAJQQdH+ADYCBAwMCwsCQCAAKAIsIAAoAlAoAjRLBEAgACAAKAIsIAAoAlAoAjRrNgIsIAAgACgCUCgCOCAAKAJQKAIsIAAoAixrajYCKAwBCyAAIAAoAlAoAjggACgCUCgCNCAAKAIsa2o2AigLIAAoAiwgACgCUCgCREsEQCAAIAAoAlAoAkQ2AiwLDAELIAAgACgCSCAAKAJQKAJIazYCKCAAIAAoAlAoAkQ2AiwLIAAoAiwgACgCQEsEQCAAIAAoAkA2AiwLIAAgACgCQCAAKAIsazYCQCAAKAJQIgEgASgCRCAAKAIsazYCRANAIAAgACgCKCIBQQFqNgIoIAEtAAAhASAAIAAoAkgiAkEBajYCSCACIAE6AAAgACAAKAIsQQFrIgE2AiwgAQ0ACyAAKAJQKAJERQRAIAAoAlBByP4ANgIECwwICyAAKAJARQ0GIAAoAlAoAkQhASAAIAAoAkgiAkEBajYCSCACIAE6AAAgACAAKAJAQQFrNgJAIAAoAlBByP4ANgIEDAcLIAAoAlAoAgwEQANAIAAoAjhBIEkEQCAAKAJERQ0IIAAgACgCREEBazYCRCAAIAAoAkwiAUEBajYCTCAAIAAoAjwgAS0AACAAKAI4dGo2AjwgACAAKAI4QQhqNgI4DAELCyAAIAAoAjAgACgCQGs2AjAgACgCWCIBIAAoAjAgASgCFGo2AhQgACgCUCIBIAAoAjAgASgCIGo2AiACQCAAKAJQKAIMQQRxRQ0AIAAoAjBFDQACfyAAKAJQKAIUBEAgACgCUCgCHCAAKAJIIAAoAjBrIAAoAjAQGgwBCyAAKAJQKAIcIAAoAkggACgCMGsgACgCMBA9CyEBIAAoAlAgATYCHCAAKAJYIAE2AjALIAAgACgCQDYCMAJAIAAoAlAoAgxBBHFFDQACfyAAKAJQKAIUBEAgACgCPAwBCyAAKAI8QQh2QYD+A3EgACgCPEEYdmogACgCPEGA/gNxQQh0aiAAKAI8Qf8BcUEYdGoLIAAoAlAoAhxGDQAgACgCWEHIDDYCGCAAKAJQQdH+ADYCBAwICyAAQQA2AjwgAEEANgI4CyAAKAJQQc/+ADYCBAsCQCAAKAJQKAIMRQ0AIAAoAlAoAhRFDQADQCAAKAI4QSBJBEAgACgCREUNByAAIAAoAkRBAWs2AkQgACAAKAJMIgFBAWo2AkwgACAAKAI8IAEtAAAgACgCOHRqNgI8IAAgACgCOEEIajYCOAwBCwsgACgCPCAAKAJQKAIgRwRAIAAoAlhBsQw2AhggACgCUEHR/gA2AgQMBwsgAEEANgI8IABBADYCOAsgACgCUEHQ/gA2AgQLIABBATYCEAwDCyAAQX02AhAMAgsgAEF8NgJcDAMLIABBfjYCXAwCCwsgACgCWCAAKAJINgIMIAAoAlggACgCQDYCECAAKAJYIAAoAkw2AgAgACgCWCAAKAJENgIEIAAoAlAgACgCPDYCPCAAKAJQIAAoAjg2AkACQAJAIAAoAlAoAiwNACAAKAIwIAAoAlgoAhBGDQEgACgCUCgCBEHR/gBPDQEgACgCUCgCBEHO/gBJDQAgACgCVEEERg0BCwJ/IAAoAlghAiAAKAJYKAIMIQMgACgCMCAAKAJYKAIQayEEIwBBIGsiASQAIAEgAjYCGCABIAM2AhQgASAENgIQIAEgASgCGCgCHDYCDAJAIAEoAgwoAjhFBEAgASgCGCgCKEEBIAEoAgwoAih0QQEgASgCGCgCIBEBACECIAEoAgwgAjYCOCABKAIMKAI4RQRAIAFBATYCHAwCCwsgASgCDCgCLEUEQCABKAIMQQEgASgCDCgCKHQ2AiwgASgCDEEANgI0IAEoAgxBADYCMAsCQCABKAIQIAEoAgwoAixPBEAgASgCDCgCOCABKAIUIAEoAgwoAixrIAEoAgwoAiwQGRogASgCDEEANgI0IAEoAgwgASgCDCgCLDYCMAwBCyABIAEoAgwoAiwgASgCDCgCNGs2AgggASgCCCABKAIQSwRAIAEgASgCEDYCCAsgASgCDCgCOCABKAIMKAI0aiABKAIUIAEoAhBrIAEoAggQGRogASABKAIQIAEoAghrNgIQAkAgASgCEARAIAEoAgwoAjggASgCFCABKAIQayABKAIQEBkaIAEoAgwgASgCEDYCNCABKAIMIAEoAgwoAiw2AjAMAQsgASgCDCICIAEoAgggAigCNGo2AjQgASgCDCgCNCABKAIMKAIsRgRAIAEoAgxBADYCNAsgASgCDCgCMCABKAIMKAIsSQRAIAEoAgwiAiABKAIIIAIoAjBqNgIwCwsLIAFBADYCHAsgASgCHCECIAFBIGokACACCwRAIAAoAlBB0v4ANgIEIABBfDYCXAwCCwsgACAAKAI0IAAoAlgoAgRrNgI0IAAgACgCMCAAKAJYKAIQazYCMCAAKAJYIgEgACgCNCABKAIIajYCCCAAKAJYIgEgACgCMCABKAIUajYCFCAAKAJQIgEgACgCMCABKAIgajYCIAJAIAAoAlAoAgxBBHFFDQAgACgCMEUNAAJ/IAAoAlAoAhQEQCAAKAJQKAIcIAAoAlgoAgwgACgCMGsgACgCMBAaDAELIAAoAlAoAhwgACgCWCgCDCAAKAIwayAAKAIwED0LIQEgACgCUCABNgIcIAAoAlggATYCMAsgACgCWCAAKAJQKAJAQcAAQQAgACgCUCgCCBtqQYABQQAgACgCUCgCBEG//gBGG2pBgAJBACAAKAJQKAIEQcf+AEcEfyAAKAJQKAIEQcL+AEYFQQELQQFxG2o2AiwCQAJAIAAoAjRFBEAgACgCMEUNAQsgACgCVEEERw0BCyAAKAIQDQAgAEF7NgIQCyAAIAAoAhA2AlwLIAAoAlwhASAAQeAAaiQAIAUgATYCCAsgBSgCECIAIAApAwAgBSgCDDUCIH03AwACQAJAAkACQAJAIAUoAghBBWoOBwIDAwMDAAEDCyAFQQA2AhwMAwsgBUEBNgIcDAILIAUoAgwoAhRFBEAgBUEDNgIcDAILCyAFKAIMKAIAQQ0gBSgCCBAUIAVBAjYCHAsgBSgCHCEAIAVBIGokACAACyQBAX8jAEEQayIBIAA2AgwgASABKAIMNgIIIAEoAghBAToADAuXAQEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjcDCCADIAMoAhg2AgQCQAJAIAMpAwhC/////w9YBEAgAygCBCgCFEUNAQsgAygCBCgCAEESQQAQFCADQQA6AB8MAQsgAygCBCADKQMIPgIUIAMoAgQgAygCFDYCECADQQE6AB8LIAMtAB9BAXEhACADQSBqJAAgAAukAgECfyMAQRBrIgEkACABIAA2AgggASABKAIINgIEAkAgASgCBC0ABEEBcQRAIAEgASgCBEEQahC4ATYCAAwBCyABKAIEQRBqIQIjAEEQayIAJAAgACACNgIIAkAgACgCCBBKBEAgAEF+NgIMDAELIAAgACgCCCgCHDYCBCAAKAIEKAI4BEAgACgCCCgCKCAAKAIEKAI4IAAoAggoAiQRBAALIAAoAggoAiggACgCCCgCHCAAKAIIKAIkEQQAIAAoAghBADYCHCAAQQA2AgwLIAAoAgwhAiAAQRBqJAAgASACNgIACwJAIAEoAgAEQCABKAIEKAIAQQ0gASgCABAUIAFBADoADwwBCyABQQE6AA8LIAEtAA9BAXEhACABQRBqJAAgAAuyGAEFfyMAQRBrIgQkACAEIAA2AgggBCAEKAIINgIEIAQoAgRBADYCFCAEKAIEQQA2AhAgBCgCBEEANgIgIAQoAgRBADYCHAJAIAQoAgQtAARBAXEEQCAEKAIEQRBqIQEgBCgCBCgCCCECIwBBMGsiACQAIAAgATYCKCAAIAI2AiQgAEEINgIgIABBcTYCHCAAQQk2AhggAEEANgIUIABBwBI2AhAgAEE4NgIMIABBATYCBAJAAkACQCAAKAIQRQ0AIAAoAhAsAABB+O4ALAAARw0AIAAoAgxBOEYNAQsgAEF6NgIsDAELIAAoAihFBEAgAEF+NgIsDAELIAAoAihBADYCGCAAKAIoKAIgRQRAIAAoAihBBTYCICAAKAIoQQA2AigLIAAoAigoAiRFBEAgACgCKEEGNgIkCyAAKAIkQX9GBEAgAEEGNgIkCwJAIAAoAhxBAEgEQCAAQQA2AgQgAEEAIAAoAhxrNgIcDAELIAAoAhxBD0oEQCAAQQI2AgQgACAAKAIcQRBrNgIcCwsCQAJAIAAoAhhBAUgNACAAKAIYQQlKDQAgACgCIEEIRw0AIAAoAhxBCEgNACAAKAIcQQ9KDQAgACgCJEEASA0AIAAoAiRBCUoNACAAKAIUQQBIDQAgACgCFEEESg0AIAAoAhxBCEcNASAAKAIEQQFGDQELIABBfjYCLAwBCyAAKAIcQQhGBEAgAEEJNgIcCyAAIAAoAigoAihBAUHELSAAKAIoKAIgEQEANgIIIAAoAghFBEAgAEF8NgIsDAELIAAoAiggACgCCDYCHCAAKAIIIAAoAig2AgAgACgCCEEqNgIEIAAoAgggACgCBDYCGCAAKAIIQQA2AhwgACgCCCAAKAIcNgIwIAAoAghBASAAKAIIKAIwdDYCLCAAKAIIIAAoAggoAixBAWs2AjQgACgCCCAAKAIYQQdqNgJQIAAoAghBASAAKAIIKAJQdDYCTCAAKAIIIAAoAggoAkxBAWs2AlQgACgCCCAAKAIIKAJQQQJqQQNuNgJYIAAoAigoAiggACgCCCgCLEECIAAoAigoAiARAQAhASAAKAIIIAE2AjggACgCKCgCKCAAKAIIKAIsQQIgACgCKCgCIBEBACEBIAAoAgggATYCQCAAKAIoKAIoIAAoAggoAkxBAiAAKAIoKAIgEQEAIQEgACgCCCABNgJEIAAoAghBADYCwC0gACgCCEEBIAAoAhhBBmp0NgKcLSAAIAAoAigoAiggACgCCCgCnC1BBCAAKAIoKAIgEQEANgIAIAAoAgggACgCADYCCCAAKAIIIAAoAggoApwtQQJ0NgIMAkACQCAAKAIIKAI4RQ0AIAAoAggoAkBFDQAgACgCCCgCREUNACAAKAIIKAIIDQELIAAoAghBmgU2AgQgACgCKEG42QAoAgA2AhggACgCKBC4ARogAEF8NgIsDAELIAAoAgggACgCACAAKAIIKAKcLUEBdkEBdGo2AqQtIAAoAgggACgCCCgCCCAAKAIIKAKcLUEDbGo2ApgtIAAoAgggACgCJDYChAEgACgCCCAAKAIUNgKIASAAKAIIIAAoAiA6ACQgACgCKCEBIwBBEGsiAyQAIAMgATYCDCADKAIMIQIjAEEQayIBJAAgASACNgIIAkAgASgCCBB4BEAgAUF+NgIMDAELIAEoAghBADYCFCABKAIIQQA2AgggASgCCEEANgIYIAEoAghBAjYCLCABIAEoAggoAhw2AgQgASgCBEEANgIUIAEoAgQgASgCBCgCCDYCECABKAIEKAIYQQBIBEAgASgCBEEAIAEoAgQoAhhrNgIYCyABKAIEIAEoAgQoAhhBAkYEf0E5BUEqQfEAIAEoAgQoAhgbCzYCBAJ/IAEoAgQoAhhBAkYEQEEAQQBBABAaDAELQQBBAEEAED0LIQIgASgCCCACNgIwIAEoAgRBADYCKCABKAIEIQUjAEEQayICJAAgAiAFNgIMIAIoAgwgAigCDEGUAWo2ApgWIAIoAgxB0N8ANgKgFiACKAIMIAIoAgxBiBNqNgKkFiACKAIMQeTfADYCrBYgAigCDCACKAIMQfwUajYCsBYgAigCDEH43wA2ArgWIAIoAgxBADsBuC0gAigCDEEANgK8LSACKAIMEL4BIAJBEGokACABQQA2AgwLIAEoAgwhAiABQRBqJAAgAyACNgIIIAMoAghFBEAgAygCDCgCHCECIwBBEGsiASQAIAEgAjYCDCABKAIMIAEoAgwoAixBAXQ2AjwgASgCDCgCRCABKAIMKAJMQQFrQQF0akEAOwEAIAEoAgwoAkRBACABKAIMKAJMQQFrQQF0EDMgASgCDCABKAIMKAKEAUEMbEGA7wBqLwECNgKAASABKAIMIAEoAgwoAoQBQQxsQYDvAGovAQA2AowBIAEoAgwgASgCDCgChAFBDGxBgO8Aai8BBDYCkAEgASgCDCABKAIMKAKEAUEMbEGA7wBqLwEGNgJ8IAEoAgxBADYCbCABKAIMQQA2AlwgASgCDEEANgJ0IAEoAgxBADYCtC0gASgCDEECNgJ4IAEoAgxBAjYCYCABKAIMQQA2AmggASgCDEEANgJIIAFBEGokAAsgAygCCCEBIANBEGokACAAIAE2AiwLIAAoAiwhASAAQTBqJAAgBCABNgIADAELIAQoAgRBEGohASMAQSBrIgAkACAAIAE2AhggAEFxNgIUIABBwBI2AhAgAEE4NgIMAkACQAJAIAAoAhBFDQAgACgCECwAAEHAEiwAAEcNACAAKAIMQThGDQELIABBejYCHAwBCyAAKAIYRQRAIABBfjYCHAwBCyAAKAIYQQA2AhggACgCGCgCIEUEQCAAKAIYQQU2AiAgACgCGEEANgIoCyAAKAIYKAIkRQRAIAAoAhhBBjYCJAsgACAAKAIYKAIoQQFB0DcgACgCGCgCIBEBADYCBCAAKAIERQRAIABBfDYCHAwBCyAAKAIYIAAoAgQ2AhwgACgCBCAAKAIYNgIAIAAoAgRBADYCOCAAKAIEQbT+ADYCBCAAKAIYIQIgACgCFCEDIwBBIGsiASQAIAEgAjYCGCABIAM2AhQCQCABKAIYEEoEQCABQX42AhwMAQsgASABKAIYKAIcNgIMAkAgASgCFEEASARAIAFBADYCECABQQAgASgCFGs2AhQMAQsgASABKAIUQQR1QQVqNgIQIAEoAhRBMEgEQCABIAEoAhRBD3E2AhQLCwJAIAEoAhRFDQAgASgCFEEITgRAIAEoAhRBD0wNAQsgAUF+NgIcDAELAkAgASgCDCgCOEUNACABKAIMKAIoIAEoAhRGDQAgASgCGCgCKCABKAIMKAI4IAEoAhgoAiQRBAAgASgCDEEANgI4CyABKAIMIAEoAhA2AgwgASgCDCABKAIUNgIoIAEoAhghAiMAQRBrIgMkACADIAI2AggCQCADKAIIEEoEQCADQX42AgwMAQsgAyADKAIIKAIcNgIEIAMoAgRBADYCLCADKAIEQQA2AjAgAygCBEEANgI0IAMoAgghBSMAQRBrIgIkACACIAU2AggCQCACKAIIEEoEQCACQX42AgwMAQsgAiACKAIIKAIcNgIEIAIoAgRBADYCICACKAIIQQA2AhQgAigCCEEANgIIIAIoAghBADYCGCACKAIEKAIMBEAgAigCCCACKAIEKAIMQQFxNgIwCyACKAIEQbT+ADYCBCACKAIEQQA2AgggAigCBEEANgIQIAIoAgRBgIACNgIYIAIoAgRBADYCJCACKAIEQQA2AjwgAigCBEEANgJAIAIoAgQgAigCBEG0CmoiBTYCcCACKAIEIAU2AlQgAigCBCAFNgJQIAIoAgRBATYCxDcgAigCBEF/NgLINyACQQA2AgwLIAIoAgwhBSACQRBqJAAgAyAFNgIMCyADKAIMIQIgA0EQaiQAIAEgAjYCHAsgASgCHCECIAFBIGokACAAIAI2AgggACgCCARAIAAoAhgoAiggACgCBCAAKAIYKAIkEQQAIAAoAhhBADYCHAsgACAAKAIINgIcCyAAKAIcIQEgAEEgaiQAIAQgATYCAAsCQCAEKAIABEAgBCgCBCgCAEENIAQoAgAQFCAEQQA6AA8MAQsgBEEBOgAPCyAELQAPQQFxIQAgBEEQaiQAIAALbwEBfyMAQRBrIgEgADYCCCABIAEoAgg2AgQCQCABKAIELQAEQQFxRQRAIAFBADYCDAwBCyABKAIEKAIIQQNIBEAgAUECNgIMDAELIAEoAgQoAghBB0oEQCABQQE2AgwMAQsgAUEANgIMCyABKAIMCywBAX8jAEEQayIBJAAgASAANgIMIAEgASgCDDYCCCABKAIIEBUgAUEQaiQACzwBAX8jAEEQayIDJAAgAyAAOwEOIAMgATYCCCADIAI2AgRBASADKAIIIAMoAgQQtAEhACADQRBqJAAgAAvBEAECfyMAQSBrIgIkACACIAA2AhggAiABNgIUAkADQAJAIAIoAhgoAnRBhgJJBEAgAigCGBBcAkAgAigCGCgCdEGGAk8NACACKAIUDQAgAkEANgIcDAQLIAIoAhgoAnRFDQELIAJBADYCECACKAIYKAJ0QQNPBEAgAigCGCACKAIYKAJUIAIoAhgoAjggAigCGCgCbEECamotAAAgAigCGCgCSCACKAIYKAJYdHNxNgJIIAIoAhgoAkAgAigCGCgCbCACKAIYKAI0cUEBdGogAigCGCgCRCACKAIYKAJIQQF0ai8BACIAOwEAIAIgAEH//wNxNgIQIAIoAhgoAkQgAigCGCgCSEEBdGogAigCGCgCbDsBAAsgAigCGCACKAIYKAJgNgJ4IAIoAhggAigCGCgCcDYCZCACKAIYQQI2AmACQCACKAIQRQ0AIAIoAhgoAnggAigCGCgCgAFPDQAgAigCGCgCLEGGAmsgAigCGCgCbCACKAIQa0kNACACKAIYIAIoAhAQtgEhACACKAIYIAA2AmACQCACKAIYKAJgQQVLDQAgAigCGCgCiAFBAUcEQCACKAIYKAJgQQNHDQEgAigCGCgCbCACKAIYKAJwa0GAIE0NAQsgAigCGEECNgJgCwsCQAJAIAIoAhgoAnhBA0kNACACKAIYKAJgIAIoAhgoAnhLDQAgAiACKAIYIgAoAmwgACgCdGpBA2s2AgggAiACKAIYKAJ4QQNrOgAHIAIgAigCGCIAKAJsIAAoAmRBf3NqOwEEIAIoAhgiACgCpC0gACgCoC1BAXRqIAIvAQQ7AQAgAi0AByEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACIAIvAQRBAWs7AQQgAigCGCACLQAHQdDdAGotAABBAnRqQZgJaiIAIAAvAQBBAWo7AQAgAigCGEGIE2oCfyACLwEEQYACSQRAIAIvAQQtANBZDAELIAIvAQRBB3ZBgAJqLQDQWQtBAnRqIgAgAC8BAEEBajsBACACIAIoAhgoAqAtIAIoAhgoApwtQQFrRjYCDCACKAIYIgAgACgCdCACKAIYKAJ4QQFrazYCdCACKAIYIgAgACgCeEECazYCeANAIAIoAhgiASgCbEEBaiEAIAEgADYCbCAAIAIoAghNBEAgAigCGCACKAIYKAJUIAIoAhgoAjggAigCGCgCbEECamotAAAgAigCGCgCSCACKAIYKAJYdHNxNgJIIAIoAhgoAkAgAigCGCgCbCACKAIYKAI0cUEBdGogAigCGCgCRCACKAIYKAJIQQF0ai8BACIAOwEAIAIgAEH//wNxNgIQIAIoAhgoAkQgAigCGCgCSEEBdGogAigCGCgCbDsBAAsgAigCGCIBKAJ4QQFrIQAgASAANgJ4IAANAAsgAigCGEEANgJoIAIoAhhBAjYCYCACKAIYIgAgACgCbEEBajYCbCACKAIMBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBABAoIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEBwgAigCGCgCACgCEEUEQCACQQA2AhwMBgsLDAELAkAgAigCGCgCaARAIAIgAigCGCIAKAI4IAAoAmxqQQFrLQAAOgADIAIoAhgiACgCpC0gACgCoC1BAXRqQQA7AQAgAi0AAyEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACKAIYIAItAANBAnRqIgAgAC8BlAFBAWo7AZQBIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAgwEQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EAECggAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHAsgAigCGCIAIAAoAmxBAWo2AmwgAigCGCIAIAAoAnRBAWs2AnQgAigCGCgCACgCEEUEQCACQQA2AhwMBgsMAQsgAigCGEEBNgJoIAIoAhgiACAAKAJsQQFqNgJsIAIoAhgiACAAKAJ0QQFrNgJ0CwsMAQsLIAIoAhgoAmgEQCACIAIoAhgiACgCOCAAKAJsakEBay0AADoAAiACKAIYIgAoAqQtIAAoAqAtQQF0akEAOwEAIAItAAIhASACKAIYIgAoApgtIQMgACAAKAKgLSIAQQFqNgKgLSAAIANqIAE6AAAgAigCGCACLQACQQJ0aiIAIAAvAZQBQQFqOwGUASACIAIoAhgoAqAtIAIoAhgoApwtQQFrRjYCDCACKAIYQQA2AmgLIAIoAhgCfyACKAIYKAJsQQJJBEAgAigCGCgCbAwBC0ECCzYCtC0gAigCFEEERgRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQEQKCACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAcIAIoAhgoAgAoAhBFBEAgAkECNgIcDAILIAJBAzYCHAwBCyACKAIYKAKgLQRAIAIoAhgCfyACKAIYKAJcQQBOBEAgAigCGCgCOCACKAIYKAJcagwBC0EACyACKAIYKAJsIAIoAhgoAlxrQQAQKCACKAIYIAIoAhgoAmw2AlwgAigCGCgCABAcIAIoAhgoAgAoAhBFBEAgAkEANgIcDAILCyACQQE2AhwLIAIoAhwhACACQSBqJAAgAAuVDQECfyMAQSBrIgIkACACIAA2AhggAiABNgIUAkADQAJAIAIoAhgoAnRBhgJJBEAgAigCGBBcAkAgAigCGCgCdEGGAk8NACACKAIUDQAgAkEANgIcDAQLIAIoAhgoAnRFDQELIAJBADYCECACKAIYKAJ0QQNPBEAgAigCGCACKAIYKAJUIAIoAhgoAjggAigCGCgCbEECamotAAAgAigCGCgCSCACKAIYKAJYdHNxNgJIIAIoAhgoAkAgAigCGCgCbCACKAIYKAI0cUEBdGogAigCGCgCRCACKAIYKAJIQQF0ai8BACIAOwEAIAIgAEH//wNxNgIQIAIoAhgoAkQgAigCGCgCSEEBdGogAigCGCgCbDsBAAsCQCACKAIQRQ0AIAIoAhgoAixBhgJrIAIoAhgoAmwgAigCEGtJDQAgAigCGCACKAIQELYBIQAgAigCGCAANgJgCwJAIAIoAhgoAmBBA08EQCACIAIoAhgoAmBBA2s6AAsgAiACKAIYIgAoAmwgACgCcGs7AQggAigCGCIAKAKkLSAAKAKgLUEBdGogAi8BCDsBACACLQALIQEgAigCGCIAKAKYLSEDIAAgACgCoC0iAEEBajYCoC0gACADaiABOgAAIAIgAi8BCEEBazsBCCACKAIYIAItAAtB0N0Aai0AAEECdGpBmAlqIgAgAC8BAEEBajsBACACKAIYQYgTagJ/IAIvAQhBgAJJBEAgAi8BCC0A0FkMAQsgAi8BCEEHdkGAAmotANBZC0ECdGoiACAALwEAQQFqOwEAIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAhgiACAAKAJ0IAIoAhgoAmBrNgJ0AkACQCACKAIYKAJgIAIoAhgoAoABSw0AIAIoAhgoAnRBA0kNACACKAIYIgAgACgCYEEBazYCYANAIAIoAhgiACAAKAJsQQFqNgJsIAIoAhggAigCGCgCVCACKAIYKAI4IAIoAhgoAmxBAmpqLQAAIAIoAhgoAkggAigCGCgCWHRzcTYCSCACKAIYKAJAIAIoAhgoAmwgAigCGCgCNHFBAXRqIAIoAhgoAkQgAigCGCgCSEEBdGovAQAiADsBACACIABB//8DcTYCECACKAIYKAJEIAIoAhgoAkhBAXRqIAIoAhgoAmw7AQAgAigCGCIBKAJgQQFrIQAgASAANgJgIAANAAsgAigCGCIAIAAoAmxBAWo2AmwMAQsgAigCGCIAIAIoAhgoAmAgACgCbGo2AmwgAigCGEEANgJgIAIoAhggAigCGCgCOCACKAIYKAJsai0AADYCSCACKAIYIAIoAhgoAlQgAigCGCgCOCACKAIYKAJsQQFqai0AACACKAIYKAJIIAIoAhgoAlh0c3E2AkgLDAELIAIgAigCGCIAKAI4IAAoAmxqLQAAOgAHIAIoAhgiACgCpC0gACgCoC1BAXRqQQA7AQAgAi0AByEBIAIoAhgiACgCmC0hAyAAIAAoAqAtIgBBAWo2AqAtIAAgA2ogAToAACACKAIYIAItAAdBAnRqIgAgAC8BlAFBAWo7AZQBIAIgAigCGCgCoC0gAigCGCgCnC1BAWtGNgIMIAIoAhgiACAAKAJ0QQFrNgJ0IAIoAhgiACAAKAJsQQFqNgJsCyACKAIMBEAgAigCGAJ/IAIoAhgoAlxBAE4EQCACKAIYKAI4IAIoAhgoAlxqDAELQQALIAIoAhgoAmwgAigCGCgCXGtBABAoIAIoAhggAigCGCgCbDYCXCACKAIYKAIAEBwgAigCGCgCACgCEEUEQCACQQA2AhwMBAsLDAELCyACKAIYAn8gAigCGCgCbEECSQRAIAIoAhgoAmwMAQtBAgs2ArQtIAIoAhRBBEYEQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EBECggAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHCACKAIYKAIAKAIQRQRAIAJBAjYCHAwCCyACQQM2AhwMAQsgAigCGCgCoC0EQCACKAIYAn8gAigCGCgCXEEATgRAIAIoAhgoAjggAigCGCgCXGoMAQtBAAsgAigCGCgCbCACKAIYKAJca0EAECggAigCGCACKAIYKAJsNgJcIAIoAhgoAgAQHCACKAIYKAIAKAIQRQRAIAJBADYCHAwCCwsgAkEBNgIcCyACKAIcIQAgAkEgaiQAIAALBwAgAC8BMAspAQF/IwBBEGsiAiQAIAIgADYCDCACIAE2AgggAigCCBAVIAJBEGokAAs6AQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgggAygCBGwQGCEAIANBEGokACAAC84FAQF/IwBB0ABrIgUkACAFIAA2AkQgBSABNgJAIAUgAjYCPCAFIAM3AzAgBSAENgIsIAUgBSgCQDYCKAJAAkACQAJAAkACQAJAAkACQCAFKAIsDg8AAQIDBQYHBwcHBwcHBwQHCwJ/IAUoAkQhASAFKAIoIQIjAEHgAGsiACQAIAAgATYCWCAAIAI2AlQgACAAKAJYIABByABqQgwQKyIDNwMIAkAgA0IAUwRAIAAoAlQgACgCWBAXIABBfzYCXAwBCyAAKQMIQgxSBEAgACgCVEERQQAQFCAAQX82AlwMAQsgACgCVCAAQcgAaiAAQcgAakIMQQAQfCAAKAJYIABBEGoQOUEASARAIABBADYCXAwBCyAAKAI4IABBBmogAEEEahCNAQJAIAAtAFMgACgCPEEYdkYNACAALQBTIAAvAQZBCHZGDQAgACgCVEEbQQAQFCAAQX82AlwMAQsgAEEANgJcCyAAKAJcIQEgAEHgAGokACABQQBICwRAIAVCfzcDSAwICyAFQgA3A0gMBwsgBSAFKAJEIAUoAjwgBSkDMBArIgM3AyAgA0IAUwRAIAUoAiggBSgCRBAXIAVCfzcDSAwHCyAFKAJAIAUoAjwgBSgCPCAFKQMgQQAQfCAFIAUpAyA3A0gMBgsgBUIANwNIDAULIAUgBSgCPDYCHCAFKAIcQQA7ATIgBSgCHCIAIAApAwBCgAGENwMAIAUoAhwpAwBCCINCAFIEQCAFKAIcIgAgACkDIEIMfTcDIAsgBUIANwNIDAQLIAVBfzYCFCAFQQU2AhAgBUEENgIMIAVBAzYCCCAFQQI2AgQgBUEBNgIAIAVBACAFEDQ3A0gMAwsgBSAFKAIoIAUoAjwgBSkDMBBDNwNIDAILIAUoAigQvwEgBUIANwNIDAELIAUoAihBEkEAEBQgBUJ/NwNICyAFKQNIIQMgBUHQAGokACADC+4CAQF/IwBBIGsiBSQAIAUgADYCGCAFIAE2AhQgBSACOwESIAUgAzYCDCAFIAQ2AggCQAJAAkAgBSgCCEUNACAFKAIURQ0AIAUvARJBAUYNAQsgBSgCGEEIakESQQAQFCAFQQA2AhwMAQsgBSgCDEEBcQRAIAUoAhhBCGpBGEEAEBQgBUEANgIcDAELIAVBGBAYIgA2AgQgAEUEQCAFKAIYQQhqQQ5BABAUIAVBADYCHAwBCyMAQRBrIgAgBSgCBDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAFKAIEQfis0ZEBNgIMIAUoAgRBic+VmgI2AhAgBSgCBEGQ8dmiAzYCFCAFKAIEQQAgBSgCCCAFKAIIEC6tQQEQfCAFIAUoAhggBSgCFEEDIAUoAgQQYSIANgIAIABFBEAgBSgCBBC/ASAFQQA2AhwMAQsgBSAFKAIANgIcCyAFKAIcIQAgBUEgaiQAIAALBwAgACgCIAu9GAECfyMAQfAAayIEJAAgBCAANgJkIAQgATYCYCAEIAI3A1ggBCADNgJUIAQgBCgCZDYCUAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBCgCVA4UBgcCDAQFCg8AAwkRCxAOCBIBEg0SC0EAQgBBACAEKAJQEEwhACAEKAJQIAA2AhQgAEUEQCAEQn83A2gMEwsgBCgCUCgCFEIANwM4IAQoAlAoAhRCADcDQCAEQgA3A2gMEgsgBCgCUCgCECEBIAQpA1ghAiAEKAJQIQMjAEFAaiIAJAAgACABNgI4IAAgAjcDMCAAIAM2AiwCQCAAKQMwUARAIABBAEIAQQEgACgCLBBMNgI8DAELIAApAzAgACgCOCkDMFYEQCAAKAIsQRJBABAUIABBADYCPAwBCyAAKAI4KAIoBEAgACgCLEEdQQAQFCAAQQA2AjwMAQsgACAAKAI4IAApAzAQwAE3AyAgACAAKQMwIAAoAjgoAgQgACkDIKdBA3RqKQMAfTcDGCAAKQMYUARAIAAgACkDIEIBfTcDICAAIAAoAjgoAgAgACkDIKdBBHRqKQMINwMYCyAAIAAoAjgoAgAgACkDIKdBBHRqKQMIIAApAxh9NwMQIAApAxAgACkDMFYEQCAAKAIsQRxBABAUIABBADYCPAwBCyAAIAAoAjgoAgAgACkDIEIBfEEAIAAoAiwQTCIBNgIMIAFFBEAgAEEANgI8DAELIAAoAgwoAgAgACgCDCkDCEIBfadBBHRqIAApAxg3AwggACgCDCgCBCAAKAIMKQMIp0EDdGogACkDMDcDACAAKAIMIAApAzA3AzAgACgCDAJ+IAAoAjgpAxggACgCDCkDCEIBfVQEQCAAKAI4KQMYDAELIAAoAgwpAwhCAX0LNwMYIAAoAjggACgCDDYCKCAAKAIMIAAoAjg2AiggACgCOCAAKAIMKQMINwMgIAAoAgwgACkDIEIBfDcDICAAIAAoAgw2AjwLIAAoAjwhASAAQUBrJAAgASEAIAQoAlAgADYCFCAARQRAIARCfzcDaAwSCyAEKAJQKAIUIAQpA1g3AzggBCgCUCgCFCAEKAJQKAIUKQMINwNAIARCADcDaAwRCyAEQgA3A2gMEAsgBCgCUCgCEBAyIAQoAlAgBCgCUCgCFDYCECAEKAJQQQA2AhQgBEIANwNoDA8LIAQgBCgCUCAEKAJgIAQpA1gQQzcDaAwOCyAEKAJQKAIQEDIgBCgCUCgCFBAyIAQoAlAQFSAEQgA3A2gMDQsgBCgCUCgCEEIANwM4IAQoAlAoAhBCADcDQCAEQgA3A2gMDAsgBCkDWEL///////////8AVgRAIAQoAlBBEkEAEBQgBEJ/NwNoDAwLIAQoAlAoAhAhASAEKAJgIQMgBCkDWCECIwBBQGoiACQAIAAgATYCNCAAIAM2AjAgACACNwMoIAACfiAAKQMoIAAoAjQpAzAgACgCNCkDOH1UBEAgACkDKAwBCyAAKAI0KQMwIAAoAjQpAzh9CzcDKAJAIAApAyhQBEAgAEIANwM4DAELIAApAyhC////////////AFYEQCAAQn83AzgMAQsgACAAKAI0KQNANwMYIAAgACgCNCkDOCAAKAI0KAIEIAApAxinQQN0aikDAH03AxAgAEIANwMgA0AgACkDICAAKQMoVARAIAACfiAAKQMoIAApAyB9IAAoAjQoAgAgACkDGKdBBHRqKQMIIAApAxB9VARAIAApAyggACkDIH0MAQsgACgCNCgCACAAKQMYp0EEdGopAwggACkDEH0LNwMIIAAoAjAgACkDIKdqIAAoAjQoAgAgACkDGKdBBHRqKAIAIAApAxCnaiAAKQMIpxAZGiAAKQMIIAAoAjQoAgAgACkDGKdBBHRqKQMIIAApAxB9UQRAIAAgACkDGEIBfDcDGAsgACAAKQMIIAApAyB8NwMgIABCADcDEAwBCwsgACgCNCIBIAApAyAgASkDOHw3AzggACgCNCAAKQMYNwNAIAAgACkDIDcDOAsgACkDOCECIABBQGskACAEIAI3A2gMCwsgBEEAQgBBACAEKAJQEEw2AkwgBCgCTEUEQCAEQn83A2gMCwsgBCgCUCgCEBAyIAQoAlAgBCgCTDYCECAEQgA3A2gMCgsgBCgCUCgCFBAyIAQoAlBBADYCFCAEQgA3A2gMCQsgBCAEKAJQKAIQIAQoAmAgBCkDWCAEKAJQEMEBrDcDaAwICyAEIAQoAlAoAhQgBCgCYCAEKQNYIAQoAlAQwQGsNwNoDAcLIAQpA1hCOFQEQCAEKAJQQRJBABAUIARCfzcDaAwHCyAEIAQoAmA2AkggBCgCSBA7IAQoAkggBCgCUCgCDDYCKCAEKAJIIAQoAlAoAhApAzA3AxggBCgCSCAEKAJIKQMYNwMgIAQoAkhBADsBMCAEKAJIQQA7ATIgBCgCSELcATcDACAEQjg3A2gMBgsgBCgCUCAEKAJgKAIANgIMIARCADcDaAwFCyAEQX82AkAgBEETNgI8IARBCzYCOCAEQQ02AjQgBEEMNgIwIARBCjYCLCAEQQ82AiggBEEJNgIkIARBETYCICAEQQg2AhwgBEEHNgIYIARBBjYCFCAEQQU2AhAgBEEENgIMIARBAzYCCCAEQQI2AgQgBEEBNgIAIARBACAEEDQ3A2gMBAsgBCgCUCgCECkDOEL///////////8AVgRAIAQoAlBBHkE9EBQgBEJ/NwNoDAQLIAQgBCgCUCgCECkDODcDaAwDCyAEKAJQKAIUKQM4Qv///////////wBWBEAgBCgCUEEeQT0QFCAEQn83A2gMAwsgBCAEKAJQKAIUKQM4NwNoDAILIAQpA1hC////////////AFYEQCAEKAJQQRJBABAUIARCfzcDaAwCCyAEKAJQKAIUIQEgBCgCYCEDIAQpA1ghAiAEKAJQIQUjAEHgAGsiACQAIAAgATYCVCAAIAM2AlAgACACNwNIIAAgBTYCRAJAIAApA0ggACgCVCkDOCAAKQNIfEL//wN8VgRAIAAoAkRBEkEAEBQgAEJ/NwNYDAELIAAgACgCVCgCBCAAKAJUKQMIp0EDdGopAwA3AyAgACkDICAAKAJUKQM4IAApA0h8VARAIAAgACgCVCkDCCAAKQNIIAApAyAgACgCVCkDOH19Qv//A3xCEIh8NwMYIAApAxggACgCVCkDEFYEQCAAIAAoAlQpAxA3AxAgACkDEFAEQCAAQhA3AxALA0AgACkDECAAKQMYVARAIAAgACkDEEIBhjcDEAwBCwsgACgCVCAAKQMQIAAoAkQQwgFBAXFFBEAgACgCREEOQQAQFCAAQn83A1gMAwsLA0AgACgCVCkDCCAAKQMYVARAQYCABBAYIQEgACgCVCgCACAAKAJUKQMIp0EEdGogATYCACABBEAgACgCVCgCACAAKAJUKQMIp0EEdGpCgIAENwMIIAAoAlQiASABKQMIQgF8NwMIIAAgACkDIEKAgAR8NwMgIAAoAlQoAgQgACgCVCkDCKdBA3RqIAApAyA3AwAMAgUgACgCREEOQQAQFCAAQn83A1gMBAsACwsLIAAgACgCVCkDQDcDMCAAIAAoAlQpAzggACgCVCgCBCAAKQMwp0EDdGopAwB9NwMoIABCADcDOANAIAApAzggACkDSFQEQCAAAn4gACkDSCAAKQM4fSAAKAJUKAIAIAApAzCnQQR0aikDCCAAKQMofVQEQCAAKQNIIAApAzh9DAELIAAoAlQoAgAgACkDMKdBBHRqKQMIIAApAyh9CzcDCCAAKAJUKAIAIAApAzCnQQR0aigCACAAKQMop2ogACgCUCAAKQM4p2ogACkDCKcQGRogACkDCCAAKAJUKAIAIAApAzCnQQR0aikDCCAAKQMofVEEQCAAIAApAzBCAXw3AzALIAAgACkDCCAAKQM4fDcDOCAAQgA3AygMAQsLIAAoAlQiASAAKQM4IAEpAzh8NwM4IAAoAlQgACkDMDcDQCAAKAJUKQM4IAAoAlQpAzBWBEAgACgCVCAAKAJUKQM4NwMwCyAAIAApAzg3A1gLIAApA1ghAiAAQeAAaiQAIAQgAjcDaAwBCyAEKAJQQRxBABAUIARCfzcDaAsgBCkDaCECIARB8ABqJAAgAgsHACAAKAIACxgAQaibAUIANwIAQbCbAUEANgIAQaibAQuGAQIEfwF+IwBBEGsiASQAAkAgACkDMFAEQAwBCwNAAkAgACAFQQAgAUEPaiABQQhqEIoBIgRBf0YNACABLQAPQQNHDQAgAiABKAIIQYCAgIB/cUGAgICAekZqIQILQX8hAyAEQX9GDQEgAiEDIAVCAXwiBSAAKQMwVA0ACwsgAUEQaiQAIAMLC4GNASMAQYAIC4EMaW5zdWZmaWNpZW50IG1lbW9yeQBuZWVkIGRpY3Rpb25hcnkALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABaaXAgYXJjaGl2ZSBpbmNvbnNpc3RlbnQASW52YWxpZCBhcmd1bWVudABpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQAaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0AHVua25vd24gaGVhZGVyIGZsYWdzIHNldABpbnZhbGlkIGRpc3RhbmNlcyBzZXQAaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdABGaWxlIGFscmVhZHkgZXhpc3RzAHRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzAGludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMAJXMlcyVzAGJ1ZmZlciBlcnJvcgBObyBlcnJvcgBzdHJlYW0gZXJyb3IAVGVsbCBlcnJvcgBJbnRlcm5hbCBlcnJvcgBTZWVrIGVycm9yAFdyaXRlIGVycm9yAGZpbGUgZXJyb3IAUmVhZCBlcnJvcgBabGliIGVycm9yAGRhdGEgZXJyb3IAQ1JDIGVycm9yAGluY29tcGF0aWJsZSB2ZXJzaW9uAG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";Tu(xo)||(xo=h(xo));function Ou(d){try{if(d==xo&&_)return new Uint8Array(_);var E=xa(d);if(E)return E;if(m)return m(d);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(I){vr(I)}}function Sh(d,E){var I,D,M;try{M=Ou(d),D=new WebAssembly.Module(M),I=new WebAssembly.Instance(D,E)}catch(ie){var z=ie.toString();throw x("failed to compile wasm module: "+z),(z.includes("imported Memory")||z.includes("memory import"))&&x("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),ie}return[I,D]}function vh(){var d={a:ka};function E(M,z){var ie=M.exports;t.asm=ie,A=t.asm.u,Ei(A.buffer),Qr=t.asm.pa,DA(t.asm.v),NA("wasm-instantiate")}if(FA("wasm-instantiate"),t.instantiateWasm)try{var I=t.instantiateWasm(d,E);return I}catch(M){return x("Module.instantiateWasm callback failed with error: "+M),!1}var D=Sh(xo,d);return E(D[0]),t.asm}var Dr,Ae;function ko(d){for(;d.length>0;){var E=d.shift();if(typeof E=="function"){E(t);continue}var I=E.func;typeof I=="number"?E.arg===void 0?Qr.get(I)():Qr.get(I)(E.arg):I(E.arg===void 0?null:E.arg)}}function Gn(d,E){var I=new Date(fe[d>>2]*1e3);fe[E>>2]=I.getUTCSeconds(),fe[E+4>>2]=I.getUTCMinutes(),fe[E+8>>2]=I.getUTCHours(),fe[E+12>>2]=I.getUTCDate(),fe[E+16>>2]=I.getUTCMonth(),fe[E+20>>2]=I.getUTCFullYear()-1900,fe[E+24>>2]=I.getUTCDay(),fe[E+36>>2]=0,fe[E+32>>2]=0;var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[E+28>>2]=M,Gn.GMTString||(Gn.GMTString=Fe("GMT")),fe[E+40>>2]=Gn.GMTString,E}function Mu(d,E){return Gn(d,E)}var St={splitPath:function(d){var E=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return E.exec(d).slice(1)},normalizeArray:function(d,E){for(var I=0,D=d.length-1;D>=0;D--){var M=d[D];M==="."?d.splice(D,1):M===".."?(d.splice(D,1),I++):I&&(d.splice(D,1),I--)}if(E)for(;I;I--)d.unshift("..");return d},normalize:function(d){var E=d.charAt(0)==="/",I=d.substr(-1)==="/";return d=St.normalizeArray(d.split("/").filter(function(D){return!!D}),!E).join("/"),!d&&!E&&(d="."),d&&I&&(d+="/"),(E?"/":"")+d},dirname:function(d){var E=St.splitPath(d),I=E[0],D=E[1];return!I&&!D?".":(D&&(D=D.substr(0,D.length-1)),I+D)},basename:function(d){if(d==="/")return"/";d=St.normalize(d),d=d.replace(/\/$/,"");var E=d.lastIndexOf("/");return E===-1?d:d.substr(E+1)},extname:function(d){return St.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return St.normalize(d.join("/"))},join2:function(d,E){return St.normalize(d+"/"+E)}};function _l(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var d=new Uint8Array(1);return function(){return crypto.getRandomValues(d),d[0]}}else if(g)try{var E=require("crypto");return function(){return E.randomBytes(1)[0]}}catch(I){}return function(){vr("randomDevice")}}var Yn={resolve:function(){for(var d="",E=!1,I=arguments.length-1;I>=-1&&!E;I--){var D=I>=0?arguments[I]:S.cwd();if(typeof D!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!D)return"";d=D+"/"+d,E=D.charAt(0)==="/"}return d=St.normalizeArray(d.split("/").filter(function(M){return!!M}),!E).join("/"),(E?"/":"")+d||"."},relative:function(d,E){d=Yn.resolve(d).substr(1),E=Yn.resolve(E).substr(1);function I(_e){for(var ot=0;ot<_e.length&&_e[ot]==="";ot++);for(var Bt=_e.length-1;Bt>=0&&_e[Bt]==="";Bt--);return ot>Bt?[]:_e.slice(ot,Bt-ot+1)}for(var D=I(d.split("/")),M=I(E.split("/")),z=Math.min(D.length,M.length),ie=z,we=0;we0?E=D.slice(0,M).toString("utf-8"):E=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(E=window.prompt("Input: "),E!==null&&(E+=` -`)):typeof readline=="function"&&(E=readline(),E!==null&&(E+=` -`));if(!E)return null;d.input=TA(E,!0)}return d.input.shift()},put_char:function(d,E){E===null||E===10?(v(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(v(je(d.output,0)),d.output=[])}},default_tty1_ops:{put_char:function(d,E){E===null||E===10?(x(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(x(je(d.output,0)),d.output=[])}}};function ds(d){for(var E=q(d,65536),I=Et(E);d=E)){var D=1024*1024;E=Math.max(E,I*(I>>0),I!=0&&(E=Math.max(E,256));var M=d.contents;d.contents=new Uint8Array(E),d.usedBytes>0&&d.contents.set(M.subarray(0,d.usedBytes),0)}},resizeFileStorage:function(d,E){if(d.usedBytes!=E)if(E==0)d.contents=null,d.usedBytes=0;else{var I=d.contents;d.contents=new Uint8Array(E),I&&d.contents.set(I.subarray(0,Math.min(E,d.usedBytes))),d.usedBytes=E}},node_ops:{getattr:function(d){var E={};return E.dev=S.isChrdev(d.mode)?d.id:1,E.ino=d.id,E.mode=d.mode,E.nlink=1,E.uid=0,E.gid=0,E.rdev=d.rdev,S.isDir(d.mode)?E.size=4096:S.isFile(d.mode)?E.size=d.usedBytes:S.isLink(d.mode)?E.size=d.link.length:E.size=0,E.atime=new Date(d.timestamp),E.mtime=new Date(d.timestamp),E.ctime=new Date(d.timestamp),E.blksize=4096,E.blocks=Math.ceil(E.size/E.blksize),E},setattr:function(d,E){E.mode!==void 0&&(d.mode=E.mode),E.timestamp!==void 0&&(d.timestamp=E.timestamp),E.size!==void 0&&pt.resizeFileStorage(d,E.size)},lookup:function(d,E){throw S.genericErrors[44]},mknod:function(d,E,I,D){return pt.createNode(d,E,I,D)},rename:function(d,E,I){if(S.isDir(d.mode)){var D;try{D=S.lookupNode(E,I)}catch(z){}if(D)for(var M in D.contents)throw new S.ErrnoError(55)}delete d.parent.contents[d.name],d.parent.timestamp=Date.now(),d.name=I,E.contents[I]=d,E.timestamp=d.parent.timestamp,d.parent=E},unlink:function(d,E){delete d.contents[E],d.timestamp=Date.now()},rmdir:function(d,E){var I=S.lookupNode(d,E);for(var D in I.contents)throw new S.ErrnoError(55);delete d.contents[E],d.timestamp=Date.now()},readdir:function(d){var E=[".",".."];for(var I in d.contents)!d.contents.hasOwnProperty(I)||E.push(I);return E},symlink:function(d,E,I){var D=pt.createNode(d,E,511|40960,0);return D.link=I,D},readlink:function(d){if(!S.isLink(d.mode))throw new S.ErrnoError(28);return d.link}},stream_ops:{read:function(d,E,I,D,M){var z=d.node.contents;if(M>=d.node.usedBytes)return 0;var ie=Math.min(d.node.usedBytes-M,D);if(ie>8&&z.subarray)E.set(z.subarray(M,M+ie),I);else for(var we=0;we0||D+I>2)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}return E.mode},realPath:function(d){for(var E=[];d.parent!==d;)E.push(d.name),d=d.parent;return E.push(d.mount.opts.root),E.reverse(),St.join.apply(null,E)},flagsForNode:function(d){d&=~2097152,d&=~2048,d&=~32768,d&=~524288;var E=0;for(var I in lt.flagsForNodeMap)d&I&&(E|=lt.flagsForNodeMap[I],d^=I);if(d)throw new S.ErrnoError(28);return E},node_ops:{getattr:function(d){var E=lt.realPath(d),I;try{I=Oe.lstatSync(E)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}return lt.isWindows&&!I.blksize&&(I.blksize=4096),lt.isWindows&&!I.blocks&&(I.blocks=(I.size+I.blksize-1)/I.blksize|0),{dev:I.dev,ino:I.ino,mode:I.mode,nlink:I.nlink,uid:I.uid,gid:I.gid,rdev:I.rdev,size:I.size,atime:I.atime,mtime:I.mtime,ctime:I.ctime,blksize:I.blksize,blocks:I.blocks}},setattr:function(d,E){var I=lt.realPath(d);try{if(E.mode!==void 0&&(Oe.chmodSync(I,E.mode),d.mode=E.mode),E.timestamp!==void 0){var D=new Date(E.timestamp);Oe.utimesSync(I,D,D)}E.size!==void 0&&Oe.truncateSync(I,E.size)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},lookup:function(d,E){var I=St.join2(lt.realPath(d),E),D=lt.getMode(I);return lt.createNode(d,E,D)},mknod:function(d,E,I,D){var M=lt.createNode(d,E,I,D),z=lt.realPath(M);try{S.isDir(M.mode)?Oe.mkdirSync(z,M.mode):Oe.writeFileSync(z,"",{mode:M.mode})}catch(ie){throw ie.code?new S.ErrnoError(lt.convertNodeCode(ie)):ie}return M},rename:function(d,E,I){var D=lt.realPath(d),M=St.join2(lt.realPath(E),I);try{Oe.renameSync(D,M)}catch(z){throw z.code?new S.ErrnoError(lt.convertNodeCode(z)):z}d.name=I},unlink:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.unlinkSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},rmdir:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.rmdirSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},readdir:function(d){var E=lt.realPath(d);try{return Oe.readdirSync(E)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},symlink:function(d,E,I){var D=St.join2(lt.realPath(d),E);try{Oe.symlinkSync(I,D)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},readlink:function(d){var E=lt.realPath(d);try{return E=Oe.readlinkSync(E),E=Hu.relative(Hu.resolve(d.mount.opts.root),E),E}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}}},stream_ops:{open:function(d){var E=lt.realPath(d.node);try{S.isFile(d.node.mode)&&(d.nfd=Oe.openSync(E,lt.flagsForNode(d.flags)))}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},close:function(d){try{S.isFile(d.node.mode)&&d.nfd&&Oe.closeSync(d.nfd)}catch(E){throw E.code?new S.ErrnoError(lt.convertNodeCode(E)):E}},read:function(d,E,I,D,M){if(D===0)return 0;try{return Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},write:function(d,E,I,D,M){try{return Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},llseek:function(d,E,I){var D=E;if(I===1)D+=d.position;else if(I===2&&S.isFile(d.node.mode))try{var M=Oe.fstatSync(d.nfd);D+=M.size}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}if(D<0)throw new S.ErrnoError(28);return D},mmap:function(d,E,I,D,M,z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var ie=ds(I);return lt.stream_ops.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(M&2)return 0;var z=lt.stream_ops.write(d,E,0,D,I,!1);return 0}}},mn={lookupPath:function(d){return{path:d,node:{mode:lt.getMode(d)}}},createStandardStreams:function(){S.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var d=1;d<3;d++)S.streams[d]={fd:d,nfd:d,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(d,E){S.isDir(d)?Oe.mkdirSync(d,E):Oe.writeFileSync(d,"",{mode:E})},mkdir:function(){Oe.mkdirSync.apply(void 0,arguments)},symlink:function(){Oe.symlinkSync.apply(void 0,arguments)},rename:function(){Oe.renameSync.apply(void 0,arguments)},rmdir:function(){Oe.rmdirSync.apply(void 0,arguments)},readdir:function(){Oe.readdirSync.apply(void 0,arguments)},unlink:function(){Oe.unlinkSync.apply(void 0,arguments)},readlink:function(){return Oe.readlinkSync.apply(void 0,arguments)},stat:function(){return Oe.statSync.apply(void 0,arguments)},lstat:function(){return Oe.lstatSync.apply(void 0,arguments)},chmod:function(){Oe.chmodSync.apply(void 0,arguments)},fchmod:function(){Oe.fchmodSync.apply(void 0,arguments)},chown:function(){Oe.chownSync.apply(void 0,arguments)},fchown:function(){Oe.fchownSync.apply(void 0,arguments)},truncate:function(){Oe.truncateSync.apply(void 0,arguments)},ftruncate:function(d,E){if(E<0)throw new S.ErrnoError(28);Oe.ftruncateSync.apply(void 0,arguments)},utime:function(){Oe.utimesSync.apply(void 0,arguments)},open:function(d,E,I,D){typeof E=="string"&&(E=$s.modeStringToFlags(E));var M=Oe.openSync(d,lt.flagsForNode(E),I),z=D!=null?D:S.nextfd(M),ie={fd:z,nfd:M,position:0,path:d,flags:E,seekable:!0};return S.streams[z]=ie,ie},close:function(d){d.stream_ops||Oe.closeSync(d.nfd),S.closeStream(d.fd)},llseek:function(d,E,I){if(d.stream_ops)return $s.llseek(d,E,I);var D=E;if(I===1)D+=d.position;else if(I===2)D+=Oe.fstatSync(d.nfd).size;else if(I!==0)throw new S.ErrnoError(Po.EINVAL);if(D<0)throw new S.ErrnoError(Po.EINVAL);return d.position=D,D},read:function(d,E,I,D,M){if(d.stream_ops)return $s.read(d,E,I,D,M);var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},write:function(d,E,I,D,M){if(d.stream_ops)return $s.write(d,E,I,D,M);d.flags&+"1024"&&S.llseek(d,0,+"2");var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},allocate:function(){throw new S.ErrnoError(Po.EOPNOTSUPP)},mmap:function(d,E,I,D,M,z){if(d.stream_ops)return $s.mmap(d,E,I,D,M,z);if(E!==0)throw new S.ErrnoError(28);var ie=ds(I);return S.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){return d.stream_ops?$s.msync(d,E,I,D,M):(M&2||S.write(d,E,0,D,I),0)},munmap:function(){return 0},ioctl:function(){throw new S.ErrnoError(Po.ENOTTY)}},S={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(d,E){if(d=Yn.resolve(S.cwd(),d),E=E||{},!d)return{path:"",node:null};var I={follow_mount:!0,recurse_count:0};for(var D in I)E[D]===void 0&&(E[D]=I[D]);if(E.recurse_count>8)throw new S.ErrnoError(32);for(var M=St.normalizeArray(d.split("/").filter(function(ut){return!!ut}),!1),z=S.root,ie="/",we=0;we40)throw new S.ErrnoError(32)}}return{path:ie,node:z}},getPath:function(d){for(var E;;){if(S.isRoot(d)){var I=d.mount.mountpoint;return E?I[I.length-1]!=="/"?I+"/"+E:I+E:I}E=E?d.name+"/"+E:d.name,d=d.parent}},hashName:function(d,E){for(var I=0,D=0;D>>0)%S.nameTable.length},hashAddNode:function(d){var E=S.hashName(d.parent.id,d.name);d.name_next=S.nameTable[E],S.nameTable[E]=d},hashRemoveNode:function(d){var E=S.hashName(d.parent.id,d.name);if(S.nameTable[E]===d)S.nameTable[E]=d.name_next;else for(var I=S.nameTable[E];I;){if(I.name_next===d){I.name_next=d.name_next;break}I=I.name_next}},lookupNode:function(d,E){var I=S.mayLookup(d);if(I)throw new S.ErrnoError(I,d);for(var D=S.hashName(d.id,E),M=S.nameTable[D];M;M=M.name_next){var z=M.name;if(M.parent.id===d.id&&z===E)return M}return S.lookup(d,E)},createNode:function(d,E,I,D){var M=new S.FSNode(d,E,I,D);return S.hashAddNode(M),M},destroyNode:function(d){S.hashRemoveNode(d)},isRoot:function(d){return d===d.parent},isMountpoint:function(d){return!!d.mounted},isFile:function(d){return(d&61440)==32768},isDir:function(d){return(d&61440)==16384},isLink:function(d){return(d&61440)==40960},isChrdev:function(d){return(d&61440)==8192},isBlkdev:function(d){return(d&61440)==24576},isFIFO:function(d){return(d&61440)==4096},isSocket:function(d){return(d&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(d){var E=S.flagModes[d];if(typeof E=="undefined")throw new Error("Unknown file open mode: "+d);return E},flagsToPermissionString:function(d){var E=["r","w","rw"][d&3];return d&512&&(E+="w"),E},nodePermissions:function(d,E){return S.ignorePermissions?0:E.includes("r")&&!(d.mode&292)||E.includes("w")&&!(d.mode&146)||E.includes("x")&&!(d.mode&73)?2:0},mayLookup:function(d){var E=S.nodePermissions(d,"x");return E||(d.node_ops.lookup?0:2)},mayCreate:function(d,E){try{var I=S.lookupNode(d,E);return 20}catch(D){}return S.nodePermissions(d,"wx")},mayDelete:function(d,E,I){var D;try{D=S.lookupNode(d,E)}catch(z){return z.errno}var M=S.nodePermissions(d,"wx");if(M)return M;if(I){if(!S.isDir(D.mode))return 54;if(S.isRoot(D)||S.getPath(D)===S.cwd())return 10}else if(S.isDir(D.mode))return 31;return 0},mayOpen:function(d,E){return d?S.isLink(d.mode)?32:S.isDir(d.mode)&&(S.flagsToPermissionString(E)!=="r"||E&512)?31:S.nodePermissions(d,S.flagsToPermissionString(E)):44},MAX_OPEN_FDS:4096,nextfd:function(d,E){d=d||0,E=E||S.MAX_OPEN_FDS;for(var I=d;I<=E;I++)if(!S.streams[I])return I;throw new S.ErrnoError(33)},getStream:function(d){return S.streams[d]},createStream:function(d,E,I){S.FSStream||(S.FSStream=function(){},S.FSStream.prototype={object:{get:function(){return this.node},set:function(ie){this.node=ie}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var D=new S.FSStream;for(var M in d)D[M]=d[M];d=D;var z=S.nextfd(E,I);return d.fd=z,S.streams[z]=d,d},closeStream:function(d){S.streams[d]=null},chrdev_stream_ops:{open:function(d){var E=S.getDevice(d.node.rdev);d.stream_ops=E.stream_ops,d.stream_ops.open&&d.stream_ops.open(d)},llseek:function(){throw new S.ErrnoError(70)}},major:function(d){return d>>8},minor:function(d){return d&255},makedev:function(d,E){return d<<8|E},registerDevice:function(d,E){S.devices[d]={stream_ops:E}},getDevice:function(d){return S.devices[d]},getMounts:function(d){for(var E=[],I=[d];I.length;){var D=I.pop();E.push(D),I.push.apply(I,D.mounts)}return E},syncfs:function(d,E){typeof d=="function"&&(E=d,d=!1),S.syncFSRequests++,S.syncFSRequests>1&&x("warning: "+S.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var I=S.getMounts(S.root.mount),D=0;function M(ie){return S.syncFSRequests--,E(ie)}function z(ie){if(ie)return z.errored?void 0:(z.errored=!0,M(ie));++D>=I.length&&M(null)}I.forEach(function(ie){if(!ie.type.syncfs)return z(null);ie.type.syncfs(ie,d,z)})},mount:function(d,E,I){var D=I==="/",M=!I,z;if(D&&S.root)throw new S.ErrnoError(10);if(!D&&!M){var ie=S.lookupPath(I,{follow_mount:!1});if(I=ie.path,z=ie.node,S.isMountpoint(z))throw new S.ErrnoError(10);if(!S.isDir(z.mode))throw new S.ErrnoError(54)}var we={type:d,opts:E,mountpoint:I,mounts:[]},me=d.mount(we);return me.mount=we,we.root=me,D?S.root=me:z&&(z.mounted=we,z.mount&&z.mount.mounts.push(we)),me},unmount:function(d){var E=S.lookupPath(d,{follow_mount:!1});if(!S.isMountpoint(E.node))throw new S.ErrnoError(28);var I=E.node,D=I.mounted,M=S.getMounts(D);Object.keys(S.nameTable).forEach(function(ie){for(var we=S.nameTable[ie];we;){var me=we.name_next;M.includes(we.mount)&&S.destroyNode(we),we=me}}),I.mounted=null;var z=I.mount.mounts.indexOf(D);I.mount.mounts.splice(z,1)},lookup:function(d,E){return d.node_ops.lookup(d,E)},mknod:function(d,E,I){var D=S.lookupPath(d,{parent:!0}),M=D.node,z=St.basename(d);if(!z||z==="."||z==="..")throw new S.ErrnoError(28);var ie=S.mayCreate(M,z);if(ie)throw new S.ErrnoError(ie);if(!M.node_ops.mknod)throw new S.ErrnoError(63);return M.node_ops.mknod(M,z,E,I)},create:function(d,E){return E=E!==void 0?E:438,E&=4095,E|=32768,S.mknod(d,E,0)},mkdir:function(d,E){return E=E!==void 0?E:511,E&=511|512,E|=16384,S.mknod(d,E,0)},mkdirTree:function(d,E){for(var I=d.split("/"),D="",M=0;Mthis.length-1||ut<0)){var st=ut%this.chunkSize,yt=ut/this.chunkSize|0;return this.getter(yt)[st]}},z.prototype.setDataGetter=function(ut){this.getter=ut},z.prototype.cacheLength=function(){var ut=new XMLHttpRequest;if(ut.open("HEAD",I,!1),ut.send(null),!(ut.status>=200&&ut.status<300||ut.status===304))throw new Error("Couldn't load "+I+". Status: "+ut.status);var st=Number(ut.getResponseHeader("Content-length")),yt,xe=(yt=ut.getResponseHeader("Accept-Ranges"))&&yt==="bytes",Wn=(yt=ut.getResponseHeader("Content-Encoding"))&&yt==="gzip",Mi=1024*1024;xe||(Mi=st);var HA=function(Cs,Pa){if(Cs>Pa)throw new Error("invalid range ("+Cs+", "+Pa+") or no bytes requested!");if(Pa>st-1)throw new Error("only "+st+" bytes available! programmer error!");var qr=new XMLHttpRequest;if(qr.open("GET",I,!1),st!==Mi&&qr.setRequestHeader("Range","bytes="+Cs+"-"+Pa),typeof Uint8Array!="undefined"&&(qr.responseType="arraybuffer"),qr.overrideMimeType&&qr.overrideMimeType("text/plain; charset=x-user-defined"),qr.send(null),!(qr.status>=200&&qr.status<300||qr.status===304))throw new Error("Couldn't load "+I+". Status: "+qr.status);return qr.response!==void 0?new Uint8Array(qr.response||[]):TA(qr.responseText||"",!0)},Yr=this;Yr.setDataGetter(function(Cs){var Pa=Cs*Mi,qr=(Cs+1)*Mi-1;if(qr=Math.min(qr,st-1),typeof Yr.chunks[Cs]=="undefined"&&(Yr.chunks[Cs]=HA(Pa,qr)),typeof Yr.chunks[Cs]=="undefined")throw new Error("doXHR failed!");return Yr.chunks[Cs]}),(Wn||!st)&&(Mi=st=1,st=this.getter(0).length,Mi=st,v("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=st,this._chunkSize=Mi,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!u)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var ie=new z;Object.defineProperties(ie,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var we={isDevice:!1,contents:ie}}else var we={isDevice:!1,url:I};var me=S.createFile(d,E,we,D,M);we.contents?me.contents=we.contents:we.url&&(me.contents=null,me.url=we.url),Object.defineProperties(me,{usedBytes:{get:function(){return this.contents.length}}});var _e={},ot=Object.keys(me.stream_ops);return ot.forEach(function(Bt){var ut=me.stream_ops[Bt];_e[Bt]=function(){return S.forceLoadFile(me),ut.apply(null,arguments)}}),_e.read=function(ut,st,yt,xe,Wn){S.forceLoadFile(me);var Mi=ut.node.contents;if(Wn>=Mi.length)return 0;var HA=Math.min(Mi.length-Wn,xe);if(Mi.slice)for(var Yr=0;Yr>2]=D.dev,fe[I+4>>2]=0,fe[I+8>>2]=D.ino,fe[I+12>>2]=D.mode,fe[I+16>>2]=D.nlink,fe[I+20>>2]=D.uid,fe[I+24>>2]=D.gid,fe[I+28>>2]=D.rdev,fe[I+32>>2]=0,Ae=[D.size>>>0,(Dr=D.size,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+40>>2]=Ae[0],fe[I+44>>2]=Ae[1],fe[I+48>>2]=4096,fe[I+52>>2]=D.blocks,fe[I+56>>2]=D.atime.getTime()/1e3|0,fe[I+60>>2]=0,fe[I+64>>2]=D.mtime.getTime()/1e3|0,fe[I+68>>2]=0,fe[I+72>>2]=D.ctime.getTime()/1e3|0,fe[I+76>>2]=0,Ae=[D.ino>>>0,(Dr=D.ino,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+80>>2]=Ae[0],fe[I+84>>2]=Ae[1],0},doMsync:function(d,E,I,D,M){var z=V.slice(d,d+I);S.msync(E,z,M,I,D)},doMkdir:function(d,E){return d=St.normalize(d),d[d.length-1]==="/"&&(d=d.substr(0,d.length-1)),S.mkdir(d,E,0),0},doMknod:function(d,E,I){switch(E&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return S.mknod(d,E,I),0},doReadlink:function(d,E,I){if(I<=0)return-28;var D=S.readlink(d),M=Math.min(I,he(D)),z=pe[E+M];return be(D,E,I+1),pe[E+M]=z,M},doAccess:function(d,E){if(E&~7)return-28;var I,D=S.lookupPath(d,{follow:!0});if(I=D.node,!I)return-44;var M="";return E&4&&(M+="r"),E&2&&(M+="w"),E&1&&(M+="x"),M&&S.nodePermissions(I,M)?-2:0},doDup:function(d,E,I){var D=S.getStream(I);return D&&S.close(D),S.open(d,E,0,I,I).fd},doReadv:function(d,E,I,D){for(var M=0,z=0;z>2],we=fe[E+(z*8+4)>>2],me=S.read(d,pe,ie,we,D);if(me<0)return-1;if(M+=me,me>2],we=fe[E+(z*8+4)>>2],me=S.write(d,pe,ie,we,D);if(me<0)return-1;M+=me}return M},varargs:void 0,get:function(){Tt.varargs+=4;var d=fe[Tt.varargs-4>>2];return d},getStr:function(d){var E=re(d);return E},getStreamFromFD:function(d){var E=S.getStream(d);if(!E)throw new S.ErrnoError(8);return E},get64:function(d,E){return d}};function Ku(d,E){try{return d=Tt.getStr(d),S.chmod(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function Vl(d){return fe[Rt()>>2]=d,d}function xh(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 0:{var M=Tt.get();if(M<0)return-28;var z;return z=S.open(D.path,D.flags,0,M),z.fd}case 1:case 2:return 0;case 3:return D.flags;case 4:{var M=Tt.get();return D.flags|=M,0}case 12:{var M=Tt.get(),ie=0;return Qe[M+ie>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Vl(28),-1;default:return-28}}catch(we){return(typeof S=="undefined"||!(we instanceof S.ErrnoError))&&vr(we),-we.errno}}function kh(d,E){try{var I=Tt.getStreamFromFD(d);return Tt.doStat(S.stat,I.path,E)}catch(D){return(typeof S=="undefined"||!(D instanceof S.ErrnoError))&&vr(D),-D.errno}}function Ph(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 21509:case 21505:return D.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return D.tty?0:-59;case 21519:{if(!D.tty)return-59;var M=Tt.get();return fe[M>>2]=0,0}case 21520:return D.tty?-28:-59;case 21531:{var M=Tt.get();return S.ioctl(D,E,M)}case 21523:return D.tty?0:-59;case 21524:return D.tty?0:-59;default:vr("bad ioctl syscall "+E)}}catch(z){return(typeof S=="undefined"||!(z instanceof S.ErrnoError))&&vr(z),-z.errno}}function Dh(d,E,I){Tt.varargs=I;try{var D=Tt.getStr(d),M=I?Tt.get():0,z=S.open(D,E,M);return z.fd}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),-ie.errno}}function Rh(d,E){try{return d=Tt.getStr(d),E=Tt.getStr(E),S.rename(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function j(d){try{return d=Tt.getStr(d),S.rmdir(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function wt(d,E){try{return d=Tt.getStr(d),Tt.doStat(S.stat,d,E)}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function LA(d){try{return d=Tt.getStr(d),S.unlink(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function $i(d,E,I){V.copyWithin(d,E,E+I)}function Xl(d){try{return A.grow(d-ve.byteLength+65535>>>16),Ei(A.buffer),1}catch(E){}}function $e(d){var E=V.length;d=d>>>0;var I=2147483648;if(d>I)return!1;for(var D=1;D<=4;D*=2){var M=E*(1+.2/D);M=Math.min(M,d+100663296);var z=Math.min(I,ke(Math.max(d,M),65536)),ie=Xl(z);if(ie)return!0}return!1}function Sa(d){try{var E=Tt.getStreamFromFD(d);return S.close(E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),I.errno}}function Uu(d,E){try{var I=Tt.getStreamFromFD(d),D=I.tty?2:S.isDir(I.mode)?3:S.isLink(I.mode)?7:4;return pe[E>>0]=D,0}catch(M){return(typeof S=="undefined"||!(M instanceof S.ErrnoError))&&vr(M),M.errno}}function yE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doReadv(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function Fh(d,E,I,D,M){try{var z=Tt.getStreamFromFD(d),ie=4294967296,we=I*ie+(E>>>0),me=9007199254740992;return we<=-me||we>=me?-61:(S.llseek(z,we,D),Ae=[z.position>>>0,(Dr=z.position,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[M>>2]=Ae[0],fe[M+4>>2]=Ae[1],z.getdents&&we===0&&D===0&&(z.getdents=null),0)}catch(_e){return(typeof S=="undefined"||!(_e instanceof S.ErrnoError))&&vr(_e),_e.errno}}function wE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doWritev(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function gr(d){$(d)}function qn(d){var E=Date.now()/1e3|0;return d&&(fe[d>>2]=E),E}function Zl(){if(Zl.called)return;Zl.called=!0;var d=new Date().getFullYear(),E=new Date(d,0,1),I=new Date(d,6,1),D=E.getTimezoneOffset(),M=I.getTimezoneOffset(),z=Math.max(D,M);fe[zb()>>2]=z*60,fe[Wb()>>2]=Number(D!=M);function ie(Bt){var ut=Bt.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ut?ut[1]:"GMT"}var we=ie(E),me=ie(I),_e=Fe(we),ot=Fe(me);M>2]=_e,fe[Wu()+4>>2]=ot):(fe[Wu()>>2]=ot,fe[Wu()+4>>2]=_e)}function Nh(d){Zl();var E=Date.UTC(fe[d+20>>2]+1900,fe[d+16>>2],fe[d+12>>2],fe[d+8>>2],fe[d+4>>2],fe[d>>2],0),I=new Date(E);fe[d+24>>2]=I.getUTCDay();var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[d+28>>2]=M,I.getTime()/1e3|0}var Zs=function(d,E,I,D){d||(d=this),this.parent=d,this.mount=d.mount,this.mounted=null,this.id=S.nextInode++,this.name=E,this.mode=I,this.node_ops={},this.stream_ops={},this.rdev=D},va=292|73,En=146;if(Object.defineProperties(Zs.prototype,{read:{get:function(){return(this.mode&va)===va},set:function(d){d?this.mode|=va:this.mode&=~va}},write:{get:function(){return(this.mode&En)===En},set:function(d){d?this.mode|=En:this.mode&=~En}},isFolder:{get:function(){return S.isDir(this.mode)}},isDevice:{get:function(){return S.isChrdev(this.mode)}}}),S.FSNode=Zs,S.staticInit(),g){var Oe=v5,Hu=require("path");lt.staticInit()}if(g){var $l=function(d){return function(){try{return d.apply(this,arguments)}catch(E){throw E.code?new S.ErrnoError(Po[E.code]):E}}},$s=Object.assign({},S);for(var ec in mn)S[ec]=$l(mn[ec])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");function TA(d,E,I){var D=I>0?I:he(d)+1,M=new Array(D),z=se(d,M,0,M.length);return E&&(M.length=z),M}var ju=typeof atob=="function"?atob:function(d){var E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",I="",D,M,z,ie,we,me,_e,ot=0;d=d.replace(/[^A-Za-z0-9\+\/\=]/g,"");do ie=E.indexOf(d.charAt(ot++)),we=E.indexOf(d.charAt(ot++)),me=E.indexOf(d.charAt(ot++)),_e=E.indexOf(d.charAt(ot++)),D=ie<<2|we>>4,M=(we&15)<<4|me>>2,z=(me&3)<<6|_e,I=I+String.fromCharCode(D),me!==64&&(I=I+String.fromCharCode(M)),_e!==64&&(I=I+String.fromCharCode(z));while(ot0||(Sr(),hs>0))return;function E(){Ue||(Ue=!0,t.calledRun=!0,!oe&&(jn(),i(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),fs()))}t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),E()},1)):E()}if(t.run=UA,t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return UA(),e}}();typeof Gw=="object"&&typeof jP=="object"?jP.exports=GP:typeof define=="function"&&define.amd?define([],function(){return GP}):typeof Gw=="object"&&(Gw.createModule=GP)});var $5=w((Nst,Z5)=>{function KPe(r,e){for(var t=-1,i=r==null?0:r.length,n=Array(i);++t{var UPe=Array.isArray;e9.exports=UPe});var o9=w((Tst,t9)=>{var r9=Jc(),HPe=$5(),jPe=Ks(),GPe=Id(),YPe=1/0,i9=r9?r9.prototype:void 0,n9=i9?i9.toString:void 0;function s9(r){if(typeof r=="string")return r;if(jPe(r))return HPe(r,s9)+"";if(GPe(r))return n9?n9.call(r):"";var e=r+"";return e=="0"&&1/r==-YPe?"-0":e}t9.exports=s9});var lf=w((Ost,a9)=>{var qPe=o9();function JPe(r){return r==null?"":qPe(r)}a9.exports=JPe});var VP=w((Mst,A9)=>{function WPe(r,e,t){var i=-1,n=r.length;e<0&&(e=-e>n?0:n+e),t=t>n?n:t,t<0&&(t+=n),n=e>t?0:t-e>>>0,e>>>=0;for(var s=Array(n);++i{var zPe=VP();function _Pe(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:zPe(r,e,t)}l9.exports=_Pe});var XP=w((Ust,u9)=>{var VPe="\\ud800-\\udfff",XPe="\\u0300-\\u036f",ZPe="\\ufe20-\\ufe2f",$Pe="\\u20d0-\\u20ff",eDe=XPe+ZPe+$Pe,tDe="\\ufe0e\\ufe0f",rDe="\\u200d",iDe=RegExp("["+rDe+VPe+eDe+tDe+"]");function nDe(r){return iDe.test(r)}u9.exports=nDe});var f9=w((Hst,g9)=>{function sDe(r){return r.split("")}g9.exports=sDe});var y9=w((jst,h9)=>{var p9="\\ud800-\\udfff",oDe="\\u0300-\\u036f",aDe="\\ufe20-\\ufe2f",ADe="\\u20d0-\\u20ff",lDe=oDe+aDe+ADe,cDe="\\ufe0e\\ufe0f",uDe="["+p9+"]",ZP="["+lDe+"]",$P="\\ud83c[\\udffb-\\udfff]",gDe="(?:"+ZP+"|"+$P+")",d9="[^"+p9+"]",C9="(?:\\ud83c[\\udde6-\\uddff]){2}",m9="[\\ud800-\\udbff][\\udc00-\\udfff]",fDe="\\u200d",E9=gDe+"?",I9="["+cDe+"]?",hDe="(?:"+fDe+"(?:"+[d9,C9,m9].join("|")+")"+I9+E9+")*",pDe=I9+E9+hDe,dDe="(?:"+[d9+ZP+"?",ZP,C9,m9,uDe].join("|")+")",CDe=RegExp($P+"(?="+$P+")|"+dDe+pDe,"g");function mDe(r){return r.match(CDe)||[]}h9.exports=mDe});var B9=w((Gst,w9)=>{var EDe=f9(),IDe=XP(),yDe=y9();function wDe(r){return IDe(r)?yDe(r):EDe(r)}w9.exports=wDe});var Q9=w((Yst,b9)=>{var BDe=c9(),bDe=XP(),QDe=B9(),SDe=lf();function vDe(r){return function(e){e=SDe(e);var t=bDe(e)?QDe(e):void 0,i=t?t[0]:e.charAt(0),n=t?BDe(t,1).join(""):e.slice(1);return i[r]()+n}}b9.exports=vDe});var v9=w((qst,S9)=>{var xDe=Q9(),kDe=xDe("toUpperCase");S9.exports=kDe});var Zw=w((Jst,x9)=>{var PDe=lf(),DDe=v9();function RDe(r){return DDe(PDe(r).toLowerCase())}x9.exports=RDe});var k9=w((Wst,$w)=>{function FDe(){var r=0,e=1,t=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,m=15,y=16,b=17,v=0,x=1,T=2,q=3,Y=4;function $(A,oe){return 55296<=A.charCodeAt(oe)&&A.charCodeAt(oe)<=56319&&56320<=A.charCodeAt(oe+1)&&A.charCodeAt(oe+1)<=57343}function _(A,oe){oe===void 0&&(oe=0);var ce=A.charCodeAt(oe);if(55296<=ce&&ce<=56319&&oe=1){var Z=A.charCodeAt(oe-1),O=ce;return 55296<=Z&&Z<=56319?(Z-55296)*1024+(O-56320)+65536:O}return ce}function ne(A,oe,ce){var Z=[A].concat(oe).concat([ce]),O=Z[Z.length-2],L=ce,de=Z.lastIndexOf(p);if(de>1&&Z.slice(1,de).every(function(re){return re==i})&&[i,h,b].indexOf(A)==-1)return T;var Be=Z.lastIndexOf(n);if(Be>0&&Z.slice(1,Be).every(function(re){return re==n})&&[f,n].indexOf(O)==-1)return Z.filter(function(re){return re==n}).length%2==1?q:Y;if(O==r&&L==e)return v;if(O==t||O==r||O==e)return L==p&&oe.every(function(re){return re==i})?T:x;if(L==t||L==r||L==e)return x;if(O==o&&(L==o||L==a||L==c||L==u))return v;if((O==c||O==a)&&(L==a||L==l))return v;if((O==u||O==l)&&L==l)return v;if(L==i||L==m)return v;if(L==s)return v;if(O==f)return v;var je=Z.indexOf(i)!=-1?Z.lastIndexOf(i)-1:Z.length-2;return[h,b].indexOf(Z[je])!=-1&&Z.slice(je+1,-1).every(function(re){return re==i})&&L==p||O==m&&[y,b].indexOf(L)!=-1?v:oe.indexOf(n)!=-1?T:O==n&&L==n?v:x}this.nextBreak=function(A,oe){if(oe===void 0&&(oe=0),oe<0)return 0;if(oe>=A.length-1)return A.length;for(var ce=ee(_(A,oe)),Z=[],O=oe+1;O{var NDe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,eB;function LDe(){if(eB)return eB;if(typeof Intl.Segmenter!="undefined"){let r=new Intl.Segmenter("en",{granularity:"grapheme"});return eB=e=>Array.from(r.segment(e),({segment:t})=>t)}else{let r=k9(),e=new r;return eB=t=>e.splitGraphemes(t)}}P9.exports=(r,e=0,t=r.length)=>{if(e<0||t<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=t-e,n="",s=0,o=0;for(;r.length>0;){let a=r.match(NDe)||[r,r,void 0],l=LDe()(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),r=r.slice(a[0].length)}return n}});var cf=w((Bot,q9)=>{"use strict";var J9=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),wot=q9.exports=r=>r?Object.keys(r).map(e=>[J9.has(e)?J9.get(e):e,r[e]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}});var uf=w((bot,W9)=>{"use strict";var zDe=require("events"),z9=require("stream"),qd=Bp(),_9=require("string_decoder").StringDecoder,lA=Symbol("EOF"),Jd=Symbol("maybeEmitEnd"),Il=Symbol("emittedEnd"),oB=Symbol("emittingEnd"),aB=Symbol("closed"),V9=Symbol("read"),iD=Symbol("flush"),X9=Symbol("flushChunk"),Nn=Symbol("encoding"),cA=Symbol("decoder"),AB=Symbol("flowing"),Wd=Symbol("paused"),zd=Symbol("resume"),pn=Symbol("bufferLength"),Z9=Symbol("bufferPush"),nD=Symbol("bufferShift"),_i=Symbol("objectMode"),Vi=Symbol("destroyed"),$9=global._MP_NO_ITERATOR_SYMBOLS_!=="1",_De=$9&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),VDe=$9&&Symbol.iterator||Symbol("iterator not implemented"),e_=r=>r==="end"||r==="finish"||r==="prefinish",XDe=r=>r instanceof ArrayBuffer||typeof r=="object"&&r.constructor&&r.constructor.name==="ArrayBuffer"&&r.byteLength>=0,ZDe=r=>!Buffer.isBuffer(r)&&ArrayBuffer.isView(r);W9.exports=class t_ extends z9{constructor(e){super();this[AB]=!1,this[Wd]=!1,this.pipes=new qd,this.buffer=new qd,this[_i]=e&&e.objectMode||!1,this[_i]?this[Nn]=null:this[Nn]=e&&e.encoding||null,this[Nn]==="buffer"&&(this[Nn]=null),this[cA]=this[Nn]?new _9(this[Nn]):null,this[lA]=!1,this[Il]=!1,this[oB]=!1,this[aB]=!1,this.writable=!0,this.readable=!0,this[pn]=0,this[Vi]=!1}get bufferLength(){return this[pn]}get encoding(){return this[Nn]}set encoding(e){if(this[_i])throw new Error("cannot set encoding in objectMode");if(this[Nn]&&e!==this[Nn]&&(this[cA]&&this[cA].lastNeed||this[pn]))throw new Error("cannot change encoding");this[Nn]!==e&&(this[cA]=e?new _9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(t=>this[cA].write(t)))),this[Nn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[_i]}set objectMode(e){this[_i]=this[_i]||!!e}write(e,t,i){if(this[lA])throw new Error("write after end");return this[Vi]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8"),!this[_i]&&!Buffer.isBuffer(e)&&(ZDe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):XDe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[_i]&&!(t===this[Nn]&&!this[cA].lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[Nn]&&(e=this[cA].write(e)),this.flowing?(this[pn]!==0&&this[iD](!0),this.emit("data",e)):this[Z9](e),this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Vi])return null;try{return this[pn]===0||e===0||e>this[pn]?null:(this[_i]&&(e=null),this.buffer.length>1&&!this[_i]&&(this.encoding?this.buffer=new qd([Array.from(this.buffer).join("")]):this.buffer=new qd([Buffer.concat(Array.from(this.buffer),this[pn])])),this[V9](e||null,this.buffer.head.value))}finally{this[Jd]()}}[V9](e,t){return e===t.length||e===null?this[nD]():(this.buffer.head.value=t.slice(e),t=t.slice(0,e),this[pn]-=e),this.emit("data",t),!this.buffer.length&&!this[lA]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=null),typeof t=="function"&&(i=t,t="utf8"),e&&this.write(e,t),i&&this.once("end",i),this[lA]=!0,this.writable=!1,(this.flowing||!this[Wd])&&this[Jd](),this}[zd](){this[Vi]||(this[Wd]=!1,this[AB]=!0,this.emit("resume"),this.buffer.length?this[iD]():this[lA]?this[Jd]():this.emit("drain"))}resume(){return this[zd]()}pause(){this[AB]=!1,this[Wd]=!0}get destroyed(){return this[Vi]}get flowing(){return this[AB]}get paused(){return this[Wd]}[Z9](e){return this[_i]?this[pn]+=1:this[pn]+=e.length,this.buffer.push(e)}[nD](){return this.buffer.length&&(this[_i]?this[pn]-=1:this[pn]-=this.buffer.head.value.length),this.buffer.shift()}[iD](e){do;while(this[X9](this[nD]()));!e&&!this.buffer.length&&!this[lA]&&this.emit("drain")}[X9](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,t){if(this[Vi])return;let i=this[Il];t=t||{},e===process.stdout||e===process.stderr?t.end=!1:t.end=t.end!==!1;let n={dest:e,opts:t,ondrain:s=>this[zd]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[zd](),i&&n.opts.end&&n.dest.end(),e}addListener(e,t){return this.on(e,t)}on(e,t){try{return super.on(e,t)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[zd]():e_(e)&&this[Il]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[Il]}[Jd](){!this[oB]&&!this[Il]&&!this[Vi]&&this.buffer.length===0&&this[lA]&&(this[oB]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[aB]&&this.emit("close"),this[oB]=!1)}emit(e,t){if(e!=="error"&&e!=="close"&&e!==Vi&&this[Vi])return;if(e==="data"){if(!t)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(t)===!1&&this.pause())}else if(e==="end"){if(this[Il]===!0)return;this[Il]=!0,this.readable=!1,this[cA]&&(t=this[cA].end(),t&&(this.pipes.forEach(n=>n.dest.write(t)),super.emit("data",t))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[aB]=!0,!this[Il]&&!this[Vi]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=t,arguments.length>2)for(let n=2;n{e.push(i),this[_i]||(e.dataLength+=i.length)}),t.then(()=>e)}concat(){return this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this[Nn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,t)=>{this.on(Vi,()=>t(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>t(i))})}[_De](){return{next:()=>{let t=this.read();if(t!==null)return Promise.resolve({done:!1,value:t});if(this[lA])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[lA]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Vi,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[VDe](){return{next:()=>{let t=this.read();return{value:t,done:t===null}}}}destroy(e){return this[Vi]?(e?this.emit("error",e):this.emit(Vi),this):(this[Vi]=!0,this.buffer=new qd,this[pn]=0,typeof this.close=="function"&&!this[aB]&&this.close(),e?this.emit("error",e):this.emit(Vi),this)}static isStream(e){return!!e&&(e instanceof t_||e instanceof z9||e instanceof zDe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var i_=w((Qot,r_)=>{var $De=require("zlib").constants||{ZLIB_VERNUM:4736};r_.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},$De))});var fD=w(as=>{"use strict";var sD=require("assert"),yl=require("buffer").Buffer,n_=require("zlib"),Zc=as.constants=i_(),eRe=uf(),s_=yl.concat,$c=Symbol("_superWrite"),_d=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},tRe=Symbol("opts"),Vd=Symbol("flushFlag"),o_=Symbol("finishFlushFlag"),oD=Symbol("fullFlushFlag"),pr=Symbol("handle"),lB=Symbol("onError"),gf=Symbol("sawError"),aD=Symbol("level"),AD=Symbol("strategy"),lD=Symbol("ended"),Sot=Symbol("_defaultFullFlush"),cD=class extends eRe{constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[gf]=!1,this[lD]=!1,this[tRe]=e,this[Vd]=e.flush,this[o_]=e.finishFlush;try{this[pr]=new n_[t](e)}catch(i){throw new _d(i)}this[lB]=i=>{this[gf]||(this[gf]=!0,this.close(),this.emit("error",i))},this[pr].on("error",i=>this[lB](new _d(i))),this.once("end",()=>this.close)}close(){this[pr]&&(this[pr].close(),this[pr]=null,this.emit("close"))}reset(){if(!this[gf])return sD(this[pr],"zlib binding closed"),this[pr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[oD]),this.write(Object.assign(yl.alloc(0),{[Vd]:e})))}end(e,t,i){return e&&this.write(e,t),this.flush(this[o_]),this[lD]=!0,super.end(null,null,i)}get ended(){return this[lD]}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=yl.from(e,t)),this[gf])return;sD(this[pr],"zlib binding closed");let n=this[pr]._handle,s=n.close;n.close=()=>{};let o=this[pr].close;this[pr].close=()=>{},yl.concat=c=>c;let a;try{let c=typeof e[Vd]=="number"?e[Vd]:this[Vd];a=this[pr]._processChunk(e,c),yl.concat=s_}catch(c){yl.concat=s_,this[lB](new _d(c))}finally{this[pr]&&(this[pr]._handle=n,n.close=s,this[pr].close=o,this[pr].removeAllListeners("error"))}this[pr]&&this[pr].on("error",c=>this[lB](new _d(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[$c](yl.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[pr].params(e,t)}finally{this[pr].flush=i}this[pr]&&(this[aD]=e,this[AD]=t)}}}},a_=class extends wl{constructor(e){super(e,"Deflate")}},A_=class extends wl{constructor(e){super(e,"Inflate")}},uD=Symbol("_portable"),l_=class extends wl{constructor(e){super(e,"Gzip");this[uD]=e&&!!e.portable}[$c](e){return this[uD]?(this[uD]=!1,e[9]=255,super[$c](e)):super[$c](e)}},c_=class extends wl{constructor(e){super(e,"Gunzip")}},u_=class extends wl{constructor(e){super(e,"DeflateRaw")}},g_=class extends wl{constructor(e){super(e,"InflateRaw")}},f_=class extends wl{constructor(e){super(e,"Unzip")}},gD=class extends cD{constructor(e,t){e=e||{},e.flush=e.flush||Zc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Zc.BROTLI_OPERATION_FINISH,super(e,t),this[oD]=Zc.BROTLI_OPERATION_FLUSH}},h_=class extends gD{constructor(e){super(e,"BrotliCompress")}},p_=class extends gD{constructor(e){super(e,"BrotliDecompress")}};as.Deflate=a_;as.Inflate=A_;as.Gzip=l_;as.Gunzip=c_;as.DeflateRaw=u_;as.InflateRaw=g_;as.Unzip=f_;typeof n_.BrotliCompress=="function"?(as.BrotliCompress=h_,as.BrotliDecompress=p_):as.BrotliCompress=as.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var Xd=w(cB=>{"use strict";cB.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);cB.code=new Map(Array.from(cB.name).map(r=>[r[1],r[0]]))});var Zd=w((Dot,d_)=>{"use strict";var kot=Xd(),rRe=uf(),hD=Symbol("slurp");d_.exports=class extends rRe{constructor(e,t,i){super();switch(this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,t&&this[hD](t),i&&this[hD](i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,n-t),this.ignore?!0:i>=t?super.write(e):super.write(e.slice(0,i))}[hD](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i==="path")&&(this[i]=e[i])}}});var E_=w(pD=>{"use strict";var Rot=pD.encode=(r,e)=>{if(Number.isSafeInteger(r))r<0?nRe(r,e):iRe(r,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},iRe=(r,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=r&255,r=Math.floor(r/256)},nRe=(r,e)=>{e[0]=255;var t=!1;r=r*-1;for(var i=e.length;i>1;i--){var n=r&255;r=Math.floor(r/256),t?e[i-1]=C_(n):n===0?e[i-1]=0:(t=!0,e[i-1]=m_(n))}},Fot=pD.parse=r=>{var e=r[r.length-1],t=r[0],i;if(t===128)i=oRe(r.slice(1,r.length));else if(t===255)i=sRe(r);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},sRe=r=>{for(var e=r.length,t=0,i=!1,n=e-1;n>-1;n--){var s=r[n],o;i?o=C_(s):s===0?o=s:(i=!0,o=m_(s)),o!==0&&(t-=o*Math.pow(256,e-n-1))}return t},oRe=r=>{for(var e=r.length,t=0,i=e-1;i>-1;i--){var n=r[i];n!==0&&(t+=n*Math.pow(256,e-i-1))}return t},C_=r=>(255^r)&255,m_=r=>(255^r)+1&255});var hf=w((Lot,I_)=>{"use strict";var dD=Xd(),ff=require("path").posix,y_=E_(),CD=Symbol("slurp"),As=Symbol("type"),w_=class{constructor(e,t,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[As]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,t||0,i,n):e&&this.set(e)}decode(e,t,i,n){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");if(this.path=eu(e,t,100),this.mode=Bl(e,t+100,8),this.uid=Bl(e,t+108,8),this.gid=Bl(e,t+116,8),this.size=Bl(e,t+124,12),this.mtime=mD(e,t+136,12),this.cksum=Bl(e,t+148,12),this[CD](i),this[CD](n,!0),this[As]=eu(e,t+156,1),this[As]===""&&(this[As]="0"),this[As]==="0"&&this.path.substr(-1)==="/"&&(this[As]="5"),this[As]==="5"&&(this.size=0),this.linkpath=eu(e,t+157,100),e.slice(t+257,t+265).toString()==="ustar\x0000")if(this.uname=eu(e,t+265,32),this.gname=eu(e,t+297,32),this.devmaj=Bl(e,t+329,8),this.devmin=Bl(e,t+337,8),e[t+475]!==0){let o=eu(e,t+345,155);this.path=o+"/"+this.path}else{let o=eu(e,t+345,130);o&&(this.path=o+"/"+this.path),this.atime=mD(e,t+476,12),this.ctime=mD(e,t+488,12)}let s=8*32;for(let o=t;o=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=aRe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=tu(e,t,100,s)||this.needPax,this.needPax=bl(e,t+100,8,this.mode)||this.needPax,this.needPax=bl(e,t+108,8,this.uid)||this.needPax,this.needPax=bl(e,t+116,8,this.gid)||this.needPax,this.needPax=bl(e,t+124,12,this.size)||this.needPax,this.needPax=ED(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this[As].charCodeAt(0),this.needPax=tu(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=tu(e,t+265,32,this.uname)||this.needPax,this.needPax=tu(e,t+297,32,this.gname)||this.needPax,this.needPax=bl(e,t+329,8,this.devmaj)||this.needPax,this.needPax=bl(e,t+337,8,this.devmin)||this.needPax,this.needPax=tu(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=tu(e,t+345,155,o)||this.needPax:(this.needPax=tu(e,t+345,130,o)||this.needPax,this.needPax=ED(e,t+476,12,this.atime)||this.needPax,this.needPax=ED(e,t+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=t;l{let t=100,i=r,n="",s,o=ff.parse(r).root||".";if(Buffer.byteLength(i)t&&Buffer.byteLength(n)<=e?s=[i.substr(0,t-1),n,!0]:(i=ff.join(ff.basename(n),i),n=ff.dirname(n));while(n!==o&&!s);s||(s=[r.substr(0,t-1),"",!0])}return s},eu=(r,e,t)=>r.slice(e,e+t).toString("utf8").replace(/\0.*/,""),mD=(r,e,t)=>ARe(Bl(r,e,t)),ARe=r=>r===null?null:new Date(r*1e3),Bl=(r,e,t)=>r[e]&128?y_.parse(r.slice(e,e+t)):lRe(r,e,t),cRe=r=>isNaN(r)?null:r,lRe=(r,e,t)=>cRe(parseInt(r.slice(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),uRe={12:8589934591,8:2097151},bl=(r,e,t,i)=>i===null?!1:i>uRe[t]||i<0?(y_.encode(i,r.slice(e,e+t)),!0):(gRe(r,e,t,i),!1),gRe=(r,e,t,i)=>r.write(fRe(i,t),e,t,"ascii"),fRe=(r,e)=>hRe(Math.floor(r).toString(8),e),hRe=(r,e)=>(r.length===e-1?r:new Array(e-r.length-1).join("0")+r+" ")+"\0",ED=(r,e,t,i)=>i===null?!1:bl(r,e,t,i.getTime()/1e3),pRe=new Array(156).join("\0"),tu=(r,e,t,i)=>i===null?!1:(r.write(i+pRe,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t);I_.exports=w_});var gB=w((Tot,B_)=>{"use strict";var dRe=hf(),CRe=require("path"),uB=class{constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=t||!1}encode(){let e=this.encodeBody();if(e==="")return null;let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new dRe({path:("PaxHeader/"+CRe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:t,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,t,"utf8");for(let s=t+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};uB.parse=(r,e,t)=>new uB(mRe(ERe(r),e),t);var mRe=(r,e)=>e?Object.keys(r).reduce((t,i)=>(t[i]=r[i],t),e):r,ERe=r=>r.replace(/\n$/,"").split(` -`).reduce(IRe,Object.create(null)),IRe=(r,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return r;e=e.substr((t+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return r;let s=i.join("=");return r[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,r};B_.exports=uB});var fB=w((Oot,b_)=>{"use strict";b_.exports=r=>class extends r{warn(e,t,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),this.emit("warn",i.tarCode,t,i)):t instanceof Error?this.emit("error",Object.assign(t,i)):this.emit("error",Object.assign(new Error(`${e}: ${t}`),i))}}});var yD=w((Mot,Q_)=>{"use strict";var hB=["|","<",">","?",":"],ID=hB.map(r=>String.fromCharCode(61440+r.charCodeAt(0))),yRe=new Map(hB.map((r,e)=>[r,ID[e]])),wRe=new Map(ID.map((r,e)=>[r,hB[e]]));Q_.exports={encode:r=>hB.reduce((e,t)=>e.split(t).join(yRe.get(t)),r),decode:r=>ID.reduce((e,t)=>e.split(t).join(wRe.get(t)),r)}});var v_=w((Kot,S_)=>{"use strict";S_.exports=(r,e,t)=>(r&=4095,t&&(r=(r|384)&~18),e&&(r&256&&(r|=64),r&32&&(r|=8),r&4&&(r|=1)),r)});var xD=w((Yot,x_)=>{"use strict";var k_=uf(),P_=gB(),D_=hf(),Uot=Zd(),sa=require("fs"),pf=require("path"),Hot=Xd(),BRe=16*1024*1024,R_=Symbol("process"),F_=Symbol("file"),N_=Symbol("directory"),wD=Symbol("symlink"),L_=Symbol("hardlink"),$d=Symbol("header"),pB=Symbol("read"),BD=Symbol("lstat"),dB=Symbol("onlstat"),bD=Symbol("onread"),QD=Symbol("onreadlink"),SD=Symbol("openfile"),vD=Symbol("onopenfile"),ru=Symbol("close"),CB=Symbol("mode"),T_=fB(),bRe=yD(),O_=v_(),mB=T_(class extends k_{constructor(e,t){if(t=t||{},super(t),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!t.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=t.maxReadSize||BRe,this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.preservePaths=!!t.preservePaths,this.cwd=t.cwd||process.cwd(),this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.mtime=t.mtime||null,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(!this.preservePaths&&pf.win32.isAbsolute(e)){let n=pf.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!t.win32||process.platform==="win32",this.win32&&(this.path=bRe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=t.absolute||pf.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[dB](this.statCache.get(this.absolute)):this[BD]()}[BD](){sa.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[dB](t)})}[dB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=QRe(e),this.emit("stat",e),this[R_]()}[R_](){switch(this.type){case"File":return this[F_]();case"Directory":return this[N_]();case"SymbolicLink":return this[wD]();default:return this.end()}}[CB](e){return O_(e,this.type==="Directory",this.portable)}[$d](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this[CB](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new P_({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[N_](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[$d](),this.end()}[wD](){sa.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[QD](t)})}[QD](e){this.linkpath=e.replace(/\\/g,"/"),this[$d](),this.end()}[L_](e){this.type="Link",this.linkpath=pf.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[$d](),this.end()}[F_](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let t=this.linkCache.get(e);if(t.indexOf(this.cwd)===0)return this[L_](t)}this.linkCache.set(e,this.absolute)}if(this[$d](),this.stat.size===0)return this.end();this[SD]()}[SD](){sa.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[vD](t)})}[vD](e){let t=512*Math.ceil(this.stat.size/512),i=Math.min(t,this.maxReadSize),n=Buffer.allocUnsafe(i);this[pB](e,n,0,n.length,0,this.stat.size,t)}[pB](e,t,i,n,s,o,a){sa.read(e,t,i,n,s,(l,c)=>{if(l)return this[ru](e,()=>this.emit("error",l));this[bD](e,t,i,n,s,o,a,c)})}[ru](e,t){sa.close(e,t)}[bD](e,t,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(t=Buffer.allocUnsafe(n),i=0),n=t.length-i,this[pB](e,t,i,n,s,o,a)}}),M_=class extends mB{constructor(e,t){super(e,t)}[BD](){this[dB](sa.lstatSync(this.absolute))}[wD](){this[QD](sa.readlinkSync(this.absolute))}[SD](){this[vD](sa.openSync(this.absolute,"r"))}[pB](e,t,i,n,s,o,a){let l=!0;try{let c=sa.readSync(e,t,i,n,s);this[bD](e,t,i,n,s,o,a,c),l=!1}finally{if(l)try{this[ru](e,()=>{})}catch(c){}}}[ru](e,t){sa.closeSync(e),t()}},SRe=T_(class extends k_{constructor(e,t){t=t||{},super(t),this.preservePaths=!!t.preservePaths,this.portable=!!t.portable,this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[CB](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:t.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(pf.isAbsolute(this.path)&&!this.preservePaths){let n=pf.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new P_({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[CB](e){return O_(e,this.type==="Directory",this.portable)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=t,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});mB.Sync=M_;mB.Tar=SRe;var QRe=r=>r.isFile()?"File":r.isDirectory()?"Directory":r.isSymbolicLink()?"SymbolicLink":"Unsupported";x_.exports=mB});var SB=w((Jot,K_)=>{"use strict";var kD=class{constructor(e,t){this.path=e||"./",this.absolute=t,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},vRe=uf(),xRe=fD(),kRe=Zd(),PD=xD(),PRe=PD.Sync,DRe=PD.Tar,RRe=Bp(),U_=Buffer.alloc(1024),EB=Symbol("onStat"),IB=Symbol("ended"),oa=Symbol("queue"),df=Symbol("current"),iu=Symbol("process"),yB=Symbol("processing"),H_=Symbol("processJob"),aa=Symbol("jobs"),DD=Symbol("jobDone"),wB=Symbol("addFSEntry"),j_=Symbol("addTarEntry"),RD=Symbol("stat"),FD=Symbol("readdir"),BB=Symbol("onreaddir"),bB=Symbol("pipe"),G_=Symbol("entry"),ND=Symbol("entryOpt"),LD=Symbol("writeEntryClass"),Y_=Symbol("write"),TD=Symbol("ondrain"),QB=require("fs"),q_=require("path"),FRe=fB(),OD=FRe(class extends vRe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[LD]=PD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new xRe.Gzip(e.gzip),this.zip.on("data",t=>super.write(t)),this.zip.on("end",t=>super.end()),this.zip.on("drain",t=>this[TD]()),this.on("resume",t=>this.zip.resume())):this.on("drain",this[TD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:t=>!0,this[oa]=new RRe,this[aa]=0,this.jobs=+e.jobs||4,this[yB]=!1,this[IB]=!1}[Y_](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[IB]=!0,this[iu](),this}write(e){if(this[IB])throw new Error("write after end");return e instanceof kRe?this[j_](e):this[wB](e),this.flowing}[j_](e){let t=q_.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new kD(e.path,t,!1);i.entry=new DRe(e,this[ND](i)),i.entry.on("end",n=>this[DD](i)),this[aa]+=1,this[oa].push(i)}this[iu]()}[wB](e){let t=q_.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[oa].push(new kD(e,t)),this[iu]()}[RD](e){e.pending=!0,this[aa]+=1;let t=this.follow?"stat":"lstat";QB[t](e.absolute,(i,n)=>{e.pending=!1,this[aa]-=1,i?this.emit("error",i):this[EB](e,n)})}[EB](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)||(e.ignore=!0),this[iu]()}[FD](e){e.pending=!0,this[aa]+=1,QB.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[aa]-=1,t)return this.emit("error",t);this[BB](e,i)})}[BB](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[iu]()}[iu](){if(!this[yB]){this[yB]=!0;for(let e=this[oa].head;e!==null&&this[aa]this.warn(t,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[G_](e){this[aa]+=1;try{return new this[LD](e.path,this[ND](e)).on("end",()=>this[DD](e)).on("error",t=>this.emit("error",t))}catch(t){this.emit("error",t)}}[TD](){this[df]&&this[df].entry&&this[df].entry.resume()}[bB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)});let t=e.entry,i=this.zip;i?t.on("data",n=>{i.write(n)||t.pause()}):t.on("data",n=>{super.write(n)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),J_=class extends OD{constructor(e){super(e);this[LD]=PRe}pause(){}resume(){}[RD](e){let t=this.follow?"statSync":"lstatSync";this[EB](e,QB[t](e.absolute))}[FD](e,t){this[BB](e,QB.readdirSync(e.absolute))}[bB](e){let t=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)}),i?t.on("data",n=>{i.write(n)}):t.on("data",n=>{super[Y_](n)})}};OD.Sync=J_;K_.exports=OD});var wf=w(eC=>{"use strict";var NRe=uf(),LRe=require("events").EventEmitter,Us=require("fs"),vB=process.binding("fs"),Wot=vB.writeBuffers,TRe=vB.FSReqWrap||vB.FSReqCallback,Cf=Symbol("_autoClose"),Aa=Symbol("_close"),tC=Symbol("_ended"),or=Symbol("_fd"),W_=Symbol("_finished"),nu=Symbol("_flags"),MD=Symbol("_flush"),KD=Symbol("_handleChunk"),UD=Symbol("_makeBuf"),HD=Symbol("_mode"),xB=Symbol("_needDrain"),mf=Symbol("_onerror"),Ef=Symbol("_onopen"),jD=Symbol("_onread"),su=Symbol("_onwrite"),Ql=Symbol("_open"),Sl=Symbol("_path"),ou=Symbol("_pos"),la=Symbol("_queue"),If=Symbol("_read"),z_=Symbol("_readSize"),vl=Symbol("_reading"),kB=Symbol("_remain"),__=Symbol("_size"),PB=Symbol("_write"),yf=Symbol("_writing"),DB=Symbol("_defaultFlag"),GD=class extends NRe{constructor(e,t){if(t=t||{},super(t),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[or]=typeof t.fd=="number"?t.fd:null,this[Sl]=e,this[z_]=t.readSize||16*1024*1024,this[vl]=!1,this[__]=typeof t.size=="number"?t.size:Infinity,this[kB]=this[__],this[Cf]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[or]=="number"?this[If]():this[Ql]()}get fd(){return this[or]}get path(){return this[Sl]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ql](){Us.open(this[Sl],"r",(e,t)=>this[Ef](e,t))}[Ef](e,t){e?this[mf](e):(this[or]=t,this.emit("open",t),this[If]())}[UD](){return Buffer.allocUnsafe(Math.min(this[z_],this[kB]))}[If](){if(!this[vl]){this[vl]=!0;let e=this[UD]();if(e.length===0)return process.nextTick(()=>this[jD](null,0,e));Us.read(this[or],e,0,e.length,null,(t,i,n)=>this[jD](t,i,n))}}[jD](e,t,i){this[vl]=!1,e?this[mf](e):this[KD](t,i)&&this[If]()}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}[mf](e){this[vl]=!0,this[Aa](),this.emit("error",e)}[KD](e,t){let i=!1;return this[kB]-=e,e>0&&(i=super.write(ethis[Ef](e,t))}[Ef](e,t){this[DB]&&this[nu]==="r+"&&e&&e.code==="ENOENT"?(this[nu]="w",this[Ql]()):e?this[mf](e):(this[or]=t,this.emit("open",t),this[MD]())}end(e,t){e&&this.write(e,t),this[tC]=!0,!this[yf]&&!this[la].length&&typeof this[or]=="number"&&this[su](null,0)}write(e,t){return typeof e=="string"&&(e=new Buffer(e,t)),this[tC]?(this.emit("error",new Error("write() after end()")),!1):this[or]===null||this[yf]||this[la].length?(this[la].push(e),this[xB]=!0,!1):(this[yf]=!0,this[PB](e),!0)}[PB](e){Us.write(this[or],e,0,e.length,this[ou],(t,i)=>this[su](t,i))}[su](e,t){e?this[mf](e):(this[ou]!==null&&(this[ou]+=t),this[la].length?this[MD]():(this[yf]=!1,this[tC]&&!this[W_]?(this[W_]=!0,this[Aa](),this.emit("finish")):this[xB]&&(this[xB]=!1,this.emit("drain"))))}[MD](){if(this[la].length===0)this[tC]&&this[su](null,0);else if(this[la].length===1)this[PB](this[la].pop());else{let e=this[la];this[la]=[],ORe(this[or],e,this[ou],(t,i)=>this[su](t,i))}}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}},X_=class extends YD{[Ql](){let e;try{e=Us.openSync(this[Sl],this[nu],this[HD])}catch(t){if(this[DB]&&this[nu]==="r+"&&t&&t.code==="ENOENT")return this[nu]="w",this[Ql]();throw t}this[Ef](null,e)}[Aa](){if(this[Cf]&&typeof this[or]=="number"){try{Us.closeSync(this[or])}catch(e){}this[or]=null,this.emit("close")}}[PB](e){try{this[su](null,Us.writeSync(this[or],e,0,e.length,this[ou]))}catch(t){this[su](t,0)}}},ORe=(r,e,t,i)=>{let n=(o,a)=>i(o,a,e),s=new TRe;s.oncomplete=n,vB.writeBuffers(r,e,t,s)};eC.ReadStream=GD;eC.ReadStreamSync=V_;eC.WriteStream=YD;eC.WriteStreamSync=X_});var nC=w((Xot,Z_)=>{"use strict";var MRe=fB(),_ot=require("path"),KRe=hf(),URe=require("events"),HRe=Bp(),jRe=1024*1024,GRe=Zd(),$_=gB(),YRe=fD(),qD=Buffer.from([31,139]),Hs=Symbol("state"),au=Symbol("writeEntry"),uA=Symbol("readEntry"),JD=Symbol("nextEntry"),eV=Symbol("processEntry"),js=Symbol("extendedHeader"),rC=Symbol("globalExtendedHeader"),xl=Symbol("meta"),tV=Symbol("emitMeta"),yr=Symbol("buffer"),gA=Symbol("queue"),Au=Symbol("ended"),rV=Symbol("emittedEnd"),lu=Symbol("emit"),Ln=Symbol("unzip"),RB=Symbol("consumeChunk"),FB=Symbol("consumeChunkSub"),WD=Symbol("consumeBody"),iV=Symbol("consumeMeta"),nV=Symbol("consumeHeader"),NB=Symbol("consuming"),zD=Symbol("bufferConcat"),_D=Symbol("maybeEnd"),iC=Symbol("writing"),kl=Symbol("aborted"),LB=Symbol("onDone"),cu=Symbol("sawValidEntry"),TB=Symbol("sawNullBlock"),OB=Symbol("sawEOF"),qRe=r=>!0;Z_.exports=MRe(class extends URe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[cu]=null,this.on(LB,t=>{(this[Hs]==="begin"||this[cu]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(LB,e.ondone):this.on(LB,t=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||jRe,this.filter=typeof e.filter=="function"?e.filter:qRe,this.writable=!0,this.readable=!1,this[gA]=new HRe,this[yr]=null,this[uA]=null,this[au]=null,this[Hs]="begin",this[xl]="",this[js]=null,this[rC]=null,this[Au]=!1,this[Ln]=null,this[kl]=!1,this[TB]=!1,this[OB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[nV](e,t){this[cu]===null&&(this[cu]=!1);let i;try{i=new KRe(e,t,this[js],this[rC])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[TB]?(this[OB]=!0,this[Hs]==="begin"&&(this[Hs]="header"),this[lu]("eof")):(this[TB]=!0,this[lu]("nullBlock"));else if(this[TB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[au]=new GRe(i,this[js],this[rC]);if(!this[cu])if(s.remain){let o=()=>{s.invalid||(this[cu]=!0)};s.on("end",o)}else this[cu]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[lu]("ignoredEntry",s),this[Hs]="ignore",s.resume()):s.size>0&&(this[xl]="",s.on("data",o=>this[xl]+=o),this[Hs]="meta"):(this[js]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[lu]("ignoredEntry",s),this[Hs]=s.remain?"ignore":"header",s.resume()):(s.remain?this[Hs]="body":(this[Hs]="header",s.end()),this[uA]?this[gA].push(s):(this[gA].push(s),this[JD]())))}}}[eV](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[uA]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[JD]()),t=!1)):(this[uA]=null,t=!1),t}[JD](){do;while(this[eV](this[gA].shift()));if(!this[gA].length){let e=this[uA];!e||e.flowing||e.size===e.remain?this[iC]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[WD](e,t){let i=this[au],n=i.blockRemain,s=n>=e.length&&t===0?e:e.slice(t,t+n);return i.write(s),i.blockRemain||(this[Hs]="header",this[au]=null,i.end()),s.length}[iV](e,t){let i=this[au],n=this[WD](e,t);return this[au]||this[tV](i),n}[lu](e,t,i){!this[gA].length&&!this[uA]?this.emit(e,t,i):this[gA].push([e,t,i])}[tV](e){switch(this[lu]("meta",this[xl]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[js]=$_.parse(this[xl],this[js],!1);break;case"GlobalExtendedHeader":this[rC]=$_.parse(this[xl],this[rC],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[js]=this[js]||Object.create(null),this[js].path=this[xl].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[js]=this[js]||Object.create(null),this[js].linkpath=this[xl].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[kl]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[kl])return;if(this[Ln]===null&&e){if(this[yr]&&(e=Buffer.concat([this[yr],e]),this[yr]=null),e.lengththis[RB](s)),this[Ln].on("error",s=>this.abort(s)),this[Ln].on("end",s=>{this[Au]=!0,this[RB]()}),this[iC]=!0;let n=this[Ln][i?"end":"write"](e);return this[iC]=!1,n}}this[iC]=!0,this[Ln]?this[Ln].write(e):this[RB](e),this[iC]=!1;let t=this[gA].length?!1:this[uA]?this[uA].flowing:!0;return!t&&!this[gA].length&&this[uA].once("drain",i=>this.emit("drain")),t}[zD](e){e&&!this[kl]&&(this[yr]=this[yr]?Buffer.concat([this[yr],e]):e)}[_D](){if(this[Au]&&!this[rV]&&!this[kl]&&!this[NB]){this[rV]=!0;let e=this[au];if(e&&e.blockRemain){let t=this[yr]?this[yr].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[yr]&&e.write(this[yr]),e.end()}this[lu](LB)}}[RB](e){if(this[NB])this[zD](e);else if(!e&&!this[yr])this[_D]();else{if(this[NB]=!0,this[yr]){this[zD](e);let t=this[yr];this[yr]=null,this[FB](t)}else this[FB](e);for(;this[yr]&&this[yr].length>=512&&!this[kl]&&!this[OB];){let t=this[yr];this[yr]=null,this[FB](t)}this[NB]=!1}(!this[yr]||this[Au])&&this[_D]()}[FB](e){let t=0,i=e.length;for(;t+512<=i&&!this[kl]&&!this[OB];)switch(this[Hs]){case"begin":case"header":this[nV](e,t),t+=512;break;case"ignore":case"body":t+=this[WD](e,t);break;case"meta":t+=this[iV](e,t);break;default:throw new Error("invalid state: "+this[Hs])}t{"use strict";var JRe=cf(),oV=nC(),Bf=require("fs"),WRe=wf(),aV=require("path"),Zot=sV.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=JRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&_Re(i,e),i.noResume||zRe(i),i.file&&i.sync?VRe(i):i.file?XRe(i,t):AV(i)},zRe=r=>{let e=r.onentry;r.onentry=e?t=>{e(t),t.resume()}:t=>t.resume()},_Re=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||aV.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(aV.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},VRe=r=>{let e=AV(r),t=r.file,i=!0,n;try{let s=Bf.statSync(t),o=r.maxReadSize||16*1024*1024;if(s.size{let t=new oV(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("end",o),Bf.stat(n,(l,c)=>{if(l)a(l);else{let u=new WRe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},AV=r=>new oV(r)});var hV=w((rat,lV)=>{"use strict";var ZRe=cf(),KB=SB(),eat=require("fs"),cV=wf(),uV=MB(),gV=require("path"),tat=lV.exports=(r,e,t)=>{if(typeof e=="function"&&(t=e),Array.isArray(r)&&(e=r,r={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=ZRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?$Re(i,e):i.file?eFe(i,e,t):i.sync?tFe(i,e):rFe(i,e)},$Re=(r,e)=>{let t=new KB.Sync(r),i=new cV.WriteStreamSync(r.file,{mode:r.mode||438});t.pipe(i),fV(t,e)},eFe=(r,e,t)=>{let i=new KB(r),n=new cV.WriteStream(r.file,{mode:r.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return VD(i,e),t?s.then(t,t):s},fV=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?uV({file:gV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},VD=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return uV({file:gV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>VD(r,e));r.add(t)}r.end()},tFe=(r,e)=>{let t=new KB.Sync(r);return fV(t,e),t},rFe=(r,e)=>{let t=new KB(r);return VD(t,e),t}});var XD=w((sat,pV)=>{"use strict";var iFe=cf(),dV=SB(),iat=nC(),Gs=require("fs"),CV=wf(),mV=MB(),EV=require("path"),IV=hf(),nat=pV.exports=(r,e,t)=>{let i=iFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?nFe(i,e):sFe(i,e,t)},nFe=(r,e)=>{let t=new dV.Sync(r),i=!0,n,s;try{try{n=Gs.openSync(r.file,"r+")}catch(l){if(l.code==="ENOENT")n=Gs.openSync(r.file,"w+");else throw l}let o=Gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,r.mtimeCache&&r.mtimeCache.set(l.path,l.mtime)}i=!1,oFe(r,t,s,n,e)}finally{if(i)try{Gs.closeSync(n)}catch(o){}}},oFe=(r,e,t,i,n)=>{let s=new CV.WriteStreamSync(r.file,{fd:i,start:t});e.pipe(s),aFe(e,n)},sFe=(r,e,t)=>{e=Array.from(e);let i=new dV(r),n=(o,a,l)=>{let c=(p,m)=>{p?Gs.close(o,y=>l(p)):l(null,m)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,m)=>{if(p)return c(p);if(g+=m,g<512&&m)return Gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let y=new IV(f);if(!y.cksumValid)return c(null,u);let b=512*Math.ceil(y.size/512);if(u+b+512>a||(u+=b+512,u>=a))return c(null,u);r.mtimeCache&&r.mtimeCache.set(y.path,y.mtime),g=0,Gs.read(o,f,0,512,u,h)};Gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",Gs.open(r.file,l,c);if(u)return a(u);Gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,m)=>{if(p)return a(p);let y=new CV.WriteStream(r.file,{fd:g,start:m});i.pipe(y),y.on("error",a),y.on("close",o),yV(i,e)})})};Gs.open(r.file,l,c)});return t?s.then(t,t):s},aFe=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?mV({file:EV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},yV=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return mV({file:EV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>yV(r,e));r.add(t)}r.end()}});var BV=w((aat,wV)=>{"use strict";var AFe=cf(),lFe=XD(),oat=wV.exports=(r,e,t)=>{let i=AFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),cFe(i),lFe(i,e,t)},cFe=r=>{let e=r.filter;r.mtimeCache||(r.mtimeCache=new Map),r.filter=e?(t,i)=>e(t,i)&&!(r.mtimeCache.get(t)>i.mtime):(t,i)=>!(r.mtimeCache.get(t)>i.mtime)}});var SV=w((Aat,bV)=>{var{promisify:QV}=require("util"),Pl=require("fs"),uFe=r=>{if(!r)r={mode:511,fs:Pl};else if(typeof r=="object")r=N({mode:511,fs:Pl},r);else if(typeof r=="number")r={mode:r,fs:Pl};else if(typeof r=="string")r={mode:parseInt(r,8),fs:Pl};else throw new TypeError("invalid options argument");return r.mkdir=r.mkdir||r.fs.mkdir||Pl.mkdir,r.mkdirAsync=QV(r.mkdir),r.stat=r.stat||r.fs.stat||Pl.stat,r.statAsync=QV(r.stat),r.statSync=r.statSync||r.fs.statSync||Pl.statSync,r.mkdirSync=r.mkdirSync||r.fs.mkdirSync||Pl.mkdirSync,r};bV.exports=uFe});var xV=w((lat,vV)=>{var gFe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:fFe,parse:hFe}=require("path"),pFe=r=>{if(/\0/.test(r))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:r,code:"ERR_INVALID_ARG_VALUE"});if(r=fFe(r),gFe==="win32"){let e=/[*|"<>?:]/,{root:t}=hFe(r);if(e.test(r.substr(t.length)))throw Object.assign(new Error("Illegal characters in path."),{path:r,code:"EINVAL"})}return r};vV.exports=pFe});var FV=w((cat,kV)=>{var{dirname:PV}=require("path"),DV=(r,e,t=void 0)=>t===e?Promise.resolve():r.statAsync(e).then(i=>i.isDirectory()?t:void 0,i=>i.code==="ENOENT"?DV(r,PV(e),e):void 0),RV=(r,e,t=void 0)=>{if(t!==e)try{return r.statSync(e).isDirectory()?t:void 0}catch(i){return i.code==="ENOENT"?RV(r,PV(e),e):void 0}};kV.exports={findMade:DV,findMadeSync:RV}});var eR=w((uat,NV)=>{var{dirname:LV}=require("path"),ZD=(r,e,t)=>{e.recursive=!1;let i=LV(r);return i===r?e.mkdirAsync(r,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(r,e).then(()=>t||r,n=>{if(n.code==="ENOENT")return ZD(i,e).then(s=>ZD(r,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(r).then(s=>{if(s.isDirectory())return t;throw n},()=>{throw n})})},$D=(r,e,t)=>{let i=LV(r);if(e.recursive=!1,i===r)try{return e.mkdirSync(r,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(r,e),t||r}catch(n){if(n.code==="ENOENT")return $D(r,e,$D(i,e,t));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(r).isDirectory())throw n}catch(s){throw n}}};NV.exports={mkdirpManual:ZD,mkdirpManualSync:$D}});var MV=w((gat,TV)=>{var{dirname:OV}=require("path"),{findMade:dFe,findMadeSync:CFe}=FV(),{mkdirpManual:mFe,mkdirpManualSync:EFe}=eR(),IFe=(r,e)=>(e.recursive=!0,OV(r)===r?e.mkdirAsync(r,e):dFe(e,r).then(i=>e.mkdirAsync(r,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return mFe(r,e);throw n}))),yFe=(r,e)=>{if(e.recursive=!0,OV(r)===r)return e.mkdirSync(r,e);let i=CFe(e,r);try{return e.mkdirSync(r,e),i}catch(n){if(n.code==="ENOENT")return EFe(r,e);throw n}};TV.exports={mkdirpNative:IFe,mkdirpNativeSync:yFe}});var jV=w((fat,KV)=>{var UV=require("fs"),wFe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,tR=wFe.replace(/^v/,"").split("."),HV=+tR[0]>10||+tR[0]==10&&+tR[1]>=12,BFe=HV?r=>r.mkdir===UV.mkdir:()=>!1,bFe=HV?r=>r.mkdirSync===UV.mkdirSync:()=>!1;KV.exports={useNative:BFe,useNativeSync:bFe}});var zV=w((hat,GV)=>{var bf=SV(),Qf=xV(),{mkdirpNative:YV,mkdirpNativeSync:qV}=MV(),{mkdirpManual:JV,mkdirpManualSync:WV}=eR(),{useNative:QFe,useNativeSync:SFe}=jV(),Sf=(r,e)=>(r=Qf(r),e=bf(e),QFe(e)?YV(r,e):JV(r,e)),vFe=(r,e)=>(r=Qf(r),e=bf(e),SFe(e)?qV(r,e):WV(r,e));Sf.sync=vFe;Sf.native=(r,e)=>YV(Qf(r),bf(e));Sf.manual=(r,e)=>JV(Qf(r),bf(e));Sf.nativeSync=(r,e)=>qV(Qf(r),bf(e));Sf.manualSync=(r,e)=>WV(Qf(r),bf(e));GV.exports=Sf});var t6=w((pat,_V)=>{"use strict";var Ys=require("fs"),uu=require("path"),xFe=Ys.lchown?"lchown":"chown",kFe=Ys.lchownSync?"lchownSync":"chownSync",VV=Ys.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),XV=(r,e,t)=>{try{return Ys[kFe](r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},PFe=(r,e,t)=>{try{return Ys.chownSync(r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},DFe=VV?(r,e,t,i)=>n=>{!n||n.code!=="EISDIR"?i(n):Ys.chown(r,e,t,i)}:(r,e,t,i)=>i,rR=VV?(r,e,t)=>{try{return XV(r,e,t)}catch(i){if(i.code!=="EISDIR")throw i;PFe(r,e,t)}}:(r,e,t)=>XV(r,e,t),RFe=process.version,ZV=(r,e,t)=>Ys.readdir(r,e,t),FFe=(r,e)=>Ys.readdirSync(r,e);/^v4\./.test(RFe)&&(ZV=(r,e,t)=>Ys.readdir(r,t));var UB=(r,e,t,i)=>{Ys[xFe](r,e,t,DFe(r,e,t,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},$V=(r,e,t,i,n)=>{if(typeof e=="string")return Ys.lstat(uu.resolve(r,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,$V(r,o,t,i,n)});if(e.isDirectory())iR(uu.resolve(r,e.name),t,i,s=>{if(s)return n(s);let o=uu.resolve(r,e.name);UB(o,t,i,n)});else{let s=uu.resolve(r,e.name);UB(s,t,i,n)}},iR=(r,e,t,i)=>{ZV(r,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return UB(r,e,t,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return UB(r,e,t,i)}};s.forEach(c=>$V(r,c,e,t,l))})},NFe=(r,e,t,i)=>{if(typeof e=="string")try{let n=Ys.lstatSync(uu.resolve(r,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&e6(uu.resolve(r,e.name),t,i),rR(uu.resolve(r,e.name),t,i)},e6=(r,e,t)=>{let i;try{i=FFe(r,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return rR(r,e,t);throw n}return i&&i.length&&i.forEach(n=>NFe(r,n,e,t)),rR(r,e,t)};_V.exports=iR;iR.sync=e6});var s6=w((mat,nR)=>{"use strict";var r6=zV(),qs=require("fs"),HB=require("path"),i6=t6(),sR=class extends Error{constructor(e,t){super("Cannot extract through symbolic link");this.path=t,this.symlink=e}get name(){return"SylinkError"}},sC=class extends Error{constructor(e,t){super(t+": Cannot cd into '"+e+"'");this.path=e,this.code=t}get name(){return"CwdError"}},dat=nR.exports=(r,e,t)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(y,b)=>{y?t(y):(g.set(r,!0),b&&l?i6(b,o,a,v=>h(v)):s?qs.chmod(r,n,t):t())};if(g&&g.get(r)===!0)return h();if(r===f)return qs.stat(r,(y,b)=>{(y||!b.isDirectory())&&(y=new sC(r,y&&y.code||"ENOTDIR")),h(y)});if(c)return r6(r,{mode:n}).then(y=>h(null,y),h);let m=HB.relative(f,r).split(/\/|\\/);jB(f,m,n,g,u,f,null,h)},jB=(r,e,t,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=r+"/"+l;if(i.get(c))return jB(c,e,t,i,n,s,o,a);qs.mkdir(c,t,n6(c,e,t,i,n,s,o,a))},n6=(r,e,t,i,n,s,o,a)=>l=>{if(l){if(l.path&&HB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new sC(s,l.code));qs.lstat(r,(c,u)=>{if(c)a(c);else if(u.isDirectory())jB(r,e,t,i,n,s,o,a);else if(n)qs.unlink(r,g=>{if(g)return a(g);qs.mkdir(r,t,n6(r,e,t,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new sR(r,r+"/"+e.join("/")));a(l)}})}else o=o||r,jB(r,e,t,i,n,s,o,a)},Cat=nR.exports.sync=(r,e)=>{let t=e.umask,i=e.mode|448,n=(i&t)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=y=>{u.set(r,!0),y&&a&&i6.sync(y,s,o),n&&qs.chmodSync(r,i)};if(u&&u.get(r)===!0)return f();if(r===g){let y=!1,b="ENOTDIR";try{y=qs.statSync(r).isDirectory()}catch(v){b=v.code}finally{if(!y)throw new sC(r,b)}f();return}if(l)return f(r6.sync(r,i));let p=HB.relative(g,r).split(/\/|\\/),m=null;for(let y=p.shift(),b=g;y&&(b+="/"+y);y=p.shift())if(!u.get(b))try{qs.mkdirSync(b,i),m=m||b,u.set(b,!0)}catch(v){if(v.path&&HB.dirname(v.path)===g&&(v.code==="ENOTDIR"||v.code==="ENOENT"))return new sC(g,v.code);let x=qs.lstatSync(b);if(x.isDirectory()){u.set(b,!0);continue}else if(c){qs.unlinkSync(b),qs.mkdirSync(b,i),m=m||b,u.set(b,!0);continue}else if(x.isSymbolicLink())return new sR(b,b+"/"+p.join("/"))}return f(m)}});var A6=w((Eat,o6)=>{var a6=require("assert");o6.exports=()=>{let r=new Map,e=new Map,{join:t}=require("path"),i=u=>t(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(t(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>r.get(f)),dirs:[...g.dirs].map(f=>r.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let m=r.get(p);a6.equal(m[0],u),m.length===1?r.delete(p):(m.shift(),typeof m[0]=="function"?h.add(m[0]):m[0].forEach(y=>h.add(y)))}),f.forEach(p=>{let m=r.get(p);a6(m[0]instanceof Set),m[0].size===1&&m.length===1?r.delete(p):m[0].size===1?(m.shift(),h.add(m[0])):m[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=r.get(h);p?p.push(g):r.set(h,[g])}),f.forEach(h=>{let p=r.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):r.set(h,[new Set([g])])}),a(g)}}}});var u6=w((Iat,l6)=>{var LFe=process.env.__FAKE_PLATFORM__||process.platform,TFe=LFe==="win32",OFe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:MFe,O_TRUNC:KFe,O_WRONLY:UFe,UV_FS_O_FILEMAP:c6=0}=OFe.constants,HFe=TFe&&!!c6,jFe=512*1024,GFe=c6|KFe|MFe|UFe;l6.exports=HFe?r=>r"w"});var hR=w((bat,g6)=>{"use strict";var YFe=require("assert"),yat=require("events").EventEmitter,qFe=nC(),$t=require("fs"),JFe=wf(),fA=require("path"),oR=s6(),wat=oR.sync,f6=yD(),WFe=A6(),h6=Symbol("onEntry"),aR=Symbol("checkFs"),p6=Symbol("checkFs2"),AR=Symbol("isReusable"),hA=Symbol("makeFs"),lR=Symbol("file"),cR=Symbol("directory"),GB=Symbol("link"),d6=Symbol("symlink"),C6=Symbol("hardlink"),m6=Symbol("unsupported"),Bat=Symbol("unknown"),E6=Symbol("checkPath"),vf=Symbol("mkdir"),dn=Symbol("onError"),YB=Symbol("pending"),I6=Symbol("pend"),xf=Symbol("unpend"),uR=Symbol("ended"),gR=Symbol("maybeClose"),fR=Symbol("skip"),oC=Symbol("doChown"),aC=Symbol("uid"),AC=Symbol("gid"),y6=require("crypto"),w6=u6(),qB=()=>{throw new Error("sync function called cb somehow?!?")},zFe=(r,e)=>{if(process.platform!=="win32")return $t.unlink(r,e);let t=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.rename(r,t,i=>{if(i)return e(i);$t.unlink(t,e)})},_Fe=r=>{if(process.platform!=="win32")return $t.unlinkSync(r);let e=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.renameSync(r,e),$t.unlinkSync(e)},B6=(r,e,t)=>r===r>>>0?r:e===e>>>0?e:t,JB=class extends qFe{constructor(e){if(e||(e={}),e.ondone=t=>{this[uR]=!0,this[gR]()},super(e),this.reservations=WFe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[YB]=0,this[uR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=fA.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[h6](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[gR](){this[uR]&&this[YB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[E6](e){if(this.strip){let t=e.path.split(/\/|\\/);if(t.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let t=e.path;if(t.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:t}),!1;if(fA.win32.isAbsolute(t)){let i=fA.win32.parse(t);e.path=t.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:t})}}if(this.win32){let t=fA.win32.parse(e.path);e.path=t.root===""?f6.encode(e.path):t.root+f6.encode(e.path.substr(t.root.length))}return fA.isAbsolute(e.path)?e.absolute=e.path:e.absolute=fA.resolve(this.cwd,e.path),!0}[h6](e){if(!this[E6](e))return e.resume();switch(YFe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[aR](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[m6](e)}}[dn](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[xf](),t.resume())}[vf](e,t,i){oR(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t},i)}[oC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[aC](e){return B6(this.uid,e.uid,this.processUid)}[AC](e){return B6(this.gid,e.gid,this.processGid)}[lR](e,t){let i=e.mode&4095||this.fmode,n=new JFe.WriteStream(e.absolute,{flags:w6(e.size),mode:i,autoClose:!1});n.on("error",l=>this[dn](l,e));let s=1,o=l=>{if(l)return this[dn](l,e);--s==0&&$t.close(n.fd,c=>{t(),c?this[dn](c,e):this[xf]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;$t.futimes(u,g,f,h=>h?$t.utimes(c,g,f,p=>o(p&&h)):o())}if(this[oC](e)){s++;let g=this[aC](e),f=this[AC](e);$t.fchown(u,g,f,h=>h?$t.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.pipe(n)}[cR](e,t){let i=e.mode&4095||this.dmode;this[vf](e.absolute,i,n=>{if(n)return t(),this[dn](n,e);let s=1,o=a=>{--s==0&&(t(),this[xf](),e.resume())};e.mtime&&!this.noMtime&&(s++,$t.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[oC](e)&&(s++,$t.chown(e.absolute,this[aC](e),this[AC](e),o)),o()})}[m6](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[d6](e,t){this[GB](e,e.linkpath,"symlink",t)}[C6](e,t){this[GB](e,fA.resolve(this.cwd,e.linkpath),"link",t)}[I6](){this[YB]++}[xf](){this[YB]--,this[gR]()}[fR](e){this[xf](),e.resume()}[AR](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&process.platform!=="win32"}[aR](e){this[I6]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[p6](e,i))}[p6](e,t){this[vf](fA.dirname(e.absolute),this.dmode,i=>{if(i)return t(),this[dn](i,e);$t.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[fR](e),t()):n||this[AR](e,s)?this[hA](null,e,t):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[hA](null,e,t):$t.chmod(e.absolute,e.mode,o=>this[hA](o,e,t)):$t.rmdir(e.absolute,o=>this[hA](o,e,t)):zFe(e.absolute,o=>this[hA](o,e,t))})})}[hA](e,t,i){if(e)return this[dn](e,t);switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[lR](t,i);case"Link":return this[C6](t,i);case"SymbolicLink":return this[d6](t,i);case"Directory":case"GNUDumpDir":return this[cR](t,i)}}[GB](e,t,i,n){$t[i](t,e.absolute,s=>{if(s)return this[dn](s,e);n(),this[xf](),e.resume()})}},b6=class extends JB{constructor(e){super(e)}[aR](e){let t=this[vf](fA.dirname(e.absolute),this.dmode,qB);if(t)return this[dn](t,e);try{let i=$t.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[fR](e);if(this[AR](e,i))return this[hA](null,e,qB);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&$t.chmodSync(e.absolute,e.mode):$t.rmdirSync(e.absolute):_Fe(e.absolute),this[hA](null,e,qB)}catch(n){return this[dn](n,e)}}catch(i){return this[hA](null,e,qB)}}[lR](e,t){let i=e.mode&4095||this.fmode,n=l=>{let c;try{$t.closeSync(o)}catch(u){c=u}(l||c)&&this[dn](l||c,e)},s,o;try{o=$t.openSync(e.absolute,w6(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.on("data",l=>{try{$t.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{$t.futimesSync(o,u,g)}catch(f){try{$t.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[oC](e)){let u=this[aC](e),g=this[AC](e);try{$t.fchownSync(o,u,g)}catch(f){try{$t.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[cR](e,t){let i=e.mode&4095||this.dmode,n=this[vf](e.absolute,i);if(n)return this[dn](n,e);if(e.mtime&&!this.noMtime)try{$t.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[oC](e))try{$t.chownSync(e.absolute,this[aC](e),this[AC](e))}catch(s){}e.resume()}[vf](e,t){try{return oR.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t})}catch(i){return i}}[GB](e,t,i,n){try{$t[i+"Sync"](t,e.absolute),e.resume()}catch(s){return this[dn](s,e)}}};JB.Sync=b6;g6.exports=JB});var k6=w((Sat,Q6)=>{"use strict";var VFe=cf(),WB=hR(),S6=require("fs"),v6=wf(),x6=require("path"),Qat=Q6.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=VFe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&XFe(i,e),i.file&&i.sync?ZFe(i):i.file?$Fe(i,t):i.sync?eNe(i):tNe(i)},XFe=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||x6.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(x6.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},ZFe=r=>{let e=new WB.Sync(r),t=r.file,i=!0,n,s=S6.statSync(t),o=r.maxReadSize||16*1024*1024;new v6.ReadStreamSync(t,{readSize:o,size:s.size}).pipe(e)},$Fe=(r,e)=>{let t=new WB(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("close",o),S6.stat(n,(l,c)=>{if(l)a(l);else{let u=new v6.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},eNe=r=>new WB.Sync(r),tNe=r=>new WB(r)});var P6=w(pi=>{"use strict";pi.c=pi.create=hV();pi.r=pi.replace=XD();pi.t=pi.list=MB();pi.u=pi.update=BV();pi.x=pi.extract=k6();pi.Pack=SB();pi.Unpack=hR();pi.Parse=nC();pi.ReadEntry=Zd();pi.WriteEntry=xD();pi.Header=hf();pi.Pax=gB();pi.types=Xd()});var L6=w((kat,N6)=>{var dR;N6.exports.getContent=()=>(typeof dR=="undefined"&&(dR=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),dR)});var H6=w((CR,U6)=>{(function(r,e){typeof CR=="object"?U6.exports=e():typeof define=="function"&&define.amd?define(e):r.treeify=e()})(CR,function(){function r(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function t(n,s,o,a,l,c,u){var g="",f=0,h,p,m=a.slice(0);if(m.push([s,o])&&a.length>0&&(a.forEach(function(b,v){v>0&&(g+=(b[1]?" ":"\u2502")+" "),!p&&b[0]===s&&(p=!0)}),g+=r(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var y=e(s,c);y.forEach(function(b){h=++f===y.length,t(b,s[b],h,m,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;t(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return t(".",n,!1,[],s,o,function(l){a+=l+` -`}),a},i})});var _B=w((sAt,X6)=>{var ENe=Ks(),INe=Id(),yNe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,wNe=/^\w*$/;function BNe(r,e){if(ENe(r))return!1;var t=typeof r;return t=="number"||t=="symbol"||t=="boolean"||r==null||INe(r)?!0:wNe.test(r)||!yNe.test(r)||e!=null&&r in Object(e)}X6.exports=BNe});var VB=w((oAt,Z6)=>{var bNe=Wc(),QNe=Rn(),SNe="[object AsyncFunction]",vNe="[object Function]",xNe="[object GeneratorFunction]",kNe="[object Proxy]";function PNe(r){if(!QNe(r))return!1;var e=bNe(r);return e==vNe||e==xNe||e==SNe||e==kNe}Z6.exports=PNe});var e7=w((aAt,$6)=>{var DNe=Ns(),RNe=DNe["__core-js_shared__"];$6.exports=RNe});var i7=w((AAt,t7)=>{var QR=e7(),r7=function(){var r=/[^.]+$/.exec(QR&&QR.keys&&QR.keys.IE_PROTO||"");return r?"Symbol(src)_1."+r:""}();function FNe(r){return!!r7&&r7 in r}t7.exports=FNe});var SR=w((lAt,n7)=>{var NNe=Function.prototype,LNe=NNe.toString;function TNe(r){if(r!=null){try{return LNe.call(r)}catch(e){}try{return r+""}catch(e){}}return""}n7.exports=TNe});var o7=w((cAt,s7)=>{var ONe=VB(),MNe=i7(),KNe=Rn(),UNe=SR(),HNe=/[\\^$.*+?()[\]{}|]/g,jNe=/^\[object .+?Constructor\]$/,GNe=Function.prototype,YNe=Object.prototype,qNe=GNe.toString,JNe=YNe.hasOwnProperty,WNe=RegExp("^"+qNe.call(JNe).replace(HNe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function zNe(r){if(!KNe(r)||MNe(r))return!1;var e=ONe(r)?WNe:jNe;return e.test(UNe(r))}s7.exports=zNe});var A7=w((uAt,a7)=>{function _Ne(r,e){return r==null?void 0:r[e]}a7.exports=_Ne});var Rl=w((gAt,l7)=>{var VNe=o7(),XNe=A7();function ZNe(r,e){var t=XNe(r,e);return VNe(t)?t:void 0}l7.exports=ZNe});var cC=w((fAt,c7)=>{var $Ne=Rl(),eLe=$Ne(Object,"create");c7.exports=eLe});var f7=w((hAt,u7)=>{var g7=cC();function tLe(){this.__data__=g7?g7(null):{},this.size=0}u7.exports=tLe});var p7=w((pAt,h7)=>{function rLe(r){var e=this.has(r)&&delete this.__data__[r];return this.size-=e?1:0,e}h7.exports=rLe});var C7=w((dAt,d7)=>{var iLe=cC(),nLe="__lodash_hash_undefined__",sLe=Object.prototype,oLe=sLe.hasOwnProperty;function aLe(r){var e=this.__data__;if(iLe){var t=e[r];return t===nLe?void 0:t}return oLe.call(e,r)?e[r]:void 0}d7.exports=aLe});var E7=w((CAt,m7)=>{var ALe=cC(),lLe=Object.prototype,cLe=lLe.hasOwnProperty;function uLe(r){var e=this.__data__;return ALe?e[r]!==void 0:cLe.call(e,r)}m7.exports=uLe});var y7=w((mAt,I7)=>{var gLe=cC(),fLe="__lodash_hash_undefined__";function hLe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,t[r]=gLe&&e===void 0?fLe:e,this}I7.exports=hLe});var B7=w((EAt,w7)=>{var pLe=f7(),dLe=p7(),CLe=C7(),mLe=E7(),ELe=y7();function kf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{function ILe(){this.__data__=[],this.size=0}b7.exports=ILe});var Pf=w((yAt,S7)=>{function yLe(r,e){return r===e||r!==r&&e!==e}S7.exports=yLe});var uC=w((wAt,v7)=>{var wLe=Pf();function BLe(r,e){for(var t=r.length;t--;)if(wLe(r[t][0],e))return t;return-1}v7.exports=BLe});var k7=w((BAt,x7)=>{var bLe=uC(),QLe=Array.prototype,SLe=QLe.splice;function vLe(r){var e=this.__data__,t=bLe(e,r);if(t<0)return!1;var i=e.length-1;return t==i?e.pop():SLe.call(e,t,1),--this.size,!0}x7.exports=vLe});var D7=w((bAt,P7)=>{var xLe=uC();function kLe(r){var e=this.__data__,t=xLe(e,r);return t<0?void 0:e[t][1]}P7.exports=kLe});var F7=w((QAt,R7)=>{var PLe=uC();function DLe(r){return PLe(this.__data__,r)>-1}R7.exports=DLe});var L7=w((SAt,N7)=>{var RLe=uC();function FLe(r,e){var t=this.__data__,i=RLe(t,r);return i<0?(++this.size,t.push([r,e])):t[i][1]=e,this}N7.exports=FLe});var gC=w((vAt,T7)=>{var NLe=Q7(),LLe=k7(),TLe=D7(),OLe=F7(),MLe=L7();function Df(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var KLe=Rl(),ULe=Ns(),HLe=KLe(ULe,"Map");O7.exports=HLe});var U7=w((kAt,M7)=>{var K7=B7(),jLe=gC(),GLe=XB();function YLe(){this.size=0,this.__data__={hash:new K7,map:new(GLe||jLe),string:new K7}}M7.exports=YLe});var j7=w((PAt,H7)=>{function qLe(r){var e=typeof r;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?r!=="__proto__":r===null}H7.exports=qLe});var fC=w((DAt,G7)=>{var JLe=j7();function WLe(r,e){var t=r.__data__;return JLe(e)?t[typeof e=="string"?"string":"hash"]:t.map}G7.exports=WLe});var q7=w((RAt,Y7)=>{var zLe=fC();function _Le(r){var e=zLe(this,r).delete(r);return this.size-=e?1:0,e}Y7.exports=_Le});var W7=w((FAt,J7)=>{var VLe=fC();function XLe(r){return VLe(this,r).get(r)}J7.exports=XLe});var _7=w((NAt,z7)=>{var ZLe=fC();function $Le(r){return ZLe(this,r).has(r)}z7.exports=$Le});var X7=w((LAt,V7)=>{var eTe=fC();function tTe(r,e){var t=eTe(this,r),i=t.size;return t.set(r,e),this.size+=t.size==i?0:1,this}V7.exports=tTe});var ZB=w((TAt,Z7)=>{var rTe=U7(),iTe=q7(),nTe=W7(),sTe=_7(),oTe=X7();function Rf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var eX=ZB(),aTe="Expected a function";function vR(r,e){if(typeof r!="function"||e!=null&&typeof e!="function")throw new TypeError(aTe);var t=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=t.cache;if(s.has(n))return s.get(n);var o=r.apply(this,i);return t.cache=s.set(n,o)||s,o};return t.cache=new(vR.Cache||eX),t}vR.Cache=eX;$7.exports=vR});var iX=w((MAt,rX)=>{var ATe=tX(),lTe=500;function cTe(r){var e=ATe(r,function(i){return t.size===lTe&&t.clear(),i}),t=e.cache;return e}rX.exports=cTe});var sX=w((KAt,nX)=>{var uTe=iX(),gTe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,fTe=/\\(\\)?/g,hTe=uTe(function(r){var e=[];return r.charCodeAt(0)===46&&e.push(""),r.replace(gTe,function(t,i,n,s){e.push(n?s.replace(fTe,"$1"):i||t)}),e});nX.exports=hTe});var Ff=w((UAt,oX)=>{var pTe=Ks(),dTe=_B(),CTe=sX(),mTe=lf();function ETe(r,e){return pTe(r)?r:dTe(r,e)?[r]:CTe(mTe(r))}oX.exports=ETe});var gu=w((HAt,aX)=>{var ITe=Id(),yTe=1/0;function wTe(r){if(typeof r=="string"||ITe(r))return r;var e=r+"";return e=="0"&&1/r==-yTe?"-0":e}aX.exports=wTe});var hC=w((jAt,AX)=>{var BTe=Ff(),bTe=gu();function QTe(r,e){e=BTe(e,r);for(var t=0,i=e.length;r!=null&&t{var STe=Rl(),vTe=function(){try{var r=STe(Object,"defineProperty");return r({},"",{}),r}catch(e){}}();lX.exports=vTe});var Nf=w((YAt,cX)=>{var uX=xR();function xTe(r,e,t){e=="__proto__"&&uX?uX(r,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):r[e]=t}cX.exports=xTe});var $B=w((qAt,gX)=>{var kTe=Nf(),PTe=Pf(),DTe=Object.prototype,RTe=DTe.hasOwnProperty;function FTe(r,e,t){var i=r[e];(!(RTe.call(r,e)&&PTe(i,t))||t===void 0&&!(e in r))&&kTe(r,e,t)}gX.exports=FTe});var pC=w((JAt,fX)=>{var NTe=9007199254740991,LTe=/^(?:0|[1-9]\d*)$/;function TTe(r,e){var t=typeof r;return e=e==null?NTe:e,!!e&&(t=="number"||t!="symbol"&<e.test(r))&&r>-1&&r%1==0&&r{var OTe=$B(),MTe=Ff(),KTe=pC(),pX=Rn(),UTe=gu();function HTe(r,e,t,i){if(!pX(r))return r;e=MTe(e,r);for(var n=-1,s=e.length,o=s-1,a=r;a!=null&&++n{var jTe=hC(),GTe=kR(),YTe=Ff();function qTe(r,e,t){for(var i=-1,n=e.length,s={};++i{function JTe(r,e){return r!=null&&e in Object(r)}mX.exports=JTe});var yX=w((VAt,IX)=>{var WTe=Wc(),zTe=ta(),_Te="[object Arguments]";function VTe(r){return zTe(r)&&WTe(r)==_Te}IX.exports=VTe});var dC=w((XAt,wX)=>{var BX=yX(),XTe=ta(),bX=Object.prototype,ZTe=bX.hasOwnProperty,$Te=bX.propertyIsEnumerable,eOe=BX(function(){return arguments}())?BX:function(r){return XTe(r)&&ZTe.call(r,"callee")&&!$Te.call(r,"callee")};wX.exports=eOe});var e0=w((ZAt,QX)=>{var tOe=9007199254740991;function rOe(r){return typeof r=="number"&&r>-1&&r%1==0&&r<=tOe}QX.exports=rOe});var PR=w(($At,SX)=>{var iOe=Ff(),nOe=dC(),sOe=Ks(),oOe=pC(),aOe=e0(),AOe=gu();function lOe(r,e,t){e=iOe(e,r);for(var i=-1,n=e.length,s=!1;++i{var cOe=EX(),uOe=PR();function gOe(r,e){return r!=null&&uOe(r,e,cOe)}vX.exports=gOe});var kX=w((tlt,xX)=>{var fOe=CX(),hOe=DR();function pOe(r,e){return fOe(r,e,function(t,i){return hOe(r,i)})}xX.exports=pOe});var t0=w((rlt,PX)=>{function dOe(r,e){for(var t=-1,i=e.length,n=r.length;++t{var RX=Jc(),COe=dC(),mOe=Ks(),FX=RX?RX.isConcatSpreadable:void 0;function EOe(r){return mOe(r)||COe(r)||!!(FX&&r&&r[FX])}DX.exports=EOe});var OX=w((nlt,LX)=>{var IOe=t0(),yOe=NX();function TX(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=yOe),n||(n=[]);++s0&&t(a)?e>1?TX(a,e-1,t,i,n):IOe(n,a):i||(n[n.length]=a)}return n}LX.exports=TX});var KX=w((slt,MX)=>{var wOe=OX();function BOe(r){var e=r==null?0:r.length;return e?wOe(r,1):[]}MX.exports=BOe});var HX=w((olt,UX)=>{function bOe(r,e,t){switch(t.length){case 0:return r.call(e);case 1:return r.call(e,t[0]);case 2:return r.call(e,t[0],t[1]);case 3:return r.call(e,t[0],t[1],t[2])}return r.apply(e,t)}UX.exports=bOe});var RR=w((alt,jX)=>{var QOe=HX(),GX=Math.max;function SOe(r,e,t){return e=GX(e===void 0?r.length-1:e,0),function(){for(var i=arguments,n=-1,s=GX(i.length-e,0),o=Array(s);++n{function vOe(r){return function(){return r}}YX.exports=vOe});var r0=w((llt,JX)=>{function xOe(r){return r}JX.exports=xOe});var _X=w((clt,WX)=>{var kOe=qX(),zX=xR(),POe=r0(),DOe=zX?function(r,e){return zX(r,"toString",{configurable:!0,enumerable:!1,value:kOe(e),writable:!0})}:POe;WX.exports=DOe});var XX=w((ult,VX)=>{var ROe=800,FOe=16,NOe=Date.now;function LOe(r){var e=0,t=0;return function(){var i=NOe(),n=FOe-(i-t);if(t=i,n>0){if(++e>=ROe)return arguments[0]}else e=0;return r.apply(void 0,arguments)}}VX.exports=LOe});var FR=w((glt,ZX)=>{var TOe=_X(),OOe=XX(),MOe=OOe(TOe);ZX.exports=MOe});var eZ=w((flt,$X)=>{var KOe=KX(),UOe=RR(),HOe=FR();function jOe(r){return HOe(UOe(r,void 0,KOe),r+"")}$X.exports=jOe});var rZ=w((hlt,tZ)=>{var GOe=kX(),YOe=eZ(),qOe=YOe(function(r,e){return r==null?{}:GOe(r,e)});tZ.exports=qOe});var hZ=w((uut,uZ)=>{"use strict";var GR;try{GR=Map}catch(r){}var YR;try{YR=Set}catch(r){}function gZ(r,e,t){if(!r||typeof r!="object"||typeof r=="function")return r;if(r.nodeType&&"cloneNode"in r)return r.cloneNode(!0);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r);if(Array.isArray(r))return r.map(fZ);if(GR&&r instanceof GR)return new Map(Array.from(r.entries()));if(YR&&r instanceof YR)return new Set(Array.from(r.values()));if(r instanceof Object){e.push(r);var i=Object.create(r);t.push(i);for(var n in r){var s=e.findIndex(function(o){return o===r[n]});i[n]=s>-1?t[s]:gZ(r[n],e,t)}return i}return r}function fZ(r){return gZ(r,[],[])}uZ.exports=fZ});var IC=w(qR=>{"use strict";Object.defineProperty(qR,"__esModule",{value:!0});qR.default=eMe;var tMe=Object.prototype.toString,rMe=Error.prototype.toString,iMe=RegExp.prototype.toString,nMe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",sMe=/^Symbol\((.*)\)(.*)$/;function oMe(r){return r!=+r?"NaN":r===0&&1/r<0?"-0":""+r}function pZ(r,e=!1){if(r==null||r===!0||r===!1)return""+r;let t=typeof r;if(t==="number")return oMe(r);if(t==="string")return e?`"${r}"`:r;if(t==="function")return"[Function "+(r.name||"anonymous")+"]";if(t==="symbol")return nMe.call(r).replace(sMe,"Symbol($1)");let i=tMe.call(r).slice(8,-1);return i==="Date"?isNaN(r.getTime())?""+r:r.toISOString(r):i==="Error"||r instanceof Error?"["+rMe.call(r)+"]":i==="RegExp"?iMe.call(r):null}function eMe(r,e){let t=pZ(r,e);return t!==null?t:JSON.stringify(r,function(i,n){let s=pZ(this[i],e);return s!==null?s:n},2)}});var CA=w(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.default=bi.array=bi.object=bi.boolean=bi.date=bi.number=bi.string=bi.mixed=void 0;var dZ=aMe(IC());function aMe(r){return r&&r.__esModule?r:{default:r}}var CZ={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:r,type:e,value:t,originalValue:i})=>{let n=i!=null&&i!==t,s=`${r} must be a \`${e}\` type, but the final value was: \`${(0,dZ.default)(t,!0)}\``+(n?` (cast from the value \`${(0,dZ.default)(i,!0)}\`).`:".");return t===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};bi.mixed=CZ;var mZ={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};bi.string=mZ;var EZ={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};bi.number=EZ;var IZ={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};bi.date=IZ;var yZ={isValue:"${path} field must be ${value}"};bi.boolean=yZ;var wZ={noUnknown:"${path} field has unspecified keys: ${unknown}"};bi.object=wZ;var BZ={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};bi.array=BZ;var AMe=Object.assign(Object.create(null),{mixed:CZ,string:mZ,number:EZ,date:IZ,object:wZ,array:BZ,boolean:yZ});bi.default=AMe});var QZ=w((hut,bZ)=>{var lMe=Object.prototype,cMe=lMe.hasOwnProperty;function uMe(r,e){return r!=null&&cMe.call(r,e)}bZ.exports=uMe});var yC=w((put,SZ)=>{var gMe=QZ(),fMe=PR();function hMe(r,e){return r!=null&&fMe(r,e,gMe)}SZ.exports=hMe});var Tf=w(o0=>{"use strict";Object.defineProperty(o0,"__esModule",{value:!0});o0.default=void 0;var pMe=r=>r&&r.__isYupSchema__;o0.default=pMe});var kZ=w(a0=>{"use strict";Object.defineProperty(a0,"__esModule",{value:!0});a0.default=void 0;var dMe=vZ(yC()),CMe=vZ(Tf());function vZ(r){return r&&r.__esModule?r:{default:r}}var xZ=class{constructor(e,t){if(this.refs=e,this.refs=e,typeof t=="function"){this.fn=t;return}if(!(0,dMe.default)(t,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=t,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,t){let i=this.refs.map(s=>s.getValue(t==null?void 0:t.value,t==null?void 0:t.parent,t==null?void 0:t.context)),n=this.fn.apply(e,i.concat(e,t));if(n===void 0||n===e)return e;if(!(0,CMe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(t)}},mMe=xZ;a0.default=mMe});var WR=w(JR=>{"use strict";Object.defineProperty(JR,"__esModule",{value:!0});JR.default=EMe;function EMe(r){return r==null?[]:[].concat(r)}});var fu=w(A0=>{"use strict";Object.defineProperty(A0,"__esModule",{value:!0});A0.default=void 0;var IMe=PZ(IC()),yMe=PZ(WR());function PZ(r){return r&&r.__esModule?r:{default:r}}function zR(){return zR=Object.assign||function(r){for(var e=1;e(0,IMe.default)(t[s])):typeof e=="function"?e(t):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,t,i,n){super();this.name="ValidationError",this.value=t,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,yMe.default)(e).forEach(s=>{wC.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,wC)}};A0.default=wC});var l0=w(_R=>{"use strict";Object.defineProperty(_R,"__esModule",{value:!0});_R.default=BMe;var VR=bMe(fu());function bMe(r){return r&&r.__esModule?r:{default:r}}var QMe=r=>{let e=!1;return(...t)=>{e||(e=!0,r(...t))}};function BMe(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,path:l}=r,c=QMe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new VR.default(o,s,l)):c(null,s);for(let f=0;f{function SMe(r){return function(e,t,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[r?a:++n];if(t(s[l],l,s)===!1)break}return e}}DZ.exports=SMe});var XR=w((wut,FZ)=>{var vMe=RZ(),xMe=vMe();FZ.exports=xMe});var LZ=w((But,NZ)=>{function kMe(r,e){for(var t=-1,i=Array(r);++t{function PMe(){return!1}TZ.exports=PMe});var bC=w((BC,Of)=>{var DMe=Ns(),RMe=OZ(),MZ=typeof BC=="object"&&BC&&!BC.nodeType&&BC,KZ=MZ&&typeof Of=="object"&&Of&&!Of.nodeType&&Of,FMe=KZ&&KZ.exports===MZ,UZ=FMe?DMe.Buffer:void 0,NMe=UZ?UZ.isBuffer:void 0,LMe=NMe||RMe;Of.exports=LMe});var jZ=w((Qut,HZ)=>{var TMe=Wc(),OMe=e0(),MMe=ta(),KMe="[object Arguments]",UMe="[object Array]",HMe="[object Boolean]",jMe="[object Date]",GMe="[object Error]",YMe="[object Function]",qMe="[object Map]",JMe="[object Number]",WMe="[object Object]",zMe="[object RegExp]",_Me="[object Set]",VMe="[object String]",XMe="[object WeakMap]",ZMe="[object ArrayBuffer]",$Me="[object DataView]",e1e="[object Float32Array]",t1e="[object Float64Array]",r1e="[object Int8Array]",i1e="[object Int16Array]",n1e="[object Int32Array]",s1e="[object Uint8Array]",o1e="[object Uint8ClampedArray]",a1e="[object Uint16Array]",A1e="[object Uint32Array]",wr={};wr[e1e]=wr[t1e]=wr[r1e]=wr[i1e]=wr[n1e]=wr[s1e]=wr[o1e]=wr[a1e]=wr[A1e]=!0;wr[KMe]=wr[UMe]=wr[ZMe]=wr[HMe]=wr[$Me]=wr[jMe]=wr[GMe]=wr[YMe]=wr[qMe]=wr[JMe]=wr[WMe]=wr[zMe]=wr[_Me]=wr[VMe]=wr[XMe]=!1;function l1e(r){return MMe(r)&&OMe(r.length)&&!!wr[TMe(r)]}HZ.exports=l1e});var c0=w((Sut,GZ)=>{function c1e(r){return function(e){return r(e)}}GZ.exports=c1e});var u0=w((QC,Mf)=>{var u1e=rk(),YZ=typeof QC=="object"&&QC&&!QC.nodeType&&QC,SC=YZ&&typeof Mf=="object"&&Mf&&!Mf.nodeType&&Mf,g1e=SC&&SC.exports===YZ,ZR=g1e&&u1e.process,f1e=function(){try{var r=SC&&SC.require&&SC.require("util").types;return r||ZR&&ZR.binding&&ZR.binding("util")}catch(e){}}();Mf.exports=f1e});var g0=w((vut,qZ)=>{var h1e=jZ(),p1e=c0(),JZ=u0(),WZ=JZ&&JZ.isTypedArray,d1e=WZ?p1e(WZ):h1e;qZ.exports=d1e});var $R=w((xut,zZ)=>{var C1e=LZ(),m1e=dC(),E1e=Ks(),I1e=bC(),y1e=pC(),w1e=g0(),B1e=Object.prototype,b1e=B1e.hasOwnProperty;function Q1e(r,e){var t=E1e(r),i=!t&&m1e(r),n=!t&&!i&&I1e(r),s=!t&&!i&&!n&&w1e(r),o=t||i||n||s,a=o?C1e(r.length,String):[],l=a.length;for(var c in r)(e||b1e.call(r,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||y1e(c,l)))&&a.push(c);return a}zZ.exports=Q1e});var f0=w((kut,_Z)=>{var S1e=Object.prototype;function v1e(r){var e=r&&r.constructor,t=typeof e=="function"&&e.prototype||S1e;return r===t}_Z.exports=v1e});var eF=w((Put,VZ)=>{function x1e(r,e){return function(t){return r(e(t))}}VZ.exports=x1e});var ZZ=w((Dut,XZ)=>{var k1e=eF(),P1e=k1e(Object.keys,Object);XZ.exports=P1e});var e$=w((Rut,$Z)=>{var D1e=f0(),R1e=ZZ(),F1e=Object.prototype,N1e=F1e.hasOwnProperty;function L1e(r){if(!D1e(r))return R1e(r);var e=[];for(var t in Object(r))N1e.call(r,t)&&t!="constructor"&&e.push(t);return e}$Z.exports=L1e});var vC=w((Fut,t$)=>{var T1e=VB(),O1e=e0();function M1e(r){return r!=null&&O1e(r.length)&&!T1e(r)}t$.exports=M1e});var Kf=w((Nut,r$)=>{var K1e=$R(),U1e=e$(),H1e=vC();function j1e(r){return H1e(r)?K1e(r):U1e(r)}r$.exports=j1e});var tF=w((Lut,i$)=>{var G1e=XR(),Y1e=Kf();function q1e(r,e){return r&&G1e(r,e,Y1e)}i$.exports=q1e});var s$=w((Tut,n$)=>{var J1e=gC();function W1e(){this.__data__=new J1e,this.size=0}n$.exports=W1e});var a$=w((Out,o$)=>{function z1e(r){var e=this.__data__,t=e.delete(r);return this.size=e.size,t}o$.exports=z1e});var l$=w((Mut,A$)=>{function _1e(r){return this.__data__.get(r)}A$.exports=_1e});var u$=w((Kut,c$)=>{function V1e(r){return this.__data__.has(r)}c$.exports=V1e});var f$=w((Uut,g$)=>{var X1e=gC(),Z1e=XB(),$1e=ZB(),eKe=200;function tKe(r,e){var t=this.__data__;if(t instanceof X1e){var i=t.__data__;if(!Z1e||i.length{var rKe=gC(),iKe=s$(),nKe=a$(),sKe=l$(),oKe=u$(),aKe=f$();function Uf(r){var e=this.__data__=new rKe(r);this.size=e.size}Uf.prototype.clear=iKe;Uf.prototype.delete=nKe;Uf.prototype.get=sKe;Uf.prototype.has=oKe;Uf.prototype.set=aKe;h$.exports=Uf});var d$=w((jut,p$)=>{var AKe="__lodash_hash_undefined__";function lKe(r){return this.__data__.set(r,AKe),this}p$.exports=lKe});var m$=w((Gut,C$)=>{function cKe(r){return this.__data__.has(r)}C$.exports=cKe});var I$=w((Yut,E$)=>{var uKe=ZB(),gKe=d$(),fKe=m$();function h0(r){var e=-1,t=r==null?0:r.length;for(this.__data__=new uKe;++e{function hKe(r,e){for(var t=-1,i=r==null?0:r.length;++t{function pKe(r,e){return r.has(e)}B$.exports=pKe});var rF=w((Wut,Q$)=>{var dKe=I$(),CKe=w$(),mKe=b$(),EKe=1,IKe=2;function yKe(r,e,t,i,n,s){var o=t&EKe,a=r.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(r),u=s.get(e);if(c&&u)return c==e&&u==r;var g=-1,f=!0,h=t&IKe?new dKe:void 0;for(s.set(r,e),s.set(e,r);++g{var wKe=Ns(),BKe=wKe.Uint8Array;S$.exports=BKe});var x$=w((_ut,v$)=>{function bKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i,n){t[++e]=[n,i]}),t}v$.exports=bKe});var P$=w((Vut,k$)=>{function QKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i){t[++e]=i}),t}k$.exports=QKe});var L$=w((Xut,D$)=>{var R$=Jc(),F$=iF(),SKe=Pf(),vKe=rF(),xKe=x$(),kKe=P$(),PKe=1,DKe=2,RKe="[object Boolean]",FKe="[object Date]",NKe="[object Error]",LKe="[object Map]",TKe="[object Number]",OKe="[object RegExp]",MKe="[object Set]",KKe="[object String]",UKe="[object Symbol]",HKe="[object ArrayBuffer]",jKe="[object DataView]",N$=R$?R$.prototype:void 0,nF=N$?N$.valueOf:void 0;function GKe(r,e,t,i,n,s,o){switch(t){case jKe:if(r.byteLength!=e.byteLength||r.byteOffset!=e.byteOffset)return!1;r=r.buffer,e=e.buffer;case HKe:return!(r.byteLength!=e.byteLength||!s(new F$(r),new F$(e)));case RKe:case FKe:case TKe:return SKe(+r,+e);case NKe:return r.name==e.name&&r.message==e.message;case OKe:case KKe:return r==e+"";case LKe:var a=xKe;case MKe:var l=i&PKe;if(a||(a=kKe),r.size!=e.size&&!l)return!1;var c=o.get(r);if(c)return c==e;i|=DKe,o.set(r,e);var u=vKe(a(r),a(e),i,n,s,o);return o.delete(r),u;case UKe:if(nF)return nF.call(r)==nF.call(e)}return!1}D$.exports=GKe});var sF=w((Zut,T$)=>{var YKe=t0(),qKe=Ks();function JKe(r,e,t){var i=e(r);return qKe(r)?i:YKe(i,t(r))}T$.exports=JKe});var M$=w(($ut,O$)=>{function WKe(r,e){for(var t=-1,i=r==null?0:r.length,n=0,s=[];++t{function zKe(){return[]}K$.exports=zKe});var p0=w((tgt,U$)=>{var _Ke=M$(),VKe=oF(),XKe=Object.prototype,ZKe=XKe.propertyIsEnumerable,H$=Object.getOwnPropertySymbols,$Ke=H$?function(r){return r==null?[]:(r=Object(r),_Ke(H$(r),function(e){return ZKe.call(r,e)}))}:VKe;U$.exports=$Ke});var aF=w((rgt,j$)=>{var eUe=sF(),tUe=p0(),rUe=Kf();function iUe(r){return eUe(r,rUe,tUe)}j$.exports=iUe});var q$=w((igt,G$)=>{var Y$=aF(),nUe=1,sUe=Object.prototype,oUe=sUe.hasOwnProperty;function aUe(r,e,t,i,n,s){var o=t&nUe,a=Y$(r),l=a.length,c=Y$(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:oUe.call(e,f)))return!1}var h=s.get(r),p=s.get(e);if(h&&p)return h==e&&p==r;var m=!0;s.set(r,e),s.set(e,r);for(var y=o;++g{var AUe=Rl(),lUe=Ns(),cUe=AUe(lUe,"DataView");J$.exports=cUe});var _$=w((sgt,z$)=>{var uUe=Rl(),gUe=Ns(),fUe=uUe(gUe,"Promise");z$.exports=fUe});var X$=w((ogt,V$)=>{var hUe=Rl(),pUe=Ns(),dUe=hUe(pUe,"Set");V$.exports=dUe});var $$=w((agt,Z$)=>{var CUe=Rl(),mUe=Ns(),EUe=CUe(mUe,"WeakMap");Z$.exports=EUe});var kC=w((Agt,eee)=>{var AF=W$(),lF=XB(),cF=_$(),uF=X$(),gF=$$(),tee=Wc(),Hf=SR(),ree="[object Map]",IUe="[object Object]",iee="[object Promise]",nee="[object Set]",see="[object WeakMap]",oee="[object DataView]",yUe=Hf(AF),wUe=Hf(lF),BUe=Hf(cF),bUe=Hf(uF),QUe=Hf(gF),hu=tee;(AF&&hu(new AF(new ArrayBuffer(1)))!=oee||lF&&hu(new lF)!=ree||cF&&hu(cF.resolve())!=iee||uF&&hu(new uF)!=nee||gF&&hu(new gF)!=see)&&(hu=function(r){var e=tee(r),t=e==IUe?r.constructor:void 0,i=t?Hf(t):"";if(i)switch(i){case yUe:return oee;case wUe:return ree;case BUe:return iee;case bUe:return nee;case QUe:return see}return e});eee.exports=hu});var hee=w((lgt,aee)=>{var fF=xC(),SUe=rF(),vUe=L$(),xUe=q$(),Aee=kC(),lee=Ks(),cee=bC(),kUe=g0(),PUe=1,uee="[object Arguments]",gee="[object Array]",d0="[object Object]",DUe=Object.prototype,fee=DUe.hasOwnProperty;function RUe(r,e,t,i,n,s){var o=lee(r),a=lee(e),l=o?gee:Aee(r),c=a?gee:Aee(e);l=l==uee?d0:l,c=c==uee?d0:c;var u=l==d0,g=c==d0,f=l==c;if(f&&cee(r)){if(!cee(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new fF),o||kUe(r)?SUe(r,e,t,i,n,s):vUe(r,e,l,t,i,n,s);if(!(t&PUe)){var h=u&&fee.call(r,"__wrapped__"),p=g&&fee.call(e,"__wrapped__");if(h||p){var m=h?r.value():r,y=p?e.value():e;return s||(s=new fF),n(m,y,t,i,s)}}return f?(s||(s=new fF),xUe(r,e,t,i,n,s)):!1}aee.exports=RUe});var hF=w((cgt,pee)=>{var FUe=hee(),dee=ta();function Cee(r,e,t,i,n){return r===e?!0:r==null||e==null||!dee(r)&&!dee(e)?r!==r&&e!==e:FUe(r,e,t,i,Cee,n)}pee.exports=Cee});var Eee=w((ugt,mee)=>{var NUe=xC(),LUe=hF(),TUe=1,OUe=2;function MUe(r,e,t,i){var n=t.length,s=n,o=!i;if(r==null)return!s;for(r=Object(r);n--;){var a=t[n];if(o&&a[2]?a[1]!==r[a[0]]:!(a[0]in r))return!1}for(;++n{var KUe=Rn();function UUe(r){return r===r&&!KUe(r)}Iee.exports=UUe});var wee=w((fgt,yee)=>{var HUe=pF(),jUe=Kf();function GUe(r){for(var e=jUe(r),t=e.length;t--;){var i=e[t],n=r[i];e[t]=[i,n,HUe(n)]}return e}yee.exports=GUe});var dF=w((hgt,Bee)=>{function YUe(r,e){return function(t){return t==null?!1:t[r]===e&&(e!==void 0||r in Object(t))}}Bee.exports=YUe});var Qee=w((pgt,bee)=>{var qUe=Eee(),JUe=wee(),WUe=dF();function zUe(r){var e=JUe(r);return e.length==1&&e[0][2]?WUe(e[0][0],e[0][1]):function(t){return t===r||qUe(t,r,e)}}bee.exports=zUe});var C0=w((dgt,See)=>{var _Ue=hC();function VUe(r,e,t){var i=r==null?void 0:_Ue(r,e);return i===void 0?t:i}See.exports=VUe});var xee=w((Cgt,vee)=>{var XUe=hF(),ZUe=C0(),$Ue=DR(),e2e=_B(),t2e=pF(),r2e=dF(),i2e=gu(),n2e=1,s2e=2;function o2e(r,e){return e2e(r)&&t2e(e)?r2e(i2e(r),e):function(t){var i=ZUe(t,r);return i===void 0&&i===e?$Ue(t,r):XUe(e,i,n2e|s2e)}}vee.exports=o2e});var Pee=w((mgt,kee)=>{function a2e(r){return function(e){return e==null?void 0:e[r]}}kee.exports=a2e});var Ree=w((Egt,Dee)=>{var A2e=hC();function l2e(r){return function(e){return A2e(e,r)}}Dee.exports=l2e});var Nee=w((Igt,Fee)=>{var c2e=Pee(),u2e=Ree(),g2e=_B(),f2e=gu();function h2e(r){return g2e(r)?c2e(f2e(r)):u2e(r)}Fee.exports=h2e});var CF=w((ygt,Lee)=>{var p2e=Qee(),d2e=xee(),C2e=r0(),m2e=Ks(),E2e=Nee();function I2e(r){return typeof r=="function"?r:r==null?C2e:typeof r=="object"?m2e(r)?d2e(r[0],r[1]):p2e(r):E2e(r)}Lee.exports=I2e});var mF=w((wgt,Tee)=>{var y2e=Nf(),w2e=tF(),B2e=CF();function b2e(r,e){var t={};return e=B2e(e,3),w2e(r,function(i,n,s){y2e(t,n,e(i,n,s))}),t}Tee.exports=b2e});var PC=w((Bgt,Oee)=>{"use strict";function pu(r){this._maxSize=r,this.clear()}pu.prototype.clear=function(){this._size=0,this._values=Object.create(null)};pu.prototype.get=function(r){return this._values[r]};pu.prototype.set=function(r,e){return this._size>=this._maxSize&&this.clear(),r in this._values||this._size++,this._values[r]=e};var Q2e=/[^.^\]^[]+|(?=\[\]|\.\.)/g,Mee=/^\d+$/,S2e=/^\d/,v2e=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,x2e=/^\s*(['"]?)(.*?)(\1)\s*$/,EF=512,Kee=new pu(EF),Uee=new pu(EF),Hee=new pu(EF);Oee.exports={Cache:pu,split:yF,normalizePath:IF,setter:function(r){var e=IF(r);return Uee.get(r)||Uee.set(r,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(DC,"__esModule",{value:!0});DC.create=F2e;DC.default=void 0;var N2e=PC(),m0={context:"$",value:"."};function F2e(r,e){return new E0(r,e)}var E0=class{constructor(e,t={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===m0.context,this.isValue=this.key[0]===m0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?m0.context:this.isValue?m0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,N2e.getter)(this.path,!0),this.map=t.map}getValue(e,t,i){let n=this.isContext?i:this.isValue?e:t;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,t){return this.getValue(e,t==null?void 0:t.parent,t==null?void 0:t.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};DC.default=E0;E0.prototype.__isYupRef=!0});var jee=w(BF=>{"use strict";Object.defineProperty(BF,"__esModule",{value:!0});BF.default=L2e;var T2e=bF(mF()),I0=bF(fu()),O2e=bF(du());function bF(r){return r&&r.__esModule?r:{default:r}}function y0(){return y0=Object.assign||function(r){for(var e=1;e=0)&&(t[n]=r[n]);return t}function L2e(r){function e(t,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=t,u=M2e(t,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=r,{parent:m,context:y}=a;function b(Y){return O2e.default.isRef(Y)?Y.getValue(n,m,y):Y}function v(Y={}){let $=(0,T2e.default)(y0({value:n,originalValue:l,label:o,path:Y.path||s},h,Y.params),b),_=new I0.default(I0.default.formatError(Y.message||p,$),n,$.path,Y.type||g);return _.params=$,_}let x=y0({path:s,parent:m,type:g,createError:v,resolve:b,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(x,n,x)).then(Y=>{I0.default.isError(Y)?i(Y):Y?i(null,Y):i(v())})}catch(Y){i(Y)}return}let T;try{var q;if(T=f.call(x,n,x),typeof((q=T)==null?void 0:q.then)=="function")throw new Error(`Validation test of type: "${x.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(Y){i(Y);return}I0.default.isError(T)?i(T):T?i(null,T):i(v())}return e.OPTIONS=r,e}});var QF=w(RC=>{"use strict";Object.defineProperty(RC,"__esModule",{value:!0});RC.getIn=Gee;RC.default=void 0;var K2e=PC(),U2e=r=>r.substr(0,r.length-1).substr(1);function Gee(r,e,t,i=t){let n,s,o;return e?((0,K2e.forEach)(e,(a,l,c)=>{let u=l?U2e(a):a;if(r=r.resolve({context:i,parent:n,value:t}),r.innerType){let g=c?parseInt(u,10):0;if(t&&g>=t.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=t,t=t&&t[g],r=r.innerType}if(!c){if(!r.fields||!r.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${r._type}")`);n=t,t=t&&t[u],r=r.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:r,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:r}}var H2e=(r,e,t,i)=>Gee(r,e,t,i).schema,j2e=H2e;RC.default=j2e});var qee=w(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});w0.default=void 0;var Yee=G2e(du());function G2e(r){return r&&r.__esModule?r:{default:r}}var B0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,t]of this.refs)e.push(t.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){Yee.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){Yee.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(t(i.value)===e)return!0;return!1}clone(){let e=new B0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),t.list.forEach(n=>i.delete(n)),t.refs.forEach(n=>i.delete(n)),i}};w0.default=B0});var EA=w(b0=>{"use strict";Object.defineProperty(b0,"__esModule",{value:!0});b0.default=void 0;var Jee=mA(hZ()),jf=CA(),Y2e=mA(kZ()),Wee=mA(l0()),Q0=mA(jee()),zee=mA(IC()),q2e=mA(du()),J2e=QF(),W2e=mA(WR()),_ee=mA(fu()),Vee=mA(qee());function mA(r){return r&&r.__esModule?r:{default:r}}function Js(){return Js=Object.assign||function(r){for(var e=1;e{this.typeError(jf.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=Js({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=Js({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=(0,Jee.default)(Js({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(e.length===0)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=t,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let t=this,i=e.clone(),n=Js({},t.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=t._typeError),i._whitelistError||(i._whitelistError=t._whitelistError),i._blacklistError||(i._blacklistError=t._blacklistError),i._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),i.tests=t.tests,i.exclusiveTests=t.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let i=t.conditions;t=t.clone(),t.conditions=[],t=i.reduce((n,s)=>s.resolve(n,e),t),t=t.resolve(e)}return t}cast(e,t={}){let i=this.resolve(Js({value:e},t)),n=i._cast(e,t);if(e!==void 0&&t.assert!==!1&&i.isType(n)!==!0){let s=(0,zee.default)(e),o=(0,zee.default)(n);throw new TypeError(`The value of ${t.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". - -attempted value: ${s} -`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,t){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,t={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=t,u=e;l||(u=this._cast(u,Js({assert:!1},t)));let g={value:u,path:s,options:t,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,Wee.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,Wee.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,t,i){let n=this.resolve(Js({},t,{value:e}));return typeof i=="function"?n._validate(e,t,i):new Promise((s,o)=>n._validate(e,t,(a,l)=>{a?o(a):s(l)}))}validateSync(e,t){let i=this.resolve(Js({},t,{value:e})),n;return i._validate(e,Js({},t,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,i=>{if(_ee.default.isError(i))return!1;throw i})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(i){if(_ee.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,Jee.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return e!=null}defined(e=jf.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(t){return t!==void 0}})}required(e=jf.mixed.required){return this.clone({presence:"required"}).withMutation(t=>t.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(t=>t.OPTIONS.name!=="required"),e}nullable(e=!0){var t=this.clone({nullable:e!==!1});return t}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(e.length===1?typeof e[0]=="function"?t={test:e[0]}:t=e[0]:e.length===2?t={name:e[0],test:e[1]}:t={name:e[0],message:e[1],test:e[2]},t.message===void 0&&(t.message=jf.mixed.default),typeof t.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,Q0.default)(t),s=t.exclusive||t.name&&i.exclusiveTests[t.name]===!0;if(t.exclusive&&!t.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return t.name&&(i.exclusiveTests[t.name]=!!t.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===t.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,t){!Array.isArray(e)&&typeof e!="string"&&(t=e,e=".");let i=this.clone(),n=(0,W2e.default)(e).map(s=>new q2e.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new Y2e.default(n,t)),i}typeError(e){var t=this.clone();return t._typeError=(0,Q0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),t}oneOf(e,t=jf.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,Q0.default)({message:t,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,t=jf.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,Q0.default)({message:t,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:i}=e.spec;return{meta:i,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};b0.default=ua;ua.prototype.__isYupSchema__=!0;for(let r of["validate","validateSync"])ua.prototype[`${r}At`]=function(e,t,i={}){let{parent:n,parentPath:s,schema:o}=(0,J2e.getIn)(this,e,t,i.context);return o[r](n&&n[s],Js({},i,{parent:n,path:e}))};for(let r of["equals","is"])ua.prototype[r]=ua.prototype.oneOf;for(let r of["not","nope"])ua.prototype[r]=ua.prototype.notOneOf;ua.prototype.optional=ua.prototype.notRequired});var Zee=w(FC=>{"use strict";Object.defineProperty(FC,"__esModule",{value:!0});FC.create=Xee;FC.default=void 0;var _2e=z2e(EA());function z2e(r){return r&&r.__esModule?r:{default:r}}var SF=_2e.default,V2e=SF;FC.default=V2e;function Xee(){return new SF}Xee.prototype=SF.prototype});var Gf=w(S0=>{"use strict";Object.defineProperty(S0,"__esModule",{value:!0});S0.default=void 0;var X2e=r=>r==null;S0.default=X2e});var ite=w(NC=>{"use strict";Object.defineProperty(NC,"__esModule",{value:!0});NC.create=$ee;NC.default=void 0;var Z2e=ete(EA()),tte=CA(),rte=ete(Gf());function ete(r){return r&&r.__esModule?r:{default:r}}function $ee(){return new v0}var v0=class extends Z2e.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(t){return(0,rte.default)(t)||t===!0}})}isFalse(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(t){return(0,rte.default)(t)||t===!1}})}};NC.default=v0;$ee.prototype=v0.prototype});var ote=w(LC=>{"use strict";Object.defineProperty(LC,"__esModule",{value:!0});LC.create=nte;LC.default=void 0;var ga=CA(),IA=ste(Gf()),$2e=ste(EA());function ste(r){return r&&r.__esModule?r:{default:r}}var eHe=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,tHe=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,rHe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,iHe=r=>(0,IA.default)(r)||r===r.trim(),nHe={}.toString();function nte(){return new x0}var x0=class extends $2e.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=e!=null&&e.toString?e.toString():e;return t===nHe?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=ga.string.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,IA.default)(i)||i.length===this.resolve(e)}})}min(e,t=ga.string.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,IA.default)(i)||i.length>=this.resolve(e)}})}max(e,t=ga.string.max){return this.test({name:"max",exclusive:!0,message:t,params:{max:e},test(i){return(0,IA.default)(i)||i.length<=this.resolve(e)}})}matches(e,t){let i=!1,n,s;return t&&(typeof t=="object"?{excludeEmptyString:i=!1,message:n,name:s}=t:n=t),this.test({name:s||"matches",message:n||ga.string.matches,params:{regex:e},test:o=>(0,IA.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=ga.string.email){return this.matches(eHe,{name:"email",message:e,excludeEmptyString:!0})}url(e=ga.string.url){return this.matches(tHe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=ga.string.uuid){return this.matches(rHe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=ga.string.trim){return this.transform(t=>t!=null?t.trim():t).test({message:e,name:"trim",test:iHe})}lowercase(e=ga.string.lowercase){return this.transform(t=>(0,IA.default)(t)?t:t.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toLowerCase()})}uppercase(e=ga.string.uppercase){return this.transform(t=>(0,IA.default)(t)?t:t.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toUpperCase()})}};LC.default=x0;nte.prototype=x0.prototype});var lte=w(TC=>{"use strict";Object.defineProperty(TC,"__esModule",{value:!0});TC.create=ate;TC.default=void 0;var Cu=CA(),mu=Ate(Gf()),sHe=Ate(EA());function Ate(r){return r&&r.__esModule?r:{default:r}}var oHe=r=>r!=+r;function ate(){return new k0}var k0=class extends sHe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let t=e;if(typeof t=="string"){if(t=t.replace(/\s/g,""),t==="")return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!oHe(e)}min(e,t=Cu.number.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,mu.default)(i)||i>=this.resolve(e)}})}max(e,t=Cu.number.max){return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,mu.default)(i)||i<=this.resolve(e)}})}lessThan(e,t=Cu.number.lessThan){return this.test({message:t,name:"max",exclusive:!0,params:{less:e},test(i){return(0,mu.default)(i)||ithis.resolve(e)}})}positive(e=Cu.number.positive){return this.moreThan(0,e)}negative(e=Cu.number.negative){return this.lessThan(0,e)}integer(e=Cu.number.integer){return this.test({name:"integer",message:e,test:t=>(0,mu.default)(t)||Number.isInteger(t)})}truncate(){return this.transform(e=>(0,mu.default)(e)?e:e|0)}round(e){var t,i=["ceil","floor","round","trunc"];if(e=((t=e)==null?void 0:t.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,mu.default)(n)?n:Math[e](n))}};TC.default=k0;ate.prototype=k0.prototype});var cte=w(vF=>{"use strict";Object.defineProperty(vF,"__esModule",{value:!0});vF.default=aHe;var AHe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function aHe(r){var e=[1,4,5,6,7,10,11],t=0,i,n;if(n=AHe.exec(r)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(t=n[10]*60+n[11],n[9]==="+"&&(t=0-t)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+t,n[6],n[7]))}else i=Date.parse?Date.parse(r):NaN;return i}});var fte=w(OC=>{"use strict";Object.defineProperty(OC,"__esModule",{value:!0});OC.create=xF;OC.default=void 0;var lHe=P0(cte()),ute=CA(),gte=P0(Gf()),cHe=P0(du()),uHe=P0(EA());function P0(r){return r&&r.__esModule?r:{default:r}}var kF=new Date(""),gHe=r=>Object.prototype.toString.call(r)==="[object Date]";function xF(){return new MC}var MC=class extends uHe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,lHe.default)(e),isNaN(e)?kF:new Date(e))})})}_typeCheck(e){return gHe(e)&&!isNaN(e.getTime())}prepareParam(e,t){let i;if(cHe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${t}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,t=ute.date.min){let i=this.prepareParam(e,"min");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(n){return(0,gte.default)(n)||n>=this.resolve(i)}})}max(e,t=ute.date.max){var i=this.prepareParam(e,"max");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(n){return(0,gte.default)(n)||n<=this.resolve(i)}})}};OC.default=MC;MC.INVALID_DATE=kF;xF.prototype=MC.prototype;xF.INVALID_DATE=kF});var pte=w((Tgt,hte)=>{function fHe(r,e,t,i){var n=-1,s=r==null?0:r.length;for(i&&s&&(t=r[++n]);++n{function hHe(r){return function(e){return r==null?void 0:r[e]}}dte.exports=hHe});var Ete=w((Mgt,mte)=>{var pHe=Cte(),dHe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},CHe=pHe(dHe);mte.exports=CHe});var yte=w((Kgt,Ite)=>{var mHe=Ete(),EHe=lf(),IHe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,yHe="\\u0300-\\u036f",wHe="\\ufe20-\\ufe2f",BHe="\\u20d0-\\u20ff",bHe=yHe+wHe+BHe,QHe="["+bHe+"]",SHe=RegExp(QHe,"g");function vHe(r){return r=EHe(r),r&&r.replace(IHe,mHe).replace(SHe,"")}Ite.exports=vHe});var Bte=w((Ugt,wte)=>{var xHe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function kHe(r){return r.match(xHe)||[]}wte.exports=kHe});var Qte=w((Hgt,bte)=>{var PHe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function DHe(r){return PHe.test(r)}bte.exports=DHe});var Yte=w((jgt,Ste)=>{var vte="\\ud800-\\udfff",RHe="\\u0300-\\u036f",FHe="\\ufe20-\\ufe2f",NHe="\\u20d0-\\u20ff",LHe=RHe+FHe+NHe,xte="\\u2700-\\u27bf",kte="a-z\\xdf-\\xf6\\xf8-\\xff",THe="\\xac\\xb1\\xd7\\xf7",OHe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",MHe="\\u2000-\\u206f",KHe=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Pte="A-Z\\xc0-\\xd6\\xd8-\\xde",UHe="\\ufe0e\\ufe0f",Dte=THe+OHe+MHe+KHe,Rte="['\u2019]",Fte="["+Dte+"]",HHe="["+LHe+"]",Nte="\\d+",jHe="["+xte+"]",Lte="["+kte+"]",Tte="[^"+vte+Dte+Nte+xte+kte+Pte+"]",GHe="\\ud83c[\\udffb-\\udfff]",YHe="(?:"+HHe+"|"+GHe+")",qHe="[^"+vte+"]",Ote="(?:\\ud83c[\\udde6-\\uddff]){2}",Mte="[\\ud800-\\udbff][\\udc00-\\udfff]",Yf="["+Pte+"]",JHe="\\u200d",Kte="(?:"+Lte+"|"+Tte+")",WHe="(?:"+Yf+"|"+Tte+")",Ute="(?:"+Rte+"(?:d|ll|m|re|s|t|ve))?",Hte="(?:"+Rte+"(?:D|LL|M|RE|S|T|VE))?",jte=YHe+"?",Gte="["+UHe+"]?",zHe="(?:"+JHe+"(?:"+[qHe,Ote,Mte].join("|")+")"+Gte+jte+")*",_He="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",VHe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",XHe=Gte+jte+zHe,ZHe="(?:"+[jHe,Ote,Mte].join("|")+")"+XHe,$He=RegExp([Yf+"?"+Lte+"+"+Ute+"(?="+[Fte,Yf,"$"].join("|")+")",WHe+"+"+Hte+"(?="+[Fte,Yf+Kte,"$"].join("|")+")",Yf+"?"+Kte+"+"+Ute,Yf+"+"+Hte,VHe,_He,Nte,ZHe].join("|"),"g");function eje(r){return r.match($He)||[]}Ste.exports=eje});var Jte=w((Ggt,qte)=>{var tje=Bte(),rje=Qte(),ije=lf(),nje=Yte();function sje(r,e,t){return r=ije(r),e=t?void 0:e,e===void 0?rje(r)?nje(r):tje(r):r.match(e)||[]}qte.exports=sje});var PF=w((Ygt,Wte)=>{var oje=pte(),aje=yte(),Aje=Jte(),lje="['\u2019]",cje=RegExp(lje,"g");function uje(r){return function(e){return oje(Aje(aje(e).replace(cje,"")),r,"")}}Wte.exports=uje});var _te=w((qgt,zte)=>{var gje=PF(),fje=gje(function(r,e,t){return r+(t?"_":"")+e.toLowerCase()});zte.exports=fje});var Xte=w((Jgt,Vte)=>{var hje=Zw(),pje=PF(),dje=pje(function(r,e,t){return e=e.toLowerCase(),r+(t?hje(e):e)});Vte.exports=dje});var $te=w((Wgt,Zte)=>{var Cje=Nf(),mje=tF(),Eje=CF();function Ije(r,e){var t={};return e=Eje(e,3),mje(r,function(i,n,s){Cje(t,e(i,n,s),i)}),t}Zte.exports=Ije});var tre=w((zgt,DF)=>{DF.exports=function(r){return ere(yje(r),r)};DF.exports.array=ere;function ere(r,e){var t=r.length,i=new Array(t),n={},s=t,o=wje(e),a=Bje(r);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(r[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(m){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--t]=c}}}function yje(r){for(var e=new Set,t=0,i=r.length;t{"use strict";Object.defineProperty(RF,"__esModule",{value:!0});RF.default=bje;var Qje=D0(yC()),Sje=D0(tre()),vje=PC(),xje=D0(du()),kje=D0(Tf());function D0(r){return r&&r.__esModule?r:{default:r}}function bje(r,e=[]){let t=[],i=[];function n(s,o){var a=(0,vje.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||t.push([o,a])}for(let s in r)if((0,Qje.default)(r,s)){let o=r[s];~i.indexOf(s)||i.push(s),xje.default.isRef(o)&&o.isSibling?n(o.path,s):(0,kje.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return Sje.default.array(i,t).reverse()}});var nre=w(FF=>{"use strict";Object.defineProperty(FF,"__esModule",{value:!0});FF.default=Pje;function ire(r,e){let t=Infinity;return r.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return t=n,!0}),t}function Pje(r){return(e,t)=>ire(r,e)-ire(r,t)}});var ure=w(KC=>{"use strict";Object.defineProperty(KC,"__esModule",{value:!0});KC.create=sre;KC.default=void 0;var ore=fa(yC()),are=fa(_te()),Dje=fa(Xte()),Rje=fa($te()),Fje=fa(mF()),Nje=PC(),Are=CA(),Lje=fa(rre()),lre=fa(nre()),Tje=fa(l0()),Oje=fa(fu()),NF=fa(EA());function fa(r){return r&&r.__esModule?r:{default:r}}function qf(){return qf=Object.assign||function(r){for(var e=1;eObject.prototype.toString.call(r)==="[object Object]";function Mje(r,e){let t=Object.keys(r.fields);return Object.keys(e).filter(i=>t.indexOf(i)===-1)}var Kje=(0,lre.default)([]),R0=class extends NF.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=Kje,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return cre(e)||typeof e=="function"}_cast(e,t={}){var i;let n=super._cast(e,t);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=t.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=qf({},t,{parent:l,__validating:t.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,ore.default)(n,g);if(f){let p,m=n[g];c.path=(t.path?`${t.path}.`:"")+g,f=f.resolve({value:m,context:t.context,parent:l});let y="spec"in f?f.spec:void 0,b=y==null?void 0:y.strict;if(y==null?void 0:y.strip){u=u||g in n;continue}p=!t.__validating||!b?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,t={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=t;o=[{schema:this,value:a},...o],t.__validating=!0,t.originalValue=a,t.from=o,super._validate(e,t,(u,g)=>{if(u){if(!Oje.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!cre(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,m)=>{let y=h.indexOf(".")===-1?(t.path?`${t.path}.`:"")+h:`${t.path||""}["${h}"]`,b=this.fields[h];if(b&&"validate"in b){b.validate(g[h],qf({},t,{path:y,from:o,strict:!0,parent:g,originalValue:a[h]}),m);return}m(null)});(0,Tje.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:t.path},i)})}clone(e){let t=super.clone(e);return t.fields=qf({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),i=t.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof NF.default&&s instanceof NF.default&&(i[n]=s.concat(o))}return t.withMutation(()=>t.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let i=this.fields[t];e[t]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,t=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,lre.default)(Object.keys(n)),t.length){Array.isArray(t[0])||(t=[t]);let s=t.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,Lje.default)(n,i._excludedEdges),i}pick(e){let t={};for(let i of e)this.fields[i]&&(t[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(t)))}omit(e){let t=this.clone(),i=t.fields;t.fields={};for(let n of e)delete i[n];return t.withMutation(()=>t.shape(i))}from(e,t,i){let n=(0,Nje.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,ore.default)(s,e)&&(o=qf({},s),i||delete o[e],o[t]=n(s)),o})}noUnknown(e=!0,t=Are.object.noUnknown){typeof e=="string"&&(t=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:t,test(n){if(n==null)return!0;let s=Mje(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,t=Are.object.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&(0,Rje.default)(t,(i,n)=>e(n)))}camelCase(){return this.transformKeys(Dje.default)}snakeCase(){return this.transformKeys(are.default)}constantCase(){return this.transformKeys(e=>(0,are.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,Fje.default)(this.fields,t=>t.describe()),e}};KC.default=R0;function sre(r){return new R0(r)}sre.prototype=R0.prototype});var fre=w(UC=>{"use strict";Object.defineProperty(UC,"__esModule",{value:!0});UC.create=gre;UC.default=void 0;var LF=Jf(Gf()),Uje=Jf(Tf()),Hje=Jf(IC()),TF=CA(),jje=Jf(l0()),Gje=Jf(fu()),Yje=Jf(EA());function Jf(r){return r&&r.__esModule?r:{default:r}}function F0(){return F0=Object.assign||function(r){for(var e=1;e{this.transform(function(t){if(typeof t=="string")try{t=JSON.parse(t)}catch(i){t=null}return this.isType(t)?t:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let i=super._cast(e,t);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,F0({},t,{path:`${t.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,t={},i){var n,s;let o=[],a=t.sync,l=t.path,c=this.innerType,u=(n=t.abortEarly)!=null?n:this.spec.abortEarly,g=(s=t.recursive)!=null?s:this.spec.recursive,f=t.originalValue!=null?t.originalValue:e;super._validate(e,t,(h,p)=>{if(h){if(!Gje.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let m=new Array(p.length);for(let y=0;yc.validate(b,x,q)}(0,jje.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:m},i)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!(0,Uje.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,Hje.default)(e));return t.innerType=e,t}length(e,t=TF.array.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,LF.default)(i)||i.length===this.resolve(e)}})}min(e,t){return t=t||TF.array.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,LF.default)(i)||i.length>=this.resolve(e)}})}max(e,t){return t=t||TF.array.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,LF.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:t==null?[]:[].concat(t))}compact(e){let t=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(t):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};UC.default=N0;gre.prototype=N0.prototype});var hre=w(HC=>{"use strict";Object.defineProperty(HC,"__esModule",{value:!0});HC.create=qje;HC.default=void 0;var Wje=Jje(Tf());function Jje(r){return r&&r.__esModule?r:{default:r}}function qje(r){return new OF(r)}var OF=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(t,i={})=>{let n=this.builder(t,i);if(!(0,Wje.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,t){return this._resolve(e,t).cast(e,t)}validate(e,t,i){return this._resolve(e,t).validate(e,t,i)}validateSync(e,t){return this._resolve(e,t).validateSync(e,t)}validateAt(e,t,i){return this._resolve(t,i).validateAt(e,t,i)}validateSyncAt(e,t,i){return this._resolve(t,i).validateSyncAt(e,t,i)}describe(){return null}isValid(e,t){return this._resolve(e,t).isValid(e,t)}isValidSync(e,t){return this._resolve(e,t).isValidSync(e,t)}},zje=OF;HC.default=zje});var pre=w(MF=>{"use strict";Object.defineProperty(MF,"__esModule",{value:!0});MF.default=_je;var Xje=Vje(CA());function Vje(r){return r&&r.__esModule?r:{default:r}}function _je(r){Object.keys(r).forEach(e=>{Object.keys(r[e]).forEach(t=>{Xje.default[e][t]=r[e][t]})})}});var UF=w(Br=>{"use strict";Object.defineProperty(Br,"__esModule",{value:!0});Br.addMethod=Zje;Object.defineProperty(Br,"MixedSchema",{enumerable:!0,get:function(){return dre.default}});Object.defineProperty(Br,"mixed",{enumerable:!0,get:function(){return dre.create}});Object.defineProperty(Br,"BooleanSchema",{enumerable:!0,get:function(){return KF.default}});Object.defineProperty(Br,"bool",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"boolean",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"StringSchema",{enumerable:!0,get:function(){return Cre.default}});Object.defineProperty(Br,"string",{enumerable:!0,get:function(){return Cre.create}});Object.defineProperty(Br,"NumberSchema",{enumerable:!0,get:function(){return mre.default}});Object.defineProperty(Br,"number",{enumerable:!0,get:function(){return mre.create}});Object.defineProperty(Br,"DateSchema",{enumerable:!0,get:function(){return Ere.default}});Object.defineProperty(Br,"date",{enumerable:!0,get:function(){return Ere.create}});Object.defineProperty(Br,"ObjectSchema",{enumerable:!0,get:function(){return Ire.default}});Object.defineProperty(Br,"object",{enumerable:!0,get:function(){return Ire.create}});Object.defineProperty(Br,"ArraySchema",{enumerable:!0,get:function(){return yre.default}});Object.defineProperty(Br,"array",{enumerable:!0,get:function(){return yre.create}});Object.defineProperty(Br,"ref",{enumerable:!0,get:function(){return $je.create}});Object.defineProperty(Br,"lazy",{enumerable:!0,get:function(){return eGe.create}});Object.defineProperty(Br,"ValidationError",{enumerable:!0,get:function(){return tGe.default}});Object.defineProperty(Br,"reach",{enumerable:!0,get:function(){return rGe.default}});Object.defineProperty(Br,"isSchema",{enumerable:!0,get:function(){return wre.default}});Object.defineProperty(Br,"setLocale",{enumerable:!0,get:function(){return iGe.default}});Object.defineProperty(Br,"BaseSchema",{enumerable:!0,get:function(){return nGe.default}});var dre=Eu(Zee()),KF=Eu(ite()),Cre=Eu(ote()),mre=Eu(lte()),Ere=Eu(fte()),Ire=Eu(ure()),yre=Eu(fre()),$je=du(),eGe=hre(),tGe=jC(fu()),rGe=jC(QF()),wre=jC(Tf()),iGe=jC(pre()),nGe=jC(EA());function jC(r){return r&&r.__esModule?r:{default:r}}function Bre(){if(typeof WeakMap!="function")return null;var r=new WeakMap;return Bre=function(){return r},r}function Eu(r){if(r&&r.__esModule)return r;if(r===null||typeof r!="object"&&typeof r!="function")return{default:r};var e=Bre();if(e&&e.has(r))return e.get(r);var t={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in r)if(Object.prototype.hasOwnProperty.call(r,n)){var s=i?Object.getOwnPropertyDescriptor(r,n):null;s&&(s.get||s.set)?Object.defineProperty(t,n,s):t[n]=r[n]}return t.default=r,e&&e.set(r,t),t}function Zje(r,e,t){if(!r||!(0,wre.default)(r.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof t!="function")throw new TypeError("Method function must be provided");r.prototype[e]=t}});var xre=w((hft,YC)=>{"use strict";var aGe=process.env.TERM_PROGRAM==="Hyper",AGe=process.platform==="win32",Qre=process.platform==="linux",HF={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Sre=Object.assign({},HF,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),vre=Object.assign({},HF,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:Qre?"\u25B8":"\u276F",pointerSmall:Qre?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});YC.exports=AGe&&!aGe?Sre:vre;Reflect.defineProperty(YC.exports,"common",{enumerable:!1,value:HF});Reflect.defineProperty(YC.exports,"windows",{enumerable:!1,value:Sre});Reflect.defineProperty(YC.exports,"other",{enumerable:!1,value:vre})});var Eo=w((pft,jF)=>{"use strict";var lGe=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),cGe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,kre=()=>{let r={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(r.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},t=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(r.enabled===!1)return s;if(r.visible===!1)return"";let a=""+s,l=a.includes(` -`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=t(r.styles[o[c]],a,l);return a},n=(s,o,a)=>{r.styles[s]=e({name:s,codes:o}),(r.keys[a]||(r.keys[a]=[])).push(s),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(c){r.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,r),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),r.ansiRegex=cGe,r.hasColor=r.hasAnsi=s=>(r.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&r.ansiRegex.test(s)),r.alias=(s,o)=>{let a=typeof o=="string"?r[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),r.styles[s]=a,a.stack=[s]),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(l){r.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,r),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},r.theme=s=>{if(!lGe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))r.alias(o,s[o]);return r},r.alias("unstyle",s=>typeof s=="string"&&s!==""?(r.ansiRegex.lastIndex=0,s.replace(r.ansiRegex,"")):""),r.alias("noop",s=>s),r.none=r.clear=r.noop,r.stripColor=r.unstyle,r.symbols=xre(),r.define=n,r};jF.exports=kre();jF.exports.create=kre});var Xi=w(Lt=>{"use strict";var uGe=Object.prototype.toString,Ws=Eo(),Pre=!1,GF=[],Dre={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};Lt.longest=(r,e)=>r.reduce((t,i)=>Math.max(t,e?i[e].length:i.length),0);Lt.hasColor=r=>!!r&&Ws.hasColor(r);var T0=Lt.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);Lt.nativeType=r=>uGe.call(r).slice(8,-1).toLowerCase().replace(/\s/g,"");Lt.isAsyncFn=r=>Lt.nativeType(r)==="asyncfunction";Lt.isPrimitive=r=>r!=null&&typeof r!="object"&&typeof r!="function";Lt.resolve=(r,e,...t)=>typeof e=="function"?e.call(r,...t):e;Lt.scrollDown=(r=[])=>[...r.slice(1),r[0]];Lt.scrollUp=(r=[])=>[r.pop(),...r];Lt.reorder=(r=[])=>{let e=r.slice();return e.sort((t,i)=>t.index>i.index?1:t.index{let i=r.length,n=t===i?0:t<0?i-1:t,s=r[e];r[e]=r[n],r[n]=s};Lt.width=(r,e=80)=>{let t=r&&r.columns?r.columns:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[0]),process.platform==="win32"?t-1:t};Lt.height=(r,e=20)=>{let t=r&&r.rows?r.rows:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[1]),t};Lt.wordWrap=(r,e={})=>{if(!r)return r;typeof e=="number"&&(e={width:e});let{indent:t="",newline:i=` -`+t,width:n=80}=e;n-=((i+t).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=r.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),t+c.join(i)};Lt.unmute=r=>{let e=r.stack.find(i=>Ws.keys.color.includes(i));return e?Ws[e]:r.stack.find(i=>i.slice(2)==="bg")?Ws[e.slice(2)]:i=>i};Lt.pascal=r=>r?r[0].toUpperCase()+r.slice(1):"";Lt.inverse=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i));if(e){let i=Ws["bg"+Lt.pascal(e)];return i?i.black:r}let t=r.stack.find(i=>i.slice(0,2)==="bg");return t?Ws[t.slice(2).toLowerCase()]||r:Ws.none};Lt.complement=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i)),t=r.stack.find(i=>i.slice(0,2)==="bg");if(e&&!t)return Ws[Dre[e]||e];if(t){let i=t.slice(2).toLowerCase(),n=Dre[i];return n&&Ws["bg"+Lt.pascal(n)]||r}return Ws.none};Lt.meridiem=r=>{let e=r.getHours(),t=r.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=t<10?"0"+t:t;return n+":"+s+" "+i};Lt.set=(r={},e="",t)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:t;return!Lt.isObject(a)&&s{let i=r[e]==null?e.split(".").reduce((n,s)=>n&&n[s],r):r[e];return i==null?t:i};Lt.mixin=(r,e)=>{if(!T0(r))return e;if(!T0(e))return r;for(let t of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,t);if(i.hasOwnProperty("value"))if(r.hasOwnProperty(t)&&T0(i.value)){let n=Object.getOwnPropertyDescriptor(r,t);T0(n.value)?r[t]=Lt.merge({},r[t],e[t]):Reflect.defineProperty(r,t,i)}else Reflect.defineProperty(r,t,i);else Reflect.defineProperty(r,t,i)}return r};Lt.merge=(...r)=>{let e={};for(let t of r)Lt.mixin(e,t);return e};Lt.mixinEmitter=(r,e)=>{let t=e.constructor.prototype;for(let i of Object.keys(t)){let n=t[i];typeof n=="function"?Lt.define(r,i,n.bind(e)):Lt.define(r,i,n)}};Lt.onExit=r=>{let e=(t,i)=>{Pre||(Pre=!0,GF.forEach(n=>n()),t===!0&&process.exit(128+i))};GF.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),GF.push(r)};Lt.define=(r,e,t)=>{Reflect.defineProperty(r,e,{value:t})};Lt.defineExport=(r,e,t)=>{let i;Reflect.defineProperty(r,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():t()}})}});var Rre=w(zf=>{"use strict";zf.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};zf.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};zf.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};zf.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};zf.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var Lre=w((mft,Fre)=>{"use strict";var Nre=require("readline"),gGe=Rre(),fGe=/^(?:\x1b)([a-zA-Z0-9])$/,hGe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,pGe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function dGe(r){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(r)}function CGe(r){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(r)}var O0=(r="",e={})=>{let t,i=N({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:r,raw:r},e);if(Buffer.isBuffer(r)?r[0]>127&&r[1]===void 0?(r[0]-=128,r=""+String(r)):r=String(r):r!==void 0&&typeof r!="string"?r=String(r):r||(r=i.sequence||""),i.sequence=i.sequence||r||i.name,r==="\r")i.raw=void 0,i.name="return";else if(r===` -`)i.name="enter";else if(r===" ")i.name="tab";else if(r==="\b"||r==="\x7F"||r==="\x7F"||r==="\b")i.name="backspace",i.meta=r.charAt(0)==="";else if(r===""||r==="")i.name="escape",i.meta=r.length===2;else if(r===" "||r===" ")i.name="space",i.meta=r.length===2;else if(r<="")i.name=String.fromCharCode(r.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(r.length===1&&r>="0"&&r<="9")i.name="number";else if(r.length===1&&r>="a"&&r<="z")i.name=r;else if(r.length===1&&r>="A"&&r<="Z")i.name=r.toLowerCase(),i.shift=!0;else if(t=fGe.exec(r))i.meta=!0,i.shift=/^[A-Z]$/.test(t[1]);else if(t=hGe.exec(r)){let n=[...r];n[0]===""&&n[1]===""&&(i.option=!0);let s=[t[1],t[2],t[4],t[6]].filter(Boolean).join(""),o=(t[3]||t[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=pGe[s],i.shift=dGe(s)||i.shift,i.ctrl=CGe(s)||i.ctrl}return i};O0.listen=(r={},e)=>{let{stdin:t}=r;if(!t||t!==process.stdin&&!t.isTTY)throw new Error("Invalid stream passed");let i=Nre.createInterface({terminal:!0,input:t});Nre.emitKeypressEvents(t,i);let n=(a,l)=>e(a,O0(a,l),i),s=t.isRaw;return t.isTTY&&t.setRawMode(!0),t.on("keypress",n),i.resume(),()=>{t.isTTY&&t.setRawMode(s),t.removeListener("keypress",n),i.pause(),i.close()}};O0.action=(r,e,t)=>{let i=N(N({},gGe),t);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};Fre.exports=O0});var Ore=w((Eft,Tre)=>{"use strict";Tre.exports=r=>{r.timers=r.timers||{};let e=r.options.timers;if(!!e)for(let t of Object.keys(e)){let i=e[t];typeof i=="number"&&(i={interval:i}),mGe(r,t,i)}};function mGe(r,e,t={}){let i=r.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=t.interval||120;i.frames=t.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,r.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),r.once("close",()=>i.stop()),i.stop}});var Ure=w((Ift,Mre)=>{"use strict";var{define:EGe,width:IGe}=Xi(),Kre=class{constructor(e){let t=e.options;EGe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=IGe(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=N({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t=="function"?t:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};Mre.exports=Kre});var jre=w((yft,Hre)=>{"use strict";var YF=Xi(),Ni=Eo(),qF={default:Ni.noop,noop:Ni.noop,set inverse(r){this._inverse=r},get inverse(){return this._inverse||YF.inverse(this.primary)},set complement(r){this._complement=r},get complement(){return this._complement||YF.complement(this.primary)},primary:Ni.cyan,success:Ni.green,danger:Ni.magenta,strong:Ni.bold,warning:Ni.yellow,muted:Ni.dim,disabled:Ni.gray,dark:Ni.dim.gray,underline:Ni.underline,set info(r){this._info=r},get info(){return this._info||this.primary},set em(r){this._em=r},get em(){return this._em||this.primary.underline},set heading(r){this._heading=r},get heading(){return this._heading||this.muted.underline},set pending(r){this._pending=r},get pending(){return this._pending||this.primary},set submitted(r){this._submitted=r},get submitted(){return this._submitted||this.success},set cancelled(r){this._cancelled=r},get cancelled(){return this._cancelled||this.danger},set typing(r){this._typing=r},get typing(){return this._typing||this.dim},set placeholder(r){this._placeholder=r},get placeholder(){return this._placeholder||this.primary.dim},set highlight(r){this._highlight=r},get highlight(){return this._highlight||this.inverse}};qF.merge=(r={})=>{r.styles&&typeof r.styles.enabled=="boolean"&&(Ni.enabled=r.styles.enabled),r.styles&&typeof r.styles.visible=="boolean"&&(Ni.visible=r.styles.visible);let e=YF.merge({},qF,r.styles);delete e.merge;for(let t of Object.keys(Ni))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});for(let t of Object.keys(Ni.styles))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});return e};Hre.exports=qF});var Yre=w((wft,Gre)=>{"use strict";var JF=process.platform==="win32",yA=Eo(),yGe=Xi(),WF=te(N({},yA.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:yA.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:yA.symbols.question,submitted:yA.symbols.check,cancelled:yA.symbols.cross},separator:{pending:yA.symbols.pointerSmall,submitted:yA.symbols.middot,cancelled:yA.symbols.middot},radio:{off:JF?"( )":"\u25EF",on:JF?"(*)":"\u25C9",disabled:JF?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});WF.merge=r=>{let e=yGe.merge({},yA.symbols,WF,r.symbols);return delete e.merge,e};Gre.exports=WF});var Jre=w((Bft,qre)=>{"use strict";var wGe=jre(),BGe=Yre(),bGe=Xi();qre.exports=r=>{r.options=bGe.merge({},r.options.theme,r.options),r.symbols=BGe.merge(r.options),r.styles=wGe.merge(r.options)}});var Xre=w((Wre,zre)=>{"use strict";var _re=process.env.TERM_PROGRAM==="Apple_Terminal",QGe=Eo(),zF=Xi(),Io=zre.exports=Wre,Lr="[",Vre="\x07",_F=!1,Fl=Io.code={bell:Vre,beep:Vre,beginning:`${Lr}G`,down:`${Lr}J`,esc:Lr,getPosition:`${Lr}6n`,hide:`${Lr}?25l`,line:`${Lr}2K`,lineEnd:`${Lr}K`,lineStart:`${Lr}1K`,restorePosition:Lr+(_re?"8":"u"),savePosition:Lr+(_re?"7":"s"),screen:`${Lr}2J`,show:`${Lr}?25h`,up:`${Lr}1J`},Iu=Io.cursor={get hidden(){return _F},hide(){return _F=!0,Fl.hide},show(){return _F=!1,Fl.show},forward:(r=1)=>`${Lr}${r}C`,backward:(r=1)=>`${Lr}${r}D`,nextLine:(r=1)=>`${Lr}E`.repeat(r),prevLine:(r=1)=>`${Lr}F`.repeat(r),up:(r=1)=>r?`${Lr}${r}A`:"",down:(r=1)=>r?`${Lr}${r}B`:"",right:(r=1)=>r?`${Lr}${r}C`:"",left:(r=1)=>r?`${Lr}${r}D`:"",to(r,e){return e?`${Lr}${e+1};${r+1}H`:`${Lr}${r+1}G`},move(r=0,e=0){let t="";return t+=r<0?Iu.left(-r):r>0?Iu.right(r):"",t+=e<0?Iu.up(-e):e>0?Iu.down(e):"",t},restore(r={}){let{after:e,cursor:t,initial:i,input:n,prompt:s,size:o,value:a}=r;if(i=zF.isPrimitive(i)?String(i):"",n=zF.isPrimitive(n)?String(n):"",a=zF.isPrimitive(a)?String(a):"",o){let l=Io.cursor.up(o)+Io.cursor.to(s.length),c=n.length-t;return c>0&&(l+=Io.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+t;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Io.cursor.move(l)}}},VF=Io.erase={screen:Fl.screen,up:Fl.up,down:Fl.down,line:Fl.line,lineEnd:Fl.lineEnd,lineStart:Fl.lineStart,lines(r){let e="";for(let t=0;t{if(!e)return VF.line+Iu.to(0);let t=s=>[...QGe.unstyle(s)].length,i=r.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(t(s)-1,0)/e);return(VF.line+Iu.prevLine()).repeat(n-1)+VF.line+Iu.to(0)}});var _f=w((bft,Zre)=>{"use strict";var SGe=require("events"),$re=Eo(),XF=Lre(),vGe=Ore(),xGe=Ure(),kGe=Jre(),Tn=Xi(),yu=Xre(),M0=class extends SGe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,kGe(this),vGe(this),this.state=new xGe(this),this.initial=[e.initial,e.default].find(t=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=DGe(this.options.margin),this.setMaxListeners(0),PGe(this)}async keypress(e,t={}){this.keypressed=!0;let i=XF.action(e,XF(e,t),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(yu.code.beep)}cursorHide(){this.stdout.write(yu.cursor.hide()),Tn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(yu.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let t=this.state.buffer;this.state.buffer="",!(!t&&!e||this.options.show===!1)&&this.stdout.write(yu.cursor.down(e)+yu.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:t,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=yu.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:t,prompt:i}=this.state;i=$re.unstyle(i);let n=$re.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` -`),c=l[0],u=l[l.length-1],f=(i+(t?" "+t:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof t.initial=="function"&&(this.initial=await t.initial.call(this,this)),typeof t.onRun=="function"&&await t.onRun.call(this,this),typeof t.onSubmit=="function"){let n=t.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,t)=>{if(this.once("submit",e),this.once("cancel",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,t,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=t&&t[e]!=null?t[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,t,i);return!g&&t&&t[e]?this.resolve(c,s,t,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,t=this.timers&&this.timers.prefix,i=this.state;return i.timer=t,Tn.isObject(e)&&(e=e[i.status]||e.pending),Tn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Tn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,t=this.timers&&this.timers.separator,i=this.state;i.timer=t;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return Tn.isObject(s)&&(s=s[i.status]||s.pending),Tn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,t){let i=await this.element("pointer",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===t,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=Tn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,t){let i=await this.element("indicator",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return Tn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Tn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...t){return Tn.resolve(this,e,...t)}get base(){return M0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Tn.height(this.stdout,25)}get width(){return this.options.columns||Tn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,i=[t,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function PGe(r){let e=n=>r[n]===void 0||typeof r[n]=="function",t=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(r.options)){if(t.includes(n)||/^on[A-Z]/.test(n))continue;let s=r.options[n];typeof s=="function"&&e(n)?i.includes(n)||(r[n]=s.bind(r)):typeof r[n]!="function"&&(r[n]=s)}}function DGe(r){typeof r=="number"&&(r=[r,r,r,r]);let e=[].concat(r||[]),t=n=>n%2==0?` -`:" ",i=[];for(let n=0;n<4;n++){let s=t(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}Zre.exports=M0});var rie=w((Qft,eie)=>{"use strict";var RGe=Xi(),tie={default(r,e){return e},checkbox(r,e){throw new Error("checkbox role is not implemented yet")},editable(r,e){throw new Error("editable role is not implemented yet")},expandable(r,e){throw new Error("expandable role is not implemented yet")},heading(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||"",e},input(r,e){throw new Error("input role is not implemented yet")},option(r,e){return tie.default(r,e)},radio(r,e){throw new Error("radio role is not implemented yet")},separator(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||r.symbols.line.repeat(5),e},spacer(r,e){return e}};eie.exports=(r,e={})=>{let t=RGe.merge({},tie,e.roles);return t[r]||t.default}});var qC=w((Sft,iie)=>{"use strict";var FGe=Eo(),NGe=_f(),LGe=rie(),K0=Xi(),{reorder:ZF,scrollUp:TGe,scrollDown:OGe,isObject:nie,swap:MGe}=K0,sie=class extends NGe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");nie(t)&&(t=Object.keys(t)),Array.isArray(t)?(i!=null&&(this.index=this.findIndex(i)),t.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(t=i),typeof t=="string"&&(t=this.findIndex(t)),typeof t=="number"&&t>-1&&(this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,t,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=LGe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=t,e.cursor=0,K0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,FGe.unstyle(e.message).length));let o=N({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,t)),e}async onChoice(e,t){this.emit("choice",e,t,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,i){let n=await this.toChoice(e,t,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,t,i){let n=N({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,t,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){return typeof t!="boolean"&&(t=e.enabled),t&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=t&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedt.enabled);return this.choices.forEach(t=>t.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(t=>!!t.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof t!="boolean"&&(t=!e.enabled),e.enabled=t,e.choices&&e.choices.forEach(n=>this.toggle(n,t));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return oie(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=ZF(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=t(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=ZF(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=ZF(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>t&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===t-1?this.alert():e>t&&i===t-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=TGe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=OGe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){MGe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(t=>this.isEnabled(t));if(e.choices){let t=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&t.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(t=>this.isChoice(e,t)):this.isChoice(e,this.initial)}map(e=[],t="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,t),i),{})}filter(e,t){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return t?o.map(a=>a[t]):o}find(e,t){if(nie(e))return t?e[t]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return t?s[t]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:t,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&t!==!1&&i!==!0&&(s=K0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)this.state._choices.some(i=>i.name===t.name)||this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t=="string"||typeof t=="number"){let i=this.find(t);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return oie(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:i}=this,n=e.limit||this._limit||t.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function oie(r,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(K0.isAsyncFn(e))return e;e=e.call(r,r)}for(let t of e){if(Array.isArray(t.choices)){let i=t.choices.filter(n=>!r.isDisabled(n));t.enabled=i.every(n=>n.enabled===!0)}r.isDisabled(t)===!0&&delete t.enabled}return e}iie.exports=sie});var Nl=w((vft,aie)=>{"use strict";var KGe=qC(),$F=Xi(),Aie=class extends KGe{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):""}indicator(e,t){return this.multiple?super.indicator(e,t):""}choiceMessage(e,t){let i=this.resolve(e.message,this.state,e,t);return e.role==="heading"&&!$F.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,t)}choiceSeparator(){return":"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await this.indicator(e,t)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,t);o&&!$F.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,t),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?($F.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),t=await Promise.all(e);t.length||t.push(this.styles.danger("No matching choices"));let i=this.margin[0]+t.join(` -`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` -`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(t),this.write([n,i,u,g].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};aie.exports=Aie});var uie=w((xft,lie)=>{"use strict";var UGe=Nl(),HGe=(r,e)=>{let t=r.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(t),o=e(i.slice(s,s+t.length));return s>=0?i.slice(0,s)+o+i.slice(s+t.length):i}},cie=class extends UGe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:i}=this.state;return this.input=i.slice(0,t)+e+i.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;return t?(this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:t}=this.state;return t[e]===void 0?this.alert():(this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,t);let i=e.toLowerCase();return t.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,t=HGe(this.input,e),i=this.choices;this.choices=i.map(n=>te(N({},n),{message:t(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};lie.exports=cie});var tN=w((kft,gie)=>{"use strict";var eN=Xi();gie.exports=(r,e={})=>{r.cursorHide();let{input:t="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||r.styles.placeholder,l=eN.inverse(r.styles.primary),c=m=>l(r.styles.black(m)),u=t,g=" ",f=c(g);if(r.blink&&r.blink.off===!0&&(c=m=>m,f=""),s&&n===0&&i===""&&t==="")return c(g);if(s&&n===0&&(t===i||t===""))return c(i[0])+a(i.slice(1));i=eN.isPrimitive(i)?`${i}`:"",t=eN.isPrimitive(t)?`${t}`:"";let h=i&&i.startsWith(t)&&i!==t,p=h?c(i[t.length]):f;if(n!==t.length&&s===!0&&(u=t.slice(0,n)+c(t[n])+t.slice(n+1),p=""),s===!1&&(p=""),h){let m=r.styles.unstyle(u+p);return u+p+a(i.slice(m.length))}return u+p}});var U0=w((Pft,fie)=>{"use strict";var jGe=Eo(),GGe=Nl(),YGe=tN(),hie=class extends GGe{constructor(e){super(te(N({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(t=>t!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(t=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:i,input:n}=t;return t.value=t.input=n.slice(0,i)+e+n.slice(i),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:i}=e;return e.value=e.input=i.slice(0,t-1)+i.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:i}=e;if(i[t]===void 0)return this.alert();let n=`${i}`.slice(0,t)+`${i}`.slice(t+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:i}=e;return t&&t.startsWith(i)&&i!==t?(e.value=e.input=t,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,t){let i=await this.resolve(e.separator,this.state,e,t)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,t){await this.onChoice(e,t);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,m=this.index===t,y=e.validate||(()=>!0),b=await this.choiceSeparator(e,t),v=e.message;this.align==="right"&&(v=v.padStart(this.longest+1," ")),this.align==="left"&&(v=v.padEnd(this.longest+1," "));let x=this.values[a]=c||o,T=c?"success":"dark";await y.call(e,x,this.state)!==!0&&(T="danger");let Y=n[T](await this.indicator(e,t))+(e.pad||""),$=this.indent(e),_=()=>[$,Y,v+b,c,p].filter(Boolean).join(" ");if(i.submitted)return v=jGe.unstyle(v),c=g(c),p="",_();if(e.format)c=await e.format.call(this,c,e,t);else{let ne=this.styles.muted;c=YGe(this,{input:c,initial:o,pos:s,showCursor:m,color:ne})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,x,e,t)),m&&(v=f(v)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),_()}async submit(){return this.value=this.values,super.base.submit.call(this)}};fie.exports=hie});var rN=w((Dft,pie)=>{"use strict";var qGe=U0(),JGe=()=>{throw new Error("expected prompt to have a custom authenticate method")},die=(r=JGe)=>{class e extends qGe{constructor(i){super(i)}async submit(){this.value=await r.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return die(i)}}return e};pie.exports=die()});var Eie=w((Rft,Cie)=>{"use strict";var WGe=rN();function zGe(r,e){return r.username===this.options.username&&r.password===this.options.password}var mie=(r=zGe)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class t extends WGe.create(r){constructor(n){super(te(N({},n),{choices:e}))}static create(n){return mie(n)}}return t};Cie.exports=mie()});var H0=w((Fft,Iie)=>{"use strict";var _Ge=_f(),{isPrimitive:VGe,hasColor:XGe}=Xi(),yie=class extends _Ge{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:t,state:i}=this;return i.submitted?t.success(e):t.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return VGe(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return XGe(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(t),this.write([l,a,f].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};Iie.exports=yie});var bie=w((Nft,wie)=>{"use strict";var ZGe=H0(),Bie=class extends ZGe{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};wie.exports=Bie});var vie=w((Lft,Qie)=>{"use strict";var $Ge=Nl(),eYe=U0(),Vf=eYe.prototype,Sie=class extends $Ge{constructor(e){super(te(N({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(t=>t!=null),this.emptyError="",this.values={}}dispatch(e,t){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():Vf.dispatch.call(this,e,t)}append(e,t){return Vf.append.call(this,e,t)}delete(e,t){return Vf.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?Vf.next.call(this):super.next()}prev(){return this.focused.editable?Vf.prev.call(this):super.prev()}async indicator(e,t){let i=e.indicator||"",n=e.editable?i:super.indicator(e,t);return await this.resolve(n,this.state,e,t)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,t){return e.indent="",e.editable?Vf.renderChoice.call(this,e,t):super.renderChoice(e,t)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!="function"||t.role==="heading")continue;let i=t.parent?this.value[t.parent.name]:this.value;if(t.editable?i=t.value===t.name?t.initial||"":t.value:this.isDisabled(t)||(i=t.enabled===!0),e=await t.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?t[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(t[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Qie.exports=Sie});var wu=w((Tft,xie)=>{"use strict";var tYe=_f(),rYe=tN(),{isPrimitive:iYe}=Xi(),kie=class extends tYe{constructor(e){super(e);this.initial=iYe(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,t={}){let i=this.state.prevKeypress;return this.state.prevKeypress=t,this.options.multiline===!0&&t.name==="return"&&(!i||i.name!=="return")?this.append(` -`,t):super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:i}=this.state;this.input=`${i}`.slice(0,t)+e+`${i}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),i=this.input.slice(e),n=t.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||t):rYe(this,{input:e,initial:t,pos:this.cursor})}async render(){let e=this.state.size,t=await this.prefix(),i=await this.separator(),n=await this.message(),s=[t,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` -`)),this.restore()}};xie.exports=kie});var Die=w((Oft,Pie)=>{"use strict";var nYe=r=>r.filter((e,t)=>r.lastIndexOf(e)===t),j0=r=>nYe(r).filter(Boolean);Pie.exports=(r,e={},t="")=>{let{past:i=[],present:n=""}=e,s,o;switch(r){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:j0([t,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:j0([...s,t]),present:o};case"save":return{past:j0([...i,t]),present:""};case"remove":return o=j0(i.filter(a=>a!==t)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${r}"`)}}});var iN=w((Mft,Rie)=>{"use strict";var sYe=wu(),Fie=Die(),Nie=class extends sYe{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let i=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=Fie(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=Fie("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Rie.exports=Nie});var Oie=w((Kft,Lie)=>{"use strict";var oYe=wu(),Tie=class extends oYe{format(){return""}};Lie.exports=Tie});var Uie=w((Uft,Mie)=>{"use strict";var aYe=wu(),Kie=class extends aYe{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:t=>t;return this.list.map(e).join(", ")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);return t!==!0?(this.state.error=t,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Mie.exports=Kie});var Gie=w((Hft,Hie)=>{"use strict";var AYe=Nl(),jie=class extends AYe{constructor(e){super(te(N({},e),{multiple:!0}))}};Hie.exports=jie});var nN=w((jft,Yie)=>{"use strict";var lYe=wu(),qie=class extends lYe{constructor(e={}){super(N({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let t=e||this.minor,i=this.toNumber(this.input);return i>this.max+t?this.alert():(this.input=`${i+t}`,this.render())}down(e){let t=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(t));return this.value=this.toNumber(e||0),super.submit()}};Yie.exports=qie});var Wie=w((Gft,Jie)=>{Jie.exports=nN()});var Vie=w((Yft,zie)=>{"use strict";var cYe=wu(),_ie=class extends cYe{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};zie.exports=_ie});var ene=w((qft,Xie)=>{"use strict";var uYe=Eo(),gYe=qC(),Zie=Xi(),$ie=class extends gYe{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` - `;let t=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+t})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` -`)}renderScaleHeading(e){let t=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(t=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-t.join("").length,n=Math.round(i/(t.length-1)),o=t.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,t,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,t,i);let n=e.scaleIndex===t.index;return t.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,t){let i=e.scale.map(s=>this.scaleIndicator(e,s,t)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await e.hint;s&&!Zie.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,t),u=await this.renderScale(e,t),g=this.margin[1]+this.margin[3];this.scaleLength=uYe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=Zie.wordWrap(c,{width:this.widths[0],newline:a}).split(` -`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),t=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...t.map(n=>n.join(" "))].join(` -`)}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(t),this.write([a,o,c,g,f].filter(Boolean).join(` -`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Xie.exports=$ie});var nne=w((Jft,tne)=>{"use strict";var rne=Eo(),fYe=(r="")=>typeof r=="string"?r.replace(/^['"]|['"]$/g,""):"",ine=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=fYe(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},hYe=async(r={},e={},t=i=>i)=>{let i=new Set,n=r.fields||[],s=r.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uT.name===b.key);b.field=n.find(T=>T.name===b.key),x||(x=new ine(b),a.push(x)),x.lines.push(b.line-1);continue}let m=o[o.length-1];m.type==="text"&&m.line===c?m.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};tne.exports=async r=>{let e=r.options,t=new Set(e.required===!0?[]:e.required||[]),i=N(N({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await hYe(e,i),a=sN("result",r,e),l=sN("format",r,e),c=sN("validate",r,e,!0),u=r.isValue.bind(r);return async(g={},f=!1)=>{let h=0;g.required=t,g.items=s,g.keys=o,g.output="";let p=async(v,x,T,q)=>{let Y=await c(v,x,T,q);return Y===!1?"Invalid field "+T.name:Y};for(let v of n){let x=v.value,T=v.key;if(v.type!=="template"){x&&(g.output+=x);continue}if(v.type==="template"){let q=s.find(ee=>ee.name===T);e.required===!0&&g.required.add(q.name);let Y=[q.input,g.values[q.value],q.value,x].find(u),_=(q.field||{}).message||v.inner;if(f){let ee=await p(g.values[T],g,q,h);if(ee&&typeof ee=="string"||ee===!1){g.invalid.set(T,ee);continue}g.invalid.delete(T);let A=await a(g.values[T],g,q,h);g.output+=rne.unstyle(A);continue}q.placeholder=!1;let ne=x;x=await l(x,g,q,h),Y!==x?(g.values[T]=Y,x=r.styles.typing(Y),g.missing.delete(_)):(g.values[T]=void 0,Y=`<${_}>`,x=r.styles.primary(Y),q.placeholder=!0,g.required.has(T)&&g.missing.add(_)),g.missing.has(_)&&g.validating&&(x=r.styles.warning(Y)),g.invalid.has(T)&&g.validating&&(x=r.styles.danger(Y)),h===g.index&&(ne!==x?x=r.styles.underline(x):x=r.styles.heading(rne.unstyle(x))),h++}x&&(g.output+=x)}let m=g.output.split(` -`).map(v=>" "+v),y=s.length,b=0;for(let v of s)g.invalid.has(v.name)&&v.lines.forEach(x=>{m[x][0]===" "&&(m[x]=g.styles.danger(g.symbols.bullet)+m[x].slice(1))}),r.isValue(g.values[v.name])&&b++;return g.completed=(b/y*100).toFixed(0),g.output=m.join(` -`),g.output}};function sN(r,e,t,i){return(n,s,o,a)=>typeof o.field[r]=="function"?o.field[r].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var ane=w((Wft,sne)=>{"use strict";var pYe=Eo(),dYe=nne(),CYe=_f(),one=class extends CYe{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await dYe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(t=this.styles.danger),t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:i,size:n}=this.state,s=[this.options.newline,` -`].find(v=>v!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=t[e]||"",m=await this.format(p),y=await this.footer();m&&(c+=" "+m),f&&!m&&this.state.completed===0&&(c+=" "+f),this.clear(n);let b=[u,c,h,y,g.trim()];this.write(b.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:t,keys:i,index:n}=this.state,s=t.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} -`;return this.state.error=a,super.submit()}if(t.size)return this.state.error="Required: "+[...t.keys()].join(", "),super.submit();let o=pYe.unstyle(i).split(` -`).map(a=>a.slice(1)).join(` -`);return this.value={values:n,result:o},super.submit()}};sne.exports=one});var cne=w((zft,Ane)=>{"use strict";var mYe="(Use + to sort)",EYe=Nl(),lne=class extends EYe{constructor(e){super(te(N({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,mYe].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,t){let i=await super.renderChoice(e,t),n=this.symbols.identicalTo+" ",s=this.index===t&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${t+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Ane.exports=lne});var fne=w((_ft,une)=>{"use strict";var IYe=qC(),gne=class extends IYe{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];t=t.map(i=>this.styles.muted(i)),this.state.header=t.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let i of t)i.scale=yYe(5,this.options),i.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],i=t.selected;return e.scale.forEach(n=>n.selected=!1),t.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=x=>(x?this.styles.success("\u25C9"):"\u25EF")+o,u=t+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,t),h=this.indent(e),p=h+e.scale.map((x,T)=>c(T===e.scaleIdx)).join(a),m=x=>x===e.scaleIdx?g(x):x,y=h+e.scale.map((x,T)=>m(T)).join(l),b=()=>[u,f].filter(Boolean).join(" "),v=()=>[b(),p,y," "].filter(Boolean).join(` -`);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),v()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),t=await Promise.all(e);return t.length||t.push(this.styles.danger("No matching choices")),t.join(` -`)}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(t),this.write([o,a,u,g].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function yYe(r,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>N({},i));let t=[];for(let i=1;i{hne.exports=iN()});var mne=w((Xft,dne)=>{"use strict";var wYe=H0(),Cne=class extends wYe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([t,c,l].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};dne.exports=Cne});var yne=w((Zft,Ene)=>{"use strict";var BYe=Nl(),Ine=class extends BYe{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Ene.exports=Ine});var Bne=w(oN=>{"use strict";var wne=Xi(),mi=(r,e)=>{wne.defineExport(oN,r,e),wne.defineExport(oN,r.toLowerCase(),e)};mi("AutoComplete",()=>uie());mi("BasicAuth",()=>Eie());mi("Confirm",()=>bie());mi("Editable",()=>vie());mi("Form",()=>U0());mi("Input",()=>iN());mi("Invisible",()=>Oie());mi("List",()=>Uie());mi("MultiSelect",()=>Gie());mi("Numeral",()=>Wie());mi("Password",()=>Vie());mi("Scale",()=>ene());mi("Select",()=>Nl());mi("Snippet",()=>ane());mi("Sort",()=>cne());mi("Survey",()=>fne());mi("Text",()=>pne());mi("Toggle",()=>mne());mi("Quiz",()=>yne())});var Qne=w((eht,bne)=>{bne.exports={ArrayPrompt:qC(),AuthPrompt:rN(),BooleanPrompt:H0(),NumberPrompt:nN(),StringPrompt:wu()}});var WC=w((tht,Sne)=>{"use strict";var vne=require("assert"),aN=require("events"),Ll=Xi(),ha=class extends aN{constructor(e,t){super();this.options=Ll.merge({},e),this.answers=N({},t)}register(e,t){if(Ll.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}vne.equal(typeof t,"function","expected a function");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t=="function"&&(t=await t.call(this)),await this.ask(Ll.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let t=Ll.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=Ll;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];vne(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||_f()}static get prompts(){return Bne()}static get types(){return Qne()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return Ll.mixinEmitter(e,new aN),e}};Ll.mixinEmitter(ha,new aN);var AN=ha.prompts;for(let r of Object.keys(AN)){let e=r.toLowerCase(),t=i=>new AN[r](i).run();ha.prompt[e]=t,ha[e]=t,ha[r]||Reflect.defineProperty(ha,r,{get:()=>AN[r]})}var JC=r=>{Ll.defineExport(ha,r,()=>ha.types[r])};JC("ArrayPrompt");JC("AuthPrompt");JC("BooleanPrompt");JC("NumberPrompt");JC("StringPrompt");Sne.exports=ha});var Une=w((Yht,Kne)=>{function xYe(r,e){for(var t=-1,i=r==null?0:r.length;++t{var kYe=$B(),PYe=Nf();function DYe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s{var RYe=Zf(),FYe=Kf();function NYe(r,e){return r&&RYe(e,FYe(e),r)}jne.exports=NYe});var qne=w((Wht,Yne)=>{function LYe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Yne.exports=LYe});var Wne=w((zht,Jne)=>{var TYe=Rn(),OYe=f0(),MYe=qne(),KYe=Object.prototype,UYe=KYe.hasOwnProperty;function HYe(r){if(!TYe(r))return MYe(r);var e=OYe(r),t=[];for(var i in r)i=="constructor"&&(e||!UYe.call(r,i))||t.push(i);return t}Jne.exports=HYe});var $f=w((_ht,zne)=>{var jYe=$R(),GYe=Wne(),YYe=vC();function qYe(r){return YYe(r)?jYe(r,!0):GYe(r)}zne.exports=qYe});var Vne=w((Vht,_ne)=>{var JYe=Zf(),WYe=$f();function zYe(r,e){return r&&JYe(e,WYe(e),r)}_ne.exports=zYe});var hN=w((em,eh)=>{var _Ye=Ns(),Xne=typeof em=="object"&&em&&!em.nodeType&&em,Zne=Xne&&typeof eh=="object"&&eh&&!eh.nodeType&&eh,VYe=Zne&&Zne.exports===Xne,$ne=VYe?_Ye.Buffer:void 0,ese=$ne?$ne.allocUnsafe:void 0;function XYe(r,e){if(e)return r.slice();var t=r.length,i=ese?ese(t):new r.constructor(t);return r.copy(i),i}eh.exports=XYe});var pN=w((Xht,tse)=>{function ZYe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t{var $Ye=Zf(),eqe=p0();function tqe(r,e){return $Ye(r,eqe(r),e)}rse.exports=tqe});var G0=w(($ht,nse)=>{var rqe=eF(),iqe=rqe(Object.getPrototypeOf,Object);nse.exports=iqe});var dN=w((ept,sse)=>{var nqe=t0(),sqe=G0(),oqe=p0(),aqe=oF(),Aqe=Object.getOwnPropertySymbols,lqe=Aqe?function(r){for(var e=[];r;)nqe(e,oqe(r)),r=sqe(r);return e}:aqe;sse.exports=lqe});var ase=w((tpt,ose)=>{var cqe=Zf(),uqe=dN();function gqe(r,e){return cqe(r,uqe(r),e)}ose.exports=gqe});var lse=w((rpt,Ase)=>{var fqe=sF(),hqe=dN(),pqe=$f();function dqe(r){return fqe(r,pqe,hqe)}Ase.exports=dqe});var use=w((ipt,cse)=>{var Cqe=Object.prototype,mqe=Cqe.hasOwnProperty;function Eqe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]=="string"&&mqe.call(r,"index")&&(t.index=r.index,t.input=r.input),t}cse.exports=Eqe});var Y0=w((npt,gse)=>{var fse=iF();function Iqe(r){var e=new r.constructor(r.byteLength);return new fse(e).set(new fse(r)),e}gse.exports=Iqe});var pse=w((spt,hse)=>{var yqe=Y0();function wqe(r,e){var t=e?yqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}hse.exports=wqe});var Cse=w((opt,dse)=>{var Bqe=/\w*$/;function bqe(r){var e=new r.constructor(r.source,Bqe.exec(r));return e.lastIndex=r.lastIndex,e}dse.exports=bqe});var wse=w((apt,mse)=>{var Ese=Jc(),Ise=Ese?Ese.prototype:void 0,yse=Ise?Ise.valueOf:void 0;function Qqe(r){return yse?Object(yse.call(r)):{}}mse.exports=Qqe});var CN=w((Apt,Bse)=>{var Sqe=Y0();function vqe(r,e){var t=e?Sqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}Bse.exports=vqe});var Qse=w((lpt,bse)=>{var xqe=Y0(),kqe=pse(),Pqe=Cse(),Dqe=wse(),Rqe=CN(),Fqe="[object Boolean]",Nqe="[object Date]",Lqe="[object Map]",Tqe="[object Number]",Oqe="[object RegExp]",Mqe="[object Set]",Kqe="[object String]",Uqe="[object Symbol]",Hqe="[object ArrayBuffer]",jqe="[object DataView]",Gqe="[object Float32Array]",Yqe="[object Float64Array]",qqe="[object Int8Array]",Jqe="[object Int16Array]",Wqe="[object Int32Array]",zqe="[object Uint8Array]",_qe="[object Uint8ClampedArray]",Vqe="[object Uint16Array]",Xqe="[object Uint32Array]";function Zqe(r,e,t){var i=r.constructor;switch(e){case Hqe:return xqe(r);case Fqe:case Nqe:return new i(+r);case jqe:return kqe(r,t);case Gqe:case Yqe:case qqe:case Jqe:case Wqe:case zqe:case _qe:case Vqe:case Xqe:return Rqe(r,t);case Lqe:return new i;case Tqe:case Kqe:return new i(r);case Oqe:return Pqe(r);case Mqe:return new i;case Uqe:return Dqe(r)}}bse.exports=Zqe});var xse=w((cpt,Sse)=>{var $qe=Rn(),vse=Object.create,eJe=function(){function r(){}return function(e){if(!$qe(e))return{};if(vse)return vse(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Sse.exports=eJe});var mN=w((upt,kse)=>{var tJe=xse(),rJe=G0(),iJe=f0();function nJe(r){return typeof r.constructor=="function"&&!iJe(r)?tJe(rJe(r)):{}}kse.exports=nJe});var Dse=w((gpt,Pse)=>{var sJe=kC(),oJe=ta(),aJe="[object Map]";function AJe(r){return oJe(r)&&sJe(r)==aJe}Pse.exports=AJe});var Lse=w((fpt,Rse)=>{var lJe=Dse(),cJe=c0(),Fse=u0(),Nse=Fse&&Fse.isMap,uJe=Nse?cJe(Nse):lJe;Rse.exports=uJe});var Ose=w((hpt,Tse)=>{var gJe=kC(),fJe=ta(),hJe="[object Set]";function pJe(r){return fJe(r)&&gJe(r)==hJe}Tse.exports=pJe});var Hse=w((ppt,Mse)=>{var dJe=Ose(),CJe=c0(),Kse=u0(),Use=Kse&&Kse.isSet,mJe=Use?CJe(Use):dJe;Mse.exports=mJe});var Jse=w((dpt,jse)=>{var EJe=xC(),IJe=Une(),yJe=$B(),wJe=Gne(),BJe=Vne(),bJe=hN(),QJe=pN(),SJe=ise(),vJe=ase(),xJe=aF(),kJe=lse(),PJe=kC(),DJe=use(),RJe=Qse(),FJe=mN(),NJe=Ks(),LJe=bC(),TJe=Lse(),OJe=Rn(),MJe=Hse(),KJe=Kf(),UJe=$f(),HJe=1,jJe=2,GJe=4,Gse="[object Arguments]",YJe="[object Array]",qJe="[object Boolean]",JJe="[object Date]",WJe="[object Error]",Yse="[object Function]",zJe="[object GeneratorFunction]",_Je="[object Map]",VJe="[object Number]",qse="[object Object]",XJe="[object RegExp]",ZJe="[object Set]",$Je="[object String]",e3e="[object Symbol]",t3e="[object WeakMap]",r3e="[object ArrayBuffer]",i3e="[object DataView]",n3e="[object Float32Array]",s3e="[object Float64Array]",o3e="[object Int8Array]",a3e="[object Int16Array]",A3e="[object Int32Array]",l3e="[object Uint8Array]",c3e="[object Uint8ClampedArray]",u3e="[object Uint16Array]",g3e="[object Uint32Array]",dr={};dr[Gse]=dr[YJe]=dr[r3e]=dr[i3e]=dr[qJe]=dr[JJe]=dr[n3e]=dr[s3e]=dr[o3e]=dr[a3e]=dr[A3e]=dr[_Je]=dr[VJe]=dr[qse]=dr[XJe]=dr[ZJe]=dr[$Je]=dr[e3e]=dr[l3e]=dr[c3e]=dr[u3e]=dr[g3e]=!0;dr[WJe]=dr[Yse]=dr[t3e]=!1;function q0(r,e,t,i,n,s){var o,a=e&HJe,l=e&jJe,c=e&GJe;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!OJe(r))return r;var u=NJe(r);if(u){if(o=DJe(r),!a)return QJe(r,o)}else{var g=PJe(r),f=g==Yse||g==zJe;if(LJe(r))return bJe(r,a);if(g==qse||g==Gse||f&&!n){if(o=l||f?{}:FJe(r),!a)return l?vJe(r,BJe(o,r)):SJe(r,wJe(o,r))}else{if(!dr[g])return n?r:{};o=RJe(r,g,a)}}s||(s=new EJe);var h=s.get(r);if(h)return h;s.set(r,o),MJe(r)?r.forEach(function(y){o.add(q0(y,e,t,y,r,s))}):TJe(r)&&r.forEach(function(y,b){o.set(b,q0(y,e,t,b,r,s))});var p=c?l?kJe:xJe:l?UJe:KJe,m=u?void 0:p(r);return IJe(m||r,function(y,b){m&&(b=y,y=r[b]),yJe(o,b,q0(y,e,t,b,r,s))}),o}jse.exports=q0});var EN=w((Cpt,Wse)=>{var f3e=Jse(),h3e=1,p3e=4;function d3e(r){return f3e(r,h3e|p3e)}Wse.exports=d3e});var _se=w((mpt,zse)=>{var C3e=kR();function m3e(r,e,t){return r==null?r:C3e(r,e,t)}zse.exports=m3e});var toe=w((bpt,eoe)=>{function E3e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}eoe.exports=E3e});var ioe=w((Qpt,roe)=>{var I3e=hC(),y3e=VP();function w3e(r,e){return e.length<2?r:I3e(r,y3e(e,0,-1))}roe.exports=w3e});var soe=w((Spt,noe)=>{var B3e=Ff(),b3e=toe(),Q3e=ioe(),S3e=gu();function v3e(r,e){return e=B3e(e,r),r=Q3e(r,e),r==null||delete r[S3e(b3e(e))]}noe.exports=v3e});var aoe=w((vpt,ooe)=>{var x3e=soe();function k3e(r,e){return r==null?!0:x3e(r,e)}ooe.exports=k3e});var doe=w((idt,poe)=>{poe.exports={name:"@yarnpkg/cli",version:"3.2.2",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.2.0-rc.4",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var DN=w((LEt,rae)=>{"use strict";rae.exports=function(e,t){t===!0&&(t=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof t=="number"?n[t]:n}});var RN=w((TEt,iae)=>{"use strict";var V3e=DN();function nae(r){if(Array.isArray(r))return r.indexOf("ssh")!==-1||r.indexOf("rsync")!==-1;if(typeof r!="string")return!1;var e=V3e(r);return r=r.substring(r.indexOf("://")+3),nae(e)?!0:r.indexOf("@"){"use strict";var X3e=DN(),Z3e=RN(),$3e=require("querystring");function eWe(r){r=(r||"").trim();var e={protocols:X3e(r),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:r,query:Object.create(null)},t=r.indexOf("://"),i=-1,n=null,s=null;r.startsWith(".")&&(r.startsWith("./")&&(r=r.substring(2)),e.pathname=r,e.protocol="file");var o=r.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(Z3e(r)?e.protocol="ssh":((o==="/"||o==="~")&&(r=r.substring(2)),e.protocol="file"))),t!==-1&&(r=r.substring(t+3)),s=r.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=$3e.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}sae.exports=eWe});var lae=w((MEt,aae)=>{"use strict";var tWe="text/plain",rWe="us-ascii",Aae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),iWe=(r,{stripHash:e})=>{let t=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(";");s=e?"":s;let a=!1;o[o.length-1]==="base64"&&(o.pop(),a=!0);let l=(o.shift()||"").toLowerCase(),u=[...o.map(g=>{let[f,h=""]=g.split("=").map(p=>p.trim());return f==="charset"&&(h=h.toLowerCase(),h===rWe)?"":`${f}${h?`=${h}`:""}`}).filter(Boolean)];return a&&u.push("base64"),(u.length!==0||l&&l!==tWe)&&u.unshift(l),`data:${u.join(";")},${a?n.trim():n}${s?`#${s}`:""}`},nWe=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),r=r.trim(),/^data:/i.test(r))return iWe(r,e);if(/^view-source:/i.test(r))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash?n.hash="":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,"")),n.pathname&&(n.pathname=n.pathname.replace(/(?0){let o=n.pathname.split("/"),a=o[o.length-1];Aae(a,e.removeDirectoryIndex)&&(o=o.slice(0,o.length-1),n.pathname=o.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)(?:[a-z\-\d]{1,63})\.(?:[a-z.\-\d]{2,63})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])Aae(o,e.removeQueryParameters)&&n.searchParams.delete(o);e.removeQueryParameters===!0&&(n.search=""),e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,""));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname==="/"&&!s.endsWith("/")&&n.hash===""&&(r=r.replace(/\/$/,"")),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&e.removeSingleSlash&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};aae.exports=nWe});var uae=w((KEt,cae)=>{"use strict";var sWe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(r){return typeof r}:function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},oWe=oae(),aWe=lae();function AWe(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof r!="string"||!r.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":sWe(e))!=="object"&&(e={stripHash:!1}),r=aWe(r,e));var t=oWe(r);return t}cae.exports=AWe});var hae=w((UEt,gae)=>{"use strict";var lWe=uae(),fae=RN();function cWe(r){var e=lWe(r);e.token="";var t=e.user.split(":");return t.length===2&&(t[1]==="x-oauth-basic"?e.token=t[0]:t[0]==="x-token-auth"&&(e.token=t[1])),fae(e.protocols)||fae(r)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}gae.exports=cWe});var dae=w((HEt,pae)=>{"use strict";var uWe=hae();function FN(r){if(typeof r!="string")throw new Error("The url must be a string.");var e=uWe(r),t=e.resource.split("."),i=null;switch(e.toString=function(l){return FN.stringify(this,l)},e.source=t.length>2?t.slice(1-t.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=t[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}FN.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join("+"):r.protocol);var t=r.port?":"+r.port:"",i=r.user||"git",n=r.git_suffix?".git":"";switch(e){case"ssh":return t?"ssh://"+i+"@"+r.resource+t+"/"+r.full_name+n:i+"@"+r.resource+":"+r.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+r.resource+t+"/"+r.full_name+n;case"http":case"https":var s=r.token?gWe(r):r.user&&(r.protocols.includes("http")||r.protocols.includes("https"))?r.user+"@":"";return e+"://"+s+r.resource+t+"/"+r.full_name+n;default:return r.href}};function gWe(r){switch(r.source){case"bitbucket.org":return"x-token-auth:"+r.token+"@";default:return r.token+"@"}}pae.exports=FN});var cL=w((Vwt,Mae)=>{var DWe=Nf(),RWe=Pf();function FWe(r,e,t){(t!==void 0&&!RWe(r[e],t)||t===void 0&&!(e in r))&&DWe(r,e,t)}Mae.exports=FWe});var Uae=w((Xwt,Kae)=>{var NWe=vC(),LWe=ta();function TWe(r){return LWe(r)&&NWe(r)}Kae.exports=TWe});var Gae=w((Zwt,Hae)=>{var OWe=Wc(),MWe=G0(),KWe=ta(),UWe="[object Object]",HWe=Function.prototype,jWe=Object.prototype,jae=HWe.toString,GWe=jWe.hasOwnProperty,YWe=jae.call(Object);function qWe(r){if(!KWe(r)||OWe(r)!=UWe)return!1;var e=MWe(r);if(e===null)return!0;var t=GWe.call(e,"constructor")&&e.constructor;return typeof t=="function"&&t instanceof t&&jae.call(t)==YWe}Hae.exports=qWe});var uL=w(($wt,Yae)=>{function JWe(r,e){if(!(e==="constructor"&&typeof r[e]=="function")&&e!="__proto__")return r[e]}Yae.exports=JWe});var Jae=w((eBt,qae)=>{var WWe=Zf(),zWe=$f();function _We(r){return WWe(r,zWe(r))}qae.exports=_We});var Zae=w((tBt,Wae)=>{var zae=cL(),VWe=hN(),XWe=CN(),ZWe=pN(),$We=mN(),_ae=dC(),Vae=Ks(),e4e=Uae(),t4e=bC(),r4e=VB(),i4e=Rn(),n4e=Gae(),s4e=g0(),Xae=uL(),o4e=Jae();function a4e(r,e,t,i,n,s,o){var a=Xae(r,t),l=Xae(e,t),c=o.get(l);if(c){zae(r,t,c);return}var u=s?s(a,l,t+"",r,e,o):void 0,g=u===void 0;if(g){var f=Vae(l),h=!f&&t4e(l),p=!f&&!h&&s4e(l);u=l,f||h||p?Vae(a)?u=a:e4e(a)?u=ZWe(a):h?(g=!1,u=VWe(l,!0)):p?(g=!1,u=XWe(l,!0)):u=[]:n4e(l)||_ae(l)?(u=a,_ae(a)?u=o4e(a):(!i4e(a)||r4e(a))&&(u=$We(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),zae(r,t,u)}Wae.exports=a4e});var tAe=w((rBt,$ae)=>{var A4e=xC(),l4e=cL(),c4e=XR(),u4e=Zae(),g4e=Rn(),f4e=$f(),h4e=uL();function eAe(r,e,t,i,n){r!==e&&c4e(e,function(s,o){if(n||(n=new A4e),g4e(s))u4e(r,e,o,t,eAe,i,n);else{var a=i?i(h4e(r,o),s,o+"",r,e,n):void 0;a===void 0&&(a=s),l4e(r,o,a)}},f4e)}$ae.exports=eAe});var iAe=w((iBt,rAe)=>{var p4e=r0(),d4e=RR(),C4e=FR();function m4e(r,e){return C4e(d4e(r,e,p4e),r+"")}rAe.exports=m4e});var sAe=w((nBt,nAe)=>{var E4e=Pf(),I4e=vC(),y4e=pC(),w4e=Rn();function B4e(r,e,t){if(!w4e(t))return!1;var i=typeof e;return(i=="number"?I4e(t)&&y4e(e,t.length):i=="string"&&e in t)?E4e(t[e],r):!1}nAe.exports=B4e});var aAe=w((sBt,oAe)=>{var b4e=iAe(),Q4e=sAe();function S4e(r){return b4e(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s=="function"?(n--,s):void 0,o&&Q4e(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var v4e=tAe(),x4e=aAe(),k4e=x4e(function(r,e,t){v4e(r,e,t)});AAe.exports=k4e});var QAe=w((u0t,bAe)=>{var QL;bAe.exports=()=>(typeof QL=="undefined"&&(QL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),QL)});var TAe=w((Y0t,LAe)=>{var kL;LAe.exports=()=>(typeof kL=="undefined"&&(kL=require("zlib").brotliDecompressSync(Buffer.from("G98hACwL4rGroa5xFloZvem1VcYrNr4K3e9n9r8/X5MOCYHdva5v4pXS1QjWc4tyDqmKnix1U4T8ajah2kQmaKYVQGR2JkiPD9HmUr1q9nHCWrGdiqCk8rzbStVePjiEPXFcOP9pv14jAZX9QobAiuy5lEef34ZwEy7i3Jm3yyHaX2JHqrpVVex8hKx0EbLCdhlOrXITGgMCBEptPxtRLx3hx9+LfNF6W/zeX24omB7/7uWCRfCmxauPftgcYYZc1/N6qOmBcOUdvwbvLI38OUjL8ejESp5hWp+kQBAEATki7M6u7q9fchhnAE4D8W85Cf2S3QQ0/4EfJwKCdm8jpLULdW6KyLvQomntUh3lYuX05RMwTeDwW2j0nIezQkcOumBaRlHL/7cZWGBg+2dfJG1P7TVw0bn8anFVAmIccIhluGcMaO+27fgQ0g0zHBslkwLiCSllgiuIBgIeiU8XaPZw9Kx5lsAP7Za6whksslaONmn5DbyjTP0TIsAUugtU8+pnMy6ATpsPVs1B/LovTC/54WpD4sw5lhxZyeUUIJhSJqKz7W3FFhP9+3GgOq7nYWgxrcUi7vxyUksNlu+MuUzXuHHvAqLnqbIckSnxj3eeAJQ+HHe9zP9oAHQ01FtQVDQRgMRes7BGUSBhqNoGVKdCUwE5K/jdXD/d05nCWJljUQBd04UFgw3iR/W0W+y9WdUEuTma8+yUqsvs3+zknyB1zmJzevvkNDKQx3xfoXyhH55laE+dqESxRCaKR2zWk+ZOPTVl1RTz2EVXsHui7N2zqnI8Lk4xy9OrJnQ1BZ92B6Ov2u7O8tQyt9M3N3FgqdF17H7mRVd8XqLaF0dByhD7J+kv0esV7EJuOCJDCToJ+o536lODrimbBZ18udv+SEwZzkMEtFr+NBoCWnvQC8vUa8nigaa/B6X6lUSpRvAutKlnEfUfcCb4zLFcl+Rq4DgUiysyiIUYHxQh9WK6n37paLU/EnCfd3o9e+7pl244Qf8L9eBouZdO2Ts1J2H1xQVk7aU9squW284YqciYO/+tHHMdJWHa01Qow6q1uJNqRc10q8Btmpf3T7T0lA4yLTHOaJDfXf6d60vwKq4OEJHhovxniEKYBcAslL1d0m1XSDYkAoH1jKWBAfz2b7FmMK4fViUdQtDBhqScPZ+iyurUMCFiSV0qMSYkmmElMUZ3ACAdlpRQd5sLyoIHjTL4oMg8pfdHDrkPvTIzJWvSmhRZW0DuYmehYWUIgzDgcgpOgHYoBeFp4aqzOeXQt6YMqM+JBaA1EHhWlpWecuFLYa7UjWJhOu4s4iBQzFvjvTqotkQ/IJ+E/2Bn9HmcE4I+fVoMt2lusJR0E2c89+3vgtG7F+cGhDqhQke3OE2LAqSEYW40hOfLL1z9UAtPoNRiE+SeJ97NV0wykbgKgEURwyU3LTt1PTdChzJUVOMEAaU5u2BVJY3Wuq0dcSMJ5pgZv+yFT/k+pjz6NgC3h/4KMMVsGiI+bWyDs8a/cm4QKm5NvID8x8M6WZuZaLlkSpVLquFJ7DKQifJpinvx3mF1u3mN42OxV6yjTVxA8o5mCXvO6hWqa6/PjJDloZadqK6ddZzJX1FNDRAByQ3TGZs17NGG9UO13K5IByms1Km60mnG4ey74NrtPVc0d64MbUeLPwp9usUcK91fHkLbOohiF7nYbZxp748+WslrzgaK3ft7IPfk3ibL0erTTL44UFoySUpuIahKp4POL7zCMgPIA2cOhLMlqnjfkIUIICYJwl2aGURcESCmc7B3TFAeErr+bHpVwb0PkfRN85rLZaG0//n+5MM+w7MEx4ntxP6C5c51KW7wGQnW2VeQLnf/9sWwAcx2lIjl4QWDM+nQtH50DgG6njlSyW1QXNTelnEBuhfS8gbuqDIOMxVre8LjAK9Cmz9TJS4DcIAWH/sqbDpGuA1xFaTj9tXUq4J2cW9UnqVXlaB7MenNByf/jbCalqGpeLICFUMy+NCu2STksu71f/SeKUNMOTcXy6nsXLVhJIKge80GRmA+MXA/xPKRxtRumohAb2kxNrUXy0EG5CjGFp2S37bweEtEaiY5FO3ML4mTRKVT/fp3TIkc52KeRUGipn3O2W8zu76sgope8jg+V+lJywW9HOQP3zxm8nhq/2i3tDlu52uaip8Q/sxEqVC3JDm3PrX5Xq7D97PqthoCsPwK7YyVIOrysY3853zu+8SWB2ygtmgL4KbCNNXnEjJ4U9h99kZcq3cp7HRA+JOGCcc+RovA5bU7BnSSQyRHeL0CuPhNSVmqutBOZyC75JYY+uv/AZiaJb0BH48me7BPs9eiOPWAnIIgo7UnIG64d4OIkS2dyiFoVFdSM2xbY1u2jgJFKRmT0dxEQlwNRsAuJorg1dSOGfRbmVRi233XYnGzbk2bYUwIaY4J0rvpIa0544NaCGXdREUETpEXfRH+d4vF8xWBvjywV0wBpQtq2wLL9lilSdusZXoNGCNak+1896M7QvzRtipbCCKM7vSqblsJtfCmo9JXvjZrR4gSc1xfOfXmVkBQ0PQlYc6GNWSFHwiHdEQAW25VHS0SA7y297NOmCzopl9s3CTrewPN1LCphOjBJYNaM1ngLmVKcI2mqUdXZi/GqWRB6civuE9Vmeqv1ZPz1BGPUi75o5ZvuJO4+OA1y9M0D/1MvWX8Os2SLU3mdIYn3TNzTMLiMCoEOzGGJvqVsyjxmb3xZ6oe7nMfIzyaF/rgMRRw/iiGqi7Hpcvj3VGL5amadFOlZi1Ha3L2jKIW0k0B/92/vswU0HKRl+3JftBu/dr3SSnN0JCd99a4LoULqp4ynOmEIf9TgJqZ16lLOOTG5hytXjTEE4BlRK1FIAJH0S5m51pXlDnky2ksR1ZqgJqt06tvhXn5y2Xc/bs3BWwVw5RA5btkWV0KZ3QEiI551w0gOk69aMuHfTTjBjY/ON+sqb19PjDttU+CUt+AiuYi9Xa0ZWmEr0F5haATGKTdLlOk5uF6wWr2SvtMppNNCDVND/oIc1C6S/2ClprLrbGMdWw9hG8JSc6fEBbz9nO9dJU/oaN+05bGVeVr/ZoAe2muur64b5pcjmDNUAuSZjOctRdLWrZWO7AfdbHVuO8NyNLlXAbvSXAX0x3Ve7unalIzbKlEmVV2PDTL92+DUZwBIUYhkGaFP5ETAA==","base64")).toString()),kL)});var YAe=w((TL,OL)=>{(function(r){TL&&typeof TL=="object"&&typeof OL!="undefined"?OL.exports=r():typeof define=="function"&&define.amd?define([],r):typeof window!="undefined"?window.isWindows=r():typeof global!="undefined"?global.isWindows=r():typeof self!="undefined"?self.isWindows=r():this.isWindows=r()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var zAe=w((Vbt,qAe)=>{"use strict";ML.ifExists=C8e;var ah=require("util"),zs=require("path"),JAe=YAe(),m8e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,E8e={createPwshFile:!0,createCmdFile:JAe(),fs:require("fs")},I8e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function WAe(r){let e=N(N({},E8e),r),t=e.fs;return e.fs_={chmod:t.chmod?ah.promisify(t.chmod):async()=>{},mkdir:ah.promisify(t.mkdir),readFile:ah.promisify(t.readFile),stat:ah.promisify(t.stat),unlink:ah.promisify(t.unlink),writeFile:ah.promisify(t.writeFile)},e}async function ML(r,e,t){let i=WAe(t);await i.fs_.stat(r),await y8e(r,e,i)}function C8e(r,e,t){return ML(r,e,t).catch(()=>{})}function w8e(r,e){return e.fs_.unlink(r).catch(()=>{})}async function y8e(r,e,t){let i=await Q8e(r,t);return await B8e(e,t),b8e(r,e,i,t)}function B8e(r,e){return e.fs_.mkdir(zs.dirname(r),{recursive:!0})}function b8e(r,e,t,i){let n=WAe(i),s=[{generator:x8e,extension:""}];return n.createCmdFile&&s.push({generator:v8e,extension:".cmd"}),n.createPwshFile&&s.push({generator:k8e,extension:".ps1"}),Promise.all(s.map(o=>S8e(r,e+o.extension,t,o.generator,n)))}function P8e(r,e){return w8e(r,e)}function R8e(r,e){return D8e(r,e)}async function Q8e(r,e){let n=(await e.fs_.readFile(r,"utf8")).trim().split(/\r*\n/)[0].match(m8e);if(!n){let s=zs.extname(r).toLowerCase();return{program:I8e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function S8e(r,e,t,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[t.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:t.program,args:o}),await P8e(e,n),await n.fs_.writeFile(e,i(r,e,n),"utf8"),R8e(e,n)}function v8e(r,e,t){let n=zs.relative(zs.dirname(e),r).split("/").join("\\"),s=zs.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=t.prog,l=t.args||"",c=KL(t.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=t.progArgs?`${t.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r -`:"";return o?g+=`@IF EXIST ${o} (\r - ${o} ${l} ${n} ${u}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${a} ${l} ${n} ${u}%*\r -)\r -`:g+=`@${a} ${l} ${n} ${u}%*\r -`,g}function x8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=t.args||"",l=KL(t.nodePath).posix;n?(s=`"$basedir/${t.prog}"`,i=o):(n=o,a="",i="");let c=t.progArgs?`${t.progArgs.join(" ")} `:"",u=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,g=t.nodePath?`export NODE_PATH="${l}" -`:"";return s?u+=`${g}if [ -x ${s} ]; then - exec ${s} ${a} ${i} ${c}"$@" -else - exec ${n} ${a} ${i} ${c}"$@" -fi -`:u+=`${g}${n} ${a} ${i} ${c}"$@" -exit $? -`,u}function k8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=t.args||"",c=KL(t.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${t.prog}$exe"`,i=a):(s=a,l="",i="");let f=t.progArgs?`${t.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${t.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${u}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return t.nodePath&&(h+=` else { - $env:NODE_PATH="${g}" -}`),o?h+=` -$ret=0 -if (Test-Path ${o}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${o} ${l} ${i} ${f}$args - } else { - & ${o} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args - } else { - & ${s} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} -${t.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:h+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args -} else { - & ${s} ${l} ${i} ${f}$args -} -${t.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,h}function D8e(r,e){return e.fs_.chmod(r,493)}function KL(r){if(!r)return{win32:"",posix:""};let e=typeof r=="string"?r.split(zs.delimiter):Array.from(r),t={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];t.win32=t.win32?`${t.win32};${n}`:n,t.posix=t.posix?`${t.posix}:${s}`:s,t[i]={win32:n,posix:s}}return t}qAe.exports=ML});var eT=w((RSt,hle)=>{hle.exports=require("stream")});var mle=w((FSt,ple)=>{"use strict";function dle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function Z8e(r){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(t){var i={data:t,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(t){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=t+i.data;return n}},{key:"concat",value:function(t){if(this.length===0)return lb.alloc(0);for(var i=lb.allocUnsafe(t>>>0),n=this.head,s=0;n;)nze(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(t,i){var n;return to.length?o.length:t;if(a===o.length?s+=o:s+=o.slice(0,t),t-=a,t===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(t){var i=lb.allocUnsafe(t),n=this.head,s=1;for(n.data.copy(i),t-=n.data.length;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(i,i.length-t,0,a),t-=a,t===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:ize,value:function(t,i){return tT(this,Z8e({},i,{depth:0,customInspect:!1}))}}]),r}()});var iT=w((NSt,Ele)=>{"use strict";function sze(r,e){var t=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(r):r&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(rT,this,r)):process.nextTick(rT,this,r)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(r||null,function(s){!e&&s?t._writableState?t._writableState.errorEmitted?process.nextTick(cb,t):(t._writableState.errorEmitted=!0,process.nextTick(Ile,t,s)):process.nextTick(Ile,t,s):e?(process.nextTick(cb,t),e(s)):process.nextTick(cb,t)}),this)}function Ile(r,e){rT(r,e),cb(r)}function cb(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit("close")}function oze(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function rT(r,e){r.emit("error",e)}function aze(r,e){var t=r._readableState,i=r._writableState;t&&t.autoDestroy||i&&i.autoDestroy?r.destroy(e):r.emit("error",e)}Ele.exports={destroy:sze,undestroy:oze,errorOrDestroy:aze}});var Ul=w((LSt,yle)=>{"use strict";var wle={};function _s(r,e,t){t||(t=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends t{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=t.name,n.prototype.code=r,wle[r]=n}function Ble(r,e){if(Array.isArray(r)){let t=r.length;return r=r.map(i=>String(i)),t>2?`one of ${e} ${r.slice(0,t-1).join(", ")}, or `+r[t-1]:t===2?`one of ${e} ${r[0]} or ${r[1]}`:`of ${e} ${r[0]}`}else return`of ${e} ${String(r)}`}function Aze(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function lze(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function cze(r,e,t){return typeof t!="number"&&(t=0),t+e.length>r.length?!1:r.indexOf(e,t)!==-1}_s("ERR_INVALID_OPT_VALUE",function(r,e){return'The value "'+e+'" is invalid for option "'+r+'"'},TypeError);_s("ERR_INVALID_ARG_TYPE",function(r,e,t){let i;typeof e=="string"&&Aze(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(lze(r," argument"))n=`The ${r} ${i} ${Ble(e,"type")}`;else{let s=cze(r,".")?"property":"argument";n=`The "${r}" ${s} ${i} ${Ble(e,"type")}`}return n+=`. Received type ${typeof t}`,n},TypeError);_s("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");_s("ERR_METHOD_NOT_IMPLEMENTED",function(r){return"The "+r+" method is not implemented"});_s("ERR_STREAM_PREMATURE_CLOSE","Premature close");_s("ERR_STREAM_DESTROYED",function(r){return"Cannot call "+r+" after a stream was destroyed"});_s("ERR_MULTIPLE_CALLBACK","Callback called multiple times");_s("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");_s("ERR_STREAM_WRITE_AFTER_END","write after end");_s("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);_s("ERR_UNKNOWN_ENCODING",function(r){return"Unknown encoding: "+r},TypeError);_s("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");yle.exports.codes=wle});var nT=w((TSt,ble)=>{"use strict";var uze=Ul().codes.ERR_INVALID_OPT_VALUE;function gze(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function fze(r,e,t,i){var n=gze(e,i,t);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?t:"highWaterMark";throw new uze(s,n)}return Math.floor(n)}return r.objectMode?16:16*1024}ble.exports={getHighWaterMark:fze}});var Qle=w((OSt,sT)=>{typeof Object.create=="function"?sT.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:sT.exports=function(e,t){if(t){e.super_=t;var i=function(){};i.prototype=t.prototype,e.prototype=new i,e.prototype.constructor=e}}});var Hl=w((MSt,oT)=>{try{if(aT=require("util"),typeof aT.inherits!="function")throw"";oT.exports=aT.inherits}catch(r){oT.exports=Qle()}var aT});var vle=w((KSt,Sle)=>{Sle.exports=require("util").deprecate});var cT=w((USt,xle)=>{"use strict";xle.exports=Gr;function kle(r){var e=this;this.next=null,this.entry=null,this.finish=function(){hze(e,r)}}var ch;Gr.WritableState=Gm;var pze={deprecate:vle()},Ple=eT(),ub=require("buffer").Buffer,dze=global.Uint8Array||function(){};function Cze(r){return ub.from(r)}function mze(r){return ub.isBuffer(r)||r instanceof dze}var AT=iT(),Eze=nT(),Ize=Eze.getHighWaterMark,jl=Ul().codes,yze=jl.ERR_INVALID_ARG_TYPE,wze=jl.ERR_METHOD_NOT_IMPLEMENTED,Bze=jl.ERR_MULTIPLE_CALLBACK,bze=jl.ERR_STREAM_CANNOT_PIPE,Qze=jl.ERR_STREAM_DESTROYED,Sze=jl.ERR_STREAM_NULL_VALUES,vze=jl.ERR_STREAM_WRITE_AFTER_END,xze=jl.ERR_UNKNOWN_ENCODING,uh=AT.errorOrDestroy;Hl()(Gr,Ple);function kze(){}function Gm(r,e,t){ch=ch||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof ch),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.writableObjectMode),this.highWaterMark=Ize(this,r,"writableHighWaterMark",t),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=r.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=r.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){Pze(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new kle(this)}Gm.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t};(function(){try{Object.defineProperty(Gm.prototype,"buffer",{get:pze.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(r){}})();var gb;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(gb=Function.prototype[Symbol.hasInstance],Object.defineProperty(Gr,Symbol.hasInstance,{value:function(e){return gb.call(this,e)?!0:this!==Gr?!1:e&&e._writableState instanceof Gm}})):gb=function(e){return e instanceof this};function Gr(r){ch=ch||ku();var e=this instanceof ch;if(!e&&!gb.call(Gr,this))return new Gr(r);this._writableState=new Gm(r,this,e),this.writable=!0,r&&(typeof r.write=="function"&&(this._write=r.write),typeof r.writev=="function"&&(this._writev=r.writev),typeof r.destroy=="function"&&(this._destroy=r.destroy),typeof r.final=="function"&&(this._final=r.final)),Ple.call(this)}Gr.prototype.pipe=function(){uh(this,new bze)};function Dze(r,e){var t=new vze;uh(r,t),process.nextTick(e,t)}function Rze(r,e,t,i){var n;return t===null?n=new Sze:typeof t!="string"&&!e.objectMode&&(n=new yze("chunk",["string","Buffer"],t)),n?(uh(r,n),process.nextTick(i,n),!1):!0}Gr.prototype.write=function(r,e,t){var i=this._writableState,n=!1,s=!i.objectMode&&mze(r);return s&&!ub.isBuffer(r)&&(r=Cze(r)),typeof e=="function"&&(t=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof t!="function"&&(t=kze),i.ending?Dze(this,t):(s||Rze(this,i,r,t))&&(i.pendingcb++,n=Fze(this,i,s,r,e,t)),n};Gr.prototype.cork=function(){this._writableState.corked++};Gr.prototype.uncork=function(){var r=this._writableState;r.corked&&(r.corked--,!r.writing&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&Dle(this,r))};Gr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new xze(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Gr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Nze(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e=="string"&&(e=ub.from(e,t)),e}Object.defineProperty(Gr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Fze(r,e,t,i,n,s){if(!t){var o=Nze(e,i,n);i!==o&&(t=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var Hze=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};Nle.exports=Ea;var Lle=uT(),gT=cT();Hl()(Ea,Lle);for(fT=Hze(gT.prototype),fb=0;fb{var pb=require("buffer"),vA=pb.Buffer;function Ole(r,e){for(var t in r)e[t]=r[t]}vA.from&&vA.alloc&&vA.allocUnsafe&&vA.allocUnsafeSlow?Tle.exports=pb:(Ole(pb,hT),hT.Buffer=gh);function gh(r,e,t){return vA(r,e,t)}Ole(vA,gh);gh.from=function(r,e,t){if(typeof r=="number")throw new TypeError("Argument must not be a number");return vA(r,e,t)};gh.alloc=function(r,e,t){if(typeof r!="number")throw new TypeError("Argument must be a number");var i=vA(r);return e!==void 0?typeof t=="string"?i.fill(e,t):i.fill(e):i.fill(0),i};gh.allocUnsafe=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return vA(r)};gh.allocUnsafeSlow=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return pb.SlowBuffer(r)}});var CT=w(Kle=>{"use strict";var pT=Mle().Buffer,Ule=pT.isEncoding||function(r){switch(r=""+r,r&&r.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Yze(r){if(!r)return"utf8";for(var e;;)switch(r){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return r;default:if(e)return;r=(""+r).toLowerCase(),e=!0}}function qze(r){var e=Yze(r);if(typeof e!="string"&&(pT.isEncoding===Ule||!Ule(r)))throw new Error("Unknown encoding: "+r);return e||r}Kle.StringDecoder=qm;function qm(r){this.encoding=qze(r);var e;switch(this.encoding){case"utf16le":this.text=Wze,this.end=zze,e=4;break;case"utf8":this.fillLast=Jze,e=4;break;case"base64":this.text=_ze,this.end=Vze,e=3;break;default:this.write=Xze,this.end=Zze;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=pT.allocUnsafe(e)}qm.prototype.write=function(r){if(r.length===0)return"";var e,t;if(this.lastNeed){if(e=this.fillLast(r),e===void 0)return"";t=this.lastNeed,this.lastNeed=0}else t=0;return t>5==6?2:r>>4==14?3:r>>3==30?4:r>>6==2?-1:-2}function t5e(r,e,t){var i=e.length-1;if(i=0?(n>0&&(r.lastNeed=n-1),n):--i=0?(n>0&&(r.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:r.lastNeed=n-3),n):0))}function r5e(r,e,t){if((e[0]&192)!=128)return r.lastNeed=0,"\uFFFD";if(r.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return r.lastNeed=1,"\uFFFD";if(r.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return r.lastNeed=2,"\uFFFD"}}function Jze(r){var e=this.lastTotal-this.lastNeed,t=r5e(this,r,e);if(t!==void 0)return t;if(this.lastNeed<=r.length)return r.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,e,0,r.length),this.lastNeed-=r.length}function e5e(r,e){var t=t5e(this,r,e);if(!this.lastNeed)return r.toString("utf8",e);this.lastTotal=t;var i=r.length-(t-this.lastNeed);return r.copy(this.lastChar,0,i),r.toString("utf8",e,i)}function $ze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+"\uFFFD":e}function Wze(r,e){if((r.length-e)%2==0){var t=r.toString("utf16le",e);if(t){var i=t.charCodeAt(t.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1],t.slice(0,-1)}return t}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=r[r.length-1],r.toString("utf16le",e,r.length-1)}function zze(r){var e=r&&r.length?this.write(r):"";if(this.lastNeed){var t=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,t)}return e}function _ze(r,e){var t=(r.length-e)%3;return t===0?r.toString("base64",e):(this.lastNeed=3-t,this.lastTotal=3,t===1?this.lastChar[0]=r[r.length-1]:(this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1]),r.toString("base64",e,r.length-t))}function Vze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function Xze(r){return r.toString(this.encoding)}function Zze(r){return r&&r.length?this.write(r):""}});var db=w((GSt,Hle)=>{"use strict";var jle=Ul().codes.ERR_STREAM_PREMATURE_CLOSE;function i5e(r){var e=!1;return function(){if(!e){e=!0;for(var t=arguments.length,i=new Array(t),n=0;n{"use strict";var Cb;function Gl(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var o5e=db(),Yl=Symbol("lastResolve"),Pu=Symbol("lastReject"),Jm=Symbol("error"),mb=Symbol("ended"),Du=Symbol("lastPromise"),mT=Symbol("handlePromise"),Ru=Symbol("stream");function ql(r,e){return{value:r,done:e}}function a5e(r){var e=r[Yl];if(e!==null){var t=r[Ru].read();t!==null&&(r[Du]=null,r[Yl]=null,r[Pu]=null,e(ql(t,!1)))}}function A5e(r){process.nextTick(a5e,r)}function l5e(r,e){return function(t,i){r.then(function(){if(e[mb]){t(ql(void 0,!0));return}e[mT](t,i)},i)}}var c5e=Object.getPrototypeOf(function(){}),u5e=Object.setPrototypeOf((Cb={get stream(){return this[Ru]},next:function(){var e=this,t=this[Jm];if(t!==null)return Promise.reject(t);if(this[mb])return Promise.resolve(ql(void 0,!0));if(this[Ru].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[Jm]?a(e[Jm]):o(ql(void 0,!0))})});var i=this[Du],n;if(i)n=new Promise(l5e(i,this));else{var s=this[Ru].read();if(s!==null)return Promise.resolve(ql(s,!1));n=new Promise(this[mT])}return this[Du]=n,n}},Gl(Cb,Symbol.asyncIterator,function(){return this}),Gl(Cb,"return",function(){var e=this;return new Promise(function(t,i){e[Ru].destroy(null,function(n){if(n){i(n);return}t(ql(void 0,!0))})})}),Cb),c5e),g5e=function(e){var t,i=Object.create(u5e,(t={},Gl(t,Ru,{value:e,writable:!0}),Gl(t,Yl,{value:null,writable:!0}),Gl(t,Pu,{value:null,writable:!0}),Gl(t,Jm,{value:null,writable:!0}),Gl(t,mb,{value:e._readableState.endEmitted,writable:!0}),Gl(t,mT,{value:function(s,o){var a=i[Ru].read();a?(i[Du]=null,i[Yl]=null,i[Pu]=null,s(ql(a,!1))):(i[Yl]=s,i[Pu]=o)},writable:!0}),t));return i[Du]=null,o5e(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[Pu];s!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,s(n)),i[Jm]=n;return}var o=i[Yl];o!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,o(ql(void 0,!0))),i[mb]=!0}),e.on("readable",A5e.bind(null,i)),i};Yle.exports=g5e});var _le=w((qSt,Jle)=>{"use strict";function Wle(r,e,t,i,n,s,o){try{var a=r[s](o),l=a.value}catch(c){t(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function f5e(r){return function(){var e=this,t=arguments;return new Promise(function(i,n){var s=r.apply(e,t);function o(l){Wle(s,i,n,o,a,"next",l)}function a(l){Wle(s,i,n,o,a,"throw",l)}o(void 0)})}}function zle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function p5e(r){for(var e=1;e{"use strict";Vle.exports=Ut;var fh;Ut.ReadableState=Xle;var JSt=require("events").EventEmitter,Zle=function(e,t){return e.listeners(t).length},Wm=eT(),Eb=require("buffer").Buffer,m5e=global.Uint8Array||function(){};function E5e(r){return Eb.from(r)}function I5e(r){return Eb.isBuffer(r)||r instanceof m5e}var ET=require("util"),Pt;ET&&ET.debuglog?Pt=ET.debuglog("stream"):Pt=function(){};var y5e=mle(),IT=iT(),w5e=nT(),B5e=w5e.getHighWaterMark,Ib=Ul().codes,b5e=Ib.ERR_INVALID_ARG_TYPE,Q5e=Ib.ERR_STREAM_PUSH_AFTER_EOF,S5e=Ib.ERR_METHOD_NOT_IMPLEMENTED,v5e=Ib.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,hh,yT,wT;Hl()(Ut,Wm);var zm=IT.errorOrDestroy,BT=["error","close","destroy","pause","resume"];function x5e(r,e,t){if(typeof r.prependListener=="function")return r.prependListener(e,t);!r._events||!r._events[e]?r.on(e,t):Array.isArray(r._events[e])?r._events[e].unshift(t):r._events[e]=[t,r._events[e]]}function Xle(r,e,t){fh=fh||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof fh),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.readableObjectMode),this.highWaterMark=B5e(this,r,"readableHighWaterMark",t),this.buffer=new y5e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.destroyed=!1,this.defaultEncoding=r.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,r.encoding&&(hh||(hh=CT().StringDecoder),this.decoder=new hh(r.encoding),this.encoding=r.encoding)}function Ut(r){if(fh=fh||ku(),!(this instanceof Ut))return new Ut(r);var e=this instanceof fh;this._readableState=new Xle(r,this,e),this.readable=!0,r&&(typeof r.read=="function"&&(this._read=r.read),typeof r.destroy=="function"&&(this._destroy=r.destroy)),Wm.call(this)}Object.defineProperty(Ut.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Ut.prototype.destroy=IT.destroy;Ut.prototype._undestroy=IT.undestroy;Ut.prototype._destroy=function(r,e){e(r)};Ut.prototype.push=function(r,e){var t=this._readableState,i;return t.objectMode?i=!0:typeof r=="string"&&(e=e||t.defaultEncoding,e!==t.encoding&&(r=Eb.from(r,e),e=""),i=!0),$le(this,r,e,!1,i)};Ut.prototype.unshift=function(r){return $le(this,r,null,!0,!1)};function $le(r,e,t,i,n){Pt("readableAddChunk",e);var s=r._readableState;if(e===null)s.reading=!1,P5e(r,s);else{var o;if(n||(o=k5e(s,e)),o)zm(r,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==Eb.prototype&&(e=E5e(e)),i)s.endEmitted?zm(r,new v5e):bT(r,s,e,!0);else if(s.ended)zm(r,new Q5e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!t?(e=s.decoder.write(e),s.objectMode||e.length!==0?bT(r,s,e,!1):QT(r,s)):bT(r,s,e,!1)}else i||(s.reading=!1,QT(r,s))}return!s.ended&&(s.length=ece?r=ece:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function tce(r,e){return r<=0||e.length===0&&e.ended?0:e.objectMode?1:r!==r?e.flowing&&e.length?e.buffer.head.data.length:e.length:(r>e.highWaterMark&&(e.highWaterMark=D5e(r)),r<=e.length?r:e.ended?e.length:(e.needReadable=!0,0))}Ut.prototype.read=function(r){Pt("read",r),r=parseInt(r,10);var e=this._readableState,t=r;if(r!==0&&(e.emittedReadable=!1),r===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Pt("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?ST(this):yb(this),null;if(r=tce(r,e),r===0&&e.ended)return e.length===0&&ST(this),null;var i=e.needReadable;Pt("need readable",i),(e.length===0||e.length-r0?n=rce(r,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,r=0):(e.length-=r,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),t!==r&&e.ended&&ST(this)),n!==null&&this.emit("data",n),n};function P5e(r,e){if(Pt("onEofChunk"),!e.ended){if(e.decoder){var t=e.decoder.end();t&&t.length&&(e.buffer.push(t),e.length+=e.objectMode?1:t.length)}e.ended=!0,e.sync?yb(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,ice(r)))}}function yb(r){var e=r._readableState;Pt("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Pt("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(ice,r))}function ice(r){var e=r._readableState;Pt("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(r.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,vT(r)}function QT(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(R5e,r,e))}function R5e(r,e){for(;!e.reading&&!e.ended&&(e.length1&&nce(i.pipes,r)!==-1)&&!c&&(Pt("false write response, pause",i.awaitDrain),i.awaitDrain++),t.pause())}function f(y){Pt("onerror",y),m(),r.removeListener("error",f),Zle(r,"error")===0&&zm(r,y)}x5e(r,"error",f);function h(){r.removeListener("finish",p),m()}r.once("close",h);function p(){Pt("onfinish"),r.removeListener("close",h),m()}r.once("finish",p);function m(){Pt("unpipe"),t.unpipe(r)}return r.emit("pipe",t),i.flowing||(Pt("pipe resume"),t.resume()),r};function F5e(r){return function(){var t=r._readableState;Pt("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Zle(r,"data")&&(t.flowing=!0,vT(r))}}Ut.prototype.unpipe=function(r){var e=this._readableState,t={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return r&&r!==e.pipes?this:(r||(r=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,r&&r.emit("unpipe",this,t),this);if(!r){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):r==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Pt("on readable",i.length,i.reading),i.length?yb(this):i.reading||process.nextTick(N5e,this)),t};Ut.prototype.addListener=Ut.prototype.on;Ut.prototype.removeListener=function(r,e){var t=Wm.prototype.removeListener.call(this,r,e);return r==="readable"&&process.nextTick(sce,this),t};Ut.prototype.removeAllListeners=function(r){var e=Wm.prototype.removeAllListeners.apply(this,arguments);return(r==="readable"||r===void 0)&&process.nextTick(sce,this),e};function sce(r){var e=r._readableState;e.readableListening=r.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:r.listenerCount("data")>0&&r.resume()}function N5e(r){Pt("readable nexttick read 0"),r.read(0)}Ut.prototype.resume=function(){var r=this._readableState;return r.flowing||(Pt("resume"),r.flowing=!r.readableListening,L5e(this,r)),r.paused=!1,this};function L5e(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(T5e,r,e))}function T5e(r,e){Pt("resume",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit("resume"),vT(r),e.flowing&&!e.reading&&r.read(0)}Ut.prototype.pause=function(){return Pt("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(Pt("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function vT(r){var e=r._readableState;for(Pt("flow",e.flowing);e.flowing&&r.read()!==null;);}Ut.prototype.wrap=function(r){var e=this,t=this._readableState,i=!1;r.on("end",function(){if(Pt("wrapped end"),t.decoder&&!t.ended){var o=t.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),r.on("data",function(o){if(Pt("wrapped data"),t.decoder&&(o=t.decoder.write(o)),!(t.objectMode&&o==null)&&!(!t.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,r.pause())}});for(var n in r)this[n]===void 0&&typeof r[n]=="function"&&(this[n]=function(a){return function(){return r[a].apply(r,arguments)}}(n));for(var s=0;s=e.length?(e.decoder?t=e.buffer.join(""):e.buffer.length===1?t=e.buffer.first():t=e.buffer.concat(e.length),e.buffer.clear()):t=e.buffer.consume(r,e.decoder),t}function ST(r){var e=r._readableState;Pt("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(O5e,e,r))}function O5e(r,e){if(Pt("endReadableNT",r.endEmitted,r.length),!r.endEmitted&&r.length===0&&(r.endEmitted=!0,e.readable=!1,e.emit("end"),r.autoDestroy)){var t=e._writableState;(!t||t.autoDestroy&&t.finished)&&e.destroy()}}typeof Symbol=="function"&&(Ut.from=function(r,e){return wT===void 0&&(wT=_le()),wT(Ut,r,e)});function nce(r,e){for(var t=0,i=r.length;t{"use strict";oce.exports=xA;var wb=Ul().codes,M5e=wb.ERR_METHOD_NOT_IMPLEMENTED,K5e=wb.ERR_MULTIPLE_CALLBACK,U5e=wb.ERR_TRANSFORM_ALREADY_TRANSFORMING,H5e=wb.ERR_TRANSFORM_WITH_LENGTH_0,Bb=ku();Hl()(xA,Bb);function j5e(r,e){var t=this._transformState;t.transforming=!1;var i=t.writecb;if(i===null)return this.emit("error",new K5e);t.writechunk=null,t.writecb=null,e!=null&&this.push(e),i(r);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";Ace.exports=_m;var lce=xT();Hl()(_m,lce);function _m(r){if(!(this instanceof _m))return new _m(r);lce.call(this,r)}_m.prototype._transform=function(r,e,t){t(null,r)}});var pce=w((VSt,uce)=>{"use strict";var kT;function Y5e(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var gce=Ul().codes,q5e=gce.ERR_MISSING_ARGS,J5e=gce.ERR_STREAM_DESTROYED;function fce(r){if(r)throw r}function W5e(r){return r.setHeader&&typeof r.abort=="function"}function z5e(r,e,t,i){i=Y5e(i);var n=!1;r.on("close",function(){n=!0}),kT===void 0&&(kT=db()),kT(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,W5e(r))return r.abort();if(typeof r.destroy=="function")return r.destroy();i(o||new J5e("pipe"))}}}function hce(r){r()}function _5e(r,e){return r.pipe(e)}function V5e(r){return!r.length||typeof r[r.length-1]!="function"?fce:r.pop()}function X5e(){for(var r=arguments.length,e=new Array(r),t=0;t0;return z5e(o,l,c,function(u){n||(n=u),u&&s.forEach(hce),!l&&(s.forEach(hce),i(n))})});return e.reduce(_5e)}uce.exports=X5e});var ph=w((Vs,Vm)=>{var Xm=require("stream");process.env.READABLE_STREAM==="disable"&&Xm?(Vm.exports=Xm.Readable,Object.assign(Vm.exports,Xm),Vm.exports.Stream=Xm):(Vs=Vm.exports=uT(),Vs.Stream=Xm||Vs,Vs.Readable=Vs,Vs.Writable=cT(),Vs.Duplex=ku(),Vs.Transform=xT(),Vs.PassThrough=cce(),Vs.finished=db(),Vs.pipeline=pce())});var mce=w((XSt,dce)=>{"use strict";var{Buffer:So}=require("buffer"),Cce=Symbol.for("BufferList");function mr(r){if(!(this instanceof mr))return new mr(r);mr._init.call(this,r)}mr._init=function(e){Object.defineProperty(this,Cce,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};mr.prototype._new=function(e){return new mr(e)};mr.prototype._offset=function(e){if(e===0)return[0,0];let t=0;for(let i=0;ithis.length||e<0)return;let t=this._offset(e);return this._bufs[t[0]][t[1]]};mr.prototype.slice=function(e,t){return typeof e=="number"&&e<0&&(e+=this.length),typeof t=="number"&&t<0&&(t+=this.length),this.copy(null,0,e,t)};mr.prototype.copy=function(e,t,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||So.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&t||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:So.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};mr.prototype.shallowSlice=function(e,t){if(e=e||0,t=typeof t!="number"?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return this._new();let i=this._offset(e),n=this._offset(t),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};mr.prototype.toString=function(e,t,i){return this.slice(t,i).toString(e)};mr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};mr.prototype.duplicate=function(){let e=this._new();for(let t=0;tthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=r.length){let l=o.indexOf(r,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-r.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,r))return l;s++}s=0}return-1};mr.prototype._match=function(r,e){if(this.length-r{"use strict";var PT=ph().Duplex,Z5e=Hl(),Zm=mce();function Zi(r){if(!(this instanceof Zi))return new Zi(r);if(typeof r=="function"){this._callback=r;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),r=null}Zm._init.call(this,r),PT.call(this)}Z5e(Zi,PT);Object.assign(Zi.prototype,Zm.prototype);Zi.prototype._new=function(e){return new Zi(e)};Zi.prototype._write=function(e,t,i){this._appendBuffer(e),typeof i=="function"&&i()};Zi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Zi.prototype.end=function(e){PT.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Zi.prototype._destroy=function(e,t){this._bufs.length=0,this.length=0,t(e)};Zi.prototype._isBufferList=function(e){return e instanceof Zi||e instanceof Zm||Zi.isBufferList(e)};Zi.isBufferList=Zm.isBufferList;bb.exports=Zi;bb.exports.BufferListStream=Zi;bb.exports.BufferList=Zm});var FT=w(dh=>{var $5e=Buffer.alloc,e9e="0000000000000000000",t9e="7777777777777777777",Ice="0".charCodeAt(0),yce=Buffer.from("ustar\0","binary"),r9e=Buffer.from("00","binary"),i9e=Buffer.from("ustar ","binary"),n9e=Buffer.from(" \0","binary"),s9e=parseInt("7777",8),$m=257,DT=263,o9e=function(r,e,t){return typeof r!="number"?t:(r=~~r,r>=e?e:r>=0||(r+=e,r>=0)?r:0)},a9e=function(r){switch(r){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},A9e=function(r){switch(r){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},wce=function(r,e,t,i){for(;te?t9e.slice(0,e)+" ":e9e.slice(0,e-r.length)+r+" "};function l9e(r){var e;if(r[0]===128)e=!0;else if(r[0]===255)e=!1;else return null;for(var t=[],i=r.length-1;i>0;i--){var n=r[i];e?t.push(n):t.push(255-n)}var s=0,o=t.length;for(i=0;i=Math.pow(10,t)&&t++,e+t+r};dh.decodeLongPath=function(r,e){return Ch(r,0,r.length,e)};dh.encodePax=function(r){var e="";r.name&&(e+=RT(" path="+r.name+` -`)),r.linkname&&(e+=RT(" linkpath="+r.linkname+` -`));var t=r.pax;if(t)for(var i in t)e+=RT(" "+i+"="+t[i]+` -`);return Buffer.from(e)};dh.decodePax=function(r){for(var e={};r.length;){for(var t=0;t100;){var n=t.indexOf("/");if(n===-1)return null;i+=i?"/"+t.slice(0,n):t.slice(0,n),t=t.slice(n+1)}return Buffer.byteLength(t)>100||Buffer.byteLength(i)>155||r.linkname&&Buffer.byteLength(r.linkname)>100?null:(e.write(t),e.write(Jl(r.mode&s9e,6),100),e.write(Jl(r.uid,6),108),e.write(Jl(r.gid,6),116),e.write(Jl(r.size,11),124),e.write(Jl(r.mtime.getTime()/1e3|0,11),136),e[156]=Ice+A9e(r.type),r.linkname&&e.write(r.linkname,157),yce.copy(e,$m),r9e.copy(e,DT),r.uname&&e.write(r.uname,265),r.gname&&e.write(r.gname,297),e.write(Jl(r.devmajor||0,6),329),e.write(Jl(r.devminor||0,6),337),i&&e.write(i,345),e.write(Jl(Bce(e),6),148),e)};dh.decode=function(r,e,t){var i=r[156]===0?0:r[156]-Ice,n=Ch(r,0,100,e),s=Wl(r,100,8),o=Wl(r,108,8),a=Wl(r,116,8),l=Wl(r,124,12),c=Wl(r,136,12),u=a9e(i),g=r[157]===0?null:Ch(r,157,100,e),f=Ch(r,265,32),h=Ch(r,297,32),p=Wl(r,329,8),m=Wl(r,337,8),y=Bce(r);if(y===8*32)return null;if(y!==Wl(r,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(yce.compare(r,$m,$m+6)===0)r[345]&&(n=Ch(r,345,155,e)+"/"+n);else if(!(i9e.compare(r,$m,$m+6)===0&&n9e.compare(r,DT,DT+2)===0)){if(!t)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:m}}});var Pce=w((evt,bce)=>{var Qce=require("util"),c9e=Ece(),eE=FT(),Sce=ph().Writable,vce=ph().PassThrough,xce=function(){},kce=function(r){return r&=511,r&&512-r},u9e=function(r,e){var t=new Qb(r,e);return t.end(),t},g9e=function(r,e){return e.path&&(r.name=e.path),e.linkpath&&(r.linkname=e.linkpath),e.size&&(r.size=parseInt(e.size,10)),r.pax=e,r},Qb=function(r,e){this._parent=r,this.offset=e,vce.call(this,{autoDestroy:!1})};Qce.inherits(Qb,vce);Qb.prototype.destroy=function(r){this._parent.destroy(r)};var kA=function(r){if(!(this instanceof kA))return new kA(r);Sce.call(this,r),r=r||{},this._offset=0,this._buffer=c9e(),this._missing=0,this._partial=!1,this._onparse=xce,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,t=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=kce(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(kce(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=eE.decodePax(t.slice(0,f)),t.consume(f),s()},l=function(){var f=e._header.size;e._pax=eE.decodePax(t.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),t.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=eE.decode(t.slice(0,512),r.filenameEncoding,r.allowUnknownFormat)}catch(p){e.emit("error",p)}if(t.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=g9e(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,u9e(e,f),n);return}e._stream=new Qb(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};Qce.inherits(kA,Sce);kA.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.emit("close"))};kA.prototype._parse=function(r,e){this._destroyed||(this._offset+=r,this._missing=r,e===this._onheader&&(this._partial=!1),this._onparse=e)};kA.prototype._continue=function(){if(!this._destroyed){var r=this._cb;this._cb=xce,this._overflow?this._write(this._overflow,void 0,r):r()}};kA.prototype._write=function(r,e,t){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(r.length&&(this._partial=!0),r.lengths&&(o=r.slice(s),r=r.slice(0,s)),i?i.end(r):n.append(r),this._overflow=o,this._onparse()}};kA.prototype._final=function(r){if(this._partial)return this.destroy(new Error("Unexpected end of data"));r()};bce.exports=kA});var Rce=w((tvt,Dce)=>{Dce.exports=require("fs").constants||require("constants")});var Oce=w((rvt,Fce)=>{var mh=Rce(),Nce=Mk(),Sb=Hl(),f9e=Buffer.alloc,Lce=ph().Readable,Eh=ph().Writable,h9e=require("string_decoder").StringDecoder,vb=FT(),p9e=parseInt("755",8),d9e=parseInt("644",8),Tce=f9e(1024),NT=function(){},LT=function(r,e){e&=511,e&&r.push(Tce.slice(0,512-e))};function C9e(r){switch(r&mh.S_IFMT){case mh.S_IFBLK:return"block-device";case mh.S_IFCHR:return"character-device";case mh.S_IFDIR:return"directory";case mh.S_IFIFO:return"fifo";case mh.S_IFLNK:return"symlink"}return"file"}var xb=function(r){Eh.call(this),this.written=0,this._to=r,this._destroyed=!1};Sb(xb,Eh);xb.prototype._write=function(r,e,t){if(this.written+=r.length,this._to.push(r))return t();this._to._drain=t};xb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var kb=function(){Eh.call(this),this.linkname="",this._decoder=new h9e("utf-8"),this._destroyed=!1};Sb(kb,Eh);kb.prototype._write=function(r,e,t){this.linkname+=this._decoder.write(r),t()};kb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var tE=function(){Eh.call(this),this._destroyed=!1};Sb(tE,Eh);tE.prototype._write=function(r,e,t){t(new Error("No body allowed for this entry"))};tE.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Ia=function(r){if(!(this instanceof Ia))return new Ia(r);Lce.call(this,r),this._drain=NT,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Sb(Ia,Lce);Ia.prototype.entry=function(r,e,t){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(t=e,e=null),t||(t=NT);var i=this;if((!r.size||r.type==="symlink")&&(r.size=0),r.type||(r.type=C9e(r.mode)),r.mode||(r.mode=r.type==="directory"?p9e:d9e),r.uid||(r.uid=0),r.gid||(r.gid=0),r.mtime||(r.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){r.size=e.length,this._encode(r);var n=this.push(e);return LT(i,r.size),n?process.nextTick(t):this._drain=t,new tE}if(r.type==="symlink"&&!r.linkname){var s=new kb;return Nce(s,function(a){if(a)return i.destroy(),t(a);r.linkname=s.linkname,i._encode(r),t()}),s}if(this._encode(r),r.type!=="file"&&r.type!=="contiguous-file")return process.nextTick(t),new tE;var o=new xb(this);return this._stream=o,Nce(o,function(a){if(i._stream=null,a)return i.destroy(),t(a);if(o.written!==r.size)return i.destroy(),t(new Error("size mismatch"));LT(i,r.size),i._finalizing&&i.finalize(),t()}),o}};Ia.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(Tce),this.push(null))};Ia.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Ia.prototype._encode=function(r){if(!r.pax){var e=vb.encode(r);if(e){this.push(e);return}}this._encodePax(r)};Ia.prototype._encodePax=function(r){var e=vb.encodePax({name:r.name,linkname:r.linkname,pax:r.pax}),t={name:"PaxHeader",mode:r.mode,uid:r.uid,gid:r.gid,size:e.length,mtime:r.mtime,type:"pax-header",linkname:r.linkname&&"PaxHeader",uname:r.uname,gname:r.gname,devmajor:r.devmajor,devminor:r.devminor};this.push(vb.encode(t)),this.push(e),LT(this,e.length),t.size=r.size,t.type=r.type,this.push(vb.encode(t))};Ia.prototype._read=function(r){var e=this._drain;this._drain=NT,e()};Fce.exports=Ia});var Mce=w(TT=>{TT.extract=Pce();TT.pack=Oce()});var Xce=w((Qvt,Wce)=>{"use strict";var Ih=class{constructor(e,t,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=t||{},this.__providers=_ce(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return jT(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,t=this){for(let[i,n]of this.entries())e.call(t,n,i,this)}toJSON(){let e={};return this.forEach((t,i)=>{e[i]=t}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let t=e||this.__opts.other;if(t){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(t):P9e(n);for(let[o,a]of s)t(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Ih(this.__specs,this.__opts,_ce(this.__providers).concat(e)),zce)}};try{let r=require("util");Ih.prototype[r.inspect.custom]=function(e,t){return this[Symbol.toStringTag]+" "+r.inspect(this.toJSON(),t)}}catch(r){}function D9e(r){throw Object.assign(new Error(`invalid config key requested: ${r}`),{code:"EBADKEY"})}function jT(r,e,t){let i=r.__specs[e];if(t&&!i&&(!r.__opts.other||!r.__opts.other(e)))D9e(e);else{i||(i={});let n;for(let s of r.__providers){if(n=Vce(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=Vce(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(r):i.default:n}}function Vce(r,e){let t;return e.__isFiggyPudding?t=jT(e,r,!1):typeof e.get=="function"?t=e.get(r):t=e[r],t}var zce={has(r,e){return e in r.__specs&&jT(r,e,!1)!==void 0},ownKeys(r){return Object.keys(r.__specs)},get(r,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Ih.prototype?r[e]:r.get(e)},set(r,e,t){if(typeof e=="symbol"||e.slice(0,2)==="__")return r[e]=t,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};Wce.exports=R9e;function R9e(r,e){function t(...i){return new Proxy(new Ih(r,e,i),zce)}return t}function _ce(r){let e=[];return r.forEach(t=>e.unshift(t)),e}function P9e(r){return Object.keys(r).map(e=>[e,r[e]])}});var eue=w((Svt,ya)=>{"use strict";var iE=require("crypto"),F9e=Xce(),N9e=require("stream").Transform,Zce=["sha256","sha384","sha512"],L9e=/^[a-z0-9+/]+(?:=?=?)$/i,T9e=/^([^-]+)-([^?]+)([?\S*]*)$/,O9e=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,M9e=/^[\x21-\x7E]+$/,Cn=F9e({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>K9e},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),Fu=class{get isHash(){return!0}constructor(e,t){t=Cn(t);let i=!!t.strict;this.source=e.trim();let n=this.source.match(i?O9e:T9e);if(!n||i&&!Zce.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=Cn(e),e.strict&&!(Zce.some(i=>i===this.algorithm)&&this.digest.match(L9e)&&(this.options||[]).every(i=>i.match(M9e))))return"";let t=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${t}`}},yh=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=Cn(e);let t=e.sep||" ";return e.strict&&(t=t.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>Fu.prototype.toString.call(n,e)).filter(n=>n.length).join(t)).filter(i=>i.length).join(t)}concat(e,t){t=Cn(t);let i=typeof e=="string"?e:nE(e,t);return wa(`${this.toString(t)} ${i}`,t)}hexDigest(){return wa(this,{single:!0}).hexDigest()}match(e,t){t=Cn(t);let i=wa(e,t),n=i.pickAlgorithm(t);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=Cn(e);let t=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>t(n,s)||n)}};ya.exports.parse=wa;function wa(r,e){if(e=Cn(e),typeof r=="string")return GT(r,e);if(r.algorithm&&r.digest){let t=new yh;return t[r.algorithm]=[r],GT(nE(t,e),e)}else return GT(nE(r,e),e)}function GT(r,e){return e.single?new Fu(r,e):r.trim().split(/\s+/).reduce((t,i)=>{let n=new Fu(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;t[s]||(t[s]=[]),t[s].push(n)}return t},new yh)}ya.exports.stringify=nE;function nE(r,e){return e=Cn(e),r.algorithm&&r.digest?Fu.prototype.toString.call(r,e):typeof r=="string"?nE(wa(r,e),e):yh.prototype.toString.call(r,e)}ya.exports.fromHex=U9e;function U9e(r,e,t){t=Cn(t);let i=t.options&&t.options.length?`?${t.options.join("?")}`:"";return wa(`${e}-${Buffer.from(r,"hex").toString("base64")}${i}`,t)}ya.exports.fromData=H9e;function H9e(r,e){e=Cn(e);let t=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return t.reduce((n,s)=>{let o=iE.createHash(s).update(r).digest("base64"),a=new Fu(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new yh)}ya.exports.fromStream=j9e;function j9e(r,e){e=Cn(e);let t=e.Promise||Promise,i=YT(e);return new t((n,s)=>{r.pipe(i),r.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}ya.exports.checkData=G9e;function G9e(r,e,t){if(t=Cn(t),e=wa(e,t),!Object.keys(e).length){if(t.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(t),n=iE.createHash(i).update(r).digest("base64"),s=wa({algorithm:i,digest:n}),o=s.match(e,t);if(o||!t.error)return o;if(typeof t.size=="number"&&r.length!==t.size){let a=new Error(`data size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${r.length}`);throw a.code="EBADSIZE",a.found=r.length,a.expected=t.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${r.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}ya.exports.checkStream=Y9e;function Y9e(r,e,t){t=Cn(t);let i=t.Promise||Promise,n=YT(t.concat({integrity:e}));return new i((s,o)=>{r.pipe(n),r.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}ya.exports.integrityStream=YT;function YT(r){r=Cn(r);let e=r.integrity&&wa(r.integrity,r),t=e&&Object.keys(e).length,i=t&&e.pickAlgorithm(r),n=t&&e[i],s=Array.from(new Set(r.algorithms.concat(i?[i]:[]))),o=s.map(iE.createHash),a=0,l=new N9e({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=r.options&&r.options.length?`?${r.options.join("?")}`:"",u=wa(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),r),g=t&&u.match(e,r);if(typeof r.size=="number"&&a!==r.size){let f=new Error(`stream size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=r.size,f.sri=e,l.emit("error",f)}else if(r.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}ya.exports.create=q9e;function q9e(r){r=Cn(r);let e=r.algorithms,t=r.options.length?`?${r.options.join("?")}`:"",i=e.map(iE.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new Fu(`${a}-${l}${t}`,r);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new yh)}}}var J9e=new Set(iE.getHashes()),$ce=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(r=>J9e.has(r));function K9e(r,e){return $ce.indexOf(r.toLowerCase())>=$ce.indexOf(e.toLowerCase())?r:e}});var EC={};ft(EC,{BuildType:()=>cs,Cache:()=>Nt,Configuration:()=>ye,DEFAULT_LOCK_FILENAME:()=>fk,DEFAULT_RC_FILENAME:()=>gk,FormatType:()=>Ri,InstallMode:()=>Ci,LightReport:()=>pA,LinkType:()=>Qt,Manifest:()=>At,MessageName:()=>X,MultiFetcher:()=>yd,PackageExtensionStatus:()=>qi,PackageExtensionType:()=>wi,Project:()=>ze,ProjectLookup:()=>ul,Report:()=>Ji,ReportError:()=>ct,SettingsType:()=>Ie,StreamReport:()=>Je,TAG_REGEXP:()=>zg,TelemetryManager:()=>mC,ThrowReport:()=>di,VirtualFetcher:()=>Bd,Workspace:()=>CC,WorkspaceFetcher:()=>bd,WorkspaceResolver:()=>oi,YarnVersion:()=>Ur,execUtils:()=>Nr,folderUtils:()=>sk,formatUtils:()=>ae,hashUtils:()=>Dn,httpUtils:()=>ir,miscUtils:()=>Se,nodeUtils:()=>Vg,parseMessageName:()=>II,scriptUtils:()=>Zt,semverUtils:()=>Wt,stringifyMessageName:()=>_A,structUtils:()=>P,tgzUtils:()=>Bi,treeUtils:()=>ls});var Nr={};ft(Nr,{EndStrategy:()=>ss,ExecError:()=>Ik,PipeError:()=>ww,execvp:()=>pve,pipevp:()=>ra});var Zh={};ft(Zh,{AliasFS:()=>Na,CwdFS:()=>_t,DEFAULT_COMPRESSION_LEVEL:()=>lc,FakeFS:()=>YA,Filename:()=>kt,JailFS:()=>La,LazyFS:()=>_h,LinkStrategy:()=>Gh,NoFS:()=>jE,NodeFS:()=>ar,PortablePath:()=>Me,PosixFS:()=>Vh,ProxiedFS:()=>Qi,VirtualFS:()=>Wr,ZipFS:()=>li,ZipOpenFS:()=>Is,constants:()=>Rr,extendFs:()=>WE,normalizeLineEndings:()=>sc,npath:()=>H,opendir:()=>KE,patchFs:()=>pQ,ppath:()=>k,statUtils:()=>rQ,toFilename:()=>Jr,xfs:()=>K});var Rr={};ft(Rr,{SAFE_TIME:()=>tQ,S_IFDIR:()=>Da,S_IFLNK:()=>Fa,S_IFMT:()=>_n,S_IFREG:()=>Ra});var _n=61440,Da=16384,Ra=32768,Fa=40960,tQ=456789e3;var rQ={};ft(rQ,{BigIntStatsEntry:()=>Uh,DEFAULT_MODE:()=>Kh,DirEntry:()=>KO,StatEntry:()=>jA,areStatsEqual:()=>nQ,clearStats:()=>RE,convertToBigIntStats:()=>FE,makeDefaultStats:()=>Hh,makeEmptyStats:()=>fge});var iQ=ge(require("util"));var Kh=Ra|420,KO=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},jA=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Kh;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},Uh=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Kh);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(_n))===BigInt(Da)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(_n))===BigInt(Ra)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(_n))===BigInt(Fa)}};function Hh(){return new jA}function fge(){return RE(Hh())}function RE(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(r,e)){let t=r[e];typeof t=="number"?r[e]=0:typeof t=="bigint"?r[e]=BigInt(0):iQ.types.isDate(t)&&(r[e]=new Date(0))}return r}function FE(r){let e=new Uh;for(let t in r)if(Object.prototype.hasOwnProperty.call(r,t)){let i=r[t];typeof i=="number"?e[t]=BigInt(i):iQ.types.isDate(i)&&(e[t]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function nQ(r,e){if(r.atimeMs!==e.atimeMs||r.birthtimeMs!==e.birthtimeMs||r.blksize!==e.blksize||r.blocks!==e.blocks||r.ctimeMs!==e.ctimeMs||r.dev!==e.dev||r.gid!==e.gid||r.ino!==e.ino||r.isBlockDevice()!==e.isBlockDevice()||r.isCharacterDevice()!==e.isCharacterDevice()||r.isDirectory()!==e.isDirectory()||r.isFIFO()!==e.isFIFO()||r.isFile()!==e.isFile()||r.isSocket()!==e.isSocket()||r.isSymbolicLink()!==e.isSymbolicLink()||r.mode!==e.mode||r.mtimeMs!==e.mtimeMs||r.nlink!==e.nlink||r.rdev!==e.rdev||r.size!==e.size||r.uid!==e.uid)return!1;let t=r,i=e;return!(t.atimeNs!==i.atimeNs||t.mtimeNs!==i.mtimeNs||t.ctimeNs!==i.ctimeNs||t.birthtimeNs!==i.birthtimeNs)}var LE=ge(require("fs"));var jh=ge(require("path")),UO;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(UO||(UO={}));var Me={root:"/",dot:"."},kt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},H=Object.create(jh.default),k=Object.create(jh.default.posix);H.cwd=()=>process.cwd();k.cwd=()=>sQ(process.cwd());k.resolve=(...r)=>r.length>0&&k.isAbsolute(r[0])?jh.default.posix.resolve(...r):jh.default.posix.resolve(k.cwd(),...r);var HO=function(r,e,t){return e=r.normalize(e),t=r.normalize(t),e===t?".":(e.endsWith(r.sep)||(e=e+r.sep),t.startsWith(e)?t.slice(e.length):null)};H.fromPortablePath=jO;H.toPortablePath=sQ;H.contains=(r,e)=>HO(H,r,e);k.contains=(r,e)=>HO(k,r,e);var hge=/^([a-zA-Z]:.*)$/,pge=/^\/\/(\.\/)?(.*)$/,dge=/^\/([a-zA-Z]:.*)$/,Cge=/^\/unc\/(\.dot\/)?(.*)$/;function jO(r){if(process.platform!=="win32")return r;let e,t;if(e=r.match(dge))r=e[1];else if(t=r.match(Cge))r=`\\\\${t[1]?".\\":""}${t[2]}`;else return r;return r.replace(/\//g,"\\")}function sQ(r){if(process.platform!=="win32")return r;r=r.replace(/\\/g,"/");let e,t;return(e=r.match(hge))?r=`/${e[1]}`:(t=r.match(pge))&&(r=`/unc/${t[1]?".dot/":""}${t[2]}`),r}function NE(r,e){return r===H?jO(e):sQ(e)}function Jr(r){if(H.parse(r).dir!==""||k.parse(r).dir!=="")throw new Error(`Invalid filename: "${r}"`);return r}var TE=new Date(tQ*1e3),Gh;(function(t){t.Allow="allow",t.ReadOnly="readOnly"})(Gh||(Gh={}));async function GO(r,e,t,i,n){let s=r.pathUtils.normalize(e),o=t.pathUtils.normalize(i),a=[],l=[],{atime:c,mtime:u}=n.stableTime?{atime:TE,mtime:TE}:await t.lstatPromise(o);await r.mkdirpPromise(r.pathUtils.dirname(e),{utimes:[c,u]});let g=typeof r.lutimesPromise=="function"?r.lutimesPromise.bind(r):r.utimesPromise.bind(r);await oQ(a,l,g,r,s,t,o,te(N({},n),{didParentExist:!0}));for(let f of a)await f();await Promise.all(l.map(f=>f()))}async function oQ(r,e,t,i,n,s,o,a){var h,p;let l=a.didParentExist?await mge(i,n):null,c=await s.lstatPromise(o),{atime:u,mtime:g}=a.stableTime?{atime:TE,mtime:TE}:c,f;switch(!0){case c.isDirectory():f=await Ege(r,e,t,i,n,l,s,o,c,a);break;case c.isFile():f=await Ige(r,e,t,i,n,l,s,o,c,a);break;case c.isSymbolicLink():f=await yge(r,e,t,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(f||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==g.getTime()||((p=l==null?void 0:l.atime)==null?void 0:p.getTime())!==u.getTime())&&(e.push(()=>t(n,u,g)),f=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),f=!0),f}async function mge(r,e){try{return await r.lstatPromise(e)}catch(t){return null}}async function Ege(r,e,t,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(r.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!=="EEXIST")throw h}}),u=!0);let g=await o.readdirPromise(a),f=c.didParentExist&&!s?te(N({},c),{didParentExist:!1}):c;if(c.stableSort)for(let h of g.sort())await oQ(r,e,t,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),f)&&(u=!0);else(await Promise.all(g.map(async p=>{await oQ(r,e,t,i,i.pathUtils.join(n,p),o,o.pathUtils.join(a,p),f)}))).some(p=>p)&&(u=!0);return u}var aQ=new WeakMap;function AQ(r,e,t,i,n){return async()=>{await r.linkPromise(t,e),n===Gh.ReadOnly&&(i.mode&=~146,await r.chmodPromise(e,i.mode))}}function wge(r,e,t,i,n){let s=aQ.get(r);return typeof s=="undefined"?async()=>{try{await r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE),aQ.set(r,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")aQ.set(r,!1),await AQ(r,e,t,i,n)();else throw o}}:s?async()=>r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE):AQ(r,e,t,i,n)}async function Ige(r,e,t,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?wge(i,n,a,l,u):async()=>i.copyFilePromise(a,n,LE.default.constants.COPYFILE_FICLONE):u!==null?AQ(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return r.push(async()=>g()),!0}async function yge(r,e,t,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;return r.push(async()=>{await i.symlinkPromise(NE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function Es(r,e){return Object.assign(new Error(`${r}: ${e}`),{code:r})}function OE(r){return Es("EBUSY",r)}function Yh(r,e){return Es("ENOSYS",`${r}, ${e}`)}function GA(r){return Es("EINVAL",`invalid argument, ${r}`)}function Ai(r){return Es("EBADF",`bad file descriptor, ${r}`)}function io(r){return Es("ENOENT",`no such file or directory, ${r}`)}function Ro(r){return Es("ENOTDIR",`not a directory, ${r}`)}function qh(r){return Es("EISDIR",`illegal operation on a directory, ${r}`)}function ME(r){return Es("EEXIST",`file already exists, ${r}`)}function In(r){return Es("EROFS",`read-only filesystem, ${r}`)}function YO(r){return Es("ENOTEMPTY",`directory not empty, ${r}`)}function qO(r){return Es("EOPNOTSUPP",`operation not supported, ${r}`)}function JO(){return Es("ERR_DIR_CLOSED","Directory handle was closed")}var lQ=class extends Error{constructor(e,t){super(e);this.name="Libzip Error",this.code=t}};var WO=class{constructor(e,t,i={}){this.path=e;this.nextDirent=t;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw JO()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let t=this.readSync();return typeof e!="undefined"?e(null,t):Promise.resolve(t)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,t;this.throwIfClosed(),(t=(e=this.opts).onClose)==null||t.call(e),this.closed=!0}};function KE(r,e,t,i){let n=()=>{let s=t.shift();return typeof s=="undefined"?null:Object.assign(r.statSync(r.pathUtils.join(e,s)),{name:s})};return new WO(e,n,i)}var zO=ge(require("os"));var YA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:t=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(t)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:t=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(t){let s=await this.readdirPromise(e);await Promise.all(s.map(o=>this.removePromise(this.pathUtils.resolve(e,o))))}for(let s=0;s<=i;s++)try{await this.rmdirPromise(e);break}catch(o){if(o.code!=="EBUSY"&&o.code!=="ENOTEMPTY")throw o;ssetTimeout(a,s*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:t=!0}={}){let i;try{i=this.lstatSync(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(i.isDirectory()){if(t)for(let n of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,n));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{await this.mkdirPromise(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&await this.chmodPromise(a,t),i!=null)await this.utimesPromise(a,i[0],i[1]);else{let l=await this.statPromise(this.pathUtils.dirname(a));await this.utimesPromise(a,l.atime,l.mtime)}}}return s}mkdirpSync(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{this.mkdirSync(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&this.chmodSync(a,t),i!=null)this.utimesSync(a,i[0],i[1]);else{let l=this.statSync(this.pathUtils.dirname(a));this.utimesSync(a,l.atime,l.mtime)}}}return s}async copyPromise(e,t,{baseFs:i=this,overwrite:n=!0,stableSort:s=!1,stableTime:o=!1,linkStrategy:a=null}={}){return await GO(this,e,i,t,{overwrite:n,stableSort:s,stableTime:o,linkStrategy:a})}copySync(e,t,{baseFs:i=this,overwrite:n=!0}={}){let s=i.lstatSync(t),o=this.existsSync(e);if(s.isDirectory()){this.mkdirpSync(e);let l=i.readdirSync(t);for(let c of l)this.copySync(this.pathUtils.join(e,c),i.pathUtils.join(t,c),{baseFs:i,overwrite:n})}else if(s.isFile()){if(!o||n){o&&this.removeSync(e);let l=i.readFileSync(t);this.writeFileSync(e,l)}}else if(s.isSymbolicLink()){if(!o||n){o&&this.removeSync(e);let l=i.readlinkSync(t);this.symlinkSync(NE(this.pathUtils,l),e)}}else throw new Error(`Unsupported file type (file: ${t}, mode: 0o${s.mode.toString(8).padStart(6,"0")})`);let a=s.mode&511;this.chmodSync(e,a)}async changeFilePromise(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferPromise(e,t,i):this.changeFileTextPromise(e,t,i)}async changeFileBufferPromise(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=await this.readFilePromise(e)}catch(s){}Buffer.compare(n,t)!==0&&await this.writeFilePromise(e,t,{mode:i})}async changeFileTextPromise(e,t,{automaticNewlines:i,mode:n}={}){let s="";try{s=await this.readFilePromise(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&await this.writeFilePromise(e,o,{mode:n})}changeFileSync(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferSync(e,t,i):this.changeFileTextSync(e,t,i)}changeFileBufferSync(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=this.readFileSync(e)}catch(s){}Buffer.compare(n,t)!==0&&this.writeFileSync(e,t,{mode:i})}changeFileTextSync(e,t,{automaticNewlines:i=!1,mode:n}={}){let s="";try{s=this.readFileSync(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&this.writeFileSync(e,o,{mode:n})}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(i){if(i.code==="EXDEV")await this.copyPromise(t,e),await this.removePromise(e);else throw i}}moveSync(e,t){try{this.renameSync(e,t)}catch(i){if(i.code==="EXDEV")this.copySync(t,e),this.removeSync(e);else throw i}}async lockPromise(e,t){let i=`${e}.flock`,n=1e3/60,s=Date.now(),o=null,a=async()=>{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let t=await this.readFilePromise(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let t=this.readFileSync(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,`${JSON.stringify(t,null,2)} -`)}writeJsonSync(e,t){return this.writeFileSync(e,`${JSON.stringify(t,null,2)} -`)}async preserveTimePromise(e,t){let i=await this.lstatPromise(e),n=await t();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,t){let i=this.lstatSync(e),n=t();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},oc=class extends YA{constructor(){super(k)}};function Bge(r){let e=r.match(/\r?\n/g);if(e===null)return zO.EOL;let t=e.filter(n=>n===`\r -`).length,i=e.length-t;return t>i?`\r -`:` -`}function sc(r,e){return e.replace(/\r?\n/g,Bge(r))}var zu=ge(require("fs")),cQ=ge(require("stream")),ZO=ge(require("util")),uQ=ge(require("zlib"));var _O=ge(require("fs"));var ar=class extends oc{constructor(e=_O.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Me.root}resolve(e){return k.resolve(e)}async openPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.open(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}openSync(e,t,i){return this.realFs.openSync(H.fromPortablePath(e),t,i)}async opendirPromise(e,t){return await new Promise((i,n)=>{typeof t!="undefined"?this.realFs.opendir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.opendir(H.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,t){let i=typeof t!="undefined"?this.realFs.opendirSync(H.fromPortablePath(e),t):this.realFs.opendirSync(H.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,t,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,t,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,t,i,n,s){return this.realFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return await new Promise((o,a)=>typeof t=="string"?this.realFs.write(e,t,i,this.makeCallback(o,a)):this.realFs.write(e,t,i,n,s,this.makeCallback(o,a)))}writeSync(e,t,i,n,s){return typeof t=="string"?this.realFs.writeSync(e,t,i):this.realFs.writeSync(e,t,i,n,s)}async closePromise(e){await new Promise((t,i)=>{this.realFs.close(e,this.makeCallback(t,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createReadStream(i,t)}createWriteStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createWriteStream(i,t)}async realpathPromise(e){return await new Promise((t,i)=>{this.realFs.realpath(H.fromPortablePath(e),{},this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}realpathSync(e){return H.toPortablePath(this.realFs.realpathSync(H.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(t=>{this.realFs.exists(H.fromPortablePath(e),t)})}accessSync(e,t){return this.realFs.accessSync(H.fromPortablePath(e),t)}async accessPromise(e,t){return await new Promise((i,n)=>{this.realFs.access(H.fromPortablePath(e),t,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(H.fromPortablePath(e))}async statPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.stat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.stat(H.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,t){return t?this.realFs.statSync(H.fromPortablePath(e),t):this.realFs.statSync(H.fromPortablePath(e))}async fstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.fstat(e,t,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,t){return t?this.realFs.fstatSync(e,t):this.realFs.fstatSync(e)}async lstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.lstat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.lstat(H.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,t){return t?this.realFs.lstatSync(H.fromPortablePath(e),t):this.realFs.lstatSync(H.fromPortablePath(e))}async fchmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.fchmod(e,t,this.makeCallback(i,n))})}fchmodSync(e,t){return this.realFs.fchmodSync(e,t)}async chmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.chmod(H.fromPortablePath(e),t,this.makeCallback(i,n))})}chmodSync(e,t){return this.realFs.chmodSync(H.fromPortablePath(e),t)}async chownPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.chown(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}chownSync(e,t,i){return this.realFs.chownSync(H.fromPortablePath(e),t,i)}async renamePromise(e,t){return await new Promise((i,n)=>{this.realFs.rename(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}renameSync(e,t){return this.realFs.renameSync(H.fromPortablePath(e),H.fromPortablePath(t))}async copyFilePromise(e,t,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(H.fromPortablePath(e),H.fromPortablePath(t),i,this.makeCallback(n,s))})}copyFileSync(e,t,i=0){return this.realFs.copyFileSync(H.fromPortablePath(e),H.fromPortablePath(t),i)}async appendFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFile(o,t,i,this.makeCallback(n,s)):this.realFs.appendFile(o,t,this.makeCallback(n,s))})}appendFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,t,i):this.realFs.appendFileSync(n,t)}async writeFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFile(o,t,i,this.makeCallback(n,s)):this.realFs.writeFile(o,t,this.makeCallback(n,s))})}writeFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,t,i):this.realFs.writeFileSync(n,t)}async unlinkPromise(e){return await new Promise((t,i)=>{this.realFs.unlink(H.fromPortablePath(e),this.makeCallback(t,i))})}unlinkSync(e){return this.realFs.unlinkSync(H.fromPortablePath(e))}async utimesPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.utimes(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}utimesSync(e,t,i){this.realFs.utimesSync(H.fromPortablePath(e),t,i)}async lutimesPromiseImpl(e,t,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,H.fromPortablePath(e),t,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,t,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,H.fromPortablePath(e),t,i)}async mkdirPromise(e,t){return await new Promise((i,n)=>{this.realFs.mkdir(H.fromPortablePath(e),t,this.makeCallback(i,n))})}mkdirSync(e,t){return this.realFs.mkdirSync(H.fromPortablePath(e),t)}async rmdirPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.rmdir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.rmdir(H.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,t){return this.realFs.rmdirSync(H.fromPortablePath(e),t)}async linkPromise(e,t){return await new Promise((i,n)=>{this.realFs.link(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}linkSync(e,t){return this.realFs.linkSync(H.fromPortablePath(e),H.fromPortablePath(t))}async symlinkPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.symlink(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i,this.makeCallback(n,s))})}symlinkSync(e,t,i){return this.realFs.symlinkSync(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i)}async readFilePromise(e,t){return await new Promise((i,n)=>{let s=typeof e=="string"?H.fromPortablePath(e):e;this.realFs.readFile(s,t,this.makeCallback(i,n))})}readFileSync(e,t){let i=typeof e=="string"?H.fromPortablePath(e):e;return this.realFs.readFileSync(i,t)}async readdirPromise(e,t){return await new Promise((i,n)=>{(t==null?void 0:t.withFileTypes)?this.realFs.readdir(H.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(H.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,t){return(t==null?void 0:t.withFileTypes)?this.realFs.readdirSync(H.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(H.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((t,i)=>{this.realFs.readlink(H.fromPortablePath(e),this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}readlinkSync(e){return H.toPortablePath(this.realFs.readlinkSync(H.fromPortablePath(e)))}async truncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.truncate(H.fromPortablePath(e),t,this.makeCallback(i,n))})}truncateSync(e,t){return this.realFs.truncateSync(H.fromPortablePath(e),t)}async ftruncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.ftruncate(e,t,this.makeCallback(i,n))})}ftruncateSync(e,t){return this.realFs.ftruncateSync(e,t)}watch(e,t,i){return this.realFs.watch(H.fromPortablePath(e),t,i)}watchFile(e,t,i){return this.realFs.watchFile(H.fromPortablePath(e),t,i)}unwatchFile(e,t){return this.realFs.unwatchFile(H.fromPortablePath(e),t)}makeCallback(e,t){return(i,n)=>{i?t(i):e(n)}}};var VO=ge(require("events"));var ac;(function(t){t.Change="change",t.Stop="stop"})(ac||(ac={}));var Ac;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(Ac||(Ac={}));function XO(r,e){if(r!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${r}'`)}var Jh=class extends VO.EventEmitter{constructor(e,t,{bigint:i=!1}={}){super();this.status=Ac.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=t,this.bigint=i,this.lastStats=this.stat()}static create(e,t,i){let n=new Jh(e,t,i);return n.start(),n}start(){XO(this.status,Ac.Ready),this.status=Ac.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(ac.Change,this.lastStats,this.lastStats)},3)}stop(){XO(this.status,Ac.Running),this.status=Ac.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(ac.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let t=this.bigint?new Uh:new jA;return RE(t)}}makeInterval(e){let t=setInterval(()=>{let i=this.stat(),n=this.lastStats;nQ(i,n)||(this.lastStats=i,this.emit(ac.Change,i,n))},e.interval);return e.persistent?t:t.unref()}registerChangeListener(e,t){this.addListener(ac.Change,e),this.changeListeners.set(e,this.makeInterval(t))}unregisterChangeListener(e){this.removeListener(ac.Change,e);let t=this.changeListeners.get(e);typeof t!="undefined"&&clearInterval(t),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var UE=new WeakMap;function HE(r,e,t,i){let n,s,o,a;switch(typeof t){case"function":n=!1,s=!0,o=5007,a=t;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=t),a=i;break}let l=UE.get(r);typeof l=="undefined"&&UE.set(r,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=Jh.create(r,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function Wh(r,e,t){let i=UE.get(r);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof t=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(t),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function zh(r){let e=UE.get(r);if(typeof e!="undefined")for(let t of e.keys())Wh(r,t)}var lc="mixed";function bge(r){if(typeof r=="string"&&String(+r)===r)return+r;if(Number.isFinite(r))return r<0?Date.now()/1e3:r;if(ZO.types.isDate(r))return r.getTime()/1e3;throw new Error("Invalid time")}function $O(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var li=class extends oc{constructor(e,t){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=t.libzip;let i=t;if(this.level=typeof i.level!="undefined"?i.level:lc,e!=null||(e=$O()),typeof e=="string"){let{baseFs:o=new ar}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(t.stats)this.stats=t.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Hh();else throw o}else this.stats=Hh();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),t.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(H.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Me.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(t,t+e);return Buffer.from(n)}finally{this.libzip.free(t)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw OE("archive closed, close");zh(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===Kh?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,$O(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return k.resolve(Me.root,e)}async openPromise(e,t,i){return this.openSync(e,t,i)}openSync(e,t,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,t){return this.opendirSync(e,t)}opendirSync(e,t={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return KE(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,t,i,n,s){return this.readSync(e,t,i,n,s)}readSync(e,t,i=0,n=t.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw Ai("read");let a=s===-1||s===null?o.cursor:s,l=this.readFileSync(o.p);l.copy(t,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,t,i,n,s){return typeof t=="string"?this.writeSync(e,t,s):this.writeSync(e,t,i,n,s)}writeSync(e,t,i,n,s){throw typeof this.fds.get(e)=="undefined"?Ai("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw Ai("read");this.fds.delete(e)}createReadStream(e,{encoding:t}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new cQ.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,t);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:t}={}){if(this.readOnly)throw In(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new cQ.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),t),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let t=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`lstat '${e}'`);return t}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw OE(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=k.resolve(Me.root,e);return this.entries.has(i)||this.listings.has(i)}let t;try{t=this.resolveFilename(`stat '${e}'`,e,void 0,!1)}catch(i){return!1}return t===void 0?!1:this.entries.has(t)||this.listings.has(t)}async accessPromise(e,t){return this.accessSync(e,t)}accessSync(e,t=zu.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`access '${e}'`);if(this.readOnly&&t&zu.constants.W_OK)throw In(`access '${e}'`)}async statPromise(e,t={bigint:!1}){return t.bigint?this.statSync(e,{bigint:!0}):this.statSync(e)}statSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`stat '${e}'`,e,void 0,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`stat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,t)}}async fstatPromise(e,t){return this.fstatSync(e,t)}fstatSync(e,t){let i=this.fds.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw io(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw Ro(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,t)}async lstatPromise(e,t={bigint:!1}){return t.bigint?this.lstatSync(e,{bigint:!0}):this.lstatSync(e)}lstatSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`lstat '${e}'`,e,!1,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`lstat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,t)}}statImpl(e,t,i={}){let n=this.entries.get(t);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,m=f,y=new Date(h),b=new Date(p),v=new Date(m),x=new Date(f),T=this.listings.has(t)?Da:this.isSymbolicLink(n)?Fa:Ra,q=T===Da?493:420,Y=T|this.getUnixMode(n,q)&511,$=this.libzip.struct.statCrc(s),_=Object.assign(new jA,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:y,birthtime:b,ctime:v,mtime:x,atimeMs:h,birthtimeMs:p,ctimeMs:m,mtimeMs:f,mode:Y,crc:$});return i.bigint===!0?FE(_):_}if(this.listings.has(t)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),m=new Date(g),y=new Date(f),b=new Date(h),v=Da|493,x=0,T=Object.assign(new jA,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:m,ctime:y,mtime:b,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:v,crc:x});return i.bigint===!0?FE(T):T}throw new Error("Unreachable")}getUnixMode(e,t){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?t:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let t=this.listings.get(e);if(t)return t;this.registerListing(k.dirname(e)).add(k.basename(e));let n=new Set;return this.listings.set(e,n),n}registerEntry(e,t){this.registerListing(k.dirname(e)).add(k.basename(e)),this.entries.set(e,t)}unregisterListing(e){this.listings.delete(e);let t=this.listings.get(k.dirname(e));t==null||t.delete(k.basename(e))}unregisterEntry(e){this.unregisterListing(e);let t=this.entries.get(e);this.entries.delete(e),typeof t!="undefined"&&(this.fileSources.delete(t),this.isSymbolicLink(t)&&this.symlinkCount--)}deleteEntry(e,t){if(this.unregisterEntry(e),this.libzip.delete(this.zip,t)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,t,i=!0,n=!0){if(!this.ready)throw OE(`archive closed, ${e}`);let s=k.resolve(Me.root,t);if(s==="/")return Me.root;let o=this.entries.get(s);if(i&&o!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(o)){let a=this.getFileSource(o).toString();return this.resolveFilename(e,k.resolve(k.dirname(s),a),!0,n)}else return s;for(;;){let a=this.resolveFilename(e,k.dirname(s),!0,n);if(a===void 0)return a;let l=this.listings.has(a),c=this.entries.has(a);if(!l&&!c){if(n===!1)return;throw io(e)}if(!l)throw Ro(e);if(s=k.resolve(a,k.basename(s)),!i||this.symlinkCount===0)break;let u=this.libzip.name.locate(this.zip,s.slice(1));if(u===-1)break;if(this.isSymbolicLink(u)){let g=this.getFileSource(u).toString();s=k.resolve(k.dirname(s),g)}else break}return s}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let t=this.libzip.malloc(e.byteLength);if(!t)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,t,e.byteLength).set(e),{buffer:t,byteLength:e.byteLength}}allocateUnattachedSource(e){let t=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,t);if(s===0)throw this.libzip.free(t),this.makeLibzipError(t);return s}allocateSource(e){let{buffer:t,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,t,i,0,!0);if(n===0)throw this.libzip.free(t),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,t){let i=Buffer.isBuffer(t)?t:Buffer.from(t),n=k.relative(Me.root,e),s=this.allocateSource(t);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&_n)===Fa}getFileSource(e,t={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(t.asyncDecompress)return new Promise((h,p)=>{uQ.default.inflateRaw(f,(m,y)=>{m?p(m):(this.fileSources.set(e,y),h(y))})});{let h=uQ.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async fchmodPromise(e,t){return this.chmodPromise(this.fdToPath(e,"fchmod"),t)}fchmodSync(e,t){return this.chmodSync(this.fdToPath(e,"fchmodSync"),t)}async chmodPromise(e,t){return this.chmodSync(e,t)}chmodSync(e,t){if(this.readOnly)throw In(`chmod '${e}'`);t&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Ra|0)&~511|t;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,t,i){return this.chownSync(e,t,i)}chownSync(e,t,i){throw new Error("Unimplemented")}async renamePromise(e,t){return this.renameSync(e,t)}renameSync(e,t){throw new Error("Unimplemented")}async copyFilePromise(e,t,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,t,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,t,i=0){if(this.readOnly)throw In(`copyfile '${e} -> '${t}'`);if((i&zu.constants.COPYFILE_FICLONE_FORCE)!=0)throw Yh("unsupported clone operation",`copyfile '${e}' -> ${t}'`);let n=this.resolveFilename(`copyfile '${e} -> ${t}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw GA(`copyfile '${e}' -> '${t}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${t}'`,t),a=this.entries.get(o);if((i&(zu.constants.COPYFILE_EXCL|zu.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw ME(`copyfile '${e}' -> '${t}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,t,i){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFilePromise(e,t,i)}appendFileSync(e,t,i={}){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFileSync(e,t,i)}fdToPath(e,t){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw Ai(t);return i}async writeFilePromise(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([this.getFileSource(o),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,t){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw In(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw qh(`open '${e}'`);let n=null,s=null;typeof t=="string"?n=t:typeof t=="object"&&({encoding:n=null,mode:s=null}=t);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw In(`unlink '${e}'`);let t=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(t))throw qh(`unlink '${e}'`);let i=this.entries.get(t);if(typeof i=="undefined")throw GA(`unlink '${e}'`);this.deleteEntry(t,i)}async utimesPromise(e,t,i){return this.utimesSync(e,t,i)}utimesSync(e,t,i){if(this.readOnly)throw In(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,t,i){return this.lutimesSync(e,t,i)}lutimesSync(e,t,i){if(this.readOnly)throw In(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,t){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,bge(t),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,t){return this.mkdirSync(e,t)}mkdirSync(e,{mode:t=493,recursive:i=!1}={}){if(i)return this.mkdirpSync(e,{chmod:t});if(this.readOnly)throw In(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw ME(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,t)}async rmdirPromise(e,t){return this.rmdirSync(e,t)}rmdirSync(e,{recursive:t=!1}={}){if(this.readOnly)throw In(`rmdir '${e}'`);if(t){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw Ro(`rmdir '${e}'`);if(n.size>0)throw YO(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw GA(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let t=this.libzip.dir.add(this.zip,k.relative(Me.root,e));if(t===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,t),t}async linkPromise(e,t){return this.linkSync(e,t)}linkSync(e,t){throw qO(`link '${e}' -> '${t}'`)}async symlinkPromise(e,t){return this.symlinkSync(e,t)}symlinkSync(e,t){if(this.readOnly)throw In(`symlink '${e}' -> '${t}'`);let i=this.resolveFilename(`symlink '${e}' -> '${t}'`,t);if(this.listings.has(i))throw qh(`symlink '${e}' -> '${t}'`);if(this.entries.has(i))throw ME(`symlink '${e}' -> '${t}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(Fa|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return t?i.toString(t):i}readFileSync(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=this.readFileBuffer(e);return t?i.toString(t):i}readFileBuffer(e,t={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`open '${e}'`);if(this.listings.has(i))throw qh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,t)}async readdirPromise(e,t){return this.readdirSync(e,t)}readdirSync(e,t){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`scandir '${e}'`);let s=[...n];return(t==null?void 0:t.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",k.join(e,o)),{name:o})):s}async readlinkPromise(e){let t=this.prepareReadlink(e);return(await this.getFileSource(t,{asyncDecompress:!0})).toString()}readlinkSync(e){let t=this.prepareReadlink(e);return this.getFileSource(t).toString()}prepareReadlink(e){let t=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(t))throw Ro(`open '${e}'`);if(this.listings.has(t))throw GA(`readlink '${e}'`);let i=this.entries.get(t);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw GA(`readlink '${e}'`);return i}async truncatePromise(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(t,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(t,0);return s.copy(o),this.writeFileSync(e,o)}async ftruncatePromise(e,t){return this.truncatePromise(this.fdToPath(e,"ftruncate"),t)}ftruncateSync(e,t){return this.truncateSync(this.fdToPath(e,"ftruncateSync"),t)}watch(e,t,i){let n;switch(typeof t){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=t);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,t,i){let n=k.resolve(Me.root,e);return HE(this,n,t,i)}unwatchFile(e,t){let i=k.resolve(Me.root,e);return Wh(this,i,t)}};var Qi=class extends YA{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,t,i){return this.baseFs.openPromise(this.mapToBase(e),t,i)}openSync(e,t,i){return this.baseFs.openSync(this.mapToBase(e),t,i)}async opendirPromise(e,t){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),t),{path:e})}opendirSync(e,t){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),t),{path:e})}async readPromise(e,t,i,n,s){return await this.baseFs.readPromise(e,t,i,n,s)}readSync(e,t,i,n,s){return this.baseFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s)}writeSync(e,t,i,n,s){return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}async accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}async statPromise(e,t){return this.baseFs.statPromise(this.mapToBase(e),t)}statSync(e,t){return this.baseFs.statSync(this.mapToBase(e),t)}async fstatPromise(e,t){return this.baseFs.fstatPromise(e,t)}fstatSync(e,t){return this.baseFs.fstatSync(e,t)}lstatPromise(e,t){return this.baseFs.lstatPromise(this.mapToBase(e),t)}lstatSync(e,t){return this.baseFs.lstatSync(this.mapToBase(e),t)}async fchmodPromise(e,t){return this.baseFs.fchmodPromise(e,t)}fchmodSync(e,t){return this.baseFs.fchmodSync(e,t)}async chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}async chownPromise(e,t,i){return this.baseFs.chownPromise(this.mapToBase(e),t,i)}chownSync(e,t,i){return this.baseFs.chownSync(this.mapToBase(e),t,i)}async renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}async copyFilePromise(e,t,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),i)}copyFileSync(e,t,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),i)}async appendFilePromise(e,t,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,i)}appendFileSync(e,t,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,i)}async writeFilePromise(e,t,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,i)}writeFileSync(e,t,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,t,i){return this.baseFs.utimesPromise(this.mapToBase(e),t,i)}utimesSync(e,t,i){return this.baseFs.utimesSync(this.mapToBase(e),t,i)}async mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}async rmdirPromise(e,t){return this.baseFs.rmdirPromise(this.mapToBase(e),t)}rmdirSync(e,t){return this.baseFs.rmdirSync(this.mapToBase(e),t)}async linkPromise(e,t){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(t))}linkSync(e,t){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(t))}async symlinkPromise(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,t){return t==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),t):this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return t==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),t):this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,t){return this.baseFs.readdirPromise(this.mapToBase(e),t)}readdirSync(e,t){return this.baseFs.readdirSync(this.mapToBase(e),t)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,t){return this.baseFs.truncatePromise(this.mapToBase(e),t)}truncateSync(e,t){return this.baseFs.truncateSync(this.mapToBase(e),t)}async ftruncatePromise(e,t){return this.baseFs.ftruncatePromise(e,t)}ftruncateSync(e,t){return this.baseFs.ftruncateSync(e,t)}watch(e,t,i){return this.baseFs.watch(this.mapToBase(e),t,i)}watchFile(e,t,i){return this.baseFs.watchFile(this.mapToBase(e),t,i)}unwatchFile(e,t){return this.baseFs.unwatchFile(this.mapToBase(e),t)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Na=class extends Qi{constructor(e,{baseFs:t,pathUtils:i}){super(i);this.target=e,this.baseFs=t}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var _t=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.normalize(e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?k.normalize(e):this.baseFs.resolve(k.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var eM=Me.root,La=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.resolve(Me.root,e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Me.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let t=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(eM,e));if(t.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(eM,this.pathUtils.relative(this.target,e))}};var _h=class extends Qi{constructor(e,t){super(t);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var et=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),gQ=class extends YA{constructor(){super(k)}getExtractHint(){throw et()}getRealPath(){throw et()}resolve(){throw et()}async openPromise(){throw et()}openSync(){throw et()}async opendirPromise(){throw et()}opendirSync(){throw et()}async readPromise(){throw et()}readSync(){throw et()}async writePromise(){throw et()}writeSync(){throw et()}async closePromise(){throw et()}closeSync(){throw et()}createWriteStream(){throw et()}createReadStream(){throw et()}async realpathPromise(){throw et()}realpathSync(){throw et()}async readdirPromise(){throw et()}readdirSync(){throw et()}async existsPromise(e){throw et()}existsSync(e){throw et()}async accessPromise(){throw et()}accessSync(){throw et()}async statPromise(){throw et()}statSync(){throw et()}async fstatPromise(e){throw et()}fstatSync(e){throw et()}async lstatPromise(e){throw et()}lstatSync(e){throw et()}async fchmodPromise(){throw et()}fchmodSync(){throw et()}async chmodPromise(){throw et()}chmodSync(){throw et()}async chownPromise(){throw et()}chownSync(){throw et()}async mkdirPromise(){throw et()}mkdirSync(){throw et()}async rmdirPromise(){throw et()}rmdirSync(){throw et()}async linkPromise(){throw et()}linkSync(){throw et()}async symlinkPromise(){throw et()}symlinkSync(){throw et()}async renamePromise(){throw et()}renameSync(){throw et()}async copyFilePromise(){throw et()}copyFileSync(){throw et()}async appendFilePromise(){throw et()}appendFileSync(){throw et()}async writeFilePromise(){throw et()}writeFileSync(){throw et()}async unlinkPromise(){throw et()}unlinkSync(){throw et()}async utimesPromise(){throw et()}utimesSync(){throw et()}async readFilePromise(){throw et()}readFileSync(){throw et()}async readlinkPromise(){throw et()}readlinkSync(){throw et()}async truncatePromise(){throw et()}truncateSync(){throw et()}async ftruncatePromise(e,t){throw et()}ftruncateSync(e,t){throw et()}watch(){throw et()}watchFile(){throw et()}unwatchFile(){throw et()}},jE=gQ;jE.instance=new gQ;var Vh=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return H.fromPortablePath(e)}mapToBase(e){return H.toPortablePath(e)}};var Qge=/^[0-9]+$/,fQ=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,Sge=/^([^/]+-)?[a-f0-9]+$/,Wr=class extends Qi{static makeVirtualPath(e,t,i){if(k.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!k.basename(t).match(Sge))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=k.relative(k.dirname(e),i).split("/"),o=0;for(;o{let t=r.indexOf(e);if(t<=0)return null;let i=t;for(;t>=0&&(i=t+e.length,r[i]!==k.sep);){if(r[t-1]===k.sep)return null;t=r.indexOf(e,i)}return r.length>i&&r[i]!==k.sep?null:r.slice(0,i)},Is=class extends oc{constructor({libzip:e,baseFs:t=new ar,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=t,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,t){let i=new Is(t);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,t){let i=this.nextFd++|Vn;return this.fdMap.set(i,[e,t]),i}async openPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,t,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,t,i)))}openSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,t,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,t,i)))}async opendirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,t),async(i,{subPath:n})=>await i.opendirPromise(n,t),{requireSubpath:!1})}opendirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,t),(i,{subPath:n})=>i.opendirSync(n,t),{requireSubpath:!1})}async readPromise(e,t,i,n,s){if((e&Vn)==0)return await this.baseFs.readPromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("read");let[a,l]=o;return await a.readPromise(l,t,i,n,s)}readSync(e,t,i,n,s){if((e&Vn)==0)return this.baseFs.readSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("readSync");let[a,l]=o;return a.readSync(l,t,i,n,s)}async writePromise(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("write");let[a,l]=o;return typeof t=="string"?await a.writePromise(l,t,i):await a.writePromise(l,t,i,n,s)}writeSync(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("writeSync");let[a,l]=o;return typeof t=="string"?a.writeSync(l,t,i):a.writeSync(l,t,i,n,s)}async closePromise(e){if((e&Vn)==0)return await this.baseFs.closePromise(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("close");this.fdMap.delete(e);let[i,n]=t;return await i.closePromise(n)}closeSync(e){if((e&Vn)==0)return this.baseFs.closeSync(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("closeSync");this.fdMap.delete(e);let[i,n]=t;return i.closeSync(n)}createReadStream(e,t){return e===null?this.baseFs.createReadStream(e,t):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,t),(i,{archivePath:n,subPath:s})=>{let o=i.createReadStream(s,t);return o.path=H.fromPortablePath(this.pathUtils.join(n,s)),o})}createWriteStream(e,t){return e===null?this.baseFs.createWriteStream(e,t):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,t),(i,{subPath:n})=>i.createWriteStream(n,t))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,await t.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,t.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(t,{subPath:i})=>await t.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(t,{subPath:i})=>t.existsSync(i))}async accessPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,t),async(i,{subPath:n})=>await i.accessPromise(n,t))}accessSync(e,t){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,t),(i,{subPath:n})=>i.accessSync(n,t))}async statPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,t),async(i,{subPath:n})=>await i.statPromise(n,t))}statSync(e,t){return this.makeCallSync(e,()=>this.baseFs.statSync(e,t),(i,{subPath:n})=>i.statSync(n,t))}async fstatPromise(e,t){if((e&Vn)==0)return this.baseFs.fstatPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstat");let[n,s]=i;return n.fstatPromise(s,t)}fstatSync(e,t){if((e&Vn)==0)return this.baseFs.fstatSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let[n,s]=i;return n.fstatSync(s,t)}async lstatPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,t),async(i,{subPath:n})=>await i.lstatPromise(n,t))}lstatSync(e,t){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,t),(i,{subPath:n})=>i.lstatSync(n,t))}async fchmodPromise(e,t){if((e&Vn)==0)return this.baseFs.fchmodPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmod");let[n,s]=i;return n.fchmodPromise(s,t)}fchmodSync(e,t){if((e&Vn)==0)return this.baseFs.fchmodSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmodSync");let[n,s]=i;return n.fchmodSync(s,t)}async chmodPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,t),async(i,{subPath:n})=>await i.chmodPromise(n,t))}chmodSync(e,t){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,t),(i,{subPath:n})=>i.chmodSync(n,t))}async chownPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,t,i),async(n,{subPath:s})=>await n.chownPromise(s,t,i))}chownSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,t,i),(n,{subPath:s})=>n.chownSync(s,t,i))}async renamePromise(e,t){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.renamePromise(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(t,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,t){return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.renameSync(e,t),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(t,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,t,i=0){let n=async(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.copyFilePromise(e,t,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(t,async()=>await n(s,o,this.baseFs,t),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,t,i=0){let n=(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.copyFileSync(e,t,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(t,()=>n(s,o,this.baseFs,t),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,t,i),async(n,{subPath:s})=>await n.appendFilePromise(s,t,i))}appendFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,t,i),(n,{subPath:s})=>n.appendFileSync(s,t,i))}async writeFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,t,i),async(n,{subPath:s})=>await n.writeFilePromise(s,t,i))}writeFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,t,i),(n,{subPath:s})=>n.writeFileSync(s,t,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(t,{subPath:i})=>await t.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(t,{subPath:i})=>t.unlinkSync(i))}async utimesPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,t,i),async(n,{subPath:s})=>await n.utimesPromise(s,t,i))}utimesSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,t,i),(n,{subPath:s})=>n.utimesSync(s,t,i))}async mkdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,t),async(i,{subPath:n})=>await i.mkdirPromise(n,t))}mkdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,t),(i,{subPath:n})=>i.mkdirSync(n,t))}async rmdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,t),async(i,{subPath:n})=>await i.rmdirPromise(n,t))}rmdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,t),(i,{subPath:n})=>i.rmdirSync(n,t))}async linkPromise(e,t){return await this.makeCallPromise(t,async()=>await this.baseFs.linkPromise(e,t),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,t){return this.makeCallSync(t,()=>this.baseFs.linkSync(e,t),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.symlinkPromise(e,t,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,t,i){return this.makeCallSync(t,()=>this.baseFs.symlinkSync(e,t,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,t){return this.makeCallPromise(e,async()=>{switch(t){case"utf8":return await this.baseFs.readFilePromise(e,t);default:return await this.baseFs.readFilePromise(e,t)}},async(i,{subPath:n})=>await i.readFilePromise(n,t))}readFileSync(e,t){return this.makeCallSync(e,()=>{switch(t){case"utf8":return this.baseFs.readFileSync(e,t);default:return this.baseFs.readFileSync(e,t)}},(i,{subPath:n})=>i.readFileSync(n,t))}async readdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,t),async(i,{subPath:n})=>await i.readdirPromise(n,t),{requireSubpath:!1})}readdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,t),(i,{subPath:n})=>i.readdirSync(n,t),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(t,{subPath:i})=>await t.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(t,{subPath:i})=>t.readlinkSync(i))}async truncatePromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,t),async(i,{subPath:n})=>await i.truncatePromise(n,t))}truncateSync(e,t){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,t),(i,{subPath:n})=>i.truncateSync(n,t))}async ftruncatePromise(e,t){if((e&Vn)==0)return this.baseFs.ftruncatePromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncate");let[n,s]=i;return n.ftruncatePromise(s,t)}ftruncateSync(e,t){if((e&Vn)==0)return this.baseFs.ftruncateSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncateSync");let[n,s]=i;return n.ftruncateSync(s,t)}watch(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,t,i),(n,{subPath:s})=>n.watch(s,t,i))}watchFile(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,t,i),()=>HE(this,e,t,i))}unwatchFile(e,t){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,t),()=>Wh(this,e,t))}async makeCallPromise(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await t();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await t():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await t()}makeCallSync(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return t();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?t():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let t="";for(;;){let i=e.substring(t.length),n;if(!this.fileExtensions)n=tM(i,".zip");else for(let s of this.fileExtensions)if(n=tM(i,s),n)break;if(!n)return null;if(t=this.pathUtils.join(t,n),this.isZip.has(t)===!1){if(this.notZip.has(t))continue;try{if(!this.baseFs.lstatSync(t).isFile()){this.notZip.add(t);continue}}catch{return null}this.isZip.add(t)}return{archivePath:t,subPath:this.pathUtils.join(Me.root,e.substring(t.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let t=Date.now(),i=t+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(t>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-t).unref())}async getZipPromise(e,t){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new li(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await t(n.zipFs)}finally{n.refCount-=1}}else{let n=new li(e,await i());try{return await t(n)}finally{n.saveAndClose()}}}getZipSync(e,t){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new li(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,t(n.zipFs)}else{let n=new li(e,i());try{return t(n)}finally{n.saveAndClose()}}}};var Vu=ge(require("util"));var GE=ge(require("url"));var hQ=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof GE.URL?(0,GE.fileURLToPath)(e):e}};var en=Symbol("kBaseFs"),Ta=Symbol("kFd"),qA=Symbol("kClosePromise"),YE=Symbol("kCloseResolve"),qE=Symbol("kCloseReject"),_u=Symbol("kRefs"),Fo=Symbol("kRef"),No=Symbol("kUnref"),Q6e,S6e,v6e,x6e,JE=class{constructor(e,t){this[Q6e]=1;this[S6e]=void 0;this[v6e]=void 0;this[x6e]=void 0;this[en]=t,this[Ta]=e}get fd(){return this[Ta]}async appendFile(e,t){var i;try{this[Fo](this.appendFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;return await this[en].appendFilePromise(this.fd,e,n?{encoding:n}:void 0)}finally{this[No]()}}chown(e,t){throw new Error("Method not implemented.")}async chmod(e){try{return this[Fo](this.chmod),await this[en].fchmodPromise(this.fd,e)}finally{this[No]()}}createReadStream(e){return this[en].createReadStream(null,te(N({},e),{fd:this.fd}))}createWriteStream(e){return this[en].createWriteStream(null,te(N({},e),{fd:this.fd}))}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,t,i,n){var s,o,a;try{this[Fo](this.read);let l;return Buffer.isBuffer(e)?l=e:(e!=null||(e={}),l=(s=e.buffer)!=null?s:Buffer.alloc(16384),t=e.offset||0,i=(o=e.length)!=null?o:l.byteLength,n=(a=e.position)!=null?a:null),t!=null||(t=0),i!=null||(i=0),i===0?{bytesRead:i,buffer:l}:{bytesRead:await this[en].readPromise(this.fd,l,t,i,n),buffer:l}}finally{this[No]()}}async readFile(e){var t;try{this[Fo](this.readFile);let i=(t=typeof e=="string"?e:e==null?void 0:e.encoding)!=null?t:void 0;return await this[en].readFilePromise(this.fd,i)}finally{this[No]()}}async stat(e){try{return this[Fo](this.stat),await this[en].fstatPromise(this.fd,e)}finally{this[No]()}}async truncate(e){try{return this[Fo](this.truncate),await this[en].ftruncatePromise(this.fd,e)}finally{this[No]()}}utimes(e,t){throw new Error("Method not implemented.")}async writeFile(e,t){var i;try{this[Fo](this.writeFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;await this[en].writeFilePromise(this.fd,e,n)}finally{this[No]()}}async write(...e){try{if(this[Fo](this.write),ArrayBuffer.isView(e[0])){let[t,i,n,s]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i!=null?i:void 0,n!=null?n:void 0,s!=null?s:void 0),buffer:t}}else{let[t,i,n]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i,n),buffer:t}}}finally{this[No]()}}async writev(e,t){try{this[Fo](this.writev);let i=0;if(typeof t!="undefined")for(let n of e){let s=await this.write(n,void 0,void 0,t);i+=s.bytesWritten,t+=s.bytesWritten}else for(let n of e)i+=(await this.write(n)).bytesWritten;return{buffers:e,bytesWritten:i}}finally{this[No]()}}readv(e,t){throw new Error("Method not implemented.")}close(){if(this[Ta]===-1)return Promise.resolve();if(this[qA])return this[qA];if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[qA]=this[en].closePromise(e).finally(()=>{this[qA]=void 0})}else this[qA]=new Promise((e,t)=>{this[YE]=e,this[qE]=t}).finally(()=>{this[qA]=void 0,this[qE]=void 0,this[YE]=void 0});return this[qA]}[(en,Ta,Q6e=_u,S6e=qA,v6e=YE,x6e=qE,Fo)](e){if(this[Ta]===-1){let t=new Error("file closed");throw t.code="EBADF",t.syscall=e.name,t}this[_u]++}[No](){if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[en].closePromise(e).then(this[YE],this[qE])}}};var vge=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),rM=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]);function pQ(r,e){e=new hQ(e);let t=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Vu.promisify.custom])!="undefined"&&(s[Vu.promisify.custom]=o[Vu.promisify.custom])};{t(r,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),t(r,"read",(...i)=>{let[n,s,o,a,l,c]=i;if(i.length<=3){let u={};i.length<3?c=i[1]:(u=i[1],c=i[2]),{buffer:s=Buffer.alloc(16384),offset:o=0,length:a=s.byteLength,position:l}=u}if(o==null&&(o=0),a|=0,a===0){process.nextTick(()=>{c(null,0,s)});return}l==null&&(l=-1),process.nextTick(()=>{e.readPromise(n,s,o,a,l).then(u=>{c(null,u,s)},u=>{c(u,0,s)})})});for(let i of rM){let n=i.replace(/Promise$/,"");if(typeof r[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;t(r,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}r.realpath.native=r.realpath}{t(r,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}}),t(r,"readSync",(...i)=>{let[n,s,o,a,l]=i;return i.length<=3&&({offset:o=0,length:a=s.byteLength,position:l}=i[2]||{}),o==null&&(o=0),a|=0,a===0?0:(l==null&&(l=-1),e.readSync(n,s,o,a,l))});for(let i of vge){let n=i;if(typeof r[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&t(r,n,s.bind(e))}r.realpathSync.native=r.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=r.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let s of rM){let o=s.replace(/Promise$/,"");if(typeof n[o]=="undefined")continue;let a=e[s];typeof a!="undefined"&&s!=="open"&&t(n,o,(l,...c)=>l instanceof JE?l[o].apply(l,c):a.call(e,l,...c))}t(n,"open",async(...s)=>{let o=await e.openPromise(...s);return new JE(o,e)})}}r.read[Vu.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n}),r.write[Vu.promisify.custom]=async(i,n,...s)=>({bytesWritten:await e.writePromise(i,n,...s),buffer:n})}function WE(r,e){let t=Object.create(r);return pQ(t,e),t}var iM=ge(require("os"));function nM(r){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${r}${e}`}var no=new Set,dQ=null;function sM(){if(dQ)return dQ;let r=H.toPortablePath(iM.default.tmpdir()),e=K.realpathSync(r);return process.once("exit",()=>{K.rmtempSync()}),dQ={tmpdir:r,realTmpdir:e}}var K=Object.assign(new ar,{detachTemp(r){no.delete(r)},mktempSync(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{this.mkdirSync(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return r(n)}finally{if(no.has(n)){no.delete(n);try{this.removeSync(n)}catch{}}}}},async mktempPromise(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{await this.mkdirPromise(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return await r(n)}finally{if(no.has(n)){no.delete(n);try{await this.removePromise(n)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(no.values()).map(async r=>{try{await K.removePromise(r,{maxRetries:0}),no.delete(r)}catch{}}))},rmtempSync(){for(let r of no)try{K.removeSync(r),no.delete(r)}catch{}}});var mk=ge(SQ());var op={};ft(op,{parseResolution:()=>$E,parseShell:()=>_E,parseSyml:()=>Si,stringifyArgument:()=>PQ,stringifyArgumentSegment:()=>DQ,stringifyArithmeticExpression:()=>ZE,stringifyCommand:()=>kQ,stringifyCommandChain:()=>eg,stringifyCommandChainThen:()=>xQ,stringifyCommandLine:()=>VE,stringifyCommandLineThen:()=>vQ,stringifyEnvSegment:()=>XE,stringifyRedirectArgument:()=>$h,stringifyResolution:()=>eI,stringifyShell:()=>$u,stringifyShellLine:()=>$u,stringifySyml:()=>Ma,stringifyValueArgument:()=>uc});var _M=ge(zM());function _E(r,e={isGlobPattern:()=>!1}){try{return(0,_M.parse)(r,e)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function $u(r,{endSemicolon:e=!1}={}){return r.map(({command:t,type:i},n)=>`${VE(t)}${i===";"?n!==r.length-1||e?";":"":" &"}`).join(" ")}function VE(r){return`${eg(r.chain)}${r.then?` ${vQ(r.then)}`:""}`}function vQ(r){return`${r.type} ${VE(r.line)}`}function eg(r){return`${kQ(r)}${r.then?` ${xQ(r.then)}`:""}`}function xQ(r){return`${r.type} ${eg(r.chain)}`}function kQ(r){switch(r.type){case"command":return`${r.envs.length>0?`${r.envs.map(e=>XE(e)).join(" ")} `:""}${r.args.map(e=>PQ(e)).join(" ")}`;case"subshell":return`(${$u(r.subshell)})${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"group":return`{ ${$u(r.group,{endSemicolon:!0})} }${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"envs":return r.envs.map(e=>XE(e)).join(" ");default:throw new Error(`Unsupported command type: "${r.type}"`)}}function XE(r){return`${r.name}=${r.args[0]?uc(r.args[0]):""}`}function PQ(r){switch(r.type){case"redirection":return $h(r);case"argument":return uc(r);default:throw new Error(`Unsupported argument type: "${r.type}"`)}}function $h(r){return`${r.subtype} ${r.args.map(e=>uc(e)).join(" ")}`}function uc(r){return r.segments.map(e=>DQ(e)).join("")}function DQ(r){let e=(i,n)=>n?`"${i}"`:i,t=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(r.type){case"text":return t(r.text);case"glob":return r.pattern;case"shell":return e(`\${${$u(r.shell)}}`,r.quoted);case"variable":return e(typeof r.defaultValue=="undefined"?typeof r.alternativeValue=="undefined"?`\${${r.name}}`:r.alternativeValue.length===0?`\${${r.name}:+}`:`\${${r.name}:+${r.alternativeValue.map(i=>uc(i)).join(" ")}}`:r.defaultValue.length===0?`\${${r.name}:-}`:`\${${r.name}:-${r.defaultValue.map(i=>uc(i)).join(" ")}}`,r.quoted);case"arithmetic":return`$(( ${ZE(r.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${r.type}"`)}}function ZE(r){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},t=(n,s)=>s?`( ${n} )`:n,i=n=>t(ZE(n),!["number","variable"].includes(n.type));switch(r.type){case"number":return String(r.value);case"variable":return r.name;default:return`${i(r.left)} ${e(r.type)} ${i(r.right)}`}}var ZM=ge(XM());function $E(r){let e=r.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${r}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,ZM.parse)(r)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function eI(r){let e="";return r.from&&(e+=r.from.fullName,r.from.description&&(e+=`@${r.from.description}`),e+="/"),e+=r.descriptor.fullName,r.descriptor.description&&(e+=`@${r.descriptor.description}`),e}var uI=ge(jK()),qK=ge(YK()),Tpe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,JK=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],YQ=class{constructor(e){this.data=e}};function WK(r){return r.match(Tpe)?r:JSON.stringify(r)}function zK(r){return typeof r=="undefined"?!0:typeof r=="object"&&r!==null?Object.keys(r).every(e=>zK(r[e])):!1}function qQ(r,e,t){if(r===null)return`null -`;if(typeof r=="number"||typeof r=="boolean")return`${r.toString()} -`;if(typeof r=="string")return`${WK(r)} -`;if(Array.isArray(r)){if(r.length===0)return`[] -`;let i=" ".repeat(e);return` -${r.map(s=>`${i}- ${qQ(s,e+1,!1)}`).join("")}`}if(typeof r=="object"&&r){let i,n;r instanceof YQ?(i=r.data,n=!1):(i=r,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=JK.indexOf(l),g=JK.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!zK(i[l])).map((l,c)=>{let u=i[l],g=WK(l),f=qQ(u,e+1,!0),h=c>0||t?s:"",p=g.length>1024?`? ${g} -${h}:`:`${g}:`,m=f.startsWith(` -`)?f:` ${f}`;return`${h}${p}${m}`}).join(e===0?` -`:"")||` -`;return t?` -${a}`:`${a}`}throw new Error(`Unsupported value type (${r})`)}function Ma(r){try{let e=qQ(r,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Ma.PreserveOrdering=YQ;function Ope(r){return r.endsWith(` -`)||(r+=` -`),(0,qK.parse)(r)}var Mpe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function Kpe(r){if(Mpe.test(r))return Ope(r);let e=(0,uI.safeLoad)(r,{schema:uI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Si(r){return Kpe(r)}var T4=ge(VK()),mw=ge(Ic());var Cp={};ft(Cp,{Builtins:()=>oS,Cli:()=>ws,Command:()=>Re,Option:()=>J,UsageError:()=>Pe,formatMarkdownish:()=>Ui});var yc=0,ap=1,tn=2,WQ="",vi="\0",lg=-1,zQ=/^(-h|--help)(?:=([0-9]+))?$/,gI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,tU=/^-[a-zA-Z]{2,}$/,_Q=/^([^=]+)=([\s\S]*)$/,VQ=process.env.DEBUG_CLI==="1";var Pe=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},Ap=class extends Error{constructor(e,t){super();if(this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${XQ(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${XQ(e)}`}},ZQ=class extends Error{constructor(e,t){super();this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${XQ(e)}`}},XQ=r=>`While running ${r.filter(e=>e!==vi).map(e=>{let t=JSON.stringify(e);return e.match(/\s/)||e.length===0||t!==`"${e}"`?t:e}).join(" ")}`;var lp=Symbol("clipanion/isOption");function rn(r){return te(N({},r),{[lp]:!0})}function Oo(r,e){return typeof r=="undefined"?[r,e]:typeof r=="object"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function fI(r,e=!1){let t=r.replace(/^\.: /,"");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function cp(r,e){return e.length===1?new Pe(`${r}: ${fI(e[0],!0)}`):new Pe(`${r}: -${e.map(t=>` -- ${fI(t)}`).join("")}`)}function up(r,e,t){if(typeof t=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw cp(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}var Re=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(ys(),cg)),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw cp("Invalid option schema",l);for(let[,g]of c)g()}else if(t!=null)throw new Error("Invalid command schema");let i=await this.execute();return typeof i!="undefined"?i:0}};Re.isOption=lp;Re.Default=[];var uU=80,tS=Array(uU).fill("\u2501");for(let r=0;r<=24;++r)tS[tS.length-r]=`[38;5;${232+r}m\u2501`;var rS={header:r=>`\u2501\u2501\u2501 ${r}${r.length`${r}`,error:r=>`${r}`,code:r=>`${r}`},gU={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function yde(r){let e=r.split(` -`),t=e.filter(n=>n.match(/\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function Ui(r,{format:e,paragraphs:t}){return r=r.replace(/\r\n?/g,` -`),r=yde(r),r=r.replace(/^\n+|\n+$/g,""),r=r.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),r=r.replace(/\n(\n)?\n*/g,"$1"),t&&(r=r.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),r=r.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r} -`:""}var sS=ge(require("tty"));function wn(r){VQ&&console.log(r)}var fU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:lg};function hU(){return{nodes:[sn(),sn(),sn()]}}function Bde(r){let e=hU(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(yc)}function Qde(r,{prefix:e=""}={}){if(VQ){wn(`${e}Nodes are:`);for(let t=0;tl!==tn).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===tn))throw new Ap(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=Sde(a)}if(i.length>0){wn(" Results:");for(let s of i)wn(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else wn(" No results");return i}function vde(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,vi)){for(let{to:t}of r.statics[vi])if(t===ap)return!0}return!1}function kde(r,e,t){let i=t&&e.length>0?[""]:[],n=dU(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let m=r.nodes[p],y=Object.keys(m.statics);for(let b of Object.keys(m.statics)){let v=y[0];for(let{to:x,reducer:T}of m.statics[v])T==="pushPath"&&(u||l.push(v),g.push(x))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=vde(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==vi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===tn)continue;let p=xde(f,c);if(p!==null)for(let m of p)a([...i,m],l)}}return[...s].sort()}function Dde(r,e){let t=dU(r,[...e,vi]);return Pde(e,t.map(({state:i})=>i))}function Sde(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function Pde(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Ap(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=Rde(c);if(u.length>1)throw new ZQ(r,u.map(g=>g.candidateUsage));return u[0]}function Rde(r){let e=[],t=[];for(let i of r)i.selectedIndex===lg?t.push(i):e.push(i);return t.length>0&&e.push(te(N({},fU),{path:CU(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])})),e}function CU(r,e,...t){return e===void 0?Array.from(r):CU(r.filter((i,n)=>i===e[n]),...t)}function sn(){return{dynamics:[],shortcuts:[],statics:{}}}function pU(r){return r===ap||r===tn}function nS(r,e=0){return{to:pU(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function wde(r,e=0){let t=sn();for(let[i,n]of r.dynamics)t.dynamics.push([i,nS(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(nS(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>nS(s,e));return t}function xi(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function ug(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function Ka(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function pI(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function xde(r,e){let t=Array.isArray(r)?dI[r[0]]:dI[r];if(typeof t.suggest=="undefined")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var dI={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(r,e)=>r.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&&tU.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(_Q);return!r.ignoreOptions&&!!n&&gI.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&&zQ.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith("-")&&gI.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith("-")&&!gI.test(e)};dI.isOption.suggest=(r,e,t=!0)=>t?null:[e];var iS={setCandidateState:(r,e,t)=>N(N({},r),t),setSelectedIndex:(r,e,t)=>te(N({},r),{selectedIndex:t}),pushBatch:(r,e)=>te(N({},r),{options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(_Q);return te(N({},r),{options:r.options.concat({name:t,value:i})})},pushPath:(r,e)=>te(N({},r),{path:r.path.concat(e)}),pushPositional:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:Zn})}),pushTrue:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>te(N({},r),{options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i=te(N({},r),{options:[...r.options]}),n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t=te(N({},r),{options:[...r.options]}),i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>te(N({},r),{ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(zQ);return typeof i!="undefined"?te(N({},r),{options:[{name:"-c",value:String(t)},{name:"-i",value:i}]}):te(N({},r),{options:[{name:"-c",value:String(t)}]})},setError:(r,e,t)=>e===vi?te(N({},r),{errorMessage:`${t}.`}):te(N({},r),{errorMessage:`${t} ("${e}").`}),setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return te(N({},r),{errorMessage:`Not enough arguments to option ${t.name}.`})}},Zn=Symbol(),mU=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===Zn)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!t&&this.arity.extra!==Zn?this.arity.extra.push(e):this.arity.extra!==Zn&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===Zn)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Zn?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=hU(),t=yc,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=so(e,sn()),Ka(e,yc,WQ,t,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=so(e,sn());ug(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=so(e,sn());xi(e,l,"isHelp",f,["useHelp",this.cliIndex]),Ka(e,f,vi,ap,["setSelectedIndex",lg]),this.registerOptions(e,l)}this.arity.leading.length>0&&Ka(e,l,vi,tn,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&Ka(e,h,vi,tn,["setError","Not enough positional arguments"]),xi(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Zn||this.arity.extra.length>0){let f=so(e,sn());if(ug(e,c,f),this.arity.extra===Zn){let h=so(e,sn());this.arity.proxy||this.registerOptions(e,h),xi(e,c,s,h,"pushExtraNoLimits"),xi(e,h,s,h,"pushExtraNoLimits"),ug(e,h,f)}else for(let h=0;h0&&Ka(e,u,vi,tn,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)xi(e,t,["isOption",s,i.hidden||s!==n],t,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&xi(e,t,["isNegatedOption",s],t,["pushFalse",s]);else{let s=so(e,sn());for(let o of i.names)xi(e,t,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eDde(i,n),suggest:(n,s)=>kde(i,n,s)}}};var dp=class extends Re{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,t){let i=new dp(t);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};var EU=Symbol("clipanion/errorCommand");function Fde(){return process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY?8:1}var ws=class{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new pp({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new ws(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[Re.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case lg:return dp.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[EU]=a,l}}break}}async run(e,t){var i;let n,s=N(N({},ws.defaultContext),t),o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,N(N({},s),u)),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?Nde(s):IU,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Ui(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Ui(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Ui(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Ui(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof Re?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Ui(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(t).header("Usage")} -`,a+=` -`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g} -`,f.length>0){a+=` -`,a+=`${rS.header("Options")} -`;let h=f.reduce((p,m)=>Math.max(p,m.definition.length),0);a+=` -`;for(let{definition:p,description:m}of f)a+=` ${this.format(t).bold(p.padEnd(h))} ${Ui(m,{format:this.format(t),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(t).header("Details")} -`,a+=` -`,a+=Ui(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(t).header("Examples")} -`;for(let[h,p]of u)a+=` -`,a+=Ui(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(t).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l} -`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Ui(f.usage.category,{format:this.format(t),paragraphs:!1}):null,m=l.get(p);typeof m=="undefined"&&l.set(p,m=[]);let{usage:y}=this.getUsageByIndex(h);m.push({commandClass:f,usage:y})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)} -`:a+=`${this.format(t).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(t).bold(n)}${this.binaryName} -`):a+=`${this.format(t).bold(n)}${this.binaryName} -`;for(let f of c){let h=l.get(f).slice().sort((m,y)=>m.usage.localeCompare(y.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` -`,a+=`${this.format(t).header(`${p}`)} -`;for(let{commandClass:m,usage:y}of h){let b=m.usage.description||"undocumented";a+=` -`,a+=` ${this.format(t).bold(y)} -`,a+=` ${Ui(b,{format:this.format(t),paragraphs:!1})}`}}a+=` -`,a+=Ui("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[EU])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:ws.defaultContext.colorDepth>1)?rS:gU}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};ws.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:"getColorDepth"in sS.default.WriteStream.prototype?sS.default.WriteStream.prototype.getColorDepth():Fde()};var yU;function Nde(r){let e=yU;if(typeof e=="undefined"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return IU;let{AsyncLocalStorage:t}=require("async_hooks");e=yU=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function IU(r){return r()}var oS={};ft(oS,{DefinitionsCommand:()=>CI,HelpCommand:()=>mI,VersionCommand:()=>EI});var CI=class extends Re{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};CI.paths=[["--clipanion=definitions"]];var mI=class extends Re{async execute(){this.context.stdout.write(this.cli.usage())}};mI.paths=[["-h"],["--help"]];var EI=class extends Re{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};EI.paths=[["-v"],["--version"]];var J={};ft(J,{Array:()=>wU,Boolean:()=>BU,Counter:()=>bU,Proxy:()=>QU,Rest:()=>SU,String:()=>vU,applyValidator:()=>up,cleanValidationError:()=>fI,formatError:()=>cp,isOptionSymbol:()=>lp,makeCommandOption:()=>rn,rerouteArguments:()=>Oo});function wU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function BU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function bU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function QU(r={}){return rn({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}function SU(r={}){return rn({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Zn||a.extra===!1&&oo)}})}function Lde(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?up(g!=null?g:c,f,n.validator):f}})}function Tde(r={}){let{required:e=!0}=r;return rn({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;oYW,areIdentsEqual:()=>fd,areLocatorsEqual:()=>hd,areVirtualPackagesEquivalent:()=>aSe,bindDescriptor:()=>sSe,bindLocator:()=>oSe,convertDescriptorToLocator:()=>Aw,convertLocatorToDescriptor:()=>_x,convertPackageToLocator:()=>nSe,convertToIdent:()=>iSe,convertToManifestRange:()=>cSe,copyPackage:()=>cd,devirtualizeDescriptor:()=>ud,devirtualizeLocator:()=>gd,getIdentVendorPath:()=>ek,isPackageCompatible:()=>gw,isVirtualDescriptor:()=>Al,isVirtualLocator:()=>ea,makeDescriptor:()=>rr,makeIdent:()=>$o,makeLocator:()=>cn,makeRange:()=>cw,parseDescriptor:()=>ll,parseFileStyleRange:()=>ASe,parseIdent:()=>An,parseLocator:()=>Yc,parseRange:()=>qg,prettyDependent:()=>Lv,prettyDescriptor:()=>sr,prettyIdent:()=>fi,prettyLocator:()=>It,prettyLocatorNoColors:()=>$x,prettyRange:()=>aw,prettyReference:()=>dd,prettyResolution:()=>Tv,prettyWorkspace:()=>Cd,renamePackage:()=>ld,slugifyIdent:()=>Zx,slugifyLocator:()=>Jg,sortDescriptors:()=>Wg,stringifyDescriptor:()=>Pn,stringifyIdent:()=>Ot,stringifyLocator:()=>Rs,tryParseDescriptor:()=>pd,tryParseIdent:()=>qW,tryParseLocator:()=>lw,virtualizeDescriptor:()=>Vx,virtualizePackage:()=>Xx});var Yg=ge(require("querystring")),HW=ge(ri()),jW=ge(nY());var ae={};ft(ae,{LogLevel:()=>ho,Style:()=>Tc,Type:()=>qe,addLogFilterSupport:()=>nd,applyColor:()=>ns,applyHyperlink:()=>Mg,applyStyle:()=>Ry,json:()=>Oc,jsonOrPretty:()=>KBe,mark:()=>Hv,pretty:()=>tt,prettyField:()=>_o,prettyList:()=>Uv,supportsColor:()=>Py,supportsHyperlinks:()=>Mv,tuple:()=>fo});var rd=ge(uv()),id=ge(Ic());var sJ=ge(is()),oJ=ge(Jq());var Se={};ft(Se,{AsyncActions:()=>$q,BufferStream:()=>Zq,CachingStrategy:()=>Lc,DefaultStream:()=>eJ,allSettledSafe:()=>go,assertNever:()=>Pv,bufferStream:()=>Tg,buildIgnorePattern:()=>LBe,convertMapsToIndexableObjects:()=>ky,dynamicRequire:()=>Og,escapeRegExp:()=>PBe,getArrayWithDefault:()=>Fg,getFactoryWithDefault:()=>_a,getMapWithDefault:()=>Ng,getSetWithDefault:()=>Nc,isIndexableObject:()=>Dv,isPathLike:()=>TBe,isTaggedYarnVersion:()=>kBe,mapAndFilter:()=>zo,mapAndFind:()=>$p,overrideType:()=>kv,parseBoolean:()=>td,parseOptionalBoolean:()=>nJ,prettifyAsyncErrors:()=>Lg,prettifySyncErrors:()=>Rv,releaseAfterUseAsync:()=>RBe,replaceEnvVariables:()=>Fv,sortMap:()=>kn,tryParseOptionalBoolean:()=>Nv,validateEnum:()=>DBe});var Wq=ge(is()),zq=ge(gg()),_q=ge(ri()),xv=ge(require("stream"));function kBe(r){return!!(_q.default.valid(r)&&r.match(/^[^-]+(-rc\.[0-9]+)?$/))}function PBe(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kv(r){}function Pv(r){throw new Error(`Assertion failed: Unexpected object '${r}'`)}function DBe(r,e){let t=Object.values(r);if(!t.includes(e))throw new Pe(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${t.map(i=>JSON.stringify(i)).join(", ")})`);return e}function zo(r,e){let t=[];for(let i of r){let n=e(i);n!==Vq&&t.push(n)}return t}var Vq=Symbol();zo.skip=Vq;function $p(r,e){for(let t of r){let i=e(t);if(i!==Xq)return i}}var Xq=Symbol();$p.skip=Xq;function Dv(r){return typeof r=="object"&&r!==null}async function go(r){let e=await Promise.allSettled(r),t=[];for(let i of e){if(i.status==="rejected")throw i.reason;t.push(i.value)}return t}function ky(r){if(r instanceof Map&&(r=Object.fromEntries(r)),Dv(r))for(let e of Object.keys(r)){let t=r[e];Dv(t)&&(r[e]=ky(t))}return r}function _a(r,e,t){let i=r.get(e);return typeof i=="undefined"&&r.set(e,i=t()),i}function Fg(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=[]),t}function Nc(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Set),t}function Ng(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Map),t}async function RBe(r,e){if(e==null)return await r();try{return await r()}finally{await e()}}async function Lg(r,e){try{return await r()}catch(t){throw t.message=e(t.message),t}}function Rv(r,e){try{return r()}catch(t){throw t.message=e(t.message),t}}async function Tg(r){return await new Promise((e,t)=>{let i=[];r.on("error",n=>{t(n)}),r.on("data",n=>{i.push(n)}),r.on("end",()=>{e(Buffer.concat(i))})})}var Zq=class extends xv.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}};function FBe(){let r,e;return{promise:new Promise((i,n)=>{r=i,e=n}),resolve:r,reject:e}}var $q=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,zq.default)(e)}set(e,t){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=FBe());let n=this.limit(()=>t());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,t){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>t(i))}async wait(){await Promise.all(this.promises.values())}},eJ=class extends xv.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},ed=eval("require");function tJ(r){return ed(H.fromPortablePath(r))}function rJ(path){let physicalPath=H.fromPortablePath(path),currentCacheEntry=ed.cache[physicalPath];delete ed.cache[physicalPath];let result;try{result=tJ(physicalPath);let freshCacheEntry=ed.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{ed.cache[physicalPath]=currentCacheEntry}return result}var iJ=new Map;function NBe(r){let e=iJ.get(r),t=K.statSync(r);if((e==null?void 0:e.mtime)===t.mtimeMs)return e.instance;let i=rJ(r);return iJ.set(r,{mtime:t.mtimeMs,instance:i}),i}var Lc;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Lc||(Lc={}));function Og(r,{cachingStrategy:e=2}={}){switch(e){case 0:return rJ(r);case 1:return NBe(r);case 2:return tJ(r);default:throw new Error("Unsupported caching strategy")}}function kn(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function LBe(r){return r.length===0?null:r.map(e=>`(${Wq.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Fv(r,{env:e}){let t=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return r.replace(t,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new Pe(`Environment variable not found (${n})`)})}function td(r){switch(r){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${r}" as a boolean`)}}function nJ(r){return typeof r=="undefined"?r:td(r)}function Nv(r){try{return nJ(r)}catch{return null}}function TBe(r){return!!(H.isAbsolute(r)||r.match(/^(\.{1,2}|~)\//))}var Qt;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(Qt||(Qt={}));var wi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(wi||(wi={}));var qi;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(qi||(qi={}));var qe={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN"},Tc;(function(e){e[e.BOLD=2]="BOLD"})(Tc||(Tc={}));var Ov=id.default.GITHUB_ACTIONS?{level:2}:rd.default.supportsColor?{level:rd.default.supportsColor.level}:{level:0},Py=Ov.level!==0,Mv=Py&&!id.default.GITHUB_ACTIONS&&!id.default.CIRCLE&&!id.default.GITLAB,Kv=new rd.default.Instance(Ov),OBe=new Map([[qe.NO_HINT,null],[qe.NULL,["#a853b5",129]],[qe.SCOPE,["#d75f00",166]],[qe.NAME,["#d7875f",173]],[qe.RANGE,["#00afaf",37]],[qe.REFERENCE,["#87afff",111]],[qe.NUMBER,["#ffd700",220]],[qe.PATH,["#d75fd7",170]],[qe.URL,["#d75fd7",170]],[qe.ADDED,["#5faf00",70]],[qe.REMOVED,["#d70000",160]],[qe.CODE,["#87afff",111]],[qe.SIZE,["#ffd700",220]]]),Fs=r=>r,Dy={[qe.NUMBER]:Fs({pretty:(r,e)=>`${e}`,json:r=>r}),[qe.IDENT]:Fs({pretty:(r,e)=>fi(r,e),json:r=>Ot(r)}),[qe.LOCATOR]:Fs({pretty:(r,e)=>It(r,e),json:r=>Rs(r)}),[qe.DESCRIPTOR]:Fs({pretty:(r,e)=>sr(r,e),json:r=>Pn(r)}),[qe.RESOLUTION]:Fs({pretty:(r,{descriptor:e,locator:t})=>Tv(r,e,t),json:({descriptor:r,locator:e})=>({descriptor:Pn(r),locator:e!==null?Rs(e):null})}),[qe.DEPENDENT]:Fs({pretty:(r,{locator:e,descriptor:t})=>Lv(r,e,t),json:({locator:r,descriptor:e})=>({locator:Rs(r),descriptor:Pn(e)})}),[qe.PACKAGE_EXTENSION]:Fs({pretty:(r,e)=>{switch(e.type){case wi.Dependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"dependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependencyMeta:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependenciesMeta",qe.CODE)} \u27A4 ${fi(r,An(e.selector))} \u27A4 ${ns(r,e.key,qe.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:r=>{switch(r.type){case wi.Dependency:return`${Ot(r.parentDescriptor)} > ${Ot(r.descriptor)}`;case wi.PeerDependency:return`${Ot(r.parentDescriptor)} >> ${Ot(r.descriptor)}`;case wi.PeerDependencyMeta:return`${Ot(r.parentDescriptor)} >> ${r.selector} / ${r.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${r.type}`)}}}),[qe.SETTING]:Fs({pretty:(r,e)=>(r.get(e),Mg(r,ns(r,e,qe.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:r=>r}),[qe.DURATION]:Fs({pretty:(r,e)=>{if(e>1e3*60){let t=Math.floor(e/1e3/60),i=Math.ceil((e-t*60*1e3)/1e3);return i===0?`${t}m`:`${t}m ${i}s`}else{let t=Math.floor(e/1e3),i=e-t*1e3;return i===0?`${t}s`:`${t}s ${i}ms`}},json:r=>r}),[qe.SIZE]:Fs({pretty:(r,e)=>{let t=["KB","MB","GB","TB"],i=t.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return ns(r,`${s} ${t[i-1]}`,qe.NUMBER)},json:r=>r}),[qe.PATH]:Fs({pretty:(r,e)=>ns(r,H.fromPortablePath(e),qe.PATH),json:r=>H.fromPortablePath(r)}),[qe.MARKDOWN]:Fs({pretty:(r,{text:e,format:t,paragraphs:i})=>Ui(e,{format:t,paragraphs:i}),json:({text:r})=>r})};function fo(r,e){return[e,r]}function Ry(r,e,t){return r.get("enableColors")&&t&2&&(e=rd.default.bold(e)),e}function ns(r,e,t){if(!r.get("enableColors"))return e;let i=OBe.get(t);if(i===null)return e;let n=typeof i=="undefined"?t:Ov.level>=3?i[0]:i[1],s=typeof n=="number"?Kv.ansi256(n):n.startsWith("#")?Kv.hex(n):Kv[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var MBe=!!process.env.KONSOLE_VERSION;function Mg(r,e,t){return r.get("enableHyperlinks")?MBe?`]8;;${t}\\${e}]8;;\\`:`]8;;${t}\x07${e}]8;;\x07`:e}function tt(r,e,t){if(e===null)return ns(r,"null",qe.NULL);if(Object.prototype.hasOwnProperty.call(Dy,t))return Dy[t].pretty(r,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return ns(r,e,t)}function Uv(r,e,t,{separator:i=", "}={}){return[...e].map(n=>tt(r,n,t)).join(i)}function Oc(r,e){if(r===null)return null;if(Object.prototype.hasOwnProperty.call(Dy,e))return kv(e),Dy[e].json(r);if(typeof r!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof r}`);return r}function KBe(r,e,[t,i]){return r?Oc(t,i):tt(e,t,i)}function Hv(r){return{Check:ns(r,"\u2713","green"),Cross:ns(r,"\u2718","red"),Question:ns(r,"?","cyan")}}function _o(r,{label:e,value:[t,i]}){return`${tt(r,e,qe.CODE)}: ${tt(r,t,i)}`}var ho;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(ho||(ho={}));function nd(r,{configuration:e}){let t=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of t){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let m=g.get("pattern");typeof m!="undefined"&&s.push([sJ.default.matcher(m,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===X.UNNAMED)return h;let p=n.size>0||s.length>0?(0,oJ.default)(f):f;if(n.size>0){let m=n.get(p);if(typeof m!="undefined")return m!=null?m:h}if(s.length>0){for(let[m,y]of s)if(m(p))return y!=null?y:h}if(i.size>0){let m=i.get(_A(g));if(typeof m!="undefined")return m!=null?m:h}return h},a=r.reportInfo,l=r.reportWarning,c=r.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case ho.Info:a.call(g,f,h);break;case ho.Warning:l.call(g,f!=null?f:X.UNNAMED,h);break;case ho.Error:c.call(g,f!=null?f:X.UNNAMED,h);break}};r.reportInfo=function(...g){return u(this,...g,ho.Info)},r.reportWarning=function(...g){return u(this,...g,ho.Warning)},r.reportError=function(...g){return u(this,...g,ho.Error)}}var Dn={};ft(Dn,{checksumFile:()=>sw,checksumPattern:()=>ow,makeHash:()=>ln});var nw=ge(require("crypto")),zx=ge(Wx());function ln(...r){let e=(0,nw.createHash)("sha512"),t="";for(let i of r)typeof i=="string"?t+=i:i&&(t&&(e.update(t),t=""),e.update(i));return t&&e.update(t),e.digest("hex")}async function sw(r,{baseFs:e,algorithm:t}={baseFs:K,algorithm:"sha512"}){let i=await e.openPromise(r,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,nw.createHash)(t),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function ow(r,{cwd:e}){let i=(await(0,zx.default)(r,{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,zx.default)([r,...i],{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=H.toPortablePath(a),u=await K.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await K.readlinkPromise(c))):u.isFile()&&l.push(await K.readFilePromise(c)),l.join("\0")})),o=(0,nw.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var Ad="virtual:",tSe=5,GW=/(os|cpu|libc)=([a-z0-9_-]+)/,rSe=(0,jW.makeParser)(GW);function $o(r,e){if(r==null?void 0:r.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:ln(r,e),scope:r,name:e}}function rr(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:ln(r.identHash,e),range:e}}function cn(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:ln(r.identHash,e),reference:e}}function iSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name}}function Aw(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.descriptorHash,reference:r.range}}function _x(r){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:r.locatorHash,range:r.reference}}function nSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.locatorHash,reference:r.reference}}function ld(r,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:r.version,languageName:r.languageName,linkType:r.linkType,conditions:r.conditions,dependencies:new Map(r.dependencies),peerDependencies:new Map(r.peerDependencies),dependenciesMeta:new Map(r.dependenciesMeta),peerDependenciesMeta:new Map(r.peerDependenciesMeta),bin:new Map(r.bin)}}function cd(r){return ld(r,r)}function Vx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return rr(r,`virtual:${e}#${r.range}`)}function Xx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return ld(r,cn(r,`virtual:${e}#${r.reference}`))}function Al(r){return r.range.startsWith(Ad)}function ea(r){return r.reference.startsWith(Ad)}function ud(r){if(!Al(r))throw new Error("Not a virtual descriptor");return rr(r,r.range.replace(/^[^#]*#/,""))}function gd(r){if(!ea(r))throw new Error("Not a virtual descriptor");return cn(r,r.reference.replace(/^[^#]*#/,""))}function sSe(r,e){return r.range.includes("::")?r:rr(r,`${r.range}::${Yg.default.stringify(e)}`)}function oSe(r,e){return r.reference.includes("::")?r:cn(r,`${r.reference}::${Yg.default.stringify(e)}`)}function fd(r,e){return r.identHash===e.identHash}function YW(r,e){return r.descriptorHash===e.descriptorHash}function hd(r,e){return r.locatorHash===e.locatorHash}function aSe(r,e){if(!ea(r))throw new Error("Invalid package type");if(!ea(e))throw new Error("Invalid package type");if(!fd(r,e)||r.dependencies.size!==e.dependencies.size)return!1;for(let t of r.dependencies.values()){let i=e.dependencies.get(t.identHash);if(!i||!YW(t,i))return!1}return!0}function An(r){let e=qW(r);if(!e)throw new Error(`Invalid ident (${r})`);return e}function qW(r){let e=r.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,t,i]=e,n=typeof t!="undefined"?t:null;return $o(n,i)}function ll(r,e=!1){let t=pd(r,e);if(!t)throw new Error(`Invalid descriptor (${r})`);return t}function pd(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid range (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return rr($o(o,n),a)}function Yc(r,e=!1){let t=lw(r,e);if(!t)throw new Error(`Invalid locator (${r})`);return t}function lw(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid reference (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return cn($o(o,n),a)}function qg(r,e){let t=r.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(t===null)throw new Error(`Invalid range (${r})`);let i=typeof t[1]!="undefined"?t[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof t[3]!="undefined"?decodeURIComponent(t[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${r})`);let s=typeof t[3]!="undefined"?decodeURIComponent(t[3]):decodeURIComponent(t[2]),o=(e==null?void 0:e.parseSelector)?Yg.default.parse(s):s,a=typeof t[4]!="undefined"?Yg.default.parse(t[4]):null;return{protocol:i,source:n,selector:o,params:a}}function ASe(r,{protocol:e}){let{selector:t,params:i}=qg(r,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${r}`);return{parentLocator:Yc(i.locator,!0),path:t}}function JW(r){return r=r.replace(/%/g,"%25"),r=r.replace(/:/g,"%3A"),r=r.replace(/#/g,"%23"),r}function lSe(r){return r===null?!1:Object.entries(r).length>0}function cw({protocol:r,source:e,selector:t,params:i}){let n="";return r!==null&&(n+=`${r}`),e!==null&&(n+=`${JW(e)}#`),n+=JW(t),lSe(i)&&(n+=`::${Yg.default.stringify(i)}`),n}function cSe(r){let{params:e,protocol:t,source:i,selector:n}=qg(r);for(let s in e)s.startsWith("__")&&delete e[s];return cw({protocol:t,source:i,params:e,selector:n})}function Ot(r){return r.scope?`@${r.scope}/${r.name}`:`${r.name}`}function Pn(r){return r.scope?`@${r.scope}/${r.name}@${r.range}`:`${r.name}@${r.range}`}function Rs(r){return r.scope?`@${r.scope}/${r.name}@${r.reference}`:`${r.name}@${r.reference}`}function Zx(r){return r.scope!==null?`@${r.scope}-${r.name}`:r.name}function Jg(r){let{protocol:e,selector:t}=qg(r.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=HW.default.valid(t),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=r.scope?`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`:`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`;return Jr(a)}function fi(r,e){return e.scope?`${tt(r,`@${e.scope}/`,qe.SCOPE)}${tt(r,e.name,qe.NAME)}`:`${tt(r,e.name,qe.NAME)}`}function uw(r){if(r.startsWith(Ad)){let e=uw(r.substring(r.indexOf("#")+1)),t=r.substring(Ad.length,Ad.length+tSe);return`${e} [${t}]`}else return r.replace(/\?.*/,"?[...]")}function aw(r,e){return`${tt(r,uw(e),qe.RANGE)}`}function sr(r,e){return`${fi(r,e)}${tt(r,"@",qe.RANGE)}${aw(r,e.range)}`}function dd(r,e){return`${tt(r,uw(e),qe.REFERENCE)}`}function It(r,e){return`${fi(r,e)}${tt(r,"@",qe.REFERENCE)}${dd(r,e.reference)}`}function $x(r){return`${Ot(r)}@${uw(r.reference)}`}function Wg(r){return kn(r,[e=>Ot(e),e=>e.range])}function Cd(r,e){return fi(r,e.locator)}function Tv(r,e,t){let i=Al(e)?ud(e):e;return t===null?`${sr(r,i)} \u2192 ${Hv(r).Cross}`:i.identHash===t.identHash?`${sr(r,i)} \u2192 ${dd(r,t.reference)}`:`${sr(r,i)} \u2192 ${It(r,t)}`}function Lv(r,e,t){return t===null?`${It(r,e)}`:`${It(r,e)} (via ${aw(r,t.range)})`}function ek(r){return`node_modules/${Ot(r)}`}function gw(r,e){return r.conditions?rSe(r.conditions,t=>{let[,i,n]=t.match(GW),s=e[i];return s?s.includes(n):!0}):!0}var WW={hooks:{reduceDependency:(r,e,t,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==Ot(t)||o.from&&o.from.description&&o.from.description!==t.reference||o.descriptor.fullName!==Ot(r)||o.descriptor.description&&o.descriptor.description!==r.range)continue;return n.bindDescriptor(rr(r,a),e.topLevelWorkspace.anchoredLocator,s)}return r},validateProject:async(r,e)=>{for(let t of r.workspaces){let i=Cd(r.configuration,t);await r.configuration.triggerHook(n=>n.validateWorkspace,t,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(r,e)=>{let{manifest:t}=r;t.resolutions.length&&r.cwd!==r.project.cwd&&t.errors.push(new Error("Resolutions field will be ignored"));for(let i of t.errors)e.reportWarning(X.INVALID_MANIFEST,i.message)}}};var XW=ge(ri());var md=class{supportsDescriptor(e,t){return!!(e.range.startsWith(md.protocol)||t.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,t){return!!e.reference.startsWith(md.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.getWorkspaceByCwd(e.reference.slice(md.protocol.length));return te(N({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:Qt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},oi=md;oi.protocol="workspace:";var Wt={};ft(Wt,{SemVer:()=>zW.SemVer,clean:()=>gSe,satisfiesWithPrereleases:()=>qc,validRange:()=>po});var fw=ge(ri()),zW=ge(ri()),_W=new Map;function qc(r,e,t=!1){if(!r)return!1;let i=`${e}${t}`,n=_W.get(i);if(typeof n=="undefined")try{n=new fw.default.Range(e,{includePrerelease:!0,loose:t})}catch{return!1}finally{_W.set(i,n||null)}else if(n===null)return!1;let s;try{s=new fw.default.SemVer(r,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var VW=new Map;function po(r){if(r.indexOf(":")!==-1)return null;let e=VW.get(r);if(typeof e!="undefined")return e;try{e=new fw.default.Range(r)}catch{e=null}return VW.set(r,e),e}var uSe=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/;function gSe(r){let e=uSe.exec(r);return e?e[1]:null}var cl=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:t=new ar}={}){let i=k.join(e,"package.json");try{return await cl.fromFile(i,{baseFs:t})}catch(n){if(n.code==="ENOENT")return null;throw n}}static async find(e,{baseFs:t}={}){let i=await cl.tryFind(e,{baseFs:t});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:t=new ar}={}){let i=new cl;return await i.loadFile(e,{baseFs:t}),i}static fromText(e){let t=new cl;return t.loadFromText(e),t}static isManifestFieldCompatible(e,t){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,t===s.slice(1))return!1}else if(i=!1,s===t)return!0;return n&&i}loadFromText(e){let t;try{t=JSON.parse($W(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(t),this.indent=ZW(e)}async loadFile(e,{baseFs:t=new ar}){let i=await t.readFilePromise(e,"utf8"),n;try{n=JSON.parse($W(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=ZW(i)}load(e,{yamlCompatibilityMode:t=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=An(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(Array.isArray(e.libc)){let s=[];this.libc=s;for(let o of e.libc)typeof o!="string"?i.push(new Error("Parsing failed for the 'libc' field")):s.push(o)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=un(e.main):this.main=null,typeof e.module=="string"?this.module=un(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=un(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(un(s),typeof o=="string"?un(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,un(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}let a=An(s);this.bin.set(a.name,un(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(oi.protocol)&&!po(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=rr(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=ll(s),l=this.ensureDependencyMeta(a),c=hw(o.built,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=hw(o.optional,{yamlCompatibilityMode:t});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=hw(o.unplugged,{yamlCompatibilityMode:t});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=ll(s),l=this.ensurePeerDependencyMeta(a),c=hw(o.optional,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:$E(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=un(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=un(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=un(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(un(s),typeof o=="string"?un(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,un(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,un(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(un(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l);let c=rr(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(tk("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(tk("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(tk("libc",this.libc)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return cl.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return cl.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!XW.default.valid(e.range))throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(t);n||this.dependenciesMeta.set(t,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=this.peerDependenciesMeta.get(t);return i||this.peerDependenciesMeta.set(t,i={}),i}setRawField(e,t,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=t,a=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=Ot(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=te(N({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(Ot(o)),l=!1;if(t&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Wg(i).map(o=>({[Ot(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Wg(n).map(o=>({[Ot(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Wg(this.devDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Wg(this.peerDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of kn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of kn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?Pn(rr(An(o),l)):o,g=N({},c);t&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...kn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[eI(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},At=cl;At.fileName="package.json",At.allDependencies=["dependencies","devDependencies","peerDependencies"],At.hardDependencies=["dependencies","devDependencies"];function ZW(r){let e=r.match(/^[ \t]+/m);return e?e[0]:" "}function $W(r){return r.charCodeAt(0)===65279?r.slice(1):r}function un(r){return r.replace(/\\/g,"/")}function hw(r,{yamlCompatibilityMode:e}){return e?Nv(r):typeof r=="undefined"||typeof r=="boolean"?r:null}function e4(r,e){let t=e.search(/[^!]/);if(t===-1)return"invalid";let i=t%2==0?"":"!",n=e.slice(t);return`${i}${r}=${n}`}function tk(r,e){return e.length===1?e4(r,e[0]):`(${e.map(t=>e4(r,t)).join(" | ")})`}var D4=ge(P4()),R4=ge(require("stream")),F4=ge(require("string_decoder"));var sve=15,ct=class extends Error{constructor(e,t,i){super(t);this.reportExtra=i;this.reportCode=e}};function ove(r){return typeof r.reportCode!="undefined"}var Ji=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let t=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),t=l,c()},o=(l=0)=>{s(t+1)},a=async function*(){for(;t{t=o}),n=(0,D4.default)(o=>{let a=t;i=new Promise(l=>{t=l}),e=o,a()},1e3/sve),s=async function*(){for(;;)await i,yield{title:e}}();return{[Symbol.asyncIterator](){return s},hasProgress:!1,hasTitle:!0,setTitle:n}}async startProgressPromise(e,t){let i=this.reportProgress(e);try{return await t(e)}finally{i.stop()}}startProgressSync(e,t){let i=this.reportProgress(e);try{return t(e)}finally{i.stop()}}reportInfoOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportWarningOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportErrorOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportExceptionOnce(e){ove(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(X.EXCEPTION,e.stack||e.message,{key:e})}createStreamReporter(e=null){let t=new R4.PassThrough,i=new F4.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),t}};var yd=class{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){return await this.getFetcher(e,t).fetch(e,t)}tryFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));return i||null}getFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));if(!i)throw new ct(X.FETCHER_NOT_FOUND,`${It(t.project.configuration,e)} isn't supported by any available fetcher`);return i}};var wd=class{constructor(e){this.resolvers=e.filter(t=>t)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,t,i)}async getSatisfying(e,t,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,t,i)}async resolve(e,t){return await this.getResolverByLocator(e,t).resolve(e,t)}tryResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));return i||null}getResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));if(!i)throw new Error(`${sr(t.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));return i||null}getResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));if(!i)throw new Error(`${It(t.project.configuration,e)} isn't supported by any available resolver`);return i}};var N4=ge(ri());var zg=/^(?!v)[a-z0-9._-]+$/i,nk=class{supportsDescriptor(e,t){return!!(po(e.range)||zg.test(e.range))}supportsLocator(e,t){return!!(N4.default.valid(e.reference)||zg.test(e.reference))}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),t,i)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),t,i)}async getSatisfying(e,t,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),t,i)}async resolve(e,t){let i=await t.resolver.resolve(this.forwardLocator(e,t),t);return ld(i,e)}forwardDescriptor(e,t){return rr(e,`${t.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,t){return cn(e,`${t.project.configuration.get("defaultProtocol")}${e.reference}`)}};var Bd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n);return t.fetcher.getLocalPath(s,t)}async fetch(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n),o=await t.fetcher.fetch(s,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return Jg(e)}async ensureVirtualLink(e,t,i){let n=t.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Wr.makeVirtualPath(s,o,n),l=new Na(a,{baseFs:t.packageFs,pathUtils:k});return te(N({},t),{packageFs:l})}};var _g=class{static isVirtualDescriptor(e){return!!e.range.startsWith(_g.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(_g.protocol)}supportsDescriptor(e,t){return _g.isVirtualDescriptor(e)}supportsLocator(e,t){return _g.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,t,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,t,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},pw=_g;pw.protocol="virtual:";var bd=class{supports(e){return!!e.reference.startsWith(oi.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){let i=this.getWorkspace(e,t).cwd;return{packageFs:new _t(i),prefixPath:Me.dot,localPath:i}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(oi.protocol.length))}};var sk={};ft(sk,{getDefaultGlobalFolder:()=>ak,getHomeFolder:()=>Qd,isFolderInside:()=>Ak});var ok=ge(require("os"));function ak(){if(process.platform==="win32"){let r=H.toPortablePath(process.env.LOCALAPPDATA||H.join((0,ok.homedir)(),"AppData","Local"));return k.resolve(r,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let r=H.toPortablePath(process.env.XDG_DATA_HOME);return k.resolve(r,"yarn/berry")}return k.resolve(Qd(),".yarn/berry")}function Qd(){return H.toPortablePath((0,ok.homedir)()||"/usr/local/share")}function Ak(r,e){let t=k.relative(e,r);return t&&!t.startsWith("..")&&!k.isAbsolute(t)}var Vg={};ft(Vg,{builtinModules:()=>lk,getArchitecture:()=>Sd,getArchitectureName:()=>Ave,getArchitectureSet:()=>ck});var L4=ge(require("module"));function lk(){return new Set(L4.default.builtinModules||Object.keys(process.binding("natives")))}function ave(){var i,n,s,o;if(process.platform==="win32")return null;let e=(s=((n=(i=process.report)==null?void 0:i.getReport())!=null?n:{}).sharedObjects)!=null?s:[],t=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return(o=$p(e,a=>{let l=a.match(t);if(!l)return $p.skip;if(l[1])return"glibc";if(l[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")}))!=null?o:null}var dw,Cw;function Sd(){return dw=dw!=null?dw:{os:process.platform,cpu:process.arch,libc:ave()}}function Ave(r=Sd()){return r.libc?`${r.os}-${r.cpu}-${r.libc}`:`${r.os}-${r.cpu}`}function ck(){let r=Sd();return Cw=Cw!=null?Cw:{os:[r.os],cpu:[r.cpu],libc:r.libc?[r.libc]:[]}}var lve=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),Ew="yarn_",gk=".yarnrc.yml",fk="yarn.lock",cve="********",Ie;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(Ie||(Ie={}));var Ri=qe,hk={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:Ie.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:Ie.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:Ie.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:Ie.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:Ie.STRING,default:null},globalFolder:{description:"Folder where all system-global files are stored",type:Ie.ABSOLUTE_PATH,default:ak()},cacheFolder:{description:"Folder where the cache files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:Ie.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:lc},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:Ie.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:Ie.STRING,default:fk},installStatePath:{description:"Path of the file where the install state will be persisted",type:Ie.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:Ie.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:Ie.STRING,default:Iw()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:Ie.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:Ie.BOOLEAN,default:Py,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:Ie.BOOLEAN,default:Mv,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:Ie.BOOLEAN,default:mw.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:Ie.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:Ie.BOOLEAN,default:!mw.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:Ie.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:Ie.BOOLEAN,default:mw.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:Ie.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:Ie.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:Ie.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:Ie.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:Ie.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:Ie.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:Ie.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:Ie.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:Ie.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:Ie.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:Ie.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:Ie.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:Ie.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:Ie.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:Ie.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:Ie.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:Ie.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:Ie.STRING,values:Object.values(ho),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:Ie.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:Ie.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:Ie.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:Ie.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:Ie.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:Ie.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:Ie.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:Ie.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:Ie.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:Ie.MAP,valueDefinition:{description:"A range",type:Ie.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:Ie.MAP,valueDefinition:{description:"A semver range",type:Ie.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:Ie.MAP,valueDefinition:{description:"The peerDependency meta",type:Ie.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:Ie.BOOLEAN,default:!1}}}}}}}};function dk(r,e,t,i,n){if(i.isArray||i.type===Ie.ANY&&Array.isArray(t))return Array.isArray(t)?t.map((s,o)=>pk(r,`${e}[${o}]`,s,i,n)):String(t).split(/,/).map(s=>pk(r,e,s,i,n));if(Array.isArray(t))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return pk(r,e,t,i,n)}function pk(r,e,t,i,n){var a;switch(i.type){case Ie.ANY:return t;case Ie.SHAPE:return uve(r,e,t,i,n);case Ie.MAP:return gve(r,e,t,i,n)}if(t===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(t))return t;let o=(()=>{if(i.type===Ie.BOOLEAN&&typeof t!="string")return td(t);if(typeof t!="string")throw new Error(`Expected value (${t}) to be a string`);let l=Fv(t,{env:process.env});switch(i.type){case Ie.ABSOLUTE_PATH:return k.resolve(n,H.toPortablePath(l));case Ie.LOCATOR_LOOSE:return Yc(l,!1);case Ie.NUMBER:return parseInt(l);case Ie.LOCATOR:return Yc(l);case Ie.BOOLEAN:return td(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function uve(r,e,t,i,n){if(typeof t!="object"||Array.isArray(t))throw new Pe(`Object configuration settings "${e}" must be an object`);let s=Ck(r,i,{ignoreArrays:!0});if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=`${e}.${o}`;if(!i.properties[o])throw new Pe(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,dk(r,l,a,i.properties[o],n))}return s}function gve(r,e,t,i,n){let s=new Map;if(typeof t!="object"||Array.isArray(t))throw new Pe(`Map configuration settings "${e}" must be an object`);if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,dk(r,c,a,u,n))}return s}function Ck(r,e,{ignoreArrays:t=!1}={}){switch(e.type){case Ie.SHAPE:{if(e.isArray&&!t)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,Ck(r,s));return i}break;case Ie.MAP:return e.isArray&&!t?[]:new Map;case Ie.ABSOLUTE_PATH:return e.default===null?null:r.projectCwd===null?k.isAbsolute(e.default)?k.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>k.resolve(r.projectCwd,i)):k.resolve(r.projectCwd,e.default);default:return e.default}}function yw(r,e,t){if(e.type===Ie.SECRET&&typeof r=="string"&&t.hideSecrets)return cve;if(e.type===Ie.ABSOLUTE_PATH&&typeof r=="string"&&t.getNativePaths)return H.fromPortablePath(r);if(e.isArray&&Array.isArray(r)){let i=[];for(let n of r)i.push(yw(n,e,t));return i}if(e.type===Ie.MAP&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries())i.set(n,yw(s,e.valueDefinition,t));return i}if(e.type===Ie.SHAPE&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries()){let o=e.properties[n];i.set(n,yw(s,o,t))}return i}return r}function fve(){let r={};for(let[e,t]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(Ew)&&(e=(0,T4.default)(e.slice(Ew.length)),r[e]=t);return r}function Iw(){let r=`${Ew}rc_filename`;for(let[e,t]of Object.entries(process.env))if(e.toLowerCase()===r&&typeof t=="string")return t;return gk}var ul;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(ul||(ul={}));var tA=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,t,i){let n=new tA(e);typeof t!="undefined"&&!(t instanceof Map)&&(n.projectCwd=t),n.importSettings(hk);let s=typeof i!="undefined"?i:t instanceof Map?t:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,t,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=fve();delete a.rcFilename;let l=await tA.findRcFiles(e),c=await tA.findHomeRcFile();if(c){let b=l.find(v=>v.path===c.path);b?b.strict=!1:l.push(te(N({},c),{strict:!1}))}let u=({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T})=>({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}),g=Y=>{var $=Y,{ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}=$,q=Or($,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return q},f=new tA(e);f.importSettings(u(hk)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:b,cwd:v,data:x}of l)f.useWithSource(b,u(x),v,{strict:!1});if(s){let b=f.get("yarnPath"),v=f.get("ignorePath");if(b!==null&&!v)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await tA.findProjectCwd(e,h);break;case 1:p=await tA.findProjectCwd(e,null);break;case 2:K.existsSync(k.join(e,"package.json"))?p=k.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(hk));let m=new Map([["@@core",WW]]),y=b=>"default"in b?b.default:b;if(t!==null){for(let T of t.plugins.keys())m.set(T,y(t.modules.get(T)));let b=new Map;for(let T of lk())b.set(T,()=>Og(T));for(let[T,q]of t.modules)b.set(T,()=>q);let v=new Set,x=async(T,q)=>{let{factory:Y,name:$}=Og(T);if(v.has($))return;let _=new Map(b),ne=A=>{if(_.has(A))return _.get(A)();throw new Pe(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},ee=await Lg(async()=>y(await Y(ne)),A=>`${A} (when initializing ${$}, defined in ${q})`);b.set($,()=>ee),v.add($),m.set($,ee)};if(a.plugins)for(let T of a.plugins.split(";")){let q=k.resolve(e,H.toPortablePath(T));await x(q,"")}for(let{path:T,cwd:q,data:Y}of l)if(!!o&&!!Array.isArray(Y.plugins))for(let $ of Y.plugins){let _=typeof $!="string"?$.path:$,ne=k.resolve(q,H.toPortablePath(_));await x(ne,T)}}for(let[b,v]of m)f.activatePlugin(b,v);f.useWithSource("",g(a),e,{strict:n});for(let{path:b,cwd:v,data:x,strict:T}of l)f.useWithSource(b,g(x),v,{strict:T!=null?T:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let t=Iw(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=k.join(s,t);if(K.existsSync(o)){let a=await K.readFilePromise(o,"utf8"),l;try{l=Si(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new Pe(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=k.dirname(s)}return i}static async findHomeRcFile(){let e=Iw(),t=Qd(),i=k.join(t,e);if(K.existsSync(i)){let n=await K.readFilePromise(i,"utf8"),s=Si(n);return{path:i,cwd:t,data:s}}return null}static async findProjectCwd(e,t){let i=null,n=e,s=null;for(;n!==s;){if(s=n,K.existsSync(k.join(s,"package.json"))&&(i=s),t!==null){if(K.existsSync(k.join(s,t))){i=s;break}}else if(i!==null)break;n=k.dirname(s)}return i}static async updateConfiguration(e,t){let i=Iw(),n=k.join(e,i),s=K.existsSync(n)?Si(await K.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof t=="function"){try{a=t(s)}catch{a=t({})}if(a===s)return}else{a=s;for(let l of Object.keys(t)){let c=s[l],u=t[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await K.changeFilePromise(n,Ma(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let t=Qd();return await tA.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),typeof t.configuration!="undefined"&&this.importSettings(t.configuration)}importSettings(e){for(let[t,i]of Object.entries(e))if(i!=null){if(this.settings.has(t))throw new Error(`Cannot redefine settings "${t}"`);this.settings.set(t,i),this.values.set(t,Ck(this,i))}}useWithSource(e,t,i,n){try{this.use(e,t,i,n)}catch(s){throw s.message+=` (in ${tt(this,e,qe.PATH)})`,s}}use(e,t,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(t)]){if(typeof t[o]=="undefined"||o==="plugins"||e===""&&lve.has(o))continue;if(o==="rcFilename")throw new Pe(`The rcFilename settings can only be set via ${`${Ew}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new Pe(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===Ie.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=dk(this,o,t[o],l,i)}catch(u){throw u.message+=` in ${tt(this,e,qe.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===Ie.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new Pe(`Couldn't find a configuration settings named "${e}"`);return yw(n,s,{hideSecrets:t,getNativePaths:i})}getSubprocessStreams(e,{header:t,prefix:i,report:n}){let s,o,a=K.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${tt(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${tt(this,"STDERR","red")}`);s=new uk.PassThrough,s.pipe(l),s.pipe(a),o=new uk.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof t!="undefined"&&s.write(`${t} -`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let t of this.plugins.values())for(let i of t.resolvers||[])e.push(new i);return new wd([new pw,new oi,new nk,...e])}makeFetcher(){let e=[];for(let t of this.plugins.values())for(let i of t.fetchers||[])e.push(new i);return new yd([new Bd,new bd,...e])}getLinkers(){let e=[];for(let t of this.plugins.values())for(let i of t.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=Sd(),t=this.get("supportedArchitectures"),i=t.get("os");i!==null&&(i=i.map(o=>o==="current"?e.os:o));let n=t.get("cpu");n!==null&&(n=n.map(o=>o==="current"?e.cpu:o));let s=t.get("libc");return s!==null&&(s=zo(s,o=>{var a;return o==="current"?(a=e.libc)!=null?a:zo.skip:o})),{os:i,cpu:n,libc:s}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,t=(i,n,{userProvided:s=!1}={})=>{if(!po(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new At;o.load(n,{yamlCompatibilityMode:!0});let a=Fg(e,i.identHash),l=[];a.push([i.range,l]);let c={status:qi.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(te(N({},c),{type:wi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(te(N({},c),{type:wi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(te(N({},c),{type:wi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,t);for(let[i,n]of this.get("packageExtensions"))t(ll(i,!0),ky(n),{userProvided:!0})}normalizePackage(e){let t=cd(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!qc(s,o))for(let l of a)switch(l.status===qi.Inactive&&(l.status=qi.Redundant),l.type){case wi.Dependency:typeof t.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.dependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependency:typeof t.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependencyMeta:{let c=t.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=qi.Active,_a(t.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:Pv(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of t.peerDependenciesMeta.keys()){let o=An(s);t.peerDependencies.has(o.identHash)||t.peerDependencies.set(o.identHash,rr(o,"*"))}for(let s of t.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=$o("types",o),l=Ot(a);t.peerDependencies.has(a.identHash)||t.peerDependenciesMeta.has(l)||(t.peerDependencies.set(a.identHash,rr(a,"*")),t.peerDependenciesMeta.set(l,{optional:!0}))}return t.dependencies=new Map(kn(t.dependencies,([,s])=>Pn(s))),t.peerDependencies=new Map(kn(t.peerDependencies,([,s])=>Pn(s))),t}getLimit(e){return _a(this.limits,e,()=>(0,O4.default)(this.get(e)))}async triggerHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...t)}}async triggerMultipleHooks(e,t){for(let i of t)await this.triggerHook(e,...i)}async reduceHook(e,t,...i){let n=t;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...t);if(typeof o!="undefined")return o}return null}},ye=tA;ye.telemetry=null;var ss;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(ss||(ss={}));var ww=class extends ct{constructor({fileName:e,code:t,signal:i}){let n=ye.create(k.cwd()),s=tt(n,e,qe.PATH);super(X.EXCEPTION,`Child ${s} reported an error`,o=>{hve(t,i,{configuration:n,report:o})});this.code=Ek(t,i)}},Ik=class extends ww{constructor({fileName:e,code:t,signal:i,stdout:n,stderr:s}){super({fileName:e,code:t,signal:i});this.stdout=n,this.stderr=s}};function zc(r){return r!==null&&typeof r.fd=="number"}var _c=new Set;function yk(){}function wk(){for(let r of _c)r.kill()}async function ra(r,e,{cwd:t,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":zc(s)&&(c[0]=s),zc(o)&&(c[1]=o),zc(a)&&(c[2]=a);let u=(0,mk.default)(r,e,{cwd:H.fromPortablePath(t),env:te(N({},i),{PWD:H.fromPortablePath(t)}),stdio:c});_c.add(u),_c.size===1&&(process.on("SIGINT",yk),process.on("SIGTERM",wk)),!zc(s)&&s!==null&&s.pipe(u.stdin),zc(o)||u.stdout.pipe(o,{end:!1}),zc(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))zc(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,m)=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:Ek(p,m)}):h(new ww({fileName:r,code:p,signal:m}))})})}async function pve(r,e,{cwd:t,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=H.fromPortablePath(t);typeof i.PWD!="undefined"&&(i=te(N({},i),{PWD:c}));let u=(0,mk.default)(r,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",h=>{let p=ye.create(t),m=tt(p,r,qe.PATH);f(new ct(X.EXCEPTION,`Process ${m} failed to spawn`,y=>{y.reportError(X.EXCEPTION,` ${_o(p,{label:"Thrown Error",value:fo(qe.NO_HINT,h.message)})}`)}))}),u.on("close",(h,p)=>{let m=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),y=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:Ek(h,p),stdout:m,stderr:y}):f(new Ik({fileName:r,code:h,signal:p,stdout:m,stderr:y}))})})}var dve=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function Ek(r,e){let t=dve.get(e);return typeof t!="undefined"?128+t:r!=null?r:1}function hve(r,e,{configuration:t,report:i}){i.reportError(X.EXCEPTION,` ${_o(t,r!==null?{label:"Exit Code",value:fo(qe.NUMBER,r)}:{label:"Exit Signal",value:fo(qe.CODE,e)})}`)}var ir={};ft(ir,{Method:()=>Cl,RequestError:()=>w5.RequestError,del:()=>xPe,get:()=>SPe,getNetworkSettings:()=>S5,post:()=>HP,put:()=>vPe,request:()=>Od});var E5=ge(Uw()),I5=ge(require("https")),y5=ge(require("http")),MP=ge(is()),KP=ge(m5()),Hw=ge(require("url"));var w5=ge(Uw()),B5=new Map,b5=new Map,wPe=new y5.Agent({keepAlive:!0}),BPe=new I5.Agent({keepAlive:!0});function Q5(r){let e=new Hw.URL(r),t={host:e.hostname,headers:{}};return e.port&&(t.port=Number(e.port)),{proxy:t}}async function UP(r){return _a(b5,r,()=>K.readFilePromise(r).then(e=>(b5.set(r,e),e)))}function bPe({statusCode:r,statusMessage:e},t){let i=tt(t,r,qe.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${r}`;return Mg(t,`${i}${e?` (${e})`:""}`,n)}async function jw(r,{configuration:e,customErrorMessage:t}){var i,n;try{return await r}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=t==null?void 0:t(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof E5.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${tt(e,"httpTimeout",qe.SETTING)})`);let a=new ct(X.NETWORK_ERROR,o,l=>{s.response&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Response Code",value:fo(qe.NO_HINT,bPe(s.response,e))})}`),s.request&&(l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Method",value:fo(qe.NO_HINT,s.request.options.method)})}`),l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request URL",value:fo(qe.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Redirects",value:fo(qe.NO_HINT,Uv(e,s.request.redirects,qe.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Retry Count",value:fo(qe.NO_HINT,`${tt(e,s.request.retryCount,qe.NUMBER)} (can be increased via ${tt(e,"httpRetry",qe.SETTING)})`)})}`)});throw a.originalError=s,a}}function S5(r,e){let t=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},n=Object.keys(i),s=typeof r=="string"?new Hw.URL(r):r;for(let[o,a]of t)if(MP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var Cl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(Cl||(Cl={}));async function Od(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=async()=>await QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o});return await(await t.reduceHook(c=>c.wrapNetworkRequest,a,{target:r,body:e,configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o}))()}async function SPe(r,n){var s=n,{configuration:e,jsonResponse:t}=s,i=Or(s,["configuration","jsonResponse"]);let o=_a(B5,r,()=>jw(Od(r,null,N({configuration:e},i)),{configuration:e}).then(a=>(B5.set(r,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),t?JSON.parse(o.toString()):o}async function vPe(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.PUT})),i)).body}async function HP(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.POST})),i)).body}async function xPe(r,i){var n=i,{customErrorMessage:e}=n,t=Or(n,["customErrorMessage"]);return(await jw(Od(r,null,te(N({},t),{method:Cl.DELETE})),t)).body}async function QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=typeof r=="string"?new Hw.URL(r):r,l=S5(a,{configuration:t});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!MP.default.isMatch(a.hostname,t.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?KP.default.httpOverHttp(Q5(l.httpProxy)):wPe,https:l.httpsProxy?KP.default.httpsOverHttp(Q5(l.httpsProxy)):BPe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=t.get("httpTimeout"),f=t.get("httpRetry"),h=t.get("enableStrictSsl"),p=l.caFilePath,m=l.httpsCertFilePath,y=l.httpsKeyFilePath,{default:b}=await Promise.resolve().then(()=>ge(Uw())),v=p?await UP(p):void 0,x=m?await UP(m):void 0,T=y?await UP(y):void 0,q=b.extend(N({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:v,certificate:x,key:T}},u));return t.getLimit("networkConcurrency")(()=>q(a))}var Zt={};ft(Zt,{PackageManager:()=>hn,detectPackageManager:()=>K9,executePackageAccessibleBinary:()=>Y9,executePackageScript:()=>nB,executePackageShellcode:()=>rD,executeWorkspaceAccessibleBinary:()=>WDe,executeWorkspaceLifecycleScript:()=>G9,executeWorkspaceScript:()=>j9,getPackageAccessibleBinaries:()=>sB,getWorkspaceAccessibleBinaries:()=>H9,hasPackageScript:()=>YDe,hasWorkspaceScript:()=>tD,makeScriptEnv:()=>Yd,maybeExecuteWorkspaceLifecycleScript:()=>JDe,prepareExternalProject:()=>GDe});var Md={};ft(Md,{getLibzipPromise:()=>fn,getLibzipSync:()=>D5});var P5=ge(x5());var ml=["number","number"],YP;(function(L){L[L.ZIP_ER_OK=0]="ZIP_ER_OK",L[L.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",L[L.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",L[L.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",L[L.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",L[L.ZIP_ER_READ=5]="ZIP_ER_READ",L[L.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",L[L.ZIP_ER_CRC=7]="ZIP_ER_CRC",L[L.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",L[L.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",L[L.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",L[L.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",L[L.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",L[L.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",L[L.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",L[L.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",L[L.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",L[L.ZIP_ER_EOF=17]="ZIP_ER_EOF",L[L.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",L[L.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",L[L.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",L[L.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",L[L.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",L[L.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",L[L.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",L[L.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",L[L.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",L[L.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",L[L.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",L[L.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",L[L.ZIP_ER_TELL=30]="ZIP_ER_TELL",L[L.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(YP||(YP={}));var k5=r=>({get HEAP8(){return r.HEAP8},get HEAPU8(){return r.HEAPU8},errors:YP,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:r._malloc(1),uint16S:r._malloc(2),uint32S:r._malloc(4),uint64S:r._malloc(8),malloc:r._malloc,free:r._free,getValue:r.getValue,open:r.cwrap("zip_open","number",["string","number","number"]),openFromSource:r.cwrap("zip_open_from_source","number",["number","number","number"]),close:r.cwrap("zip_close","number",["number"]),discard:r.cwrap("zip_discard",null,["number"]),getError:r.cwrap("zip_get_error","number",["number"]),getName:r.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:r.cwrap("zip_get_num_entries","number",["number","number"]),delete:r.cwrap("zip_delete","number",["number","number"]),stat:r.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:r.cwrap("zip_stat_index","number",["number",...ml,"number","number"]),fopen:r.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:r.cwrap("zip_fopen_index","number",["number",...ml,"number"]),fread:r.cwrap("zip_fread","number",["number","number","number","number"]),fclose:r.cwrap("zip_fclose","number",["number"]),dir:{add:r.cwrap("zip_dir_add","number",["number","string"])},file:{add:r.cwrap("zip_file_add","number",["number","string","number","number"]),getError:r.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:r.cwrap("zip_file_get_external_attributes","number",["number",...ml,"number","number","number"]),setExternalAttributes:r.cwrap("zip_file_set_external_attributes","number",["number",...ml,"number","number","number"]),setMtime:r.cwrap("zip_file_set_mtime","number",["number",...ml,"number","number"]),setCompression:r.cwrap("zip_set_file_compression","number",["number",...ml,"number","number"])},ext:{countSymlinks:r.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:r.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:r.cwrap("zip_error_strerror","string",["number"])},name:{locate:r.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:r.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:r.cwrap("zip_source_buffer","number",["number","number",...ml,"number"]),free:r.cwrap("zip_source_free",null,["number"]),keep:r.cwrap("zip_source_keep",null,["number"]),open:r.cwrap("zip_source_open","number",["number"]),close:r.cwrap("zip_source_close","number",["number"]),seek:r.cwrap("zip_source_seek","number",["number",...ml,"number"]),tell:r.cwrap("zip_source_tell","number",["number"]),read:r.cwrap("zip_source_read","number",["number","number","number"]),error:r.cwrap("zip_source_error","number",["number"]),setMtime:r.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:r.cwrap("zipstruct_stat","number",[]),statS:r.cwrap("zipstruct_statS","number",[]),statName:r.cwrap("zipstruct_stat_name","string",["number"]),statIndex:r.cwrap("zipstruct_stat_index","number",["number"]),statSize:r.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:r.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:r.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:r.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:r.cwrap("zipstruct_stat_crc","number",["number"]),error:r.cwrap("zipstruct_error","number",[]),errorS:r.cwrap("zipstruct_errorS","number",[]),errorCodeZip:r.cwrap("zipstruct_error_code_zip","number",["number"])}});var qP=null;function D5(){return qP===null&&(qP=k5((0,P5.default)())),qP}async function fn(){return D5()}var Ud={};ft(Ud,{ShellError:()=>Ms,execute:()=>Xw,globUtils:()=>Yw});var G5=ge(uv()),Y5=ge(require("os")),os=ge(require("stream")),q5=ge(require("util"));var Ms=class extends Error{constructor(e){super(e);this.name="ShellError"}};var Yw={};ft(Yw,{fastGlobOptions:()=>N5,isBraceExpansion:()=>L5,isGlobPattern:()=>kPe,match:()=>PPe,micromatchOptions:()=>Jw});var R5=ge(Zy()),F5=ge(require("fs")),qw=ge(is()),Jw={strictBrackets:!0},N5={onlyDirectories:!1,onlyFiles:!1};function kPe(r){if(!qw.default.scan(r,Jw).isGlob)return!1;try{qw.default.parse(r,Jw)}catch{return!1}return!0}function PPe(r,{cwd:e,baseFs:t}){return(0,R5.default)(r,te(N({},N5),{cwd:H.fromPortablePath(e),fs:WE(F5.default,new Vh(t))}))}function L5(r){return qw.default.scan(r,Jw).isBrace}var T5=ge(SQ()),na=ge(require("stream")),O5=ge(require("string_decoder")),Fn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(Fn||(Fn={}));var Xc=new Set;function JP(){}function WP(){for(let r of Xc)r.kill()}function M5(r,e,t,i){return n=>{let s=n[0]instanceof na.Transform?"pipe":n[0],o=n[1]instanceof na.Transform?"pipe":n[1],a=n[2]instanceof na.Transform?"pipe":n[2],l=(0,T5.default)(r,e,te(N({},i),{stdio:[s,o,a]}));return Xc.add(l),Xc.size===1&&(process.on("SIGINT",JP),process.on("SIGTERM",WP)),n[0]instanceof na.Transform&&n[0].pipe(l.stdin),n[1]instanceof na.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof na.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),u.code){case"ENOENT":n[2].write(`command not found: ${r} -`),c(127);break;case"EACCES":n[2].write(`permission denied: ${r} -`),c(128);break;default:n[2].write(`uncaught error: ${u.message} -`),c(1);break}}),l.on("close",u=>{Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),c(u!==null?u:129)})})}}}function K5(r){return e=>{let t=e[0]==="pipe"?new na.PassThrough:e[0];return{stdin:t,promise:Promise.resolve().then(()=>r({stdin:t,stdout:e[1],stderr:e[2]}))}}}var mo=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},U5=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Kd=class{constructor(e,t){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:i,stderr:n}){let s=new Kd(null,e);return s.stdin=t,s.stdout=i,s.stderr=n,s}pipeTo(e,t=1){let i=new Kd(this,e),n=new U5;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(t&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(t&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let t;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");t=this.stdout,e[1]=t.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(t.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function Ww(r,e){return Kd.start(r,e)}function H5(r,e=null){let t=new na.PassThrough,i=new O5.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",r(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&r(e!==null?`${e} ${s}`:s)}),t}function j5(r,{prefix:e}){return{stdout:H5(t=>r.stdout.write(`${t} -`),r.stdout.isTTY?e:null),stderr:H5(t=>r.stderr.write(`${t} -`),r.stderr.isTTY?e:null)}}var DPe=(0,q5.promisify)(setTimeout);var zi;(function(t){t[t.Readable=1]="Readable",t[t.Writable=2]="Writable"})(zi||(zi={}));function J5(r,e,t){let i=new os.PassThrough({autoDestroy:!0});switch(r){case Fn.STDIN:(e&1)==1&&t.stdin.pipe(i,{end:!1}),(e&2)==2&&t.stdin instanceof os.Writable&&i.pipe(t.stdin,{end:!1});break;case Fn.STDOUT:(e&1)==1&&t.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stdout,{end:!1});break;case Fn.STDERR:(e&1)==1&&t.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stderr,{end:!1});break;default:throw new Ms(`Bad file descriptor: "${r}"`)}return i}function zw(r,e={}){let t=N(N({},r),e);return t.environment=N(N({},r.environment),e.environment),t.variables=N(N({},r.variables),e.variables),t}var RPe=new Map([["cd",async([r=(0,Y5.homedir)(),...e],t,i)=>{let n=k.resolve(i.cwd,H.toPortablePath(r));if(!(await t.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new Ms(`cd: no such file or directory: ${r}`):o})).isDirectory())throw new Ms(`cd: not a directory: ${r}`);return i.cwd=n,0}],["pwd",async(r,e,t)=>(t.stdout.write(`${H.fromPortablePath(t.cwd)} -`),0)],[":",async(r,e,t)=>0],["true",async(r,e,t)=>0],["false",async(r,e,t)=>1],["exit",async([r,...e],t,i)=>i.exitCode=parseInt(r!=null?r:i.variables["?"],10)],["echo",async(r,e,t)=>(t.stdout.write(`${r.join(" ")} -`),0)],["sleep",async([r],e,t)=>{if(typeof r=="undefined")throw new Ms("sleep: missing operand");let i=Number(r);if(Number.isNaN(i))throw new Ms(`sleep: invalid time interval '${r}'`);return await DPe(1e3*i,0)}],["__ysh_run_procedure",async(r,e,t)=>{let i=t.procedures[r[0]];return await Ww(i,{stdin:new mo(t.stdin),stdout:new mo(t.stdout),stderr:new mo(t.stderr)}).run()}],["__ysh_set_redirects",async(r,e,t)=>{let i=t.stdin,n=t.stdout,s=t.stderr,o=[],a=[],l=[],c=0;for(;r[c]!=="--";){let g=r[c++],{type:f,fd:h}=JSON.parse(g),p=v=>{switch(h){case null:case 0:o.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=v=>{switch(h){case null:case 1:a.push(v);break;case 2:l.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},y=Number(r[c++]),b=c+y;for(let v=c;ve.baseFs.createReadStream(k.resolve(t.cwd,H.toPortablePath(r[v]))));break;case"<<<":p(()=>{let x=new os.PassThrough;return process.nextTick(()=>{x.write(`${r[v]} -`),x.end()}),x});break;case"<&":p(()=>J5(Number(r[v]),1,t));break;case">":case">>":{let x=k.resolve(t.cwd,H.toPortablePath(r[v]));m(x==="/dev/null"?new os.Writable({autoDestroy:!0,emitClose:!0,write(T,q,Y){setImmediate(Y)}}):e.baseFs.createWriteStream(x,f===">>"?{flags:"a"}:void 0))}break;case">&":m(J5(Number(r[v]),2,t));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new os.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new os.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new os.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await Ww(Hd(r.slice(c+1),e,t),{stdin:new mo(i),stdout:new mo(n),stderr:new mo(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function FPe(r,e,t){let i=[],n=new os.PassThrough;return n.on("data",s=>i.push(s)),await _w(r,e,zw(t,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function W5(r,e,t){let i=r.map(async s=>{let o=await aA(s.args,e,t);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function Vw(r){return r.match(/[^ \r\n\t]+/g)||[]}async function z5(r,e,t,i,n=i){switch(r.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(r.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=Vw(s);for(let a=0;a=0&&sr+e,subtraction:(r,e)=>r-e,multiplication:(r,e)=>r*e,division:(r,e)=>Math.trunc(r/e)};async function jd(r,e,t){if(r.type==="number"){if(Number.isInteger(r.value))return r.value;throw new Error(`Invalid number: "${r.value}", only integers are allowed`)}else if(r.type==="variable"){let i=[];await z5(te(N({},r),{quoted:!0}),e,t,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?jd({type:"variable",name:i.join(" ")},e,t):jd({type:"number",value:n},e,t)}else return NPe[r.type](await jd(r.left,e,t),await jd(r.right,e,t))}async function aA(r,e,t){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of r){let g=!1;switch(u.type){case"redirection":{let f=await aA(u.args,e,t);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await FPe(f.shell,e,t);if(f.quoted)o(h);else{let p=Vw(h);for(let m=0;m0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Hd(r,e,t){e.builtins.has(r[0])||(r=["command",...r]);let i=H.fromPortablePath(t.cwd),n=t.environment;typeof n.PWD!="undefined"&&(n=te(N({},n),{PWD:i}));let[s,...o]=r;if(s==="command")return M5(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return K5(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=t;t.stdin=l,t.stdout=c,t.stderr=u;try{return await a(o,e,t)}finally{t.stdin=g,t.stdout=f,t.stderr=h}})}function LPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,zw(t,{stdin:n}));return{stdin:n,promise:s}}}function TPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,t);return{stdin:n,promise:s}}}function _5(r,e,t,i){if(e.length===0)return r;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=N({},i.procedures),i.procedures[n]=r,Hd([...e,"__ysh_run_procedure",n],t,i)}}async function V5(r,e,t){let i=r,n=null,s=null;for(;i;){let o=i.then?N({},t):t,a;switch(i.type){case"command":{let l=await aA(i.args,e,t),c=await W5(i.envs,e,t);a=i.envs.length?Hd(l,e,zw(o,{environment:c})):Hd(l,e,o)}break;case"subshell":{let l=await aA(i.args,e,t),c=LPe(i.subshell,e,o);a=_5(c,l,e,o)}break;case"group":{let l=await aA(i.args,e,t),c=TPe(i.group,e,o);a=_5(c,l,e,o)}break;case"envs":{let l=await W5(i.envs,e,t);o.environment=N(N({},o.environment),l),a=Hd(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=Ww(a,{stdin:new mo(o.stdin),stdout:new mo(o.stdout),stderr:new mo(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,Fn.STDOUT);break;case"|&":s=s.pipeTo(a,Fn.STDOUT|Fn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function OPe(r,e,t,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return G5.default.hex(a)}if(i){let s=t.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=j5(t,{prefix:l});return t.backgroundJobs.push(V5(r,e,zw(t,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} -`)).finally(()=>{t.stdout.isTTY&&t.stdout.write(`Job ${l}, '${o(eg(r))}' has ended -`)})),0}return await V5(r,e,t)}async function MPe(r,e,t,{background:i=!1}={}){let n,s=a=>{n=a,t.variables["?"]=String(a)},o=async a=>{try{return await OPe(a.chain,e,t,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof Ms))throw l;return t.stderr.write(`${l.message} -`),1}};for(s(await o(r));r.then;){if(t.exitCode!==null)return t.exitCode;switch(r.then.type){case"&&":n===0&&s(await o(r.then.line));break;case"||":n!==0&&s(await o(r.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${r.then.type}"`)}r=r.then.line}return n}async function _w(r,e,t){let i=t.backgroundJobs;t.backgroundJobs=[];let n=0;for(let{command:s,type:o}of r){if(n=await MPe(s,e,t,{background:o==="&"}),t.exitCode!==null)return t.exitCode;t.variables["?"]=String(n)}return await Promise.all(t.backgroundJobs),t.backgroundJobs=i,n}function X5(r){switch(r.type){case"variable":return r.name==="@"||r.name==="#"||r.name==="*"||Number.isFinite(parseInt(r.name,10))||"defaultValue"in r&&!!r.defaultValue&&r.defaultValue.some(e=>Gd(e))||"alternativeValue"in r&&!!r.alternativeValue&&r.alternativeValue.some(e=>Gd(e));case"arithmetic":return zP(r.arithmetic);case"shell":return _P(r.shell);default:return!1}}function Gd(r){switch(r.type){case"redirection":return r.args.some(e=>Gd(e));case"argument":return r.segments.some(e=>X5(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${r.type}"`)}}function zP(r){switch(r.type){case"variable":return X5(r);case"number":return!1;default:return zP(r.left)||zP(r.right)}}function _P(r){return r.some(({command:e})=>{for(;e;){let t=e.chain;for(;t;){let i;switch(t.type){case"subshell":i=_P(t.subshell);break;case"command":i=t.envs.some(n=>n.args.some(s=>Gd(s)))||t.args.some(n=>Gd(n));break}if(i)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Xw(r,e=[],{baseFs:t=new ar,builtins:i={},cwd:n=H.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=Yw}={}){let g={};for(let[p,m]of Object.entries(s))typeof m!="undefined"&&(g[p]=m);let f=new Map(RPe);for(let[p,m]of Object.entries(i))f.set(p,m);o===null&&(o=new os.PassThrough,o.end());let h=_E(r,u);if(!_P(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let m=p.chain;for(;m.then;)m=m.then.chain;m.type==="command"&&(m.args=m.args.concat(e.map(y=>({type:"argument",segments:[{type:"text",text:y}]}))))}return await _w(h,{args:e,baseFs:t,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var O9=ge(Zw()),M9=ge(gg()),El=ge(require("stream"));var R9=ge(D9()),tB=ge(Ic());var F9=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],N9=80,TDe=new Set([X.FETCH_NOT_CACHED,X.UNUSED_CACHE_ENTRY]),ODe=5,rB=tB.default.GITHUB_ACTIONS?{start:r=>`::group::${r} -`,end:r=>`::endgroup:: -`}:tB.default.TRAVIS?{start:r=>`travis_fold:start:${r} -`,end:r=>`travis_fold:end:${r} -`}:tB.default.GITLAB?{start:r=>`section_start:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${r} -`,end:r=>`section_end:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}\r`}:null,L9=new Date,MDe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,KDe=r=>r,iB=KDe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),UDe=MDe&&Object.keys(iB).find(r=>{let e=iB[r];return!(e.date&&(e.date[0]!==L9.getDate()||e.date[1]!==L9.getMonth()+1))})||"default";function T9(r,{configuration:e,json:t}){if(!e.get("enableMessageNames"))return"";let n=_A(r===null?0:r);return!t&&r===null?tt(e,n,"grey"):n}function eD(r,{configuration:e,json:t}){let i=T9(r,{configuration:e,json:t});if(!i||r===null||r===X.UNNAMED)return i;let n=X[r],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Mg(e,i,s)}var Je=class extends Ji{constructor({configuration:e,stdout:t,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=ODe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(nd(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...TDe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=t,e.get("enableProgressBars")&&!i&&t.isTTY&&t.columns>22){let u=e.get("progressBarStyle")||UDe;if(!Object.prototype.hasOwnProperty.call(iB,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=iB[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(t.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}}static async start(e,t){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(X.UNNAMED,a)};try{await t(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,t){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof t!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(X.FETCH_NOT_CACHED,t)}startSectionSync({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}async startSectionPromise({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return await n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}startTimerImpl(e,t,i){let n=typeof t=="function"?{}:t;return{cb:typeof t=="function"?t:i,reportHeader:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.start(e))},reportFooter:o=>{this.indent-=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.end(e)),this.configuration.get("enableTimers")&&o>200?this.reportInfo(null,`\u2514 Completed in ${tt(this.configuration,o,qe.DURATION)}`):this.reportInfo(null,"\u2514 Completed")},skipIfEmpty:n.skipIfEmpty}}startTimerSync(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionSync(s,n)}async startTimerPromise(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionPromise(s,n)}async startCacheReport(e){let t=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{t!==null&&this.reportCacheChanges(t)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,t){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${tt(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${t}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,t){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${t}`)}reportError(e,t){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${t}`,{truncate:!1})}reportProgress(e){if(this.progressStyle===null)return te(N({},Promise.resolve()),{stop:()=>{}});if(e.hasProgress&&e.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let t=!1,i=Promise.resolve().then(async()=>{let s={progress:e.hasProgress?0:void 0,title:e.hasTitle?"":void 0};this.progress.set(e,{definition:s,lastScaledSize:e.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:o,title:a}of e)t||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{t||(t=!0,this.progress.delete(e),this.refreshProgress({delta:1}))};return te(N({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let t=tt(this.configuration,Date.now()-this.startTime,qe.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${t}`:e;this.errorCount>0?this.reportError(X.UNNAMED,i):this.warningCount>0?this.reportWarning(X.UNNAMED,i):this.reportInfo(X.UNNAMED,i)}writeLine(e,{truncate:t}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:t})} -`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:t}={}){this.forgettableLines=[],this.writeLine(e,{truncate:t})}writeLines(e,{truncate:t}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:t})} -`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:t}){let i=this.cacheHitCount-e,n=this.cacheMissCount-t;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${It(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${It(this.configuration,this.lastCacheMiss)})`),this.reportInfo(X.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let t of e)t.committed=!0,t.action()}clearProgress({delta:e=0,clear:t=!1}){this.progressStyle!==null&&this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||t)&&this.stdout.write(""))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>N9&&(this.progressFrame=(this.progressFrame+1)%F9.length,this.progressTime=e);let t=F9[this.progressFrame];for(let i of this.progress.values()){let n="";if(typeof i.lastScaledSize!="undefined"){let l=this.progressStyle.chars[0].repeat(i.lastScaledSize),c=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize);n=` ${l}${c}`}let s=this.formatName(null),o=s?`${s}: `:"",a=i.definition.title?` ${i.definition.title}`:"";this.stdout.write(`${tt(this.configuration,"\u27A4","blueBright")} ${o}${t}${n}${a} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},N9)}refreshProgress({delta:e=0,force:t=!1}={}){let i=!1,n=!1;if(t||this.progress.size===0)i=!0;else for(let s of this.progress.values()){let o=typeof s.definition.progress!="undefined"?Math.trunc(this.progressMaxScaledSize*s.definition.progress):void 0,a=s.lastScaledSize;s.lastScaledSize=o;let l=s.lastTitle;if(s.lastTitle=s.definition.title,o!==a||(n=l!==s.definition.title)){i=!0;break}}i&&(this.clearProgress({delta:e,clear:n}),this.writeProgress())}truncate(e,{truncate:t}={}){return this.progressStyle===null&&(t=!1),typeof t=="undefined"&&(t=this.configuration.get("preferTruncatedLines")),t&&(e=(0,R9.default)(e,0,this.stdout.columns-1)),e}formatName(e){return T9(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Ur="3.2.2";var hn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(hn||(hn={}));async function AA(r,e,t,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${t}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await K.writeFilePromise(k.format({dir:r,name:e,ext:".cmd"}),n)}await K.writeFilePromise(k.join(r,e),`#!/bin/sh -exec "${t}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function K9(r){let e=await At.tryFind(r);if(e==null?void 0:e.packageManager){let i=lw(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?hn.Yarn1:hn.Yarn2,reason:n};case"npm":return{packageManager:hn.Npm,reason:n};case"pnpm":return{packageManager:hn.Pnpm,reason:n}}}}let t;try{t=await K.readFilePromise(k.join(r,kt.lockfile),"utf8")}catch{}return t!==void 0?t.match(/^__metadata:$/m)?{packageManager:hn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:hn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:K.existsSync(k.join(r,"package-lock.json"))?{packageManager:hn.Npm,reason:`found npm's "package-lock.json" lockfile`}:K.existsSync(k.join(r,"pnpm-lock.yaml"))?{packageManager:hn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Yd({project:r,locator:e,binFolder:t,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=H.fromPortablePath(t);n.BERRY_BIN_FOLDER=H.fromPortablePath(s);let o=process.env.COREPACK_ROOT?H.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([AA(t,"node",process.execPath),...Ur!==null?[AA(t,"run",process.execPath,[o,"run"]),AA(t,"yarn",process.execPath,[o]),AA(t,"yarnpkg",process.execPath,[o]),AA(t,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),r&&(n.INIT_CWD=H.fromPortablePath(r.configuration.startingCwd),n.PROJECT_CWD=H.fromPortablePath(r.cwd)),n.PATH=n.PATH?`${s}${H.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${H.sep}yarn`,n.npm_node_execpath=`${s}${H.sep}node`,e){if(!r)throw new Error("Assertion failed: Missing project");let u=r.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=r.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=Ot(e),n.npm_package_version=g;let f;if(u)f=u.cwd;else{let h=r.storedPackages.get(e.locatorHash);if(!h)throw new Error(`Package for ${It(r.configuration,e)} not found in the project`);let p=r.configuration.getLinkers(),m={project:r,report:new Je({stdout:new El.PassThrough,configuration:r.configuration})},y=p.find(b=>b.supportsPackage(h,m));if(!y)throw new Error(`The package ${It(r.configuration,h)} isn't supported by any of the available linkers`);f=await y.findPackageLocation(h,m)}n.npm_package_json=H.fromPortablePath(k.join(f,kt.manifest))}let a=Ur!==null?`yarn/${Ur}`:`yarn/${Og("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.version} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),r&&await r.configuration.triggerHook(u=>u.setupScriptEnvironment,r,n,async(u,g,f)=>await AA(t,Jr(u),g,f)),n}var HDe=2,jDe=(0,M9.default)(HDe);async function GDe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await jDe(async()=>{await K.mktempPromise(async o=>{let a=k.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=t.getSubprocessStreams(a,{prefix:H.fromPortablePath(r),report:i}),g=s&&ea(s)?gd(s):s,f=g?Rs(g):"an external project";c.write(`Packing ${f} from sources -`);let h=await K9(r),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} - -`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn - -`),p=hn.Yarn2),await K.mktempPromise(async m=>{let y=await Yd({binFolder:m}),v=new Map([[hn.Yarn1,async()=>{let T=n!==null?["workspace",n]:[],q=await ra("yarn",["set","version","classic","--only-if-needed"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;await K.appendFilePromise(k.join(r,".npmignore"),`/.yarn -`),c.write(` -`),delete y.NODE_ENV;let Y=await ra("yarn",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(Y.code!==0)return Y.code;c.write(` -`);let $=await ra("yarn",[...T,"pack","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return $.code!==0?$.code:0}],[hn.Yarn2,async()=>{let T=n!==null?["workspace",n]:[];y.YARN_ENABLE_INLINE_BUILDS="1";let q=k.join(r,kt.lockfile);await K.existsPromise(q)||await K.writeFilePromise(q,"");let Y=await ra("yarn",[...T,"pack","--install-if-needed","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return Y.code!==0?Y.code:0}],[hn.Npm,async()=>{if(n!==null){let A=new El.PassThrough,oe=Tg(A);A.pipe(c,{end:!1});let ce=await ra("npm",["--version"],{cwd:r,env:y,stdin:l,stdout:A,stderr:u,end:ss.Never});if(A.end(),ce.code!==0)return c.end(),u.end(),ce.code;let Z=(await oe).toString().trim();if(!qc(Z,">=7.x")){let O=$o(null,"npm"),L=rr(O,Z),de=rr(O,">=7.x");throw new Error(`Workspaces aren't supported by ${sr(t,L)}; please upgrade to ${sr(t,de)} (npm has been detected as the primary package manager for ${tt(t,r,qe.PATH)})`)}}let T=n!==null?["--workspace",n]:[];delete y.npm_config_user_agent,delete y.npm_config_production,delete y.NPM_CONFIG_PRODUCTION,delete y.NODE_ENV;let q=await ra("npm",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;let Y=new El.PassThrough,$=Tg(Y);Y.pipe(c);let _=await ra("npm",["pack","--silent",...T],{cwd:r,env:y,stdin:l,stdout:Y,stderr:u});if(_.code!==0)return _.code;let ne=(await $).toString().trim().replace(/^.*\n/s,""),ee=k.resolve(r,H.toPortablePath(ne));return await K.renamePromise(ee,e),0}]]).get(p);if(typeof v=="undefined")throw new Error("Assertion failed: Unsupported workflow");let x=await v();if(!(x===0||typeof x=="undefined"))throw K.detachTemp(o),new ct(X.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${x}, logs can be found here: ${tt(t,a,qe.PATH)})`)})})})}async function YDe(r,e,{project:t}){let i=t.tryWorkspaceByLocator(r);if(i!==null)return tD(i,e);let n=t.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t.configuration,r)} not found in the project`);return await Is.openPromise(async s=>{let o=t.configuration,a=t.configuration.getLinkers(),l={project:t,report:new Je({stdout:new El.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${It(t.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new _t(u,{baseFs:s});return(await At.find(Me.dot,{baseFs:g})).scripts.has(e)},{libzip:await fn()})}async function nB(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await U9(r,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await Xw(f,t,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(m=>m.wrapScriptExecution,h,n,r,e,{script:f,args:t,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function rD(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{env:c,cwd:u}=await U9(r,{project:n,binFolder:l,cwd:i});return await Xw(e,t,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function qDe(r,{binFolder:e,cwd:t,lifecycleScript:i}){let n=await Yd({project:r.project,locator:r.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await H9(r),([s,[,o]])=>AA(e,Jr(s),process.execPath,[o]))),typeof t=="undefined"&&(t=k.dirname(await K.realpathPromise(k.join(r.cwd,"package.json")))),{manifest:r.manifest,binFolder:e,env:n,cwd:t}}async function U9(r,{project:e,binFolder:t,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(r);if(s!==null)return qDe(s,{binFolder:t,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(r.locatorHash);if(!o)throw new Error(`Package for ${It(e.configuration,r)} not found in the project`);return await Is.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Je({stdout:new El.PassThrough,configuration:l})},g=c.find(y=>y.supportsPackage(o,u));if(!g)throw new Error(`The package ${It(e.configuration,o)} isn't supported by any of the available linkers`);let f=await Yd({project:e,locator:r,binFolder:t,lifecycleScript:n});await Promise.all(Array.from(await sB(r,{project:e}),([y,[,b]])=>AA(t,Jr(y),process.execPath,[b])));let h=await g.findPackageLocation(o,u),p=new _t(h,{baseFs:a}),m=await At.find(Me.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:m,binFolder:t,env:f,cwd:i}},{libzip:await fn()})}async function j9(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o}){return await nB(r.anchoredLocator,e,t,{cwd:i,project:r.project,stdin:n,stdout:s,stderr:o})}function tD(r,e){return r.manifest.scripts.has(e)}async function G9(r,e,{cwd:t,report:i}){let{configuration:n}=r.project,s=null;await K.mktempPromise(async o=>{let a=k.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${H.fromPortablePath(r.cwd)}") -`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:It(n,r.anchoredLocator),header:l});i.reportInfo(X.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await j9(r,e,[],{cwd:t,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw K.detachTemp(o),new ct(X.LIFECYCLE_SCRIPT,`${(0,O9.default)(e)} script failed (exit code ${tt(n,g,qe.NUMBER)}, logs can be found here: ${tt(n,a,qe.PATH)}); run ${tt(n,`yarn ${e}`,qe.CODE)} to investigate`)})}async function JDe(r,e,t){tD(r,e)&&await G9(r,e,t)}async function sB(r,{project:e}){let t=e.configuration,i=new Map,n=e.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t,r)} not found in the project`);let s=new El.Writable,o=t.getLinkers(),a={project:e,report:new Je({configuration:t,stdout:s})},l=new Set([r.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${sr(t,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return zo.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return zo.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return zo.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===zo.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,H.fromPortablePath(k.resolve(f,p))])}return i}async function H9(r){return await sB(r.anchoredLocator,{project:r.project})}async function Y9(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await sB(r,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${It(n.configuration,r)}`);return await K.mktempPromise(async g=>{let[,f]=u,h=await Yd({project:n,locator:r,binFolder:g});await Promise.all(Array.from(c,([m,[,y]])=>AA(h.BERRY_BIN_FOLDER,Jr(m),process.execPath,[y])));let p;try{p=await ra(process.execPath,[...l,f,...t],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await K.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function WDe(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await Y9(r.anchoredLocator,e,t,{project:r.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Bi={};ft(Bi,{convertToZip:()=>iNe,extractArchiveTo:()=>sNe,makeArchiveFromDirectory:()=>rNe});var T6=ge(require("stream")),O6=ge(P6());var D6=ge(require("os")),R6=ge(gg()),F6=ge(require("worker_threads")),Dl=Symbol("kTaskInfo"),pR=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,R6.default)(Math.max(1,(0,D6.cpus)().length));this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let t=this.workers.pop();t?t.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new F6.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",t=>{if(!e[Dl])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[Dl].resolve(t),e[Dl]=null,e.unref(),this.workers.push(e)}),e.on("error",t=>{var i;(i=e[Dl])==null||i.reject(t),e[Dl]=null}),e.on("exit",t=>{var i;t!==0&&((i=e[Dl])==null||i.reject(new Error(`Worker exited with code ${t}`))),e[Dl]=null}),e}run(e){return this.limit(()=>{var i;let t=(i=this.workers.pop())!=null?i:this.createWorker();return t.ref(),new Promise((n,s)=>{t[Dl]={resolve:n,reject:s},t.postMessage(e)})})}};var M6=ge(L6());async function rNe(r,{baseFs:e=new ar,prefixPath:t=Me.root,compressionLevel:i,inMemory:n=!1}={}){let s=await fn(),o;if(n)o=new li(null,{libzip:s,level:i});else{let l=await K.mktempPromise(),c=k.join(l,"archive.zip");o=new li(c,{create:!0,libzip:s,level:i})}let a=k.resolve(Me.root,t);return await o.copyPromise(a,r,{baseFs:e,stableTime:!0,stableSort:!0}),o}var K6;async function iNe(r,e){let t=await K.mktempPromise(),i=k.join(t,"archive.zip");return K6||(K6=new pR((0,M6.getContent)())),await K6.run({tmpFile:i,tgz:r,opts:e}),new li(i,{libzip:await fn(),level:e.compressionLevel})}async function*nNe(r){let e=new O6.default.Parse,t=new T6.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{t.write(i)}),e.on("error",i=>{t.destroy(i)}),e.on("close",()=>{t.destroyed||t.end()}),e.end(r);for await(let i of t){let n=i;yield n,n.resume()}}async function sNe(r,e,{stripComponents:t=0,prefixPath:i=Me.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=t)}for await(let a of nNe(r)){if(n(a))continue;let l=k.normalize(H.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=t)continue;let c=l.slice(t).join("/"),u=k.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.writeFileSync(u,await Tg(a),{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,Rr.SAFE_TIME,Rr.SAFE_TIME);break}}return e}var ls={};ft(ls,{emitList:()=>oNe,emitTree:()=>q6,treeNodeToJson:()=>Y6,treeNodeToTreeify:()=>G6});var j6=ge(H6());function G6(r,{configuration:e}){let t={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Ry(e,l,Tc.BOLD)),typeof c!="undefined"&&g.push(tt(e,c[0],c[1])),g.length===0&&g.push(Ry(e,`${a}`,Tc.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof r.children=="undefined")throw new Error("The root node must only contain children");return i(r.children,t),t}function Y6(r){let e=t=>{var s;if(typeof t.children=="undefined"){if(typeof t.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Oc(t.value[0],t.value[1])}let i=Array.isArray(t.children)?t.children.entries():Object.entries((s=t.children)!=null?s:{}),n=Array.isArray(t.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof t.value=="undefined"?n:{value:Oc(t.value[0],t.value[1]),children:n}};return e(r)}function oNe(r,{configuration:e,stdout:t,json:i}){let n=r.map(s=>({value:s}));q6({children:n},{configuration:e,stdout:t,json:i})}function q6(r,{configuration:e,stdout:t,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(r.children)?r.children.values():Object.values((o=r.children)!=null?o:{});for(let l of a)t.write(`${JSON.stringify(Y6(l))} -`);return}let s=(0,j6.asTree)(G6(r,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");t.write(s)}var J6=ge(require("crypto")),mR=ge(require("fs"));var aNe=8,Nt=class{constructor(e,{configuration:t,immutable:i=t.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,J6.randomBytes)(8).toString("hex")}.tmp`;this.configuration=t,this.cwd=e,this.immutable=i,this.check=n;let s=t.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=t.get("compressionLevel"),a=o!==lc?`c${o}`:"";this.cacheKey=[aNe,a].join("")}}static async find(e,{immutable:t,check:i}={}){let n=new Nt(e.get("cacheFolder"),{configuration:e,immutable:t,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Jg(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){let n=ANe(t).slice(0,10);return`${Jg(e)}-${n}.zip`}getLocatorPath(e,t,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?k.resolve(this.cwd,this.getVersionFilename(e)):t===null||ER(t)!==this.cacheKey?null:k.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){let t=this.mirrorCwd;return t!==null?k.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await K.existsPromise(this.cwd))throw new ct(X.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await K.mkdirPromise(this.cwd,{recursive:!0});let e=k.resolve(this.cwd,".gitignore");await K.changeFilePromise(e,`/.gitignore -*.flock -*.tmp -`)}(this.mirrorCwd||!this.immutable)&&await K.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,t,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=Or(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new ar,g=()=>{let oe=new li(null,{libzip:q}),ce=k.join(Me.root,ek(e));return oe.mkdirSync(ce,{recursive:!0}),oe.writeJsonSync(k.join(ce,kt.manifest),{name:Ot(e),mocked:!0}),oe},f=async(oe,ce=null)=>{var O;if(ce===null&&((O=o.unstablePackages)==null?void 0:O.has(e.locatorHash)))return null;let Z=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(oe)}`:t;if(ce!==null){let L=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(ce)}`:t;if(Z!==L)throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(t!==null&&Z!==t){let L;switch(this.check?L="throw":ER(t)!==ER(Z)?L="update":L=this.configuration.get("checksumBehavior"),L){case"ignore":return t;case"update":return Z;default:case"throw":throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return Z},h=async oe=>{if(!s)throw new Error(`Cache check required but no loader configured for ${It(this.configuration,e)}`);let ce=await s(),Z=ce.getRealPath();return ce.saveAndClose(),await K.chmodPromise(Z,420),await f(oe,Z)},p=async()=>{if(c===null||!await K.existsPromise(c)){let oe=await s(),ce=oe.getRealPath();return oe.saveAndClose(),{source:"loader",path:ce}}return{source:"mirror",path:c}},m=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${It(this.configuration,e)}`);if(this.immutable)throw new ct(X.IMMUTABLE_CACHE,`Cache entry required but missing for ${It(this.configuration,e)}`);let{path:oe,source:ce}=await p(),Z=await f(oe),O=this.getLocatorPath(e,Z,o);if(!O)throw new Error("Assertion failed: Expected the cache path to be available");let L=[];ce!=="mirror"&&c!==null&&L.push(async()=>{let Be=`${c}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,c)}),(!o.mirrorWriteOnly||c===null)&&L.push(async()=>{let Be=`${O}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,O)});let de=o.mirrorWriteOnly&&c!=null?c:O;return await Promise.all(L.map(Be=>Be())),[!1,de,Z]},y=async()=>{let ce=(async()=>{var je;let Z=this.getLocatorPath(e,t,o),O=Z!==null?await u.existsPromise(Z):!1,L=!!((je=o.mockedPackages)==null?void 0:je.has(e.locatorHash))&&(!this.check||!O),de=L||O,Be=de?i:n;if(Be&&Be(),de){let re=null,se=Z;return L||(re=this.check?await h(se):await f(se)),[L,se,re]}else return m()})();this.mutexes.set(e.locatorHash,ce);try{return await ce}finally{this.mutexes.delete(e.locatorHash)}};for(let oe;oe=this.mutexes.get(e.locatorHash);)await oe;let[b,v,x]=await y();this.markedFiles.add(v);let T,q=await fn(),Y=b?()=>g():()=>new li(v,{baseFs:u,libzip:q,readOnly:!0}),$=new _h(()=>Rv(()=>T=Y(),oe=>`Failed to open the cache entry for ${It(this.configuration,e)}: ${oe}`),k),_=new Na(v,{baseFs:$,pathUtils:k}),ne=()=>{T==null||T.discardAndClose()},ee=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:x;return[_,ne,ee]}};function ER(r){let e=r.indexOf("/");return e!==-1?r.slice(0,e):null}function ANe(r){let e=r.indexOf("/");return e!==-1?r.slice(e+1):r}var cs;(function(t){t[t.SCRIPT=0]="SCRIPT",t[t.SHELLCODE=1]="SHELLCODE"})(cs||(cs={}));var pA=class extends Ji{constructor({configuration:e,stdout:t,suggestInstall:i=!0}){super();this.errorCount=0;nd(this,{configuration:e}),this.configuration=e,this.stdout=t,this.suggestInstall=i}static async start(e,t){let i=new this(e);try{await t(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){this.errorCount+=1,this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${t} -`)}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:!1})}};var i0=ge(require("crypto"));function dA(){}dA.prototype={diff:function(e,t){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(m){return n?(setTimeout(function(){n(void 0,m)},0),!0):m}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var a=t.length,l=e.length,c=1,u=a+l;i.maxEditLength&&(u=Math.min(u,i.maxEditLength));var g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],t,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(t),count:t.length}]);function h(){for(var m=-1*c;m<=c;m+=2){var y=void 0,b=g[m-1],v=g[m+1],x=(v?v.newPos:0)-m;b&&(g[m-1]=void 0);var T=b&&b.newPos+1=a&&x+1>=l)return o(lNe(s,y.components,t,e,s.useLongestToken));g[m]=y}c++}if(n)(function m(){setTimeout(function(){if(c>u)return n();h()||m()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,t,i){var n=e[e.length-1];n&&n.added===t&&n.removed===i?e[e.length-1]={count:n.count+1,added:t,removed:i}:e.push({count:1,added:t,removed:i})},extractCommon:function(e,t,i,n){for(var s=t.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?m:h}),c.value=r.join(u)}else c.value=r.join(t.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&r.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function cNe(r){return{newPos:r.newPos,components:r.components.slice(0)}}var nAt=new dA;var W6=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,z6=/\S/,_6=new dA;_6.equals=function(r,e){return this.options.ignoreCase&&(r=r.toLowerCase(),e=e.toLowerCase()),r===e||this.options.ignoreWhitespace&&!z6.test(r)&&!z6.test(e)};_6.tokenize=function(r){for(var e=r.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),t=0;tr.length)&&(e=r.length);for(var t=0,i=new Array(e);t0?l(Y.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(q=f).push.apply(q,yR(T.map(function(Z){return(x.added?"+":"-")+Z}))),x.added?p+=T.length:h+=T.length}else{if(u)if(T.length<=o.context*2&&v=a.length-2&&T.length<=o.context){var A=/\n$/.test(t),oe=/\n$/.test(i),ce=T.length==0&&f.length>ee.oldLines;!A&&ce&&t.length>0&&f.splice(ee.oldLines,0,"\\ No newline at end of file"),(!A&&!ce||!oe)&&f.push("\\ No newline at end of file")}c.push(ee),u=0,g=0,f=[]}h+=T.length,p+=T.length}},y=0;y`${t}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,r=>`npm:${r}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(r,e)=>cw({protocol:"npm:",source:null,selector:r,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,r=>`npm:${r}`]],NR=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:t}){let i=k.join(e.cwd,e.configuration.get("lockfileFilename"));if(!K.existsSync(i))return;let n=await K.readFilePromise(i,"utf8"),s=Si(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=pd(a);if(!l){t.reportWarning(X.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}po(l.range)&&(l=rr(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of JOe){let m=u.match(h);if(m){g=p(c,...m);break}}if(!g){t.reportWarning(X.YARN_IMPORT_FAILED,`${sr(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=qg(l.range),p=pd(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,cn(f,g))}}supportsDescriptor(e,t){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return await this.resolver.getCandidates(_x(n),t,i)}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var LR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return!!(t.project.storedResolutions.get(e.descriptorHash)||t.project.originalPackages.has(Aw(e).locatorHash))}supportsLocator(e,t){return!!(t.project.originalPackages.has(e.locatorHash)&&!t.project.lockfileNeedsRefresh)}shouldPersistResolution(e,t){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){let n=i.project.originalPackages.get(Aw(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var TR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.resolver.bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,t){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var di=class extends Ji{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){}};var iZ=ge(Wx());var CC=class{constructor(e,{project:t}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=t,this.cwd=e}async setup(){var s;this.manifest=(s=await At.tryFind(this.cwd))!=null?s:new At,this.relativeCwd=k.relative(this.project.cwd,this.cwd)||Me.dot;let e=this.manifest.name?this.manifest.name:$o(null,`${this.computeCandidateName()}-${ln(this.relativeCwd).substring(0,6)}`),t=this.manifest.version?this.manifest.version:"0.0.0";this.locator=cn(e,t),this.anchoredDescriptor=rr(this.locator,`${oi.protocol}${this.relativeCwd}`),this.anchoredLocator=cn(this.locator,`${oi.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o),n=await(0,iZ.default)(i,{cwd:H.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let o of n){let a=k.resolve(this.cwd,H.toPortablePath(o));K.existsSync(k.join(a,"package.json"))&&this.workspacesCwds.add(a)}}accepts(e){var o;let t=e.indexOf(":"),i=t!==-1?e.slice(0,t+1):null,n=t!==-1?e.slice(t+1):e;if(i===oi.protocol&&k.normalize(n)===this.relativeCwd||i===oi.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=po(n);return s?i===oi.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${k.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||t.has(a)||(t.add(a),i(a))}};return i(this),t}getRecursiveWorkspaceDependents({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&hd(c.anchoredLocator,n.anchoredLocator)}))&&!t.has(s)&&(t.add(s),i(s))};return i(this),t}getRecursiveWorkspaceChildren(){let e=[];for(let t of this.workspacesCwds){let i=this.project.workspacesByCwd.get(t);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let t=k.join(this.cwd,At.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} -`;await K.changeFilePromise(t,i,{automaticNewlines:!0}),this.manifest.raw=e}};var oZ=6,WOe=1,zOe=/ *, */g,aZ=/\/$/,_Oe=32,VOe=(0,OR.promisify)(KR.default.gzip),XOe=(0,OR.promisify)(KR.default.gunzip),Ci;(function(t){t.UpdateLockfile="update-lockfile",t.SkipBuild="skip-build"})(Ci||(Ci={}));var UR={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},AZ=r=>ln(`${WOe}`,r),ze=class{constructor(e,{configuration:t}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=t,this.cwd=e}static async find(e,t){var p,m,y;if(!e.projectCwd)throw new Pe(`No project found in ${t}`);let i=e.projectCwd,n=t,s=null;for(;s!==e.projectCwd;){if(s=n,K.existsSync(k.join(s,kt.manifest))){i=s;break}n=k.dirname(s)}let o=new ze(e.projectCwd,{configuration:e});(p=ye.telemetry)==null||p.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(m=ye.telemetry)==null||m.reportWorkspaceCount(o.workspaces.length),(y=ye.telemetry)==null||y.reportDependencyCount(o.workspaces.reduce((b,v)=>b+v.manifest.dependencies.size+v.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};let c=tt(e,o.cwd,qe.PATH),u=tt(e,k.relative(o.cwd,i),qe.PATH),g=`- If ${c} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,f=`- If ${c} is intended to be a project, it might be that you forgot to list ${u} in its workspace configuration.`,h=`- Finally, if ${c} is fine and you intend ${u} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new Pe(`The nearest package directory (${tt(e,i,qe.PATH)}) doesn't seem to be part of the project declared in ${tt(e,o.cwd,qe.PATH)}. - -${[g,f,h].join(` -`)}`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.configuration.get("defaultLanguageName");if(K.existsSync(e)){let n=await K.readFilePromise(e,"utf8");this.lockFileChecksum=AZ(n);let s=Si(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let t=e;e=[];for(let i of t){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let t=new CC(e,{project:this});await t.setup();let i=this.workspacesByIdent.get(t.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${fi(this.configuration,t.locator)}: ${H.fromPortablePath(e)} conflicts with ${H.fromPortablePath(i.cwd)}`);return this.workspaces.push(t),this.workspacesByCwd.set(e,t),this.workspacesByIdent.set(t.locator.identHash,t),t}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){k.isAbsolute(e)||(e=k.resolve(this.cwd,e)),e=k.normalize(e).replace(/\/+$/,"");let t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){let t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(let i of this.workspaces)k.relative(i.cwd,e).startsWith("../")||t&&t.cwd.length>=i.cwd.length||(t=i);return t||null}getWorkspaceByFilePath(e){let t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){let t=this.workspacesByIdent.get(e.identHash);return typeof t=="undefined"?null:t}getWorkspaceByIdent(e){let t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${fi(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){let t=this.tryWorkspaceByIdent(e);return t===null||(Al(e)&&(e=ud(e)),!t.accepts(e.range))?null:t}getWorkspaceByDescriptor(e){let t=this.tryWorkspaceByDescriptor(e);if(t===null)throw new Error(`Workspace not found (${sr(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){let t=this.tryWorkspaceByIdent(e);return t===null||(ea(e)&&(e=gd(e)),t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash)?null:t}getWorkspaceByLocator(e){let t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${It(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(let e of this.workspaces){let t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error(`Assertion failed: Expected workspace ${Cd(this.configuration,e)} (${tt(this.configuration,k.join(e.cwd,kt.manifest),qe.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(t.dependencies)}}forgetResolution(e){let t=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);t(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&t(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let t of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(t,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(t)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[t,i]of e.dependencies)Al(i)&&e.dependencies.set(t,ud(i))}getDependencyMeta(e,t){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(Ot(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),t===null||!sZ.default.valid(t))return i;for(let[a,l]of s)a!==null&&a===t&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:t=!1}={}){let i=new di,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(t&&(await o.findPackageLocation(a,s)).replace(aZ,"")!==e.replace(aZ,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let t=e.resolver||this.configuration.makeResolver(),i=new NR(t);await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new TR(t)]:[i,t],s=new wd([new LR(t),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,m=new Set,y=[],b=ck(),v=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ji.progressViaTitle(),async ne=>{let ee=async O=>{let L=await Lg(async()=>await s.resolve(O,a),je=>`${It(this.configuration,O)}: ${je}`);if(!hd(O,L))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${It(this.configuration,O)} to ${It(this.configuration,L)})`);g.set(L.locatorHash,L);let de=this.configuration.normalizePackage(L);for(let[je,re]of de.dependencies){let se=await this.configuration.reduceHook(he=>he.reduceDependency,re,this,de,re,{resolver:s,resolveOptions:a});if(!fd(re,se))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let be=s.bindDescriptor(se,O,a);de.dependencies.set(je,be)}let Be=go([...de.dependencies.values()].map(je=>Z(je)));return y.push(Be),Be.catch(()=>{}),c.set(de.locatorHash,de),de},A=async O=>{let L=f.get(O.locatorHash);if(typeof L!="undefined")return L;let de=Promise.resolve().then(()=>ee(O));return f.set(O.locatorHash,de),de},oe=async(O,L)=>{let de=await Z(L);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,de.locatorHash),de},ce=async O=>{ne.setTitle(sr(this.configuration,O));let L=this.resolutionAliases.get(O.descriptorHash);if(typeof L!="undefined")return oe(O,this.storedDescriptors.get(L));let de=s.getResolutionDependencies(O,a),Be=new Map(await go(de.map(async se=>{let be=s.bindDescriptor(se,p,a),he=await Z(be);return m.add(he.locatorHash),[se.descriptorHash,he]}))),re=(await Lg(async()=>await s.getCandidates(O,Be,a),se=>`${sr(this.configuration,O)}: ${se}`))[0];if(typeof re=="undefined")throw new Error(`${sr(this.configuration,O)}: No candidates found`);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,re.locatorHash),A(re)},Z=O=>{let L=h.get(O.descriptorHash);if(typeof L!="undefined")return L;l.set(O.descriptorHash,O);let de=Promise.resolve().then(()=>ce(O));return h.set(O.descriptorHash,de),de};for(let O of this.workspaces){let L=O.anchoredDescriptor;y.push(Z(L))}for(;y.length>0;){let O=[...y];y.length=0,await go(O)}});let x=new Set(this.resolutionAliases.values()),T=new Set(c.keys()),q=new Set,Y=new Map;ZOe({project:this,report:e.report,accessibleLocators:q,volatileDescriptors:x,optionalBuilds:T,peerRequirements:Y,allDescriptors:l,allResolutions:u,allPackages:c});for(let ne of m)T.delete(ne);for(let ne of x)l.delete(ne),u.delete(ne);let $=new Set,_=new Set;for(let ne of c.values())ne.conditions!=null&&(!T.has(ne.locatorHash)||(gw(ne,v)||(gw(ne,b)&&e.report.reportWarningOnce(X.GHOST_ARCHITECTURE,`${It(this.configuration,ne)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${tt(this.configuration,"supportedArchitectures",Ri.SETTING)} setting`),_.add(ne.locatorHash)),$.add(ne.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=q,this.conditionalLocators=$,this.disabledLocators=_,this.originalPackages=g,this.optionalBuilds=T,this.peerRequirements=Y,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,cacheOptions:s},l=Array.from(new Set(kn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return Rs(h)}])));n===Ci.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Ji.progressViaCounter(l.length);t.reportProgress(u);let g=(0,nZ.default)(_Oe);if(await t.startCacheReport(async()=>{await go(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(ea(h))return;let p;try{p=await o.fetch(h,a)}catch(m){m.message=`${It(this.configuration,h)}: ${m.message}`,t.reportExceptionOnce(m),c=m;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:t,fetcher:i,mode:n}){var A,oe,ce;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:t},u=new Map(l.map(Z=>{let O=Z.makeInstaller(c),L=O.getCustomDataKey(),de=this.installersCustomData.get(L);return typeof de!="undefined"&&O.attachCustomData(de),[Z,O]})),g=new Map,f=new Map,h=new Map,p=new Map(await go([...this.accessibleLocators].map(async Z=>{let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");return[Z,await o.fetch(O,a)]}))),m=[];for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(typeof O=="undefined")throw new Error("Assertion failed: The locator should have been registered");let L=p.get(O.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let de=[],Be=re=>{de.push(re)},je=this.tryWorkspaceByLocator(O);if(je!==null){let re=[],{scripts:se}=je.manifest;for(let he of["preinstall","install","postinstall"])se.has(he)&&re.push([cs.SCRIPT,he]);try{for(let[he,Fe]of u)if(he.supportsPackage(O,c)&&(await Fe.installPackage(O,L,{holdFetchResult:Be})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{de.length===0?(A=L.releaseFs)==null||A.call(L):m.push(go(de).catch(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}let be=k.join(L.packageFs.getRealPath(),L.prefixPath);f.set(O.locatorHash,be),!ea(O)&&re.length>0&&h.set(O.locatorHash,{directives:re,buildLocations:[be]})}else{let re=l.find(he=>he.supportsPackage(O,c));if(!re)throw new ct(X.LINKER_NOT_FOUND,`${It(this.configuration,O)} isn't supported by any available linker`);let se=u.get(re);if(!se)throw new Error("Assertion failed: The installer should have been registered");let be;try{be=await se.installPackage(O,L,{holdFetchResult:Be})}finally{de.length===0?(oe=L.releaseFs)==null||oe.call(L):m.push(go(de).then(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}g.set(O.locatorHash,re),f.set(O.locatorHash,be.packageLocation),be.buildDirective&&be.buildDirective.length>0&&be.packageLocation&&h.set(O.locatorHash,{directives:be.buildDirective,buildLocations:[be.packageLocation]})}}let y=new Map;for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");let L=this.tryWorkspaceByLocator(O)!==null,de=async(Be,je)=>{let re=f.get(O.locatorHash);if(typeof re=="undefined")throw new Error(`Assertion failed: The package (${It(this.configuration,O)}) should have been registered`);let se=[];for(let be of O.dependencies.values()){let he=this.storedResolutions.get(be.descriptorHash);if(typeof he=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,be)}, from ${It(this.configuration,O)})should have been registered`);let Fe=this.storedPackages.get(he);if(typeof Fe=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);let Ke=this.tryWorkspaceByLocator(Fe)===null?g.get(he):null;if(typeof Ke=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);Ke===Be||Ke===null?f.get(Fe.locatorHash)!==null&&se.push([be,Fe]):!L&&re!==null&&Fg(y,he).push(re)}re!==null&&await je.attachInternalDependencies(O,se)};if(L)for(let[Be,je]of u)Be.supportsPackage(O,c)&&await de(Be,je);else{let Be=g.get(O.locatorHash);if(!Be)throw new Error("Assertion failed: The linker should have been found");let je=u.get(Be);if(!je)throw new Error("Assertion failed: The installer should have been registered");await de(Be,je)}}for(let[Z,O]of y){let L=this.storedPackages.get(Z);if(!L)throw new Error("Assertion failed: The package should have been registered");let de=g.get(L.locatorHash);if(!de)throw new Error("Assertion failed: The linker should have been found");let Be=u.get(de);if(!Be)throw new Error("Assertion failed: The installer should have been registered");await Be.attachExternalDependents(L,O)}let b=new Map;for(let Z of u.values()){let O=await Z.finalizeInstall();for(let L of(ce=O==null?void 0:O.records)!=null?ce:[])h.set(L.locatorHash,{directives:L.buildDirective,buildLocations:L.buildLocations});typeof(O==null?void 0:O.customData)!="undefined"&&b.set(Z.getCustomDataKey(),O.customData)}if(this.installersCustomData=b,await go(m),n===Ci.SkipBuild)return;let v=new Set(this.storedPackages.keys()),x=new Set(h.keys());for(let Z of x)v.delete(Z);let T=(0,i0.createHash)("sha512");T.update(process.versions.node),await this.configuration.triggerHook(Z=>Z.globalHashGeneration,this,Z=>{T.update("\0"),T.update(Z)});let q=T.digest("hex"),Y=new Map,$=Z=>{let O=Y.get(Z.locatorHash);if(typeof O!="undefined")return O;let L=this.storedPackages.get(Z.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The package should have been registered");let de=(0,i0.createHash)("sha512");de.update(Z.locatorHash),Y.set(Z.locatorHash,"");for(let Be of L.dependencies.values()){let je=this.storedResolutions.get(Be.descriptorHash);if(typeof je=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,Be)}) should have been registered`);let re=this.storedPackages.get(je);if(typeof re=="undefined")throw new Error("Assertion failed: The package should have been registered");de.update($(re))}return O=de.digest("hex"),Y.set(Z.locatorHash,O),O},_=(Z,O)=>{let L=(0,i0.createHash)("sha512");L.update(q),L.update($(Z));for(let de of O)L.update(de);return L.digest("hex")},ne=new Map,ee=!1;for(;x.size>0;){let Z=x.size,O=[];for(let L of x){let de=this.storedPackages.get(L);if(!de)throw new Error("Assertion failed: The package should have been registered");let Be=!0;for(let se of de.dependencies.values()){let be=this.storedResolutions.get(se.descriptorHash);if(!be)throw new Error(`Assertion failed: The resolution (${sr(this.configuration,se)}) should have been registered`);if(x.has(be)){Be=!1;break}}if(!Be)continue;x.delete(L);let je=h.get(de.locatorHash);if(!je)throw new Error("Assertion failed: The build directive should have been registered");let re=_(de,je.buildLocations);if(this.storedBuildState.get(de.locatorHash)===re){ne.set(de.locatorHash,re);continue}ee||(await this.persistInstallStateFile(),ee=!0),this.storedBuildState.has(de.locatorHash)?t.reportInfo(X.MUST_REBUILD,`${It(this.configuration,de)} must be rebuilt because its dependency tree changed`):t.reportInfo(X.MUST_BUILD,`${It(this.configuration,de)} must be built because it never has been before or the last one failed`);for(let se of je.buildLocations){if(!k.isAbsolute(se))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${se})`);O.push((async()=>{for(let[be,he]of je.directives){let Fe=`# This file contains the result of Yarn building a package (${Rs(de)}) -`;switch(be){case cs.SCRIPT:Fe+=`# Script name: ${he} -`;break;case cs.SHELLCODE:Fe+=`# Script code: ${he} -`;break}let Ke=null;if(!await K.mktempPromise(async ve=>{let pe=k.join(ve,"build.log"),{stdout:V,stderr:Qe}=this.configuration.getSubprocessStreams(pe,{header:Fe,prefix:It(this.configuration,de),report:t}),le;try{switch(be){case cs.SCRIPT:le=await nB(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break;case cs.SHELLCODE:le=await rD(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break}}catch(gt){Qe.write(gt.stack),le=1}if(V.end(),Qe.end(),le===0)return ne.set(de.locatorHash,re),!0;K.detachTemp(ve);let fe=`${It(this.configuration,de)} couldn't be built successfully (exit code ${tt(this.configuration,le,qe.NUMBER)}, logs can be found here: ${tt(this.configuration,pe,qe.PATH)})`;return this.optionalBuilds.has(de.locatorHash)?(t.reportInfo(X.BUILD_FAILED,fe),ne.set(de.locatorHash,re),!0):(t.reportError(X.BUILD_FAILED,fe),!1)}))return}})())}}if(await go(O),Z===x.size){let L=Array.from(x).map(de=>{let Be=this.storedPackages.get(de);if(!Be)throw new Error("Assertion failed: The package should have been registered");return It(this.configuration,Be)}).join(", ");t.reportError(X.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${L})`);break}}this.storedBuildState=ne}async install(e){var a,l;let t=this.configuration.get("nodeLinker");(a=ye.telemetry)==null||a.reportInstall(t),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=qi.Inactive;let i=k.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await K.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=tt(this.configuration,g,qe.PACKAGE_EXTENSION);switch(g.status){case qi.Inactive:e.report.reportWarning(X.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case qi.Redundant:e.report.reportWarning(X.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=sc(n,this.generateLockfile());if(c!==n){let u=V6(i,i,n,c,void 0,void 0,{maxEditLength:100});if(u){e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.ADDED)):f.startsWith("-")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.REMOVED)):e.report.reportInfo(null,tt(this.configuration,f,"grey"))}e.report.reportSeparator()}throw new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===qi.Active&&((l=ye.telemetry)==null||l.reportPackageExtension(Oc(g,qe.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==Ci.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>ow(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===Ci.UpdateLockfile){e.report.reportWarning(X.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${tt(this.configuration,"mode=update-lockfile",qe.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>ow(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let t={};t.__metadata={version:oZ,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>Pn(f)).sort().join(", "),c=new At;c.version=o.linkType===Qt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof t.__metadata.cacheKey=="undefined"&&(t.__metadata.cacheKey=h),h===t.__metadata.cacheKey?u=p:u=g}t[l]=te(N({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:Rs(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+Ma(t)}async persistLockfile(){let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t="";try{t=await K.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=sc(t,i);n!==t&&(await K.writeFilePromise(e,n),this.lockFileChecksum=AZ(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(UR))e.push(...o);let t=(0,n0.default)(this,e),i=MR.default.serialize(t),n=ln(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await K.mkdirPromise(k.dirname(s),{recursive:!0}),await K.writeFilePromise(s,await VOe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:t=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath"),s;try{let o=await XOe(await K.readFilePromise(n));s=MR.default.deserialize(o),this.installStateChecksum=ln(o)}catch{t&&await this.applyLightResolution();return}e&&typeof s.installersCustomData!="undefined"&&(this.installersCustomData=s.installersCustomData),i&&Object.assign(this,(0,n0.default)(s,UR.restoreBuildState)),t&&(s.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,n0.default)(s,UR.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new di}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:t}){if(this.configuration.get("enableGlobalCache"))return;let i=new Set([".gitignore"]);if(!Ak(e.cwd,this.cwd)||!await K.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await K.readdirPromise(e.cwd)){if(i.has(a))continue;let l=k.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?t.reportError(X.IMMUTABLE_CACHE,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:t.reportInfo(X.UNUSED_CACHE_ENTRY,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused - removing`),await K.removePromise(l)))}n&&s!==0&&t.reportInfo(X.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function ZOe({project:r,allDescriptors:e,allResolutions:t,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,peerRequirements:o=new Map,volatileDescriptors:a=new Set,report:l,tolerateMissingPackages:c=!1}){var ne;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,m=new Map,y=new Map,b=new Map(r.workspaces.map(ee=>{let A=ee.anchoredLocator.locatorHash,oe=i.get(A);if(typeof oe=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,cd(oe)]})),v=()=>{let ee=K.mktempSync(),A=k.join(ee,"stacktrace.log"),oe=String(g.length+1).length,ce=g.map((Z,O)=>`${`${O+1}.`.padStart(oe," ")} ${Rs(Z)} -`).join("");throw K.writeFileSync(A,ce),K.detachTemp(ee),new ct(X.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${H.fromPortablePath(A)}`)},x=ee=>{let A=t.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let oe=i.get(A);if(!oe)throw new Error("Assertion failed: The package could not be found");return oe},T=(ee,A,oe,{top:ce,optional:Z})=>{g.length>1e3&&v(),g.push(A);let O=q(ee,A,oe,{top:ce,optional:Z});return g.pop(),O},q=(ee,A,oe,{top:ce,optional:Z})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),Z||s.delete(A.locatorHash);let O=i.get(A.locatorHash);if(!O){if(c)return;throw new Error(`Assertion failed: The package (${It(r.configuration,A)}) should have been registered`)}let L=[],de=[],Be=[],je=[],re=[];for(let be of Array.from(O.dependencies.values())){if(O.peerDependencies.has(be.identHash)&&O.locatorHash!==ce)continue;if(Al(be))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");a.delete(be.descriptorHash);let he=Z;if(!he){let Qe=O.dependenciesMeta.get(Ot(be));if(typeof Qe!="undefined"){let le=Qe.get(null);typeof le!="undefined"&&le.optional&&(he=!0)}}let Fe=t.get(be.descriptorHash);if(!Fe){if(c)continue;throw new Error(`Assertion failed: The resolution (${sr(r.configuration,be)}) should have been registered`)}let Ke=b.get(Fe)||i.get(Fe);if(!Ke)throw new Error(`Assertion failed: The package (${Fe}, resolved from ${sr(r.configuration,be)}) should have been registered`);if(Ke.peerDependencies.size===0){T(be,Ke,new Map,{top:ce,optional:he});continue}let ke,ve,pe=new Set,V;de.push(()=>{ke=Vx(be,A.locatorHash),ve=Xx(Ke,A.locatorHash),O.dependencies.delete(be.identHash),O.dependencies.set(ke.identHash,ke),t.set(ke.descriptorHash,ve.locatorHash),e.set(ke.descriptorHash,ke),i.set(ve.locatorHash,ve),L.push([Ke,ke,ve])}),Be.push(()=>{var Qe;V=new Map;for(let le of ve.peerDependencies.values()){let fe=O.dependencies.get(le.identHash);if(!fe&&fd(A,le)&&(ee.identHash===A.identHash?fe=ee:(fe=rr(A,ee.range),e.set(fe.descriptorHash,fe),t.set(fe.descriptorHash,A.locatorHash),a.delete(fe.descriptorHash))),(!fe||fe.range==="missing:")&&ve.dependencies.has(le.identHash)){ve.peerDependencies.delete(le.identHash);continue}fe||(fe=rr(le,"missing:")),ve.dependencies.set(fe.identHash,fe),Al(fe)&&Nc(p,fe.descriptorHash).add(ve.locatorHash),f.set(fe.identHash,fe),fe.range==="missing:"&&pe.add(fe.identHash),V.set(le.identHash,(Qe=oe.get(le.identHash))!=null?Qe:ve.locatorHash)}ve.dependencies=new Map(kn(ve.dependencies,([le,fe])=>Ot(fe)))}),je.push(()=>{if(!i.has(ve.locatorHash))return;let Qe=u.get(Ke.locatorHash);typeof Qe=="number"&&Qe>=2&&v();let le=u.get(Ke.locatorHash),fe=typeof le!="undefined"?le+1:1;u.set(Ke.locatorHash,fe),T(ke,ve,V,{top:ce,optional:he}),u.set(Ke.locatorHash,fe-1)}),re.push(()=>{let Qe=O.dependencies.get(be.identHash);if(typeof Qe=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let le=t.get(Qe.descriptorHash);if(typeof le=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(Nc(y,le).add(A.locatorHash),!!i.has(ve.locatorHash)){for(let fe of ve.peerDependencies.values()){let gt=V.get(fe.identHash);if(typeof gt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Fg(Ng(m,gt),Ot(fe)).push(ve.locatorHash)}for(let fe of pe)ve.dependencies.delete(fe)}})}for(let be of[...de,...Be])be();let se;do{se=!0;for(let[be,he,Fe]of L){let Ke=Ng(h,be.locatorHash),ke=ln(...[...Fe.dependencies.values()].map(Qe=>{let le=Qe.range!=="missing:"?t.get(Qe.descriptorHash):"missing:";if(typeof le=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${sr(r.configuration,Qe)} to have been registered`);return le===ce?`${le} (top)`:le}),he.identHash),ve=Ke.get(ke);if(typeof ve=="undefined"){Ke.set(ke,he);continue}if(ve===he)continue;i.delete(Fe.locatorHash),e.delete(he.descriptorHash),t.delete(he.descriptorHash),n.delete(Fe.locatorHash);let pe=p.get(he.descriptorHash)||[],V=[O.locatorHash,...pe];p.delete(he.descriptorHash);for(let Qe of V){let le=i.get(Qe);typeof le!="undefined"&&(le.dependencies.get(he.identHash).descriptorHash!==ve.descriptorHash&&(se=!1),le.dependencies.set(he.identHash,ve))}}}while(!se);for(let be of[...je,...re])be()};for(let ee of r.workspaces){let A=ee.anchoredLocator;a.delete(ee.anchoredDescriptor.descriptorHash),T(ee.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var Y;(function(oe){oe[oe.NotProvided=0]="NotProvided",oe[oe.NotCompatible=1]="NotCompatible"})(Y||(Y={}));let $=[];for(let[ee,A]of y){let oe=i.get(ee);if(typeof oe=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let ce=m.get(ee);if(typeof ce!="undefined")for(let Z of A){let O=i.get(Z);if(typeof O!="undefined")for(let[L,de]of ce){let Be=An(L);if(O.peerDependencies.has(Be.identHash))continue;let je=`p${ln(Z,L,ee).slice(0,5)}`;o.set(je,{subject:Z,requested:Be,rootRequester:ee,allRequesters:de});let re=oe.dependencies.get(Be.identHash);if(typeof re!="undefined"){let se=x(re),be=(ne=se.version)!=null?ne:"0.0.0",he=new Set;for(let Ke of de){let ke=i.get(Ke);if(typeof ke=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let ve=ke.peerDependencies.get(Be.identHash);if(typeof ve=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");he.add(ve.range)}[...he].every(Ke=>{if(Ke.startsWith(oi.protocol)){if(!r.tryWorkspaceByLocator(se))return!1;Ke=Ke.slice(oi.protocol.length),(Ke==="^"||Ke==="~")&&(Ke="*")}return qc(be,Ke)})||$.push({type:1,subject:O,requested:Be,requester:oe,version:be,hash:je,requirementCount:de.length})}else{let se=oe.peerDependenciesMeta.get(L);(se==null?void 0:se.optional)||$.push({type:0,subject:O,requested:Be,requester:oe,hash:je})}}}}let _=[ee=>$x(ee.subject),ee=>Ot(ee.requested),ee=>`${ee.type}`];l==null||l.startSectionSync({reportFooter:()=>{l.reportWarning(X.UNNAMED,`Some peer dependencies are incorrectly met; run ${tt(r.configuration,"yarn explain peer-requirements ",qe.CODE)} for details, where ${tt(r.configuration,"",qe.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let ee of kn($,_))switch(ee.type){case 0:l.reportWarning(X.MISSING_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} doesn't provide ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}), requested by ${fi(r.configuration,ee.requester)}`);break;case 1:{let A=ee.requirementCount>1?"and some of its descendants request":"requests";l.reportWarning(X.INCOMPATIBLE_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} provides ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}) with version ${dd(r.configuration,ee.version)}, which doesn't satisfy what ${fi(r.configuration,ee.requester)} ${A}`)}break}})}var ca;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(ca||(ca={}));var mC=class{constructor(e,t){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!K.existsSync(i),this.sendReport(t),this.startBuffer()}reportVersion(e){this.reportValue(ca.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(ca.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(ca.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(ca.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(ca.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(ca.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(ca.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(ca.DEPENDENCY_COUNT,String(e))}reportValue(e,t){Nc(this.values,e).add(t)}reportEnumerator(e,t){Nc(this.enumerators,e).add(ln(t))}reportHit(e,t="*"){let i=Ng(this.hits,e),n=_a(i,t,()=>0);i.set(t,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return k.join(e,"telemetry.json")}sendReport(e){var u,g,f;let t=this.getRegistryPath(),i;try{i=K.readJsonSync(t)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{K.mkdirSync(k.dirname(t),{recursive:!0}),K.writeJsonSync(t,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>HP(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let m=p;m.userId=h,m.reportType="primary";for(let v of Object.keys((f=m.enumerators)!=null?f:{}))m.enumerators[v]=m.enumerators[v].length;c(m);let y=new Map,b=20;for(let[v,x]of Object.entries(m.values))x.length>0&&y.set(v,x.slice(0,b));for(;y.size>0;){let v={};v.userId=h,v.reportType="secondary",v.metrics={};for(let[x,T]of y)v.metrics[x]=T.shift(),T.length===0&&y.delete(x);c(v)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),t;try{t=K.readJsonSync(e)}catch{t={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=t.blocks=(a=t.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let m of this.hits.keys()){let y=s.hits=(c=s.hits)!=null?c:{},b=y[m]=(u=y[m])!=null?u:{};for(let[v,x]of this.hits.get(m))b[v]=((g=b[v])!=null?g:0)+x}for(let m of["values","enumerators"])for(let y of this[m].keys()){let b=s[m]=(f=s[m])!=null?f:{};b[y]=[...new Set([...(h=b[y])!=null?h:[],...(p=this[m].get(y))!=null?p:[]])]}K.mkdirSync(k.dirname(e),{recursive:!0}),K.writeJsonSync(e,t)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var HR=ge(require("child_process")),lZ=ge(Ic());var jR=ge(require("fs"));var Lf=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function $Oe(r){let e=H.fromPortablePath(r);process.on("SIGINT",()=>{}),e?(0,HR.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,HR.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function s0({binaryVersion:r,pluginConfiguration:e}){async function t(){let n=new ws({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:r});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var m,y,b,v,x;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(!Se.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!Wt.satisfiesWithPrereleases(s,o))throw new Pe(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let l=await ye.find(H.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),c=l.get("yarnPath"),u=l.get("ignorePath"),g=l.get("ignoreCwd"),f=H.toPortablePath(H.resolve(process.argv[1])),h=T=>K.readFilePromise(T).catch(()=>Buffer.of());if(!u&&!g&&await(async()=>c===f||Buffer.compare(...await Promise.all([h(c),h(f)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(c!==null&&!u)if(!K.existsSync(c))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${l.sources.get("yarnPath")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1;else try{$Oe(c)}catch(T){process.exitCode=T.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get("enableTelemetry")&&!lZ.isCI&&process.stdout.isTTY&&(ye.telemetry=new mC(l,"puba9cdc10ec5790a2cf4969dd413a47270")),(m=ye.telemetry)==null||m.reportVersion(r);for(let[$,_]of l.plugins.entries()){Lf.has((b=(y=$.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:y[1])!=null?b:"")&&((v=ye.telemetry)==null||v.reportPluginName($));for(let ne of _.commands||[])n.register(ne)}let q=n.process(process.argv.slice(2));q.help||(x=ye.telemetry)==null||x.reportCommandName(q.path.join(" "));let Y=q.cwd;if(typeof Y!="undefined"&&!g){let $=(0,jR.realpathSync)(process.cwd()),_=(0,jR.realpathSync)(Y);if($!==_){process.chdir(Y),await t();return}}await n.runExit(q,{cwd:H.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return t().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>K.rmtempPromise())}function cZ(r){r.Command.Path=(...e)=>t=>{t.paths=t.paths||[],t.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])r.Command[e]=(...t)=>(i,n)=>{let s=r.Option[e](...t);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return r}var GC={};ft(GC,{BaseCommand:()=>Le,WorkspaceRequiredError:()=>ht,getDynamicLibs:()=>bre,getPluginConfiguration:()=>L0,main:()=>s0,openWorkspace:()=>Wf,pluginCommands:()=>Lf});var Le=class extends Re{constructor(){super(...arguments);this.cwd=J.String("--cwd",{hidden:!0})}};var ht=class extends Pe{constructor(e,t){let i=k.relative(e,t),n=k.join(e,At.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var sGe=ge(ri());ys();var oGe=ge(UF()),bre=()=>new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",Cp],["semver",sGe],["typanion",cg],["yup",oGe]]);async function Wf(r,e){let{project:t,workspace:i}=await ze.find(r,e);if(!i)throw new ht(t.cwd,e);return i}var Q_e=ge(ri());ys();var S_e=ge(UF());var GN={};ft(GN,{dedupeUtils:()=>wN,default:()=>mWe,suggestUtils:()=>lN});var Sae=ge(Ic());var Fne=ge(WC());ys();var lN={};ft(lN,{Modifier:()=>pa,Strategy:()=>Vr,Target:()=>Hr,WorkspaceModifier:()=>Xf,applyModifier:()=>kne,extractDescriptorFromPath:()=>gN,extractRangeModifier:()=>xne,fetchDescriptorFrom:()=>uN,findProjectDescriptors:()=>Rne,getModifier:()=>zC,getSuggestedDescriptors:()=>_C,makeWorkspaceDescriptor:()=>Dne,toWorkspaceModifier:()=>Pne});var cN=ge(ri()),bYe="workspace:",Hr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(Hr||(Hr={}));var pa;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(pa||(pa={}));var Xf;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(Xf||(Xf={}));var Vr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Vr||(Vr={}));function zC(r,e){return r.exact?pa.EXACT:r.caret?pa.CARET:r.tilde?pa.TILDE:e.configuration.get("defaultSemverRangePrefix")}var QYe=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function xne(r,{project:e}){let t=r.match(QYe);return t?t[1]:e.configuration.get("defaultSemverRangePrefix")}function kne(r,e){let{protocol:t,source:i,params:n,selector:s}=P.parseRange(r.range);return cN.default.valid(s)&&(s=`${e}${r.range}`),P.makeDescriptor(r,P.makeRange({protocol:t,source:i,params:n,selector:s}))}function Pne(r){switch(r){case pa.CARET:return Xf.CARET;case pa.TILDE:return Xf.TILDE;case pa.EXACT:return Xf.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${r}"`)}}function Dne(r,e){return P.makeDescriptor(r.anchoredDescriptor,`${bYe}${Pne(e)}`)}async function Rne(r,{project:e,target:t}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(t===Hr.PEER){let o=s.manifest.peerDependencies.get(r.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(r.identHash),a=s.manifest.devDependencies.get(r.identHash);t===Hr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function gN(r,{cwd:e,workspace:t}){return await SYe(async i=>{k.isAbsolute(r)||(r=k.relative(t.cwd,k.resolve(e,r)),r.match(/^\.{0,2}\//)||(r=`./${r}`));let{project:n}=t,s=await uN(P.makeIdent(null,"archive"),r,{project:t.project,cache:i,workspace:t});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new di,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,t.anchoredLocator,c),g=P.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await At.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return P.makeDescriptor(h.name,r)})}async function _C(r,{project:e,workspace:t,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(r.range!=="unknown")return{suggestions:[{descriptor:r,name:`Use ${P.prettyDescriptor(e.configuration,r)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof t!="undefined"&&t!==null&&t.manifest[n].get(r.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Vr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${P.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Vr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await Rne(r,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===t.anchoredLocator.locatorHash&&o.includes(Vr.KEEP))continue;let m=`(originally used by ${P.prettyLocator(e.configuration,p[0])}`;m+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:m})}});break;case Vr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===r.identHash&&c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Vr.PROJECT:await g(async()=>{if(t.manifest.name!==null&&r.identHash===t.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(r);if(h===null)return;let p=Dne(h,s);c.push({descriptor:p,name:`Attach ${P.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ae.pretty(e.configuration,h.relativeCwd,ae.Type.PATH)})`})});break;case Vr.LATEST:await g(async()=>{if(r.range!=="unknown")c.push({descriptor:r,name:`Use ${P.prettyRange(e.configuration,r.range)}`,reason:"(explicit range requested)"});else if(n===Hr.PEER)c.push({descriptor:P.makeDescriptor(r,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:ae.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await uN(r,"latest",{project:e,cache:i,workspace:t,preserveModifier:!1});h&&(h=kne(h,s),c.push({descriptor:h,name:`Use ${P.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function uN(r,e,{project:t,cache:i,workspace:n,preserveModifier:s=!0}){let o=P.makeDescriptor(r,e),a=new di,l=t.configuration.makeFetcher(),c=t.configuration.makeResolver(),u={project:t,fetcher:l,cache:i,checksums:t.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=te(N({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:m,source:y,params:b,selector:v}=P.parseRange(P.convertToManifestRange(p.reference));if(m===t.configuration.get("defaultProtocol")&&(m=null),cN.default.valid(v)&&s!==!1){let x=typeof s=="string"?s:o.range;v=xne(x,{project:t})+v}return P.makeDescriptor(p,P.makeRange({protocol:m,source:y,params:b,selector:v}))}async function SYe(r){return await K.mktempPromise(async e=>{let t=ye.create(e);return t.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await r(new Nt(e,{configuration:t,check:!1,immutable:!1}))})}var VC=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=J.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=J.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=J.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=J.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=J.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=J.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.silent=J.Boolean("--silent",{hidden:!0});this.packages=J.Rest()}async execute(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=[...s?[Vr.REUSE]:[],Vr.PROJECT,...this.cached?[Vr.CACHE]:[],Vr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async y=>{let b=y.match(/^\.{0,2}\//)?await gN(y,{cwd:this.context.cwd,workspace:i}):P.tryParseDescriptor(y),v=y.match(/^(https?:|git@github)/);if(v)throw new Pe(`It seems you are trying to add a package using a ${ae.pretty(e,`${v[0]}...`,Ri.RANGE)} url; we now require package names to be explicitly specified. -Try running the command again with the package name prefixed: ${ae.pretty(e,"yarn add",Ri.CODE)} ${ae.pretty(e,P.makeDescriptor(P.makeIdent(null,"my-package"),`${v[0]}...`),Ri.DESCRIPTOR)}`);if(!b)throw new Pe(`The ${ae.pretty(e,y,Ri.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let x=vYe(i,b,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),T=await _C(b,{project:t,workspace:i,cache:n,target:x,modifier:o,strategies:a,maxResults:l});return[b,T,x]})),u=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[b,{suggestions:v,rejections:x}]of c)if(v.filter(q=>q.descriptor!==null).length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),y.reportSeparator(),y.reportExceptionOnce(q)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:y},b]of c){let v,x=y.filter($=>$.descriptor!==null),T=x[0].descriptor,q=x.every($=>P.areDescriptorsEqual($.descriptor,T));x.length===1||q?v=T:(g=!0,{answer:v}=await(0,Fne.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:y.map(({descriptor:$,name:_,reason:ne})=>$?{name:_,hint:ne,descriptor:$}:{name:_,hint:ne,disabled:!0}),onCancel:()=>process.exit(130),result($){return this.find($,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Y=i.manifest[b].get(v.identHash);(typeof Y=="undefined"||Y.descriptorHash!==v.descriptorHash)&&(i.manifest[b].set(v.identHash,v),this.optional&&(b==="dependencies"?i.manifest.ensureDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0:b==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0)),typeof Y=="undefined"?f.push([i,b,v,a]):h.push([i,b,Y,v]))}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` -`),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};VC.paths=[["add"]],VC.usage=Re.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var Nne=VC;function vYe(r,e,{dev:t,peer:i,preferDev:n,optional:s}){let o=r.manifest[Hr.REGULAR].has(e.identHash),a=r.manifest[Hr.DEVELOPMENT].has(e.identHash),l=r.manifest[Hr.PEER].has(e.identHash);if((t||i)&&o)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!t&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((t||n)&&s)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?Hr.PEER:t||n?Hr.DEVELOPMENT:o?Hr.REGULAR:a?Hr.DEVELOPMENT:Hr.REGULAR}var XC=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);if(await t.restoreInstallState(),this.name){let o=(await Zt.getPackageAccessibleBinaries(i,{project:t})).get(this.name);if(!o)throw new Pe(`Couldn't find a binary named "${this.name}" for package "${P.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} -`),0}return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Zt.getPackageAccessibleBinaries(i,{project:t}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:P.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${P.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};XC.paths=[["bin"]],XC.usage=Re.Usage({description:"get the path to a binary script",details:` - When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. - - When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var Lne=XC;var ZC=class extends Le{constructor(){super(...arguments);this.mirror=J.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=J.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Nt.find(e);return(await Je.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&t.mirrorCwd!==null,s=!this.mirror;n&&(await K.removePromise(t.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await K.removePromise(t.cwd)})).exitCode()}};ZC.paths=[["cache","clean"],["cache","clear"]],ZC.usage=Re.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var Tne=ZC;var One=ge(C0()),fN=ge(require("util")),$C=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=J.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(t)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${t}"`);let s=e.getSpecial(t,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=Se.convertMapsToIndexableObjects(s),a=i?(0,One.default)(o,i):o,l=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} -`),l.exitCode();fN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,fN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} -`)}return l.exitCode()}};$C.paths=[["config","get"]],$C.usage=Re.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. - `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var Mne=$C;var Vse=ge(EN()),Xse=ge(C0()),Zse=ge(_se()),IN=ge(require("util")),tm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String();this.value=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new Pe("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>ye.updateHomeConfiguration(h):h=>ye.updateConfiguration(t(),h))(h=>{if(n){let p=(0,Vse.default)(h);return(0,Zse.default)(p,this.name,o),p}else return te(N({},h),{[i]:o})});let c=(await ye.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=Se.convertMapsToIndexableObjects(c),g=n?(0,Xse.default)(u,n):u;return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{IN.inspect.styles.name="cyan",h.reportInfo(X.UNNAMED,`Successfully set ${this.name} to ${(0,IN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};tm.paths=[["config","set"]],tm.usage=Re.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var $se=tm;var Aoe=ge(EN()),loe=ge(yC()),coe=ge(aoe()),rm=class extends Le{constructor(){super(...arguments);this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>ye.updateHomeConfiguration(l):l=>ye.updateConfiguration(t(),l);return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,loe.default)(u,this.name))return l.reportWarning(X.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Aoe.default)(u):N({},u);return(0,coe.default)(g,this.name),g}),c||l.reportInfo(X.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};rm.paths=[["config","unset"]],rm.usage=Re.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var uoe=rm;var yN=ge(require("util")),im=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=J.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(X.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=Se.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(N({key:s,effective:a,source:l},o))}}else{let n=Se.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,yN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,yN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};im.paths=[["config"]],im.usage=Re.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]});var goe=im;ys();var wN={};ft(wN,{Strategy:()=>Bu,acceptedStrategies:()=>P3e,dedupe:()=>BN});var foe=ge(is()),Bu;(function(e){e.HIGHEST="highest"})(Bu||(Bu={}));var P3e=new Set(Object.values(Bu)),D3e={highest:async(r,e,{resolver:t,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of r.storedResolutions){let c=r.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);Se.getSetWithDefault(o,c.identHash).add(l)}return Array.from(r.storedDescriptors.values(),async a=>{if(e.length&&!foe.default.isMatch(P.stringifyIdent(a),e))return null;let l=r.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=r.originalPackages.get(l);if(typeof c=="undefined"||!t.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(y=>{let b=r.originalPackages.get(y);if(typeof b=="undefined")throw new Error(`Assertion failed: The package (${y}) should have been registered`);return b.reference}),f=await t.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,m=r.originalPackages.get(p);if(typeof m=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:m}})}};async function BN(r,{strategy:e,patterns:t,cache:i,report:n}){let{configuration:s}=r,o=new di,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:r.storedChecksums,fetcher:l,project:r,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:r,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await D3e[e](r,t,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Ji.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(b=>b.then(v=>{if(v===null)return;p++;let{descriptor:x,currentPackage:T,updatedPackage:q}=v;n.reportInfo(X.UNNAMED,`${P.prettyDescriptor(s,x)} can be deduped from ${P.prettyLocator(s,T)} to ${P.prettyLocator(s,q)}`),n.reportJson({descriptor:P.stringifyDescriptor(x),currentResolution:P.stringifyLocator(T),updatedResolution:P.stringifyLocator(q)}),r.storedResolutions.set(x.descriptorHash,q.locatorHash)}).finally(()=>h.tick())));let m;switch(p){case 0:m="No packages";break;case 1:m="One package";break;default:m=`${p} packages`}let y=ae.pretty(s,e,ae.Type.CODE);return n.reportInfo(X.UNNAMED,`${m} can be deduped using the ${y} strategy`),p})}var nm=class extends Le{constructor(){super(...arguments);this.strategy=J.String("-s,--strategy",Bu.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:nn(Bu)});this.check=J.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=await Nt.find(e);await t.restoreInstallState({restoreResolutions:!1});let n=0,s=await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await BN(t,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await t.install({cache:i,report:a,mode:this.mode})})).exitCode()}};nm.paths=[["dedupe"]],nm.usage=Re.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var hoe=nm;var J0=class extends Le{async execute(){let{plugins:e}=await ye.find(this.context.cwd,this.context.plugins),t=[];for(let o of e){let{commands:a}=o[1];if(a){let c=ws.from(a).definitions();t.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=doe()["@yarnpkg/builder"].bundles.standard;for(let o of t){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} -`)}};J0.paths=[["--clipanion=definitions"]];var Coe=J0;var W0=class extends Le{async execute(){this.context.stdout.write(this.cli.usage(null))}};W0.paths=[["help"],["--help"],["-h"]];var moe=W0;var bN=class extends Le{constructor(){super(...arguments);this.leadingArgument=J.String();this.args=J.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!P.tryParseIdent(this.leadingArgument)){let e=k.resolve(this.context.cwd,H.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Eoe=bN;var z0=class extends Le{async execute(){this.context.stdout.write(`${Ur||""} -`)}};z0.paths=[["-v"],["--version"]];var Ioe=z0;var sm=class extends Le{constructor(){super(...arguments);this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);return await t.restoreInstallState(),await Zt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:t})}};sm.paths=[["exec"]],sm.usage=Re.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var yoe=sm;ys();var om=class extends Le{constructor(){super(...arguments);this.hash=J.String({required:!1,validator:fp(gp(),[hp(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return await t.restoreInstallState({restoreResolutions:!1}),await t.applyLightResolution(),typeof this.hash!="undefined"?await R3e(this.hash,t,{stdout:this.context.stdout}):(await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>P.stringifyLocator(t.storedPackages.get(a.subject)),([,a])=>P.stringifyIdent(a.requested)];for(let[a,l]of Se.sortMap(t.peerRequirements,s)){let c=t.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=t.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=ae.pretty(e,a,ae.Type.CODE),h=P.prettyLocator(e,c),p=P.prettyIdent(e,l.requested),m=P.prettyIdent(e,u),y=l.allRequesters.length-1,b=`descendant${y===1?"":"s"}`,v=y>0?` and ${y} ${b}`:"",x=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${x} ${p} to ${m}${v}`)}})).exitCode()}};om.paths=[["explain","peer-requirements"]],om.usage=Re.Usage({description:"explain a set of peer requirements",details:` - A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. - - When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. - - When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. - - **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). - `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var woe=om;async function R3e(r,e,t){let{configuration:i}=e,n=e.peerRequirements.get(r);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${r}"`);return(await Je.start({configuration:i,stdout:t.stdout,includeFooter:!1},async o=>{var b,v;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(b=a.dependencies.get(n.requested.identHash))!=null?b:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(x=>{let T=e.storedPackages.get(x);if(typeof T=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let q=P.devirtualizeLocator(T),Y=e.storedPackages.get(q.locatorHash);if(typeof Y=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let $=Y.peerDependencies.get(n.requested.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:T,peerDependency:$}});if(g!==null){let x=f.every(({peerDependency:T})=>Wt.satisfiesWithPrereleases(g.version,T.range));o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} provides ${P.prettyLocator(i,g)} with version ${P.prettyReference(i,(v=g.version)!=null?v:"")}, which ${x?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} doesn't provide ${P.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ae.mark(i),p=[];for(let{pkg:x,peerDependency:T}of Se.sortMap(f,q=>P.stringifyLocator(q.pkg))){let Y=(g!==null?Wt.satisfiesWithPrereleases(g.version,T.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:P.stringifyLocator(x),prettyLocator:P.prettyLocator(i,x),prettyRange:P.prettyRange(i,T.range),mark:Y})}let m=Math.max(...p.map(({stringifiedLocator:x})=>x.length)),y=Math.max(...p.map(({prettyRange:x})=>x.length));for(let{stringifiedLocator:x,prettyLocator:T,prettyRange:q,mark:Y}of Se.sortMap(p,({stringifiedLocator:$})=>$))o.reportInfo(null,`${T.padEnd(m+(T.length-x.length)," ")} \u2192 ${q.padEnd(y," ")} ${Y}`);p.length>1&&(o.reportSeparator(),o.reportInfo(X.UNNAMED,`Note: these requirements start with ${P.prettyLocator(e.configuration,l)}`))})).exitCode()}ys();var Boe=ge(ri()),am=class extends Le{constructor(){super(...arguments);this.onlyIfNeeded=J.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let t=()=>{if(typeof Ur=="undefined")throw new Pe("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=t();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await Am(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await Am(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^https?:/))i=this.version;else if(this.version.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.version))i=`file://${H.resolve(this.version)}`;else if(Wt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(Wt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(Wt.validRange(this.version))i=`https://repo.yarnpkg.com/${await F3e(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new Pe(`Invalid version descriptor "${this.version}"`);return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,i,Ri.URL)}`),a=await K.readFilePromise(H.toPortablePath(i.slice(o.length)))):(s.reportInfo(X.UNNAMED,`Retrieving ${ae.pretty(e,i,Ri.PATH)}`),a=await ir.get(i,{configuration:e})),await QN(e,null,a,{report:s})})).exitCode()}};am.paths=[["set","version"]],am.usage=Re.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});var boe=am;async function F3e(r,e){let i=(await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0})).tags.filter(n=>Wt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new Pe(`No matching release found for range ${ae.pretty(r,e,ae.Type.RANGE)}.`);return i[0]}async function Am(r,e){let t=await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0});if(!t.latest[e])throw new Pe(`Tag ${ae.pretty(r,e,ae.Type.RANGE)} not found`);return t.latest[e]}async function QN(r,e,t,{report:i}){var g;e===null&&await K.mktempPromise(async f=>{let h=k.join(f,"yarn.cjs");await K.writeFilePromise(h,t);let{stdout:p}=await Nr.execvp(process.execPath,[H.fromPortablePath(h),"--version"],{cwd:f,env:te(N({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!Boe.default.valid(e))throw new Error(`Invalid semver version. ${ae.pretty(r,"yarn --version",ae.Type.CODE)} returned: -${e}`)});let n=(g=r.projectCwd)!=null?g:r.startingCwd,s=k.resolve(n,".yarn/releases"),o=k.resolve(s,`yarn-${e}.cjs`),a=k.relative(r.startingCwd,o),l=k.relative(n,o),c=r.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(X.UNNAMED,`Saving the new release in ${ae.pretty(r,a,"magenta")}`),await K.removePromise(k.dirname(o)),await K.mkdirPromise(k.dirname(o),{recursive:!0}),await K.writeFilePromise(o,t,{mode:493}),u){await ye.updateConfiguration(n,{yarnPath:l});let f=await At.tryFind(n)||new At;f.packageManager=`yarn@${e&&Se.isTaggedYarnVersion(e)?e:await Am(r,"stable")}`;let h={};f.exportTo(h);let p=k.join(n,At.fileName),m=`${JSON.stringify(h,null,f.indent)} -`;await K.changeFilePromise(p,m,{automaticNewlines:!0})}}function Qoe(r){return X[II(r)]}var N3e=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function L3e(r){let t=`https://repo.yarnpkg.com/${Se.isTaggedYarnVersion(Ur)?Ur:await Am(r,"canary")}/packages/gatsby/content/advanced/error-codes.md`,i=await ir.get(t,{configuration:r});return new Map(Array.from(i.toString().matchAll(N3e),({groups:n})=>{if(!n)throw new Error("Assertion failed: Expected the match to have been successful");let s=Qoe(n.code);if(n.name!==s)throw new Error(`Assertion failed: Invalid error code data: Expected "${n.name}" to be named "${s}"`);return[n.code,n.details]}))}var lm=class extends Le{constructor(){super(...arguments);this.code=J.String({required:!1,validator:fp(gp(),[hp(/^YN[0-9]{4}$/)])});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(typeof this.code!="undefined"){let t=Qoe(this.code),i=ae.pretty(e,t,ae.Type.CODE),n=this.cli.format().header(`${this.code} - ${i}`),o=(await L3e(e)).get(this.code),a=typeof o!="undefined"?ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.MARKDOWN,{text:o,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. - -You can help us by editing this page on GitHub \u{1F642}: -${ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} -`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:t,details:a})} -`):this.context.stdout.write(`${n} - -${a} -`)}else{let t={children:Se.mapAndFilter(Object.entries(X),([i,n])=>Number.isNaN(Number(i))?Se.mapAndFilter.skip:{label:_A(Number(i)),value:ae.tuple(ae.Type.CODE,n)})};ls.emitTree(t,{configuration:e,stdout:this.context.stdout,json:this.json})}}};lm.paths=[["explain"]],lm.usage=Re.Usage({description:"explain an error code",details:` - When the code argument is specified, this command prints its name and its details. - - When used without arguments, this command lists all error codes and their names. - `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});var Soe=lm;var voe=ge(is()),cm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=J.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=J.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=J.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=J.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=J.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=J.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i&&!this.all)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(x,{recursive:T})=>{let q=x.anchoredLocator.locatorHash,Y=new Map,$=[q];for(;$.length>0;){let _=$.shift();if(Y.has(_))continue;let ne=t.storedPackages.get(_);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(Y.set(_,ne),P.isVirtualLocator(ne)&&$.push(P.devirtualizeLocator(ne).locatorHash),!(!T&&_!==q))for(let ee of ne.dependencies.values()){let A=t.storedResolutions.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");$.push(A)}}return Y.values()},a=({recursive:x})=>{let T=new Map;for(let q of t.workspaces)for(let Y of o(q,{recursive:x}))T.set(Y.locatorHash,Y);return T.values()},l=({all:x,recursive:T})=>x&&T?t.storedPackages.values():x?a({recursive:T}):o(i,{recursive:T}),c=({all:x,recursive:T})=>{let q=l({all:x,recursive:T}),Y=this.patterns.map(ne=>{let ee=P.parseLocator(ne),A=voe.default.makeRe(P.stringifyIdent(ee)),oe=P.isVirtualLocator(ee),ce=oe?P.devirtualizeLocator(ee):ee;return Z=>{let O=P.stringifyIdent(Z);if(!A.test(O))return!1;if(ee.reference==="unknown")return!0;let L=P.isVirtualLocator(Z),de=L?P.devirtualizeLocator(Z):Z;return!(oe&&L&&ee.reference!==Z.reference||ce.reference!==de.reference)}}),$=Se.sortMap([...q],ne=>P.stringifyLocator(ne));return{selection:$.filter(ne=>Y.length===0||Y.some(ee=>ee(ne))),sortedLookup:$}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new Pe("No package matched your request");let f=new Map;if(this.dependents)for(let x of g)for(let T of x.dependencies.values()){let q=t.storedResolutions.get(T.descriptorHash);if(typeof q=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");Se.getArrayWithDefault(f,q).push(x)}let h=new Map;for(let x of g){if(!P.isVirtualLocator(x))continue;let T=P.devirtualizeLocator(x);Se.getArrayWithDefault(h,T.locatorHash).push(x)}let p={},m={children:p},y=e.makeFetcher(),b={project:t,fetcher:y,cache:n,checksums:t.storedChecksums,report:new di,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},v=[async(x,T,q)=>{var _,ne;if(!T.has("manifest"))return;let Y=await y.fetch(x,b),$;try{$=await At.find(Y.prefixPath,{baseFs:Y.packageFs})}finally{(_=Y.releaseFs)==null||_.call(Y)}q("Manifest",{License:ae.tuple(ae.Type.NO_HINT,$.license),Homepage:ae.tuple(ae.Type.URL,(ne=$.raw.homepage)!=null?ne:null)})},async(x,T,q)=>{var A;if(!T.has("cache"))return;let Y={mockedPackages:t.disabledLocators,unstablePackages:t.conditionalLocators},$=(A=t.storedChecksums.get(x.locatorHash))!=null?A:null,_=n.getLocatorPath(x,$,Y),ne;if(_!==null)try{ne=K.statSync(_)}catch{}let ee=typeof ne!="undefined"?[ne.size,ae.Type.SIZE]:void 0;q("Cache",{Checksum:ae.tuple(ae.Type.NO_HINT,$),Path:ae.tuple(ae.Type.PATH,_),Size:ee})}];for(let x of u){let T=P.isVirtualLocator(x);if(!this.virtuals&&T)continue;let q={},Y={value:[x,ae.Type.LOCATOR],children:q};if(p[P.stringifyLocator(x)]=Y,this.nameOnly){delete Y.children;continue}let $=h.get(x.locatorHash);typeof $!="undefined"&&(q.Instances={label:"Instances",value:ae.tuple(ae.Type.NUMBER,$.length)}),q.Version={label:"Version",value:ae.tuple(ae.Type.NO_HINT,x.version)};let _=(ee,A)=>{let oe={};if(q[ee]=oe,Array.isArray(A))oe.children=A.map(ce=>({value:ce}));else{let ce={};oe.children=ce;for(let[Z,O]of Object.entries(A))typeof O!="undefined"&&(ce[Z]={label:Z,value:O})}};if(!T){for(let ee of v)await ee(x,s,_);await e.triggerHook(ee=>ee.fetchPackageInfo,x,s,_)}x.bin.size>0&&!T&&_("Exported Binaries",[...x.bin.keys()].map(ee=>ae.tuple(ae.Type.PATH,ee)));let ne=f.get(x.locatorHash);typeof ne!="undefined"&&ne.length>0&&_("Dependents",ne.map(ee=>ae.tuple(ae.Type.LOCATOR,ee))),x.dependencies.size>0&&!T&&_("Dependencies",[...x.dependencies.values()].map(ee=>{var ce;let A=t.storedResolutions.get(ee.descriptorHash),oe=typeof A!="undefined"&&(ce=t.storedPackages.get(A))!=null?ce:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:oe})})),x.peerDependencies.size>0&&T&&_("Peer dependencies",[...x.peerDependencies.values()].map(ee=>{var Z,O;let A=x.dependencies.get(ee.identHash),oe=typeof A!="undefined"&&(Z=t.storedResolutions.get(A.descriptorHash))!=null?Z:null,ce=oe!==null&&(O=t.storedPackages.get(oe))!=null?O:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:ce})}))}ls.emitTree(m,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};cm.paths=[["info"]],cm.usage=Re.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var xoe=cm;var _0=ge(Ic());ys();var um=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=J.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=J.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=J.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=J.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.cacheFolder=J.String("--cache-folder",{hidden:!0});this.frozenLockfile=J.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=J.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=J.Boolean("--non-interactive",{hidden:!0});this.preferOffline=J.Boolean("--prefer-offline",{hidden:!0});this.production=J.Boolean("--production",{hidden:!0});this.registry=J.String("--registry",{hidden:!0});this.silent=J.Boolean("--silent",{hidden:!0});this.networkTimeout=J.String("--network-timeout",{hidden:!0})}async execute(){var g;let e=await ye.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let t=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(f,{error:h})=>{let p=await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async m=>{h?m.reportError(X.DEPRECATED_CLI_SETTINGS,f):m.reportWarning(X.DEPRECATED_CLI_SETTINGS,f)});return p.hasErrors()?p.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let f=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.registry!="undefined"){let f=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(f!==null)return f}if(typeof this.preferOffline!="undefined"){let f=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.production!="undefined"){let f=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(f!==null)return f}if(typeof this.nonInteractive!="undefined"){let f=await i("The --non-interactive option is deprecated",{error:!t});if(f!==null)return f}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let f=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!_0.default.NETLIFY});if(f!==null)return f}let n=this.mode===Ci.UpdateLockfile;if(n&&(this.immutable||this.immutableCache))throw new Pe(`${ae.pretty(e,"--immutable",ae.Type.CODE)} and ${ae.pretty(e,"--immutable-cache",ae.Type.CODE)} cannot be used with ${ae.pretty(e,"--mode=update-lockfile",ae.Type.CODE)}`);let s=((g=this.immutable)!=null?g:e.get("enableImmutableInstalls"))&&!n,o=this.immutableCache&&!n;if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{await T3e(e,s)&&(h.reportInfo(X.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let f=e.projectCwd,h;try{h=await K.readFilePromise(k.join(f,kt.lockfile),"utf8")}catch{}if(h==null?void 0:h.includes("yarn lockfile v1")){let p=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async m=>{m.reportInfo(X.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),m.reportSeparator(),e.use("",{nodeLinker:"node-modules"},f,{overwrite:!0}),await ye.updateConfiguration(f,{nodeLinker:"node-modules"})});if(p.hasErrors())return p.exitCode()}}if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{var p;((p=ye.telemetry)==null?void 0:p.isNew)&&(h.reportInfo(X.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),h.reportInfo(X.TELEMETRY_NOTICE,`Run ${ae.pretty(e,"yarn config set --home enableTelemetry 0",ae.Type.CODE)} to disable`),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}let{project:a,workspace:l}=await ze.find(e,this.context.cwd),c=await Nt.find(e,{immutable:o,check:this.checkCache});if(!l)throw new ht(a.cwd,this.context.cwd);return await a.restoreInstallState({restoreResolutions:!1}),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async f=>{await a.install({cache:c,report:f,immutable:s,mode:this.mode})})).exitCode()}};um.paths=[["install"],Re.Default],um.usage=Re.Usage({description:"install the project dependencies",details:` - This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: - - - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). - - - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). - - - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). - - - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. - - Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. - - If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. - - If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). - - If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. - - If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var koe=um,O3e="|||||||",M3e=">>>>>>>",K3e="=======",Poe="<<<<<<<";async function T3e(r,e){if(!r.projectCwd)return!1;let t=k.join(r.projectCwd,r.get("lockfileFilename"));if(!await K.existsPromise(t))return!1;let i=await K.readFilePromise(t,"utf8");if(!i.includes(Poe))return!1;if(e)throw new ct(X.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=U3e(i),o,a;try{o=Si(n),a=Si(s)}catch(c){throw new ct(X.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=N(N({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await K.changeFilePromise(t,Ma(l),{automaticNewlines:!0}),!0}function U3e(r){let e=[[],[]],t=r.split(/\r?\n/g),i=!1;for(;t.length>0;){let n=t.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Poe)){for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===K3e){i=!1;break}else if(i||s.startsWith(O3e)){i=!0;continue}else e[0].push(s)}for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(M3e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` -`),e[1].join(` -`)]}var gm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=J.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=J.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=k.resolve(this.context.cwd,H.toPortablePath(this.destination)),o=await ye.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await ze.find(o,s);if(t.cwd===a.cwd)throw new Pe("Invalid destination; Can't link the project to itself");if(!l)throw new ht(a.cwd,s);let c=t.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new Pe("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new Pe("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=P.stringifyIdent(f.locator),p=this.relative?k.relative(t.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Je.start({configuration:e,stdout:this.context.stdout},async f=>{await t.install({cache:n,report:f})})).exitCode()}};gm.paths=[["link"]],gm.usage=Re.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var Doe=gm;var fm=class extends Le{constructor(){super(...arguments);this.args=J.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};fm.paths=[["node"]],fm.usage=Re.Usage({description:"run node with the hook already setup",details:` - This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - - The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Roe=fm;var Hoe=ge(require("os"));var Noe=ge(require("os"));var H3e="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function bu(r){let e=await ir.get(H3e,{configuration:r});return Si(e.toString())}var hm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await bu(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=Or(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(N({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};hm.paths=[["plugin","list"]],hm.usage=Re.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var Foe=hm;var j3e=/^[0-9]+$/;function Loe(r){return j3e.test(r)?`pull/${r}/head`:r}var G3e=({repository:r,branch:e},t)=>[["git","init",H.fromPortablePath(t)],["git","remote","add","origin",r],["git","fetch","origin","--depth=1",Loe(e)],["git","reset","--hard","FETCH_HEAD"]],Y3e=({branch:r})=>[["git","fetch","origin","--depth=1",Loe(r),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],q3e=({plugins:r,noMinify:e},t)=>[["yarn","build:cli",...new Array().concat(...r.map(i=>["--plugin",k.resolve(t,i)])),...e?["--no-minify"]:[],"|"]],pm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=J.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=J.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Noe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{await vN(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(X.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await dm(q3e(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=k.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await K.readFilePromise(o);await QN(e,"sources",a,{report:s}),this.skipPlugins||await J3e(this,{project:t,report:s,target:i})})).exitCode()}};pm.paths=[["set","version","from","sources"]],pm.usage=Re.Usage({description:"build Yarn from master",details:` - This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]});var Toe=pm;async function dm(r,{configuration:e,context:t,target:i}){for(let[n,...s]of r){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await Nr.pipevp(n,s,{cwd:i,stdin:t.stdin,stdout:t.stdout,stderr:t.stderr,strict:!0});else{t.stdout.write(`${ae.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} -`);try{await Nr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw t.stdout.write(a.stdout||a.stack),a}}}}async function vN(r,{configuration:e,report:t,target:i}){let n=!1;if(!r.force&&K.existsSync(k.join(i,".git"))){t.reportInfo(X.UNNAMED,"Fetching the latest commits"),t.reportSeparator();try{await dm(Y3e(r),{configuration:e,context:r.context,target:i}),n=!0}catch(s){t.reportSeparator(),t.reportWarning(X.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(t.reportInfo(X.UNNAMED,"Cloning the remote repository"),t.reportSeparator(),await K.removePromise(i),await K.mkdirPromise(i,{recursive:!0}),await dm(G3e(r,i),{configuration:e,context:r.context,target:i}))}async function J3e(r,{project:e,report:t,target:i}){let n=await bu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await SN(o,r,{project:e,report:t,target:i})}var Ooe=ge(ri()),Moe=ge(require("url")),Koe=ge(require("vm"));var Cm=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await ze.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.name)){let a=k.resolve(this.context.cwd,H.toPortablePath(this.name));i.reportInfo(X.UNNAMED,`Reading ${ae.pretty(e,a,ae.Type.PATH)}`),s=k.relative(n.cwd,a),o=await K.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new Moe.URL(this.name)}catch{throw new ct(X.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=P.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!Ooe.default.valid(l.reference))throw new ct(X.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=P.stringifyIdent(l),u=await bu(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Ur!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Ur}/`))}i.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,a,"green")}`),o=await ir.get(a,{configuration:e})}await xN(s,o,{project:n,report:i})})).exitCode()}};Cm.paths=[["plugin","import"]],Cm.usage=Re.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). - `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var Uoe=Cm;async function xN(r,e,{project:t,report:i}){let{configuration:n}=t,s={},o={exports:s};(0,Koe.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=k.resolve(t.cwd,l);i.reportInfo(X.UNNAMED,`Saving the new plugin in ${ae.pretty(n,l,"magenta")}`),await K.mkdirPromise(k.dirname(c),{recursive:!0}),await K.writeFilePromise(c,e);let u={path:l,spec:r};await ye.updateConfiguration(t.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let m=typeof p!="string"?p.path:p,y=k.resolve(t.cwd,H.toPortablePath(m)),{name:b}=Se.dynamicRequire(y);b!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),te(N({},g),{plugins:f})})}var W3e=({pluginName:r,noMinify:e},t)=>[["yarn",`build:${r}`,...e?["--no-minify"]:[],"|"]],mm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Hoe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await ze.find(e,this.context.cwd),o=P.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=P.stringifyIdent(o),l=await bu(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await vN(this,{configuration:e,report:n,target:t}),await SN(c,this,{project:s,report:n,target:t})})).exitCode()}};mm.paths=[["plugin","import","from","sources"]],mm.usage=Re.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var joe=mm;async function SN(r,{context:e,noMinify:t},{project:i,report:n,target:s}){let o=r.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(X.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await dm(W3e({pluginName:o,noMinify:t},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=k.resolve(s,`packages/${o}/bundles/${r}.js`),c=await K.readFilePromise(l);await xN(r,c,{project:i,report:n})}var Em=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=P.parseIdent(s);if(!e.plugins.has(s))throw new Pe(`${P.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=k.resolve(t.cwd,a);K.existsSync(l)&&(n.reportInfo(X.UNNAMED,`Removing ${ae.pretty(e,a,ae.Type.PATH)}...`),await K.removePromise(l)),n.reportInfo(X.UNNAMED,"Updating the configuration..."),await ye.updateConfiguration(t.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:te(N({},c),{plugins:u})})})).exitCode()}};Em.paths=[["plugin","remove"]],Em.usage=Re.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. - `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var Goe=Em;var Im=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};Im.paths=[["plugin","runtime"]],Im.usage=Re.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var Yoe=Im;var ym=class extends Le{constructor(){super(...arguments);this.idents=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(P.parseIdent(a).identHash);if(await t.restoreInstallState({restoreResolutions:!1}),await t.resolveEverything({cache:n,report:new di}),s.size>0)for(let a of t.storedPackages.values())s.has(a.identHash)&&t.storedBuildState.delete(a.locatorHash);else t.storedBuildState.clear();return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await t.install({cache:n,report:a})})).exitCode()}};ym.paths=[["rebuild"]],ym.usage=Re.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). - - By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var qoe=ym;var kN=ge(is());ys();var wm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=this.all?t.workspaces:[i],o=[Hr.REGULAR,Hr.DEVELOPMENT,Hr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,m=P.parseIdent(h);for(let y of s){let b=[...y.manifest.peerDependenciesMeta.keys()];for(let v of(0,kN.default)(b,h))y.manifest.peerDependenciesMeta.delete(v),l=!0,p=!0;for(let v of o){let x=y.manifest.getForScope(v),T=[...x.values()].map(q=>P.stringifyIdent(q));for(let q of(0,kN.default)(T,P.stringifyIdent(m))){let{identHash:Y}=P.parseIdent(q),$=x.get(Y);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");y.manifest[v].delete(Y),c.push([y,v,$]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new Pe(`${u} ${ae.prettyList(e,a,Ri.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Je.start({configuration:e,stdout:this.context.stdout},async p=>{await t.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};wm.paths=[["remove"]],wm.usage=Re.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. - `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var Joe=wm;var Woe=ge(require("util")),V0=class extends Le{async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=Se.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,Woe.inspect)(g,l)}`)})).exitCode()}};V0.paths=[["run"]];var zoe=V0;var Bm=class extends Le{constructor(){super(...arguments);this.inspect=J.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=J.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=J.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=J.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=J.Boolean("--silent",{hidden:!0});this.scriptName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i,locator:n}=await ze.find(e,this.context.cwd);await t.restoreInstallState();let s=this.topLevel?t.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Zt.hasPackageScript(s,this.scriptName,{project:t}))return await Zt.executePackageScript(s,this.scriptName,this.args,{project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Zt.getPackageAccessibleBinaries(s,{project:t});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Zt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(t.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Zt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new Pe("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Lf)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new Pe(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new Pe(`Couldn't find a script named "${this.scriptName}".`)}}};Bm.paths=[["run"]],Bm.usage=Re.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. - - Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). - `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var _oe=Bm;var bm=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=J.String();this.resolution=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(await t.restoreInstallState({restoreResolutions:!1}),!i)throw new ht(t.cwd,this.context.cwd);let s=P.parseDescriptor(this.descriptor,!0),o=P.makeDescriptor(s,this.resolution);return t.storedDescriptors.set(s.descriptorHash,s),t.storedDescriptors.set(o.descriptorHash,o),t.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};bm.paths=[["set","resolution"]],bm.usage=Re.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var Voe=bm;var Xoe=ge(is()),Qm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=t.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=k.resolve(this.context.cwd,H.toPortablePath(l));if(Se.isPathLike(l)){let u=await ye.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await ze.find(u,c);if(!f)throw new ht(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(P.stringifyIdent(h.locator));if(o.size===0)throw new Pe("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be unlinked");o.add(P.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,Xoe.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};Qm.paths=[["unlink"]],Qm.usage=Re.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var Zoe=Qm;var $oe=ge(WC()),PN=ge(is());ys();var th=class extends Le{constructor(){super(...arguments);this.interactive=J.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=[...t.storedDescriptors.values()],o=s.map(u=>P.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(P.parseDescriptor(u).range!=="unknown")throw new Pe("Ranges aren't allowed when using --recursive");for(let g of(0,PN.default)(o,u)){let f=P.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)t.storedDescriptors.delete(u.descriptorHash),t.storedResolutions.delete(u.descriptorHash);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{await t.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=s?[Vr.KEEP,Vr.REUSE,Vr.PROJECT,Vr.LATEST]:[Vr.PROJECT,Vr.LATEST],l=[],c=[];for(let y of this.patterns){let b=!1,v=P.parseDescriptor(y);for(let x of t.workspaces)for(let T of[Hr.REGULAR,Hr.DEVELOPMENT]){let Y=[...x.manifest.getForScope(T).values()].map($=>P.stringifyIdent($));for(let $ of(0,PN.default)(Y,P.stringifyIdent(v))){let _=P.parseIdent($),ne=x.manifest[T].get(_.identHash);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let ee=P.makeDescriptor(_,v.range);l.push(Promise.resolve().then(async()=>[x,T,ne,await _C(ee,{project:t,workspace:x,cache:n,target:T,modifier:o,strategies:a})])),b=!0}}b||c.push(y)}if(c.length>1)throw new Pe(`Patterns ${ae.prettyList(e,c,Ri.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new Pe(`Pattern ${ae.prettyList(e,c,Ri.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[,,b,{suggestions:v,rejections:x}]of u){let T=v.filter(q=>q.descriptor!==null);if(T.length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let Y=this.cli.error(q);t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range - -${Y}`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${Y}`)}else T.length>1&&!s&&y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[y,b,,{suggestions:v}]of u){let x,T=v.filter(_=>_.descriptor!==null),q=T[0].descriptor,Y=T.every(_=>P.areDescriptorsEqual(_.descriptor,q));T.length===1||Y?x=q:(f=!0,{answer:x}=await(0,$oe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${P.prettyWorkspace(e,y)} \u276F ${b}?`,choices:v.map(({descriptor:_,name:ne,reason:ee})=>_?{name:ne,hint:ee,descriptor:_}:{name:ne,hint:ee,disabled:!0}),onCancel:()=>process.exit(130),result(_){return this.find(_,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let $=y.manifest[b].get(x.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if($.descriptorHash!==x.descriptorHash)y.manifest[b].set(x.identHash,x),h.push([y,b,$,x]);else{let _=e.makeResolver(),ne={project:t,resolver:_},ee=_.bindDescriptor($,y.anchoredLocator,ne);t.forgetResolution(ee)}}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` -`),(await Je.start({configuration:e,stdout:this.context.stdout},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};th.paths=[["up"]],th.usage=Re.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),th.schema=[eS("recursive",Bc.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var eae=th;var Sm=class extends Le{constructor(){super(...arguments);this.recursive=J.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=J.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=P.parseIdent(this.package).identHash,s=this.recursive?_3e(t,n,{configuration:e,peers:this.peers}):z3e(t,n,{configuration:e,peers:this.peers});ls.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};Sm.paths=[["why"]],Sm.usage=Re.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var tae=Sm;function z3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.storedPackages.values(),a=>P.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=r.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=r.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=P.stringifyLocator(a);s[p]={value:[a,ae.Type.LOCATOR],children:l}}let h=P.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ae.Type.DEPENDENT]}}}return o}function _3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.workspaces,f=>P.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let m=r.storedResolutions.get(p.descriptorHash);if(!m)throw new Error("Assertion failed: The resolution should have been registered");let y=r.storedPackages.get(m);if(!y)throw new Error("Assertion failed: The package should have been registered");a(y)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let m=p!==null?ae.tuple(ae.Type.DEPENDENT,{locator:f,descriptor:p}):ae.tuple(ae.Type.LOCATOR,f),y={},b={value:m,children:y},v=P.stringifyLocator(f);if(h[v]=b,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&r.tryWorkspaceByLocator(f))))for(let x of f.dependencies.values()){if(!i&&f.peerDependencies.has(x.identHash))continue;let T=r.storedResolutions.get(x.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let q=r.storedPackages.get(T);if(!q)throw new Error("Assertion failed: The package should have been registered");g(q,y,x)}};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var jN={};ft(jN,{default:()=>dWe,gitUtils:()=>Qu});var Qu={};ft(Qu,{TreeishProtocols:()=>On,clone:()=>KN,fetchBase:()=>wae,fetchChangedFiles:()=>Bae,fetchChangedWorkspaces:()=>hWe,fetchRoot:()=>yae,isGitUrl:()=>ih,lsRemote:()=>Iae,normalizeLocator:()=>TN,normalizeRepoUrl:()=>vm,resolveUrl:()=>MN,splitRepoUrl:()=>xm});var NN=ge(dae()),Cae=ge(Zw()),rh=ge(require("querystring")),LN=ge(ri()),mae=ge(require("url"));function Eae(){return te(N({},process.env),{GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`})}var fWe=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],On;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(On||(On={}));function ih(r){return r?fWe.some(e=>!!r.match(e)):!1}function xm(r){r=vm(r);let e=r.indexOf("#");if(e===-1)return{repo:r,treeish:{protocol:On.Head,request:"HEAD"},extra:{}};let t=r.slice(0,e),i=r.slice(e+1);if(i.match(/^[a-z]+=/)){let n=rh.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(On).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=On.Head,a="HEAD");for(let l of Object.values(On))delete n[l];return{repo:t,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:t,treeish:{protocol:s,request:o},extra:{}}}}function vm(r,{git:e=!1}={}){var t;if(r=r.replace(/^git\+https:/,"https:"),r=r.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),r=r.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){r=r.replace(/^git\+([^:]+):/,"$1:");let i;try{i=mae.default.parse(r)}catch{i=null}i&&i.protocol==="ssh:"&&((t=i.path)==null?void 0:t.startsWith("/:"))&&(r=r.replace(/^ssh:\/\//,""))}return r}function TN(r){return P.makeLocator(r,vm(r.reference))}async function Iae(r,e){let t=vm(r,{git:!0});if(!ir.getNetworkSettings(`https://${(0,NN.default)(t).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${t}' has been blocked because of your configuration settings`);let n=await ON("listing refs",["ls-remote",t],{cwd:e.startingCwd,env:Eae()},{configuration:e,normalizedRepoUrl:t}),s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function MN(r,e){let{repo:t,treeish:{protocol:i,request:n},extra:s}=xm(r),o=await Iae(t,e),a=(c,u)=>{switch(c){case On.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return rh.default.stringify(te(N({},s),{commit:u}))}case On.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Semver:{let g=Wt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,m])=>[LN.default.parse(p.slice(10)),m]).filter(p=>p[0]!==null)),h=LN.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return rh.default.stringify(te(N({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(On.Commit,u))!==null||(g=l(On.Tag,u))!==null||(g=l(On.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${t}#${a(i,n)}`}async function KN(r,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:t,treeish:{protocol:i,request:n}}=xm(r);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=vm(t,{git:!0});if(ir.getNetworkSettings(`https://${(0,NN.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await K.mktempPromise(),a={cwd:o,env:Eae()};return await ON("cloning the repository",["clone","-c core.autocrlf=false",s,H.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await ON("switching branch",["checkout",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function yae(r){let e=null,t,i=r;do t=i,await K.existsPromise(k.join(t,".git"))&&(e=t),i=k.dirname(t);while(e===null&&i!==t);return e}async function wae(r,{baseRefs:e}){if(e.length===0)throw new Pe("Can't run this command with zero base refs specified.");let t=[];for(let a of e){let{code:l}=await Nr.execvp("git",["merge-base",a,"HEAD"],{cwd:r});l===0&&t.push(a)}if(t.length===0)throw new Pe(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await Nr.execvp("git",["merge-base","HEAD",...t],{cwd:r,strict:!0}),n=i.trim(),{stdout:s}=await Nr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:r,strict:!0}),o=s.trim();return{hash:n,title:o}}async function Bae(r,{base:e,project:t}){let i=Se.buildIgnorePattern(t.configuration.get("changesetIgnorePatterns")),{stdout:n}=await Nr.execvp("git",["diff","--name-only",`${e}`],{cwd:r,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),{stdout:o}=await Nr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:r,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!k.relative(t.cwd,c).match(i)):l}async function hWe({ref:r,project:e}){if(e.configuration.projectCwd===null)throw new Pe("This command can only be run from within a Yarn project");let t=[k.resolve(e.cwd,e.configuration.get("cacheFolder")),k.resolve(e.cwd,e.configuration.get("installStatePath")),k.resolve(e.cwd,e.configuration.get("lockfileFilename")),k.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&t.push(o)});let i=await yae(e.configuration.projectCwd);if(i==null)throw new Pe("This command can only be run on Git repositories");let n=await wae(i,{baseRefs:typeof r=="string"?[r]:e.configuration.get("changesetBaseRefs")}),s=await Bae(i,{base:n.hash,project:e});return new Set(Se.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?Se.mapAndFilter.skip:t.some(l=>o.startsWith(l))?Se.mapAndFilter.skip:a}))}async function ON(r,e,t,{configuration:i,normalizedRepoUrl:n}){try{return await Nr.execvp("git",e,te(N({},t),{strict:!0}))}catch(s){if(!(s instanceof Nr.ExecError))throw s;let o=s.reportExtra,a=s.stderr.toString();throw new ct(X.EXCEPTION,`Failed ${r}`,l=>{l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:"Repository URL",value:ae.tuple(ae.Type.URL,n)})}`);for(let c of a.matchAll(/^(.+?): (.*)$/gm)){let[,u,g]=c;u=u.toLowerCase();let f=u==="error"?"Error":`${(0,Cae.default)(u)} Error`;l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:f,value:ae.tuple(ae.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var UN=class{supports(e,t){return ih(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,n=TN(e),s=new Map(t.checksums);s.set(n.locatorHash,i);let o=te(N({},t),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:P.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,t){return t.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){let i=await KN(e.reference,t.project.configuration),n=xm(e.reference),s=k.join(i,"package.tgz");await Zt.prepareExternalProject(i,s,{configuration:t.project.configuration,report:t.report,workspace:n.extra.workspace,locator:e});let o=await K.readFilePromise(s);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(o,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}))}};var HN=class{supportsDescriptor(e,t){return ih(e.range)}supportsLocator(e,t){return ih(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=await MN(e.range,i.project.configuration);return[P.makeLocator(e,n)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var pWe={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:Ie.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:Ie.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:Ie.NUMBER,default:2}},fetchers:[UN],resolvers:[HN]};var dWe=pWe;var km=class extends Le{constructor(){super(...arguments);this.since=J.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=J.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Qu.fetchChangedWorkspaces({ref:this.since,project:t}):t.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of At.hardDependencies)for(let[h,p]of l.getForScope(f)){let m=t.tryWorkspaceByDescriptor(p);m===null?t.workspacesByIdent.has(h)&&g.add(p):u.add(m)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>P.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(N({location:a.relativeCwd,name:l.name?P.stringifyIdent(l.name):null},c))}})).exitCode()}};km.paths=[["workspaces","list"]],km.usage=Re.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var bae=km;var Pm=class extends Le{constructor(){super(...arguments);this.workspaceName=J.String();this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=t.workspaces,s=new Map(n.map(a=>{let l=P.convertToIdent(a.locator);return[P.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new Pe(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${a.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};Pm.paths=[["workspace"]],Pm.usage=Re.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var Qae=Pm;var CWe={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:Ie.BOOLEAN,default:Sae.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:Ie.STRING,values:["^","~",""],default:pa.CARET}},commands:[Tne,Mne,$se,uoe,Voe,Toe,boe,bae,Coe,moe,Eoe,Ioe,Nne,Lne,goe,hoe,yoe,woe,Soe,xoe,koe,Doe,Zoe,Roe,joe,Uoe,Goe,Foe,Yoe,qoe,Joe,zoe,_oe,eae,tae,Qae]},mWe=CWe;var zN={};ft(zN,{default:()=>IWe});var Ge={optional:!0},YN=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Ge}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Ge,["postcss-jsx"]:Ge,["postcss-less"]:Ge,["postcss-markdown"]:Ge,["postcss-scss"]:Ge}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Ge}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Ge}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Ge,"vue-template-compiler":Ge}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Ge,"utf-8-validate":Ge}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge,"vuetify-loader":Ge}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Ge}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Ge}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:Ge}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Ge,tinyliquid:Ge,"liquid-node":Ge,jade:Ge,"then-jade":Ge,dust:Ge,"dustjs-helpers":Ge,"dustjs-linkedin":Ge,swig:Ge,"swig-templates":Ge,"razor-tmpl":Ge,atpl:Ge,liquor:Ge,twig:Ge,ejs:Ge,eco:Ge,jazz:Ge,jqtpl:Ge,hamljs:Ge,hamlet:Ge,whiskers:Ge,"haml-coffee":Ge,"hogan.js":Ge,templayed:Ge,handlebars:Ge,underscore:Ge,lodash:Ge,pug:Ge,"then-pug":Ge,qejs:Ge,walrus:Ge,mustache:Ge,just:Ge,ect:Ge,mote:Ge,toffee:Ge,dot:Ge,"bracket-template":Ge,ractive:Ge,nunjucks:Ge,htmling:Ge,"babel-core":Ge,plates:Ge,"react-dom":Ge,react:Ge,"arc-templates":Ge,vash:Ge,slm:Ge,marko:Ge,teacup:Ge,"coffee-script":Ge,squirrelly:Ge,twing:Ge}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge,vue:Ge}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Ge}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Ge}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(r=>[r,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Ge,"webpack-command":Ge}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Ge}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Ge}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:Ge,jimp:Ge}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":Ge,"eslint-import-resolver-typescript":Ge,"eslint-import-resolver-webpack":Ge,"@typescript-eslint/parser":Ge}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":Ge}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":Ge}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.0"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:Ge}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:Ge}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@*",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{["vue-template-compiler"]:"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["parcel@*",{peerDependenciesMeta:{["@parcel/core"]:Ge}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@*",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:{optional:!0}}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}]];var qN;function vae(){return typeof qN=="undefined"&&(qN=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),qN}var JN;function xae(){return typeof JN=="undefined"&&(JN=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),JN}var WN;function kae(){return typeof WN=="undefined"&&(WN=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),WN}var Pae=new Map([[P.makeIdent(null,"fsevents").identHash,vae],[P.makeIdent(null,"resolve").identHash,xae],[P.makeIdent(null,"typescript").identHash,kae]]),EWe={hooks:{registerPackageExtensions:async(r,e)=>{for(let[t,i]of YN)e(P.parseDescriptor(t,!0),i)},getBuiltinPatch:async(r,e)=>{var s;let t="compat/";if(!e.startsWith(t))return;let i=P.parseIdent(e.slice(t.length)),n=(s=Pae.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(r,e,t,i)=>typeof Pae.get(r.identHash)=="undefined"?r:P.makeDescriptor(r,P.makeRange({protocol:"patch:",source:P.stringifyDescriptor(r),selector:`~builtin`,params:null}))}},IWe=EWe;var _N={};ft(_N,{default:()=>wWe});var X0=class extends Le{constructor(){super(...arguments);this.pkg=J.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let t=P.parseDescriptor(this.command),i;t.scope?i=P.makeIdent(t.scope,`create-${t.name}`):t.name.startsWith("@")?i=P.makeIdent(t.name.substring(1),"create"):i=P.makeIdent(null,`create-${t.name}`);let n=P.stringifyIdent(i);return t.range!=="unknown"&&(n+=`@${t.range}`),this.cli.run(["dlx",...e,n,...this.args])}};X0.paths=[["create"]];var Dae=X0;var Dm=class extends Le{constructor(){super(...arguments);this.packages=J.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){return ye.telemetry=null,await K.mktempPromise(async e=>{var p;let t=k.join(e,`dlx-${process.pid}`);await K.mkdirPromise(t),await K.writeFilePromise(k.join(t,"package.json"),`{} -`),await K.writeFilePromise(k.join(t,"yarn.lock"),"");let i=k.join(t,".yarnrc.yml"),n=await ye.findProjectCwd(this.context.cwd,kt.lockfile),s=!(await ye.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?k.join(n,".yarnrc.yml"):null;o!==null&&K.existsSync(o)?(await K.copyFilePromise(o,i),await ye.updateConfiguration(t,m=>{let y=te(N({},m),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(m.plugins)&&(y.plugins=m.plugins.map(b=>{let v=typeof b=="string"?b:b.path,x=H.isAbsolute(v)?v:H.resolve(H.fromPortablePath(n),v);return typeof b=="string"?x:{path:x,spec:b.spec}})),y})):await K.writeFilePromise(i,`enableGlobalCache: ${s} -enableTelemetry: false -`);let a=(p=this.packages)!=null?p:[this.command],l=P.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:t,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` -`);let u=await ye.find(t,this.context.plugins),{project:g,workspace:f}=await ze.find(u,t);if(f===null)throw new ht(g.cwd,t);await g.restoreInstallState();let h=await Zt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Zt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Dm.paths=[["dlx"]],Dm.usage=Re.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var Rae=Dm;var yWe={commands:[Dae,Rae]},wWe=yWe;var nL={};ft(nL,{default:()=>QWe,fileUtils:()=>VN});var nh=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,Rm=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Xr="file:";var VN={};ft(VN,{makeArchiveFromLocator:()=>Z0,makeBufferFromLocator:()=>$N,makeLocator:()=>ZN,makeSpec:()=>Fae,parseSpec:()=>XN});function XN(r){let{params:e,selector:t}=P.parseRange(r),i=H.toPortablePath(t);return{parentLocator:e&&typeof e.locator=="string"?P.parseLocator(e.locator):null,path:i}}function Fae({parentLocator:r,path:e,folderHash:t,protocol:i}){let n=r!==null?{locator:P.stringifyLocator(r)}:{},s=typeof t!="undefined"?{hash:t}:{};return P.makeRange({protocol:i,source:e,selector:e,params:N(N({},s),n)})}function ZN(r,{parentLocator:e,path:t,folderHash:i,protocol:n}){return P.makeLocator(r,Fae({parentLocator:e,path:t,folderHash:i,protocol:n}))}async function Z0(r,{protocol:e,fetchOptions:t,inMemory:i=!1}){let{parentLocator:n,path:s}=P.parseFileStyleRange(r.reference,{protocol:e}),o=k.isAbsolute(s)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(n,t),a=o.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=k.join(a.prefixPath,s);return await Se.releaseAfterUseAsync(async()=>await Bi.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:P.getIdentVendorPath(r),compressionLevel:t.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function $N(r,{protocol:e,fetchOptions:t}){return(await Z0(r,{protocol:e,fetchOptions:t,inMemory:!0})).getBufferAndClose()}var eL=class{supports(e,t){return!!e.reference.startsWith(Xr)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async fetchFromDisk(e,t){return Z0(e,{protocol:Xr,fetchOptions:t})}};var BWe=2,tL=class{supportsDescriptor(e,t){return e.range.match(nh)?!0:!!e.range.startsWith(Xr)}supportsLocator(e,t){return!!e.reference.startsWith(Xr)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=XN(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await $N(P.makeLocator(e,P.makeRange({protocol:Xr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:Xr,fetchOptions:i.fetchOptions}),a=Dn.makeHash(`${BWe}`,o).slice(0,6);return[ZN(e,{parentLocator:s,path:n,folderHash:a,protocol:Xr})]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var rL=class{supports(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.join(o.prefixPath,n),c=await a.readFilePromise(l);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(c,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var iL=class{supportsDescriptor(e,t){return Rm.test(e.range)?!!(e.range.startsWith(Xr)||nh.test(e.range)):!1}supportsLocator(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range;return n.startsWith(Xr)&&(n=n.slice(Xr.length)),[P.makeLocator(e,`${Xr}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var bWe={fetchers:[rL,eL],resolvers:[iL,tL]},QWe=bWe;var oL={};ft(oL,{default:()=>xWe});var Nae=ge(require("querystring")),Lae=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function Tae(r){return r?Lae.some(e=>!!r.match(e)):!1}function Oae(r){let e;for(let a of Lae)if(e=r.match(a),e)break;if(!e)throw new Error(SWe(r));let[,t,i,n,s="master"]=e,{commit:o}=Nae.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:t,username:i,reponame:n,treeish:s}}function SWe(r){return`Input cannot be parsed as a valid GitHub URL ('${r}').`}var sL=class{supports(e,t){return!!Tae(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await K.mktempPromise(async n=>{let s=new _t(n);await Bi.extractArchiveTo(i,s,{stripComponents:1});let o=Qu.splitRepoUrl(e.reference),a=k.join(n,"package.tgz");await Zt.prepareExternalProject(n,a,{configuration:t.project.configuration,report:t.report,workspace:o.extra.workspace,locator:e});let l=await K.readFilePromise(a);return await Bi.convertToZip(l,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){let{auth:i,username:n,reponame:s,treeish:o}=Oae(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var vWe={hooks:{async fetchHostedRepository(r,e,t){if(r!==null)return r;let i=new sL;if(!i.supports(e,t))return null;try{return await i.fetch(e,t)}catch(n){return null}}}},xWe=vWe;var lL={};ft(lL,{default:()=>PWe});var Fm=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,Nm=/^https?:/;var aL=class{supports(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(e.reference,{configuration:t.project.configuration});return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var AL=class{supportsDescriptor(e,t){return Fm.test(e.range)?!!Nm.test(e.range):!1}supportsLocator(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[P.convertDescriptorToLocator(e)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var kWe={fetchers:[aL],resolvers:[AL]},PWe=kWe;var fL={};ft(fL,{default:()=>D4e});var cAe=ge(lAe()),gL=ge(require("util")),Lm=class extends Le{constructor(){super(...arguments);this.private=J.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=J.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=J.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=J.Boolean("-2",!1,{hidden:!0});this.yes=J.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=J.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return t!==null?await this.executeProxy(e,t):await this.executeRegular(e)}async executeProxy(e,t){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new Pe("Cannot use the --install flag from within a project subdirectory");K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=k.join(this.context.cwd,e.get("lockfileFilename"));K.existsSync(i)||await K.writeFilePromise(i,"");let n=await this.cli.run(["set","version",t],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await K.mktempPromise(async o=>{let{code:a}=await Nr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Zt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let t=null;try{t=(await ze.find(e,this.context.cwd)).project}catch{t=null}K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=await At.tryFind(this.context.cwd)||new At,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:P.makeIdent(e.get("initScope"),k.basename(this.context.cwd)),i.packageManager=Ur&&Se.isTaggedYarnVersion(Ur)?`yarn@${Ur}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await K.mkdirPromise(k.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),gL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,gL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} -`);let o=k.join(this.context.cwd,At.fileName);await K.changeFilePromise(o,`${JSON.stringify(s,null,2)} -`,{automaticNewlines:!0});let a=k.join(this.context.cwd,"README.md");if(K.existsSync(a)||await K.writeFilePromise(a,`# ${P.stringifyIdent(i.name)} -`),!t||t.cwd===this.context.cwd){let c=k.join(this.context.cwd,kt.lockfile);K.existsSync(c)||await K.writeFilePromise(c,"");let g=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!.yarn/cache","#.pnp.*"].map(y=>`${y} -`).join(""),f=k.join(this.context.cwd,".gitignore");K.existsSync(f)||await K.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,cAe.default)(h,e.get("initEditorConfig"));let p=`root = true -`;for(let[y,b]of Object.entries(h)){p+=` -[${y}] -`;for(let[v,x]of Object.entries(b))p+=`${v.replace(/[A-Z]/g,q=>`_${q.toLowerCase()}`)} = ${x} -`}let m=k.join(this.context.cwd,".editorconfig");K.existsSync(m)||await K.writeFilePromise(m,p),K.existsSync(k.join(this.context.cwd,".git"))||await Nr.execvp("git",["init"],{cwd:this.context.cwd})}}};Lm.paths=[["init"]],Lm.usage=Re.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var uAe=Lm;var P4e={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:Ie.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}}},commands:[uAe]},D4e=P4e;var mL={};ft(mL,{default:()=>F4e});var wA="portal:",BA="link:";var hL=class{supports(e,t){return!!e.reference.startsWith(wA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot}}};var pL=class{supportsDescriptor(e,t){return!!e.range.startsWith(wA)}supportsLocator(e,t){return!!e.reference.startsWith(wA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(wA.length);return[P.makeLocator(e,`${wA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var dL=class{supports(e,t){return!!e.reference.startsWith(BA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0}}};var CL=class{supportsDescriptor(e,t){return!!e.range.startsWith(BA)}supportsLocator(e,t){return!!e.reference.startsWith(BA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(BA.length);return[P.makeLocator(e,`${BA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){return te(N({},e),{version:"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var R4e={fetchers:[dL,hL],resolvers:[CL,pL]},F4e=R4e;var JL={};ft(JL,{default:()=>j8e});var Mn;(function(i){i[i.REGULAR=0]="REGULAR",i[i.WORKSPACE=1]="WORKSPACE",i[i.EXTERNAL_SOFT_LINK=2]="EXTERNAL_SOFT_LINK"})(Mn||(Mn={}));var bA;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(bA||(bA={}));var EL=(r,e)=>`${r}@${e}`,gAe=(r,e)=>{let t=e.indexOf("#"),i=t>=0?e.substring(t+1):e;return EL(r,i)},yo;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(yo||(yo={}));var hAe=(r,e={})=>{let t=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||t>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:t,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=N4e(r,s),l=!1,c=0;do l=IL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=Tm(a);if(IL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${u}, next tree: -${Tm(a)}`);let f=fAe(a);if(f)throw new Error(`${f}, after hoisting finished: -${Tm(a)}`)}return s.debugLevel>=2&&console.log(Tm(a)),L4e(a)},T4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())t.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),t},O4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of r)u=g.dependencies.get(c.name),u&&t.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),t},pAe=(r,e)=>{if(e.decoupled)return e;let{name:t,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:p,hoistedTo:m}=e,y={name:t,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:new Map(p),hoistedTo:new Map(m)},b=y.dependencies.get(t);return b&&b.ident==y.ident&&y.dependencies.set(t,y),r.dependencies.set(y.name,y),y},M4e=(r,e)=>{let t=new Map([[r.name,[r.ident]]]);for(let n of r.dependencies.values())r.peerNames.has(n.name)||t.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!r.peerNames.has(s)){let a=t.get(s);a||(a=[],t.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return t},yL=r=>{let e=new Set,t=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!r.peerNames.has(s)){let o=r.dependencies.get(s);o&&!e.has(o)&&t(o,n)}e.add(i)}};for(let i of r.dependencies.values())r.peerNames.has(i.name)||t(i);return e},IL=(r,e,t,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=U4e(o),l=M4e(o,a),c=r==o?new Map:n.fastLookupPossible?T4e(e):O4e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([m,y])=>[m,y[0]])),p=new Map;do{let m=K4e(r,e,t,c,h,l,i,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),u=!1;for(let[y,b]of l)b.length>1&&!o.dependencies.has(y)&&(h.delete(y),b.shift(),h.set(y,b[0]),u=!0)}while(u);for(let m of o.dependencies.values())if(!o.peerNames.has(m.name)&&!t.has(m.locator)){t.add(m.locator);let y=IL(r,[...e,m],t,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),t.delete(m.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},H4e=r=>{for(let[e,t]of r.dependencies)if(!r.peerNames.has(e)&&t.ident!==r.ident)return!0;return!1},j4e=(r,e,t,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(y=>Li(y)).join("\u2192")}`);let h=t[t.length-1],m=!(i.ident===h.ident);if(l&&!m&&(g="- self-reference"),m&&(m=i.dependencyKind!==1,l&&!m&&(g="- workspace")),m&&i.dependencyKind===2&&(m=!H4e(i),l&&!m&&(g="- external soft link with unhoisted dependencies")),m&&(m=h.dependencyKind!==1||h.hoistedFrom.has(i.name)||e.size===1,l&&!m&&(g=h.reasons.get(i.name))),m&&(m=!r.peerNames.has(i.name),l&&!m&&(g=`- cannot shadow peer: ${Li(r.originalDependencies.get(i.name).locator)} at ${u}`)),m){let y=!1,b=n.get(i.name);if(y=!b||b.ident===i.ident,l&&!y&&(g=`- filled by: ${Li(b.locator)} at ${u}`),y)for(let v=t.length-1;v>=1;v--){let T=t[v].dependencies.get(i.name);if(T&&T.ident!==i.ident){y=!1;let q=a.get(h);q||(q=new Set,a.set(h,q)),q.add(i.name),l&&(g=`- filled by ${Li(T.locator)} at ${t.slice(0,v).map(Y=>Li(Y.locator)).join("\u2192")}`);break}}m=y}if(m&&(m=s.get(i.name)===i.ident,l&&!m&&(g=`- filled by: ${Li(o.get(i.name)[0])} at ${u}`)),m){let y=!0,b=new Set(i.peerNames);for(let v=t.length-1;v>=1;v--){let x=t[v];for(let T of b){if(x.peerNames.has(T)&&x.originalDependencies.has(T))continue;let q=x.dependencies.get(T);q&&r.dependencies.get(T)!==q&&(v===t.length-1?f.add(q):(f=null,y=!1,l&&(g=`- peer dependency ${Li(q.locator)} from parent ${Li(x.locator)} was not hoisted to ${u}`))),b.delete(T)}if(!y)break}m=y}if(m&&!c)for(let y of i.hoistedDependencies.values()){let b=n.get(y.name)||r.dependencies.get(y.name);if(!b||y.ident!==b.ident){m=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${Li(y.locator)}, available: ${Li(b==null?void 0:b.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:m?0:1,reason:g}},$0=r=>`${r.name}@${r.locator}`,K4e=(r,e,t,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(b,v,x,T,q)=>{if(u.has(T))return;let Y=[...v,$0(T)],$=[...x,$0(T)],_=new Map,ne=new Map;for(let Z of yL(T)){let O=j4e(c,t,[c,...b,T],Z,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(ne.set(Z,O),O.isHoistable===2)for(let L of O.dependsOn){let de=_.get(L.name)||new Set;de.add(Z.name),_.set(L.name,de)}}let ee=new Set,A=(Z,O,L)=>{if(!ee.has(Z)){ee.add(Z),ne.set(Z,{isHoistable:1,reason:L});for(let de of _.get(Z.name)||[])A(T.dependencies.get(de),O,l.debugLevel>=2?`- peer dependency ${Li(Z.locator)} from parent ${Li(T.locator)} was not hoisted`:"")}};for(let[Z,O]of ne)O.isHoistable===1&&A(Z,O,O.reason);let oe=!1;for(let Z of ne.keys())if(!ee.has(Z)){f=!0;let O=o.get(T);O&&O.has(Z.name)&&(g=!0),oe=!0,T.dependencies.delete(Z.name),T.hoistedDependencies.set(Z.name,Z),T.reasons.delete(Z.name);let L=c.dependencies.get(Z.name);if(l.debugLevel>=2){let de=Array.from(v).concat([T.locator]).map(je=>Li(je)).join("\u2192"),Be=c.hoistedFrom.get(Z.name);Be||(Be=[],c.hoistedFrom.set(Z.name,Be)),Be.push(de),T.hoistedTo.set(Z.name,Array.from(e).map(je=>Li(je.locator)).join("\u2192"))}if(!L)c.ident!==Z.ident&&(c.dependencies.set(Z.name,Z),q.add(Z));else for(let de of Z.references)L.references.add(de)}if(T.dependencyKind===2&&oe&&(g=!0),l.check){let Z=fAe(r);if(Z)throw new Error(`${Z}, after hoisting dependencies of ${[c,...b,T].map(O=>Li(O.locator)).join("\u2192")}: -${Tm(r)}`)}let ce=yL(T);for(let Z of ce)if(ee.has(Z)){let O=ne.get(Z);if((n.get(Z.name)===Z.ident||!T.reasons.has(Z.name))&&O.isHoistable!==0&&T.reasons.set(Z.name,O.reason),!Z.isHoistBorder&&$.indexOf($0(Z))<0){u.add(T);let de=pAe(T,Z);h([...b,T],Y,$,de,m),u.delete(T)}}},p,m=new Set(yL(c)),y=Array.from(e).map(b=>$0(b));do{p=m,m=new Set;for(let b of p){if(b.locator===c.locator||b.isHoistBorder)continue;let v=pAe(c,b);h([],Array.from(t),y,v,m)}}while(m.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},fAe=r=>{let e=[],t=new Set,i=new Set,n=(s,o,a)=>{if(t.has(s)||(t.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>Li(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,m=`${h?` hoisted to ${h}`:""}`,y=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${y} - broken require promise for ${c.name}${m}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${y} - broken require promise: no required dependency ${c.name}${m} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(r,r.dependencies,r),e.join(` -`)},N4e=(r,e)=>{let{identName:t,name:i,reference:n,peerNames:s}=r,o={name:i,references:new Set([n]),locator:EL(t,n),ident:gAe(t,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[r,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:m,peerNames:y,hoistPriority:b,dependencyKind:v}=c,x=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([m]),locator:EL(p,m),ident:gAe(p,m),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(y),reasons:new Map,decoupled:!0,isHoistBorder:x?x.has(h):!1,hoistPriority:b||0,dependencyKind:v||0,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=m=>{if(!h.has(m)){h.add(m),m.decoupled=!1;for(let y of m.dependencies.values())m.peerNames.has(y.name)||p(y)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of r.dependencies)l(c,o);return o},wL=r=>r.substring(0,r.indexOf("@",1)),L4e=r=>{let e={name:r.name,identName:wL(r.locator),references:new Set(r.references),dependencies:new Set},t=new Set([r]),i=(n,s,o)=>{let a=t.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:wL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){t.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);t.delete(n)}};for(let n of r.dependencies.values())i(n,r,e);return e},U4e=r=>{let e=new Map,t=new Set([r]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!t.has(a);if(n(a).dependents.add(o.ident),!l){t.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of r.dependencies.values())r.peerNames.has(o.name)||s(r,o);return e},Li=r=>{if(!r)return"none";let e=r.indexOf("@",1),t=r.substring(0,e);t.endsWith("$wsroot$")&&(t=`wh:${t.replace("$wsroot$","")}`);let i=r.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(t=`v:${t}`),n.startsWith("workspace")&&(t=`w:${t}`,n=""),`${t}${n?`@${n}`:""}`}else return`${t}`},dAe=5e4,Tm=r=>{let e=0,t=(n,s,o="")=>{if(e>dAe||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name===u.name?0:c.name>u.name?1:-1),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+Li(u.locator)+(g?` ${g}`:"")} -`,l+=t(u,s,`${o}${cdAe?` -Tree is too large, part of the tree has been dunped -`:"")};var wo;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(wo||(wo={}));var Kn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Kn||(Kn={}));var CAe="node_modules",Su="$wsroot$";var Om=(r,e)=>{let{packageTree:t,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=G4e(r,e),o=null;if(n.length===0){let a=hAe(t,{hoistingLimits:i});o=Y4e(r,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},da=r=>`${r.name}@${r.reference}`,BL=r=>{let e=new Map;for(let[t,i]of r.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(t)}for(let t of e.values())t.locations=t.locations.sort((i,n)=>{let s=i.split(k.delimiter).length,o=n.split(k.delimiter).length;return n===i?0:s!==o?o-s:n>i?1:-1});return e},mAe=(r,e)=>{let t=P.isVirtualLocator(r)?P.devirtualizeLocator(r):r,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(t,i)},bL=(r,e,t,i)=>{if(r.linkType!==wo.SOFT)return!1;let n=H.toPortablePath(t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation);return k.contains(i,n)===null},q4e=r=>{let e=r.getPackageInformation(r.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(r.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=H.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=r.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=da(f);if(l.has(p))return;l.add(p);let m=r.getPackageInformation(f);if(m){let y=h?da(h):"";if(da(f)!==y&&m.linkType===wo.SOFT&&!bL(m,f,r,i)){let b=EAe(m,f,r);(!a.get(b)||f.reference.startsWith("workspace:"))&&a.set(b,f)}for(let[b,v]of m.packageDependencies)v!==null&&(m.packagePeers.has(b)||c(r.getLocator(b,v),f))}};for(let f of o)c(f,null);let u=i.split(k.sep);for(let f of a.values()){let h=r.getPackageInformation(f),m=H.toPortablePath(h.packageLocation.slice(0,-1)).split(k.sep).slice(u.length),y=s;for(let b of m){let v=y.children.get(b);v||(v={children:new Map},y.children.set(b,v)),y=v}y.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=da(h),m=n.get(p);m||(m=new Set,n.set(p,m)),m.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},G4e=(r,e)=>{let t=[],i=!1,n=new Map,s=q4e(r),o=r.getPackageInformation(r.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=r.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=H.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,dependencyKind:Mn.WORKSPACE},u=new Map,g=(h,p)=>`${da(p)}:${h}`,f=(h,p,m,y,b,v,x,T)=>{var Z,O;let q=g(h,m),Y=u.get(q),$=!!Y;!$&&m.name===a.name&&m.reference===a.reference&&(Y=c,u.set(q,c));let _=bL(p,m,r,l);if(!Y){let L=Mn.REGULAR;_?L=Mn.EXTERNAL_SOFT_LINK:p.linkType===wo.SOFT&&m.name.endsWith(Su)&&(L=Mn.WORKSPACE),Y={name:h,identName:m.name,reference:m.reference,dependencies:new Set,peerNames:L===Mn.WORKSPACE?new Set:p.packagePeers,dependencyKind:L},u.set(q,Y)}let ne;if(_?ne=2:b.linkType===wo.SOFT?ne=1:ne=0,Y.hoistPriority=Math.max(Y.hoistPriority||0,ne),T&&!_){let L=da({name:y.identName,reference:y.reference}),de=n.get(L)||new Set;n.set(L,de),de.add(Y.name)}let ee=new Map(p.packageDependencies);if(e.project){let L=e.project.workspacesByCwd.get(H.toPortablePath(p.packageLocation.slice(0,-1)));if(L){let de=new Set([...Array.from(L.manifest.peerDependencies.values(),Be=>P.stringifyIdent(Be)),...Array.from(L.manifest.peerDependenciesMeta.keys())]);for(let Be of de)ee.has(Be)||(ee.set(Be,v.get(Be)||null),Y.peerNames.add(Be))}}let A=da({name:m.name.replace(Su,""),reference:m.reference}),oe=s.get(A);if(oe)for(let L of oe)ee.set(`${L.name}${Su}`,L.reference);(p!==b||p.linkType!==wo.SOFT||!_&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(x)))&&y.dependencies.add(Y);let ce=m!==a&&p.linkType===wo.SOFT&&!m.name.endsWith(Su)&&!_;if(!$&&!ce){let L=new Map;for(let[de,Be]of ee)if(Be!==null){let je=r.getLocator(de,Be),re=r.getLocator(de.replace(Su,""),Be),se=r.getPackageInformation(re);if(se===null)throw new Error("Assertion failed: Expected the package to have been registered");let be=bL(se,je,r,l);if(e.validateExternalSoftLinks&&e.project&&be){se.packageDependencies.size>0&&(i=!0);for(let[ve,pe]of se.packageDependencies)if(pe!==null){let V=P.parseLocator(Array.isArray(pe)?`${pe[0]}@${pe[1]}`:`${ve}@${pe}`);if(da(V)!==da(je)){let Qe=ee.get(ve);if(Qe){let le=P.parseLocator(Array.isArray(Qe)?`${Qe[0]}@${Qe[1]}`:`${ve}@${Qe}`);mAe(le,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with parent dependency ${P.prettyLocator(e.project.configuration,le)}`})}else{let le=L.get(ve);if(le){let fe=le.target,gt=P.parseLocator(Array.isArray(fe)?`${fe[0]}@${fe[1]}`:`${ve}@${fe}`);mAe(gt,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with dependency ${P.prettyLocator(e.project.configuration,gt)} from sibling portal ${P.prettyIdent(e.project.configuration,P.parseIdent(le.portal.name))}`})}else L.set(ve,{target:V.reference,portal:je})}}}}let he=(Z=e.hoistingLimitsByCwd)==null?void 0:Z.get(x),Fe=be?x:k.relative(l,H.toPortablePath(se.packageLocation))||Me.dot,Ke=(O=e.hoistingLimitsByCwd)==null?void 0:O.get(Fe),ke=he===Kn.DEPENDENCIES||Ke===Kn.DEPENDENCIES||Ke===Kn.WORKSPACES;f(de,se,je,Y,p,ee,Fe,ke)}}};return f(a.name,o,a,c,o,o.packageDependencies,Me.dot,!1),{packageTree:c,hoistingLimits:n,errors:t,preserveSymlinksRequired:i}};function EAe(r,e,t){let i=t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation;return H.toPortablePath(i||r.packageLocation)}function J4e(r,e,t){let i=e.getLocator(r.name.replace(Su,""),r.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return t.pnpifyFs?(o=H.toPortablePath(n.packageLocation),s=wo.SOFT):(o=EAe(n,r,e),s=n.linkType),{linkType:s,target:o}}var Y4e=(r,e,t)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=J4e(u,r,t);return{locator:da(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:Jr(g),name:Jr(f)}:{scope:null,name:Jr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),m={name:h.identName,reference:p[0]},{name:y,scope:b}=s(h.name),v=b?[b,y]:[y],x=k.join(g,CAe),T=k.join(x,...v),q=`${f}/${m.name}`,Y=n(m,f,p.slice(1)),$=!1;if(Y.linkType===wo.SOFT&&t.project){let _=t.project.workspacesByCwd.get(Y.target.slice(0,-1));$=!!(_&&!_.manifest.name)}if(!h.name.endsWith(Su)&&!$){let _=i.get(T);if(_){if(_.dirList)throw new Error(`Assertion failed: ${T} cannot merge dir node with leaf node`);{let oe=P.parseLocator(_.locator),ce=P.parseLocator(Y.locator);if(_.linkType!==Y.linkType)throw new Error(`Assertion failed: ${T} cannot merge nodes with different link types ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/${P.stringifyLocator(ce)}`);if(oe.identHash!==ce.identHash)throw new Error(`Assertion failed: ${T} cannot merge nodes with different idents ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/s${P.stringifyLocator(ce)}`);Y.aliases=[...Y.aliases,..._.aliases,P.parseLocator(_.locator).reference]}}i.set(T,Y);let ne=T.split("/"),ee=ne.indexOf(CAe),A=ne.length-1;for(;ee>=0&&A>ee;){let oe=H.toPortablePath(ne.slice(0,A).join(k.sep)),ce=Jr(ne[A]),Z=i.get(oe);if(!Z)i.set(oe,{dirList:new Set([ce])});else if(Z.dirList){if(Z.dirList.has(ce))break;Z.dirList.add(ce)}A--}}a(h,Y.linkType===wo.SOFT?Y.target:T,q)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var LL={};ft(LL,{PnpInstaller:()=>oh,PnpLinker:()=>xu,default:()=>d8e,getPnpPath:()=>Tl,jsInstallUtils:()=>Ca,pnpUtils:()=>FL,quotePathIfNeeded:()=>GAe});var HAe=ge(ri()),jAe=ge(require("url"));var IAe;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(IAe||(IAe={}));var er;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(er||(er={}));var yAe={[er.DEFAULT]:{collapsed:!1,next:{["*"]:er.DEFAULT}},[er.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:er.FALLBACK_EXCLUSION_LIST,packageRegistryData:er.PACKAGE_REGISTRY_DATA,["*"]:er.DEFAULT}},[er.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:er.FALLBACK_EXCLUSION_ENTRIES}},[er.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:er.FALLBACK_EXCLUSION_DATA}},[er.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:er.DEFAULT}},[er.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_REGISTRY_ENTRIES}},[er.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_STORE_DATA}},[er.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_STORE_ENTRIES}},[er.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_INFORMATION_DATA}},[er.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:er.PACKAGE_DEPENDENCIES,["*"]:er.DEFAULT}},[er.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:er.PACKAGE_DEPENDENCY}},[er.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:er.DEFAULT}}};function W4e(r,e,t){let i="";i+="[";for(let n=0,s=r.length;ns(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function X4e(r){let e=new Map,t=Mm(r.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of t){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function Z4e(r){return Mm(r.fallbackPool||[],([e])=>e)}function $4e(r){let e=[];for(let[t,i]of Mm(r.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([t,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of Mm(i,([g])=>g===null?"0":`1${g}`)){let g=[];t!==null&&s!==null&&!a.has(t)&&g.push([t,s]);for(let[p,m]of Mm(a.entries(),([y])=>y))g.push([p,m]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function Km(r){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:r.dependencyTreeRoots,enableTopLevelFallback:r.enableTopLevelFallback||!1,ignorePatternData:r.ignorePattern||null,fallbackExclusionList:X4e(r),fallbackPool:Z4e(r),packageRegistryData:$4e(r)}}var SAe=ge(QAe());function vAe(r,e){return[r?`${r} -`:"",`/* eslint-disable */ - -`,`try { -`,` Object.freeze({}).detectStrictMode = true; -`,`} catch (error) { -`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} -`,` -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,e.replace(/^/gm," "),`} -`,` -`,(0,SAe.default)()].join("")}function e8e(r){return JSON.stringify(r,null,2)}function t8e(r){return`'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ -`)}'`}function r8e(r){return[`return hydrateRuntimeState(JSON.parse(${t8e(BAe(r))}), {basePath: basePath || __dirname}); -`].join("")}function i8e(r){return[`var path = require('path'); -`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(r)}); -`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); -`].join("")}function xAe(r){let e=Km(r),t=r8e(e);return vAe(r.shebang,t)}function kAe(r){let e=Km(r),t=i8e(r.dataLocation),i=vAe(r.shebang,t);return{dataFile:e8e(e),loaderFile:i}}var RAe=ge(require("fs")),l8e=ge(require("path")),FAe=ge(require("util"));function SL(r,{basePath:e}){let t=H.toPortablePath(e),i=k.resolve(t),n=r.ignorePatternData!==null?new RegExp(r.ignorePatternData):null,s=new Map,o=new Map(r.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var x;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let m=(x=p.discardFromLookup)!=null?x:!1,y={name:g,reference:h},b=s.get(p.packageLocation);b?(b.discardFromLookup=b.discardFromLookup&&m,m||(b.locator=y)):s.set(p.packageLocation,{locator:y,discardFromLookup:m});let v=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:m,get packageLocation(){return v||(v=k.join(i,p.packageLocation))}}]}))])),a=new Map(r.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(r.fallbackPool),c=r.dependencyTreeRoots,u=r.enableTopLevelFallback;return{basePath:t,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var Um=ge(require("module"));function sh(r,e){if(typeof r=="string")return r;if(r){let t,i;if(Array.isArray(r)){for(t=0;t0)return(f=sh(n[g],u))?f.replace("*",c.substring(g.length-1)):vu(i,c,1)}return vu(i,c)}}var vL=ge(require("util"));var ur;(function(c){c.API_ERROR="API_ERROR",c.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",c.EXPORTS_RESOLUTION_FAILED="EXPORTS_RESOLUTION_FAILED",c.MISSING_DEPENDENCY="MISSING_DEPENDENCY",c.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",c.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",c.INTERNAL="INTERNAL",c.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",c.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var s8e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ai(r,e,t={},i){i!=null||(i=s8e.has(r)?"MODULE_NOT_FOUND":r);let n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:te(N({},n),{value:i}),pnpCode:te(N({},n),{value:r}),data:te(N({},n),{value:t})})}function Bo(r){return H.normalize(H.fromPortablePath(r))}var o8e=ge(require("fs")),DAe=ge(require("module")),a8e=ge(require("path")),A8e=new Set(DAe.Module.builtinModules||Object.keys(process.binding("natives"))),tb=r=>r.startsWith("node:")||A8e.has(r);function xL(r,e){let t=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,s=/^(\/|\.{1,2}(\/|$))/,o=/\/$/,a=/^\.{0,2}\//,l={name:null,reference:null},c=[],u=new Set;if(r.enableTopLevelFallback===!0&&c.push(l),e.compatibilityMode!==!1)for(let re of["react-scripts","gatsby"]){let se=r.packageRegistry.get(re);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");c.push({name:re,reference:be})}}let{ignorePattern:g,packageRegistry:f,packageLocatorsByLocations:h}=r;function p(re,se){return{fn:re,args:se,error:null,result:null}}function m(re){var Ke,ke,ve,pe,V,Qe;let se=(ve=(ke=(Ke=process.stderr)==null?void 0:Ke.hasColors)==null?void 0:ke.call(Ke))!=null?ve:process.stdout.isTTY,be=(le,fe)=>`[${le}m${fe}`,he=re.error;console.error(he?be("31;1",`\u2716 ${(pe=re.error)==null?void 0:pe.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),re.args.length>0&&console.error();for(let le of re.args)console.error(` ${be("37;1","In \u2190")} ${(0,vL.inspect)(le,{colors:se,compact:!0})}`);re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,vL.inspect)(re.result,{colors:se,compact:!0})}`));let Fe=(Qe=(V=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:V.slice(2))!=null?Qe:[];if(Fe.length>0){console.error();for(let le of Fe)console.error(` ${be("38;5;244",le)}`)}console.error()}function y(re,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let he=p(re,be);try{return he.result=se(...be)}catch(Fe){throw he.error=Fe}finally{m(he)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(he){let Fe=p(re,be);throw Fe.error=he,m(Fe),he}}}return se}function b(re){let se=A(re);if(!se)throw ai(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function v(re){if(re.name===null)return!0;for(let se of r.dependencyTreeRoots)if(se.name===re.name&&se.reference===re.reference)return!0;return!1}let x=new Set(["default","node","require"]);function T(re,se=x){let be=Z(k.join(re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ai(ur.INTERNAL,`The locator that owns the "${re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:he}=b(be),Fe=k.join(he,kt.manifest);if(!e.fakeFs.existsSync(Fe))return null;let Ke=JSON.parse(e.fakeFs.readFileSync(Fe,"utf8")),ke=k.contains(he,re);if(ke===null)throw ai(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");a.test(ke)||(ke=`./${ke}`);let ve;try{ve=PAe(Ke,k.normalize(ke),{conditions:se,unsafe:!0})}catch(pe){throw ai(ur.EXPORTS_RESOLUTION_FAILED,pe.message,{unqualifiedPath:Bo(re),locator:be,pkgJson:Ke,subpath:Bo(ke),conditions:se},"ERR_PACKAGE_PATH_NOT_EXPORTED")}return typeof ve=="string"?k.join(he,ve):null}function q(re,se,{extensions:be}){let he;try{se.push(re),he=e.fakeFs.statSync(re)}catch(Fe){}if(he&&!he.isDirectory())return e.fakeFs.realpathSync(re);if(he&&he.isDirectory()){let Fe;try{Fe=JSON.parse(e.fakeFs.readFileSync(k.join(re,kt.manifest),"utf8"))}catch(ke){}let Ke;if(Fe&&Fe.main&&(Ke=k.resolve(re,Fe.main)),Ke&&Ke!==re){let ke=q(Ke,se,{extensions:be});if(ke!==null)return ke}}for(let Fe=0,Ke=be.length;Fe{let ve=JSON.stringify(ke.name);if(he.has(ve))return;he.add(ve);let pe=oe(ke);for(let V of pe)if(b(V).packagePeers.has(re))Fe(V);else{let le=be.get(V.name);typeof le=="undefined"&&be.set(V.name,le=new Set),le.add(V.reference)}};Fe(se);let Ke=[];for(let ke of[...be.keys()].sort())for(let ve of[...be.get(ke)].sort())Ke.push({name:ke,reference:ve});return Ke}function Z(re,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(_(re)&&!se)return null;let he=k.relative(r.basePath,re);he.match(s)||(he=`./${he}`),he.endsWith("/")||(he=`${he}/`);do{let Fe=h.get(he);if(typeof Fe=="undefined"||Fe.discardFromLookup&&!be){he=he.substring(0,he.lastIndexOf("/",he.length-2)+1);continue}return Fe.locator}while(he!=="");return null}function O(re,se,{considerBuiltins:be=!0}={}){if(re==="pnpapi")return H.toPortablePath(e.pnpapiResolution);if(be&&tb(re))return null;let he=Bo(re),Fe=se&&Bo(se);if(se&&_(se)&&(!k.isAbsolute(re)||Z(re)===null)){let ve=$(re,se);if(ve===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(ve)}let Ke,ke=re.match(n);if(ke){if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let[,ve,pe]=ke,V=Z(se);if(!V){let jt=$(re,se);if(jt===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(jt)}let le=b(V).packageDependencies.get(ve),fe=null;if(le==null&&V.name!==null){let jt=r.fallbackExclusionList.get(V.name);if(!jt||!jt.has(V.reference)){for(let Oi=0,Xs=c.length;Oiv(Qr))?gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt}):gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) - -${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt})}else le===void 0&&(!be&&tb(re)?v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in ${V.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}):v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}));if(le==null){if(fe===null||gt===null)throw gt||new Error("Assertion failed: Expected an error to have been set");le=fe;let jt=gt.message.replace(/\n.*/g,"");gt.message=jt,!u.has(jt)&&i!==0&&(u.add(jt),process.emitWarning(gt))}let Ht=Array.isArray(le)?{name:le[0],reference:le[1]}:{name:ve,reference:le},Mt=b(Ht);if(!Mt.packageLocation)throw ai(ur.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${Ht.name}@${Ht.reference}${Ht.name!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,dependencyLocator:Object.assign({},Ht)});let Ei=Mt.packageLocation;pe?Ke=k.join(Ei,pe):Ke=Ei}else if(k.isAbsolute(re))Ke=k.normalize(re);else{if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let ve=k.resolve(se);se.match(o)?Ke=k.normalize(k.join(ve,re)):Ke=k.normalize(k.join(k.dirname(ve),re))}return k.normalize(Ke)}function L(re,se,be=x){if(s.test(re))return se;let he=T(se,be);return he?k.normalize(he):se}function de(re,{extensions:se=Object.keys(Um.Module._extensions)}={}){var Fe,Ke;let be=[],he=q(re,be,{extensions:se});if(he)return k.normalize(he);{let ke=Bo(re),ve=Z(re);if(ve){let{packageLocation:pe}=b(ve),V=!0;try{e.fakeFs.accessSync(pe)}catch(Qe){if((Qe==null?void 0:Qe.code)==="ENOENT")V=!1;else{let le=((Ke=(Fe=Qe==null?void 0:Qe.message)!=null?Fe:Qe)!=null?Ke:"empty exception thrown").replace(/^[A-Z]/,fe=>fe.toLowerCase());throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Required package exists but could not be accessed (${le}). - -Missing package: ${ve.name}@${ve.reference} -Expected package location: ${Bo(pe)} -`,{unqualifiedPath:ke,extensions:se})}}if(!V){let Qe=pe.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${Qe} - -Missing package: ${ve.name}@${ve.reference} -Expected package location: ${Bo(pe)} -`,{unqualifiedPath:ke,extensions:se})}}throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed: we looked for the following paths, but none could be accessed. - -Source path: ${ke} -${be.map(pe=>`Not found: ${Bo(pe)} -`).join("")}`,{unqualifiedPath:ke,extensions:se})}}function Be(re,se,{considerBuiltins:be,extensions:he,conditions:Fe}={}){try{let Ke=O(re,se,{considerBuiltins:be});if(re==="pnpapi")return Ke;if(Ke===null)return null;let ke=()=>se!==null?_(se):!1,ve=(!be||!tb(re))&&!ke()?L(re,Ke,Fe):Ke;return de(ve,{extensions:he})}catch(Ke){throw Object.prototype.hasOwnProperty.call(Ke,"pnpCode")&&Object.assign(Ke.data,{request:Bo(re),issuer:se&&Bo(se)}),Ke}}function je(re){let se=k.normalize(re),be=Wr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:ne,topLevel:ee,getLocator:(re,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:re,reference:se},getDependencyTreeRoots:()=>[...r.dependencyTreeRoots],getAllLocators(){let re=[];for(let[se,be]of f)for(let he of be.keys())se!==null&&he!==null&&re.push({name:se,reference:he});return re},getPackageInformation:re=>{let se=A(re);if(se===null)return null;let be=H.fromPortablePath(se.packageLocation);return te(N({},se),{packageLocation:be})},findPackageLocator:re=>Z(H.toPortablePath(re)),resolveToUnqualified:y("resolveToUnqualified",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=O(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveUnqualified:y("resolveUnqualified",(re,se)=>H.fromPortablePath(de(H.toPortablePath(re),se))),resolveRequest:y("resolveRequest",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=Be(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveVirtual:y("resolveVirtual",re=>{let se=je(H.toPortablePath(re));return se!==null?H.fromPortablePath(se):null})}}var O0t=(0,FAe.promisify)(RAe.readFile);var NAe=(r,e,t)=>{let i=Km(r),n=SL(i,{basePath:e}),s=H.join(e,kt.pnpCjs);return xL(n,{fakeFs:t,pnpapiResolution:s})};var PL=ge(TAe());var Ca={};ft(Ca,{checkAndReportManifestCompatibility:()=>MAe,checkManifestCompatibility:()=>OAe,extractBuildScripts:()=>rb,getExtractHint:()=>DL,hasBindingGyp:()=>RL});function OAe(r){return P.isPackageCompatible(r,Vg.getArchitectureSet())}function MAe(r,e,{configuration:t,report:i}){return OAe(r)?!0:(i==null||i.reportWarningOnce(X.INCOMPATIBLE_ARCHITECTURE,`${P.prettyLocator(t,r)} The ${Vg.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function rb(r,e,t,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([cs.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([cs.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:r.linkType!==Qt.HARD?(n==null||n.reportWarningOnce(X.SOFT_LINK_BUILD,`${P.prettyLocator(i,r)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):t&&t.built===!1?(n==null||n.reportInfoOnce(X.BUILD_DISABLED,`${P.prettyLocator(i,r)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!t.built?(n==null||n.reportWarningOnce(X.DISABLED_BUILD_SCRIPTS,`${P.prettyLocator(i,r)} lists build scripts, but all build scripts have been disabled.`),[]):MAe(r,"build",{configuration:i,report:n})?s:[]}var c8e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function DL(r){return r.packageFs.getExtractHint({relevantExtensions:c8e})}function RL(r){let e=k.join(r.prefixPath,"binding.gyp");return r.packageFs.existsSync(e)}var FL={};ft(FL,{getUnpluggedPath:()=>Hm});function Hm(r,{configuration:e}){return k.resolve(e.get("pnpUnpluggedFolder"),P.slugifyLocator(r))}var u8e=new Set([P.makeIdent(null,"nan").identHash,P.makeIdent(null,"node-gyp").identHash,P.makeIdent(null,"node-pre-gyp").identHash,P.makeIdent(null,"node-addon-api").identHash,P.makeIdent(null,"fsevents").identHash,P.makeIdent(null,"open").identHash,P.makeIdent(null,"opn").identHash]),xu=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let i=Tl(t.project).cjs;if(!K.existsSync(i))throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})),s={name:P.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return H.toPortablePath(o.packageLocation)}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=Tl(t.project).cjs;if(!K.existsSync(i))return null;let s=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})).findPackageLocator(H.fromPortablePath(e));return s?P.makeLocator(P.parseIdent(s.name),s.reference):null}makeInstaller(e){return new oh(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},oh=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new Se.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t,i){let n=P.stringifyIdent(e),s=e.reference,o=!!this.opts.project.tryWorkspaceByLocator(e),a=P.isVirtualLocator(e),l=e.peerDependencies.size>0&&!a,c=!l&&!o,u=!l&&e.linkType!==Qt.SOFT,g,f;if(c||u){let x=a?P.devirtualizeLocator(e):e;g=this.customData.store.get(x.locatorHash),typeof g=="undefined"&&(g=await g8e(t),e.linkType===Qt.HARD&&this.customData.store.set(x.locatorHash,g)),g.manifest.type==="module"&&(this.isESMLoaderRequired=!0),f=this.opts.project.getDependencyMeta(x,e.version)}let h=c?rb(e,g,f,{configuration:this.opts.project.configuration,report:this.opts.report}):[],p=u?await this.unplugPackageIfNeeded(e,g,t,f,i):t.packageFs;if(k.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);let m=k.resolve(p.getRealPath(),t.prefixPath),y=NL(this.opts.project.cwd,m),b=new Map,v=new Set;if(a){for(let x of e.peerDependencies.values())b.set(P.stringifyIdent(x),null),v.add(P.stringifyIdent(x));if(!o){let x=P.devirtualizeLocator(e);this.virtualTemplates.set(x.locatorHash,{location:NL(this.opts.project.cwd,Wr.resolveVirtual(m)),locator:x})}}return Se.getMapWithDefault(this.packageRegistry,n).set(s,{packageLocation:y,packageDependencies:b,packagePeers:v,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),{packageLocation:m,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,t){let i=this.getPackageInformation(e);for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){for(let i of t)this.getDiskInformation(i).packageDependencies.set(P.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=Tl(this.opts.project);if(K.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(X.UNNAMED,`Removing the old ${ae.pretty(this.opts.project.configuration,kt.pnpJs,ae.Type.PATH)} file. You might need to manually update existing references to reference the new ${ae.pretty(this.opts.project.configuration,kt.pnpCjs,ae.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ae.pretty(this.opts.project.configuration,"yarn sdks",ae.Type.CODE)}.`),await K.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await K.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await K.removePromise(e.cjs),await K.removePromise(this.opts.project.configuration.get("pnpDataPath")),await K.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())Se.getMapWithDefault(this.packageRegistry,P.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let t=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:P.stringifyIdent(u),reference:u.reference})),n=t!=="none",s=[],o=new Map,a=Se.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(t==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:P.stringifyIdent(u),reference:u.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let t=Tl(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(X.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await K.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=xAe(e);await K.changeFilePromise(t.cjs,o,{automaticNewlines:!0,mode:493}),await K.removePromise(i)}else{let o=k.relative(k.dirname(t.cjs),i),{dataFile:a,loaderFile:l}=kAe(te(N({},e),{dataLocation:o}));await K.changeFilePromise(t.cjs,l,{automaticNewlines:!0,mode:493}),await K.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(X.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await K.changeFilePromise(t.esmLoader,(0,PL.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await K.removePromise(s);else for(let o of await K.readdirPromise(s)){let a=k.resolve(s,o);this.unpluggedPaths.has(a)||await K.removePromise(a)}}async locateNodeModules(e){let t=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=k.join(n.cwd,"node_modules");if(i&&i.test(k.relative(this.opts.project.cwd,n.cwd))||!K.existsSync(s))continue;let o=await K.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)t.push(s);else for(let l of a)t.push(k.join(s,l.name))}return t}async unplugPackageIfNeeded(e,t,i,n,s){return this.shouldBeUnplugged(e,t,n)?this.unplugPackage(e,i,s):i.packageFs}shouldBeUnplugged(e,t,i){return typeof i.unplugged!="undefined"?i.unplugged:u8e.has(e.identHash)||e.conditions!=null?!0:t.manifest.preferUnplugged!==null?t.manifest.preferUnplugged:!!(rb(e,t,i,{configuration:this.opts.project.configuration}).length>0||t.misc.extractHint)}async unplugPackage(e,t,i){let n=Hm(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new Na(n,{baseFs:t.packageFs,pathUtils:k}):(this.unpluggedPaths.add(n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let s=k.join(n,t.prefixPath,".ready");await K.existsPromise(s)||(this.opts.project.storedBuildState.delete(e.locatorHash),await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,Me.dot,{baseFs:t.packageFs,overwrite:!1}),await K.writeFilePromise(s,""))})),new _t(n))}getPackageInformation(e){let t=P.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(t);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${P.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${P.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let t=Se.getMapWithDefault(this.packageRegistry,"@@disk"),i=NL(this.opts.project.cwd,e);return Se.getFactoryWithDefault(t,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1}))}};function NL(r,e){let t=k.relative(r,e);return t.match(/^\.{0,2}\//)||(t=`./${t}`),t.replace(/\/?$/,"/")}async function g8e(r){var i;let e=(i=await At.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?i:new At,t=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())t.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:DL(r),hasBindingGyp:RL(r)}}}var KAe=ge(is());var jm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new Pe("This command can only be used if the `nodeLinker` option is set to `pnp`");await t.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=P.parseDescriptor(f),p=h.range!=="unknown"?h:P.makeDescriptor(h,"*");if(!Wt.validRange(p.range))throw new Pe(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(e,p)})`);return m=>{let y=P.stringifyIdent(m);return!KAe.default.isMatch(y,P.stringifyIdent(p))||m.version&&!Wt.satisfiesWithPrereleases(m.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of t.storedPackages.values())!t.tryWorkspaceByLocator(h)&&!P.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],m=(y,b)=>{if(!h.has(y.locatorHash)&&(h.add(y.locatorHash),!t.tryWorkspaceByLocator(y)&&o.some(v=>v(y))&&p.push(y),!(b>0&&!this.recursive)))for(let v of y.dependencies.values()){let x=t.storedResolutions.get(v.descriptorHash);if(!x)throw new Error("Assertion failed: The resolution should have been registered");let T=t.storedPackages.get(x);if(!T)throw new Error("Assertion failed: The package should have been registered");m(T,b+1)}};for(let y of f){let b=t.storedPackages.get(y.anchoredLocator.locatorHash);if(!b)throw new Error("Assertion failed: The package should have been registered");m(b,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(t.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new Pe(`Patterns ${ae.prettyList(e,s,ae.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new Pe(`Pattern ${ae.prettyList(e,s,ae.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=Se.sortMap(c,f=>P.stringifyLocator(f)),(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let m=(h=p.version)!=null?h:"unknown",y=t.topLevelWorkspace.manifest.ensureDependencyMeta(P.makeDescriptor(p,m));y.unplugged=!0,f.reportInfo(X.UNNAMED,`Will unpack ${P.prettyLocator(e,p)} to ${ae.pretty(e,Hm(p,{configuration:e}),ae.Type.PATH)}`),f.reportJson({locator:P.stringifyLocator(p),version:m})}await t.topLevelWorkspace.persistManifest(),f.reportSeparator(),await t.install({cache:n,report:f})})).exitCode()}};jm.paths=[["unplug"]],jm.usage=Re.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var UAe=jm;var Tl=r=>({cjs:k.join(r.cwd,kt.pnpCjs),cjsLegacy:k.join(r.cwd,kt.pnpJs),esmLoader:k.join(r.cwd,".pnp.loader.mjs")}),GAe=r=>/\s/.test(r)?JSON.stringify(r):r;async function f8e(r,e,t){let i=Tl(r),n=`--require ${GAe(H.fromPortablePath(i.cjs))}`;if(K.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,jAe.pathToFileURL)(H.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&HAe.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(K.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function h8e(r,e){let t=Tl(r);e(t.cjs),e(t.esmLoader),e(r.configuration.get("pnpDataPath")),e(r.configuration.get("pnpUnpluggedFolder"))}var p8e={hooks:{populateYarnPaths:h8e,setupScriptEnvironment:f8e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:Ie.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:Ie.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:Ie.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:Ie.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:Ie.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:Ie.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:Ie.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:Ie.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:Ie.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[xu],commands:[UAe]},d8e=p8e;var _Ae=ge(zAe());var UL=ge(require("crypto")),VAe=ge(require("fs")),XAe=1,jr="node_modules",ib=".bin",ZAe=".yarn-state.yml",Ti;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Ti||(Ti={}));var HL=class{constructor(){this.installStateCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let i=t.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(n===null)throw new Pe("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(P.stringifyLocator(e));if(!s){let a=new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=t.project.configuration.startingCwd;return s.locations.find(a=>k.contains(o,a))||s.locations[0]}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=nb(k.resolve(e),{skipPrefix:t.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return P.parseLocator(a)}makeInstaller(e){return new $Ae(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},$Ae=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t){var u;let i=k.resolve(t.packageFs.getRealPath(),t.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await F8e(e,t),e.linkType===Qt.HARD&&this.customData.store.set(e.locatorHash,n)),!P.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(P.stringifyIdent(e))||s.set(P.stringifyIdent(e),e.reference);let a=e;if(P.isVirtualLocator(e)){a=P.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(P.stringifyIdent(g),null),o.add(P.stringifyIdent(g))}let l={packageLocation:`${H.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=t.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=t.checksum?t.checksum.substring(t.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,t){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),t=await jL(this.opts.project),i=this.opts.project.configuration.get("nmMode");(t===null||i!==t.nmMode)&&(this.opts.project.storedBuildState.clear(),t={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i,mtimeMs:0});let n=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=Se.validateEnum(Kn,(m=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?m:h)}catch(y){let b=P.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(X.INVALID_MANIFEST,`${b}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Kn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(m=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?m:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:P.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:P.makeLocator(P.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(H.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:P.stringifyIdent(p),reference:p.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:f=>H.fromPortablePath(Wr.resolveVirtual(H.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=Om(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=BL(a);await N8e(t,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=P.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(ele(f))continue;let p=P.parseLocator(f),m=this.localStore.get(p.locatorHash);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(m.pkg))continue;let y=Ca.extractBuildScripts(m.pkg,m.customPackageData,m.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});y.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:y})}return c&&this.opts.report.reportWarning(X.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${ae.pretty(this.opts.project.configuration,"--preserve-symlinks",ae.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function F8e(r,e){var n;let t=(n=await At.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new At,i=new Set(["preinstall","install","postinstall"]);for(let s of t.scripts.keys())i.has(s)||t.scripts.delete(s);return{manifest:{bin:t.bin,scripts:t.scripts},misc:{extractHint:Ca.getExtractHint(e),hasBindingGyp:Ca.hasBindingGyp(e)}}}async function L8e(r,e,t,i,{installChangedByUser:n}){let s="";s+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,s+=`# cause your node_modules installation to become invalidated. -`,s+=` -`,s+=`__metadata: -`,s+=` version: ${XAe} -`,s+=` nmMode: ${i.value} -`;let o=Array.from(e.keys()).sort(),a=P.stringifyLocator(r.topLevelWorkspace.anchoredLocator);for(let u of o){let g=e.get(u);s+=` -`,s+=`${JSON.stringify(u)}: -`,s+=` locations: -`;for(let f of g.locations){let h=k.contains(r.cwd,f);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` - ${JSON.stringify(h)} -`}if(g.aliases.length>0){s+=` aliases: -`;for(let f of g.aliases)s+=` - ${JSON.stringify(f)} -`}if(u===a&&t.size>0){s+=` bin: -`;for(let[f,h]of t){let p=k.contains(r.cwd,f);if(p===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` ${JSON.stringify(p)}: -`;for(let[m,y]of h){let b=k.relative(k.join(f,jr),y);s+=` ${JSON.stringify(m)}: ${JSON.stringify(b)} -`}}}}let l=r.cwd,c=k.join(l,jr,ZAe);n&&await K.removePromise(c),await K.changeFilePromise(c,s,{automaticNewlines:!0})}async function jL(r,{unrollAliases:e=!1}={}){let t=r.cwd,i=k.join(t,jr,ZAe),n;try{n=await K.statPromise(i)}catch(c){}if(!n)return null;let s=Si(await K.readFilePromise(i,"utf8"));if(s.__metadata.version>XAe)return null;let o=s.__metadata.nmMode||Ti.CLASSIC,a=new Map,l=new Map;delete s.__metadata;for(let[c,u]of Object.entries(s)){let g=u.locations.map(h=>k.join(t,h)),f=u.bin;if(f)for(let[h,p]of Object.entries(f)){let m=k.join(t,H.toPortablePath(h)),y=Se.getMapWithDefault(l,m);for(let[b,v]of Object.entries(p))y.set(Jr(b),H.toPortablePath([m,jr,v].join(k.sep)))}if(a.set(c,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:u.aliases||[]}),e&&u.aliases)for(let h of u.aliases){let{scope:p,name:m}=P.parseLocator(c),y=P.makeLocator(P.makeIdent(p,m),h),b=P.stringifyLocator(y);a.set(b,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:[]})}}return{locatorMap:a,binSymlinks:l,locationTree:tle(a,{skipPrefix:r.cwd}),nmMode:o,mtimeMs:n.mtimeMs}}var Ah=async(r,e)=>{if(r.split(k.sep).indexOf(jr)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${r}`);try{if(!e.innerLoop){let i=e.allowSymlink?await K.statPromise(r):await K.lstatPromise(r);if(e.allowSymlink&&!i.isDirectory()||!e.allowSymlink&&i.isSymbolicLink()){await K.unlinkPromise(r);return}}let t=await K.readdirPromise(r,{withFileTypes:!0});for(let i of t){let n=k.join(r,Jr(i.name));i.isDirectory()?(i.name!==jr||e&&e.innerLoop)&&await Ah(n,{innerLoop:!0,contentsOnly:!1}):await K.unlinkPromise(n)}e.contentsOnly||await K.rmdirPromise(r)}catch(t){if(t.code!=="ENOENT"&&t.code!=="ENOTEMPTY")throw t}},rle=4,nb=(r,{skipPrefix:e})=>{let t=k.contains(e,r);if(t===null)throw new Error(`Assertion failed: Writing attempt prevented to ${r} which is outside project root: ${e}`);let i=t.split(k.sep).filter(l=>l!==""),n=i.indexOf(jr),s=i.slice(0,n).join(k.sep),o=k.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},tle=(r,{skipPrefix:e})=>{let t=new Map;if(r===null)return t;let i=()=>({children:new Map,linkType:Qt.HARD});for(let[n,s]of r.entries()){if(s.linkType===Qt.SOFT&&k.contains(e,s.target)!==null){let a=Se.getFactoryWithDefault(t,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=nb(o,{skipPrefix:e}),c=Se.getFactoryWithDefault(t,a,i);for(let u=0;u{let t;try{process.platform==="win32"&&(t=await K.lstatPromise(r))}catch(i){}process.platform=="win32"&&(!t||t.isDirectory())?await K.symlinkPromise(r,e,"junction"):await K.symlinkPromise(k.relative(k.dirname(e),r),e)};async function ile(r,e,t){let i=k.join(r,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));try{await K.writeFilePromise(i,t);try{await K.linkPromise(i,e)}catch(n){}}finally{await K.unlinkPromise(i)}}async function T8e({srcPath:r,dstPath:e,srcMode:t,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Ti.HARDLINKS_GLOBAL&&i&&o){let l=k.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await Dn.checksumFile(l,{baseFs:K,algorithm:"sha1"})!==o){let g=k.join(i,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));await K.renamePromise(l,g);let f=await n.readFilePromise(r);await K.writeFilePromise(g,f);try{await K.linkPromise(g,l),await K.unlinkPromise(g)}catch(h){}}await K.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(r);await ile(i,l,u);try{await K.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Ti.HARDLINKS_LOCAL,await n.copyFilePromise(r,e))}}}else await n.copyFilePromise(r,e);let a=t&511;a!==420&&await K.chmodPromise(e,a)}var Ol;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(Ol||(Ol={}));var O8e=async(r,e,{baseFs:t,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await K.mkdirPromise(r,{recursive:!0});let o=async(l=Me.dot)=>{let c=k.join(e,l),u=await t.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=k.join(l,f.name),p,m=k.join(c,f.name);if(f.isFile()){if(p={kind:Ol.FILE,mode:(await t.lstatPromise(m)).mode},n.value===Ti.HARDLINKS_GLOBAL){let y=await Dn.checksumFile(m,{baseFs:t,algorithm:"sha1"});p.digest=y}}else if(f.isDirectory())p={kind:Ol.DIRECTORY};else if(f.isSymbolicLink())p={kind:Ol.SYMLINK,symlinkTo:await t.readlinkPromise(m)};else throw new Error(`Unsupported file type (file: ${m}, mode: 0o${await t.statSync(m).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==jr){let y=await o(h);for(let[b,v]of y)g.set(b,v)}}return g},a;if(n.value===Ti.HARDLINKS_GLOBAL&&i&&s){let l=k.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await K.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await ile(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=k.join(e,l),g=k.join(r,l);c.kind===Ol.DIRECTORY?await K.mkdirPromise(g,{recursive:!0}):c.kind===Ol.FILE?await T8e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:t,globalHardlinksStore:i}):c.kind===Ol.SYMLINK&&await GL(k.resolve(k.dirname(g),c.symlinkTo),g)}};function M8e(r,e,t,i){let n=new Map,s=new Map,o=new Map,a=!1,l=(c,u,g,f,h)=>{let p=!0,m=k.join(c,u),y=new Set;if(u===jr||u.startsWith("@")){let v;try{v=K.statSync(m)}catch(T){}p=!!v,v?v.mtimeMs>t?(a=!0,y=new Set(K.readdirSync(m))):y=new Set(g.children.get(u).children.keys()):a=!0;let x=e.get(c);if(x){let T=k.join(c,jr,ib),q;try{q=K.statSync(T)}catch(Y){}if(!q)a=!0;else if(q.mtimeMs>t){a=!0;let Y=new Set(K.readdirSync(T)),$=new Map;s.set(c,$);for(let[_,ne]of x)Y.has(_)&&$.set(_,ne)}else s.set(c,x)}}else p=h.has(u);let b=g.children.get(u);if(p){let{linkType:v,locator:x}=b,T={children:new Map,linkType:v,locator:x};if(f.children.set(u,T),x){let q=Se.getSetWithDefault(o,x);q.add(m),o.set(x,q)}for(let q of b.children.keys())l(m,q,b,T,y)}else b.locator&&i.storedBuildState.delete(P.parseLocator(b.locator).locatorHash)};for(let[c,u]of r){let{linkType:g,locator:f}=u,h={children:new Map,linkType:g,locator:f};if(n.set(c,h),f){let p=Se.getSetWithDefault(o,u.locator);p.add(c),o.set(u.locator,p)}u.children.has(jr)&&l(c,jr,u,h,new Set)}return{locationTree:n,binSymlinks:s,locatorLocations:o,installChangedByUser:a}}function ele(r){let e=P.parseDescriptor(r);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function K8e(r,e,t,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of r){let c=ele(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=k.join(l[0],f);f!==""&&K.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=k.contains(t,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let m=k.join(a,H.toPortablePath(p));u.set(Jr(h),m)}for(let[h,p]of c.children){let m=k.join(a,h),y=o(m,m,p);y.size>0&&s.set(a,new Map([...s.get(a)||new Map,...y]))}}else for(let[f,h]of c.children){let p=o(k.join(a,f),l,h);for(let[m,y]of p)u.set(m,y)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var nle=(r,e)=>{if(!r||!e)return r===e;let t=P.parseLocator(r);P.isVirtualLocator(t)&&(t=P.devirtualizeLocator(t));let i=P.parseLocator(e);return P.isVirtualLocator(i)&&(i=P.devirtualizeLocator(i)),P.areLocatorsEqual(t,i)};function YL(r){return k.join(r.get("globalFolder"),"store")}async function N8e(r,e,{baseFs:t,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=k.join(i.cwd,jr),{locationTree:l,binSymlinks:c,locatorLocations:u,installChangedByUser:g}=M8e(r.locationTree,r.binSymlinks,r.mtimeMs,i),f=tle(e,{skipPrefix:i.cwd}),h=[],p=async({srcDir:_,dstDir:ne,linkType:ee,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})=>{let Z=(async()=>{try{ee===Qt.SOFT?(await K.mkdirPromise(k.dirname(ne),{recursive:!0}),await GL(k.resolve(_),ne)):await O8e(ne,_,{baseFs:t,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})}catch(O){throw O.message=`While persisting ${_} -> ${ne} ${O.message}`,O}finally{T.tick()}})().then(()=>h.splice(h.indexOf(Z),1));h.push(Z),h.length>rle&&await Promise.race(h)},m=async(_,ne,ee)=>{let A=(async()=>{let oe=async(ce,Z,O)=>{try{O.innerLoop||await K.mkdirPromise(Z,{recursive:!0});let L=await K.readdirPromise(ce,{withFileTypes:!0});for(let de of L){if(!O.innerLoop&&de.name===ib)continue;let Be=k.join(ce,de.name),je=k.join(Z,de.name);de.isDirectory()?(de.name!==jr||O&&O.innerLoop)&&(await K.mkdirPromise(je,{recursive:!0}),await oe(Be,je,te(N({},O),{innerLoop:!0}))):$.value===Ti.HARDLINKS_LOCAL||$.value===Ti.HARDLINKS_GLOBAL?await K.linkPromise(Be,je):await K.copyFilePromise(Be,je,VAe.default.constants.COPYFILE_FICLONE)}}catch(L){throw O.innerLoop||(L.message=`While cloning ${ce} -> ${Z} ${L.message}`),L}finally{O.innerLoop||T.tick()}};await oe(_,ne,ee)})().then(()=>h.splice(h.indexOf(A),1));h.push(A),h.length>rle&&await Promise.race(h)},y=async(_,ne,ee)=>{if(ee)for(let[A,oe]of ne.children){let ce=ee.children.get(A);await y(k.join(_,A),oe,ce)}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!1});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:_===a,allowSymlink:A})}};for(let[_,ne]of l){let ee=f.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A),Z=k.join(_,A);await y(Z,oe,ce)}}let b=async(_,ne,ee)=>{if(ee){nle(ne.locator,ee.locator)||await Ah(_,{contentsOnly:ne.linkType===Qt.HARD});for(let[A,oe]of ne.children){let ce=ee.children.get(A);await b(k.join(_,A),oe,ce)}}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!0});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:ne.linkType===Qt.HARD,allowSymlink:A})}};for(let[_,ne]of f){let ee=l.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A);await b(k.join(_,A),oe,ce)}}let v=new Map,x=[];for(let[_,ne]of u)for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=f.get(A),Z=A;if(ce){for(let O of oe)if(Z=k.join(Z,O),ce=ce.children.get(O),!ce)break;if(ce){let O=nle(ce.locator,_),L=e.get(ce.locator),de=L.target,Be=Z,je=L.linkType;if(O)v.has(de)||v.set(de,Be);else if(de!==Be){let re=P.parseLocator(ce.locator);P.isVirtualLocator(re)&&(re=P.devirtualizeLocator(re)),x.push({srcDir:de,dstDir:Be,linkType:je,realLocatorHash:re.locatorHash})}}}}for(let[_,{locations:ne}]of e.entries())for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=l.get(A),Z=f.get(A),O=A,L=e.get(_),de=P.parseLocator(_);P.isVirtualLocator(de)&&(de=P.devirtualizeLocator(de));let Be=de.locatorHash,je=L.target,re=ee;if(je===re)continue;let se=L.linkType;for(let be of oe)Z=Z.children.get(be);if(!ce)x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});else for(let be of oe)if(O=k.join(O,be),ce=ce.children.get(be),!ce){x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});break}}let T=Ji.progressViaCounter(x.length),q=n.reportProgress(T),Y=i.configuration.get("nmMode"),$={value:Y};try{let _=$.value===Ti.HARDLINKS_GLOBAL?`${YL(i.configuration)}/v1`:null;if(_&&!await K.existsPromise(_)){await K.mkdirpPromise(_);for(let ee=0;ee<256;ee++)await K.mkdirPromise(k.join(_,ee.toString(16).padStart(2,"0")))}for(let ee of x)(ee.linkType===Qt.SOFT||!v.has(ee.srcDir))&&(v.set(ee.srcDir,ee.dstDir),await p(te(N({},ee),{globalHardlinksStore:_,nmMode:$,packageChecksum:o.get(ee.realLocatorHash)||null})));await Promise.all(h),h.length=0;for(let ee of x){let A=v.get(ee.srcDir);ee.linkType!==Qt.SOFT&&ee.dstDir!==A&&await m(A,ee.dstDir,{nmMode:$})}await Promise.all(h),await K.mkdirPromise(a,{recursive:!0});let ne=await K8e(e,f,i.cwd,{loadManifest:s});await U8e(c,ne,i.cwd),await L8e(i,e,ne,$,{installChangedByUser:g}),Y==Ti.HARDLINKS_GLOBAL&&$.value==Ti.HARDLINKS_LOCAL&&n.reportWarningOnce(X.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{q.stop()}}async function U8e(r,e,t){for(let i of r.keys()){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=k.join(i,jr,ib);await K.removePromise(n)}}for(let[i,n]of e){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=k.join(i,jr,ib),o=r.get(i)||new Map;await K.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await K.removePromise(k.join(s,a)),process.platform==="win32"&&await K.removePromise(k.join(s,Jr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=k.join(s,a);c!==l&&(process.platform==="win32"?await(0,_Ae.default)(H.fromPortablePath(l),H.fromPortablePath(u),{createPwshFile:!1}):(await K.removePromise(u),await GL(l,u),k.contains(t,await K.realpathPromise(l))!==null&&await K.chmodPromise(l,493)))}}}var qL=class extends xu{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new sle(e)}},sle=class extends oh{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let t=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),i=NAe(e,this.opts.project.cwd,t),{tree:n,errors:s}=Om(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=P.parseLocator(g.locator),h=P.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=k.join(this.opts.project.cwd,kt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=k.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=k.join(g,h),m=n.get(p);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in m)a(`${u}/${h}`,m);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var H8e={hooks:{cleanGlobalArtifacts:async r=>{let e=YL(r);await K.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:Ie.STRING,values:[Kn.WORKSPACES,Kn.DEPENDENCIES,Kn.NONE],default:Kn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:Ie.STRING,values:[Ti.CLASSIC,Ti.HARDLINKS_LOCAL,Ti.HARDLINKS_GLOBAL],default:Ti.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:Ie.BOOLEAN,default:!0}},linkers:[HL,qL]},j8e=H8e;var qT={};ft(qT,{default:()=>V9e,npmConfigUtils:()=>br,npmHttpUtils:()=>zt,npmPublishUtils:()=>wh});var cle=ge(ri());var Cr="npm:";var zt={};ft(zt,{AuthType:()=>us,customPackageError:()=>q8e,del:()=>z8e,get:()=>bo,getIdentUrl:()=>Kl,handleInvalidAuthenticationError:()=>Ml,post:()=>J8e,put:()=>W8e});var Ale=ge(WC()),lle=ge(require("url"));var br={};ft(br,{RegistryType:()=>QA,getAuditRegistry:()=>G8e,getAuthConfiguration:()=>zL,getDefaultRegistry:()=>sb,getPublishRegistry:()=>ole,getRegistryConfiguration:()=>ale,getScopeConfiguration:()=>WL,getScopeRegistry:()=>SA,normalizeRegistry:()=>ma});var QA;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(QA||(QA={}));function ma(r){return r.replace(/\/$/,"")}function G8e(r,{configuration:e}){let t=e.get(QA.AUDIT_REGISTRY);return t!==null?ma(t):ole(r,{configuration:e})}function ole(r,{configuration:e}){var t;return((t=r.publishConfig)==null?void 0:t.registry)?ma(r.publishConfig.registry):r.name?SA(r.name.scope,{configuration:e,type:QA.PUBLISH_REGISTRY}):sb({configuration:e,type:QA.PUBLISH_REGISTRY})}function SA(r,{configuration:e,type:t=QA.FETCH_REGISTRY}){let i=WL(r,{configuration:e});if(i===null)return sb({configuration:e,type:t});let n=i.get(t);return n===null?sb({configuration:e,type:t}):ma(n)}function sb({configuration:r,type:e=QA.FETCH_REGISTRY}){let t=r.get(e);return ma(t!==null?t:r.get(QA.FETCH_REGISTRY))}function ale(r,{configuration:e}){let t=e.get("npmRegistries"),i=ma(r),n=t.get(i);if(typeof n!="undefined")return n;let s=t.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function WL(r,{configuration:e}){if(r===null)return null;let i=e.get("npmScopes").get(r);return i||null}function zL(r,{configuration:e,ident:t}){let i=t&&WL(t.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:ale(r,{configuration:e})||e}var us;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(us||(us={}));async function Ml(r,{attemptedAs:e,registry:t,headers:i,configuration:n}){var s,o;if(ob(r))throw new ct(X.AUTHENTICATION_INVALID,"Invalid OTP token");if(((s=r.originalError)==null?void 0:s.name)==="HTTPError"&&((o=r.originalError)==null?void 0:o.response.statusCode)===401)throw new ct(X.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await Y8e(t,i,{configuration:n})}`:`attempted as ${e}`})`)}function q8e(r){var e;return((e=r.response)==null?void 0:e.statusCode)===404?"Package not found":null}function Kl(r){return r.scope?`/@${r.scope}%2f${r.name}`:`/${r.name}`}async function bo(r,a){var l=a,{configuration:e,headers:t,ident:i,authType:n,registry:s}=l,o=Or(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=SA(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await ab(s,{authType:n,configuration:e,ident:i});c&&(t=te(N({},t),{authorization:c}));try{return await ir.get(r.charAt(0)==="/"?`${s}${r}`:r,N({configuration:e,headers:t},o))}catch(u){throw await Ml(u,{registry:s,configuration:e,headers:t}),u}}async function J8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.post(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h)||l)throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.post(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function W8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.put(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h))throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.put(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function z8e(r,c){var u=c,{attemptedAs:e,configuration:t,headers:i,ident:n,authType:s=3,registry:o,otp:a}=u,l=Or(u,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(n&&typeof o=="undefined"&&(o=SA(n.scope,{configuration:t})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let g=await ab(o,{authType:s,configuration:t,ident:n});g&&(i=te(N({},i),{authorization:g})),a&&(i=N(N({},i),lh(a)));try{return await ir.del(o+r,N({configuration:t,headers:i},l))}catch(f){if(!ob(f)||a)throw await Ml(f,{attemptedAs:e,registry:o,configuration:t,headers:i}),f;a=await _L();let h=N(N({},i),lh(a));try{return await ir.del(`${o}${r}`,N({configuration:t,headers:h},l))}catch(p){throw await Ml(p,{attemptedAs:e,registry:o,configuration:t,headers:i}),p}}}async function ab(r,{authType:e=2,configuration:t,ident:i}){let n=zL(r,{configuration:t,ident:i}),s=_8e(n,e);if(!s)return null;let o=await t.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,r,{configuration:t,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new ct(X.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function _8e(r,e){switch(e){case 2:return r.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function Y8e(r,e,{configuration:t}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await ir.get(new lle.URL(`${r}/-/whoami`).href,{configuration:t,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function _L(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:r}=await(0,Ale.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return r}function ob(r){var e,t;if(((e=r.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((t=r.originalError)==null?void 0:t.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function lh(r){return{["npm-otp"]:r}}var VL=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!cle.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let{params:i}=P.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await bo(i.__archiveUrl,{configuration:t.project.configuration,ident:e});return await Bi.convertToZip(n,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var XL=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!P.tryParseDescriptor(e.range.slice(Cr.length),!0))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){let i=P.parseDescriptor(e.range.slice(Cr.length),!0);return t.resolver.getResolutionDependencies(i,t)}async getCandidates(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return await i.resolver.getCandidates(n,t,i)}async getSatisfying(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return i.resolver.getSatisfying(n,t,i)}resolve(e,t){throw new Error("Unreachable")}};var ule=ge(ri()),gle=ge(require("url"));var Qo=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let i=new gle.URL(e.reference);return!(!ule.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i;try{i=await bo(Qo.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch(n){i=await bo(Qo.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:t.project.configuration,ident:e})}return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:i}){let n=SA(e.scope,{configuration:i}),s=Qo.getLocatorUrl(e);return t=t.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t=t.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t===n+s||t===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let t=Wt.clean(e.reference.slice(Cr.length));if(t===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${Kl(e)}/-/${e.name}-${t}.tgz`}};var fle=ge(ri());var Ab=P.makeIdent(null,"node-gyp"),V8e=/\b(node-gyp|prebuild-install)\b/,ZL=class{supportsDescriptor(e,t){return e.range.startsWith(Cr)?!!Wt.validRange(e.range.slice(Cr.length)):!1}supportsLocator(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i}=P.parseRange(e.reference);return!!fle.default.valid(i)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);let s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=Se.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new Wt.SemVer(c);if(n.test(u))return u}catch{}return Se.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=P.makeLocator(e,`${Cr}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Qo.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:P.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);return Se.mapAndFilter(t,s=>{try{let{selector:o}=P.parseRange(s,{requireProtocol:Cr}),a=new Wt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return Se.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>P.makeLocator(e,s))}async resolve(e,t){let{selector:i}=P.parseRange(e.reference),n=Wt.clean(i);if(n===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await bo(Kl(e),{configuration:t.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new At;if(o.load(s.versions[n]),!o.dependencies.has(Ab.identHash)&&!o.peerDependencies.has(Ab.identHash)){for(let a of o.scripts.values())if(a.match(V8e)){o.dependencies.set(Ab.identHash,P.makeDescriptor(Ab,"latest")),t.report.reportWarningOnce(X.NODE_GYP_INJECTED,`${P.prettyLocator(t.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof o.raw.deprecated=="string"&&o.raw.deprecated!==""){let a=P.prettyLocator(t.project.configuration,e),l=o.raw.deprecated.match(/\S/)?`${a} is deprecated: ${o.raw.deprecated}`:`${a} is deprecated`;t.report.reportWarningOnce(X.DEPRECATED_PACKAGE,l)}return te(N({},e),{version:n,languageName:"node",linkType:Qt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var $L=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!zg.test(e.range.slice(Cr.length)))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(Cr.length),s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=P.makeLocator(e,`${Cr}${a}`),c=s.versions[a].dist.tarball;return Qo.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[P.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Unreachable")}};var wh={};ft(wh,{getGitHead:()=>z9e,makePublishBody:()=>W9e});var HT={};ft(HT,{default:()=>k9e,packUtils:()=>PA});var PA={};ft(PA,{genPackList:()=>Pb,genPackStream:()=>UT,genPackageManifest:()=>Hce,hasPackScripts:()=>MT,prepareForPack:()=>KT});var OT=ge(is()),Kce=ge(Mce()),Uce=ge(require("zlib")),m9e=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],E9e=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function MT(r){return!!(Zt.hasWorkspaceScript(r,"prepack")||Zt.hasWorkspaceScript(r,"postpack"))}async function KT(r,{report:e},t){await Zt.maybeExecuteWorkspaceLifecycleScript(r,"prepack",{report:e});try{let i=k.join(r.cwd,At.fileName);await K.existsPromise(i)&&await r.manifest.loadFile(i,{baseFs:K}),await t()}finally{await Zt.maybeExecuteWorkspaceLifecycleScript(r,"postpack",{report:e})}}async function UT(r,e){var s,o;typeof e=="undefined"&&(e=await Pb(r));let t=new Set;for(let a of(o=(s=r.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)t.add(k.normalize(a));for(let a of r.manifest.bin.values())t.add(k.normalize(a));let i=Kce.default.pack();process.nextTick(async()=>{for(let a of e){let l=k.normalize(a),c=k.resolve(r.cwd,l),u=k.join("package",l),g=await K.lstatPromise(c),f={name:u,mtime:new Date(Rr.SAFE_TIME*1e3)},h=t.has(l)?493:420,p,m,y=new Promise((v,x)=>{p=v,m=x}),b=v=>{v?m(v):p()};if(g.isFile()){let v;l==="package.json"?v=Buffer.from(JSON.stringify(await Hce(r),null,2)):v=await K.readFilePromise(c),i.entry(te(N({},f),{mode:h,type:"file"}),v,b)}else g.isSymbolicLink()?i.entry(te(N({},f),{mode:h,type:"symlink",linkname:await K.readlinkPromise(c)}),b):b(new Error(`Unsupported file type ${g.mode} for ${H.fromPortablePath(l)}`));await y}i.finalize()});let n=(0,Uce.createGzip)();return i.pipe(n),n}async function Hce(r){let e=JSON.parse(JSON.stringify(r.manifest.raw));return await r.project.configuration.triggerHook(t=>t.beforeWorkspacePacking,r,e),e}async function Pb(r){var g,f,h,p,m,y,b,v;let e=r.project,t=e.configuration,i={accept:[],reject:[]};for(let x of E9e)i.reject.push(x);for(let x of m9e)i.accept.push(x);i.reject.push(t.get("rcFilename"));let n=x=>{if(x===null||!x.startsWith(`${r.cwd}/`))return;let T=k.relative(r.cwd,x),q=k.resolve(Me.root,T);i.reject.push(q)};n(k.resolve(e.cwd,t.get("lockfileFilename"))),n(t.get("cacheFolder")),n(t.get("globalFolder")),n(t.get("installStatePath")),n(t.get("virtualFolder")),n(t.get("yarnPath")),await t.triggerHook(x=>x.populateYarnPaths,e,x=>{n(x)});for(let x of e.workspaces){let T=k.relative(r.cwd,x.cwd);T!==""&&!T.match(/^(\.\.)?\//)&&i.reject.push(`/${T}`)}let s={accept:[],reject:[]},o=(f=(g=r.manifest.publishConfig)==null?void 0:g.main)!=null?f:r.manifest.main,a=(p=(h=r.manifest.publishConfig)==null?void 0:h.module)!=null?p:r.manifest.module,l=(y=(m=r.manifest.publishConfig)==null?void 0:m.browser)!=null?y:r.manifest.browser,c=(v=(b=r.manifest.publishConfig)==null?void 0:b.bin)!=null?v:r.manifest.bin;o!=null&&s.accept.push(k.resolve(Me.root,o)),a!=null&&s.accept.push(k.resolve(Me.root,a)),typeof l=="string"&&s.accept.push(k.resolve(Me.root,l));for(let x of c.values())s.accept.push(k.resolve(Me.root,x));if(l instanceof Map)for(let[x,T]of l.entries())s.accept.push(k.resolve(Me.root,x)),typeof T=="string"&&s.accept.push(k.resolve(Me.root,T));let u=r.manifest.files!==null;if(u){s.reject.push("/*");for(let x of r.manifest.files)jce(s.accept,x,{cwd:Me.root})}return await I9e(r.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function I9e(r,{hasExplicitFileList:e,globalList:t,ignoreList:i}){let n=[],s=new La(r),o=[[Me.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!Yce(a,{globalList:t,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Me.root)for(let m of u)g=g||m===".gitignore",f=f||m===".npmignore";let h=f?await Gce(s,a,".npmignore"):g?await Gce(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;Yce(a,{globalList:t,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let m of u)o.push([k.resolve(a,m),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(k.relative(Me.root,a))}return n.sort()}async function Gce(r,e,t){let i={accept:[],reject:[]},n=await r.readFilePromise(k.join(e,t),"utf8");for(let s of n.split(/\n/g))jce(i.reject,s,{cwd:e});return i}function y9e(r,{cwd:e}){let t=r[0]==="!";return t&&(r=r.slice(1)),r.match(/\.{0,1}\//)&&(r=k.resolve(e,r)),t&&(r=`!${r}`),r}function jce(r,e,{cwd:t}){let i=e.trim();i===""||i[0]==="#"||r.push(y9e(i,{cwd:t}))}var gs;(function(i){i[i.None=0]="None",i[i.Match=1]="Match",i[i.NegatedMatch=2]="NegatedMatch"})(gs||(gs={}));function Yce(r,{globalList:e,ignoreLists:t}){let i=Db(r,e.accept);if(i!==0)return i===2;let n=Db(r,e.reject);if(n!==0)return n===1;if(t!==null)for(let s of t){let o=Db(r,s.accept);if(o!==0)return o===2;let a=Db(r,s.reject);if(a!==0)return a===1}return!1}function Db(r,e){let t=e,i=[];for(let n=0;n{await KT(i,{report:l},async()=>{l.reportJson({base:H.fromPortablePath(i.cwd)});let c=await Pb(i);for(let u of c)l.reportInfo(null,H.fromPortablePath(u)),l.reportJson({location:H.fromPortablePath(u)});if(!this.dryRun){let u=await UT(i,c),g=K.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo(X.UNNAMED,`Package archive generated in ${ae.pretty(e,s,ae.Type.PATH)}`),l.reportJson({output:H.fromPortablePath(s)}))})).exitCode()}};rE.paths=[["pack"]],rE.usage=Re.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var Jce=rE;function w9e(r,{workspace:e}){let t=r.replace("%s",B9e(e)).replace("%v",b9e(e));return H.toPortablePath(t)}function B9e(r){return r.manifest.name!==null?P.slugifyIdent(r.manifest.name):"package"}function b9e(r){return r.manifest.version!==null?r.manifest.version:"unknown"}var Q9e=["dependencies","devDependencies","peerDependencies"],S9e="workspace:",v9e=(r,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let t=r.project;for(let s of Q9e)for(let o of r.manifest.getForScope(s).values()){let a=t.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===S9e)if(a===null){if(t.tryWorkspaceByIdent(o)===null)throw new ct(X.WORKSPACE_NOT_FOUND,`${P.prettyDescriptor(t.configuration,o)}: No local workspace found for this range`)}else{let c;P.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector;let u=s==="dependencies"?P.makeDescriptor(o,"unknown"):null,g=u!==null&&r.manifest.ensureDependencyMeta(u).optional?"optionalDependencies":s;e[g][P.stringifyIdent(o)]=c}}},x9e={hooks:{beforeWorkspacePacking:v9e},commands:[Jce]},k9e=x9e;var tue=ge(require("crypto")),rue=ge(eue()),iue=ge(require("url"));async function W9e(r,e,{access:t,tag:i,registry:n,gitHead:s}){let o=r.project.configuration,a=r.manifest.name,l=r.manifest.version,c=P.stringifyIdent(a),u=(0,tue.createHash)("sha1").update(e).digest("hex"),g=rue.default.fromData(e).toString();typeof t=="undefined"&&(r.manifest.publishConfig&&typeof r.manifest.publishConfig.access=="string"?t=r.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?t=o.get("npmPublishAccess"):a.scope?t="restricted":t="public");let f=await PA.genPackageManifest(r),h=`${c}-${l}.tgz`,p=new iue.URL(`${ma(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:t,["dist-tags"]:{[i]:l},versions:{[l]:te(N({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function z9e(r){try{let{stdout:e}=await Nr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:r});return e.trim()===""?void 0:e.trim()}catch{return}}var JT={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:Ie.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:Ie.SECRET,default:null}},nue={npmAuditRegistry:{description:"Registry to query for audit reports",type:Ie.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:Ie.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.STRING,default:"https://registry.yarnpkg.com"}},_9e={configuration:te(N(N({},JT),nue),{npmScopes:{description:"Settings per package scope",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:N(N({},JT),nue)}},npmRegistries:{description:"Settings per registry",type:Ie.MAP,normalizeKeys:ma,valueDefinition:{description:"",type:Ie.SHAPE,properties:N({},JT)}}}),fetchers:[VL,Qo],resolvers:[XL,ZL,$L]},V9e=_9e;var VT={};ft(VT,{default:()=>s_e});ys();var Ba;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ba||(Ba={}));var vo;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(vo||(vo={}));var Rb=[vo.Info,vo.Low,vo.Moderate,vo.High,vo.Critical];function sue(r,e){let t=[],i=new Set,n=o=>{i.has(o)||(i.add(o),t.push(o))};for(let o of e)n(o);let s=new Set;for(;t.length>0;){let o=t.shift(),a=r.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=r.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function X9e(r,e){return new Set([...r].filter(t=>!e.has(t)))}function Z9e(r,e,{all:t}){let i=t?r.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=sue(r,l),g=sue(r,c);return X9e(g,u)}function oue(r){let e={};for(let t of r)e[P.stringifyIdent(t)]=P.parseRange(t.range).selector;return e}function aue(r){if(typeof r=="undefined")return new Set;let e=Rb.indexOf(r),t=Rb.slice(e);return new Set(t)}function $9e(r,e){let t=aue(e),i={};for(let n of t)i[n]=r[n];return i}function Aue(r,e){var i;let t=$9e(r,e);for(let n of Object.keys(t))if((i=t[n])!=null?i:0>0)return!0;return!1}function lue(r,e){var s;let t={},i={children:t},n=Object.values(r.advisories);if(e!=null){let o=aue(e);n=n.filter(a=>o.has(a.severity))}for(let o of Se.sortMap(n,a=>a.module_name))t[o.module_name]={label:o.module_name,value:ae.tuple(ae.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:ae.tuple(ae.Type.NO_HINT,o.title)},URL:{label:"URL",value:ae.tuple(ae.Type.URL,o.url)},Severity:{label:"Severity",value:ae.tuple(ae.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ae.tuple(ae.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ae.tuple(ae.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:ae.tuple(ae.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ae.tuple(ae.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function cue(r,e,{all:t,environment:i}){let n=t?r.workspaces:[e],s=[Ba.All,Ba.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ba.All,Ba.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return oue([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function uue(r,e,{all:t}){var s;let i=Z9e(r,e,{all:t}),n={};for(let o of r.storedPackages.values())n[P.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:oue(o.dependencies.values()),dev:i.has(P.convertLocatorToDescriptor(o).descriptorHash)};return n}var sE=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=J.String("--environment",Ba.All,{description:"Which environments to cover",validator:nn(Ba)});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=J.String("--severity",vo.Info,{description:"Minimal severity requested for packages to be displayed",validator:nn(vo)})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=cue(t,i,{all:this.all,environment:this.environment}),s=uue(t,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=br.getAuditRegistry(i.manifest,{configuration:e}),l,c=await pA.start({configuration:e,stdout:this.context.stdout},async()=>{l=await zt.post("/-/npm/v1/security/audits/quick",o,{authType:zt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=Aue(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(ls.emitTree(lue(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo(X.EXCEPTION,"No audit suggestions")})).exitCode()}};sE.paths=[["npm","audit"]],sE.usage=Re.Usage({description:"perform a vulnerability audit against the installed packages",details:` - This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). - - For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${Rb.map(e=>`\`${e}\``).join(", ")}. - - If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. - - To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. - `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var gue=sE;var WT=ge(ri()),zT=ge(require("util")),oE=class extends Le{constructor(){super(...arguments);this.fields=J.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let x=t.topLevelWorkspace;if(!x.manifest.name)throw new Pe(`Missing ${ae.pretty(e,"name",ae.Type.CODE)} field in ${H.fromPortablePath(k.join(x.cwd,kt.manifest))}`);c=P.makeDescriptor(x.manifest.name,"unknown")}else c=P.parseDescriptor(l);let u=zt.getIdentUrl(c),g=_T(await zt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:zt.customPackageError})),f=Object.keys(g.versions).sort(WT.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],m=Wt.validRange(c.range);if(m){let x=WT.default.maxSatisfying(f,m);x!==null?p=x:(a.reportWarning(X.UNNAMED,`Unmet range ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else Object.prototype.hasOwnProperty.call(g["dist-tags"],c.range)?p=g["dist-tags"][c.range]:c.range!=="unknown"&&(a.reportWarning(X.UNNAMED,`Unknown tag ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let y=g.versions[p],b=te(N(N({},g),y),{version:p,versions:f}),v;if(i!==null){v={};for(let x of i){let T=b[x];if(typeof T!="undefined")v[x]=T;else{a.reportWarning(X.EXCEPTION,`The ${ae.pretty(e,x,ae.Type.CODE)} field doesn't exist inside ${P.prettyIdent(e,c)}'s information`),s=!0;continue}}}else this.json||(delete b.dist,delete b.readme,delete b.users),v=b;a.reportJson(v),this.json||n.push(v)}});zT.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,zT.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} -`);return o.exitCode()}};oE.paths=[["npm","info"]],oE.usage=Re.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var fue=oE;function _T(r){if(Array.isArray(r)){let e=[];for(let t of r)t=_T(t),t&&e.push(t);return e}else if(typeof r=="object"&&r!==null){let e={};for(let t of Object.keys(r)){if(t.startsWith("_"))continue;let i=_T(r[t]);i&&(e[t]=i)}return e}else return r||null}var hue=ge(WC()),aE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await t_e({registry:t,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await zt.put(o,s,{attemptedAs:s.name,configuration:e,registry:t,jsonResponse:!0,authType:zt.AuthType.NO_AUTH});return await e_e(t,a.token,{configuration:e,scope:this.scope}),n.reportInfo(X.UNNAMED,"Successfully logged in")})).exitCode()}};aE.paths=[["npm","login"]],aE.usage=Re.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var pue=aE;async function Fb({scope:r,publish:e,configuration:t,cwd:i}){return r&&e?br.getScopeRegistry(r,{configuration:t,type:br.RegistryType.PUBLISH_REGISTRY}):r?br.getScopeRegistry(r,{configuration:t}):e?br.getPublishRegistry((await Wf(t,i)).manifest,{configuration:t}):br.getDefaultRegistry({configuration:t})}async function e_e(r,e,{configuration:t,scope:i}){let n=o=>a=>{let l=Se.isIndexableObject(a)?a:{},c=l[o],u=Se.isIndexableObject(c)?c:{};return te(N({},l),{[o]:te(N({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(r)};return await ye.updateHomeConfiguration(s)}async function t_e({registry:r,report:e,stdin:t,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(X.UNNAMED,`Logging in to ${r}`);let n=!1;r.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(X.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,hue.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var Bh=new Set(["npmAuthIdent","npmAuthToken"]),AE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=J.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=async()=>{var l;let n=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await ye.find(this.context.cwd,this.context.plugins),o=P.makeIdent((l=this.scope)!=null?l:null,"pkg");return!br.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await r_e(),n.reportInfo(X.UNNAMED,"Successfully logged out from everything")),this.scope){await due("npmScopes",this.scope),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(X.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish});await due("npmRegistries",s),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(X.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};AE.paths=[["npm","logout"]],AE.usage=Re.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Cue=AE;function i_e(r,e){let t=r[e];if(!Se.isIndexableObject(t))return!1;let i=new Set(Object.keys(t));if([...Bh].every(s=>!i.has(s)))return!1;for(let s of Bh)i.delete(s);if(i.size===0)return r[e]=void 0,!0;let n=N({},t);for(let s of Bh)delete n[s];return r[e]=n,!0}async function r_e(){let r=e=>{let t=!1,i=Se.isIndexableObject(e)?N({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,t=!0);for(let n of Object.keys(i))i_e(i,n)&&(t=!0);if(Object.keys(i).length!==0)return t?i:e};return await ye.updateHomeConfiguration({npmRegistries:r,npmScopes:r})}async function due(r,e){return await ye.updateHomeConfiguration({[r]:t=>{let i=Se.isIndexableObject(t)?t:{};if(!Object.prototype.hasOwnProperty.call(i,e))return t;let n=i[e],s=Se.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...Bh].every(l=>!o.has(l)))return t;for(let l of Bh)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:te(N({},i),{[e]:void 0});let a={};for(let l of Bh)a[l]=void 0;return te(N({},i),{[e]:N(N({},s),a)})}})}var lE=class extends Le{constructor(){super(...arguments);this.access=J.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=J.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=J.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=J.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);if(i.manifest.private)throw new Pe("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new Pe("Workspaces must have valid names and versions to be published on an external registry");await t.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=br.getPublishRegistry(i.manifest,{configuration:e});return(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await zt.get(zt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(X.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Zt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await PA.prepareForPack(i,{report:l},async()=>{let g=await PA.genPackList(i);for(let y of g)l.reportInfo(null,y);let f=await PA.genPackStream(i,g),h=await Se.bufferStream(f),p=await wh.getGitHead(i.cwd),m=await wh.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await zt.put(zt.getIdentUrl(n),m,{configuration:e,registry:o,ident:n,otp:this.otp,jsonResponse:!0})}),l.reportInfo(X.UNNAMED,"Package archive published")})).exitCode()}};lE.paths=[["npm","publish"]],lE.usage=Re.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var mue=lE;var Iue=ge(ri());var cE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=P.parseIdent(this.package);else{if(!i)throw new ht(t.cwd,this.context.cwd);if(!i.manifest.name)throw new Pe(`Missing 'name' field in ${H.fromPortablePath(k.join(i.cwd,kt.manifest))}`);n=i.manifest.name}let s=await uE(n,e),a={children:Se.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:ae.tuple(ae.Type.RESOLUTION,{descriptor:P.makeDescriptor(n,l),locator:P.makeLocator(n,c)})}))};return ls.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};cE.paths=[["npm","tag","list"]],cE.usage=Re.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Eue=cE;async function uE(r,e){let t=`/-/package${zt.getIdentUrl(r)}/dist-tags`;return zt.get(t,{configuration:e,ident:r,jsonResponse:!0,customErrorMessage:zt.customPackageError})}var gE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseDescriptor(this.package,!0),s=n.range;if(!Iue.default.valid(s))throw new Pe(`The range ${ae.pretty(e,n.range,ae.Type.RANGE)} must be a valid semver version`);let o=br.getPublishRegistry(i.manifest,{configuration:e}),a=ae.pretty(e,n,ae.Type.IDENT),l=ae.pretty(e,s,ae.Type.RANGE),c=ae.pretty(e,this.tag,ae.Type.CODE);return(await Je.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await uE(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning(X.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(X.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};gE.paths=[["npm","tag","add"]],gE.usage=Re.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. - `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var yue=gE;var fE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){if(this.tag==="latest")throw new Pe("The 'latest' tag cannot be removed.");let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseIdent(this.package),s=br.getPublishRegistry(i.manifest,{configuration:e}),o=ae.pretty(e,this.tag,ae.Type.CODE),a=ae.pretty(e,n,ae.Type.IDENT),l=await uE(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new Pe(`${o} is not a tag of package ${a}`);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(X.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};fE.paths=[["npm","tag","remove"]],fE.usage=Re.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var wue=fE;var hE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t;return this.scope&&this.publish?t=br.getScopeRegistry(this.scope,{configuration:e,type:br.RegistryType.PUBLISH_REGISTRY}):this.scope?t=br.getScopeRegistry(this.scope,{configuration:e}):this.publish?t=br.getPublishRegistry((await Wf(e,this.context.cwd)).manifest,{configuration:e}):t=br.getDefaultRegistry({configuration:e}),(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await zt.get("/-/whoami",{configuration:e,registry:t,authType:zt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?P.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(X.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(X.UNNAMED,s.username)})).exitCode()}};hE.paths=[["npm","whoami"]],hE.usage=Re.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var Bue=hE;var n_e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:Ie.STRING,default:null}},commands:[gue,fue,pue,Cue,mue,yue,Eue,wue,Bue]},s_e=n_e;var nO={};ft(nO,{default:()=>y_e,patchUtils:()=>XT});var XT={};ft(XT,{applyPatchFile:()=>Tb,diffFolders:()=>tO,extractPackageToDisk:()=>eO,extractPatchFlags:()=>Due,isParentRequired:()=>$T,loadPatchFiles:()=>mE,makeDescriptor:()=>m_e,makeLocator:()=>ZT,parseDescriptor:()=>dE,parseLocator:()=>CE,parsePatchFile:()=>Lb});var pE=class extends Error{constructor(e,t){super(`Cannot apply hunk #${e+1}`);this.hunk=t}};var o_e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function bh(r){return k.relative(Me.root,k.resolve(Me.root,H.toPortablePath(r)))}function a_e(r){let e=r.trim().match(o_e);if(!e)throw new Error(`Bad header line: '${r}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var A_e=420,l_e=493,Zr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Zr||(Zr={}));var bue=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),c_e=r=>({header:a_e(r),parts:[]}),u_e={["@"]:"header",["-"]:Zr.Deletion,["+"]:Zr.Insertion,[" "]:Zr.Context,["\\"]:"pragma",undefined:Zr.Context};function f_e(r){let e=[],t=bue(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),t.hunks.push(n),n=null)}function a(){o(),e.push(t),t=bue()}for(let l=0;l0?"patch":"mode change",v=null;switch(b){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:bh(u),toPath:bh(g)}),v=g}break;case"file deletion":{let x=n||p;if(!x)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(l),hash:f})}break;case"file creation":{let x=s||m;if(!x)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(c),hash:h})}break;case"patch":case"mode change":v=m||s;break;default:Se.assertNever(b);break}v&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:bh(v),oldMode:Nb(o),newMode:Nb(a)}),v&&y&&y.length&&e.push({type:"patch",semverExclusivity:i,path:bh(v),hunks:y,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function Nb(r){let e=parseInt(r,8)&511;if(e!==A_e&&e!==l_e)throw new Error(`Unexpected file mode string: ${r}`);return e}function Lb(r){let e=r.split(/\n/g);return e[e.length-1]===""&&e.pop(),h_e(f_e(e))}function g_e(r){let e=0,t=0;for(let{type:i,lines:n}of r.parts)switch(i){case Zr.Context:t+=n.length,e+=n.length;break;case Zr.Deletion:e+=n.length;break;case Zr.Insertion:t+=n.length;break;default:Se.assertNever(i);break}if(e!==r.header.original.length||t!==r.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(r.header.original.length)} ${i(r.header.patched.length)} @@, got @@ ${i(e)} ${i(t)} @@)`)}}async function Qh(r,e,t){let i=await r.lstatPromise(e),n=await t();if(typeof n!="undefined"&&(e=n),r.lutimesPromise)await r.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await r.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function Tb(r,{baseFs:e=new ar,dryRun:t=!1,version:i=null}={}){for(let n of r)if(!(n.semverExclusivity!==null&&i!==null&&!Wt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(t){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await Qh(e,k.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(t){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await Qh(e,k.dirname(n.fromPath),async()=>{await Qh(e,k.dirname(n.toPath),async()=>{await Qh(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(t){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` -`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(k.dirname(n.path),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,Rr.SAFE_TIME,Rr.SAFE_TIME)}break;case"patch":await Qh(e,n.path,async()=>{await p_e(n,{baseFs:e,dryRun:t})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(Que(n.newMode)!==Que(o))continue;await Qh(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:Se.assertNever(n);break}}function Que(r){return(r&64)>0}function Sue(r){return r.replace(/\s+$/,"")}function d_e(r,e){return Sue(r)===Sue(e)}async function p_e({hunks:r,path:e},{baseFs:t,dryRun:i=!1}){let n=await t.statSync(e).mode,o=(await t.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of r){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),m=Math.max(h,p),y=0,b=0,v=null;for(;y<=m;){if(y<=h&&(b=f-y,v=vue(g,o,b),v!==null)){y=-y;break}if(y<=p&&(b=f+y,v=vue(g,o,b),v!==null))break;y+=1}if(v===null)throw new pE(r.indexOf(g),g);a.push(v),l+=y,c=b+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:Se.assertNever(f);break}await t.writeFilePromise(e,o.join(` -`),{mode:n})}function vue(r,e,t){let i=[];for(let n of r.parts)switch(n.type){case Zr.Context:case Zr.Deletion:{for(let s of n.lines){let o=e[t];if(o==null||!d_e(o,s))return null;t+=1}n.type===Zr.Deletion&&(i.push({type:"splice",index:t-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Zr.Insertion:i.push({type:"splice",index:t,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:Se.assertNever(n.type);break}return i}var C_e=/^builtin<([^>]+)>$/;function xue(r,e){let{source:t,selector:i,params:n}=P.parseRange(r);if(t===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>H.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?P.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(t);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function dE(r){let i=xue(r.range,P.parseDescriptor),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceDescriptor:e})}function CE(r){let i=xue(r.reference,P.parseLocator),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceLocator:e})}function kue({parentLocator:r,sourceItem:e,patchPaths:t,sourceVersion:i,patchHash:n},s){let o=r!==null?{locator:P.stringifyLocator(r)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return P.makeRange({protocol:"patch:",source:s(e),selector:t.join("&"),params:N(N(N({},a),l),o)})}function m_e(r,{parentLocator:e,sourceDescriptor:t,patchPaths:i}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,patchPaths:i},P.stringifyDescriptor))}function ZT(r,{parentLocator:e,sourcePackage:t,patchPaths:i,patchHash:n}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,sourceVersion:t.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function Pue({onAbsolute:r,onRelative:e,onBuiltin:t},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(C_e);return s!==null?t(s[1]):k.isAbsolute(i)?r(i):e(i)}function Due(r){let e=r.startsWith("~");return e&&(r=r.slice(1)),{optional:e}}function $T(r){return Pue({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},r)}async function mE(r,e,t){let i=r!==null?await t.fetcher.fetch(r,t):null,n=i&&i.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await Se.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Due(o),l=await Pue({onAbsolute:async()=>await K.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(k.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await t.project.configuration.firstHook(u=>u.getBuiltinPatch,t.project,c)},o);return te(N({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` -`));return s}async function eO(r,{cache:e,project:t}){let i=t.storedPackages.get(r.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=t.storedChecksums,s=new di,o=t.configuration.makeFetcher(),a=await o.fetch(r,{cache:e,project:t,fetcher:o,checksums:n,report:s}),l=await K.mktempPromise(),c=k.join(l,"source"),u=k.join(l,"user"),g=k.join(l,".yarn-patch.json");return await Promise.all([K.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),K.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),K.writeJsonPromise(g,{locator:P.stringifyLocator(r),version:i.version})]),K.detachTemp(l),u}async function tO(r,e){let t=H.fromPortablePath(r).replace(/\\/g,"/"),i=H.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await Nr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",t,i],{cwd:H.toPortablePath(process.cwd()),env:te(N({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${s}`);let o=t.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${Se.escapeRegExp(`/${o(t)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${Se.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(Se.escapeRegExp(`${t}/`),"g"),"").replace(new RegExp(Se.escapeRegExp(`${i}/`),"g"),"")}function Rue(r,{configuration:e,report:t}){for(let i of r.parts)for(let n of i.lines)switch(i.type){case Zr.Context:t.reportInfo(null,` ${ae.pretty(e,n,"grey")}`);break;case Zr.Deletion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`- ${ae.pretty(e,n,ae.Type.REMOVED)}`);break;case Zr.Insertion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`+ ${ae.pretty(e,n,ae.Type.ADDED)}`);break;default:Se.assertNever(i.type)}}var rO=class{supports(e,t){return!!e.reference.startsWith("patch:")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async patchPackage(e,t){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=CE(e),a=await mE(i,o,t),l=await K.mktempPromise(),c=k.join(l,"current.zip"),u=await t.fetcher.fetch(n,t),g=P.getIdentVendorPath(e),f=await fn(),h=new li(c,{libzip:f,create:!0,level:t.project.configuration.get("compressionLevel")});await Se.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:m}of a){if(p===null)continue;let y=new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")}),b=new _t(k.resolve(Me.root,g),{baseFs:y});try{await Tb(Lb(p),{baseFs:b,version:s})}catch(v){if(!(v instanceof pE))throw v;let x=t.project.configuration.get("enableInlineHunks"),T=!x&&!m?" (set enableInlineHunks for details)":"",q=`${P.prettyLocator(t.project.configuration,e)}: ${v.message}${T}`,Y=$=>{!x||Rue(v.hunk,{configuration:t.project.configuration,report:$})};if(y.discardAndClose(),m){t.report.reportWarningOnce(X.PATCH_HUNK_FAILED,q,{reportExtra:Y});continue}else throw new ct(X.PATCH_HUNK_FAILED,q,Y)}y.saveAndClose()}return new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")})}};var E_e=3,iO=class{supportsDescriptor(e,t){return!!e.range.startsWith("patch:")}supportsLocator(e,t){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){let{patchPaths:n}=dE(e);return n.every(s=>!$T(s))?e:P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){let{sourceDescriptor:i}=dE(e);return[i]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=dE(e),a=await mE(n,o,i.fetchOptions),l=t.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=Dn.makeHash(`${E_e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[ZT(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){let{sourceLocator:i}=CE(e),n=await t.resolver.resolve(i,t);return N(N({},n),e)}};var EE=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=k.resolve(this.context.cwd,H.toPortablePath(this.patchFolder)),s=k.join(n,"../source"),o=k.join(n,"../.yarn-patch.json");if(!K.existsSync(s))throw new Pe("The argument folder didn't get created by 'yarn patch'");let a=await tO(s,n),l=await K.readJsonPromise(o),c=P.parseLocator(l.locator,!0);if(!t.storedPackages.has(c.locatorHash))throw new Pe("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=k.join(u,`${P.slugifyLocator(c)}.patch`);await K.mkdirPromise(u,{recursive:!0}),await K.writeFilePromise(g,a);let f=k.relative(t.cwd,g);t.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:P.stringifyIdent(c),description:l.version}},reference:`patch:${P.stringifyLocator(c)}#${f}`}),await t.persist()}};EE.paths=[["patch-commit"]],EE.usage=Re.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var Fue=EE;var IE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=P.parseLocator(this.package);if(s.reference==="unknown"){let o=Se.mapAndFilter([...t.storedPackages.values()],a=>a.identHash!==s.identHash?Se.mapAndFilter.skip:P.isVirtualLocator(a)?Se.mapAndFilter.skip:a);if(o.length===0)throw new Pe("No package found in the project for the given locator");if(o.length>1)throw new Pe(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${o.map(a=>` -- ${P.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!t.storedPackages.has(s.locatorHash))throw new Pe("No package found in the project for the given locator");await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await eO(s,{cache:n,project:t});o.reportJson({locator:P.stringifyLocator(s),path:H.fromPortablePath(a)}),o.reportInfo(X.UNNAMED,`Package ${P.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(X.UNNAMED,`You can now edit the following folder: ${ae.pretty(e,H.fromPortablePath(a),"magenta")}`),o.reportInfo(X.UNNAMED,`Once you are done run ${ae.pretty(e,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${H.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};IE.paths=[["patch"]],IE.usage=Re.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n \n Once you're done with your changes, run `yarn patch-commit -s ` (with `` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n "});var Nue=IE;var I_e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:Ie.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[Fue,Nue],fetchers:[rO],resolvers:[iO]},y_e=I_e;var AO={};ft(AO,{default:()=>b_e});var sO=class{supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=n.pathByLocator.get(e.locatorHash);if(typeof s=="undefined")throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return s}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=k.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new Lue(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},Lue=class{constructor(e){this.opts=e;this.asyncActions=new Se.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return oO()}attachCustomData(e){}async installPackage(e,t,i){switch(e.linkType){case Qt.SOFT:return this.installPackageSoft(e,t,i);case Qt.HARD:return this.installPackageHard(e,t,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,t,i){let n=k.resolve(t.packageFs.getRealPath(),t.prefixPath);return this.customData.pathByLocator.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,t,i){var u;let n=w_e(e,{project:this.opts.project});this.customData.locatorByPath.set(n,P.stringifyLocator(e)),this.customData.pathByLocator.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,t.prefixPath,{baseFs:t.packageFs,overwrite:!1})}));let o=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e,a={manifest:(u=await At.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?u:new At,misc:{hasBindingGyp:Ca.hasBindingGyp(t)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Ca.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,t){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!Mue(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.customData.pathByLocator.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(e)})`);let s=k.join(n,kt.nodeModules),o=[],a=await Kue(s);for(let[l,c]of t){let u=c;Mue(c,{project:this.opts.project})||(this.opts.report.reportWarning(X.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=P.devirtualizeLocator(c));let g=this.customData.pathByLocator.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(c)})`);let f=P.stringifyIdent(l),h=k.join(s,f),p=k.relative(k.dirname(h),g),m=a.get(f);a.delete(f),o.push(Promise.resolve().then(async()=>{if(m){if(m.isSymbolicLink()&&await K.readlinkPromise(h)===p)return;await K.removePromise(h)}await K.mkdirpPromise(k.dirname(h)),process.platform=="win32"?await K.symlinkPromise(g,h,"junction"):await K.symlinkPromise(p,h)}))}o.push(Uue(s,a)),await Promise.all(o)}))}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=Oue(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await K.removePromise(e);else{let t=[],i=new Set;for(let s of this.customData.pathByLocator.values()){let o=k.contains(e,s);if(o!==null){let[a,,...l]=o.split(k.sep);i.add(a);let c=k.join(e,a);t.push(K.readdirPromise(c).then(u=>Promise.all(u.map(async g=>{let f=k.join(c,g);if(g===kt.nodeModules){let h=await Kue(f);return h.delete(l.join(k.sep)),Uue(f,h)}else return K.removePromise(f)}))).catch(u=>{if(u.code!=="ENOENT")throw u}))}}let n;try{n=await K.readdirPromise(e)}catch{n=[]}for(let s of n)i.has(s)||t.push(K.removePromise(k.join(e,s)));await Promise.all(t)}return await this.asyncActions.wait(),await aO(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await aO(Tue(this.opts.project)),{customData:this.customData}}};function oO(){return JSON.stringify({name:"PnpmInstaller",version:2})}function Tue(r){return k.join(r.cwd,kt.nodeModules)}function Oue(r){return k.join(Tue(r),".store")}function w_e(r,{project:e}){let t=P.slugifyLocator(r),i=P.getIdentVendorPath(r);return k.join(Oue(e),t,i)}function Mue(r,{project:e}){return!P.isVirtualLocator(r)||!e.tryWorkspaceByLocator(r)}async function Kue(r){let e=new Map,t=[];try{t=await K.readdirPromise(r,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of t)if(!i.name.startsWith("."))if(i.name.startsWith("@")){let n=await K.readdirPromise(k.join(r,i.name),{withFileTypes:!0});if(n.length===0)e.set(i.name,i);else for(let s of n)e.set(`${i.name}/${s.name}`,s)}else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}async function Uue(r,e){var n;let t=[],i=new Set;for(let s of e.keys()){t.push(K.removePromise(k.join(r,s)));let o=(n=P.tryParseIdent(s))==null?void 0:n.scope;o&&i.add(`@${o}`)}return Promise.all(t).then(()=>Promise.all([...i].map(s=>aO(k.join(r,s)))))}async function aO(r){try{await K.rmdirPromise(r)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var B_e={linkers:[sO]},b_e=B_e;var L0=()=>({modules:new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",cZ(Cp)],["semver",Q_e],["typanion",cg],["yup",S_e],["@yarnpkg/plugin-essentials",GN],["@yarnpkg/plugin-compat",zN],["@yarnpkg/plugin-dlx",_N],["@yarnpkg/plugin-file",nL],["@yarnpkg/plugin-git",jN],["@yarnpkg/plugin-github",oL],["@yarnpkg/plugin-http",lL],["@yarnpkg/plugin-init",fL],["@yarnpkg/plugin-link",mL],["@yarnpkg/plugin-nm",JL],["@yarnpkg/plugin-npm",qT],["@yarnpkg/plugin-npm-cli",VT],["@yarnpkg/plugin-pack",HT],["@yarnpkg/plugin-patch",nO],["@yarnpkg/plugin-pnp",LL],["@yarnpkg/plugin-pnpm",AO]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});s0({binaryVersion:Ur||"",pluginConfiguration:L0()});})(); -/*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - */ -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ From 975af0c79b0437e4cdbf008f05d0e65e323c879c Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 26 Jan 2023 12:00:25 +0000 Subject: [PATCH 249/591] remove the empty interface and return the array instead --- nym-api/tests/src/endpoints/ContractCache.ts | 6 ++---- nym-api/tests/src/types/ContractCacheTypes.ts | 4 ---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/nym-api/tests/src/endpoints/ContractCache.ts b/nym-api/tests/src/endpoints/ContractCache.ts index 7ca044d8d1..16ae21f9aa 100644 --- a/nym-api/tests/src/endpoints/ContractCache.ts +++ b/nym-api/tests/src/endpoints/ContractCache.ts @@ -3,8 +3,6 @@ import { AllGateways, AllMixnodes, EpochRewardParams, - BlacklistedGateways, - BlacklistedMixnodes, CurrentEpoch, } from "../types/ContractCacheTypes"; import { APIClient } from "./abstracts/APIClient"; @@ -64,14 +62,14 @@ export default class ContractCache extends APIClient { return response.data; } - public async getBlacklistedMixnodes(): Promise { + public async getBlacklistedMixnodes(): Promise<[]> { const response = await this.restClient.sendGet({ route: `mixnodes/blacklisted`, }); return response.data; } - public async getBlacklistedGateways(): Promise { + public async getBlacklistedGateways(): Promise<[]> { const response = await this.restClient.sendGet({ route: `gateways/blacklisted`, }); diff --git a/nym-api/tests/src/types/ContractCacheTypes.ts b/nym-api/tests/src/types/ContractCacheTypes.ts index 05cfaa2aa8..bf83b0cd95 100644 --- a/nym-api/tests/src/types/ContractCacheTypes.ts +++ b/nym-api/tests/src/types/ContractCacheTypes.ts @@ -75,10 +75,6 @@ export interface MixnodesDetailed { family: string; } -export interface BlacklistedMixnodes {} - -export interface BlacklistedGateways {} - export interface Gateway { host: string; mix_port: number; From 3e6188ed13b9719eec2cb9a70f5a9a6629adba84 Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Thu, 26 Jan 2023 14:17:29 +0100 Subject: [PATCH 250/591] nym-connect-android initial version (#2907) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(nym-connect): add android support * fix(nym-connect): android linker issue with sqlite3 get rid of sqlite refs as temporary workaround * fix(nc): fix index.ts (post rebase) * feat(nc-android): wip * hack in config removal of read/write * fix(nc-android): remove more fs read/write calls * wip * chore: remove debug comments * Register gateway * client-core: remove unneeded changes * build: revert crate name change * refactor(socks5-client): add feature mobile * refactor(gateway-client): rename mobile feature * socks5: restore default_root_directory * client-core: further simplifications * get_config_file_location just return error * fix(nc-mobile): fix ui mobile * socks5: minor tweak to default_root_directory * remove unneeded changes * nym-connect build fixes * Use default feature for normal credential storage * rustfmt * rustfmt: nym-connect * restore Cargo.toml * Remove --all-features from workflow * Remove some unused use * Remove two move --all-features from build workflow * Allow unused * Add continue-on-error * another clippy --all-features remove * remove --all-features from clippy nightly * fix(nc-mobile): frontend code errors * feat: restore nc, move mobile under its own dir * fix(nc-android): build * fix(nc-android): lint errors Co-authored-by: Jon Häggblad --- .github/workflows/build.yml | 2 +- .github/workflows/wallet.yml | 1 + Cargo.lock | 10 + Cargo.toml | 3 +- .../src/client/base_client/helpers.rs | 11 + .../client-core/src/client/base_client/mod.rs | 2 + .../client/base_client/non_wasm_helpers.rs | 9 +- clients/socks5/Cargo.toml | 5 +- clients/socks5/src/client/config/mod.rs | 16 +- clients/socks5/src/client/mod.rs | 51 ++- common/client-libs/gateway-client/Cargo.toml | 2 + .../gateway-client/src/bandwidth.rs | 15 + .../client-libs/gateway-client/src/client.rs | 10 +- .../client-libs/gateway-client/src/error.rs | 4 + common/mobile-storage/Cargo.toml | 11 + common/mobile-storage/src/lib.rs | 67 ++++ lerna.json | 1 + nym-connect-android/.DS_Store | Bin 0 -> 6148 bytes nym-connect-android/.babelrc | 15 + nym-connect-android/.env.sample | 1 + nym-connect-android/.eslintrc | 8 + nym-connect-android/.nvmrc | 1 + nym-connect-android/.prettierrc | 7 + nym-connect-android/.storybook/main.js | 73 ++++ .../.storybook/mocks/tauri/app.js | 8 + .../.storybook/mocks/tauri/clipboard.js | 8 + .../.storybook/mocks/tauri/event.js | 8 + .../.storybook/mocks/tauri/index.js | 14 + .../.storybook/mocks/tauri/notification.js | 10 + .../.storybook/mocks/tauri/window.js | 10 + .../.storybook/preview-fonts.js | 3 + nym-connect-android/.storybook/preview.js | 26 ++ nym-connect-android/CHANGELOG.md | 98 +++++ nym-connect-android/README.md | 95 +++++ nym-connect-android/package.json | 116 ++++++ nym-connect-android/public/favicon.ico | Bin 0 -> 5430 bytes nym-connect-android/public/favicon.png | Bin 0 -> 1312 bytes nym-connect-android/public/growth.html.back | 11 + nym-connect-android/public/index.html | 11 + nym-connect-android/public/log.html.back | 11 + .../src-tauri/.cargo/config.toml | 41 +++ nym-connect-android/src-tauri/.cargo/libgcc.a | 1 + nym-connect-android/src-tauri/.gitignore | 4 + nym-connect-android/src-tauri/Cargo.toml | 66 ++++ .../android/nym-connect-android/.editorconfig | 12 + .../android/nym-connect-android/.gitignore | 17 + .../nym-connect-android/app/.gitignore | 1 + .../nym-connect-android/app/build.gradle.kts | 111 ++++++ .../app/proguard-rules.pro | 21 ++ .../app/src/main/AndroidManifest.xml | 20 + .../nym-connect-android/MainActivity.kt | 3 + .../jniLibs/x86_64/libnym_connect_android.so | 1 + .../drawable-v24/ic_launcher_foreground.xml | 30 ++ .../res/drawable/ic_launcher_background.xml | 170 +++++++++ .../app/src/main/res/layout/activity_main.xml | 18 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3524 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 14102 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3524 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3377 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 9081 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3377 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7971 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 18900 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7971 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 12392 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 29506 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12392 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 16751 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 40510 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16751 bytes .../app/src/main/res/values-night/themes.xml | 16 + .../app/src/main/res/values/colors.xml | 10 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 16 + .../nym-connect-android/build.gradle.kts | 25 ++ .../buildSrc/build.gradle.kts | 23 ++ .../nym-connect-android/gradle.properties | 23 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../gen/android/nym-connect-android/gradlew | 185 ++++++++++ .../android/nym-connect-android/gradlew.bat | 89 +++++ .../nym-connect-android/settings.gradle | 1 + .../src-tauri/icons/128x128.png | Bin 0 -> 11741 bytes .../src-tauri/icons/128x128@2x.png | Bin 0 -> 25778 bytes nym-connect-android/src-tauri/icons/32x32.png | Bin 0 -> 2394 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 9407 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 12553 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 13324 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 28970 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 2212 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 31861 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 3527 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 5694 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 7511 bytes .../src-tauri/icons/StoreLogo.png | Bin 0 -> 3996 bytes nym-connect-android/src-tauri/icons/icon.icns | Bin 0 -> 318732 bytes nym-connect-android/src-tauri/icons/icon.ico | Bin 0 -> 40889 bytes nym-connect-android/src-tauri/icons/icon.png | Bin 0 -> 61553 bytes .../src-tauri/icons/tray_icon.ico | Bin 0 -> 38265 bytes .../src-tauri/icons/tray_icon.png | Bin 0 -> 56946 bytes nym-connect-android/src-tauri/src/build.rs | 3 + .../src-tauri/src/config/mod.rs | 154 ++++++++ nym-connect-android/src-tauri/src/error.rs | 91 +++++ nym-connect-android/src-tauri/src/events.rs | 71 ++++ nym-connect-android/src-tauri/src/lib.rs | 98 +++++ nym-connect-android/src-tauri/src/logging.rs | 118 ++++++ nym-connect-android/src-tauri/src/main.rs | 16 + nym-connect-android/src-tauri/src/menu.rs | 62 ++++ nym-connect-android/src-tauri/src/mobile.rs | 4 + .../src-tauri/src/models/mod.rs | 116 ++++++ .../src/operations/connection/connect.rs | 68 ++++ .../src/operations/connection/disconnect.rs | 20 + .../src/operations/connection/health_check.rs | 26 ++ .../src/operations/connection/mod.rs | 4 + .../src/operations/connection/status.rs | 44 +++ .../src-tauri/src/operations/directory/mod.rs | 51 +++ .../src-tauri/src/operations/export.rs | 91 +++++ .../src/operations/growth/api_client.rs | 270 ++++++++++++++ .../src-tauri/src/operations/growth/assets.rs | 57 +++ .../src-tauri/src/operations/growth/mod.rs | 3 + .../src/operations/growth/test_and_earn.rs | 159 ++++++++ .../src-tauri/src/operations/help/log.rs | 31 ++ .../src-tauri/src/operations/help/mod.rs | 2 + .../src-tauri/src/operations/help/storage.rs | 20 + .../src-tauri/src/operations/http.rs | 37 ++ .../src-tauri/src/operations/mod.rs | 8 + .../src-tauri/src/operations/window/mod.rs | 7 + nym-connect-android/src-tauri/src/state.rs | 267 ++++++++++++++ nym-connect-android/src-tauri/src/tasks.rs | 205 +++++++++++ nym-connect-android/src-tauri/src/window.rs | 30 ++ nym-connect-android/src-tauri/tauri.conf.json | 77 ++++ nym-connect-android/src/App.tsx | 94 +++++ .../src/assets/help-step-four.png | Bin 0 -> 8530 bytes .../src/assets/help-step-one.png | Bin 0 -> 14403 bytes .../src/assets/help-step-three.png | Bin 0 -> 18990 bytes .../src/assets/help-step-two.png | Bin 0 -> 35631 bytes .../src/components/AppVersion.tsx | 15 + .../src/components/AppWindowFrame.tsx | 20 + .../src/components/ConnectionButton.tsx | 168 +++++++++ .../src/components/ConnectionStats.tsx | 47 +++ .../src/components/ConnectionStatus.tsx | 90 +++++ .../src/components/ConntectionTimer.tsx | 26 ++ .../src/components/CopyToClipboard.tsx | 69 ++++ .../src/components/CustomTitleBar.tsx | 43 +++ nym-connect-android/src/components/Error.tsx | 17 + .../src/components/ErrorFallback.tsx | 17 + .../Growth/TestAndEarnButtonArea.tsx | 84 +++++ .../Growth/TestAndEarnCurrentDraw.stories.tsx | 94 +++++ .../Growth/TestAndEarnCurrentDraw.tsx | 192 ++++++++++ .../Growth/TestAndEarnDraws.stories.tsx | 19 + .../components/Growth/TestAndEarnDraws.tsx | 196 ++++++++++ .../TestAndEarnEnterWalletAddress.stories.tsx | 41 +++ .../Growth/TestAndEarnEnterWalletAddress.tsx | 37 ++ .../components/Growth/TestAndEarnError.tsx | 13 + .../Growth/TestAndEarnPopup.stories.tsx | 162 +++++++++ .../components/Growth/TestAndEarnPopup.tsx | 118 ++++++ .../components/Growth/TestAndEarnTakePart.tsx | 75 ++++ .../Growth/TestAndEarnWinner.stories.tsx | 19 + .../components/Growth/TestAndEarnWinner.tsx | 114 ++++++ .../Growth/TestAndEarnWinnerWalletAddress.tsx | 12 + .../Growth/content/TestAndEarn/Error.mdx | 17 + .../content/TestAndEarn/Stage0_intro.mdx | 25 ++ .../TestAndEarn/WinnerEntersWalletAddress.mdx | 9 + .../content/TestAndEarnNotAvaialble.mdx | 3 + .../Growth/content/assets/matrix.webp | Bin 0 -> 1170192 bytes .../Growth/content/assets/winner.webp | Bin 0 -> 510504 bytes .../src/components/Growth/content/en.yaml | 43 +++ .../Growth/context/TestAndEarnContext.tsx | 272 ++++++++++++++ .../context/mocks/TestAndEarnContext.tsx | 262 ++++++++++++++ .../src/components/Growth/context/types.ts | 64 ++++ .../src/components/HelpPage.tsx | 33 ++ .../src/components/HelpPageActions.tsx | 20 + .../src/components/HelpPageImage.tsx | 5 + .../src/components/HelpPageStepIndicator.tsx | 15 + .../src/components/InfoModal.tsx | 69 ++++ .../src/components/IpAddressAndPort.tsx | 97 +++++ .../src/components/IpAddressAndPortModal.tsx | 41 +++ .../src/components/LogViewer/index.tsx | 97 +++++ .../src/components/NeedHelp.tsx | 16 + .../src/components/ServiceProviderInfo.tsx | 20 + .../src/components/ServiceProviderPopup.tsx | 37 ++ .../ServiceProviderSelector.stories.tsx | 342 ++++++++++++++++++ .../components/ServiceProviderSelector.tsx | 147 ++++++++ .../components/ServiceSelector.stories.tsx | 342 ++++++++++++++++++ .../src/components/ServiceSelector.tsx | 179 +++++++++ nym-connect-android/src/config.ts | 3 + nym-connect-android/src/context/main.tsx | 231 ++++++++++++ .../src/context/mocks/main.tsx | 30 ++ ...OpenSans-Italic-VariableFont_wdth,wght.ttf | Bin 0 -> 580468 bytes .../fonts/OpenSans-VariableFont_wdth,wght.ttf | Bin 0 -> 529672 bytes nym-connect-android/src/fonts/fonts.css | 6 + nym-connect-android/src/growth.tsx.back | 23 ++ nym-connect-android/src/index.tsx | 25 ++ .../src/layouts/ConnectedLayout.tsx | 59 +++ .../src/layouts/DefaultLayout.tsx | 49 +++ .../src/layouts/HelpGuideLayout.tsx | 70 ++++ nym-connect-android/src/log.tsx.back | 18 + .../src/stories/AppFlow.stories.tsx | 115 ++++++ .../src/stories/AppWindowFrame.stories.tsx | 19 + .../src/stories/ConnectedLayout.stories.tsx | 37 ++ .../src/stories/ConnectionButton.stories.tsx | 25 ++ .../src/stories/ConnectionStats.stories.tsx | 27 ++ .../src/stories/ConnectionStatus.stories.tsx | 26 ++ .../src/stories/DefaultLayout.stories.tsx | 33 ++ .../src/stories/Introduction.stories.mdx | 7 + .../src/stories/IpAddressAndPort.stories.tsx | 14 + nym-connect-android/src/theme/index.tsx | 29 ++ nym-connect-android/src/theme/mui-theme.d.ts | 89 +++++ nym-connect-android/src/theme/theme.tsx | 283 +++++++++++++++ nym-connect-android/src/types/connection.ts | 8 + nym-connect-android/src/types/directory.ts | 14 + nym-connect-android/src/types/error.ts | 4 + nym-connect-android/src/types/event.ts | 6 + nym-connect-android/src/types/index.ts | 2 + nym-connect-android/src/types/rust/index.ts | 1 + .../src/types/rust/stateparams.ts | 7 + nym-connect-android/src/typings/FC.d.ts | 1 + nym-connect-android/src/typings/jpeg.d.ts | 9 + nym-connect-android/src/typings/json.d.ts | 4 + nym-connect-android/src/typings/png.d.ts | 4 + nym-connect-android/src/typings/svg.d.ts | 4 + nym-connect-android/src/typings/webp.d.ts | 4 + nym-connect-android/src/typings/yaml.d.ts | 9 + nym-connect-android/src/utils/index.ts | 19 + nym-connect-android/tsconfig.eslint.json | 20 + nym-connect-android/tsconfig.json | 23 ++ nym-connect-android/webpack.common.js | 59 +++ nym-connect-android/webpack.dev.js | 68 ++++ nym-connect-android/webpack.prod.js | 17 + nym-wallet/Cargo.lock | 4 +- package.json | 1 + sdk/rust/nym-sdk/src/mixnet/client.rs | 9 +- yarn.lock | 79 +++- 233 files changed, 9360 insertions(+), 48 deletions(-) create mode 100644 clients/client-core/src/client/base_client/helpers.rs create mode 100644 common/mobile-storage/Cargo.toml create mode 100644 common/mobile-storage/src/lib.rs create mode 100644 nym-connect-android/.DS_Store create mode 100644 nym-connect-android/.babelrc create mode 100644 nym-connect-android/.env.sample create mode 100644 nym-connect-android/.eslintrc create mode 100644 nym-connect-android/.nvmrc create mode 100644 nym-connect-android/.prettierrc create mode 100644 nym-connect-android/.storybook/main.js create mode 100644 nym-connect-android/.storybook/mocks/tauri/app.js create mode 100644 nym-connect-android/.storybook/mocks/tauri/clipboard.js create mode 100644 nym-connect-android/.storybook/mocks/tauri/event.js create mode 100644 nym-connect-android/.storybook/mocks/tauri/index.js create mode 100644 nym-connect-android/.storybook/mocks/tauri/notification.js create mode 100644 nym-connect-android/.storybook/mocks/tauri/window.js create mode 100644 nym-connect-android/.storybook/preview-fonts.js create mode 100644 nym-connect-android/.storybook/preview.js create mode 100644 nym-connect-android/CHANGELOG.md create mode 100644 nym-connect-android/README.md create mode 100644 nym-connect-android/package.json create mode 100644 nym-connect-android/public/favicon.ico create mode 100644 nym-connect-android/public/favicon.png create mode 100644 nym-connect-android/public/growth.html.back create mode 100644 nym-connect-android/public/index.html create mode 100644 nym-connect-android/public/log.html.back create mode 100644 nym-connect-android/src-tauri/.cargo/config.toml create mode 100644 nym-connect-android/src-tauri/.cargo/libgcc.a create mode 100644 nym-connect-android/src-tauri/.gitignore create mode 100644 nym-connect-android/src-tauri/Cargo.toml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/.editorconfig create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/.gitignore create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/proguard-rules.pro create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/AndroidManifest.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/java/net/nymtech/nym-connect-android/MainActivity.kt create mode 120000 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86_64/libnym_connect_android.so create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/layout/activity_main.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/build.gradle.kts create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/buildSrc/build.gradle.kts create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle.properties create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.jar create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.properties create mode 100755 nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew.bat create mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/settings.gradle create mode 100644 nym-connect-android/src-tauri/icons/128x128.png create mode 100644 nym-connect-android/src-tauri/icons/128x128@2x.png create mode 100644 nym-connect-android/src-tauri/icons/32x32.png create mode 100644 nym-connect-android/src-tauri/icons/Square107x107Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square142x142Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square150x150Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square284x284Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square30x30Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square310x310Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square44x44Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square71x71Logo.png create mode 100644 nym-connect-android/src-tauri/icons/Square89x89Logo.png create mode 100644 nym-connect-android/src-tauri/icons/StoreLogo.png create mode 100644 nym-connect-android/src-tauri/icons/icon.icns create mode 100644 nym-connect-android/src-tauri/icons/icon.ico create mode 100644 nym-connect-android/src-tauri/icons/icon.png create mode 100644 nym-connect-android/src-tauri/icons/tray_icon.ico create mode 100644 nym-connect-android/src-tauri/icons/tray_icon.png create mode 100644 nym-connect-android/src-tauri/src/build.rs create mode 100644 nym-connect-android/src-tauri/src/config/mod.rs create mode 100644 nym-connect-android/src-tauri/src/error.rs create mode 100644 nym-connect-android/src-tauri/src/events.rs create mode 100644 nym-connect-android/src-tauri/src/lib.rs create mode 100644 nym-connect-android/src-tauri/src/logging.rs create mode 100644 nym-connect-android/src-tauri/src/main.rs create mode 100644 nym-connect-android/src-tauri/src/menu.rs create mode 100644 nym-connect-android/src-tauri/src/mobile.rs create mode 100644 nym-connect-android/src-tauri/src/models/mod.rs create mode 100644 nym-connect-android/src-tauri/src/operations/connection/connect.rs create mode 100644 nym-connect-android/src-tauri/src/operations/connection/disconnect.rs create mode 100644 nym-connect-android/src-tauri/src/operations/connection/health_check.rs create mode 100644 nym-connect-android/src-tauri/src/operations/connection/mod.rs create mode 100644 nym-connect-android/src-tauri/src/operations/connection/status.rs create mode 100644 nym-connect-android/src-tauri/src/operations/directory/mod.rs create mode 100644 nym-connect-android/src-tauri/src/operations/export.rs create mode 100644 nym-connect-android/src-tauri/src/operations/growth/api_client.rs create mode 100644 nym-connect-android/src-tauri/src/operations/growth/assets.rs create mode 100644 nym-connect-android/src-tauri/src/operations/growth/mod.rs create mode 100644 nym-connect-android/src-tauri/src/operations/growth/test_and_earn.rs create mode 100644 nym-connect-android/src-tauri/src/operations/help/log.rs create mode 100644 nym-connect-android/src-tauri/src/operations/help/mod.rs create mode 100644 nym-connect-android/src-tauri/src/operations/help/storage.rs create mode 100644 nym-connect-android/src-tauri/src/operations/http.rs create mode 100644 nym-connect-android/src-tauri/src/operations/mod.rs create mode 100644 nym-connect-android/src-tauri/src/operations/window/mod.rs create mode 100644 nym-connect-android/src-tauri/src/state.rs create mode 100644 nym-connect-android/src-tauri/src/tasks.rs create mode 100644 nym-connect-android/src-tauri/src/window.rs create mode 100644 nym-connect-android/src-tauri/tauri.conf.json create mode 100644 nym-connect-android/src/App.tsx create mode 100644 nym-connect-android/src/assets/help-step-four.png create mode 100644 nym-connect-android/src/assets/help-step-one.png create mode 100644 nym-connect-android/src/assets/help-step-three.png create mode 100644 nym-connect-android/src/assets/help-step-two.png create mode 100644 nym-connect-android/src/components/AppVersion.tsx create mode 100644 nym-connect-android/src/components/AppWindowFrame.tsx create mode 100644 nym-connect-android/src/components/ConnectionButton.tsx create mode 100644 nym-connect-android/src/components/ConnectionStats.tsx create mode 100644 nym-connect-android/src/components/ConnectionStatus.tsx create mode 100644 nym-connect-android/src/components/ConntectionTimer.tsx create mode 100644 nym-connect-android/src/components/CopyToClipboard.tsx create mode 100644 nym-connect-android/src/components/CustomTitleBar.tsx create mode 100644 nym-connect-android/src/components/Error.tsx create mode 100644 nym-connect-android/src/components/ErrorFallback.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnButtonArea.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnDraws.stories.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnDraws.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnError.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnPopup.stories.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnPopup.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnTakePart.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnWinner.stories.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnWinner.tsx create mode 100644 nym-connect-android/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx create mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarn/Error.mdx create mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx create mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx create mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarnNotAvaialble.mdx create mode 100644 nym-connect-android/src/components/Growth/content/assets/matrix.webp create mode 100644 nym-connect-android/src/components/Growth/content/assets/winner.webp create mode 100644 nym-connect-android/src/components/Growth/content/en.yaml create mode 100644 nym-connect-android/src/components/Growth/context/TestAndEarnContext.tsx create mode 100644 nym-connect-android/src/components/Growth/context/mocks/TestAndEarnContext.tsx create mode 100644 nym-connect-android/src/components/Growth/context/types.ts create mode 100644 nym-connect-android/src/components/HelpPage.tsx create mode 100644 nym-connect-android/src/components/HelpPageActions.tsx create mode 100644 nym-connect-android/src/components/HelpPageImage.tsx create mode 100644 nym-connect-android/src/components/HelpPageStepIndicator.tsx create mode 100644 nym-connect-android/src/components/InfoModal.tsx create mode 100644 nym-connect-android/src/components/IpAddressAndPort.tsx create mode 100644 nym-connect-android/src/components/IpAddressAndPortModal.tsx create mode 100644 nym-connect-android/src/components/LogViewer/index.tsx create mode 100644 nym-connect-android/src/components/NeedHelp.tsx create mode 100644 nym-connect-android/src/components/ServiceProviderInfo.tsx create mode 100644 nym-connect-android/src/components/ServiceProviderPopup.tsx create mode 100644 nym-connect-android/src/components/ServiceProviderSelector.stories.tsx create mode 100644 nym-connect-android/src/components/ServiceProviderSelector.tsx create mode 100644 nym-connect-android/src/components/ServiceSelector.stories.tsx create mode 100644 nym-connect-android/src/components/ServiceSelector.tsx create mode 100644 nym-connect-android/src/config.ts create mode 100644 nym-connect-android/src/context/main.tsx create mode 100644 nym-connect-android/src/context/mocks/main.tsx create mode 100644 nym-connect-android/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf create mode 100644 nym-connect-android/src/fonts/OpenSans-VariableFont_wdth,wght.ttf create mode 100644 nym-connect-android/src/fonts/fonts.css create mode 100644 nym-connect-android/src/growth.tsx.back create mode 100644 nym-connect-android/src/index.tsx create mode 100644 nym-connect-android/src/layouts/ConnectedLayout.tsx create mode 100644 nym-connect-android/src/layouts/DefaultLayout.tsx create mode 100644 nym-connect-android/src/layouts/HelpGuideLayout.tsx create mode 100644 nym-connect-android/src/log.tsx.back create mode 100644 nym-connect-android/src/stories/AppFlow.stories.tsx create mode 100644 nym-connect-android/src/stories/AppWindowFrame.stories.tsx create mode 100644 nym-connect-android/src/stories/ConnectedLayout.stories.tsx create mode 100644 nym-connect-android/src/stories/ConnectionButton.stories.tsx create mode 100644 nym-connect-android/src/stories/ConnectionStats.stories.tsx create mode 100644 nym-connect-android/src/stories/ConnectionStatus.stories.tsx create mode 100644 nym-connect-android/src/stories/DefaultLayout.stories.tsx create mode 100644 nym-connect-android/src/stories/Introduction.stories.mdx create mode 100644 nym-connect-android/src/stories/IpAddressAndPort.stories.tsx create mode 100644 nym-connect-android/src/theme/index.tsx create mode 100644 nym-connect-android/src/theme/mui-theme.d.ts create mode 100644 nym-connect-android/src/theme/theme.tsx create mode 100644 nym-connect-android/src/types/connection.ts create mode 100644 nym-connect-android/src/types/directory.ts create mode 100644 nym-connect-android/src/types/error.ts create mode 100644 nym-connect-android/src/types/event.ts create mode 100644 nym-connect-android/src/types/index.ts create mode 100644 nym-connect-android/src/types/rust/index.ts create mode 100644 nym-connect-android/src/types/rust/stateparams.ts create mode 100644 nym-connect-android/src/typings/FC.d.ts create mode 100644 nym-connect-android/src/typings/jpeg.d.ts create mode 100644 nym-connect-android/src/typings/json.d.ts create mode 100644 nym-connect-android/src/typings/png.d.ts create mode 100644 nym-connect-android/src/typings/svg.d.ts create mode 100644 nym-connect-android/src/typings/webp.d.ts create mode 100644 nym-connect-android/src/typings/yaml.d.ts create mode 100644 nym-connect-android/src/utils/index.ts create mode 100644 nym-connect-android/tsconfig.eslint.json create mode 100644 nym-connect-android/tsconfig.json create mode 100644 nym-connect-android/webpack.common.js create mode 100644 nym-connect-android/webpack.dev.js create mode 100644 nym-connect-android/webpack.prod.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a2e72a1cfc..b3945372ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,7 +81,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: --workspace --all-features -- --ignored + args: --workspace -- --ignored - uses: actions-rs/clippy-check@v1 name: Clippy checks diff --git a/.github/workflows/wallet.yml b/.github/workflows/wallet.yml index a2ffef460e..896b3103c0 100644 --- a/.github/workflows/wallet.yml +++ b/.github/workflows/wallet.yml @@ -22,6 +22,7 @@ jobs: steps: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools + continue-on-error: true - name: Check out repository code uses: actions/checkout@v2 diff --git a/Cargo.lock b/Cargo.lock index c4c4b6701a..30841aab70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2169,6 +2169,7 @@ dependencies = [ "gateway-requests", "getrandom 0.2.8", "log", + "mobile-storage", "network-defaults", "nymsphinx", "pemstore", @@ -3274,6 +3275,14 @@ dependencies = [ "version-checker", ] +[[package]] +name = "mobile-storage" +version = "0.1.0" +dependencies = [ + "async-trait", + "thiserror", +] + [[package]] name = "multer" version = "2.0.4" @@ -3829,6 +3838,7 @@ dependencies = [ "lazy_static", "log", "logging", + "mobile-storage", "network-defaults", "nymsphinx", "ordered-buffer", diff --git a/Cargo.toml b/Cargo.toml index d0cd902eb0..8dca8bb3eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ members = [ "common/cosmwasm-smart-contracts/mixnet-contract", "common/cosmwasm-smart-contracts/multisig-contract", "common/cosmwasm-smart-contracts/vesting-contract", + "common/mobile-storage", "common/credential-storage", "common/credentials", "common/crypto", @@ -95,7 +96,7 @@ default-members = [ "explorer-api", ] -exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-connect"] +exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-connect", "nym-connect-android"] [workspace.package] authors = ["Nym Technologies SA"] diff --git a/clients/client-core/src/client/base_client/helpers.rs b/clients/client-core/src/client/base_client/helpers.rs new file mode 100644 index 0000000000..21485420bc --- /dev/null +++ b/clients/client-core/src/client/base_client/helpers.rs @@ -0,0 +1,11 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 +// +use crate::{client::replies::reply_storage, config::DebugConfig}; + +pub fn setup_empty_reply_surb_backend(debug_config: &DebugConfig) -> reply_storage::Empty { + reply_storage::Empty { + min_surb_threshold: debug_config.minimum_reply_surb_storage_threshold, + max_surb_threshold: debug_config.maximum_reply_surb_storage_threshold, + } +} diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index e30c39affa..67d7661434 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -49,6 +49,8 @@ use super::received_buffer::ReceivedBufferMessage; #[cfg(all(not(target_arch = "wasm32"), feature = "fs-surb-storage"))] pub mod non_wasm_helpers; +pub mod helpers; + pub struct ClientInput { pub connection_command_sender: ConnectionCommandSender, pub input_sender: InputMessageSender, diff --git a/clients/client-core/src/client/base_client/non_wasm_helpers.rs b/clients/client-core/src/client/base_client/non_wasm_helpers.rs index efd7d41bf0..9dde32f9d2 100644 --- a/clients/client-core/src/client/base_client/non_wasm_helpers.rs +++ b/clients/client-core/src/client/base_client/non_wasm_helpers.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::client::replies::reply_storage::{ - self, fs_backend, CombinedReplyStorage, ReplyStorageBackend, + fs_backend, CombinedReplyStorage, ReplyStorageBackend, }; use crate::config::DebugConfig; use crate::error::ClientCoreError; @@ -98,10 +98,3 @@ pub async fn setup_fs_reply_surb_backend>( Ok(setup_inactive_backend(debug_config)) } } - -pub fn setup_empty_reply_surb_backend(debug_config: &DebugConfig) -> reply_storage::Empty { - reply_storage::Empty { - min_surb_threshold: debug_config.minimum_reply_surb_storage_threshold, - max_surb_threshold: debug_config.maximum_reply_surb_storage_threshold, - } -} diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 46d71c1ab5..c559c6351a 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -33,7 +33,8 @@ client-connections = { path = "../../common/client-connections" } coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } completions = { path = "../../common/completions" } -credential-storage = { path = "../../common/credential-storage" } +credential-storage = { path = "../../common/credential-storage", optional = true } +mobile-storage = { path = "../../common/mobile-storage", optional = true } credentials = { path = "../../common/credentials" } crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} @@ -51,4 +52,6 @@ validator-client = { path = "../../common/client-libs/validator-client", feature version-checker = { path = "../../common/version-checker" } [features] +default = ["credential-storage"] eth = [] +mobile = ["mobile-storage", "gateway-client/mobile"] diff --git a/clients/socks5/src/client/config/mod.rs b/clients/socks5/src/client/config/mod.rs index 346eb37b34..8499637c5e 100644 --- a/clients/socks5/src/client/config/mod.rs +++ b/clients/socks5/src/client/config/mod.rs @@ -18,7 +18,7 @@ mod template; const DEFAULT_CONNECTION_START_SURBS: u32 = 20; const DEFAULT_PER_REQUEST_SURBS: u32 = 3; -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] +#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] #[serde(deny_unknown_fields)] pub struct Config { #[serde(flatten)] @@ -36,10 +36,12 @@ impl NymConfig for Config { } fn default_root_directory() -> PathBuf { - dirs::home_dir() - .expect("Failed to evaluate $HOME value") - .join(".nym") - .join("socks5-clients") + #[cfg(not(feature = "mobile"))] + let base_dir = dirs::home_dir().expect("Failed to evaluate $HOME value"); + #[cfg(feature = "mobile")] + let base_dir = PathBuf::from("/tmp"); + + base_dir.join(".nym").join("socks5-clients") } fn try_default_root_directory() -> Option { @@ -176,7 +178,7 @@ impl Config { } } -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] +#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] #[serde(deny_unknown_fields)] pub struct Socks5 { /// The port on which the client will be listening for incoming requests @@ -214,7 +216,7 @@ impl Default for Socks5 { } } -#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)] +#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] #[serde(deny_unknown_fields)] pub struct Socks5Debug { /// Number of reply SURBs attached to each `Request::Connect` message. diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index 1acea2eed8..ca6348cc45 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -8,9 +8,12 @@ use crate::socks::{ authentication::{AuthenticationMethods, Authenticator, User}, server::SphinxSocksServer, }; -use client_core::client::base_client::{ - non_wasm_helpers, BaseClientBuilder, ClientInput, ClientOutput, ClientState, -}; + +#[cfg(feature = "mobile")] +use client_core::client::base_client::helpers::setup_empty_reply_surb_backend; +#[cfg(not(feature = "mobile"))] +use client_core::client::base_client::non_wasm_helpers; +use client_core::client::base_client::{BaseClientBuilder, ClientInput, ClientOutput, ClientState}; use client_core::client::key_manager::KeyManager; use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder; use futures::channel::mpsc; @@ -54,6 +57,18 @@ impl NymClient { } } + pub fn new_with_keys(config: Config, key_manager: Option) -> Self { + let key_manager = key_manager.unwrap_or_else(|| { + let pathfinder = ClientKeyPathfinder::new_from_config(config.get_base()); + KeyManager::load_keys(&pathfinder).expect("failed to load stored keys") + }); + + NymClient { + config, + key_manager, + } + } + async fn create_bandwidth_controller(config: &Config) -> BandwidthController { let details = network_defaults::NymNetworkDetails::new_from_env(); let mut client_config = validator_client::Config::try_from_nym_network_details(&details) @@ -72,10 +87,15 @@ impl NymClient { client_config = client_config.with_urls(nyxd_url, api_url); let client = validator_client::Client::new_query(client_config) .expect("Could not construct query client"); - BandwidthController::new( - credential_storage::initialise_storage(config.get_base().get_database_path()).await, - client, - ) + + #[cfg(not(feature = "mobile"))] + let storage = + credential_storage::initialise_storage(config.get_base().get_database_path()).await; + + #[cfg(feature = "mobile")] + let storage = mobile_storage::PersistentStorage {}; + + BandwidthController::new(storage, client) } fn start_socks5_listener( @@ -188,15 +208,22 @@ impl NymClient { } pub async fn start(self) -> Result { + #[cfg(not(feature = "mobile"))] + let fs_reply_surb_backend = non_wasm_helpers::setup_fs_reply_surb_backend( + Some(self.config.get_base().get_reply_surb_database_path()), + self.config.get_debug_settings(), + ) + .await?; + + #[cfg(feature = "mobile")] + let fs_reply_surb_backend = + setup_empty_reply_surb_backend(self.config.get_debug_settings()); + let base_builder = BaseClientBuilder::new_from_base_config( self.config.get_base(), self.key_manager, Some(Self::create_bandwidth_controller(&self.config).await), - non_wasm_helpers::setup_fs_reply_surb_backend( - Some(self.config.get_base().get_reply_surb_database_path()), - self.config.get_debug_settings(), - ) - .await?, + fs_reply_surb_backend, ); let self_address = base_builder.as_mix_recipient(); diff --git a/common/client-libs/gateway-client/Cargo.toml b/common/client-libs/gateway-client/Cargo.toml index 86c76ad169..97014fc999 100644 --- a/common/client-libs/gateway-client/Cargo.toml +++ b/common/client-libs/gateway-client/Cargo.toml @@ -28,6 +28,7 @@ pemstore = { path = "../../pemstore" } validator-client = { path = "../validator-client" } task = { path = "../../task" } serde = { version = "1.0", features = ["derive"]} +mobile-storage = { path = "../../mobile-storage" } [dependencies.tungstenite] @@ -80,3 +81,4 @@ features = ["js"] [features] wasm = [] +mobile = [] diff --git a/common/client-libs/gateway-client/src/bandwidth.rs b/common/client-libs/gateway-client/src/bandwidth.rs index 9b6e5929eb..d2b5406836 100644 --- a/common/client-libs/gateway-client/src/bandwidth.rs +++ b/common/client-libs/gateway-client/src/bandwidth.rs @@ -6,12 +6,22 @@ use crate::error::GatewayClientError; #[cfg(target_arch = "wasm32")] use crate::wasm_mockups::Storage; #[cfg(not(target_arch = "wasm32"))] +#[cfg(not(feature = "mobile"))] use credential_storage::storage::Storage; +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "mobile")] +use mobile_storage::Storage; + +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "mobile")] +use mobile_storage::StorageError; + #[cfg(target_arch = "wasm32")] use crate::wasm_mockups::StorageError; #[cfg(not(target_arch = "wasm32"))] +#[cfg(not(feature = "mobile"))] use credential_storage::error::StorageError; #[cfg(target_arch = "wasm32")] @@ -31,8 +41,13 @@ use { use crate::wasm_mockups::PersistentStorage; #[cfg(not(target_arch = "wasm32"))] +#[cfg(not(feature = "mobile"))] use credential_storage::PersistentStorage; +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "mobile")] +use mobile_storage::PersistentStorage; + #[derive(Clone)] #[allow(dead_code)] pub struct BandwidthController { diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index e15b886013..8ecaa532de 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -26,13 +26,19 @@ use std::time::Duration; use task::TaskClient; use tungstenite::protocol::Message; -#[cfg(not(target_arch = "wasm32"))] -use credential_storage::PersistentStorage; #[cfg(not(target_arch = "wasm32"))] use tokio_tungstenite::connect_async; #[cfg(not(target_arch = "wasm32"))] use validator_client::nyxd::CosmWasmClient; +#[cfg(not(target_arch = "wasm32"))] +#[cfg(not(feature = "mobile"))] +use credential_storage::PersistentStorage; + +#[cfg(not(target_arch = "wasm32"))] +#[cfg(feature = "mobile")] +use mobile_storage::PersistentStorage; + #[cfg(target_arch = "wasm32")] use crate::wasm_mockups::CosmWasmClient; #[cfg(target_arch = "wasm32")] diff --git a/common/client-libs/gateway-client/src/error.rs b/common/client-libs/gateway-client/src/error.rs index 82664c8fd8..7080ce7723 100644 --- a/common/client-libs/gateway-client/src/error.rs +++ b/common/client-libs/gateway-client/src/error.rs @@ -3,9 +3,13 @@ #[cfg(target_arch = "wasm32")] use crate::wasm_mockups::StorageError; +#[cfg(not(feature = "mobile"))] #[cfg(not(target_arch = "wasm32"))] use credential_storage::error::StorageError; use gateway_requests::registration::handshake::error::HandshakeError; +#[cfg(feature = "mobile")] +#[cfg(not(target_arch = "wasm32"))] +use mobile_storage::StorageError; use std::io; use thiserror::Error; use tungstenite::Error as WsError; diff --git a/common/mobile-storage/Cargo.toml b/common/mobile-storage/Cargo.toml new file mode 100644 index 0000000000..3c38de8d2d --- /dev/null +++ b/common/mobile-storage/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "mobile-storage" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = { version = "0.1.51" } +thiserror = "1.0" + diff --git a/common/mobile-storage/src/lib.rs b/common/mobile-storage/src/lib.rs new file mode 100644 index 0000000000..0de91b0ec4 --- /dev/null +++ b/common/mobile-storage/src/lib.rs @@ -0,0 +1,67 @@ +// Copyright 2022 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use async_trait::async_trait; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum StorageError { + #[error("Android is not yet supported")] + AndroidNotSupported, + + #[allow(dead_code)] + #[error("Code shouldn't reach this point")] + InconsistentData, +} + +#[derive(Clone)] +pub struct PersistentStorage {} + +pub struct CoconutCredential { + pub id: i64, + pub voucher_value: String, + pub voucher_info: String, + pub serial_number: String, + pub binding_number: String, + pub signature: String, + pub epoch_id: String, + pub consumed: bool, +} + +#[async_trait] +pub trait Storage: Send + Sync { + async fn insert_coconut_credential( + &self, + voucher_value: String, + voucher_info: String, + serial_number: String, + binding_number: String, + signature: String, + ) -> Result<(), StorageError>; + + async fn get_next_coconut_credential(&self) -> Result; + + async fn consume_coconut_credential(&self, id: i64) -> Result<(), StorageError>; +} + +#[async_trait] +impl Storage for PersistentStorage { + async fn insert_coconut_credential( + &self, + _voucher_value: String, + _voucher_info: String, + _serial_number: String, + _binding_number: String, + _signature: String, + ) -> Result<(), StorageError> { + Err(StorageError::AndroidNotSupported) + } + + async fn get_next_coconut_credential(&self) -> Result { + Err(StorageError::AndroidNotSupported) + } + + async fn consume_coconut_credential(&self, _id: i64) -> Result<(), StorageError> { + Err(StorageError::AndroidNotSupported) + } +} diff --git a/lerna.json b/lerna.json index a2393382ed..702d14944f 100644 --- a/lerna.json +++ b/lerna.json @@ -3,6 +3,7 @@ "ts-packages/*", "nym-wallet", "nym-connect", + "nym-connect-android", "sdk/typescript/**" ], "version": "0.0.0" diff --git a/nym-connect-android/.DS_Store b/nym-connect-android/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7bf1d0399970057c418eee2fecee6e6ad6b11b79 GIT binary patch literal 6148 zcmeHK%Sr<=6g_E2@%;c7Zp8Tk2mFIkTU77?_5;*DEY&(wTCLmJi{B!CjQB0$LeEWt zFq!FAq~tLRws(Ow0COyY!2+uilW{2ptJoePD;*<6ga@R!N5A0h zJG=s3f&Zp}e7g%cz%_>G^2`1GevkWUtJzPR92cKGmgrj>Tfh=IN9;YrA?i56IWgjQ z-*$Mf4lh6(J&f>>_fuPr-x3neri~6R8C6=3+*3LjIlSirZ@{&*aL2k!{|L9tmLhR@ zpAK&p17>J4M-Q#MZ>8(_&f|h>-a`$i#FAB4-W^7ja~QgDs|V#?od5O7_y0V} zKY0bb0#l`c3TlnoK9^+A*23cCtPNSNSj5CHGpH%7>~X9caujc}XyaHY4PtCDGsqsA P|0AGf@Re8KPZjt9YVhCG literal 0 HcmV?d00001 diff --git a/nym-connect-android/.babelrc b/nym-connect-android/.babelrc new file mode 100644 index 0000000000..7a840ad24e --- /dev/null +++ b/nym-connect-android/.babelrc @@ -0,0 +1,15 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "esmodules": true + } + } + ], + "@babel/preset-react", + "@babel/preset-typescript" + ], + "plugins": ["@babel/plugin-transform-async-to-generator"] +} diff --git a/nym-connect-android/.env.sample b/nym-connect-android/.env.sample new file mode 100644 index 0000000000..cc3febee19 --- /dev/null +++ b/nym-connect-android/.env.sample @@ -0,0 +1 @@ +ADMIN_ADDRESS= \ No newline at end of file diff --git a/nym-connect-android/.eslintrc b/nym-connect-android/.eslintrc new file mode 100644 index 0000000000..3ea1281af1 --- /dev/null +++ b/nym-connect-android/.eslintrc @@ -0,0 +1,8 @@ +{ + "extends": [ + "@nymproject/eslint-config-react-typescript" + ], + "parserOptions": { + "project": "./tsconfig.eslint.json" + } +} diff --git a/nym-connect-android/.nvmrc b/nym-connect-android/.nvmrc new file mode 100644 index 0000000000..da2d3988d7 --- /dev/null +++ b/nym-connect-android/.nvmrc @@ -0,0 +1 @@ +14 \ No newline at end of file diff --git a/nym-connect-android/.prettierrc b/nym-connect-android/.prettierrc new file mode 100644 index 0000000000..1bc34d0c3f --- /dev/null +++ b/nym-connect-android/.prettierrc @@ -0,0 +1,7 @@ +{ + "trailingComma": "all", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 2, + "semi": true +} diff --git a/nym-connect-android/.storybook/main.js b/nym-connect-android/.storybook/main.js new file mode 100644 index 0000000000..344c27778e --- /dev/null +++ b/nym-connect-android/.storybook/main.js @@ -0,0 +1,73 @@ +/* eslint-disable no-param-reassign */ +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); + +module.exports = { + stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-links', '@storybook/addon-essentials', '@storybook/addon-interactions'], + framework: '@storybook/react', + core: { + builder: 'webpack5', + }, + typescript: { reactDocgen: false }, + // webpackFinal: async (config, { configType }) => { + // // `configType` has a value of 'DEVELOPMENT' or 'PRODUCTION' + // // You can change the configuration based on that. + // // 'PRODUCTION' is used when building the static version of storybook. + webpackFinal: async (config) => { + config.module.rules.forEach((rule) => { + // look for SVG import rule and replace + // NOTE: the rule before modification is /\.(svg|ico|jpg|jpeg|png|apng|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/ + if (rule.test?.toString().includes('svg')) { + rule.test = /\.(ico|jpg|jpeg|png|apng|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/; + } + }); + + // handle asset loading with this + config.module.rules.unshift({ + test: /\.svg(\?.*)?$/i, + issuer: /\.[jt]sx?$/, + use: ['@svgr/webpack'], + }); + + config.module.rules.unshift({ + test: /\.ya?ml$/, + type: 'json', + use: [ + { + loader: 'yaml-loader', + options: { + asJSON: true, + }, + }, + ], + }); + + config.resolve.extensions = ['.tsx', '.ts', '.js']; + config.resolve.plugins = [new TsconfigPathsPlugin()]; + + config.plugins.push( + new ForkTsCheckerWebpackPlugin({ + typescript: { + mode: 'write-references', + diagnosticOptions: { + semantic: true, + syntactic: true, + }, + }, + }), + ); + + if (!config.resolve.alias) { + config.resolve.alias = {}; + } + + config.resolve.alias['@tauri-apps/api'] = `${__dirname}/mocks/tauri`; + + // Return the altered config + return config; + }, + features: { + emotionAlias: false, + }, +}; diff --git a/nym-connect-android/.storybook/mocks/tauri/app.js b/nym-connect-android/.storybook/mocks/tauri/app.js new file mode 100644 index 0000000000..83d80d7037 --- /dev/null +++ b/nym-connect-android/.storybook/mocks/tauri/app.js @@ -0,0 +1,8 @@ +/** + * This is a mock for Tauri's API package (@tauri-apps/api/app), to prevent stories from being excluded, because they either use + * or import dependencies that use Tauri. + */ + +module.exports = { + getVersion: () => undefined, +}; diff --git a/nym-connect-android/.storybook/mocks/tauri/clipboard.js b/nym-connect-android/.storybook/mocks/tauri/clipboard.js new file mode 100644 index 0000000000..a34847db86 --- /dev/null +++ b/nym-connect-android/.storybook/mocks/tauri/clipboard.js @@ -0,0 +1,8 @@ +/** + * This is a mock for Tauri's API package (@tauri-apps/api/clipboard), to prevent stories from being excluded, because they either use + * or import dependencies that use Tauri. + */ + +module.exports = { + writeText: async () => undefined, +} diff --git a/nym-connect-android/.storybook/mocks/tauri/event.js b/nym-connect-android/.storybook/mocks/tauri/event.js new file mode 100644 index 0000000000..a100d30337 --- /dev/null +++ b/nym-connect-android/.storybook/mocks/tauri/event.js @@ -0,0 +1,8 @@ +/** + * This is a mock for Tauri's API package (@tauri-apps/api/clipboard), to prevent stories from being excluded, because they either use + * or import dependencies that use Tauri. + */ + +module.exports = { + listen: async () => undefined, +} diff --git a/nym-connect-android/.storybook/mocks/tauri/index.js b/nym-connect-android/.storybook/mocks/tauri/index.js new file mode 100644 index 0000000000..c411c3bf18 --- /dev/null +++ b/nym-connect-android/.storybook/mocks/tauri/index.js @@ -0,0 +1,14 @@ +/** + * This is a mock for Tauri's API package (@tauri-apps/api), to prevent stories from being excluded, because they either use + * or import dependencies that use Tauri. + */ +module.exports = { + invoke: (operation, args) => { + console.error( + `Tauri cannot be used in Storybook. The operation requested was "${operation}". You can add mock responses to "nym_connect/.storybook/mocks/tauri.js" if you need. The default response is "void".`, + ); + return new Promise((resolve, reject) => { + reject(new Error(`Tauri operation ${operation} not available in storybook.`)); + }); + }, +}; diff --git a/nym-connect-android/.storybook/mocks/tauri/notification.js b/nym-connect-android/.storybook/mocks/tauri/notification.js new file mode 100644 index 0000000000..dcbe18e574 --- /dev/null +++ b/nym-connect-android/.storybook/mocks/tauri/notification.js @@ -0,0 +1,10 @@ +/** + * This is a mock for Tauri's API package (@tauri-apps/api/notification), to prevent stories from being excluded, because they either use + * or import dependencies that use Tauri. + */ + +module.exports = { + isPermissionGranted: () => undefined, + requestPermission: () => undefined, + sendNotification: () => undefined, +}; \ No newline at end of file diff --git a/nym-connect-android/.storybook/mocks/tauri/window.js b/nym-connect-android/.storybook/mocks/tauri/window.js new file mode 100644 index 0000000000..9f0afeeebd --- /dev/null +++ b/nym-connect-android/.storybook/mocks/tauri/window.js @@ -0,0 +1,10 @@ +/** + * This is a mock for Tauri's API package (@tauri-apps/api/window), to prevent stories from being excluded, because they either use + * or import dependencies that use Tauri. + */ + +module.exports = { + appWindow: { + maximize: () => undefined, + } +} diff --git a/nym-connect-android/.storybook/preview-fonts.js b/nym-connect-android/.storybook/preview-fonts.js new file mode 100644 index 0000000000..a7989fca9a --- /dev/null +++ b/nym-connect-android/.storybook/preview-fonts.js @@ -0,0 +1,3 @@ +import '../src/fonts/fonts.css'; + +export const Fonts = ({ children }) => <>{children}; \ No newline at end of file diff --git a/nym-connect-android/.storybook/preview.js b/nym-connect-android/.storybook/preview.js new file mode 100644 index 0000000000..9c14c3ec99 --- /dev/null +++ b/nym-connect-android/.storybook/preview.js @@ -0,0 +1,26 @@ +import { NymMixnetTheme } from '../src/theme'; +import { Fonts } from './preview-fonts'; +import { MockProvider } from '../src/context/mocks/main'; +const withThemeProvider = (Story, context) => { + return ( + + + + + + + + ); +}; + +export const decorators = [withThemeProvider]; + +export const parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, +}; diff --git a/nym-connect-android/CHANGELOG.md b/nym-connect-android/CHANGELOG.md new file mode 100644 index 0000000000..cddba036e0 --- /dev/null +++ b/nym-connect-android/CHANGELOG.md @@ -0,0 +1,98 @@ +# Changelog + +## UNRELEASED + +## [nym-connect-v1.1.7](https://github.com/nymtech/nym/tree/nym-connect-v1.1.7) (2023-01-24) + +- Remove test and earn ([#2865]) + +[#2865]: https://github.com/nymtech/nym/issue/2865 + +## [nym-connect-v1.1.6](https://github.com/nymtech/nym/tree/nym-connect-v1.1.6) (2023-01-17) + +- part (1) show gateway status on the UI if the gateway is not live, is overloaded or is slow ([#2824]) + +[#2824]: https://github.com/nymtech/nym/pull/2824 + +## [nym-connect-v1.1.5](https://github.com/nymtech/nym/tree/nym-connect-v1.1.5) (2023-01-10) + +- get version number from tauri and display by @fmtabbara in https://github.com/nymtech/nym/pull/2684 +- Feature/nym connect experimental software text by @fmtabbara in https://github.com/nymtech/nym/pull/2692 +- NymConnect - Display service info in tooltip **1.1.5 Release** by @fmtabbara in https://github.com/nymtech/nym/pull/2704 + +## [nym-connect-v1.1.4](https://github.com/nymtech/nym/tree/nym-connect-v1.1.4) (2022-12-20) + +This release contains the new opt-in Test & Earn program, and it uses a stress-tested directory of network requesters to improve reliability. It also has some bugfixes, performance improvements, and better error handling. + +- nym-connect: send status messages from socks5 task to tauri backend by @octol in https://github.com/nymtech/nym/pull/1882 +- socks5: rework waiting in inbound.rs by @octol in https://github.com/nymtech/nym/pull/1880 +- Test&Earn by @mmsinclair in https://github.com/nymtech/nym/pull/2729 + +## [nym-connect-v1.1.3](https://github.com/nymtech/nym/tree/nym-connect-v1.1.3) (2022-12-13) + +- socks5-client: added support for socks4a. + +## [nym-connect-v1.1.2](https://github.com/nymtech/nym/tree/nym-connect-v1.1.2) (2022-12-06) + +- socks5-client: fix error with client failing and disconnecting unnecessarily. + +## [nym-connect-v1.1.1](https://github.com/nymtech/nym/tree/nym-connect-v1.1.1) (2022-11-29) + +- socks5-client: fix multiplex concurrent connections ([#1720], [#1777]) +- socks5-client: fix wait closing inbound connection until data is sent, and throttle incoming data in general ([#1772], [#1783],[#1789]) +- socks5-client: fix shutting down all background workers if anyone of them panics or errors out. This fixes an issue where the nym-connect UI was showing connected even though the socks5 tunnel was non-functional. ([#1805]) +- gateway-libs: fix decryping messages stored on the gateway between reconnects ([#1786]) + +- nymconnect: updated UI +- nymconnect: new help area +- nymconnect: listen for service errors and display on frontend + +[#1720]: https://github.com/nymtech/nym/pull/1720 +[#1772]: https://github.com/nymtech/nym/pull/1772 +[#1777]: https://github.com/nymtech/nym/pull/1777 +[#1783]: https://github.com/nymtech/nym/pull/1783 +[#1786]: https://github.com/nymtech/nym/pull/1786 +[#1789]: https://github.com/nymtech/nym/pull/1789 +[#1805]: https://github.com/nymtech/nym/pull/1805 + +## [nym-connect-v1.1.0](https://github.com/nymtech/nym/tree/nym-connect-v1.1.0) (2022-11-09) + +- nym-connect: rework of rewarding changes the directory data structures that describe the mixnet topology ([#1472]) +- clients: add testing-only support for two more extended packet sizes (8kb and 16kb). +- native-client/socks5-client: `disable_loop_cover_traffic_stream` Debug config option to disable the separate loop cover traffic stream ([#1666]) +- native-client/socks5-client: `disable_main_poisson_packet_distribution` Debug config option to make the client ignore poisson distribution in the main packet stream and ONLY send real message (and as fast as they come) ([#1664]) +- native-client/socks5-client: `use_extended_packet_size` Debug config option to make the client use 'ExtendedPacketSize' for its traffic (32kB as opposed to 2kB in 1.0.2) ([#1671]) +- network-requester: added additional Blockstream Green wallet endpoint to `example.allowed.list` ([#1611]) +- validator-client: added `query_contract_smart` and `query_contract_raw` on `NyxdClient` ([#1558]) + +[#1472]: https://github.com/nymtech/nym/pull/1472 +[#1558]: https://github.com/nymtech/nym/pull/1558 +[#1611]: https://github.com/nymtech/nym/pull/1611 +[#1664]: https://github.com/nymtech/nym/pull/1664 +[#1666]: https://github.com/nymtech/nym/pull/1666 +[#1671]: https://github.com/nymtech/nym/pull/1671 + +## [nym-connect-v1.0.2](https://github.com/nymtech/nym/tree/nym-connect-v1.0.2) (2022-08-18) + +### Changed + +- nym-connect: "load balance" the service providers by picking a random Service Provider for each Service and storing in local storage so it remains sticky for the user ([#1540]) +- nym-connect: the ServiceProviderSelector only displays the available Services, and picks a random Service Provider for Services the user has never used before ([#1540]) +- nym-connect: add `local-forage` for storing user settings ([#1540]) + +[#1540]: https://github.com/nymtech/nym/pull/1540 + +## [nym-connect-v1.0.1](https://github.com/nymtech/nym/tree/nym-connect-v1.0.1) (2022-07-22) + +### Added + +- nym-connect: initial proof-of-concept of a UI around the socks5 client was added +- nym-connect: add ability to select network requester and gateway ([#1427]) +- nym-connect: add ability to export gateway keys as JSON +- nym-connect: add auto updater + +### Changed + +- nym-connect: reuse config id instead of creating a new id on each connection + +[#1427]: https://github.com/nymtech/nym/pull/1427 diff --git a/nym-connect-android/README.md b/nym-connect-android/README.md new file mode 100644 index 0000000000..bbd9b55bbb --- /dev/null +++ b/nym-connect-android/README.md @@ -0,0 +1,95 @@ + + +# Nym Connect + +Nym is an open-source, decentralized and permissionless privacy system. It provides full-stack privacy, allowing other applications, services or blockchains to provide their users with strong metadata protection, at both the network level (mixnet), and the application level (anonymous credentials) without the need to build privacy from scratch. + +Nym Connects sets up a SOCKS5 proxy for local applications to use. + +## Installation prerequisites - Linux / Mac + +- `Yarn` +- `NodeJS >= v16` +- `Rust & cargo` + +## Installation prerequisites - Windows + +- When running on Windows you will need to install c++ build tools +- An easy guide to get rust up and running [Installation]("http://kennykerr.ca/2019/11/18/rust-getting-started/") +- When installing NodeJS please use the `current features` version +- Using a package manager like [Chocolatey]("chocolatey.org") is recommended +- Nym connect requires you to have `Webview2` installed, please head to the [Installer](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section), this will ensure a smooth app launch + +## Installation + +Inside the `nym-connect` directory, run the following command: +``` +yarn install +``` + +## Development mode + +You can compile nym-connect in development mode by running the following command inside the `nym-connect` directory: + +``` +yarn dev +``` +This will produce a binary in - `nym-connect/target/debug/` named `nym-connect` + +To launch, navigate to the directory and run the following command: `./nym-connect` + +## Production mode + +Run the following command from the `nym-connect` folder +``` +yarn build +``` +The output will compile different types of binaries dependent on your hardware / OS system. Once the binaries are built, they can be located as follows: + +### Binary output directory structure +``` +**macos** +| +└─── target/release +| |─ nym-connect +└───target/release/bundle/dmg +│ │─ bundle_dmg.sh +│ │─ nym-connect.*.dmg +└───target/release/bundle/macos/MacOs +│ │─ nym-connect +| +**Linux** +└─── target/release +| │─ nym-connect +└───target/release/bundle/appimage +│ │─ nym-connect_*_.AppImage +│ │─ build_appimage.sh +└───target/release/bundle/deb +│ │─ nym-connect_*_.deb +| +**Windows** +└─── target/release +| │─ nym-connect.exe +└───target/release/bundle/msi +│ │─ nym-connect_*_.msi +``` + +For instructions on how to release nym-connect, please see [RELEASE.md](./docs/release/RELEASE.md). + +# Storybook + +Run storybook with: + +``` +yarn storybook +``` + +And build storybook static site with: + +``` +yarn storybook:build +``` + diff --git a/nym-connect-android/package.json b/nym-connect-android/package.json new file mode 100644 index 0000000000..2d9c094109 --- /dev/null +++ b/nym-connect-android/package.json @@ -0,0 +1,116 @@ +{ + "name": "@nym/nym-connect-android", + "version": "1.1.7", + "main": "index.js", + "license": "MIT", + "scripts": { + "prewebpack:dev": "yarn --cwd .. build", + "webpack:dev": "yarn webpack serve --config webpack.dev.js", + "webpack:dev:onlyThis": "yarn webpack serve --config webpack.dev.js", + "webpack:prod": "yarn webpack --progress --config webpack.prod.js", + "tauri:dev": "RUST_DEBUG=1 yarn tauri dev", + "tauri:build": "yarn tauri build", + "dev": "run-p webpack:dev tauri:dev", + "prebuild": "yarn --cwd .. build", + "build": "run-s webpack:prod tauri:build", + "storybook": "start-storybook -p 6006", + "prestorybook:build": "yarn --cwd .. build", + "storybook:build": "build-storybook", + "tsc": "tsc --noEmit true", + "tsc:watch": "tsc --noEmit true --watch", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "test": "jest", + "test:watch": "jest --watch" + }, + "dependencies": { + "@emotion/react": "^11.7.0", + "@emotion/styled": "^11.6.0", + "@hookform/resolvers": "^2.8.0", + "@mui/icons-material": "^5.2.0", + "@mui/material": "^5.2.2", + "@mui/styles": "^5.2.2", + "@mui/system": ">= 5", + "@mui/lab": "^5.0.0-alpha.72", + "@nymproject/react": "^1.0.0", + "@tauri-apps/api": "^2.0.0-alpha.0", + "@tauri-apps/tauri-forage": "^1.0.0-beta.2", + "clsx": "^1.1.1", + "luxon": "^2.3.0", + "pretty-bytes": "^6.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-error-boundary": "^3.1.3", + "react-hook-form": "^7.14.2", + "react-markdown": "^8.0.4", + "react-router-dom": "^5.2.0", + "semver": "^6.3.0", + "yup": "^0.32.9" + }, + "devDependencies": { + "@babel/core": "^7.15.0", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/preset-env": "^7.15.0", + "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", + "@mdx-js/loader": "^2.1.5", + "@nymproject/eslint-config-react-typescript": "^1.0.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.4", + "@storybook/react": "^6.5.15", + "@svgr/webpack": "^6.1.1", + "@tauri-apps/cli": "^2.0.0-alpha.1", + "@testing-library/jest-dom": "^5.14.1", + "@testing-library/react": "^12.0.0", + "@types/jest": "^27.0.1", + "@types/luxon": "^2.3.2", + "@types/node": "^16.7.13", + "@types/react": "^18.0.26", + "@types/react-dom": "^18.0.10", + "@types/semver": "^7.3.8", + "@types/uuid": "^8.3.4", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "babel-loader": "^8.3.0", + "babel-plugin-root-import": "^6.6.0", + "clean-webpack-plugin": "^4.0.0", + "css-loader": "^6.7.3", + "css-minimizer-webpack-plugin": "^3.0.2", + "dotenv-webpack": "^7.0.3", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.29.2", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-storybook": "^0.5.12", + "favicons": "^7.0.2", + "favicons-webpack-plugin": "^5.0.2", + "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "^7.2.1", + "html-webpack-plugin": "^5.3.2", + "jest": "^27.1.0", + "mini-css-extract-plugin": "^2.2.2", + "npm-run-all": "^4.1.5", + "prettier": "2.3.2", + "react-refresh": "^0.10.0", + "react-refresh-typescript": "^2.0.2", + "style-loader": "^3.3.1", + "thread-loader": "^3.0.4", + "ts-jest": "^27.0.5", + "ts-loader": "^9.4.2", + "tsconfig-paths-webpack-plugin": "^3.5.2", + "typescript": "^4.6.2", + "url-loader": "^4.1.1", + "webpack": "^5.75.0", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.5.0", + "webpack-favicons": "^1.3.8", + "webpack-merge": "^5.8.0", + "yaml-loader": "^0.8.0" + } +} diff --git a/nym-connect-android/public/favicon.ico b/nym-connect-android/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc951a1c6f2c406072df036cea6e73163f6a687e GIT binary patch literal 5430 zcmc&%drVtp6tBjAwtraU57|Idos~Ef+d5%b>g&1$p%NeV5&G3m5tT=9hdq_kQ=B z^E=Xx-n) zt#yjjH3Lnu{O{}%;^v}6adT0w`qr*D_ca-f4$)@vo5?uW^6<56{qN!y1~PI3zTLhSUpCWL!`J&HO0On^xEC|`)_dLgKOS*tgq5y0@uh0 z;BSon*P>z|U)tMr;?xgzW(`wEUmrAoa>L74Ra^)Q3kz_+=Pvz?&8tfN#-3i>y2xH* z%bzYQhJTT4U3C?F{Nc3?^0K6+#m(f;RFu-PZ&y{)wrnQPWq+@&hnB6aEcfn%OCHAC7^bOZ*PQf7!rS;)nRo!4?-g)PewDc!POtFA4GSVmZnHXSG z;ekjcH+#8G$ME!7d?mJE!QPT}aQwl*45$+e4ZNutwI3yn` z0IjMMj9Q1yq@|(*v4ObYjL*I3bY+)zKrCMn0`9u|rwa?yAT^Yc(|F?d{Ai|c zO~d%f-~My6(qLkIjK-RGyP-s{q4yC8zBslB zd36MWpA@6U_{*W-Yffgt)Z`?MJva9l3e-w3HuhPN_(Az!C(VZGsVN%!@$4*^@)SPU zf#S3LA8`Ctn2j(qGfiX9&dh+3kZ!;Z6yF;A#`Yxl2((_XGUgu2Fc|I$97>yN+wm-++a?{@tqL^a@6^%w1fU8+AZwk%`o z`V-^h;ZuL_KrI*-ME$*L0kVPJe~6!M|H0Vc+kgFx`mdrO`Y+42`Y*-?OmY9IJ~z~c z`%jfm|5@^+|J1JbpJ~4Rr#|1&ww?ZyZ3BMB{kNu?GHI#@Tb}gaW2paLM*a7)u554& W_upg@)k0b*(@yr^>+RU-_x}JZi=y2C literal 0 HcmV?d00001 diff --git a/nym-connect-android/public/favicon.png b/nym-connect-android/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf1e747d0d569a0ed17d42f8976f9161fd001f7 GIT binary patch literal 1312 zcmZ`%Yfw{H5Wa{3o2pom@(68XE!Q+bxryNw36hw1?hSb-BoIP?2vtD^OI4~dQmeMq z5nD?u228CT9d*PRwW8CJVp|-=fI?8>g@BRr3NIy43EJzQPWz)fd%kba?tW)>=IlYK zgue(Mg$Dp&kx;;qV@!N~76f9*Id$lFjOK4(AuIr>Km4XY2lu*|E07}quoDCTO9cSD zz*3e00N4%zz>pCD7}Wp}zNMx?mI46tR!dtPT0Lm;*x1ya*g{_#Fd_b!aBDFaUmJ~h}ms{U9iq$5xMumF0rmtq;c?IHRu*u&t};_Go#qd1|^!Q?A#>% zNzE-^&&)|oR6ukiJ*hl3^|V;fp;t7R1lh?61OjPkI7o;h8K9)A2;wM)vl#KA5nyOI zn7KOXu2gZ+#08g=!FMRImbp?%S2!_<&IEgVA3-w$=8dx zS6H&_b@XG^w$6uL_a8XfJb8!nQ5HG5YmYcOnso8f)mN`xjgL=o1WNzh93hhQfUiAc zW>3$|OiWDjMCwy(;oa#Bt=>E_iPFF7jHkXkq9vm8;nfdGG z%a?>`Qc{X=U|{H2b#3QE7cpi{0)v0gasLWSn#H6$%0v;7D{I#YK_WRTIsTeSU`S5L zf|5Enr5h6y`wIpKMLfrC`Ii|j)&68E~-nWi43W#I|PZzX2juK7?|1zjA)Dz}@ z5f*yXN=@5#sEXFU`x|BKWLj9^*^i94p~0<+NOXo_&K$*RKeAa-RlWzhSrAFX7MDHQ1x!&i3!2YA3E~S-XZ# zx04qX(Q={U{gi^j^939Es@9xFoDO-_}z1%i=xO#_v4NrmE<#IM;Uv z#R-M}50x?lG+-><70W^q4T}7p>f~ZPr0waD6 ogG#4B5CekN8h + + + + + Nym Connect + + +
+ + diff --git a/nym-connect-android/public/index.html b/nym-connect-android/public/index.html new file mode 100644 index 0000000000..2ba643a663 --- /dev/null +++ b/nym-connect-android/public/index.html @@ -0,0 +1,11 @@ + + + + + + Nym Connect + + +
+ + diff --git a/nym-connect-android/public/log.html.back b/nym-connect-android/public/log.html.back new file mode 100644 index 0000000000..5ced2243f1 --- /dev/null +++ b/nym-connect-android/public/log.html.back @@ -0,0 +1,11 @@ + + + + + + Nym Wallet Logs + + +
+ + diff --git a/nym-connect-android/src-tauri/.cargo/config.toml b/nym-connect-android/src-tauri/.cargo/config.toml new file mode 100644 index 0000000000..d4585a1646 --- /dev/null +++ b/nym-connect-android/src-tauri/.cargo/config.toml @@ -0,0 +1,41 @@ +[build] +target = 'x86_64-unknown-linux-gnu' +[target.aarch64-linux-android] +linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang' +rustflags = [ + '-L', + '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '-Clink-arg=-landroid', + '-Clink-arg=-llog', + '-Clink-arg=-lOpenSLES', +] + +[target.armv7-linux-androideabi] +linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang' +rustflags = [ + '-L', + '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '-Clink-arg=-landroid', + '-Clink-arg=-llog', + '-Clink-arg=-lOpenSLES', +] + +[target.i686-linux-android] +linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android24-clang' +rustflags = [ + '-L', + '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '-Clink-arg=-landroid', + '-Clink-arg=-llog', + '-Clink-arg=-lOpenSLES', +] + +[target.x86_64-linux-android] +linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android24-clang' +rustflags = [ + '-L', + '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '-Clink-arg=-landroid', + '-Clink-arg=-llog', + '-Clink-arg=-lOpenSLES', +] diff --git a/nym-connect-android/src-tauri/.cargo/libgcc.a b/nym-connect-android/src-tauri/.cargo/libgcc.a new file mode 100644 index 0000000000..a5f3b046c1 --- /dev/null +++ b/nym-connect-android/src-tauri/.cargo/libgcc.a @@ -0,0 +1 @@ +INPUT(-lunwind) \ No newline at end of file diff --git a/nym-connect-android/src-tauri/.gitignore b/nym-connect-android/src-tauri/.gitignore new file mode 100644 index 0000000000..c123704591 --- /dev/null +++ b/nym-connect-android/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +WixTools diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect-android/src-tauri/Cargo.toml new file mode 100644 index 0000000000..ffac476d29 --- /dev/null +++ b/nym-connect-android/src-tauri/Cargo.toml @@ -0,0 +1,66 @@ +[package] +name = "nym-connect-android" +version = "1.1.7" +description = "nym-connect" +authors = ["Nym Technologies SA"] +license = "" +repository = "" +default-run = "nym-connect-android" +edition = "2021" +build = "src/build.rs" +rust-version = "1.58" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +# tauri-build = { version = "2.0.0-alpha.0", features = [] } +tauri-build = { git = "https://github.com/tauri-apps/tauri", branch = "next", features = [] } + +# tauri-codegen = "2.0.0-alpha.0" +# tauri-macros = "2.0.0-alpha.0" + +[dependencies] +anyhow = "1.0" +bip39 = "1.0" +chrono = "0.4" +dirs = "4.0" +eyre = "0.6.5" +fix-path-env = { git = "https://github.com/tauri-apps/fix-path-env-rs", branch = "release"} +futures = "0.3" +fern = { version = "0.6.1", features = ["colored"] } +itertools = "0.10.5" +log = { version = "0.4", features = ["serde"] } +pretty_env_logger = "0.4.0" +rand = "0.8" +reqwest = { version = "0.11", features = ["json", "socks"] } +rust-embed = { version = "6.4.2", features = ["include-exclude"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +serde_repr = "0.1" +tap = "1.0.1" +tauri = { git = "https://github.com/tauri-apps/tauri", branch = "next", features = ["clipboard-write-text", "native-tls-vendored", "notification-all", "shell-open", "system-tray", "window-close", "window-minimize", "window-start-dragging"] } +# tauri = { version = "2.0.0-alpha.0", features = ["clipboard-write-text", "native-tls-vendored", "notification-all", "shell-open", "system-tray", "window-close", "window-minimize", "window-start-dragging"] } +tendermint-rpc = "0.23.0" +thiserror = "1.0" +tokio = { version = "1.24.1", features = ["sync", "time"] } +url = "2.2" +yaml-rust = "0.4" + +client-core = { path = "../../clients/client-core" } +config-common = { path = "../../common/config", package = "config" } +crypto = { path = "../../common/crypto" } +logging = { path = "../../common/logging"} +nym-socks5-client = { path = "../../clients/socks5", features = ["mobile"], default-features = false } +task = { path = "../../common/task" } +topology = { path = "../../common/topology" } + +[dev-dependencies] +ts-rs = "6.1.2" +tempfile = "3.3.0" + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/.editorconfig b/nym-connect-android/src-tauri/gen/android/nym-connect-android/.editorconfig new file mode 100644 index 0000000000..ebe51d3bfa --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/.gitignore b/nym-connect-android/src-tauri/gen/android/nym-connect-android/.gitignore new file mode 100644 index 0000000000..1eed4c2fbd --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/.gitignore @@ -0,0 +1,17 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +build +/buildSrc/src/main/java/net/nymtech/nym-connect-android/kotlin/BuildTask.kt +/buildSrc/src/main/java/net/nymtech/nym-connect-android/kotlin/RustPlugin.kt +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore new file mode 100644 index 0000000000..eddc6bd989 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore @@ -0,0 +1 @@ +/src/main/java/net/nymtech/nym-connect-android/generated diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts new file mode 100644 index 0000000000..a81c779421 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts @@ -0,0 +1,111 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("rustPlugin") +} + +android { + compileSdk = 33 + defaultConfig { + manifestPlaceholders["usesCleartextTraffic"] = "false" + applicationId = "net.nymtech.nym_connect_android" + minSdk = 24 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + } + sourceSets.getByName("main") { + // Vulkan validation layers + val ndkHome = System.getenv("NDK_HOME") + jniLibs.srcDir("${ndkHome}/sources/third_party/vulkan/src/build-android/jniLibs") + } + buildTypes { + getByName("debug") { + manifestPlaceholders["usesCleartextTraffic"] = "true" + isDebuggable = true + isJniDebuggable = true + isMinifyEnabled = false + packagingOptions { + jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + + jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") + + jniLibs.keepDebugSymbols.add("*/x86/*.so") + + jniLibs.keepDebugSymbols.add("*/x86_64/*.so") + } + } + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + } + flavorDimensions.add("abi") + productFlavors { + create("universal") { + val abiList = findProperty("abiList") as? String + + dimension = "abi" + ndk { + abiFilters += abiList?.split(",")?.map { it.trim() } ?: listOf( "arm64-v8a", "armeabi-v7a", "x86", "x86_64", + ) + } + } + create("arm64") { + dimension = "abi" + ndk { + abiFilters += listOf("arm64-v8a") + } + } + + create("arm") { + dimension = "abi" + ndk { + abiFilters += listOf("armeabi-v7a") + } + } + + create("x86") { + dimension = "abi" + ndk { + abiFilters += listOf("x86") + } + } + + create("x86_64") { + dimension = "abi" + ndk { + abiFilters += listOf("x86_64") + } + } + } + + assetPacks += mutableSetOf() + namespace = "net.nymtech.nym_connect_android" +} + +rust { + rootDirRel = "../../../../" + targets = listOf("aarch64", "armv7", "i686", "x86_64") + arches = listOf("arm64", "arm", "x86", "x86_64") +} + +dependencies { + implementation("androidx.webkit:webkit:1.5.0") + implementation("androidx.appcompat:appcompat:1.5.1") + implementation("com.google.android.material:material:1.7.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.4") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") +} + +afterEvaluate { + android.applicationVariants.all { + tasks["mergeUniversalReleaseJniLibFolders"].dependsOn(tasks["rustBuildRelease"]) + tasks["mergeUniversalDebugJniLibFolders"].dependsOn(tasks["rustBuildDebug"]) + productFlavors.filter{ it.name != "universal" }.forEach { _ -> + val archAndBuildType = name.capitalize() + tasks["merge${archAndBuildType}JniLibFolders"].dependsOn(tasks["rustBuild${archAndBuildType}"]) + } + } +} diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/proguard-rules.pro b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/proguard-rules.pro new file mode 100644 index 0000000000..481bb43481 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/AndroidManifest.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..a459f78ce5 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/java/net/nymtech/nym-connect-android/MainActivity.kt b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/java/net/nymtech/nym-connect-android/MainActivity.kt new file mode 100644 index 0000000000..5b7526aed3 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/java/net/nymtech/nym-connect-android/MainActivity.kt @@ -0,0 +1,3 @@ +package net.nymtech.nym_connect_android + +class MainActivity : TauriActivity() diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86_64/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86_64/libnym_connect_android.so new file mode 120000 index 0000000000..d6aac3cf45 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86_64/libnym_connect_android.so @@ -0,0 +1 @@ +/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/x86_64-linux-android/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000000..2b068d1146 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable/ic_launcher_background.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..07d5da9cbf --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/layout/activity_main.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000000..4fc244418b --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..28f1aa119119336781390c2531c381499576ed59 GIT binary patch literal 3524 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..28f1aa119119336781390c2531c381499576ed59 GIT binary patch literal 3524 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 Hu0mjfi}+A- literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..13dd21476b5c7f69cdfb82969bce7150244c127f GIT binary patch literal 9081 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..73e48dbfb7dc31ed1e951b77820af88b93fcc418 GIT binary patch literal 3377 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 Hu0mjfi}+A- literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1d98044f13bdd3afc7cb426644ae118688c03c14 GIT binary patch literal 7971 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 Z{{b+Ide7&7`HKJm002ovPDHLkV1iT#V`TsU literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..a888b336b5bc84b42c0c266ce9b8ec5d9eafed0b GIT binary patch literal 18900 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 I*#%+#2dtK;n*aa+ literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1d98044f13bdd3afc7cb426644ae118688c03c14 GIT binary patch literal 7971 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 Z{{b+Ide7&7`HKJm002ovPDHLkV1iT#V`TsU literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..081832466b4a17180fe9255fa0d3fcba2010592c GIT binary patch literal 12392 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 K@hVZnfd2y&>ZwQo literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a838e7b550ac82b12e73d71427c6ffea06a944 GIT binary patch literal 29506 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 K@hVZnfd2y&>ZwQo literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b18bceb64d257ed31d50e65d7f2b98abcfb21158 GIT binary patch literal 16751 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 XrJNsHnTG=pQeg0O^>bP0l+XkK^)z{o literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8a57f38e0273699c8cdd1012042bffdc38abce GIT binary patch literal 40510 zcmdp7V{>KS(~WK0){X5Xcp4d*F{Qe)~IaRk#)p>DiclYkz zy;iRsr6@0n2!{s;0s?|4_49`^2nZJCImuC?5Ykq~7~u(Hm2-9UY?1QPhL6t@xL~OV)Yihw0M{$^;p-pMm$2*Np~ww5+o=v5MV*V|1Vz8@Y&&k!lV2!bqH@7ER>kBxIr*6!Xyj;w7)%TA=yr} z3%`@St6jA~21gUGv5JMrguqa7f)XmT5Zp6Tjp;A_;D4C$!S%SO{ZREX>eFp=boooY z*y8%W?v4oKNbY^n zF7%Ku0IrA#pQZYfzFgkghnvJdiLVY@2dyEQqeyVGeWF!^GHhqrGBy5}z$ui!z|n(1QnF)^A;BL)d2)ndT+zeT6hrrKY5 ze>EtNEC0;S5$20^EN1(#4(j29zO?1!@{;i@6bM*QDdmt9B||#EhF(6e54ytkQ9+TCY0jjMB z_3+k`^-LDb3qy*tHtIoJn&Y<5U9Im6IpwKg%%0K%uXj&MeDrcRL5?J-I!jpBxnM)3!V2~FfG%Ha#16DVIX?I{Uk^>d0-sw z4IVO%R=2aTfw7X36=xfpd-%0@MD0(cn1z}xY+$3-5a;b84CRfcm57;m@BOuZi54l2 z{_ea@eI86W%~VkOR?idvKBKF?`s$6ge8n(>@<)%TY}masJu1`E*b@9YZY?fJ#k5Se zC)(KLY#G!3J?bXuy`B-;GZHxk^TQCLU#LrIUIg2!|An~ieTN)HEF|c5uxsKA-O51q7_`SLkzKh-u%4zhy4Y(G;y}rUn6>Zc`GRb%Tmlc|zMa8gG z1Zl7+^PI1B6*34=pLzWbm-tF4*mImsy6&d>KdPpJwF84-=T1L3B)}mW_rrLAL;7o> zVcMC|vPJ1}nJJ}e;T!-*h}_jvD-XeVi9wV7or~w^{7UngDn_nkm16(`++1);U`U`V zt!kbygapYuVtz9OSUP;)gQqf644!U)DYx&d|6w7LV5_gqY!y;ar47S7<@Jr{)xq}F z1OsKI87W69RiUbWMlKQDA|J;iYr@9aNRH55v=w}kP>UN+6tRW(vIGK{$XAw)5(vzH z>8{C{9}d|~G}$DoLcC!%;LF));ApBA)jj2PjI^4>vC*;0!gT=2aUHfU$&|cQpMYm= zdBS&4mVPSkjXbeH#r{6ack_=L&%oEr_;_+HRv#r2WPu@_vTGNajP<{CxsJdGne@$f zV!=os^1|!5I{%#0id|+hd8FIm;bv|`J#&f}(qX`wWvQLGGl6}y>4h{}+oe?6h+~~K z#{sz`twsF2T?%bh5PYM2#N!^+=f8M_%++AH@Ss2=M+riOiT(pP&tXLSeKXGy0$vCe zE>GBQegMM^k7RZs&zze;^V5!<{%`G^zm~nQv8V|tv`RG*(;~|k!?5?(n9vuR&vkjr zMsC+p)bO(SA%=B#Ze=V@?6>bnrTzx12#ks#vV$N1uSM6d-ZZ|HB+qr7b8+X~!?qNY z&fNtJa3l~*LYUd{+A!g;Lxg*6%Y63rO@Eed*+;2RBqh|fX5pXPS436m&lfw{z2g(j=WJI z#hg2#D=^xPAY~S&>XY?f3Fe8y_TUXTT0vxVcW@~U!D}qAnIt76pQWNSjbXiCCCu1w3S`1vkFuMWmYuUlwdEeavGwf39s5ny+z ztv%C2+cDR3dY+EP!Z#bkCy7j6fmI_+h4RK~4uc${`2zwdJp8r3dUF}dZ~y8cz4qBYx5=Lg z7Di3>v8rp{gupMat?%*sTnfO~_@6X2xB1D4EVTaNXZ=20`ksDffx59{rXHM~FLudH z00>oF@S?{WG=)Qfo#+x%CJs#6S8HOXbZQ6s*O7)58pCbV_8b2etyaF61-6%=x~Ck4 zPn=|utP;O->6#j74W2zb7ja0??3ehsDmQ>+v32P+nM$tM8N{Om3pYJ#O(vFHcOpX% zVDA34MD2j*Hdy53g3l<+%hjiA8?u&e$si+wWGgB`hSz^0O4*{tM;E_cY+9K$L*$rq z?g~(?p*y4<>Cr4oXCme6!?s#HrRv!7FCa6?^W&t$F|)LNt@5@J;j=U`v|sG)l%+_G zg%1o5OpvAtee?ZQ&?2u67qoD=yzlO z#<(LFyXD>=d&j#_ANMon+p=fqNO&4p`MIC6&Wb5f#d(~k8b;g7nzmK=XReyuG|WgEYR}8w+1gU6BxZkw^$ckmzi$P{2g~{GlLC4a+ zBgFpi>y|E-O|urEy;&8<4a&l1z8xmIf2e{e9l09%2SLpE%Ff45NtS%KnSUBpYmH5e zw6YoKD73^iqvBaV&|^c1$zAw!uOJa$-)T9p4z&2uV_#Wv9W6LHFB*7oNZyGACL4s0 zfHj(WW~U4kDJSjrd1$Ed)?g)KZaqqJ_|G&=)B{K=F~Se+2wR=W%g>cSHgyB8E7-~* zA`oiJQ_S_X65E28zh~jGOFac8QJgLR54H&w`Pyx^PUs-O4c3*b6LqMgV zUCq;wVVVJ9Je)qETgse<6hXvFST2MuyOEq<#1}cqtFjil-rY>v4WT_qRr93D0yUMC zhrE1t={*nA_*lLR%cqlXX7a(M9U|zgQs%QLD88gxvpYkx)CHRzGv_17TipkXmIeMf z=pJILSxvAja-G&DTU!afO!#Y-0o9U z5h=-gGP7Hpks*%N35Zv<;8Ey5zNCj`bH^NSS5$Q<<*pHks)oqVPo`2?frF+Q-m~3y zY++NLL1TX?E5pzL1WhG^NSU8wn|#wJJ%{Q0Ho4HZ+8lB-OS>U0 zjO)CH*9P8yogX);bV6z|Uxs}7z1Sf_1Hex0+y71aO{~`7V-o-$j>1|ta^y3N9Pw3I zE6PMPPeIUJdSj~3ID#~t?f(Kf;&R`2Xz!B1khI53+8@6wA6O=&8{;7jaf1eJ$H#n- z28fZKVH1yKeIHq;Ddx9rKp*t^$b&N{T#tBsuhk;zQpTU&Hp@=5ts&o){p_IF$P6*Q zlZn{1VdGzR&CY7nY3 z3JFMP%6#YGg$6?Vl2!AFp&FvKkLWcihWj%X==ATYTpXv-nGyM{JXt8Y0!jucitoBQ zN*OpK6F5^D-$?{|%Zt#+!itOLiwH!bVT38I3ib9~+)Iwj;suCM9FZrCg#%f~=sn-e zLWty&)5H$MulagKd(YE6ukTIW%FyXaX+ z6cWXy-@Tz$WOpp$L2<~;87VtHTwhM(QOenwyw@PO=v)wsGbLN1Y*D2qiWD3lY{&Kt zUmy@|5@V|lQtGXvysku1m_10R1l+#|RKM#wSN+*$o%mfS;6C9oAW$=4d zYk}PqW&qXCUn230fA7W*IcaF;gVPRaHa&PPwI^+Sh?jJa%Al~YT-r;ij|5)KH-dvB z(?JIx;X6x<8x`|DPO|I-X1X@&bnOpHl5I5QGL#ZrRdF{*Q54^xLdILh3*J&RKvUFN zHI`UoH5#yVD3WO9jVZyh>EWlMlI7ER0jS6&?cvE(|Lq*dTVr8; zhMZ%!$_3-R)cu1)RBVFHu%ut)Zl{z`nPAj)WFHY8!!5qhgY4DJbVm_l#eAa-jsv>^0!6S~q*r=}*9P+0ynr@l&8Q*}R2)*a zu``XSvw9J(4!cL(V3)LG^GSsw#C#7*)ml{761R%Ff+cnLAUrhpPcw42b|KmX;646{b@cGb?6(TvEI#NIs zd?-4W0LApChye!b$DYPh{Ob7ZDrq?BGIW5ppmH_-({J9z>DP)1)2Ge>Q1G9!AW_9dv}q&2i{sOd<<%vI>BF24M&Y-;6Coq zGJB4L1cxQ_(|ta-_;7{Dz;E}R%I9mYQd}K!!BV7izz9^&u+`t-kN4v^E(!gLk|;c! z4&`A`VSM)cj+6@;o=$L7>UXPsy#e;ullK^GRA$@X`-^adKLx`zcs>2W(Cl6c@F;4OEA2?uyn z5h4a%)nvBkUNuLA8QqpHO}gO5)UXDfNymqYs_vraoOLS@@XC#W!fRQHBn3mp92^e{ zHh#CV>95_xF`TV=r(Vyb1(lih23@d~fiwevJmO%)!NRKK91;5R9FR1SjT7?wP>HoW zeX^u!BwVbi-z<(VLYRy(XIq@#>@ORh7HaLZj+cXf!fUhYTdvyJf*!crJFY3Y5e(3I zWWjj_=|fBWS*GQq$L|u&C3ux7N%>#>$`H}-V;Rx#OSc8C44D50W;NV2#%7``z|&K` zX2tv6TW^@O2<*I1%b@e&x?e&Dne}H8j6gOhBk_s^muOUJLC-g<^U_8{HF3qbm~qF?&;@GBr`x?ET+Ds7cC7hgFObTJCwm|7@>32w z^F;~iP2s-Lj4m{%KE5&`%w>n!UieCm&@S2Xo-Mq;C>3LvDV3Ic*k5`;C(#)N)X)H5 zHvhv3SI@tr)9HPT;A9_3lHA9H8abGyJcO0L>J9NBRp2vO%oW<^^|Dts+$NC7oFCWh&bPh~HN%kYNm>d0 zLfGtshWpk#W5Oc4$ap_oqU3iAQw*t)^QX!3XX}0~9=q#EPBgJx^J=l-@l5J6 z4bqX*5SlW)TBcC#Q(y@!Bs<8(iRtrV$YO*Q4aNWtO)6 z^~f&8qM+ecr}omRdVV~r4PwKjkfw_!{d{cOFjGg0{j#>h$J2s=H(%nQ<<>W<{v9&xdoWpEQ~J<8v$ju%|#J_?*L?|Hb1?;^uM z*@UN|(0JdWW;-Gb{ms<+cuTE!n^Wr}nDyy$<$@pg>qmdsD{ma+xHKIq?*a!F!qjg= zZNQpaX_82n-E;$bz`r2~CkcvX0_cqJK%go-r5-A*T%^H{(CsZpI3z$RiN{f3!4EtA z=lP*!9qWDwmw{c^Zc@ZQAxI(YOzElou?tsmxPE7-)Jf4hQeUfh0+fRueqLv;+)}+! zV`p##LFli-aaY{1mqcw%bT;$h8C>sK09QKi%3l5tQodv>TU$+M@nc$WCmUjXT zv#RjM0zTsQuzTaD&74lH-h(Y%i^!lH92rTpue_VBN>%K0z9|$CF55RK z#*JLT#LaE&ZRZ7ecfAG3e;y&u7ZM(rglkV_a$TQhtnniQy7`l z^mCkj`MZt!_Inwk#>HFj683eHAF;zRa|PUJ?&5x&1wW7f;+Ai?W$Jx7XxYq-w z8`byzPUQmI&FbaPHF2k{UN_6Th4wy6O6dz69aRAu=SnHEN#6ss;(ZRv2B>56_yM%N zSN)6=Es%RISeEL8P>BX|QFqwX?(z&AgDdzBTCIo)nnvv+)+N;rX$~IgWkVFMxf^-max8yC?x=-FLd3fg$e?mh!=Ifw^5XpDheP;7rR&Go%aOE!aMOg8bb7U$Z7o}fn?NW9; zC-a5ZMrZ_=knp@?i%|XOPujJsBX_4^^4`tti(iv-Z?ZDow89>fIl%!EU|5`c-Y!;B z`K~e6@p8NOQ6GCjjlH`*pf|#GzG|iERNXm|_NhJO@0yS4mzxA2VVhGa4g(YgN8>iN>z59CO*E=_xQLlFs?Um!& zH{Ld4iB#?4bepPEtF&*IJ^(eW=T9}tOp{K;HZgL7u+&Ee^RhB5Nfg#+@54n}R0gIX zTh6YdJ2VG0&F#)^CfZ1N$h)^gCFl%W8jCt|E${#8>?;7hQ9tf+@L$`)Weqd$aP1`n zBY)rGD9G)yo!#0a^YerC|AR380_GvK&^mqGkihL6fnF;3cBHYT&8rz=&M6akWFTuR zL3tF_vfcxZmc?cqdoryaAAO<4S{z5FUhSb8uhTu8pm@Je>}`;tpLWkK%Sy>KKr)Yl z@@n``H{>o4{-DWCDx)pr{DJqxJVv*HpqNEvG5%#{6MPD>2N(IExKNn4!I})l2h`0llfl9z;P;){D~Q#i!%O@P_no8lVDvTMpsi^HO1Rr! zySFaq>G)&$6}yH+zcaOr9tGcbj>s>43(Ux1SiwhEim8Iv=Wnla&F0#kC`wAIKItmvN_X zpc%kK=5KI|o>xb7e4rtC>I+|U8a{0&)pS%(#QgND!9dEk|9k0>bTOV}v@Bj^=7gMS6uDXGSJJOVX z5f@9?|0#~s-lP`v$LQ=hFQM`GvF;bu6B4z28{}xTNj*o{_%YM$4lZ0# z>ZOl?he7|Jb(PgB4D=PYz0W$tVBC2o&%b}PgD_2dlZ2CBsYwtSMuMog*?T6v%~J$a z<9$jJD?Colip-cjq^B@=;eV~T^Lzcn71o!!_JYmQhB)GX{RN`%Uao=Z@_0+7gHdyM z-%2h5f9DgIUg{K;pl;5p9ma@qK`6d5vaT^dpZkFY zc9a^d_>Q~_x9!OfgRjmGLUsV+Xf!8pANcac;Lq+A!7FDO#G5$@9gNFjW#7(!2fUu2e=~{J22%&r^dnEPbeQh4%M&p* zTtX-O2e*=VCE{ZJk<=+-4N{u61!aq`{@)B>jc-Z!nrG}ujpJa{t3W#zIB#oZMPLiw z&P)4Sbh!J-EQA~M*VfG+(os1}yr)SeLe&1+Qpd4P+u5~}|+@<2(NeCLK)rM;5puD=c@RzC;+Bi)$Q zcTO2YP${oJ^=)7hS7Tch>IQ`7RNl)xcFhum7Kbo%L4}N&_IJ4~ky8sjE&axE4|k_g zj=t`QmMU)Ndm5x9cA2Z{h+*9)(gg78J~a%-EtwE3pV_a^pI)xF=vi?FNXE^f91zLo zm@FasZ8AOd ze}f5v+DT?9S#Y?ifGqW)W1Z%V}ncr_J|o=F`ULaA z_fAH&pf3#s1(h7cfn7*>U~o)em(C4%jkv2+uZs{(XAP-G<2_!G;!_g#Mn<*s-_+J8nCR(1oeIwaysq=Iib< zgRVkrSF+ni*L$mE>2f-qZ>I*E@amOPmC>9hZ17lvYT04G4_p1MX~s>HYSD5ixInU8 zKA>uH6kI+t3T@-2_}(uoNXyCfGC<2Um8Ffbq}X8X`a9F>_>NIVJ1f)5u~rE8Q!ba4 zW1fiWozl>lIdj@W7ogDTd9m9v8Mq1;IoYBV)q2@Bo&3bV!~a~Ab-Yx1m7FSss%a0V zkR?p_Y8?_XoyCRlp&=gS1a2GAqrxd&%!QXE`;WbnvAzg_Gq&yAMcug5=Z)~&t?v>W zo&S^z%WIb6g0xKQbin`2zx?%Qc~2hyQ?D3$2*Zr;d_KPQd24NhotkA(*=j0S^MNEO z%+x#Qg12*$wPE!b+3SpFDA9+;;T+9T$Z;jq^6xB4>t;!qTnu`(9^%gPAlUpTth-kc zHaS91jSH+`<@P1ho68o8NpYc|!P_(KU580MHOB7pxpy?<-_Yf{N+xyOpE}|gYI7u2 zvN08i^;bkVPT*Bb0YO@Xg=inR$RN=D(@Yln58FbBk<^qKC{ex6p7m|VA|Z3NrTmaICk zQ|nr+2B{ZM293kVQlosr1{Q-L8OYkR^D2Li!B_exWG53u>2+iv7uI*(DjSjZd~{ok zd^0DvSec7P4ydukB1(~MV)~XxE_KdBA74bip$n#L`!nbiT_6ZCfzAY)^umEb%7t5z zmO{;P|33Z|YiMs*FwF1lT=Z*2iHof-91LNzOp!RXVLZxTLn=Q&Hnqj7FU+9x0dNJl z*|FdgU+SbIEYv-Im(g;KRPoY0FDo>l;ZgC)@Pa(XB9lfOY3q6TKIGrUmA#9v(LF=s zFW-rQI$0rQ%YZ8(x&Q@3?7lvmS|)uo7M^_^{O2w@@8mpoh?iY+OiZMtrk-IkK-i6_ zMUvM7Dn)P3#mGktELm=zaQ`}@;05k))mP;m z?e^e3HqCpqU2(Fq*q->0H}?)dfgQNHT1Eh$yJSXC=#l}x;>wI_9b~KtCB+l) z?|yXxe0*x;sm*lxxYlpEsVqe=BDoymEI*{^@VSkEE(rKr*u?{;3I=EE>9A;Z%BC7` z4RsQEh<5sVW{;@Sh_bIAm4S1G5iq+PCS%Z-yWG2-amSYk!+=etWdg=dwZc4T)T@iP z3b&=He7YyPHTP%TW5<8~<#I&mVcU7V`tA(-Lm-ir()gstBrz%>Aq?c!dC##V$8n*v z_Hn!Zx?o=V&K5UW_j!Vo(h#|$YNQ%h4S$`Wio}4Dffo2fz2?kNb&_j?8pr+51zp`? zrjpzJH04U*U1hin)1*-WY+mQi_fZOHiCcS`UvudB^wL0f=g_}DKQ+TdcR;NtNM8?{ z;J5vi*P_Yj&25_zxpRps`)=R4v9!G2KAOo!`S`bGVPA^wTINEvp2*R8K|DT}Yj_k0!^PDy4m}i@k6U`r@8LW$NgprL&S?X+rCY(Ehu} z^U&NqkQFwbIA$y!)mn(lD4ig9n$r^waDPXgArP37nv)#1nN24&gwB+Szh>{e97L(8 zX5{|HBVL1Y8%mIllO-@fnA!F)!fW8aU6JmD;G&}E`cV=arLBwZOXyX)4GvSw``OBe z6d$(Z{ucmu%FbVR?90ntv&WUtvX|@4%0KiV`umv>D@qobk9&HK*xU=du+tYm)Q!jM zY>Tr#CQHNZ-ah6Qj;WJ>)+-;`2N|%En)C3dVF5KWJ42x?IAermwSVYC^pm|ocz|28 zF9(m+`8293S@);~tgySnxOQyRaImW$Zh6FM9DFx!5mcGabbNuI(zWcG*4o&9jAZfH z{==N?bU7`OGP}rzMen`VZx6Sk=(+eGs*?LWk>F80^+e$ws`O-C&jPKn@U*7U3HhFD3#M-Du?hCp64=@P zuz38)_mH3Hoi_`UKi&thb#~yfPgf_V156-24qSP3isBh~x|(Q_zvtn3zPICE#d4kc zs%2SdHQOm8fGWfk?9)O94MZq4TaeB|0{=qOM1z(+6KLN{cLJU^27|o!)hxS(OTRV_ zJ%7s^c~G29D$E=w$I!YiMM8uHwyVbY9p8>WCfQ6LZgM966{=UXgpO!yrF>Miw?~=( zO{z;CT?@j9 zvIX^wZff^skGIa^?>f-?6&&w=7ylyT)Ir3=Ru7!Z97bG3M|+Ci677UjHZXJ+egMc_yKtFd`huiLfaiYgys}6+PT@Vraywz`gkd=E=@6 zgG@pZ@Wa48d1K>rGU_+Z%=WwEM~H^d9CuIC!p$vRFx86P2t8YBgAALYBjIGtw9E?9 zx=G8{crFmHx-9S4``^X8Ktslqm#)xx7k*L z@bU%a@m^khnihM(CzpUHOd4iLOVL%^#WmxpGXDoBH6MP*vul?LH-GBL$?9G+HLALi z%>6D5MzP`$#%4DjNAsIi*rrPYBmq^N6itg7^MT8!;iqy;=1RW3pj^!WqS)WhLE zg4n1E(q60X;R_eZx7iy{ptry-OB{*lm5d-IdkHhct z@8RP(*_Z(hP1}K=>!Q6Zii+XT*YORQ#ko_qE4y~_XRa4pIE00p$%|}Hp6~hB+Q3M_ zVpI?h&suc+H;d*=S>G~%VXgeH<)}A!K*4-(uCjWsk;4H;*DThJeB+W;`N8!OJ#n;m zJAS9f=rV{eH-yD`6^m^n0xpa+`&Nl!eBqIazWd=e2s==dS8zFD5;}HLUJ|Z`ftW*r z-dkXI@-wL9Ap2mzhLG=N{(FFuP7|GJH0?DEoF;h%w-D?aPYnqV+i~sC6T4HGAgS2MPu%p2g zYb%WGKY|TU-CD4*Y}*!y>N{Kly6ShVW!u7pUBk~$jpa@Bq@iH;ZiP`|qD3|8wy)0O z);;{KEzAYHjEK@Y2E4s&-{r(+f}J|`AKLL!!QqNz!@pGLt5(eLC&OzNF0Sj9Opo+ws06Qs(vHz|zXjU0X$M zfGY2@ys&M!b1%si_pf5nBh7X2ZR#SgywKh7Y2Fc`4^rMxU(#L;l;D!G1ns#AwCBw;|pLIIZlG;&70(nN9}xv zSKT|D%Q04BDJDi%Ad_dJU$M=(Xf)DeR`~v1hZ;ZXfTHJ z^VDDOn%vzsZ+OW%cE!5SiOzBKsP~?CN%wr>VJW3v4mq zPqgD|XLc@6EbO$Jtm^&L&rjzS2Fa*<5hV4^6tW2ivOo)* zjlH1Al|e^`x+eduot3e>4?c}d=2Qsjg+mo-6l!GL!e?URzI-M~!@v7TFd~<#W&^JH zE~l02J1t!zn1jQAyy?5FQs*J0+&C!X|6Elc0(;X>6{_c%4|WY|;;7Bk-}F=~22;~F zEXVw&vu_^mS`ba#D|0HW|At(QJN3|Df!*E1IEa;Ry1*tP$Mm*Z{ZZNixmEs?Kg;rp zeDGoL={OZM)ALrAsBs^{;yP#r)Pv%!mJ`-!hwo-~e6Shb(G)`a1gOx{JJ|8Rgi1}n zLt2)YuBl3lCo_>KNyE8%^!t&=nXz~kLpX)Jh|8MoO5tAO+OYBJ?V?vA>T_H~DRrb_ zo;*`%T_EpUwajl)*?{t&Vx;f_U;16)e$XXPaq``qRDh0LX!ip#V-!YHzKc3qpns(> zirAhT2{K>%T&l#28kYmt!JX9;gmgu>`q<#!xU?l5>XY@Kkobu=#>Xc)Oj^{-_T&_D zd@TJ5*0qS4#;??{!rg3N+$3D?ZME<#p12^w{HVH2rNj-Qj`p97mNDL(^`(e#d(C3b)*XNgT3L?Mxk_pnA7ocA8Nn{BdcK0&Y-pL&7fQMZ zit2}9srrD1+gfwlC&D+(!?3wg#njwPNiF{4b9tq{^?D7J^7WKg3Wvn=nz8zu_zA3f z;xH&MM<1Ww)Q@HaRa=VICg7x|ye@ucKqfP3ZC?tMEso3nm{{A5;>^iIfs1b}vnzaQ zhVVK-?Fsq(?E;)UPRmDg6!La{ffiIN%r)lMcm_w{2%Nq+Tao|Su`MSIaKSZEpfHpe)InlUicR#{i7WfP_?IEt-|K8kf?RDI;^c>p?fk z@QJ-lM0)D816Zbsz&^?ZtgLJC6;~`YMnle_kG)ciU^1Myeq9W^ABJnwdgZ$?dTnuN zbNrYDUEWe((8GE}1l;%Ns7M#b?2`b~@IB`(VR2BdqhDAp<7``ekNl`eGuJhyDm2Z~ z8HZdrggklTgNC#pDnbrkLKYM>wl@0CTRwoAEt8*3Q6dnVl8_E*_(ifA2egPLpU1UnogUs#@!uwD5=f$PU(RF?N8XhxXsh0)6F0pq5+JCrv zhfd7W!N6VNX-zz`0OUHz*D+uf*>v~L))IeNwoap~RXGB`~*av8l z%1kaWAv%r6ogEiq9ksKRNpiVV-FduL2RC@L%~scSZrNC7#d*w?O>@^)@+&k z^q;Bh%tibJU>w{OEmle+G(YfqK?9jQV45#X*S6TP&Zv0n7xebyCZI1>wW`>L>lL?1tgn-;v1NrFHX;P$x8IX#2btKdMi*^X zB8S6#Y3Eqq+E-2}4u;dY8-}9w9QbeW%rKVZRuGvEhKdC9IS|9`b9?cKr4B-k-UH!G zQ!7hrav^WUzeoFq_NIpxgvx45r7{<0bwgTN)8SK^#Kz<+)Oa~;u_lLziW>X)knu`= ztm_rjgXSK<-@Xh!t|}W|+@Xux#s1e`?U&DW<~Ag8)3$-W z<2<84^zA+Fq?+N{wQtVnb;zFHNhb~xT2Qx48`wDb1QaY8dqI&T1YBcH=er+r8vy~U zNmctA)F|3%ldx7@V%UVJk>|*kVMsI=!jqObWi* zhRO(9^C{k(-(JTIHdfzMi9qUO2v3b|h=P-+_`9>s>CB;Hgr~w7fiyTdBEvpcYRRdv zzVekprL;V^&D&pPjopJk(< z#ZAzT(Q94O+Qn=-cHK3kjR3{su{ojNVfN|WZoi_Qwz_pXeqr`X-f*ocIE2L)5EZXSx8RYYjC{CIb2^COgygt0_NdCaX?Wj0qL^XGc2?lP4d8ip9ei zAV)qAzy9^)#z-M-kJfd!T2U^l^(`}5R5v!xsMG#}u1!bgS|Ni-<(r82HO!!->O_Ol z<&>Z68#yDr#Mm(*cQhttcg&^g%=gKcg^gv#LXQI|Z=0@Q&)W1%&(c}c(i zfV4Eqw07bA2~Bjg*{A4Lj;l*E)DrA)g;pNAZfhOCp8}4a?IXy1NL=!h7~|RDo6#a+ zneSx{>rlqzV5g{^UB^FJY7y{uGCd>Ag^Unmv@~&VKdISK=qi`U0Bz_}_-8TkKA1dy z07cx^syIfNzf9Yq+dKsI0?s5HR@c|ONWAqoP5(8|w&fToi!i>aV1IW@#7SZWfKB1@|;8c-` zO5a%Uc@imCl8lTOI6fJ1m17H6+G2Z%X(f1819{%{#79u5I8$<`F&r!#>7NE?9!O7L zo{{pAor%4(H984s-?%u}B-ew2+ewOwK%w@b8jbE#$=l?q0y8Iz?5c7p|2^|ptWS}T zR(cgqXEPv2KTFF*;yg=(q^5PItPNmBetf`VW$3@n4E1;}&01K|!{&It;e%&>tyWs> zg_!zpq3L!)n2|cLtI%#QO)GessD)}J&F0kvM&10>c%>ei?n9CBH03PfSO)W6jx@b^ zUmhaWXG+)OOeT>{#k!HFC;SD|tl{l-#yYT~x^ zUMJ3g*vQOf?}YL{BPjrK=;KaB`dWQ!+}7_p6PBrzoSY3^p`o(iXW>?4_qPoeg;I{)lSmMzEE*Z?0z&*u}3Dg%GrSXg@tS}!k! zY7D@1bHuOk#$f`3DZe56eLA&k&Nmo_ob+l6dTHXW_iJBIWWRc{+?4OQ9O+o{qqx5H zJYVL|_U_eoFfx*RQT!?gex7VKk%@~uM%pQ8+B(iJa#Cr*KgAoqS>VX-cabIoMkPen zSN11o+m0Hj(NF89OV*Qr7gwJdPD>DNQ|sL}ZhlNvgj^GR>>mW12YsTCM`aBF_eDZtN7 z4Y^4|JSrrl;r6Q2#3?NS2pE`%Yuh^{0|Apgc8aM_cWfzcDR{wDEh&_xNB=V2i_ypw zOs)d9A1>75x&C@GPmIxd{Zs1%LBy{nCnXlhklxDb=LFms0KRdo`XCcCFzo02T;&@i zG(X>-R9C$@VutLvE60m%gmgfpd9vz&f+Jp9=b$G*Z-?VpmgoBx6RYGxCtjqmr53e# z7ZGK?T59hxjDhW|pOX*HM}|uZcVw^n5t>X&gmY{KUe|XY^7O0oU0|z5K1!h5*%W3z z&R;D>4|&j2rgUJs$Nut(><^_dK8vP(hKusDXe=ch`75;5Sgu`vW9O}>s@V0=tN2r*hfQ|@1WCxC6EaZ^W}Vpi3yJVIKo54G2;1d zsb?mPyu}gmuQxk1A}#MNanICvg!Nk!31axvrDPV!Uhtm3&S$CcXP5|F;2ybMoNQS? zNmHn+yk=1@D&{gRPq?djOsD(YfA!yi3%2J&vI+agu1@?3JHJqo+i$uq2Rhiih4;4h z|9Ca68B-?%V#?{aPye<%GglMhaNP8Pw%)sjEWcIMUbZCZX(+cnT-BvS<6QyU#NoXj zc}6za-e9|_meVHg_L_;~yBw@bWah;E0-iken@0#u#x(db<<~Hm`*vO9{qP)t% zQ|otL|GcR=+%{alBWpLeXz=-%(uSC%e~~eGLC;$C3w5?T3#V|aQ|!{fnTrkJG*t-f z=30DDK>Lw-Z-|D&O6omR+VZtvsfr8IG=|0fw~xE>zDJ->Z9c@7Jzvx5wpY>@%yKHs zoNM=+L|ST?xI)0P$8r^i3tQG)_{3smFu6LL%yms zu7rnHO<`#4TH;CQQy}RQL-9&Uf-~iDRH~f)Wpdxg6 zj#||CI6Q;8biNSss0{AX2a!YjzxNLB?X2rC4j1h_*s0yV{K6zDe0?pR9ZLxW$k2t& zy~wAYvzM!*4a__{kM^@Zsjk{BAI|I-lZ0HAFpMN0z=HABSxzSXO0 zgYh1%+0U5Ykn(^G=XsKvHpP-Mm6BauHej=<$!FrOh4EP@G z{>*YLAaP_N^9m=>YvsFD`3)czJF>A&-cOd-3_E7gA?!fRhAM6@S&r*O4f$sDt&x5n zH8UkA{nLxA?bez!4d6jlIr@cH!;F^Wtx+D+Em7j5)1iKRm8ul+&D>L$3D-!)Z8%+*AksObbv1(bjvwH5kczdLSPYXQ6Fm&me!7C*g>ibj$B_0M*kXhDO zB8)91cqDvsikWM~7ME-GU=BiZaHxmo1QhNO4Sl)G7RK#95cL0KalvJSBcn(7X5i=v+kyYsix;a;b^7d)5n|Ij_VirHOC!W(ZZyzk~SzGsBKg-69(2L=>nr|vnSU;)Q z*O;dVsTWWXIL(u=`hCT@MmqlIGBa;0uXwAXMOVW<^0zE;1DR$r+5IswjhdtlTky)h zUHdnouj&%evm;hK`lCKi#fv*>2|S2{Ny3^3Y`!;@*vrU7TEFqhsN(jY4pWOxri9PI zkYB^<*Iz89a*JI_6GQxp7L7WlVl0sICs9lmnn zm9uZX=c>Uw+pYE{hUV3)%ji9aCMwMkyrapQu=a6NE}2ztp~h+3*;TlA(I@sk#4TCO zI-NDr0UUlg_$%o}4`~gdkZ5PWwpGa)kOsC~*o(tTa?zw9!<%ezf#mFHw55c>XsgId|%3(WqzcwDpi}OGLgEOpb3x{8x!Ud*Z-1~BC@2Qu~KE)_E>k^hk z^2%gQOga({{Si?&zsWuW$SVn^LxCD+R&Q?RnGs8v!B=uL0{%v@#|#*R;b5MpZ?tYJ&U<#fu&V?QHeYQNsKecvXw9j z^yHi=u|3y2amr*QXz+Vw^&;pCsvK4msAdkUgbi)`L~i1p>8Q`ww^-Bg0{UKa&4Nz^ z_ILNSZh)Y7?eLl#h{_ADz0zrGDdmQNPTtInI^@{b%F^_*3QJU%-qCpZ*;{lx_0Tt% z*XD^aDKQb599>HR%!@L0F29}{)3!Qp%Cm5SKNXjY<9MORwpWvbMrxPv1CXE4RZzlJL!;)VmSII!%MmPmwJ(v?MI!3J1TJ zw`lVAKH$`3(}G|`V{EWeZy;|bbg(o%Y`*dwnKM;zS28o*nus+!lJzxGrG8+9Wm!V0vN<*Xxqooc!N*=LW4$n z1>{xT?}PS-?%clNl7Efs9{Zf;RoJj?BCfvy&{kN`6!QJ=fW%IidN&L3Q$&gY{9blR z!qjVlBHfuiJ$4e1*S+8i;-FRXT=2E@J>etg4Z!|&>-$V*DzD&)DcXx7+6?BUtC0pq zSX%J30xtxMZnw)Lc4J)xtE=}#wq_8}m&LgN=T=qK*p>%w+pY21i+_OU(t*5y)GQ*e z>(nMud#0@cK&k8EuIBY%b|H80{i{RgJ3W7wUQwCodH0Qz7o2p+!+k#iG3HQ0@`?f03QPwFh=*Ql`w2K<$NR1t zbX7p`qZ3VbKoiVK2MVn0ARy1n3IDSmtO+Dz^Afj=K4S7kvl}e0G?v#HD2GC{({sdD z9TW^iLt@i~9W8yrUY_|`<2}`7#+RuJx##~P0{crV8+LLs!OcNKnN~aS3b(7H1nh5_ zRc!;wE0Hkts+!)Ow_iPS!O4d{=iPs*3=~z#(6i5 zYo6KA=ICHDly;6K#`Xc`MR!~#_u8W9!rFd;HJIgT&c4{=I3pZX_F3~1-yd@2oV!3{ z*N|*;QXZ2SS%$&VbfH{F23A=;ujaN#$BRg08-{)ho-u7wT;?lxeCv%M-DnE@=utLY^bvwGitZRZ7J4xN%FF9)8B=Jy{&x{ja?CPmSkkm9pn zdgttL_Ke3$^0jea+&z5Fa8T?R3W!5Qo<0z(qoA>uxs2N}_fIQrqOZgw$cRW83&F?M z(_+tx=4;Q6f3M^9gD#)_b#0}YoI1~IG^)dUCEPM)@N9+5(}Lgd<8X>vR*}PU`&*{??b_hK+Tp3xpMsmmilIsA4X5L`}_JT02uuzTJ*5H2HdM z07?sW_SB^V^V>R{{+h;0;8Gs@wHi4ds@j2zTJj>=j4yubO#$(kseaS#5W}{n`l&PCj%zOSk&Z)o#g|47BXYl#1k0 z4z51*%c#_szqb~>_rveHNva0+r_eMmq@$cw28H@#8{uyJMaOC5Js=L|}hTUb-QaW6O$*uiJo|=I%gVECa|(VTBDXzd-f8^V(TJUXLMp zaa~u+p=iTw08$xN_Q+-7wOsc(PX*JI73l1Vi)y!!vl43pdHGKJ!UTAx@gK&%-{IAd zLVC?*PXLvY`g2j?1!)9VUGqF13w{62>v zL98+;SXeqJbcRd?v-mAQD-~lC5pPwN=*_9Up4$f)BCtPN(ZQe&LfutQX z+tJ2S9g6*Y(;SQ-u3&l5SGqs>;3V%7XkOIAi$M5&^!WnczirsItixVc*SyF>U&%+z z~C(m^gJ-sQq}Fg2WBF$ zrCrp9feYA;Y_$0X(d~EL*6nOhl{EG5F2sIbn$fR+Q`#}_Pi8b5vkk};cQ}WwEReEO4koMi6Dsv{@pUQFbAraW`jtXdBR#KXShOwe!Pus(q zHLY9(g0_#xODW5eT4_0Jz5ljro3FX(BW(A=a zQ{Fid*pgQ?2!1&3L|DIDAKk;6KYKVgP1L^pS~3cgk~Jpy&rO&7>%88#UIp`~DNrM$ z$s`bdAEAK2MxyRzM^*+m-lFilWQ!ftHNHs6Wd8t5ipjds4zE831Bv0a=CCA?)~`P2Jb$JyaV4TqwX@jw4tw$butBAH%&a%f3D6*h)$v zyStvLJ7l+4QVkZUwHtx3lu)Y=39+)O;011{lcx!P25#Ve3XNkQ_4n65aVoY!ViY=0 z1h!=ULhTC*EnG2_>r&tbf$-<##S@m4yKhq1KNu8ufo9`p!-ewvUxH2B=l^EC z?Fl1J9rTI7mH-ai1zHV@ZnPzfZoSi zbAoHFUmF;{%9<(`^QTYAbv3P|6t%CXIv&2O6^PdW;wAPX5dHv|1e~;$w#$b3^2OVR zoyB_HJ)NZVbC9tFlc8ah8uh1LGW)+%=Os}b333t;f&DHqq=-!H=Js}t0zyOW%WrmZ z&)y*&>(j)vNw=cL2=_^*LjvIskUocEc)YX8>d{SENL&;L^73oNjWkmGy4!v5;~#q_ zdy+|TI;awXEn$Ic8V4Veoww7TdfC4&+0t1s&DIz?L+ zoyiDPmQ^Cz|Q zBLe#!21`XH0Wqwmq`OV}Q07DJ3;cBP-cLGTcxJqJ!FB0GMj$K&A)I$mIlKO%+AEz_ zYjq$4Bro43EHAuS#bhX?v3cM2y!pw`y&vPfQtlTK*zb@R=6=~sM4M)m2yDsd zJJ{%Yh11r&ZL0FT^4pj=xU$`3?C#j7A2xa9l`1eyAP{~l&;)8;9GgA5_n$LhhH~YA&l1a@R zI{cTphwip>?|T#Ga7`2B{~{2UOkTKu;k@VEe|G=;V~?o%z-qGAG&Js{8&~=kKvasG zoF`-QgW$H`ZK-KoxGwn#{tUjJ)RnPrupNmjo!vij>`_%uChM&=1BUPY zUJLIZOr7qt@3vin-%Ij)5rHiYWOtVaB5Z3PmX4C3eHrG+(Jd{vU-yzVa~k7;pioIl zT>d@MVrV_WvC{33wi`hsBoeQD7I{y;A5j4!11TY(N&un;he+|g%Ss<@n0w%{= z8@~2?rQyJe(?ywn?-AF`{SYspMn(#F0+X)Pii$<| zEB}4Bd%{Z-8P+_slH}0+b^aE1&-T9e_zFlLK1cW1kL7Q-Te)g$9jFYw28=V6@V0#T zxtV^y3%}n0zuXFPVm@bLe*FcfG^r((%KI%(nbgJ_@w}okt?lnls}a zx48+mF9zBdtynY-N{NRLxsbeI-l`veq0BHNd&_vwy5KWhSFflkVOBB(Ud|A_BglRe zfd;>5!)zzvt2q3DxG`wh0+oz?qnB5H*mBD?@4%sX{8QgS-%q<1$mz`5n)_*FF`Huq zEG+cf?I|w66c+29DSNxT#ATN273T%`wRBAf^B|6c62UMpIR4a%(qm8G-fgTuSSzpC z9DE=lFSjoqXHLTc4AEhKU_~@iFCNAB1V*kh0G7l?U`jlt{IVNb$}YU-GZl+HIsce_ z-f}zJTV-z#{vn;4rh5;LBkNyJl6Z!2Vb<@bagZK z`%<=@vjoOY0gy%s6dC2O+p{AzM+2J*6ERCQyS zWJ69qv|$QmTXMkTudE(gZ=(;L)}{guhkG9p7!&ygjy3(4eP-{u^-EyB60q8H(k3oK zVGT$_21l%_LhEd>cFE}%9;+9Z9Bwz(N3abJlGO?lTB!&{*AYxNnK5YajJA7jz9;tO zC(m`i{M>9$jv9u-(g`F+RxZHA=9vwFyn@FaRrN6Vybc7Pms}+3)c@=SD~oGfYiYN? z*yX$#8-6hZq{ga19VaR0;aa@w1>ls(-hkcX3=GqHk%R!SIp zk%`iA8|q3!>u$7t{;vD(U{qGO^Zb$@l0Sb3+E_p^sFeqO^3o#Ei+Pky$L|zgk&q7b~9_JQS90 zdz;IoJE~xxLmtiF^PoMro4lawrExPo5=ECP)lFET#D$;JRX*{kEU09PMLYpT#Dp{5rF-keEqoamfKA8rO-cMvVY>Rp_G7oGC<>U zou+zS^>*%Ge(seo44nA&=D`g%@S+o!;CCbZ-Sxm1nhZViy6>C;TONBv)mL_ty@jD? zMw0Rp_=~fsHfMI7b?NK|i|K-s9hwMiskemJec6Z>3=w9qI-UFDAM+s)meP2`+@tpW zX5kLbm6xPLtqtIs4Z501B({7B3?mKYkZM!ic6$Fqz~?pIYO)4lWqF>NE)a!5DBpb1b?JI1 zPHn+Qw8;WZ1hy>eC-q4U2Xj!V&nj?8?@ny@Z6>tXLQ=~W^0IB0noYaRs>TYEzZ+CAri07;g=3DCM&C?E`sG(2m+ zGB*AFwXQn#pzrCr-6Xk=OC8V#%ZcQzJ>2zX;H-&|K)X5;^zaiorKtGVrD3+~h?vE)@`4=Hz)T z4mW8jBiuhQ=Y?_2*LU=I(ei>yMiGH6Jv7a$W)WC#LzZ{o;ltgQW<23LJ`s{=meNE) z0c*PCoL{i|221B9W%mjcUWE(vdDTAq=2hm1RZetTn_bXiREGHffW(Akw#|gqdsp>C z<4+2%1texA!PH1Tv1J-a?iE_$4jkeR+NQ|);I?50{QH!ew^XaM8wP8ntIcQPm@3;* zTA)yu*sKJ44&|`F4RW2>ngR|#s#6Lt{r^U=9?8h=_KV~+_NkdtdWri0@W9vnx{Sa_E+7W z=`dspDJf{42y7XbQfdPv;{8-SR+DZZoq1-%%p$KoDFtL@I4aT0bhF^v(CBs7U|3Z_%G_=m`zJ7T&ao0ZXkBvk z!9nG|yXGb@T{q-iW~qy;Hd_N?Lw}c%u@XlyynkUl1zj`EcVT(zu0y2@oc8CEVhq}a0HXd-KxuP85v$}-Tz=Z zgRiQg{55fB!dDRBvihJ+5LH8!})bavmQpysRlMqDaF z+6ORZ8!AUB>`0vHG78BHKG`?iIsc?{@2+b>O*3gz!ZH!q-ykrqiBh13QXdf*_`e)o zD=k-TxBYvnvtS(i=yfoOx^8>>CKZ?8 ze0pk^krK8jQ0s!1(G!mk=~NtoC)PIKiM4||;%(&YTkLphmx-b4+$M>HCjb7p&Uc^ z`lDpW8sN;0C8cgwo1GWkFz+NFuQ}k$LyersiwJBvP=(_}WFp=#RZ+?xrV6+xp;c6{ zj(hH|>wWzV>^H^XTJ{ZoDk4vY*4c1?3J1re?Mm4y)H&C{7uMQpMz`7iq{5RZ z$1iy+D=i!XF79$J`1I%AiOA(h;8f;$#US^p(Q_68O`tTb;P@hdgLx5$%4WJTBYh=X zm%G$U%2>^R?maNs+Snfiyp!c?5X3V~ZAX0b@R}PP*j4=GGqSDI0BWG zj>~k*i?CDnnnOcu!_krT?>@8N0j$(K&S|ppbgeH4c%khhtH>O+P2CU}^ncA(Cr-Wl z{qK4-&_dlLmFgt|TQ1b)kp&OI=aNOP`2{_2drgawT2{hoZPu;!=3{s&GB4Y+d^y)O z+wEvI3ijOpfS$KseXeWVGd9;W)UdN+j&T|tS0Q=f^VrxSxv||n?2v5>cN(-|{x!-E z1vApuvTxPnnH#(zRsX(gTW*-cm7QccQEDH3J6OW3Grp;8YFitwe39;mknyeK(RXD# zil2XQh1zS=f)NQv9kcmXMO(pYUJFcUT5MXJg#)6mibgie8muR;@qqXU$mKOcN21q~*U7haZF-_L9J9!MXFW*GK{!Q@>=!wfb z*5L$_-L3@T?WTh>jI5V0Kwg%m^gvWg*iF{)Kg@{F!Tk#+)r{A!iNO2@H`O&RwCzqI zg^9C5_=6-|mx;n6*8ARs*3L)oW84gA7;2tfgP*Exs7byp=OVJG@XHZsp!qY|-Lpk# zo2_cRD^g~|^LwUl(8Q*|6WT)a! z3>?|p6D_~wx{;!=&>M~{dcK~tMI%>$F*qVkUI&gme9|kk8!R0o4jt;QOa!)~79IK? zWJ6=M*WyC?=9HMK&!|+_uis^n1JO4tXu=GHw+_h=vbRM zGTR8O8=lU}m6`N90EIMWbvsA*kyp?Z4u#7TfvsQ>0?LkI2K||X!#fw=XI8B+ug0Mh zS#OgG3&@7B@65N%JBCTbT>7$cK03!127}H$ow+))*JsV9>k@7Z>Ka zNMNkoZEwrA=kHFFST?R-kGw2PX+}h2$!_QHVL)DU8!dsAMQoSC<%z&n8bBS8D(oX6 z+PC=O^vbi<1k*Rp{os|C>l==9k)MCy5k={5vW3WS?PhBbhqP^_nNc9GF6Z!(hk2Tp zhN%J$krxrzKOj#1XzIv@=6!zxh2)j(rKA322$UCdUUJSQ`B}HCvUJ9V9!H;7(B!V=5PA6lxmZfdkDDzQHUlMhre|8#*Ok&h_7iDQaCV*O<@?^=7Nb*$aGL9(fr$ zmq{WoA}|6GSS~}kPA-I;XXMm4j&il2rge3@lYaTWXP4EFp8N)q7gpG?$!zF51pJg>EO0>sKSOnL3v>Q zxuqR>j{|3u zw4#!1i^#;N%0Py#U#w{;x#s2KwZpgjZ+(1S>hgLx$6=s(v7YCiVu`Om`&{JZqwyy9f`@>}c`(e{ zpL}4V+ufNGrP)ATDMVr2`oF?Hke6jCBT#0{e)OrvBaS(L#t9F++-e0(&K*}#tOgO7 zU!|zGG`Z8<#2Wr{dApWh;B`Xw3w<%LTc~6*Q z=^_-4x88m86ov;Vp=A$&aaInmpr6MdKY(e_Fsse?ZoIc{*CVf+``AOTw~2tkdD5c% zE+R0$LrV#at_iPn@IVMXxc(3z*lNDBgGIL7t}OqMqmam4t{d6b*3u&|Y3iRbF53Fs zK{>R~T<>vp{dK*fvayfTGJaOms}#RK-j`b} zllGvjofjl!+h)9|_~smIYAIDBVH!h*x3*k)!6){Nso;w>81t7Oc9~%qp5Ms5=+Fwb z_daD+$yS?zR^x~LgiTIVZ%pb&vEDg-X6&M|W1F_v=i*u4rzXQ|V&i7`@Dp;CzyL8= zz%6}z<`4SvKIOsIs$Be9R>2$Vj+dVKSy|T9w3eCuCtxY1h(=lL^N(IlO!@f>oLeQ` z%om@jPTN=?FdrzRg!^ON+6hZ(a6S@|;h{Ib`=)2dVFypT=71|^JK$RGySMB~A1CA# zf%Prh1nj*QAKqRO2=#&Kud|Q9(t$K>|Gun)mzQ0a)Y>snEX-8KH{@z%7- z49ur`I<+7x0JKm7v{m4P)rAcvjo`q*tQqr@hmSdH`tIAGHT^UAnI1F+s9Z!_*@&Dg zCB>CWa4FlCRW+VJ=AEj`Zm4(K+pD;yA(Lh6K?+kO zxK#3eQC9wz_x#e$7ShH!ldx0=!(;VZWPVrP*aAS8g(c*bf>JtXm+x}eq(`RBPtJyy zC*L%UI|+;Ih1rT+Ga+)O>oFb*&rWLqzBrYEPei#*4Xp5l(*{Jg--Rg)BN6rNBQYU7 zvPw*Re=fJI8`5)-tyK?D`x07Fu^s#Htp{6gxU!cEO<=!{tk_6AMON{o#3be-#a3zr zBAPC_SAaK9Q?8>X$b{Tv{o|)x_S$D%NM5LQp|8tvsfs)iShffhd|uhr!JOICnz?EE z$r{dK7cxDsu)mg9P>>et*+*bNSQx-yEttpZEQ8~FQBbepDEXwS? zH!BF7dTPyT@n)MD`U(v##mGWCmXMmBr)j|&^QU*;X&-axgZ1n6+wbQ$AAhTT;eNrM zUKC-NJIE~`So%yR^71;ctpzN3gE3zuUkdNubbYwn-io30lfm4UoqjOa#e;-nP5Mb& zaL6tXR^R^Ujz&fGzCdEB0Ou@uN+y-YqM_?rZo2Yoe6DOU9kSGh@qC%K%gR|?4$%Z- zD`*cP6-mocx~X$5JSzOd>(4Yj{{FY!k6-_E6DEXXB@G5Y#}EzDw}`;9pTfKkQZ|54 zse>>3`-H&239Z|1OS4gQ+Id40Q-5a8g89tT%CfL}J8B{#98uP+=`1m8+S$QTtFC9) zEvN-z^IIi{zXAs%4~_E5&+9Ha^~Tf#XP0b+RmsuD-P!AwGK~*aYPk|vpXm>eGXlOA zW{vsDq%XUlKKFtd<3Ig5wxG4sVL)77vq?%uCIZVj0^=?am~?@_cpriJKq?3(k# z$XBemyl2xre)?p7v)$g%=2dhtf~EjJ7&V(Dj{tTFcVXBD>2iDdo!cHa=&+ZC|qH&bkPTEPH-Q&NENobMC5SLN{vqvzEKA|5wM@ z$A1KkQqRa|`E$61QH>SX1~){@XkSF)UjX{6Y%l?04=znBgy9N^wyD!&Zzj5&&2~9^ z#%{swzJK+rDKR83VHzCMk!>I^@^TS8^|z9tfuF75?A}JbSv} zSXd{t;ri9q%qexgshGdwCWNIb@h8}veYU=)_W5`6%-SL6yKOC)@QV?9nR39A%yBdx z3^BXA%EVD?7jK4Tj$p=`d^|qSfMX0J7Qo6%Ts9P)YD=B0gzVWvyWNVlMl_%O3Sfd zm0u#@IMX$WmFdf`y?HgQtSq(Jvs?-D`ebREP>BSayYF@vShJ_!suhi6<-(Iai5;rR&g%yn-LV zfYr*d6pml~Uvnbs zuIqmGiFuVaFxW=i zn@hl1Md*2&qer!ORD<>6NoP#|>a$;Zzx-}m9DlB98pkea4n`G{XeJPWEfEVVX3t`p zXoKC=M__&slH7|?*2Rv>vaq#E2lG?a{1qt`ZQBK{#Ursf`)+q$?elLt=77N$x?LR{ z#9E&w>K7tQ=>!6-TSl-~Mb*g*j@a+9#OI#~Zkj5K$;$%}4C`%kwv2=|mNxVDtxwGI z6Bu`->A>q6=Y28vpt^mem6^|8a^2hyU!2%EA4sqr6OT~_g#v=RQaQG*vfXG-AOic_ zvIjSt<|KM&NylmeJH;>`5d<1e6qwbD`ad#$<2n0o^IEp~Q2v<2EG(e~=ES(1v-dU^ z4SeqHZvw+c+~M~0R!Z=b!OzgAr2WIU=>Xa4s4HltWs@4tJLQ5pDeU)8emgcG|S2iXtOE zx5-*4d*E*%V>$68DO`lVDll{Lp$*djVQJUg{>XjNt#>-k?QB;*YVoeXoW|jv9-6uJ zTE}>vfL!wc;9N*oY0*5^@AgMl5mo(fFsl3Qnp;u$QE(_-YVMR481=h@xvVP*{ zT_5+aFh4uzuDX}UzSrLK8}k8v3ocKt5EM&D_`AqK4b0<+)Yft3=dh2CLZh9Z_|-F{ z80L=Q4K|C$KL4o4GoR%Whe_8n8M?7vG3Tg#elZ6Q*`@Ze7sdpK3_T+`cg|oO3m|zU zGJ~!7Ll{OwI-nJrT3I<0!O*vzFFtc~@7M1?-Zk!NJPdI-3}r=)!$0TnlsUVy)Yy$x z7*oT{oHOs+?pd#X*7-$gq5gS8i}TZ|x6NPpevBTJza}Mn8xJdHP=Q^-a$A!*`Otuvb1)6!JHH6H~FNSBF%BFCCOW%t>8Z2r1uR&$)3Jg^}R(ibuTPYQcXev5!ecQYOh2S z4-8*L)!g~S46UeWuqTN8k~oavT6y`rcjEg`FF5g_gSlzy;9JS|=8wNWT{<{R92T7R5z-nthQMpc;r=c$H{$KX=gLK19kGF)D$_)ewtXEcj-}}K^ceLF0 z?+=obf0`zHK_NCx1Ab-$x#iwmq)BWM`C)_uLON2V>K0P27J&$CB|JFh9)bJ0_W5_7 zGzSkq7)(TdNoe*c3!_1>G>(x$51l@35EpmAx+@*@0PJ->+MA9qZ@ zl4DNaTsC$bC5j5Rgg5Ca?!vNMG3F7>@05v9zu5#l97%rxhnqyK3)aRfD&G6dykqvC z=(e}Ext$mg%5-i9B-}$z>lTLY#TR<(6wVFG&7KC+1R}6Z5r|-+2TfBMS)%*xmyfMG^{6L7fa{<&IyvPFThfBnG|X(p51z_}<~ZhJ5*Ugg6 zK@;0b+0I6Rp(Dyciw(f{LFM_%_#&MLyg_uZtRGzIRhmjzlYX8lYOZ5QxAs^2t-teU+ErG&FCQy{CbR%5Qh*sHCOqgZjPH zblrt}wBL2720~PNZASJiV0`nuZp`T9s0nXT~q{E>7GA0sChQg>G&{Tisv3qvD z^z5f#z5-uZGG~2Ze+bWSg^Az_6Q9v%wk$cZNL1L%SE*ET6A>1HkO|v9=LaA!-vz1n zM*3SnNiD%O-ErGn$_tM;VF$BzFaz>Zm@P_J0??v}@!3+MmWm0{9HULKL{<8w|K`irEOugnB$%h_H#lt2Ww=#ocAzZ*1PPg9q_oby5mjCu=iwE3~dz#${y zii_$6E!#f_7ShF32`o{SemTE+^uuDFN?uO~w)xG+giR5d9t|HKT7TUFmZ}Uv3`WT9t&7A3Mq*5> z&?+jO;A(3b{l>nz!|FQcb&?c@7{uzEFq_f3rvMP-~}@&W*ByKm%UZRwRh}1@XfCt3q%XwNKX4@{jS%> zO@_DXo==lN1eV1FhE*OICaE^vee=&+Vc|?4HMm@C-(nXS-sxUac)|&(_7!ACB;*cl zrObs`QVmRnDw%YOk2$rt>e@T@@AvTY<07lB^O8N~=L30O#IMr| zkgLUf7bP*TVjB-sR8A6_mXWv3Ysh?K~#5-o^)Wp$)Tt{xQIV0R_HdsU*CwAn!GATT{j0 zoB&0%DX;dOk(@ROd`m1Zy2W;T$=)8!2}`f}$b3JbGX3z4tjbPoz^O zA$z2e1|~vXFzI?(>V55LjKRaS{^Q?WwQ%QsZ_nF)mzx5^M(*ymwU*0xOb7Bx)eD0I zo$T!VbpD~c-GG5v6vUAmAPo$;LD!_RT;@8~=R7ZOI%{ee%CLE&-w57oBNA9AGUdhj4iR7|cWulR35*ymoVMnge)l}HnK5wid9e0ZX9Xpg z3(1_;W;7?Jx)3N&hIx)_UJ!Z6ZEc}3B?8MWDAx-=G~+*iKP5SH>L+?IJk*Ow^p~HB z!wJ=O+gh~fHoKf&bnF?=x8L)h1~8onl}wN+k&scq+LBDygi0hdB`xgjCc|57%UCj5 z9o>BUbxTjZUvi{y7HAUxcdi<_nfJ}%U zgGt7NL2gfTt_m;QTpJaZqd=F6aEHxT}MK+yM z8jt3=wa>nBl~FU`A{F;lizr?uhK}Oa*Z0hRsr@L9vvw z$yJu68MOnyp1t$NyCr`9z8?K)o_0sb36KWX2QMc~m#U|mS<|MB0|Gk}u7-Vjw+2{Y zT&<{dznZ7t96M{1;m~8@pxkwDrP^clU%!b$=|b9D)O2wCaKJ zgM&5IJIi?Qwjz?ZhKNKWMooVvJKMnar|@q{@Z+j9X&K9SH!l3XX4TJsS?PK`-knO9 z(;?&rNCW$y5lQts9Q@{2FKERjdtgympN^Blepoyhn!n)0gEoqNK5@QRsa_J15tav0 z>EN&OG%KE3|4LxNT$S(wh8CKuMPU&OuDTXui9{ZdRCQprb*d|_xpQ6B(Y!JIjV+m- zEW~Jdul=6ubqw$VF}xS+``dpB67EF=MvR(Y_pjsk?0D*-ueo7r%C?BWh`@4v^J;A9 z_Y3xAvDi2`N#cg}YsC_5ufn+*d}_hz#~c#-;0-t)bLtvQ_{-ve>#+DWO{ip2u_e?6 z4X(dA3yvI_&n&yl?Q91(9}|^-=rIKqXI=WfN+#9>Qt&T{!HHHB z6tUQMUmr66(4C*+!JrN&Qwr!HEaR%@izWYtx8IrNZ?U5(JKBdb-6&=nA0@lH2j=Z@ zQ2)U2VFOq!QNj$pR(5ve0g-u!K98_Cx3N5%r?D-)FKbz$lmq`wMRly@j(;E2dh4|> z(YhxBBmBCNg$PIF;P2-i&KjE@g^g;#<}`hJ$I|PA#MI1|o3GlYW9;Lz!I7Tx5zXT@cRhK6+tIdNaE*1#%mD)nffNcriweOTib2ECWLpc9i9}k%Qb=6DB)Uqi z!G!@BD}2o>+ZLj{{DY3CAKIb$vU9C;pa^MSIR?rDTN1!52hM3_O`Q}gJmi?Y-L}>u z4ttmRlkihfUqUO%-)ZkkyMEsI#LwSLuet$6B@&j7z=ViI)qtnp*f+G=nva@;hK}M& z)w=Di6*3+#kg?tfyoBuScF`Jv!A`Ir6i)?o=xI5!qO`3g&=>so;CoB_@YUV*V~+d~ ziIq|0VQz|Q8iFOlGlp2xrcASDOnVyq0(jc=uSNp`2yFkZ-Q09w#cg+=Ypya98(*?? z#R3B1_m@sEq+#CFfP2S{4h|c6htmogR%eIARwUdoQ)C4iR_bM-kF_s1OZ&&<2WX5y zsPkjreR+rXt>8pnISSIimPlU;8|LY5OOsTISaadQ$L!%W))l}8_OBM^<*P{yu3t;G zcYGcDV&Y6Dxacd0N+A5tqA>$r88UOg;9&kiM?MAzwbi}#f?@KU_eBUU`trlx#LDyB zO~fv)J9@u~7#Yc^@;nh3;eR#?`j&Lr+f!!_8aB}ASGzvL_9dw8_*5Qop}8^(%L2hBP^M~(7eJy3sZq%qvl68-D+>QvpvtpzA%K~Sn#)_y)?4bjw6&2`fvP` zcO9>AD&>a}`p64hM%cL3>_5mI`1G5{@=)+f+0%^`GyIzK*awG6rKxD-{Q8p)ok%lD zAOict?c!kNYa{mQ2le3%Hy>*DAGoep8JqjMS}2g1kg~gLWOSQtYNSZM82{uGY{M?d z)I#t~%~EQ5Nx3_C{6~ASfcX&klXPyHm_O)ec_5K=_40}-btfNofjxUhPudznYdVKP zK^%Wh2UzWzB`5uKgGweld`?~qrIdG*vBXi~RW`zsSlEW0f;tFTE)4@P+`!1utFYpN zN8MO=AOpw?;oz#a>gL^G zH`p~WWcZKWZ@f6kOE^u{p(ErHc?ANRvXU;4S9!k&#yurtJ)5y~u_xc(yp&3W!y@+O z#9KO_ee8AF*^c{(;!OoC12`4TeSUFBaC?boLpByKtdDFs4pSE;Z=a6=1fddk*Ep*b!cx2HKjbFl`(8+Uph5SBS!z_WJZ)f4uW;GY%2o&GfltD% z>}_))+j7U`P*!cV*)J((EI#tL;x|h@FK26?eW6TEb{V}jz3bLVc1~T4^*9+__G;ya zAha4WyMKqoeuQwMvf&d&NP2aNHLR_fm?nsuF!KEg=d`dIAhTu~H!f_3S_5^q#0fw9 zOQbw0OCqe{Gi5pe{~&QYyERy`K@$<#W&`1aD((-_nyy34pOiKz%+sn=6Oxa^SG8Z6xqv1 zTl`lwe8{QI;se4j$48;xuTf$2RnLGbtdEd{U|M+f@dTZ86+S;)bV&wPR?YqhNyCjf zlNwjo$mm`Apj|nBj(70&OPVeT3c6?r)tnaN;G$1uM5$B24d~=in|;Y03Xx$$EkiMQ ztw!}tL3HMsxNytsh=+H(Pjm$}5Eh zgMx&VcX8iF;Gxq18F_hzPGsL_d+75>HEU>2^~fX`WDlnNi|I6*<8j|NnA4%^OOiOf z7zaeOab8ug4ibM1{=xTmnw{z}O=MUnpK2-jnq>mht^haHyjb1DRjCXAse=D+KU`v( z7X72nAN{``EndfA77`L93f~f%qyOyi`|nv=d~+5(CfzXC51B3gh_=om>xRlgrcpwUCk zA(qfv_2(;#=mM5p;}X)qV1i)chO+e2;>6!z1KnHQm!Oue?YIyo`~*O-u2jDIO| z_eC-G%a>4Hu718#l%xWl@Jqtxsg*0s<~fvb8UnkTSYP=qVsaXyHlU``uerudZ%3> zd+#p&Zu)wHIvMmmT?v!a-l`!VrbK+^abrTSX3|q7_D-)_9W!}kpr~VV5p4f9xG)na z$Je_!`l8Qo$me1y=Oj3g%t4x&%LPcBNim3jn$Uz*y7vEgsOK9HTo5=1L%3NS@ zVtSYLQlE8iP%5&oyq01Ak3W%Llb%)#UODlH?=Cv6pri zwA5cDTi&!gBjRW8^7f|vg@-B=ad7!zK{$!+GvA*C-Q-dEhG#CfL-_vquKeZq67I@~ zC73LAm@Rj=bh&svCjDj)sh^4^FH(_|M*5skweH<`{lUuguWI4mShL`qq^y9wmzEw! znA<_YqH`BkDP0CCZ>Wk1tRE0{3C_f%zDJ$$=@kg~pI4$zpU&PHphsh}a*=)N^k+(a zlP(RcJteo|r%PEcNhGN?QsXGQQn=0H9`U*UlEro-yFFXqO78jG&8TJo1LaTwALt!5 z{hcu9$n$T+_k9s#ASvy}iPa5U2ZD550$SaLr?Zq_+n?Ju%=Hy{%c!S!d0AQfW(k3X z6u-R;rtq_L%xThl_AGWTM-4ivfEJ81!Y-AVelT>}Z$zPI8i?d)+Vp}HkKfv#i9$B}2I@g5?~Kihq>y;K}1&Tx#Kj z9eyJO9ZQdrU_i%c>Rs>@(S@Q4ydPJXC@U#7M`JV&Z(PWhZ(MNs_M7b2lD42Q<3@jr z>Lg~K?(DJp598PFA>9Y41GhM)ndT*$) zxjlSt5(O7;SIq{(1`|V^#;!bD{rlqaF-&oR5#f}*IJH$SS`msnihr9hZ*<8JscLO- zWs_G70#sW^*Y@pBKDhs;7A=`=5MPdKU@ovza-J{9dQzAS8WhPMzx<5ulmoaRPA&B- z&@pPj-=mSF=3rATN##0N2S3&ycUC(cvWyP6y`=s*nlbv~qq7)e`~eQhsF|<)=+|sv z)6CsJf5g6Iid-Z%7*)DIS#cMjneZi!zpthe%OY!>L#L9BsI7^vqF^UAwKSmNZJP#I*mMZ!;sfVRYQGo!emam}p*sl#QqR2DojnKI6lA`QNrB z!cYXVv}kn}qKr!mp7Hn%&>kL_L@7B1FDTEmRb2d{Tv;+^>*4OH@vKc7 zuHt{it1u6piSJmwkhz@Tiag!oq&F(~aTS04KDzE6Wr`Plinp}wy0{zSGm0wq-_jx- zpFh2&D66BDD4n%E!LQB;`QJmw1vM%nxt|a6^UuqZ{T%0h9QBtv(1{ZqKSxjo<8WzX z(G1|Z8OJ=<=X)L+d0j}Yc~c+AcV!*Dn8l`iFoOvF8PYj>_vS~{pDX`D_lJ4&hb82G z{E`=gHT%(QnN9Sp;eSg6yWmt2O|Ju8h?jAiM4bd9pr4a!=1e3O@#@0@*C&uI7HEEo zKK8IhU%Kzf1kqe(VnKNeunLmKgrPZAwEcaTiv$}}Y_b1w9mC|PY_d{452GJH^74RXcKm$bqx0lso z|1D^Th>!?-#SujsD%s{{1zYyig}~Tk@;n`}5Xu@k0_B%+2MB5>E`+@P z({X?QoZ)G5o`x#feM{o|ig&{*X;^M{M2tD+26&u)ZF!)6%$b(mdDe*%!DBqpEaT8r=>x}*C6c>6jxoc;*plBfAv|=ohu4OVc z;d>p64M-=&H9Hyn9al~HH<_xjKAmE9kAX|UHiCN5f{)C(wnLmpSaarTh-p+4X+Ehm z#*0nvRdK?45*{pwh?Q6&05CfZkLz!F5&4qI3$J)G=mU{YbA_dj&Sk@j+mzPY1x-XO zcpdxomM;l#c@H!JCSFRVvZv0F1*=u6;n2Jz3#UqSnskL1S39taz>deHw&Y~<>FzO^ z`<0GdpBpo8AFzUjhZXQ|(PO70-;CLFu!au-i)am;lt308buAqoi-N%WHrC3Aqb{^C za?iKoP8+Agw2jIkbvkw*t_~3r!y7mdJof=^@9MyOizbRiz(sd@7^c|CUW<+CN$jr) zR%WV%|BEX_DhDM%kp*qof)w2i*5tWlbnV(BCO|(Y?IwRp``%Jk^Frlw%Fac%F&ZB& zQ2o2Q%S>*|eG7ERy=ra*+ALAyelx1vAZ~V7LH(FDM(?C|sRy=(7MIhrevWUewmuFc z04z4Kx-u#)VAM_e37$wK1vZ`v7kAQd{nfF^fX$X}Bo7MlKnvHGjFY-y9~_Prb{8mb zJ8y6Bb6Ub199Hetmjj0-J)7*jf6I$+$4+D!nhigaq9BskboUIG;|Tk!_%@apy7gK~ z4djJUOJ6WEEw<_keC7IO?vR`HaPwg(w0G-uZl4v;+#i6f77pQ z+HWw@<*T+Rc`I6ojsulv(WNPAF|Bbs+$i*DyWb2r)0D6%uK5sU`|ow(1o9~t!(nsf zNJ6Kk4>kzw96zNi_mhtfZ#$yArM#{&PMwZ{idqS@8JBY~^y6g_V=c zKjhE>nyucsPb#Br;5(EpS}J^YX{AYdQXeQBzwK1`&$vZ2!dHz%Pe3d&kEKrOYvg1; zpsWx8zx&7^_b_o63H9a zO?DG6#Ca9cW)IRj@KvT()wo@cI@Sb>*6bZlwX}QmHN!S9m~U*FCyCA1zT41TRi3Lw zg<~`D*6c@Ryl$kWz0#NI$$<=(@innc{V-Md6i6_`?Fz`=x2jJuK`8I}aCKc`E25k#F@* z2H-jrxW>R3++TSHA%3U?{MG;;R#!IOQ~Az41E2{C-S@RQR4i#dn7ViHVqi6Ee`wEf zTVeNBnqs>ra#1FF)cw`74xXRz-EQl-YN|RYR?LthE_Hq?ZL-o-gMi+#X<9@&c%O+x9d6Py`_qexXt>SQ2(ah(%*3a4ww$Xbo)pt9E$43~wyr?J z0jJ#TwX(Ocw}l)??X(9OF%4kpsQ$#?7*~i+9VT8P}G%}rtOn$XJihT z`Gc1eqz^Rk%A3B<6J8*yx785VT`t(|>!U@A`o^*$ET%wt6_Wt1&3Y~P1D*tCWzTMg z_BE$u9kZ329QJ<{gQnvRR8-#am&cC;;q$ZVGTY$r57a&CuCl^!uJ)SmPW;;s_ijBZ z@$&|Zl?K=nSR^9`V`vK)fNgZ+#_C6(!t$-f`y!lmxp@b4ZZHR>^dFYpZ-NKJh{`FG~< zZt@}~-nE4F;(Y+oGP{V?tn}$dZee|1ze0G(gREik9KkU?cTh%WfFW#ts(gzns8jg5j*9SSXoT@r{y#x4dqttZ5@|qN_wJf^+z7q>V4J zQk)N*Pk^Ujmasf4N!gI|H!1j?0w|T{;rjz`B}WtD?CJ5+@+9I!@XbZrnhZMpID}E{ zOFyufux$Q$^(hM@q35J(8YRblcqN|HrU{5-JtpSVLx z%L5Enh*}*m@sTI+g_#q^`RNT&oL|xQ1A8-OoXvySVR%(||5a$kygu;*3qnVSOX4z>8Zu}@t zIuJeg7iqXaVF&774QCG$@pl)Je;=J3jY~URnvpXlM$OcWijdOSW7K(u@Y?=p zntP6`sy}_v_OHAk(?GP2m}5&8{i(!+m0YcK>w!^Xnu4wCbEq%lqzmLRg;14%9Vj= zw$+r$POio)Rv1GEgH0$Hq)$ScRoPMUKBAiRrdZS;ldrJSD%=RMUPDcn!5Z zEP`PLO99p>WW_Eq>0~m0FoV{x%S$rJ8T|j#K5A!4a@U(ueHD?C?fHmf(^tASDhsvH z6OD~6_)N8NtY#Z)tc<)z+sN#_!d;}Iy zF~mZ5cE(}?|L&FjVrR(AC#QJo6cC!R%|gyR95%_H$fNKU3UJvoDgP^#aj2{2+?U

C z(CX6fIh8mroxe4Fy?l{bj%8R307X*fDQ#(v@y+x%4>XY?ax zC^p*eaCfrcq#aa-hT`A*7=V1wKdlx2BoX`y?{jb4s1j@)b7-etD6E@cKXx@8e&Vf zWehdcr8jm&_uNAX*$0NY%B&gn)>)@jQLcO5F3UZEr zds`B64=#T7qE6myk{5rNg+99@E{Zf&GEI$b?&PagH-fv#5k*V6EEmp!A*tE}RWk_SsM5#wN>{l7X5DBVl)bv~bNp*#NXY*I)h$Ng literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b18bceb64d257ed31d50e65d7f2b98abcfb21158 GIT binary patch literal 16751 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 XrJNsHnTG=pQeg0O^>bP0l+XkK^)z{o literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000000..4e5d6f7ccf --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000000..f8c6127d32 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000000..95988e4202 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + nym-connect-android + \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000000..8e37feb691 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym-connect-android/build.gradle.kts new file mode 100644 index 0000000000..8c6fe5848c --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/build.gradle.kts @@ -0,0 +1,25 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle:7.3.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10") + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +tasks.register("clean").configure { + delete("build") +} + diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/buildSrc/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym-connect-android/buildSrc/build.gradle.kts new file mode 100644 index 0000000000..45981f7511 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/buildSrc/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + `kotlin-dsl` +} + +gradlePlugin { + plugins { + create("pluginsForCoolKids") { + id = "rustPlugin" + implementationClass = "net.nymtech.RustPlugin" + } + } +} + +repositories { + google() + mavenCentral() +} + +dependencies { + compileOnly(gradleApi()) + implementation("com.android.tools.build:gradle:7.3.1") +} + diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle.properties b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle.properties new file mode 100644 index 0000000000..cd0519bb2a --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.jar b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.properties b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..de8c362b62 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 10 19:22:52 CST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew new file mode 100755 index 0000000000..4f906e0c81 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew.bat b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew.bat new file mode 100644 index 0000000000..107acd32c4 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/settings.gradle b/nym-connect-android/src-tauri/gen/android/nym-connect-android/settings.gradle new file mode 100644 index 0000000000..e7b4def49c --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/nym-connect-android/src-tauri/icons/128x128.png b/nym-connect-android/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..12daccf30f0068ccae0773eebfcee80b98e1fbd6 GIT binary patch literal 11741 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 G5cz*z?MI9N literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/128x128@2x.png b/nym-connect-android/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d98b024d2634f4be6e915eab1e6b25f59fffee73 GIT binary patch literal 25778 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/32x32.png b/nym-connect-android/src-tauri/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5463a8ff1ce4c3c6be61ccfaab4e23ae0fc9a90f GIT binary patch literal 2394 zcmV-g38nUlP)3&26~6X(AFs1{!#187kK+}LcQE$YGh-VY@5UZ4cmq3uBqYI&lB!9g{3!XspOk=9 z1X2|$Dq5EUp{S&-svwjWsvw2Z2$Pl+wUi~nae~3vv%Ih8+!;H@300f&q@#Q1&U^R! z&bjBDdyWuG9(36SIvoO=9Ad7^CeU81Li+}R?iMj+t5c)Cxe<=m-KcCni_)fBN@25G z$#3x>tMv}d9p{nS{TB4j4n%fnAch1)4@sBGExH0|6btf=4|;7v=_Uf*4&m*#2jZz= zfxZSY-&C7~w#Hr9&~RiNKyQB2zz(*1G9a>(-;qyb9WQ zi&tn(ZlN=IgY{-5jKyG9LP&(c^J0?EE3IldA*;1uJU){Tx>#bRZMoR(_q+sn+!B?>r1$^5kf+ikl} zHI^YjV|Ho%XZ~2gmsvv3N0E^3-XCr!0)vMkwh1xSU#Z5{>T7K|i`pxigiMyD-i?Ld zOV^kGw=mZvSibfx3r7-Lp+uXHdC@aNR#++Uw5@Tnt3oCjj&nABl-8(3YK)5;#OTeS zH94v^=~y0y{BE?)BxPZ~G(02eTmSb8`&MYY$^Bk%6Io$oo4_;n-G>|{?D=jjn<*(v zS!pRkdS)?nNm&v!J|zcf<~2x2&4oF;6xzfm5MHV0{yo+3~#m5`G@Hbqn}?s4iR(G`}2N8x$B{Xt{($YDIxw(0%nW8B8?yEn5 zv;RrC!J0BVL})xN{`n(Zp8Oa;I`Fn!FIiUy5vak{tJiS)H^0XxWUYfgK1}|Qj{Em# z@w15&`1I2|c>X)DB9I8gBxNcY`fNN9y$TcXSTnvN(A+*CH?62{!Y_}XlBVCj<0ZIU zE*}tSTHoY^m&oz+!@UROQG`aP$fNt|k)t?z>{s~U!iU({+ArVX@9*B7!E-xbStMX4 z0<)q=;Ul=ylKs^Yv~>6gtgmTCZ9|uw|Mquh@Fkg%39wed>SP>$=ht}fU=F6NQt9C# zk;(Yy^?%_o5g6M(F0D6l^d0FF>#Q5;I6Xw*dy+s@QYH!(jsRmd=XVsXMxf5(4Ubx( zY;5h5N5IY)614(-#TC`_JtwEY+_oTQcz;!QG#)Z zvG?Z}RYRYgE#sQQ%S@W*6j1@62)ul==&l`koQb67AP8>nZnTM zc`dS%v*Bq2#-x$jD277Nk;^&EzO7# zu`6Yw^3BueyA*jm{C{{%D(4JYywIiOJ{`h^%E&kuBpMDyM`kX9x%lv<;>9eskVcoM zU{1G7Q}EJv7t*hGNm^b=#SxT>b9K3x32;)mHjpLoVjW*bdymvn5fW!|J=U9W*^Rhx z8SPecT`+hO;#s;4w^1#)wc6qtw$4>jIEHA=vc7wa*D)5ZV>M}S(Pew50=l>+sN&My zSCG6=%S7Hd*SZ#=TC?l_s)oKna~`!)d!y@EXg!0|RlJ=FlKw#99s0t3f>o)>B^;{Qv{3RKe=7AWk5%)G%8L2$~?DdjD z=?`)KYS>32<9`8PG`rRhJ{n!hm9d8k(Q>kYzdY{~oQnMjynXIAunYy8Jb$q&r`Yy4XCnX}nnj#@|HP6lt_GK{oW`O0%H%ZL4q$q02rgVYrb zJH%{vjRn26m(JMMqbMz#OLTXbznIYZt)f{b{^kS>9^nIaTlCr9W1+RI`E?@T*POw} zWK)90?uc8n9*Ty6T5iu&=ywQeOv2!--!t3f!2aTLl%(b$RBv_*t&+>+Id#_Z80g_nd8kRC zt-b)QjfdxJ>u268vtk$J^-ijI3X^k`jKnOM6S7c{n4`2L72vhRwK#2XU`E|WNybTW z?xau~6~3m_sq(dB?Ig}ebjS?a;gBu5dy_o?9n_w8HW0Zsfeno-v7vbzY|Y0}vGKOM zbR!4=?uRh{4Hof!5~6H=u>b%7 M07*qoM6N<$f{2BYfB*mh literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/Square107x107Logo.png b/nym-connect-android/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..468b6cf29b46074201b5a5865660fa8ba1e3f9b3 GIT binary patch literal 9407 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%0A0N~AzVG{ke(&>0&D@kD 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 FV1n|G)#m^J literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/Square142x142Logo.png b/nym-connect-android/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce58b768ca72e65a1c0430e9a12e28ed2a5f721b GIT binary patch literal 12553 zcmZXbWmHsO_^4-wt^rAb0YOSBMFtqUr8}e%5h;No1qB&8)S*FO=#*5t8A7@wl^nV| zhUU-j-v9k{Kb(EOoVC|p?|IL=-?g9TL}+U&kr6Wx0{{Rr6=en8`#bW#ixB^QT)%lv z2mm}EQBjc9_nzKOBl0$#@?3ue(9JefHB;2dEld!v-Y21hFUU}up%p7Q%2kTJbVXd} zTpv%_PfR)$Fo>6l8*+Zzo=iV0o;jTS(fCZyXQjq4-+@}mYi_zM-;h!~#-N+>06ug* z?1u%Cvna<_)r$=(3V*i><)h;S#xcz{p_J9~6+UTxg( zq=5K6EP#cs;EbWk2(u|{Crg=W@2{;!h05!|(4qs^$7gpI^Jztd9Kt(&n)r+n`7~l+ zIx)QNi-(x!XsdYwnX?)}BIu{-j;i9h+_YWUX`qt}`JWmv6>(UtS7=A7_|qmL5X=fe zRTjvdMQr)KFY85yN?r>E%~fDk3lCwp01*6V%X!UUM75B@kYb#wwgd;T{4{xl#>&#PS1p9X&v(I(&Hr zgnF)u$I|v;Ca14(5dgn+m?kHO@S#Bk51urJnzz*_0E65$l}6 z@SFN|nr04~ccx~38^JFmE<)U|^SX6hY4OdYkjbkjb+l>-DhsmGEn$0`58=d(@__DK zUvwM+UrNjerd( z%P=EyAOw4H#PDgrkRV_kN2a64^LrB_uWSMr##-bg)FD**c8`GNYMKy3VHW274Djzh z#7istU2e7nZJrx_HC_#MdEbUy-e=VcL&rpTQa9A=^D1oyPYjJoZcL4N%z3vndGdNb z0l-NfRCHL1ax7JOh~e@@5iBIAGotebyEZ;+S-J z*J)YbpSuwdh4+QP&Gg`8v6@|Cxns#ue@L#GERz0@6CO<-B6GFQjCh7l z*$si*MJ5(6i;qH~VebX1T;$NIq)Z|uVYM~fFle*aw$mG!keCH;3spBvK0}wQcyb8UCI8vc>;iD z3)$DuZjG087^1)B9I_FBu?f500;c@pKZ;VYuQ1IpH$d-Oo6)2+FHWc0+a`A4gVXPGZaQgRQS!CnNcc}s|A#*$7Zx8s zh}PJM%KV?z>n3K%(M!I~$H`W_eU2v5Nm>3yW#F!0d>UzL8E|89`9tYZoVdVSxeCPNy`v@+p;Owk=R{lG=!pF`aUX5K3dS`bx zTRus%mLP^NMV+G5)cip9evq}wkXRq$%UgRJ2OB%S=ExoFzl_Q$w({PFRdL)WbnNg5 zJ)u?S+%R|SNH6ML11jX8hMFQz{tMvGH8XKRTY~N<~PcB%7=#w*VYzf5_RDQUt8yq6L27`~)zdsc>Odm3a|zgBqQDfP9*I60~T2 zW8&VknU|)-efF|vVqQ4$`T(4QaMbJo?rV$!Pf{K2re`N&^;*-lSYKu(ly;?Tl~0t$ z!~cw5tiH+^66S3oeK;#coOjvlfu%$f;Y4PlmjN5N`focxz)T=|+~2XD9LpMZXbOVy z_wZ2wQBWCo>IPi+!(M?7*FZqnfN&uVx(fLH%usB~#+Q z0z&w_+j9Y11Tr_EkxHXAhu85}3RVntDrWBhd!vtH!g451K`0VJV|7U~PDnQ{jQR-p zoxe_91d?C&63CY69gX3q-{tq6>v$1L#o@*}{DS8zkxYT!?*LF=h#aDu*z$(cn9`dc z<05TuR5H8HiBJm3LC_>_D1QUQziAtLPB0=tWcOX+Hk1VtHc*BSz_GjL^Jw|4ro=7G z!*%$!2%dWs{BP*hJC1lF1$bJXD>u1W!k6!&=#x1ach^$G_{y zVcNJ1P?B}e90J+q4&|70F?}S%7>$sA?1ccHXUpI)&D4Aw&Aodv(`QrFuT7Z}(HI4t z8FQOD5};`SHSAf3JSRy~zB_t_o1%>- zNs@g*S}SVyE5?l8uxUuWVIY2vOHX8u!-Gk4p)8B2aD+n*Vcl^|hNw`$S+3_tF9ubs zdi)%cC!m&5v&$U{eD_dOkbPwQ0lCOX*sYj@*(+K6OqJ05O)_(QjJ@3aaaMo%G4l@z z0vI^m@d-za!A`HF4Uk3HDk-DdpHKFf*?LQ?(s!3w^=@1qH+t1Mva_*Vw z^Ls`4NA0?*6C*H$ir65uL952OBFQ#kY$jdjzzp~VG|Xd|)EO!e;=?g1*|BKiH^{V|6W$V+pyk zE>18p!Nw-03=G7kYI==BTtK(47NjdLt2cz7<-NdcH`E0O8n(TWcI&7A-BNuN8^80i?lv+wxxqzE?B#+EU#ZoK zWDwHVb^{cjlT}|6t>_hAfp&F-r_4iTz#1|fs zTC3uQJr(G-BS^gPYP3y|{IpYM&ik;!j@T)gFo)j87BiZQ`y85me(<+L+lI8VP6PU$ z49_#$7dq(~$`!NF$=Rtm!m%s77+p6g>3QNkSo1c#p-p~r`FI<}%2Q&#PN`4rnHCel z`5T@hKcQJG+C~d)`w1INtM>S8*Xp3iC&$Chwka%v+J3u1pL<``FPa)(RadmrO4Mwl z!W%R(TZ^iqgG@p(hSZoJ@u-)LWItxt_Qb?0JgrBaoC6IL>xN=}H>TBt?WbZcH93qA z>dI5L|C*B^*RW#@Dba!WrG;a+l9LY?XFYqj4#-HO@S=r?p7ZO}q^@gq2MTJIvGF~L zl+$x=B>U%#0}m}K>Y>^eR+&RbRCok~^IW13^1sUT_JVD9X1i1)cW2j#c7tf3OQU!>76 zsIe9*LOGKt!jn3qWBPlP+IYIRlw zf^Eh?~izVe!8?rR+vxu=o`e5b5F?@65CJta85TwA_N_p1_``$c@?GY zBlk^TX}VWVPFp+09?ZV2=-wF^H1D{2Aza8QsucScZ-_vF{Hoo!KdY&ja6blX;ncn2Pv0MTcsuGU{j6_*NAr5lTVqnd0A8}6@mES6dpmq` z_>G{uY_lno^T5~#%riwFGno*@S1Xg}aFPqaI}R3fyKoYcMN z)1TRNm{9Xok8Y(Kb$;$ST|Q{3+sWUwK!v@Czv#D~PilDXKYq1R-;|hW0kijhZ@2c$ zI2qpTz(~vcVdrjIWw*8YhU((*uiC{|-?O6a3|psiRGbQ$>c?a0I=ChK@UJaV&`{4W zV4=q`!#B`{)8wni8FvFQ&klNaGYndJ|Gm7poo^FASNeQi zaBz3^c!47$W_VKA|X zvLGICb2kw6Il!fHnb3AU>DwpLH#G$PG4j&cXE%GUlP-SP^@;ju_ctAaf4D2u=eJEN z3_`ed>osvvbWZR!V4}$1J{NVBNNF)64UP~FhY`ar+>ZF*@T%V-O$GTuTvva8)f(5! za)Li!f8>y$cXvDANP47l{*PShTxz|vM0Y>Ia!Jd7^Y8Zs_eJrA)da^{3~sq0*T)w~ z_cPP=F0*~>DF1|YUXv_9l3((UJkof2DKPkI{~AbyPW>>h<$4pc1<_zPv)LeaQ!y0v zTOr}rl?+S72N2%Stl904yK9@%d94Hbi}%kT>if6eoV9{beLc?%HRp@( z*7qmw%FOE9S;zD%TDMz2+wAN|61<#W)?K)%+^S4^W*PDRDuHJboAK#5WAS0$*41jK z^V~$wBlCt%h0eC(y*rv}c%JuUyX1$RBe-n6I<1)xYoxxBuo zcOtxmzP!&UvH9_m_k zU*aXQOX$?}^BOfoP9^Ox?fV^At%&b>Cc})6V7}O>VzbA#ipgU4>D(=Sy%>BZor_(? z-mUjb*e*sYKTiGoM@^sqbbPEeN6OmYtLb#+XTNC7O&Tf8i{`>7fkkOcG}pYq1hO7& z-b%F9dG38`_<}R$VH5$f8AtB6cDPw+E4Z&*o>}_yLJ;@jm%9lKd{htcWzXf@!l%#U zz?zKKlQ92wcRHG{_H#8egcO!H(=JgKQK4(YcSrs_Nilv&o`Y%tWb<7<{TjK{_2&VV zYV2aOzxeP)vGCW_FeARM*dBo@X~*(y0_nPkuCnV`O&ZA6WpDSy^Di?`3Mp3}h?_A* zCeJ&H5BbfAD58_?-uMc^**hh?Pu4F+{jZe=N)eyzU`9VdvuIyYqAF z?Pjp{?(ix3!f$54JFdw?E@kxe{^{@Qz_cs2sOhfsaJ?QZl3<7{!?*oe%XN27P4}(8 z^$emfZpnOvUtmBHTvc1c27+I&TVBMqV!qHxr_jQ8h$|583)zxGi3Zw1?$8%{aS%Zv zoCJdy+6jf!(&d0<3D~oybEOBbv$@7D{Xb#DiG_xOM2z96`rcob5>kD9@3rqXQ(X$F zVmHF9KJg*PcvWPETd%Xjm{d6$h}*T;*k4DBjA>_Et|}N0R)X#;$+8J&b=M za;qhM@w-R3v+*K{`7`?>xmP5T%HA07gvBdu`7Z`V0k^1dgq@*F8&3ZOn2r%4p<$o! z!QF^u34zwDSrTrfxb@B3wqG^Bxye>&43B2+jx-0Z(zq-qH{ICtggtbxU>S0u?U4U1ze>xqa@k2)ic4 z58X%hy659So`NQA-s=y#BAsGesmGK!G!A)cr?d@po(>MDc~<_X_uz^zf^l7 z^-sSQ0y!Wvb!7AD&~J-ad2*gG?>fBRg)8HRJf&%T4Ct}V^Nf$Pr0wO{iCe+dOt~(r zGaRYIZ0tL}-(BZQzy3JTuyf~!ZCqH+J~cJKVZHs^C)_J_+uz#4=svsS>3bt`M=&LH zLB)LhG$77VsCS)Bw5+cvlgAHd!A%(WhP3g|i zU*Y~|>;9etod)e+`mO%y0l8Yd&!_y49n^KVuUpDL@78+gT2KN>=*+MEdHr{WJp{dVS!Pe5#D7;K))>!UWP${7 zm9+WjLDoUyVj_1=c8_RypRFnWi)-{BS3qxWHEYlu7uAd(C_OS)^@ej)8L^Z!bHaDn zUx7dRx$l1;boUu&3GS=uFK>R|AvGaKKXE;|AmWX&V4v{GG4ZDY77U6Ea3p+s%q784 zRO)vbV)+pYavc{fy2pN)W@dG{<(yOZT0L~+&##mLy@a9U2w|crXU`8o-LMk(rEJP z6(OJ7^Bv|xM_@PjRUYHn5td3c;#PB0aHgifUfnhpyIbZwhWW}5(Zq$QAUX8az6|^m zi)5c$xC18X??$YcWrqMvB6HS?D*wsyi+wjN&@t-ndYR~Lc3XcVNwpfom-z_70| znQfP&@2w;!uVAh@KzbOktA@88bxw8d7JY}ozT^;n0wHkNKJbLaTRrG=qFr-W>wZlN9dc^I zDzzd!^WCwe0dY9+q0Yb@c4STprV_*rGe}hMj>hN7+5CY`vPl_-+~J z7u`xelV}owf?woWlE8*82S(b4J6Gt2K<2*m3t)nbtLvn)X#ueZ@Q?Ul#jZ!qAGh|G z-4gBa{2rWfbm-vSRkog|2JcJWd=uP~Tw0QX%p`->->Yi*BB@ZPD@N$vfiJ>-{ui(O zo%DsEy3a0_1Uxf2?3)d{U7d5NXO?){5Bd16R<1j?@4myM|HY$aVKG=jbd=QXL@@v3 zIrh|=PX&|t#jp|9Cv*5pI!kDb!4|4vY14Eh#fW=V9{&p zC9DuC0TahvJshlDFtpN0IUx5voJPBz$*N>%WjAsE=}ok(K%@%2)Vh4z7UL>XLDn1~ z{^kh6RWiEF&;K~0?xsb7sG0Ol+_I=1=IaE6YYvi84a%f~*ygPfojqk-cR(w}o|-|(3KK@OYWZl*5io^l1e zDKXm^UuZ7tBR!I*_>e*b&o&3kds!M(^;-#xi!L*Di?ZCDj@`kELTsdSrya1Q_itWc z(7kR*%Xe|3aKB1xfUWf?f#@4GiWo-u*=A1qt|y16xb5h3ue)Im2e#u8r?cNp-yxTN zvEC#{w}(kv@@ua360+iO0Z*{9cb6;~~{^D$Ns4$a2=ovk#7g2h6N}qWtLvw{s_V+E7|1RIG zyvkU!yk705ToZ|9EajWaLZ&kCiw|Pd?O5mr+eiKshZHHdUoL#M*0-7R$`Wb0F>JR= zngR`_r=0z2+hj-=fWI&>s526sess5K*%hpI)$DR}+PG2O$yMy|&ji)AB6&#G2P94?mgaoj&x06jT4n75`+NUkfW}{66$UC`(8F zeQ6fk#n#_x_`im(O#ugbamkmm)*4YUL_QK~R7X3ppRRkg7m3SzF^5?}SWSnDWJy*R zH;hpT+Rro1x@;<}6B;9qtk>MFTh{1_WA^@(ndts@0o#IY3&y_c5}+yhm+K%qWbz#{ z^Di~}!|Qa(57&yw43L@dH$B9!`@$z(ewj|o`H*3ACwzeK$@_A@of%e5YH25* zliT@%dA3FV&z7s-`+g-@@61Ler-CGk>6naYMITse1Xd=cM`#vhbmrcuI5|$A&xqZM zO=)_ko$1OgDPUjCZIM90(OJo^i)y2Oo@NGuSe7lNgW2&O{ z&kqGb|75Ba(KImJp}XPdXm02$v+dsj@2=Zr1$|j_ew4V2@t;7Qu9oV4>RRlCBbt5;`M>h~y&SJQ$;+$Ug1fIoV03-qtU_;PEj>|DH?{aJ5D6T9?6 z>w!bkiWZ!TLe-Zldd2+EIY4|>rOxDgV`5hWk@88pLClqbqKmk~tJYoZBbkLawM>t@ zox+UfQr*4Zh=_fHp1rhHnW~R)@i;S@{WerJBa!1`vd?*S7Kyxa{di*jmU7m_)$+QO zCXV1bv86h@g`nPZnA>y4PKUdDVc>L6N5oyD-Cb>Nz?0oTq=RY}?_B#NvF6BH8qlf40@aT~PkR|BzswXePU^8gWfpiT>3yQH zox#GR0-n}5e)R`xNj(GAY8d*qFZ|*VtZ@J)LsH*{2GYXhwKf{>kS)f|$Fje$>%6v( zuaoM)#;nEsn_?n)Gw-8htUVo6!(%(W3sFq9-(rla+L_%gCG*lt&t4f!vNqYPUgx(UveV!(1#w11^m{ z+zhH?wgYCMBp3%UrqJ8Xjt}_l(^|o-F z8)GAj@~^ZE`w>w$uw5%vgd3LGEx3qXV#+7nZ9Z)4^l$Lrac6h1YUSL^XWvvL&%uo$ zG`*g_G20tG9*Z-jhLdccYT4x{$!N2gjkT9abs9d&1}uNMKLnDaVk~n=>rl(!5P!?m zespH?rm#9!PGerJ-Q6$jN%GsN29HWM39=V&>8{eh)nxP9<>MmRRJ?*qrXlt3GKr1D z95jxFdp~U5A6Va1y;x|tHgy{qIwjD^Pakc3(HK1MiY+vZr^&|G2p~Y10eI`DsI$9N z;`L4{UWJs%6B@%)M`V*#m-CWRKj@ek=1xfv4SU8<^&D5tR-aU)ycP+h;5cqeSpF`? zdgf@Pn~#^GJX~)+BdWhVDU{CTSx9{3R1FaekM{hl*6row3O-j&Z_*MikI74$g6NHz zKOWhj$eUeLAxV_2wa_GoxgOM=xPj#+=J%UR-dEa-d7hcl> z8(lnM67V6z5Z)7lCMjDJ`SC*VNci^nM;7Bm9F!I=1KK(i?;bn71yAWLUlJd^uEimuFYO#^PKj35R1 zpx(5-S;aVjzVav>sFY4V&PZrb4uIsxH1J65td6i?L;>Cnyz3DprYeYc00tth)tpQs zmJFi5BTeluTeAWp5Q2{6WZ&|Fs+|e@8=%2OQvmSTb5wVzEv{8Dqo|gSF}s!5xKHeX znYF7{qSs?y(ZNr95AAvaIax-U@bm0zUAOZ*o;|F*9l;PnnPseHHVF+D05C*1;|lAu z5D>z)E&ObBg05hNOp&*~lTkTx&UtYj+9 z|BR=m{0uliLz04!sSIWs87Uz9=9Y$If%hNWqwiYinD;;&GoY;)f{y{r_mIwr+Ah<2 zrbdT>^4;c4MfZ{VT1sE7n_Y#erkh&keNOwnZ~Kf#++lMMs{w-uuM|ML9t#r)8W28q za0);M5)8Ui!b24;7}M_~_UfJ>YGq16LYFBzgT9@(?J}FxH^D}W(@D*#$Tdd$`Ir*# z0qZDV{%2y-kzhVMd|U?h_JFDY;mmU1-vrjxv^X2M?AMZ-lnw_gsB)%06to!=)fmGTkGm%C< z-Zu&I$YlUZ3!pBO8E`+5X9s|4Y`OydD-q|E*?=8V_>2H%3jpi61QFHVJ85AJK&@v> zo*&pGTl@<8{PfQQg}Q+rm2^iv`0pZ|1yuNt&#xJFUjSEM7}{+q+3Civ+XB?;SD`q} zWKpAJSWMeTc~K1j#@8!KCJuxZsB5(XV<)70X(dSEfwMT+O^}2+WrN9v@0TQ`{(Hlp z%73)ct^fs*$`0O%-x5B%JxggG^K*Ho8h$xuFT;Lt9r_{-9xyBax=eo$$N$E7mW9eM zmqi3%ByKME=R++v0%71&v|j_G1_;Lb2(w9vwa*&!6oTqE#n2MV7=xl$W#~m3NLCff zJ<=a|KBRrk4khFJr&^#l1ATroZ9@%xkQ8w5U$o-mZ()swuUym%R0yNUzEHZQx8RFp zKJa$?w{XA<3H#9)bI*CpsK6hDWB&mWzJr}$1IDWQ`t`cvz!;%=D(jC|y7r0WA7 zE6<$)ab*EMLe+{KEr#a#bc64K`Q)W}Qg!MXyDx@8CL!R6YA2<*b|B3AQbC3v26 zaII#PZ(K&X{X#?%`oNnv=~v>C%p4hW4*-_^7~u}Wd>;oQrh(d@^rB5t+ux~Cg`@zr zNdOK`Yz_(!XUx^GNlrO@c&l4yKxY~DQx+n}WN`G0cYypl*2i1osD-C9(J7UobJ1pN zpVc(+<}#YUX!1L8nyhf86NDwtC}rtOCp!c4Mc#{l4ebinlu?WZD-M~x9JifyBPZZJ znhnWQlEezp6B;A{*6sh(K*sT_p#=ZeA>&+;285-)KD>9x>dTTf?~zhi{|9Y79h!Sr zkCVt|>E+YWXZbv%H9Y^grb4-yOBDLx=$K8TDD$83`^rFeemmzOlc9dT{H|HD6Zjsp zSn`;9Qe{I#QoF`zR>)`K!TqcQGie=%a+NX*z?dTrRbYB3H{a`ciJJcC&%24A70?fi zShgJ8fDGhs0T3Kayu23NaZJ(Kp4R*Oy{YHyK-A{i{!X4GWDBV6$AcTrFdgAIvoR<6 z?WBFp;p5M@;-00`${hV_6TL~%?*N=Ssx=8*gTuejvAL%Fy{XIvzc2ldn0?A+SP>7; zn*vswAUspt#)dD=eNs2tRvR}$e4jNpLS|y88s&-f_7U4<*L4DefFuz?>^CcRWd0-*T6z_g0DOq9XaS>*#;J~s7p$> zG*+_xVzQC*_>t=anWwlplV@gnb16|+to2vOe33(b zWrBuBK8V{T`+wEdv}cZaUu?Wx?74KFN?8W})FV}%WP4>yQrdNFfUvd^2_XjdMLH9& ze+UC2d;0-un)kNWy@6bSlc;!0j)4sWP{Nw01?{e+0r*FDcCkOzX_#FZDvp?3A#}BX zdj$;g&B(KaEF%to-pe}#+-so<6G)=JUWIH`J)KrjW_n}cmd?u(${;9%@nELee1F*|3 zX_&|dU2m$Y2h#up*#zy7XX>lk$-}|R!G(Y6a!<`=O{Q#KptC0C28uHiv{|b_nJZXd zQn)4%wTzk@Bkt}6!SEs7fcrP>iUT1pK--%E@~S#mv?vod36#z9vnE&q^2h)}HFW@F z*cMR7uNY`oHBE}BB>qn&w+5^$B98IV^#h<`XS;$)BzVoq#8f=FRwk7N(ZPt3GLTwR zEd+6g^=0Z7=6>;!tOA?hl*mYWFSNLSe?a!kq6D$ad|0g%A%`+@O3N|?GH z9BKgU~)yNOxjP6E0j6fXV@^Q=or@E>pvG zuo5t2fVK_Vl@wtOpP<8qkpCA9x`M@OGeBI#sxEJ3qjQh@!5#1-O7o}TFYloHUmO4` Mikb>#a<2pb2Q%zTT>t<8 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/Square150x150Logo.png b/nym-connect-android/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bc59dfcfd5a45a5fbf6fc364e5ffe47b0dfe92 GIT binary patch literal 13324 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 bTmN3X6S771o(Fjk0H7$ZCRZv03;e$TurQ4| literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/Square284x284Logo.png b/nym-connect-android/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..26311d46047a6a8556342e55999ea585174d8f10 GIT binary patch literal 28970 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/Square44x44Logo.png b/nym-connect-android/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e161bd7c4af923c48ed2388ba9e125b41e05ba0b GIT binary patch literal 3527 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 B0onin literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/Square71x71Logo.png b/nym-connect-android/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..45b5126bf601d5ec540ef18429b4b76030cc75dd GIT binary patch literal 5694 zcmV-E7QyL>P)8r!&6ydBWhxD1Rt|EL~OiymM|Xsct$F9F)cSeD0^Z zt8R5wf9rS7J-6!KBM2v9VJ#j3d>(C` zM?g5^WLHy%s}fD$Z4Sn{#t zVadUgS=S??bB-I&Dl0-d$wErWLirwIJHB9%r1a*EGY{B;eeRn-zCQ^xC6nI z4lAeI%s3?a-2eRof-aW;3)Ir(GJ)T1;i_r(ka8T7&$CTz@⋙lqQ7YZkBe}xx|Oc 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/Square89x89Logo.png b/nym-connect-android/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..386c8bf1191ef69f472a2191a38be414402210f9 GIT binary patch literal 7511 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%0A5=QlF!?KyxY%R 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]`~OPx$&v?Oqo%#4m^v>39w|i37EWr- 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 ?81%mHB8!%Ex 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

2hCFsHI)*k<<%Jz5Pz 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 I2ll1^0g!omyZ`_I literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/icon.ico b/nym-connect-android/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6164f98f9cc6a4a53f0d5f8ce20ef179dafd1f39 GIT binary patch literal 40889 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ⅅQ( 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%0A^WcmxXkUtX;j*faAaO(FC5H{# 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 a*YeQ2QS2Caq|Gqc!TV|gt-yag^}hh+GmxzS literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/icon.png b/nym-connect-android/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fa552c309af717e94676269720116adabf3f744f GIT binary patch literal 61553 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/icons/tray_icon.png b/nym-connect-android/src-tauri/icons/tray_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..afcb965219b76ab9ca18e89489d08e028245602f GIT binary patch literal 56946 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src-tauri/src/build.rs b/nym-connect-android/src-tauri/src/build.rs new file mode 100644 index 0000000000..d860e1e6a7 --- /dev/null +++ b/nym-connect-android/src-tauri/src/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/nym-connect-android/src-tauri/src/config/mod.rs b/nym-connect-android/src-tauri/src/config/mod.rs new file mode 100644 index 0000000000..849c89df5c --- /dev/null +++ b/nym-connect-android/src-tauri/src/config/mod.rs @@ -0,0 +1,154 @@ +use crate::{ + error::{BackendError, Result}, + state::State, +}; +use client_core::{client::key_manager::KeyManager, config::Config as BaseConfig}; +use config_common::NymConfig; +use crypto::asymmetric::identity; +use nym_socks5::client::config::Config as Socks5Config; +use std::path::PathBuf; +use std::sync::Arc; +use tap::TapFallible; +use tokio::sync::RwLock; + +static SOCKS5_CONFIG_ID: &str = "nym-connect"; + +pub fn socks5_config_id_appended_with(gateway_id: &str) -> Result { + use std::fmt::Write as _; + let mut id = SOCKS5_CONFIG_ID.to_string(); + write!(id, "-{gateway_id}")?; + Ok(id) +} + +#[tauri::command] +pub async fn get_config_id(state: tauri::State<'_, Arc>>) -> Result { + state.read().await.get_config_id() +} + +#[tauri::command] +pub fn get_config_file_location() -> Result { + Err(BackendError::CouldNotGetConfigFilename) +} + +#[derive(Debug)] +pub struct Config { + pub socks5: Socks5Config, +} + +impl Config { + pub fn new>(id: S, provider_mix_address: S) -> Self { + Config { + socks5: Socks5Config::new(id, provider_mix_address), + } + } + + #[allow(unused)] + pub fn new_with_port>(id: S, provider_mix_address: S, port: u16) -> Self { + Config { + socks5: Socks5Config::new(id, provider_mix_address).with_port(port), + } + } + + pub fn get_socks5(&self) -> &Socks5Config { + &self.socks5 + } + + #[allow(unused)] + pub fn get_socks5_mut(&mut self) -> &mut Socks5Config { + &mut self.socks5 + } + + pub fn get_base(&self) -> &BaseConfig { + self.socks5.get_base() + } + + pub fn get_base_mut(&mut self) -> &mut BaseConfig { + self.socks5.get_base_mut() + } + + pub async fn init( + service_provider: &str, + chosen_gateway_id: &str, + ) -> Result<(Config, KeyManager)> { + log::info!("Initialising..."); + + let service_provider = service_provider.to_owned(); + let chosen_gateway_id = chosen_gateway_id.to_owned(); + + // The client initialization was originally not written for this use case, so there are + // lots of ways it can panic. Until we have proper error handling in the init code for the + // clients we'll catch any panics here by spawning a new runtime in a separate thread. + let (config, keys) = std::thread::spawn(move || { + tokio::runtime::Runtime::new() + .expect("Failed to create tokio runtime") + .block_on( + async move { init_socks5_config(service_provider, chosen_gateway_id).await }, + ) + }) + .join() + .map_err(|_| BackendError::InitializationPanic)??; + + log::info!("Configuration saved 🚀"); + Ok((config, keys)) + } +} + +pub async fn init_socks5_config( + provider_address: String, + chosen_gateway_id: String, +) -> Result<(Config, KeyManager)> { + log::trace!("Initialising client..."); + let mut config = Config::new(SOCKS5_CONFIG_ID, &provider_address); + + if let Ok(raw_validators) = std::env::var(config_common::defaults::var_names::NYM_API) { + config + .get_base_mut() + .set_custom_nym_apis(config_common::parse_urls(&raw_validators)); + } + + let nym_api_endpoints = config.get_base().get_nym_api_endpoints(); + + let chosen_gateway_id = identity::PublicKey::from_base58_string(chosen_gateway_id) + .map_err(|_| BackendError::UnableToParseGateway)?; + + let mut key_manager = client_core::init::new_client_keys(); + + // Setup gateway and register a new key each time + let gateway = client_core::init::register_with_gateway( + &mut key_manager, + nym_api_endpoints, + Some(chosen_gateway_id), + ) + .await?; + + config.get_base_mut().with_gateway_endpoint(gateway); + + print_saved_config(&config); + + let address = *key_manager.identity_keypair().public_key(); + log::info!("The address of this client is: {}", address); + + Ok((config, key_manager)) +} + +fn print_saved_config(config: &Config) { + log::info!( + "Saved configuration file to {:?}", + config.get_socks5().get_config_file_save_location() + ); + log::info!("Gateway id: {}", config.get_base().get_gateway_id()); + log::info!("Gateway owner: {}", config.get_base().get_gateway_owner()); + log::info!( + "Gateway listener: {}", + config.get_base().get_gateway_listener() + ); + log::info!( + "Service provider address: {}", + config.get_socks5().get_provider_mix_address() + ); + log::info!( + "Service provider port: {}", + config.get_socks5().get_listening_port() + ); + log::info!("Client configuration completed."); +} diff --git a/nym-connect-android/src-tauri/src/error.rs b/nym-connect-android/src-tauri/src/error.rs new file mode 100644 index 0000000000..50a672f8ac --- /dev/null +++ b/nym-connect-android/src-tauri/src/error.rs @@ -0,0 +1,91 @@ +use client_core::error::ClientCoreError; +use serde::{Serialize, Serializer}; +use thiserror::Error; + +#[allow(unused)] +#[derive(Error, Debug)] +pub enum BackendError { + #[error("{source}")] + ReqwestError { + #[from] + source: reqwest::Error, + }, + #[error("I/O error: {source}")] + IoError { + #[from] + source: std::io::Error, + }, + #[error("string formatting error: {source}")] + FmtError { + #[from] + source: std::fmt::Error, + }, + #[error("tauri error: {source}")] + TauriError { + #[from] + source: tauri::Error, + }, + #[error("{source}")] + TauriApiError { + #[from] + source: tauri::api::Error, + }, + #[error("{source}")] + SerdeJsonError { + #[from] + source: serde_json::Error, + }, + #[error("{source}")] + ClientCoreError { + #[from] + source: ClientCoreError, + }, + #[error("{source}")] + ApiClientError { + #[from] + source: crate::operations::growth::api_client::ApiClientError, + }, + + #[error("could not send disconnect signal to the SOCKS5 client")] + CoundNotSendDisconnectSignal, + #[error("no service provider set")] + NoServiceProviderSet, + #[error("no gateway provider set")] + NoGatewaySet, + #[error("initialization failed with a panic")] + InitializationPanic, + #[error("could not get config id before gateway is set")] + CouldNotGetIdWithoutGateway, + #[error("could initialize without gateway set")] + CouldNotInitWithoutGateway, + #[error("could initialize without service provider set")] + CouldNotInitWithoutServiceProvider, + #[error("could not get file name")] + CouldNotGetFilename, + #[error("could not get config file location")] + CouldNotGetConfigFilename, + #[error("could not load existing gateway configuration")] + CouldNotLoadExistingGatewayConfiguration(std::io::Error), + #[error("unable to open a new window")] + NewWindowError, + #[error("unable to parse the specified gateway")] + UnableToParseGateway, + + #[error("HTTP get request failed: {status_code}")] + RequestFail { + url: reqwest::Url, + status_code: reqwest::StatusCode, + }, +} + +impl Serialize for BackendError { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + serializer.collect_str(self) + } +} + +// Local crate level Result alias +pub(crate) type Result = std::result::Result; diff --git a/nym-connect-android/src-tauri/src/events.rs b/nym-connect-android/src-tauri/src/events.rs new file mode 100644 index 0000000000..13e1ca800d --- /dev/null +++ b/nym-connect-android/src-tauri/src/events.rs @@ -0,0 +1,71 @@ +use std::sync::Arc; + +use client_core::error::ClientCoreStatusMessage; +use task::manager::TaskStatus; +use tauri::async_runtime::RwLock; + +use crate::{ + state::{GatewayConnectivity, State}, + tasks, +}; + +#[derive(Clone, serde::Serialize)] +struct Payload { + title: String, + message: String, +} + +impl Payload { + fn new(title: String, message: String) -> Self { + Self { title, message } + } +} + +pub fn emit_event(event: &str, title: &str, msg: &str, window: &tauri::Window) { + if let Err(err) = window.emit(event, Payload::new(title.into(), msg.into())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +pub fn emit_status_event(event: &str, msg: &T, window: &tauri::Window) { + if let Err(err) = window.emit(event, Payload::new("SOCKS5 update".into(), msg.to_string())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +pub async fn handle_task_status( + task_status: &TaskStatus, + state: &Arc>, + window: &tauri::Window, +) { + match task_status { + TaskStatus::Ready => { + { + let mut state_w = state.write().await; + state_w.mark_connected(window); + } + + emit_status_event("socks5-connected-event", task_status, window); + tasks::start_connection_check(state.clone(), window.clone()); + } + } +} + +pub async fn handle_client_status_message( + client_status_message: &ClientCoreStatusMessage, + state: &Arc>, + window: &tauri::Window, +) { + // TODO: use this instead once we change on the frontend too + let _event_name = match client_status_message { + ClientCoreStatusMessage::GatewayIsSlow | ClientCoreStatusMessage::GatewayIsVerySlow => { + "socks5-gateway-status" + } + }; + + if let Ok(connectivity) = GatewayConnectivity::try_from(client_status_message) { + state.write().await.set_gateway_connectivity(connectivity); + } + + emit_status_event("socks5-status-event", client_status_message, window); +} diff --git a/nym-connect-android/src-tauri/src/lib.rs b/nym-connect-android/src-tauri/src/lib.rs new file mode 100644 index 0000000000..f4f42e2f12 --- /dev/null +++ b/nym-connect-android/src-tauri/src/lib.rs @@ -0,0 +1,98 @@ +// Remove me after we've tidied up +#![allow(dead_code)] +#![allow(unused_imports)] + +use config_common::defaults::setup_env; +use std::sync::Arc; +use tauri::{App, Manager}; +use tokio::sync::RwLock; + +pub mod config; +mod error; +mod events; +mod logging; +mod models; +pub mod operations; +mod state; +mod tasks; + +#[cfg(desktop)] +mod menu; +#[cfg(desktop)] +mod window; + +pub use state::State; + +#[cfg(mobile)] +mod mobile; +#[cfg(mobile)] +pub use mobile::*; + +pub type SetupHook = Box Result<(), Box> + Send>; + +#[derive(Default)] +pub struct AppBuilder { + setup: Option, +} + +impl AppBuilder { + pub fn new() -> Self { + Self::default() + } + + #[must_use] + pub fn setup(mut self, setup: F) -> Self + where + F: FnOnce(&mut App) -> Result<(), Box> + Send + 'static, + { + self.setup.replace(Box::new(setup)); + self + } + + pub fn run(self) { + setup_env(None); + + println!("Starting up***"); + + // As per breaking change description here + // https://github.com/tauri-apps/tauri/blob/feac1d193c6d618e49916ad0707201f43d5cdd36/tooling/bundler/CHANGELOG.md + if let Err(error) = fix_path_env::fix() { + log::warn!("Failed to fix PATH: {error}"); + } + + let setup = self.setup; + tauri::Builder::default() + .manage(Arc::new(RwLock::new(State::default()))) + .invoke_handler(tauri::generate_handler![ + crate::config::get_config_file_location, + crate::config::get_config_id, + crate::operations::connection::status::get_connection_status, + crate::operations::connection::connect::get_gateway, + crate::operations::connection::connect::get_service_provider, + crate::operations::connection::connect::set_gateway, + crate::operations::connection::connect::set_service_provider, + crate::operations::connection::connect::start_connecting, + crate::operations::connection::disconnect::start_disconnecting, + crate::operations::directory::get_services, + crate::operations::export::export_keys, + // crate::operations::window::hide_window, + // crate::operations::growth::test_and_earn::growth_tne_get_client_id, + // crate::operations::growth::test_and_earn::growth_tne_take_part, + // crate::operations::growth::test_and_earn::growth_tne_get_draws, + // crate::operations::growth::test_and_earn::growth_tne_ping, + // crate::operations::growth::test_and_earn::growth_tne_submit_wallet_address, + // crate::operations::growth::test_and_earn::growth_tne_enter_draw, + // crate::operations::growth::test_and_earn::growth_tne_toggle_window, + // crate::operations::help::log::help_log_toggle_window, + ]) + .setup(move |app| { + if let Some(setup) = setup { + logging::setup_logging(app.app_handle())?; + (setup)(app)?; + } + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); + } +} diff --git a/nym-connect-android/src-tauri/src/logging.rs b/nym-connect-android/src-tauri/src/logging.rs new file mode 100644 index 0000000000..804c1f2dae --- /dev/null +++ b/nym-connect-android/src-tauri/src/logging.rs @@ -0,0 +1,118 @@ +use std::str::FromStr; + +use fern::colors::{Color, ColoredLevelConfig}; +use serde::Serialize; +use serde_repr::{Deserialize_repr, Serialize_repr}; +use tauri::Manager; + +pub fn setup_logging(app_handle: tauri::AppHandle) -> Result<(), log::SetLoggerError> { + let colors = ColoredLevelConfig::new() + .trace(Color::Magenta) + .debug(Color::Blue) + .info(Color::Green) + .warn(Color::Yellow) + .error(Color::Red); + let base_config = fern::Dispatch::new() + .level(global_level()) + .filter_lowlevel_external_components() + .show_operations(); + + let stdout_config = fern::Dispatch::new() + .format(move |out, message, record| { + out.finish(format_args!( + "{}[{}][{}] {}", + chrono::Local::now().format("[%Y-%m-%d][%H:%M:%S]"), + record.target(), + colors.color(record.level()), + message, + )) + }) + .chain(std::io::stdout()); + + let tauri_event_config = fern::Dispatch::new() + .format(move |out, message, record| { + out.finish(format_args!( + "{}[{}] {}", + chrono::Local::now().format("[%Y-%m-%d][%H:%M:%S]"), + record.target(), + message, + )) + }) + .chain(fern::Output::call(move |record| { + let msg = LogMessage { + message: record.args().to_string(), + level: record.level().into(), + }; + app_handle.emit_all("log://log", msg).unwrap(); + })); + + base_config + .chain(stdout_config) + .chain(tauri_event_config) + .apply() +} + +trait FernExt { + fn show_operations(self) -> Self; + fn filter_lowlevel_external_components(self) -> Self; +} + +impl FernExt for fern::Dispatch { + fn show_operations(self) -> Self { + if ::std::env::var("RUST_TRACE_OPERATIONS").is_ok() { + self.level_for("nym_connect::operations", log::LevelFilter::Trace) + } else { + self + } + } + + fn filter_lowlevel_external_components(self) -> Self { + self.level_for("hyper", log::LevelFilter::Warn) + .level_for("tokio_reactor", log::LevelFilter::Warn) + .level_for("reqwest", log::LevelFilter::Warn) + .level_for("mio", log::LevelFilter::Warn) + .level_for("want", log::LevelFilter::Warn) + .level_for("sled", log::LevelFilter::Warn) + .level_for("tungstenite", log::LevelFilter::Warn) + .level_for("tokio_tungstenite", log::LevelFilter::Warn) + .level_for("rustls", log::LevelFilter::Warn) + .level_for("tokio_util", log::LevelFilter::Warn) + } +} + +fn global_level() -> log::LevelFilter { + if let Ok(s) = ::std::env::var("RUST_LOG") { + log::LevelFilter::from_str(&s).unwrap_or(log::LevelFilter::Info) + } else { + log::LevelFilter::Info + } +} + +#[derive(Debug, Serialize, Clone)] +struct LogMessage { + message: String, + level: LogLevel, +} + +// Serialize to u16 instead of strings. +#[derive(Debug, Clone, Deserialize_repr, Serialize_repr)] +#[repr(u16)] +enum LogLevel { + Trace = 1, + Debug, + Info, + Warn, + Error, +} + +impl From for LogLevel { + fn from(level: log::Level) -> Self { + match level { + log::Level::Trace => LogLevel::Trace, + log::Level::Debug => LogLevel::Debug, + log::Level::Info => LogLevel::Info, + log::Level::Warn => LogLevel::Warn, + log::Level::Error => LogLevel::Error, + } + } +} diff --git a/nym-connect-android/src-tauri/src/main.rs b/nym-connect-android/src-tauri/src/main.rs new file mode 100644 index 0000000000..e7b0e7c071 --- /dev/null +++ b/nym-connect-android/src-tauri/src/main.rs @@ -0,0 +1,16 @@ +#![cfg_attr( + all(not(debug_assertions), target_os = "windows"), + windows_subsystem = "windows" +)] + +use nym_connect_android::AppBuilder; + +fn main() { + // As per breaking change description here + // https://github.com/tauri-apps/tauri/blob/feac1d193c6d618e49916ad0707201f43d5cdd36/tooling/bundler/CHANGELOG.md + if let Err(error) = fix_path_env::fix() { + log::warn!("Failed to fix PATH: {error}"); + } + + AppBuilder::new().run(); +} diff --git a/nym-connect-android/src-tauri/src/menu.rs b/nym-connect-android/src-tauri/src/menu.rs new file mode 100644 index 0000000000..007d34d68f --- /dev/null +++ b/nym-connect-android/src-tauri/src/menu.rs @@ -0,0 +1,62 @@ +use tauri::{ + AppHandle, CustomMenuItem, Menu, Submenu, SystemTray, SystemTrayEvent, SystemTrayMenu, + SystemTrayMenuItem, Wry, +}; + +use crate::window::window_toggle; + +pub const SHOW_LOG_WINDOW: &str = "show_log_window"; +pub const CLEAR_STORAGE: &str = "clear_storage"; + +pub trait AddDefaultSubmenus { + fn add_default_app_submenus(self) -> Self; +} + +impl AddDefaultSubmenus for Menu { + fn add_default_app_submenus(self) -> Self { + let submenu = Submenu::new( + "Help", + Menu::new().add_item(CustomMenuItem::new(SHOW_LOG_WINDOW, "Show logs")), + ); + self.add_submenu(submenu) + } +} + +pub const TRAY_MENU_QUIT: &str = "quit"; +pub const TRAY_MENU_SHOW_HIDE: &str = "show-hide"; +pub const TRAY_MENU_CONNECTION: &str = "connection"; + +pub(crate) fn create_tray_menu() -> SystemTray { + let quit = CustomMenuItem::new(TRAY_MENU_QUIT, "Quit"); + let hide = CustomMenuItem::new(TRAY_MENU_SHOW_HIDE, "Hide"); + let connection = CustomMenuItem::new(TRAY_MENU_CONNECTION, "Connect"); + let tray_menu = SystemTrayMenu::new() + .add_item(hide) + .add_item(connection) + .add_native_item(SystemTrayMenuItem::Separator) + .add_item(quit); + + SystemTray::new().with_menu(tray_menu) +} + +pub(crate) fn tray_menu_event_handler(app: &AppHandle, event: SystemTrayEvent) { + match event { + SystemTrayEvent::LeftClick { position, size, .. } => { + println!("Event {position:?} {size:?}"); + } + SystemTrayEvent::MenuItemClick { id, .. } => { + println!("Event {id}"); + match id.as_str() { + TRAY_MENU_SHOW_HIDE => { + window_toggle(app); + } + TRAY_MENU_QUIT => { + // TODO: add disconnecting first + app.exit(0); + } + _ => {} + } + } + _ => {} + } +} diff --git a/nym-connect-android/src-tauri/src/mobile.rs b/nym-connect-android/src-tauri/src/mobile.rs new file mode 100644 index 0000000000..d231976e68 --- /dev/null +++ b/nym-connect-android/src-tauri/src/mobile.rs @@ -0,0 +1,4 @@ +#[tauri::mobile_entry_point] +fn main() { + super::AppBuilder::new().run(); +} diff --git a/nym-connect-android/src-tauri/src/models/mod.rs b/nym-connect-android/src-tauri/src/models/mod.rs new file mode 100644 index 0000000000..70b408dc7b --- /dev/null +++ b/nym-connect-android/src-tauri/src/models/mod.rs @@ -0,0 +1,116 @@ +use core::fmt; + +use serde::{Deserialize, Serialize}; + +use crate::state::GatewayConnectivity; + +#[cfg_attr(test, derive(ts_rs::TS))] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct ConnectResult { + pub address: String, +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct DisconnectResult { + pub success: bool, +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(rename_all = "lowercase"))] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug, Default)] +#[serde(rename_all = "camelCase")] +pub enum ConnectionStatusKind { + #[default] + Disconnected, + Disconnecting, + Connected, + Connecting, +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(rename_all = "lowercase"))] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "camelCase")] +pub enum GatewayConnectionStatusKind { + Good, + Bad, + VeryBad, +} + +impl From for GatewayConnectionStatusKind { + fn from(conn: GatewayConnectivity) -> Self { + match conn { + GatewayConnectivity::Good => GatewayConnectionStatusKind::Good, + GatewayConnectivity::Bad { .. } => GatewayConnectionStatusKind::Bad, + GatewayConnectivity::VeryBad { .. } => GatewayConnectionStatusKind::VeryBad, + } + } +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(rename_all = "lowercase"))] +#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug, Default)] +pub enum ConnectivityTestResult { + #[default] + NotAvailable, + Success, + Fail, +} + +impl fmt::Display for ConnectionStatusKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + ConnectionStatusKind::Disconnected => write!(f, "Disconnected"), + ConnectionStatusKind::Disconnecting => write!(f, "Disconnecting"), + ConnectionStatusKind::Connected => write!(f, "Connected"), + ConnectionStatusKind::Connecting => write!(f, "Connecting"), + } + } +} + +pub const APP_EVENT_CONNECTION_STATUS_CHANGED: &str = "app:connection-status-changed"; + +#[cfg_attr(test, derive(ts_rs::TS))] +#[derive(Clone, Serialize)] +pub struct AppEventConnectionStatusChangedPayload { + pub status: ConnectionStatusKind, +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DirectoryService { + pub id: String, + pub description: String, + pub items: Vec, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct HarbourMasterService { + pub service_provider_client_id: String, + pub gateway_identity_key: String, + pub ip_address: String, + pub last_successful_ping_utc: String, + pub last_updated_utc: String, + pub routing_score: f32, +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DirectoryServiceProvider { + pub id: String, + pub description: String, + /// Address of the network requester in the form "." + /// e.g. DpB3cHAchJiNBQi5FrZx2csXb1mrHkpYh9Wzf8Rjsuko.ANNWrvHqMYuertHGHUrZdBntQhpzfbWekB39qez9U2Vx@2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh + pub address: String, + /// Address of the gateway, e.g. 2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh + pub gateway: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct PagedResult { + pub page: u32, + pub size: u32, + pub total: i32, + pub items: Vec, +} diff --git a/nym-connect-android/src-tauri/src/operations/connection/connect.rs b/nym-connect-android/src-tauri/src/operations/connection/connect.rs new file mode 100644 index 0000000000..1d83748698 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/connection/connect.rs @@ -0,0 +1,68 @@ +use crate::{ + error::{BackendError, Result}, + models::ConnectResult, + tasks, State, +}; +use std::sync::Arc; +use tokio::sync::RwLock; + +#[tauri::command] +pub async fn start_connecting( + state: tauri::State<'_, Arc>>, + window: tauri::Window, +) -> Result { + log::trace!("Start connecting"); + let (msg_receiver, exit_status_receiver) = { + let mut state_w = state.write().await; + state_w.start_connecting(&window).await? + }; + + // Setup task for checking status + let state = state.inner().clone(); + tasks::start_disconnect_listener(state.clone(), window.clone(), exit_status_receiver); + tasks::start_status_listener(state, window.clone(), msg_receiver); + + Ok(ConnectResult { + address: "PLACEHOLDER".to_string(), + }) +} + +#[tauri::command] +pub async fn get_service_provider(state: tauri::State<'_, Arc>>) -> Result { + let guard = state.read().await; + guard + .get_service_provider() + .clone() + .ok_or(BackendError::NoServiceProviderSet) +} + +#[tauri::command] +pub async fn set_service_provider( + service_provider: Option, + state: tauri::State<'_, Arc>>, +) -> Result<()> { + log::trace!("Setting service_provider: {:?}", &service_provider); + let mut guard = state.write().await; + guard.set_service_provider(service_provider); + Ok(()) +} + +#[tauri::command] +pub async fn get_gateway(state: tauri::State<'_, Arc>>) -> Result { + let guard = state.read().await; + guard + .get_gateway() + .clone() + .ok_or(BackendError::NoGatewaySet) +} + +#[tauri::command] +pub async fn set_gateway( + gateway: Option, + state: tauri::State<'_, Arc>>, +) -> Result<()> { + log::trace!("Setting gateway: {:?}", &gateway); + let mut guard = state.write().await; + guard.set_gateway(gateway); + Ok(()) +} diff --git a/nym-connect-android/src-tauri/src/operations/connection/disconnect.rs b/nym-connect-android/src-tauri/src/operations/connection/disconnect.rs new file mode 100644 index 0000000000..b75bf49410 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/connection/disconnect.rs @@ -0,0 +1,20 @@ +use crate::error::Result; +use crate::models::ConnectResult; +use crate::State; +use std::sync::Arc; +use tokio::sync::RwLock; + +#[tauri::command] +pub async fn start_disconnecting( + state: tauri::State<'_, Arc>>, + window: tauri::Window, +) -> Result { + log::trace!("Start disconnecting"); + let mut guard = state.write().await; + + guard.start_disconnecting(&window).await?; + + Ok(ConnectResult { + address: "PLACEHOLDER".to_string(), + }) +} diff --git a/nym-connect-android/src-tauri/src/operations/connection/health_check.rs b/nym-connect-android/src-tauri/src/operations/connection/health_check.rs new file mode 100644 index 0000000000..3f401933a1 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/connection/health_check.rs @@ -0,0 +1,26 @@ +use serde::{Deserialize, Serialize}; + +static HEALTH_CHECK_URL: &str = "https://nymtech.net/.wellknown/connect/healthcheck.json"; + +#[derive(Serialize, Deserialize, Debug)] +struct ConnectionSuccess { + status: String, +} + +pub async fn run_health_check() -> bool { + log::info!("Running network health check"); + match crate::operations::http::socks5_get::<_, ConnectionSuccess>(HEALTH_CHECK_URL).await { + Ok(res) if res.status == "ok" => { + log::info!("Healthcheck success!"); + true + } + Ok(res) => { + log::error!("Healthcheck failed with status: {}", res.status); + false + } + Err(err) => { + log::error!("Healthcheck failed: {err}"); + false + } + } +} diff --git a/nym-connect-android/src-tauri/src/operations/connection/mod.rs b/nym-connect-android/src-tauri/src/operations/connection/mod.rs new file mode 100644 index 0000000000..171d07cd83 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/connection/mod.rs @@ -0,0 +1,4 @@ +pub mod connect; +pub mod disconnect; +pub mod health_check; +pub mod status; diff --git a/nym-connect-android/src-tauri/src/operations/connection/status.rs b/nym-connect-android/src-tauri/src/operations/connection/status.rs new file mode 100644 index 0000000000..7710524fb5 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/connection/status.rs @@ -0,0 +1,44 @@ +use crate::error::Result; +use crate::tasks; +use std::sync::Arc; + +use tokio::sync::RwLock; + +use crate::models::{ConnectionStatusKind, ConnectivityTestResult, GatewayConnectionStatusKind}; +use crate::state::State; + +#[tauri::command] +pub async fn get_connection_status( + state: tauri::State<'_, Arc>>, +) -> Result { + let state = state.read().await; + Ok(state.get_status()) +} + +#[tauri::command] +pub async fn get_gateway_connection_status( + state: tauri::State<'_, Arc>>, +) -> Result { + let mut state_w = state.write().await; + let gateway_connectivity = state_w.get_gateway_connectivity(); + Ok(gateway_connectivity.into()) +} + +#[tauri::command] +pub async fn get_connection_health_check_status( + state: tauri::State<'_, Arc>>, +) -> Result { + let state = state.read().await; + Ok(state.get_connectivity_test_result()) +} + +// Start a connection check task. This should return with an event within one minute, and update +// the state. +// Trying to run multiple concurrent connection checks probably works but is not supported. +#[tauri::command] +pub fn start_connection_health_check_task( + state: tauri::State<'_, Arc>>, + window: tauri::Window, +) { + tasks::start_connection_check(state.inner().clone(), window); +} diff --git a/nym-connect-android/src-tauri/src/operations/directory/mod.rs b/nym-connect-android/src-tauri/src/operations/directory/mod.rs new file mode 100644 index 0000000000..efc2ba175b --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/directory/mod.rs @@ -0,0 +1,51 @@ +use itertools::Itertools; + +use crate::error::Result; +use crate::models::{DirectoryService, HarbourMasterService, PagedResult}; + +static SERVICE_PROVIDER_WELLKNOWN_URL: &str = + "https://nymtech.net/.wellknown/connect/service-providers.json"; + +static HARBOUR_MASTER_URL: &str = "https://harbourmaster.nymtech.net/v1/services/?size=100"; + +#[tauri::command] +pub async fn get_services() -> Result> { + log::trace!("Fetching services"); + let res = reqwest::get(SERVICE_PROVIDER_WELLKNOWN_URL) + .await? + .json::>() + .await?; + log::trace!("Received: {:#?}", res); + + // TODO: get paged + log::trace!("Fetching active services"); + let active_services = reqwest::get(HARBOUR_MASTER_URL) + .await? + .json::>() + .await?; + log::trace!("Active: {:#?}", active_services); + + let mut filtered: Vec = vec![]; + + for service in &res { + let items: _ = service + .items + .clone() + .into_iter() + .filter(|sp| { + active_services + .items + .iter() + .any(|active| active.service_provider_client_id == sp.address) + }) + .collect_vec(); + log::trace!("service = {} has {} items", service.id, items.len()); + filtered.push(DirectoryService { + id: service.id.clone(), + description: service.description.clone(), + items, + }) + } + + Ok(filtered) +} diff --git a/nym-connect-android/src-tauri/src/operations/export.rs b/nym-connect-android/src-tauri/src/operations/export.rs new file mode 100644 index 0000000000..93c2e81bc8 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/export.rs @@ -0,0 +1,91 @@ +use std::{ffi::OsStr, fs, sync::Arc}; +use tokio::sync::RwLock; + +use crate::{ + error::{BackendError, Result}, + state::State, +}; +use client_core::client::key_manager::KeyManager; +use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder; +use crypto::asymmetric::identity; + +pub async fn get_identity_key( + state: &tauri::State<'_, Arc>>, +) -> Result> { + let config = { + let state = state.read().await; + state.load_socks5_config()? + }; + + let pathfinder = ClientKeyPathfinder::new_from_config(config.get_base()); + let key_manager = KeyManager::load_keys(&pathfinder)?; + let identity_keypair = key_manager.identity_keypair(); + + Ok(identity_keypair) +} + +/// Export the gateway keys as a JSON string blob +#[tauri::command] +pub async fn export_keys(state: tauri::State<'_, Arc>>) -> Result { + let config = { + let state = state.read().await; + state.load_socks5_config()? + }; + + // Get key paths + let ack_key_file = config.get_base().get_ack_key_file(); + let gateway_shared_key_file = config.get_base().get_gateway_shared_key_file(); + + let pub_id_key_file = config.get_base().get_public_identity_key_file(); + let priv_id_key_file = config.get_base().get_private_identity_key_file(); + + let pub_enc_key_file = config.get_base().get_public_encryption_key_file(); + let priv_enc_key_file = config.get_base().get_private_encryption_key_file(); + + // Read file contents + let ack_key = fs::read_to_string(ack_key_file.clone())?; + let gateway_shared_key = fs::read_to_string(gateway_shared_key_file.clone())?; + + let pub_id_key = fs::read_to_string(pub_id_key_file.clone())?; + let priv_id_key = fs::read_to_string(priv_id_key_file.clone())?; + + let pub_enc_key = fs::read_to_string(pub_enc_key_file.clone())?; + let priv_enc_key = fs::read_to_string(priv_enc_key_file.clone())?; + + let ack_key_file = ack_key_file + .file_name() + .map(OsStr::to_string_lossy) + .ok_or(BackendError::CouldNotGetFilename)?; + let gateway_shared_key_file = gateway_shared_key_file + .file_name() + .map(OsStr::to_string_lossy) + .ok_or(BackendError::CouldNotGetFilename)?; + let pub_id_key_file = pub_id_key_file + .file_name() + .map(OsStr::to_string_lossy) + .ok_or(BackendError::CouldNotGetFilename)?; + let priv_id_key_file = priv_id_key_file + .file_name() + .map(OsStr::to_string_lossy) + .ok_or(BackendError::CouldNotGetFilename)?; + let pub_enc_key_file = pub_enc_key_file + .file_name() + .map(OsStr::to_string_lossy) + .ok_or(BackendError::CouldNotGetFilename)?; + let priv_enc_key_file = priv_enc_key_file + .file_name() + .map(OsStr::to_string_lossy) + .ok_or(BackendError::CouldNotGetFilename)?; + + // Format and return as json + let json = serde_json::json!({ + ack_key_file: ack_key, + gateway_shared_key_file: gateway_shared_key, + pub_id_key_file: pub_id_key, + priv_id_key_file: priv_id_key, + pub_enc_key_file: pub_enc_key, + priv_enc_key_file: priv_enc_key, + }); + + Ok(serde_json::to_string_pretty(&json)?) +} diff --git a/nym-connect-android/src-tauri/src/operations/growth/api_client.rs b/nym-connect-android/src-tauri/src/operations/growth/api_client.rs new file mode 100644 index 0000000000..c069cb6a9d --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/growth/api_client.rs @@ -0,0 +1,270 @@ +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +#[allow(unused)] +#[derive(Error, Debug)] +pub enum ApiClientError { + #[error("{source}")] + Reqwest { + #[from] + source: reqwest::Error, + }, + #[error("{source}")] + SerdeJson { + #[from] + source: serde_json::Error, + }, + #[error("{0}")] + Status(String), +} + +const API_BASE_URL: &str = "https://growth-api.nymtech.net"; + +// For development mode, switch to this +// const API_BASE_URL: &str = "http://localhost:8000"; + +#[derive(Debug, Clone)] +pub struct GrowthApiClient { + base_url: String, +} + +impl GrowthApiClient { + pub fn new(resource_base: &str) -> Self { + let base_url = std::env::var("API_BASE_URL").unwrap_or_else(|_| API_BASE_URL.to_string()); + GrowthApiClient { + base_url: format!("{base_url}{resource_base}"), + } + } + + pub fn registrations() -> Registrations { + Registrations::new(GrowthApiClient::new("/v1/tne")) + } + + pub fn daily_draws() -> DailyDraws { + DailyDraws::new(GrowthApiClient::new("/v1/tne/daily_draw")) + } + + pub(crate) async fn get(&self, url: &str) -> Result { + log::info!(">>> GET {}", url); + let proxy = reqwest::Proxy::all("socks5h://127.0.0.1:1080")?; + let client = reqwest::Client::builder() + .proxy(proxy) + .timeout(std::time::Duration::from_secs(10)) + .build()?; + + match client.get(format!("{}{}", self.base_url, url)).send().await { + Ok(res) => { + if res.status().is_client_error() || res.status().is_server_error() { + log::error!("<<< {}", res.status()); + return Err(ApiClientError::Status(res.status().to_string())); + } + match res.text().await { + Ok(response_body) => { + log::info!("<<< {}", response_body); + match serde_json::from_str(&response_body) { + Ok(res) => Ok(res), + Err(e) => { + log::error!("<<< JSON parsing error: {}", e); + Err(e.into()) + } + } + } + Err(e) => { + log::error!("<<< Request error: {}", e); + Err(e.into()) + } + } + } + Err(e) => { + log::error!("<<< Response parsing error: {}", e); + Err(e.into()) + } + } + } + + // TODO: use the method in `operations::http` instead + pub(crate) async fn post( + &self, + url: &str, + body: &REQ, + ) -> Result { + log::info!(">>> POST {}", url); + let proxy = reqwest::Proxy::all("socks5h://127.0.0.1:1080")?; + let client = reqwest::Client::builder() + .proxy(proxy) + .timeout(std::time::Duration::from_secs(10)) + .build()?; + + match client + .post(format!("{}{}", self.base_url, url)) + .json(body) + .send() + .await + { + Ok(res) => { + if res.status().is_client_error() || res.status().is_server_error() { + log::error!("<<< {}", res.status()); + return Err(ApiClientError::Status(res.status().to_string())); + } + match res.text().await { + Ok(response_body) => { + log::info!("<<< {}", response_body); + match serde_json::from_str(&response_body) { + Ok(res) => Ok(res), + Err(e) => { + log::error!("<<< JSON parsing error: {}", e); + Err(e.into()) + } + } + } + Err(e) => { + log::error!("<<< Request error: {}", e); + Err(e.into()) + } + } + } + Err(e) => { + log::error!("<<< Response parsing error: {}", e); + Err(e.into()) + } + } + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct ClientIdPartial { + pub client_id: String, + pub client_id_signature: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Registration { + pub id: String, + pub client_id: String, + pub timestamp: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Ping { + pub client_id: String, + pub timestamp: String, +} + +pub struct Registrations { + client: GrowthApiClient, +} + +impl Registrations { + pub fn new(client: GrowthApiClient) -> Self { + Registrations { client } + } + + pub async fn register( + &self, + registration: &ClientIdPartial, + ) -> Result { + self.client.post("/register", ®istration).await + } + + #[allow(dead_code)] + pub async fn unregister(&self, registration: &ClientIdPartial) -> Result<(), ApiClientError> { + self.client.post("/unregister", ®istration).await + } + + #[allow(dead_code)] + pub async fn status(&self, registration: &ClientIdPartial) -> Result<(), ApiClientError> { + self.client.post("/status", ®istration).await + } + + pub async fn ping(&self, registration: &ClientIdPartial) -> Result<(), ApiClientError> { + self.client.post("/ping", ®istration).await + } + + #[allow(dead_code)] + pub async fn health(&self) -> Result<(), ApiClientError> { + self.client.get("/health").await + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct DrawEntryPartial { + pub draw_id: String, + pub client_id: String, + pub client_id_signature: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct DrawEntry { + pub id: String, + pub draw_id: String, + pub timestamp: String, + pub status: Option, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct DrawWithWordOfTheDay { + pub id: String, + pub start_utc: String, + pub end_utc: String, + pub word_of_the_day: Option, + pub last_modified: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct ClaimPartial { + pub draw_id: String, + pub registration_id: String, + pub client_id: String, + pub client_id_signature: String, + pub wallet_address: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Winner { + pub id: String, + pub client_id: String, + pub draw_id: String, + pub timestamp: String, + pub winner_reg_id: String, + pub winner_wallet_address: Option, + pub winner_claim_timestamp: Option, +} + +pub struct DailyDraws { + client: GrowthApiClient, +} + +impl DailyDraws { + pub fn new(client: GrowthApiClient) -> Self { + DailyDraws { client } + } + + pub async fn current(&self) -> Result { + self.client.get("/current").await + } + + pub async fn next(&self) -> Result { + self.client.get("/next").await + } + + #[allow(dead_code)] + pub async fn status(&self, draw_id: &str) -> Result { + self.client.get(format!("/status/{draw_id}").as_str()).await + } + + pub async fn enter(&self, entry: &DrawEntryPartial) -> Result { + self.client.post("/enter", entry).await + } + + pub async fn entries( + &self, + client_id: &ClientIdPartial, + ) -> Result, ApiClientError> { + self.client.post("/entries", client_id).await + } + + pub async fn claim(&self, claim: &ClaimPartial) -> Result { + self.client.post("/claim", claim).await + } +} diff --git a/nym-connect-android/src-tauri/src/operations/growth/assets.rs b/nym-connect-android/src-tauri/src/operations/growth/assets.rs new file mode 100644 index 0000000000..752b221916 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/growth/assets.rs @@ -0,0 +1,57 @@ +use rust_embed::RustEmbed; +extern crate yaml_rust; +use yaml_rust::YamlLoader; + +#[derive(RustEmbed)] +#[folder = "../src/components/Growth/content/"] +#[include = "*.yaml"] +#[exclude = "*.mdx"] +struct Asset; + +#[derive(Debug)] +pub struct NotificationContent { + pub title: String, + pub body: String, +} + +#[derive(Debug)] +pub struct Notifications { + pub you_are_in_draw: NotificationContent, + pub take_part: NotificationContent, +} + +pub struct Content {} + +const RESOURCE_ERROR: &str = "❌ RESOURCE ERROR"; + +fn get_as_string_or_error_message(value: &yaml_rust::Yaml) -> String { + value.as_str().unwrap_or(RESOURCE_ERROR).to_string() +} + +impl Content { + pub fn get_notifications() -> Notifications { + let content = Asset::get("en.yaml").unwrap(); + let s = std::str::from_utf8(content.data.as_ref()).unwrap(); + let content = YamlLoader::load_from_str(s).unwrap(); + let content = &content[0]; + + Notifications { + you_are_in_draw: NotificationContent { + title: get_as_string_or_error_message( + &content["testAndEarn"]["notifications"]["youAreInDraw"]["title"], + ), + body: get_as_string_or_error_message( + &content["testAndEarn"]["notifications"]["youAreInDraw"]["body"], + ), + }, + take_part: NotificationContent { + title: get_as_string_or_error_message( + &content["testAndEarn"]["notifications"]["takePart"]["title"], + ), + body: get_as_string_or_error_message( + &content["testAndEarn"]["notifications"]["takePart"]["body"], + ), + }, + } + } +} diff --git a/nym-connect-android/src-tauri/src/operations/growth/mod.rs b/nym-connect-android/src-tauri/src/operations/growth/mod.rs new file mode 100644 index 0000000000..449c1bcee2 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/growth/mod.rs @@ -0,0 +1,3 @@ +pub mod api_client; +pub mod assets; +pub mod test_and_earn; diff --git a/nym-connect-android/src-tauri/src/operations/growth/test_and_earn.rs b/nym-connect-android/src-tauri/src/operations/growth/test_and_earn.rs new file mode 100644 index 0000000000..0162fa9827 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/growth/test_and_earn.rs @@ -0,0 +1,159 @@ +use crate::error::BackendError; +use crate::operations::export::get_identity_key; +use crate::operations::growth::api_client::{ + ClaimPartial, ClientIdPartial, DrawEntry, DrawEntryPartial, DrawWithWordOfTheDay, + GrowthApiClient, Registration, Winner, +}; +use crate::State; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +#[cfg(desktop)] +use tauri::api::notification::Notification; +use tauri::Manager; +use tokio::sync::RwLock; + +async fn get_client_id( + state: &tauri::State<'_, Arc>>, +) -> Result { + let keypair = get_identity_key(state).await?; + let client_id = keypair.public_key().to_base58_string(); + let client_id_signature = keypair + .private_key() + .sign(client_id.as_bytes()) + .to_base58_string(); + Ok(ClientIdPartial { + client_id, + client_id_signature, + }) +} + +#[tauri::command] +pub async fn growth_tne_get_client_id( + state: tauri::State<'_, Arc>>, +) -> Result { + get_client_id(&state).await +} + +#[tauri::command] +pub async fn growth_tne_take_part( + app_handle: tauri::AppHandle, + state: tauri::State<'_, Arc>>, +) -> Result { + let notifications = super::assets::Content::get_notifications(); + + let client_id = get_client_id(&state).await?; + let registration = GrowthApiClient::registrations() + .register(&client_id) + .await?; + + log::info!("<<< Test&Earn: registration details: {:?}", registration); + + #[cfg(desktop)] + if let Err(e) = Notification::new(&app_handle.config().tauri.bundle.identifier) + .title(notifications.take_part.title) + .body(notifications.take_part.body) + .show() + { + log::error!("Could not show notification. Error = {:?}", e); + } + + Ok(registration) +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Draws { + pub current: Option, + pub next: Option, + pub draws: Vec, +} + +#[tauri::command] +pub async fn growth_tne_get_draws(client_details: ClientIdPartial) -> Result { + let draws_api = GrowthApiClient::daily_draws(); + + let current = draws_api.current().await.ok(); + let next = draws_api.next().await.ok(); + let draws = draws_api.entries(&client_details).await?; + + Ok(Draws { + current, + next, + draws, + }) +} + +#[tauri::command] +pub async fn growth_tne_enter_draw( + client_details: ClientIdPartial, + draw_id: String, +) -> Result { + Ok(GrowthApiClient::daily_draws() + .enter(&DrawEntryPartial { + draw_id, + client_id: client_details.client_id, + client_id_signature: client_details.client_id_signature, + }) + .await?) +} + +#[tauri::command] +pub async fn growth_tne_submit_wallet_address( + client_details: ClientIdPartial, + draw_id: String, + wallet_address: String, + registration_id: String, +) -> Result { + Ok(GrowthApiClient::daily_draws() + .claim(&ClaimPartial { + draw_id, + client_id: client_details.client_id, + client_id_signature: client_details.client_id_signature, + wallet_address, + registration_id, + }) + .await?) +} + +#[tauri::command] +pub async fn growth_tne_ping(client_details: ClientIdPartial) -> Result<(), BackendError> { + log::info!("Test&Earn is sending a ping..."); + Ok(GrowthApiClient::registrations() + .ping(&client_details) + .await?) +} + +#[cfg(desktop)] +#[tauri::command] +pub async fn growth_tne_toggle_window( + app_handle: tauri::AppHandle, + window_title: Option, +) -> Result<(), BackendError> { + if let Some(window) = app_handle.windows().get("growth") { + log::info!("Closing growth window..."); + if let Err(e) = window.close() { + log::error!("Unable to close growth window: {:?}", e); + } + return Ok(()); + } + + log::info!("Creating growth window..."); + match tauri::WindowBuilder::new( + &app_handle, + "growth", + tauri::WindowUrl::App("growth.html".into()), + ) + .title(window_title.unwrap_or_else(|| "NymConnect Test&Earn".to_string())) + .build() + { + Ok(window) => { + if let Err(e) = window.set_focus() { + log::error!("Unable to focus growth window: {:?}", e); + } + Ok(()) + } + Err(e) => { + log::error!("Unable to create growth window: {:?}", e); + Err(BackendError::NewWindowError) + } + } +} diff --git a/nym-connect-android/src-tauri/src/operations/help/log.rs b/nym-connect-android/src-tauri/src/operations/help/log.rs new file mode 100644 index 0000000000..5b31ea023e --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/help/log.rs @@ -0,0 +1,31 @@ +use crate::error::BackendError; +use tauri::Manager; + +#[cfg(desktop)] +#[tauri::command] +pub fn help_log_toggle_window(app_handle: tauri::AppHandle) -> Result<(), BackendError> { + if let Some(current_log_window) = app_handle.windows().get("log") { + log::info!("Closing log window..."); + if let Err(e) = current_log_window.close() { + log::error!("Unable to close log window: {:?}", e); + } + return Ok(()); + } + + log::info!("Creating log window..."); + match tauri::WindowBuilder::new(&app_handle, "log", tauri::WindowUrl::App("log.html".into())) + .title("Nym Connect Logs") + .build() + { + Ok(window) => { + if let Err(e) = window.set_focus() { + log::error!("Unable to focus log window: {:?}", e); + } + Ok(()) + } + Err(e) => { + log::error!("Unable to create log window: {:?}", e); + Err(BackendError::NewWindowError) + } + } +} diff --git a/nym-connect-android/src-tauri/src/operations/help/mod.rs b/nym-connect-android/src-tauri/src/operations/help/mod.rs new file mode 100644 index 0000000000..52dafe6d0f --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/help/mod.rs @@ -0,0 +1,2 @@ +pub mod log; +pub mod storage; diff --git a/nym-connect-android/src-tauri/src/operations/help/storage.rs b/nym-connect-android/src-tauri/src/operations/help/storage.rs new file mode 100644 index 0000000000..ab47ffa529 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/help/storage.rs @@ -0,0 +1,20 @@ +use crate::error::BackendError; +use serde::Serialize; +use tauri::Manager; + +#[derive(Debug, Serialize, Clone)] +struct ClearStorageEvent { + kind: String, +} + +#[tauri::command] +pub fn help_clear_storage(app_handle: tauri::AppHandle) -> Result<(), BackendError> { + log::info!("Sending event to clear local storage..."); + + let event = ClearStorageEvent { + kind: "local_storage".to_string(), + }; + app_handle.emit_all("help://clear-storage", event)?; + + Ok(()) +} diff --git a/nym-connect-android/src-tauri/src/operations/http.rs b/nym-connect-android/src-tauri/src/operations/http.rs new file mode 100644 index 0000000000..5cfe3e1f53 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/http.rs @@ -0,0 +1,37 @@ +use crate::error::{BackendError, Result}; +use serde::de::DeserializeOwned; +use tap::TapFallible; + +pub async fn socks5_get(url: U) -> Result +where + U: reqwest::IntoUrl + std::fmt::Display, + T: DeserializeOwned, +{ + log::info!(">>> GET {url}"); + let proxy = reqwest::Proxy::all("socks5h://127.0.0.1:1080")?; + let client = reqwest::Client::builder() + .proxy(proxy) + .timeout(std::time::Duration::from_secs(20)) + .build()?; + + let resp = client.get(url).send().await.tap_err(|err| { + log::error!("<<< Request send error: {err}"); + })?; + + if resp.status().is_client_error() || resp.status().is_server_error() { + log::error!("<<< {}", resp.status()); + return Err(BackendError::RequestFail { + url: resp.url().clone(), + status_code: resp.status(), + }); + } + + let response_body = resp.text().await.tap_err(|err| { + log::error!("<<< Request error: {err}"); + })?; + log::info!("<<< {response_body}"); + + Ok(serde_json::from_str(&response_body).tap_err(|err| { + log::error!("<<< JSON parsing error: {err}"); + })?) +} diff --git a/nym-connect-android/src-tauri/src/operations/mod.rs b/nym-connect-android/src-tauri/src/operations/mod.rs new file mode 100644 index 0000000000..4a79ddd1b4 --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/mod.rs @@ -0,0 +1,8 @@ +pub mod connection; +pub mod directory; +pub mod export; +pub mod growth; +pub mod help; +pub mod http; +#[cfg(desktop)] +pub mod window; diff --git a/nym-connect-android/src-tauri/src/operations/window/mod.rs b/nym-connect-android/src-tauri/src/operations/window/mod.rs new file mode 100644 index 0000000000..b89cdb88ff --- /dev/null +++ b/nym-connect-android/src-tauri/src/operations/window/mod.rs @@ -0,0 +1,7 @@ +use crate::window::window_hide; +use tauri::{AppHandle, Wry}; + +#[tauri::command] +pub fn hide_window(app: AppHandle) { + window_hide(&app); +} diff --git a/nym-connect-android/src-tauri/src/state.rs b/nym-connect-android/src-tauri/src/state.rs new file mode 100644 index 0000000000..f98dc3baea --- /dev/null +++ b/nym-connect-android/src-tauri/src/state.rs @@ -0,0 +1,267 @@ +use std::time::Duration; + +use ::config_common::NymConfig; +use client_core::client::key_manager::KeyManager; +use client_core::error::ClientCoreStatusMessage; +use futures::SinkExt; +use tap::TapFallible; +use tauri::Manager; + +use nym_socks5::client::{ + config::Config as Socks5Config, Socks5ControlMessage, Socks5ControlMessageSender, +}; +use tokio::time::Instant; + +use crate::{ + config::{self, socks5_config_id_appended_with, Config}, + error::{BackendError, Result}, + models::{ + AppEventConnectionStatusChangedPayload, ConnectionStatusKind, ConnectivityTestResult, + APP_EVENT_CONNECTION_STATUS_CHANGED, + }, + tasks::{self, ExitStatusReceiver}, +}; + +// The client will emit messages if the connection to the gateway is poor (or the gateway can't +// keep up with the messages we are sendind). If no messages about this has been received for a +// certain duration then we assume it's all good. +const GATEWAY_CONNECTIVITY_TIMEOUT_SECS: u64 = 20; + +#[derive(Clone, Copy, Default)] +pub enum GatewayConnectivity { + #[default] + Good, + Bad { + when: Instant, + }, + VeryBad { + when: Instant, + }, +} + +impl TryFrom<&ClientCoreStatusMessage> for GatewayConnectivity { + type Error = BackendError; + + fn try_from(value: &ClientCoreStatusMessage) -> Result { + let conn = match value { + ClientCoreStatusMessage::GatewayIsSlow => GatewayConnectivity::Bad { + when: Instant::now(), + }, + ClientCoreStatusMessage::GatewayIsVerySlow => GatewayConnectivity::VeryBad { + when: Instant::now(), + }, + }; + Ok(conn) + } +} + +#[derive(Default)] +pub struct State { + /// The current connection status + status: ConnectionStatusKind, + + /// The service provider + service_provider: Option, + + /// The gateway used. Note that this is also used to create the configuration id + gateway: Option, + + /// Channel that is used to send command messages to the SOCKS5 client, such as to disconnect + socks5_client_sender: Option, + + /// The client will periodically report connectivity to the gateway it's connected to. Unless + /// we get a status message from the client we assume it's good. + gateway_connectivity: GatewayConnectivity, + + /// The latest end-to-end connectivity test result. The first test is initiated on connection + /// established. Additional tests can be triggered. + connectivity_test_result: ConnectivityTestResult, +} + +impl State { + pub fn new() -> Self { + State { + status: ConnectionStatusKind::Disconnected, + service_provider: None, + gateway: None, + socks5_client_sender: None, + gateway_connectivity: GatewayConnectivity::Good, + connectivity_test_result: ConnectivityTestResult::NotAvailable, + } + } + + pub fn get_gateway_connectivity(&mut self) -> GatewayConnectivity { + self.gateway_connectivity = match self.gateway_connectivity { + c @ (GatewayConnectivity::Bad { when } | GatewayConnectivity::VeryBad { when }) => { + if Instant::now() > when + Duration::from_secs(GATEWAY_CONNECTIVITY_TIMEOUT_SECS) { + GatewayConnectivity::Good + } else { + c + } + } + current => current, + }; + self.gateway_connectivity + } + + pub fn set_gateway_connectivity(&mut self, gateway_connectivity: GatewayConnectivity) { + self.gateway_connectivity = gateway_connectivity + } + + pub fn get_connectivity_test_result(&self) -> ConnectivityTestResult { + self.connectivity_test_result + } + + pub fn set_connectivity_test_result( + &mut self, + connectivity_test_result: ConnectivityTestResult, + ) { + self.connectivity_test_result = connectivity_test_result; + } + + pub fn get_status(&self) -> ConnectionStatusKind { + self.status.clone() + } + + fn set_state(&mut self, status: ConnectionStatusKind, window: &tauri::Window) { + log::info!("{status}"); + self.status = status.clone(); + window + .emit_all( + APP_EVENT_CONNECTION_STATUS_CHANGED, + AppEventConnectionStatusChangedPayload { status }, + ) + .tap_err(|err| log::warn!("{err}")) + .ok(); + } + + pub fn get_service_provider(&self) -> &Option { + &self.service_provider + } + + pub fn set_service_provider(&mut self, provider: Option) { + self.service_provider = provider; + } + + pub fn get_gateway(&self) -> &Option { + &self.gateway + } + + pub fn set_gateway(&mut self, gateway: Option) { + self.gateway = gateway; + } + + /// The effective config id is the static config id appended with the id of the gateway + pub fn get_config_id(&self) -> Result { + self.get_gateway() + .as_ref() + .ok_or(BackendError::CouldNotGetIdWithoutGateway) + .and_then(|gateway_id| socks5_config_id_appended_with(gateway_id)) + } + + pub fn load_socks5_config(&self) -> Result { + let id = self.get_config_id()?; + let config = Socks5Config::load_from_file(Some(&id)) + .tap_err(|_| log::warn!("Failed to load configuration file"))?; + Ok(config) + } + + /// Start connecting by first creating a config file, followed by starting a thread running the + /// SOCKS5 client. + pub async fn start_connecting( + &mut self, + window: &tauri::Window, + ) -> Result<(task::StatusReceiver, ExitStatusReceiver)> { + self.set_state(ConnectionStatusKind::Connecting, window); + + // Setup configuration by writing to file + //if let Err(err) = self.init_config().await { + // log::error!("Failed to initialize: {err}"); + + // // Wait a little to give the user some rudimentary feedback that the click actually + // // registered. + // tokio::time::sleep(Duration::from_secs(1)).await; + // self.set_state(ConnectionStatusKind::Disconnected, window); + // return Err(err); + //} + + let res = self.init_config().await; + match &res { + Ok(_) => {} + Err(e) => { + dbg!(e); + } + }; + let (config, keys) = res.unwrap(); + + // Kick off the main task and get the channel for controlling it + self.start_nym_socks5_client(config, keys) + } + + /// Create a configuration file + async fn init_config(&self) -> Result<(Config, KeyManager)> { + let service_provider = self + .get_service_provider() + .as_ref() + .ok_or(BackendError::CouldNotInitWithoutServiceProvider)?; + let gateway = self + .get_gateway() + .as_ref() + .ok_or(BackendError::CouldNotInitWithoutGateway)?; + log::trace!(" service_provider: {:?}", service_provider); + log::trace!(" gateway: {:?}", gateway); + + config::Config::init(service_provider, gateway).await + } + + /// Spawn a new thread running the SOCKS5 client + fn start_nym_socks5_client( + &mut self, + config: Config, + keys: KeyManager, + ) -> Result<(task::StatusReceiver, ExitStatusReceiver)> { + let id = self.get_config_id()?; + let (control_tx, msg_rx, exit_status_rx, used_gateway) = + tasks::start_nym_socks5_client(&id, config, keys)?; + self.socks5_client_sender = Some(control_tx); + self.gateway = Some(used_gateway.gateway_id); + Ok((msg_rx, exit_status_rx)) + } + + /// Once the SOCKS5 client is operational, the status listener would call this + pub fn mark_connected(&mut self, window: &tauri::Window) { + log::trace!("state::mark_connected"); + self.set_state(ConnectionStatusKind::Connected, window); + } + + /// Disconnect by sending a message to the SOCKS5 client thread. Once it has finished and is + /// disconnected, the disconnect handler will mark it as disconnected. + pub async fn start_disconnecting(&mut self, window: &tauri::Window) -> Result<()> { + log::trace!("state::start_disconnecting"); + self.set_state(ConnectionStatusKind::Disconnecting, window); + + // Send shutdown message + match self.socks5_client_sender { + Some(ref mut sender) => sender + .send(Socks5ControlMessage::Stop) + .await + .map_err(|err| { + log::warn!("Failed trying to send disconnect signal: {err}"); + BackendError::CoundNotSendDisconnectSignal + }), + None => { + log::warn!( + "Trying to disconnect without being able to talk to the SOCKS5 client, \ + is it running?" + ); + Err(BackendError::CoundNotSendDisconnectSignal) + } + } + } + + /// Once the SOCKS5 client has stopped, this should be called by the disconnect handler to mark + /// the state as disconnected. + pub fn mark_disconnected(&mut self, window: &tauri::Window) { + self.set_state(ConnectionStatusKind::Disconnected, window); + } +} diff --git a/nym-connect-android/src-tauri/src/tasks.rs b/nym-connect-android/src-tauri/src/tasks.rs new file mode 100644 index 0000000000..eb6f691825 --- /dev/null +++ b/nym-connect-android/src-tauri/src/tasks.rs @@ -0,0 +1,205 @@ +use client_core::{ + client::key_manager::KeyManager, + config::{ClientCoreConfigTrait, GatewayEndpointConfig}, + error::ClientCoreStatusMessage, +}; +use futures::{channel::mpsc, StreamExt}; +use std::sync::Arc; +use tap::TapFallible; +use task::manager::TaskStatus; +use tokio::sync::RwLock; + +use config_common::NymConfig; +use nym_socks5::client::NymClient as Socks5NymClient; +use nym_socks5::client::{config::Config as Socks5Config, Socks5ControlMessageSender}; + +use crate::{ + config::Config, + error::Result, + events::{self, emit_event, emit_status_event}, + models::{ConnectionStatusKind, ConnectivityTestResult}, + operations, + state::State, +}; + +pub type ExitStatusReceiver = futures::channel::oneshot::Receiver; + +/// Status messages sent by the SOCKS5 client task to the main tauri task. +#[derive(Debug)] +pub enum Socks5ExitStatusMessage { + /// The SOCKS5 task successfully stopped + Stopped, + /// The SOCKS5 task failed to start + Failed(Box), +} + +/// The main SOCKS5 client task. It loads the configuration from file determined by the `id`. +pub fn start_nym_socks5_client( + id: &str, + config: Config, + keys: KeyManager, +) -> Result<( + Socks5ControlMessageSender, + task::StatusReceiver, + ExitStatusReceiver, + GatewayEndpointConfig, +)> { + log::info!("Loading config from file: {id}"); + let used_gateway = config.get_base().get_gateway_endpoint().clone(); + + let socks5_client = Socks5NymClient::new_with_keys(config.socks5, Some(keys)); + log::info!("Starting socks5 client"); + + // Channel to send control messages to the socks5 client + let (socks5_ctrl_tx, socks5_ctrl_rx) = mpsc::unbounded(); + + // Channel to send status update messages from the background socks5 task to the frontend. + let (socks5_status_tx, socks5_status_rx) = mpsc::channel(128); + + // Channel to signal back to the main task when the socks5 client finishes, and why + let (socks5_exit_tx, socks5_exit_rx) = futures::channel::oneshot::channel(); + + // Spawn a separate runtime for the socks5 client so we can forcefully terminate. + // Once we can gracefully shutdown the socks5 client we can get rid of this. + // The status channel is used to both get the state of the task, and if it's closed, to check + // for panic. + std::thread::spawn(|| { + let result = tokio::runtime::Runtime::new() + .expect("Failed to create runtime for SOCKS5 client") + .block_on(async move { + socks5_client + .run_and_listen(socks5_ctrl_rx, socks5_status_tx) + .await + }); + + if let Err(err) = result { + log::error!("SOCKS5 proxy failed: {err}"); + socks5_exit_tx + .send(Socks5ExitStatusMessage::Failed(err)) + .expect("Failed to send status message back to main task"); + return; + } + + log::info!("SOCKS5 task finished"); + socks5_exit_tx + .send(Socks5ExitStatusMessage::Stopped) + .expect("Failed to send status message back to main task"); + }); + + Ok(( + socks5_ctrl_tx, + socks5_status_rx, + socks5_exit_rx, + used_gateway, + )) +} + +pub fn start_connection_check(state: Arc>, window: tauri::Window) { + log::debug!("Starting connection check handler"); + tokio::spawn(async move { + if state.read().await.get_status() != ConnectionStatusKind::Connected { + log::error!("SOCKS5 connection status check failed: not connected"); + return; + } + + log::info!("Running connection health check"); + if operations::connection::health_check::run_health_check().await { + state + .write() + .await + .set_connectivity_test_result(ConnectivityTestResult::Success); + emit_event( + "socks5-connection-success-event", + "SOCKS5 success", + "SOCKS5 connection health check successful", + &window, + ); + } else if state.read().await.get_status() == ConnectionStatusKind::Connected { + state + .write() + .await + .set_connectivity_test_result(ConnectivityTestResult::Fail); + log::error!("SOCKS5 connection health check failed"); + emit_event( + "socks5-connection-fail-event", + "SOCKS5 error", + "SOCKS5 connection health check failed", + &window, + ); + } else { + log::debug!("SOCKS5 connection status check cancelled: not connected"); + } + + log::debug!("Connection check handler exiting"); + }); +} + +/// The status listener listens for non-exit status messages from the background socks5 proxy task. +pub fn start_status_listener( + state: Arc>, + window: tauri::Window, + mut msg_receiver: task::StatusReceiver, +) { + log::info!("Starting status listener"); + + tokio::spawn(async move { + while let Some(msg) = msg_receiver.next().await { + log::info!("SOCKS5 proxy sent status message: {}", msg); + + if let Some(task_status) = msg.downcast_ref::() { + events::handle_task_status(task_status, &state, &window).await; + } else if let Some(client_status_message) = + msg.downcast_ref::() + { + events::handle_client_status_message(client_status_message, &state, &window).await; + } else { + emit_status_event("socks5-status-event", &msg, &window); + } + } + log::info!("Status listener exiting"); + }); +} + +/// The disconnect listener listens to the channel setup between the socks5 proxy task and the main +/// tauri task. Primarily it listens for shutdown messages, and updates the state accordingly. +pub fn start_disconnect_listener( + state: Arc>, + window: tauri::Window, + exit_status_receiver: ExitStatusReceiver, +) { + log::trace!("Starting disconnect listener"); + tokio::spawn(async move { + match exit_status_receiver.await { + Ok(Socks5ExitStatusMessage::Stopped) => { + log::info!("SOCKS5 task reported it has finished"); + emit_event( + "socks5-event", + "SOCKS5 finished", + "SOCKS5 task reported it has finished", + &window, + ); + } + Ok(Socks5ExitStatusMessage::Failed(err)) => { + log::info!("SOCKS5 task reported error: {err}"); + emit_event( + "socks5-event", + "SOCKS5 error", + &format!("SOCKS5 failed: {err}"), + &window, + ); + } + Err(_) => { + log::info!("SOCKS5 task appears to have stopped abruptly"); + emit_event( + "socks5-event", + "SOCKS5 error", + "SOCKS5 stopped abruptly. Please try reconnecting.", + &window, + ); + } + } + + let mut state_w = state.write().await; + state_w.mark_disconnected(&window); + }); +} diff --git a/nym-connect-android/src-tauri/src/window.rs b/nym-connect-android/src-tauri/src/window.rs new file mode 100644 index 0000000000..84cb3e41cd --- /dev/null +++ b/nym-connect-android/src-tauri/src/window.rs @@ -0,0 +1,30 @@ +use crate::menu::TRAY_MENU_SHOW_HIDE; +use tauri::{AppHandle, Manager}; + +pub(crate) fn window_hide(app: &AppHandle) { + let window = app.get_window("main").unwrap(); + let item_handle = app.tray_handle().get_item(TRAY_MENU_SHOW_HIDE); + if window.is_visible().unwrap() { + window.hide().unwrap(); + item_handle.set_title("Show").unwrap(); + } +} + +pub(crate) fn window_show(app: &AppHandle) { + let window = app.get_window("main").unwrap(); + let item_handle = app.tray_handle().get_item(TRAY_MENU_SHOW_HIDE); + if !window.is_visible().unwrap() { + window.show().unwrap(); + item_handle.set_title("Hide").unwrap(); + window.set_focus().unwrap(); + } +} + +pub(crate) fn window_toggle(app: &AppHandle) { + let window = app.get_window("main").unwrap(); + if window.is_visible().unwrap() { + window_hide(app); + } else { + window_show(app); + } +} diff --git a/nym-connect-android/src-tauri/tauri.conf.json b/nym-connect-android/src-tauri/tauri.conf.json new file mode 100644 index 0000000000..0572848f3b --- /dev/null +++ b/nym-connect-android/src-tauri/tauri.conf.json @@ -0,0 +1,77 @@ +{ + "package": { + "productName": "nym-connect-android", + "version": "1.1.7" + }, + "build": { + "distDir": "../dist", + "devPath": "http://localhost:9000", + "beforeDevCommand": "yarn webpack:dev:onlyThis", + "beforeBuildCommand": "yarn webpack:prod" + }, + "tauri": { + "bundle": { + "active": true, + "targets": "all", + "identifier": "net.nymtech.connect", + "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], + "resources": [], + "externalBin": [], + "copyright": "Copyright © 2021-2022 Nym Technologies SA", + "category": "Business", + "shortDescription": "Browse the internet privately using the Nym Mixnet", + "longDescription": "", + "deb": { + "depends": [] + }, + "macOS": { + "frameworks": [], + "minimumSystemVersion": "", + "exceptionDomain": "", + "signingIdentity": null, + "entitlements": null + }, + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + } + }, + "systemTray": { + "iconPath": "icons/tray_icon.png", + "iconAsTemplate": true + }, + "updater": { + "active": false + }, + "allowlist": { + "shell": { + "open": true + }, + "clipboard": { + "writeText": true + }, + "window": { + "startDragging": true, + "close": true, + "minimize": true + }, + "notification": { + "all": true + } + }, + "windows": [ + { + "title": "NymConnect", + "width": 240, + "height": 635, + "resizable": false, + "decorations": false, + "transparent": true + } + ], + "security": { + "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'" + } + } +} diff --git a/nym-connect-android/src/App.tsx b/nym-connect-android/src/App.tsx new file mode 100644 index 0000000000..3b3295ccd8 --- /dev/null +++ b/nym-connect-android/src/App.tsx @@ -0,0 +1,94 @@ +import React, { useEffect } from 'react'; +import { DateTime } from 'luxon'; +import { forage } from '@tauri-apps/tauri-forage'; +import { ConnectionStatusKind } from './types'; +import { useClientContext } from './context/main'; +import { DefaultLayout } from './layouts/DefaultLayout'; +import { ConnectedLayout } from './layouts/ConnectedLayout'; +import { HelpGuideLayout } from './layouts/HelpGuideLayout'; +import { useTauriEvents } from './utils'; + +export const App: FCWithChildren = () => { + const context = useClientContext(); + const [busy, setBusy] = React.useState(); + const [showInfoModal, setShowInfoModal] = React.useState(false); + useTauriEvents('help://clear-storage', (_event) => { + console.log('About to clear local storage...'); + // clear local storage + try { + forage.clear()(); + console.log('Local storage cleared'); + } catch (e) { + console.error('Failed to clear local storage', e); + } + }); + + const handleConnectClick = React.useCallback(async () => { + const currentStatus = context.connectionStatus; + if (currentStatus === ConnectionStatusKind.connected || currentStatus === ConnectionStatusKind.disconnected) { + setBusy(true); + + // eslint-disable-next-line default-case + switch (currentStatus) { + case ConnectionStatusKind.disconnected: + await context.startConnecting(); + context.setConnectedSince(DateTime.now()); + break; + case ConnectionStatusKind.connected: + await context.startDisconnecting(); + context.setConnectedSince(undefined); + break; + } + setBusy(false); + } + }, [context.connectionStatus]); + + useEffect(() => { + if (context.connectionStatus === ConnectionStatusKind.connected) setShowInfoModal(true); + }, [context.connectionStatus]); + + if (context.showHelp) return ; + + if ( + context.connectionStatus === ConnectionStatusKind.disconnected || + context.connectionStatus === ConnectionStatusKind.connecting + ) { + return ( + + ); + } + + return ( + setShowInfoModal(false)} + status={context.connectionStatus} + busy={busy} + onConnectClick={handleConnectClick} + ipAddress="127.0.0.1" + port={1080} + gatewayPerformance={context.gatewayPerformance} + connectedSince={context.connectedSince} + serviceProvider={context.serviceProvider} + stats={[ + { + label: 'in:', + totalBytes: 1024, + rateBytesPerSecond: 1024 * 1024 * 1024 + 10, + }, + { + label: 'out:', + totalBytes: 1024 * 1024 * 1024 * 1024 * 20, + rateBytesPerSecond: 1024 * 1024 + 10, + }, + ]} + /> + ); +}; diff --git a/nym-connect-android/src/assets/help-step-four.png b/nym-connect-android/src/assets/help-step-four.png new file mode 100644 index 0000000000000000000000000000000000000000..55079628923c10eaecf9243a6b99f8124d84d916 GIT binary patch literal 8530 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 fPTkx*p?>VHb2K*s*> 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�t3F0PA2oun6An$m>7S{la;2+sY51dti~ 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src/assets/help-step-two.png b/nym-connect-android/src/assets/help-step-two.png new file mode 100644 index 0000000000000000000000000000000000000000..f2910c98cf06b4d401e010be1e8ec43871171d3f GIT binary patch literal 35631 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ð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 { + const { appVersion } = useClientContext(); + + return ( + + + Version {appVersion} + + + ); +}; diff --git a/nym-connect-android/src/components/AppWindowFrame.tsx b/nym-connect-android/src/components/AppWindowFrame.tsx new file mode 100644 index 0000000000..89a68f7f66 --- /dev/null +++ b/nym-connect-android/src/components/AppWindowFrame.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Box } from '@mui/material'; +import { CustomTitleBar } from './CustomTitleBar'; +import { AppVersion } from './AppVersion'; + +export const AppWindowFrame: FCWithChildren = ({ children }) => ( + + + {children} + + +); diff --git a/nym-connect-android/src/components/ConnectionButton.tsx b/nym-connect-android/src/components/ConnectionButton.tsx new file mode 100644 index 0000000000..29fb90c1db --- /dev/null +++ b/nym-connect-android/src/components/ConnectionButton.tsx @@ -0,0 +1,168 @@ +import React from 'react'; +import { ConnectionStatusKind } from '../types'; + +const getStatusFillColor = (status: ConnectionStatusKind, hover: boolean, isError: boolean): string => { + if (isError && hover) { + return '#21D072'; + } + if (isError) { + return '#40475C'; + } + + switch (status) { + case ConnectionStatusKind.disconnected: + if (hover) { + return '#FFFF33'; + } + return '#FFE600'; + case ConnectionStatusKind.connecting: + case ConnectionStatusKind.disconnecting: + return '#FFE600'; + default: + // connected + if (hover) { + return '#E43E3E'; + } + return '#21D072'; + } +}; + +const getStatusText = (status: ConnectionStatusKind, hover: boolean): string => { + switch (status) { + case ConnectionStatusKind.disconnected: + return 'Connect'; + case ConnectionStatusKind.connecting: + return 'Connecting'; + case ConnectionStatusKind.disconnecting: + return 'Connected'; + default: + // connected + if (hover) { + return 'Disconnect'; + } + return 'Connected'; + } +}; + +export const ConnectionButton: FCWithChildren<{ + status: ConnectionStatusKind; + disabled?: boolean; + busy?: boolean; + isError?: boolean; + onClick?: (status: ConnectionStatusKind) => void; +}> = ({ status, disabled, isError, onClick }) => { + const [hover, setHover] = React.useState(false); + + const handleClick = React.useCallback(() => { + if (disabled === true) { + return; + } + if (onClick) { + onClick(status); + } + }, [status, disabled]); + + const statusText = getStatusText(status, hover); + const statusTextColor = isError ? '#40475C' : '#FFF'; + const statusFillColor = getStatusFillColor(status, hover, Boolean(isError)); + + return ( + + !disabled && setHover(true)} + onMouseLeave={() => !disabled && setHover(false)} + > + + + + + + + + + + {status === ConnectionStatusKind.connected && hover ? ( + + ) : ( + + )} + + {statusText} + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/nym-connect-android/src/components/ConnectionStats.tsx b/nym-connect-android/src/components/ConnectionStats.tsx new file mode 100644 index 0000000000..f17833e66d --- /dev/null +++ b/nym-connect-android/src/components/ConnectionStats.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { Box, Typography } from '@mui/material'; +import prettyBytes from 'pretty-bytes'; + +export interface ConnectionStatsItem { + label: string; + rateBytesPerSecond: number; + totalBytes: number; +} + +const FONT_SIZE = '14px'; + +export const ConnectionStats: FCWithChildren<{ + stats: ConnectionStatsItem[]; +}> = ({ stats }) => ( + +

+ {stats.map((stat) => ( + + {stat.label} + + ))} +
+
+ {stats.map((stat) => ( + + {formatRate(stat.rateBytesPerSecond)} + + ))} +
+
+ {stats.map((stat) => ( + + {formatTotal(stat.totalBytes)} + + ))} +
+ +); + +export function formatRate(bytesPerSecond: number): string { + return `${prettyBytes(bytesPerSecond)}/s`; +} + +export function formatTotal(totalBytes: number): string { + return prettyBytes(totalBytes); +} diff --git a/nym-connect-android/src/components/ConnectionStatus.tsx b/nym-connect-android/src/components/ConnectionStatus.tsx new file mode 100644 index 0000000000..c8dadd2e67 --- /dev/null +++ b/nym-connect-android/src/components/ConnectionStatus.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { Box, CircularProgress, Tooltip, Typography } from '@mui/material'; +import { DateTime } from 'luxon'; +import { ConnectionStatusKind, GatewayPerformance } from '../types'; +import { ServiceProvider } from '../types/directory'; +import { ServiceProviderInfo } from './ServiceProviderInfo'; + +const FONT_SIZE = '10px'; +const FONT_WEIGHT = '600'; +const FONT_STYLE = 'normal'; + +const ConnectionStatusContent: FCWithChildren<{ + status: ConnectionStatusKind; +}> = ({ status }) => { + switch (status) { + case ConnectionStatusKind.connected: + return ( + + Connected to + + ); + case ConnectionStatusKind.disconnecting: + return ( + + + + Disconnecting... + + + ); + case ConnectionStatusKind.connecting: + return ( + + + + Connecting... + + + ); + case ConnectionStatusKind.disconnected: + return ( + + You are not protected + + ); + default: + return null; + } +}; + +export const ConnectionStatus: FCWithChildren<{ + status: ConnectionStatusKind; + gatewayPerformance?: GatewayPerformance; + connectedSince?: DateTime; + serviceProvider?: ServiceProvider; +}> = ({ status, serviceProvider, gatewayPerformance }) => { + const color = + status === ConnectionStatusKind.connected || status === ConnectionStatusKind.disconnecting + ? '#21D072' + : 'warning.main'; + + return ( + <> + + {status === ConnectionStatusKind.connected && gatewayPerformance !== 'Good' ? ( + + Gateway has issues + + ) : ( + + )} + + {serviceProvider ? ( + }> + + {serviceProvider && {serviceProvider.description}} + + + ) : null} + + ); +}; diff --git a/nym-connect-android/src/components/ConntectionTimer.tsx b/nym-connect-android/src/components/ConntectionTimer.tsx new file mode 100644 index 0000000000..25e2af8d9c --- /dev/null +++ b/nym-connect-android/src/components/ConntectionTimer.tsx @@ -0,0 +1,26 @@ +import React, { useEffect } from 'react'; +import { Stack, Typography } from '@mui/material'; +import { DateTime } from 'luxon'; + +export const ConnectionTimer = ({ connectedSince }: { connectedSince?: DateTime }) => { + const [duration, setDuration] = React.useState(); + useEffect(() => { + const intervalId = setInterval(() => { + if (connectedSince) { + setDuration(DateTime.now().diff(connectedSince).toFormat('hh:mm:ss')); + } + }, 500); + return () => { + clearInterval(intervalId); + }; + }, [connectedSince]); + + return ( + + + Connection time + + {duration || '00:00:00'} + + ); +}; diff --git a/nym-connect-android/src/components/CopyToClipboard.tsx b/nym-connect-android/src/components/CopyToClipboard.tsx new file mode 100644 index 0000000000..7a48662190 --- /dev/null +++ b/nym-connect-android/src/components/CopyToClipboard.tsx @@ -0,0 +1,69 @@ +import React, { useEffect, useState } from 'react'; +import { Button, IconButton, Tooltip } from '@mui/material'; +import { Check, ContentCopy } from '@mui/icons-material'; +import { clipboard } from '@tauri-apps/api'; + +export const CopyToClipboard = ({ + text = '', + light, + iconButton, +}: { + text?: string; + light?: boolean; + iconButton?: boolean; +}) => { + const [copied, setCopied] = useState(false); + + const handleCopy = async (textToCopy: string) => { + try { + if (clipboard) { + await clipboard.writeText(textToCopy); + } else { + await navigator.clipboard.writeText(textToCopy); + } + setCopied(true); + } catch (e) { + console.log(`failed to copy: ${e}`); + } + }; + + useEffect(() => { + let timer: NodeJS.Timeout; + if (copied) { + timer = setTimeout(() => { + setCopied(false); + }, 2000); + } + return () => clearTimeout(timer); + }, [copied]); + + if (iconButton) + return ( + + handleCopy(text)} + size="small" + sx={{ + color: (theme) => (light ? theme.palette.common.white : theme.palette.nym.background.dark), + }} + > + {!copied ? : } + + + ); + + return ( + + ); +}; diff --git a/nym-connect-android/src/components/CustomTitleBar.tsx b/nym-connect-android/src/components/CustomTitleBar.tsx new file mode 100644 index 0000000000..7f4faa0918 --- /dev/null +++ b/nym-connect-android/src/components/CustomTitleBar.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { ArrowBack, HelpOutline } from '@mui/icons-material'; +import { Box, IconButton } from '@mui/material'; +import { NymWordmark } from '@nymproject/react/logo/NymWordmark'; +import { useClientContext } from 'src/context/main'; + +const customTitleBarStyles = { + titlebar: { + background: '#1D2125', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + padding: '16px', + paddingBottom: '0px', + borderTopLeftRadius: '12px', + borderTopRightRadius: '12px', + }, +}; + +const CustomButton = ({ Icon, onClick }: { Icon: React.JSXElementConstructor; onClick: () => void }) => ( + + + +); + +export const CustomTitleBar = () => { + const { showHelp, handleShowHelp } = useClientContext(); + return ( + + {/* set width to keep logo centered */} + + { + handleShowHelp(); + }} + /> + + + + + ); +}; diff --git a/nym-connect-android/src/components/Error.tsx b/nym-connect-android/src/components/Error.tsx new file mode 100644 index 0000000000..f582536b6b --- /dev/null +++ b/nym-connect-android/src/components/Error.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { FallbackProps } from 'react-error-boundary'; +import { Alert, AlertTitle, Button } from '@mui/material'; + +export const ErrorFallback = ({ error, resetErrorBoundary }: FallbackProps) => ( +
+ + {error.name} + {error.message} + + + Stack trace + {error.stack} + + +
+); diff --git a/nym-connect-android/src/components/ErrorFallback.tsx b/nym-connect-android/src/components/ErrorFallback.tsx new file mode 100644 index 0000000000..f582536b6b --- /dev/null +++ b/nym-connect-android/src/components/ErrorFallback.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { FallbackProps } from 'react-error-boundary'; +import { Alert, AlertTitle, Button } from '@mui/material'; + +export const ErrorFallback = ({ error, resetErrorBoundary }: FallbackProps) => ( +
+ + {error.name} + {error.message} + + + Stack trace + {error.stack} + + +
+); diff --git a/nym-connect-android/src/components/Growth/TestAndEarnButtonArea.tsx b/nym-connect-android/src/components/Growth/TestAndEarnButtonArea.tsx new file mode 100644 index 0000000000..92c88ec321 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnButtonArea.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { Badge, Box, Button, Tooltip } from '@mui/material'; +import MonetizationOnIcon from '@mui/icons-material/MonetizationOn'; +import { invoke } from '@tauri-apps/api'; +import Content from './content/en.yaml'; +import { useClientContext } from '../../context/main'; +import { useTestAndEarnContext } from './context/TestAndEarnContext'; +import { NymShipyardTheme } from '../../theme'; +import { ConnectionStatusKind } from '../../types'; + +export const Wrapper: FCWithChildren<{ disabled: boolean }> = ({ disabled, children }) => { + if (disabled) { + return ( + + +
{children}
+
+
+ ); + } + // eslint-disable-next-line react/jsx-no-useless-fragment + return <>{children}; +}; + +export const TestAndEarnButtonArea: FCWithChildren = () => { + const clientContext = useClientContext(); + const context = useTestAndEarnContext(); + const disabled = clientContext.connectionStatus !== ConnectionStatusKind.connected; + const pinger = React.useRef(); + + const doPing = async () => { + if (context.clientDetails) { + try { + await invoke('growth_tne_ping', { clientDetails: context.clientDetails }); + } catch (_e) { + // console.error('Failed to ping: ', e); + } + } + }; + + React.useEffect(() => { + (async () => { + if (!disabled) { + // sleep a little until the SOCKS5 proxy connects + setTimeout(() => { + doPing(); + }, 1000 * 10); + + // update every 15 mins + pinger.current = setInterval(doPing, 1000 * 60 * 15); + } else if (pinger.current) { + clearInterval(pinger.current); + pinger.current = null; + } + })(); + }, [disabled, context.clientDetails]); + + const handleClick = async () => { + if (!disabled) { + await context.toggleGrowthWindow(Content.testAndEarn.popupWindow.title); + } + }; + + return ( + + + + + + + + ); +}; diff --git a/nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx b/nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx new file mode 100644 index 0000000000..99b9206e7a --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx @@ -0,0 +1,94 @@ +import * as React from 'react'; +import { ComponentMeta } from '@storybook/react'; +import { DateTime, Duration } from 'luxon'; +import { + TestAndEarnCurrentDraw, + TestAndEarnCurrentDrawEntered, + TestAndEarnCurrentDrawFuture, +} from './TestAndEarnCurrentDraw'; +import { NymShipyardTheme } from '../../theme'; +import { DrawEntryStatus } from './context/types'; +import { testMarkdown } from './context/mocks/TestAndEarnContext'; + +export default { + title: 'Growth/TestAndEarn/Components/Cards/Current Draw', + component: TestAndEarnCurrentDraw, +} as ComponentMeta; + +export const Valid = () => ( + + + +); + +export const EnteredMalformedDraw = () => ( + + + +); + +export const EnteredDraw = () => ( + + + +); + +export const Future = () => ( + + + +); diff --git a/nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.tsx b/nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.tsx new file mode 100644 index 0000000000..5f43f8054e --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.tsx @@ -0,0 +1,192 @@ +import React from 'react'; +import LoadingButton from '@mui/lab/LoadingButton'; +import { Alert, AlertTitle, Box, Card, CardContent, CardMedia, Link, Typography } from '@mui/material'; +import { SxProps } from '@mui/system'; +import { DateTime } from 'luxon'; +import ReactMarkdown from 'react-markdown'; +import assetAnimation from './content/assets/matrix.webp'; +import { CopyToClipboard } from '../CopyToClipboard'; +import { useTestAndEarnContext } from './context/TestAndEarnContext'; +import { DrawEntryStatus, DrawWithWordOfTheDay } from './context/types'; +import Content from './content/en.yaml'; + +export const TestAndEarnCurrentDrawFuture: FCWithChildren<{ draw?: DrawWithWordOfTheDay }> = ({ draw }) => { + const startsUtc = React.useMemo(() => draw && DateTime.fromISO(draw.start_utc), [draw?.start_utc]); + const startsIn = React.useMemo(() => { + if (draw && startsUtc) { + return startsUtc.toRelative(); + } + return undefined; + }, [draw?.start_utc]); + + if (!draw || !startsUtc) { + return null; + } + return ( + + +

+ {Content.testAndEarn.draw.next.header} {startsIn} ⏰ +

+

on {startsUtc.toLocaleString(DateTime.DATETIME_FULL)}

+
+
+ ); +}; + +export const TestAndEarnCurrentDrawEnter: FCWithChildren<{ draw?: DrawWithWordOfTheDay }> = ({ draw }) => { + const context = useTestAndEarnContext(); + const [busy, setBusy] = React.useState(false); + const [error, setError] = React.useState(); + const handleClick = async () => { + if (!draw) { + setError('No draw selected'); + return; + } + + setBusy(true); + try { + await context.enterDraw(draw.id); + } catch (e) { + const message = `${e}`; + console.error('Could not enter draw', message); + setError(message); + } + setBusy(false); + }; + return ( + + Complete today’s task for the chance to earn 1000 NYMs. + + Start task ✨ + + {error && ( + + + Oh no! Something went wrong. + {error} + + + )} + + ); +}; + +export const TestAndEarnCurrentDrawEntered: FCWithChildren<{ draw?: DrawWithWordOfTheDay }> = ({ draw }) => { + if (!draw || !draw.entry) { + return null; + } + + if (!draw.word_of_the_day) { + return ( + + Oh no! Something is wrong + Someone configured the wrong instructions for the task, you will not be able to see it until this is fixed + + ); + } + + return ( + + + {draw.word_of_the_day} + + + {Content.testAndEarn.task.afterText} + + {draw.entry.id} + + + {Content.testAndEarn.task.beforeSocials} + + + Twitter + {' '} + - remember to + + @nymproject + {' '} + and use the hashtag{' '} + + #PrivacyLovesCompany + + + or + + Nym{' '} + + Telegram channel + + + + ); +}; + +export const TestAndEarnCurrentDraw: FCWithChildren<{ + draw?: DrawWithWordOfTheDay; + sx?: SxProps; +}> = ({ draw }) => { + const [trigger, setTrigger] = React.useState(DateTime.now().toISO()); + const endsUtc = React.useMemo(() => draw && DateTime.fromISO(draw.end_utc), [draw?.end_utc]); + const closesIn = React.useMemo(() => { + if (draw && endsUtc) { + return endsUtc.toRelative(); + } + return undefined; + }, [trigger, endsUtc]); + + React.useEffect(() => { + const timer = setInterval(() => setTrigger(DateTime.now().toISO()), 1000 * 3600 * 15); + return () => clearInterval(timer); + }, []); + + if (draw && closesIn && endsUtc) { + return ( + + +

+ {"Today's task ends "} + {closesIn} + + {endsUtc.weekdayLong} {endsUtc.toLocaleString(DateTime.DATETIME_FULL)} + +

+ {!draw.entry && } + {draw.entry && } +
+ +
+ ); + } + + return null; +}; + +export const TestAndEarnCurrentDrawWithState: FCWithChildren<{ + sx?: SxProps; +}> = ({ sx }) => { + const context = useTestAndEarnContext(); + + if ( + context.draws?.current?.entry?.status === DrawEntryStatus.winner || + context.draws?.current?.entry?.status === DrawEntryStatus.claimed || + context.draws?.current?.entry?.status === DrawEntryStatus.noWin + ) { + return null; + } + + if (!context.draws?.current) { + return ; + } + + return ; +}; diff --git a/nym-connect-android/src/components/Growth/TestAndEarnDraws.stories.tsx b/nym-connect-android/src/components/Growth/TestAndEarnDraws.stories.tsx new file mode 100644 index 0000000000..c70f223420 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnDraws.stories.tsx @@ -0,0 +1,19 @@ +/* eslint-disable react/jsx-pascal-case */ +import * as React from 'react'; +import { ComponentMeta } from '@storybook/react'; +import { NymShipyardTheme } from 'src/theme'; +import { TestAndEarnDraws } from './TestAndEarnDraws'; +import { MockTestAndEarnProvider_RegisteredWithAllDraws } from './context/mocks/TestAndEarnContext'; + +export default { + title: 'Growth/TestAndEarn/Components/Cards/Draws', + component: TestAndEarnDraws, +} as ComponentMeta; + +export const Draws = () => ( + + + + + +); diff --git a/nym-connect-android/src/components/Growth/TestAndEarnDraws.tsx b/nym-connect-android/src/components/Growth/TestAndEarnDraws.tsx new file mode 100644 index 0000000000..24d97b7439 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnDraws.tsx @@ -0,0 +1,196 @@ +/* eslint-disable react/jsx-no-useless-fragment */ +import React from 'react'; +import LoadingButton from '@mui/lab/LoadingButton'; +import { + Alert, + AlertTitle, + Button, + Card, + CardContent, + Chip, + Dialog, + Table, + TableBody, + TableCell, + TableContainer, + TableRow, + Tooltip, + Typography, +} from '@mui/material'; +import { SxProps } from '@mui/system'; +import { DateTime } from 'luxon'; +import { useTestAndEarnContext } from './context/TestAndEarnContext'; +import { DrawEntry, DrawEntryStatus } from './context/types'; +import { CopyToClipboard } from '../CopyToClipboard'; +import { TestAndEarnEnterWalletAddress } from './TestAndEarnEnterWalletAddress'; +import Content from './content/en.yaml'; + +const statusToText = (status: string): string => Content.testAndEarn.status.chip[status] || '-'; + +const statusToColor = (status: string): 'info' | 'success' | 'warning' | undefined => { + switch (status) { + case DrawEntryStatus.pending: + return 'info'; + case DrawEntryStatus.winner: + return 'warning'; + case DrawEntryStatus.claimed: + return 'success'; + default: + return undefined; + } +}; + +const StatusText: FCWithChildren<{ entry: DrawEntry }> = ({ entry }) => { + const context = useTestAndEarnContext(); + const [busy, setBusy] = React.useState(false); + const [error, setError] = React.useState(); + const [showWalletCapture, setShowWalletCapture] = React.useState(false); + + const clear = () => { + setShowWalletCapture(false); + setError(undefined); + setBusy(false); + }; + + const handleStartWalletCapture = async () => { + setBusy(true); + setShowWalletCapture(true); + }; + + const cancelEndWalletCapture = async () => { + setBusy(false); + setShowWalletCapture(false); + }; + + const handleEndWalletCapture = async () => { + setBusy(true); + setShowWalletCapture(false); + + if (!context.walletAddress) { + setError('Wallet address is not set'); + return; + } + if (!entry.draw_id) { + setError('Task id is not set'); + return; + } + + try { + await context.claim(entry.draw_id, context.walletAddress); + } catch (e) { + const message = `${e}`; + console.error('Failed to submit claim'); + setError(message); + } + setBusy(false); + }; + + if (error) { + return ( + + Oh no! Failed to submit claim + {error} + + + ); + } + + if (showWalletCapture) { + return ( + + + + ); + } + + switch (entry.status) { + case DrawEntryStatus.pending: + return <>{Content.testAndEarn.status.text.Pending}; + case DrawEntryStatus.winner: + return ( + <> + {Content.testAndEarn.status.text.Winner} + + {Content.testAndEarn.winner.claimButton.text} + + + ); + case DrawEntryStatus.claimed: + return <>{Content.testAndEarn.status.text.Claimed}; + case DrawEntryStatus.noWin: + return <>{Content.testAndEarn.status.text.NoWin}; + default: + return null; + } +}; + +export const TestAndEarnDraws: FCWithChildren<{ + sx?: SxProps; +}> = () => { + const context = useTestAndEarnContext(); + + const draws = React.useMemo( + () => + (context.draws?.draws || []).map((item) => ({ + ...item, + timestamp: DateTime.fromISO(item.timestamp).toLocaleString(DateTime.DATETIME_FULL), + })), + [context.draws?.draws], + ); + + if (!context.draws) { + return null; + } + + return ( + + + Here is a history of the tasks you have completed: + +

+ + {draws.map((entry) => ( + + {entry.timestamp} + + + + + + + + + + {entry.id} + + + ))} + +
+ + + + ); +}; + +export const TestAndEarnDrawsWithState: FCWithChildren<{ + sx?: SxProps; +}> = ({ sx }) => { + const context = useTestAndEarnContext(); + + const drawCount = context.draws?.draws?.length || 0; + if (drawCount < 1) { + return null; + } + + return ; +}; diff --git a/nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx b/nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx new file mode 100644 index 0000000000..0f5c4ea0de --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx @@ -0,0 +1,41 @@ +import * as React from 'react'; +import { ComponentMeta } from '@storybook/react'; +import { Box } from '@mui/material'; +import { TestAndEarnEnterWalletAddress } from './TestAndEarnEnterWalletAddress'; +import { TestAndEarnContextProvider } from './context/TestAndEarnContext'; +import { NymShipyardTheme } from '../../theme'; + +export default { + title: 'Growth/TestAndEarn/Components/Enter wallet address', + component: TestAndEarnEnterWalletAddress, +} as ComponentMeta; + +export const Empty = () => ( + + + + + + + +); + +export const ErrorValue = () => ( + + + + + + + +); + +export const ValidValue = () => ( + + + + + + + +); diff --git a/nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.tsx b/nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.tsx new file mode 100644 index 0000000000..60aea1d51b --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { WalletAddressFormField } from '@nymproject/react/account/WalletAddressFormField'; +import { SxProps } from '@mui/system'; +import { Box, Button, Paper, Stack } from '@mui/material'; +import ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight'; +import { useTestAndEarnContext } from './context/TestAndEarnContext'; + +export const TestAndEarnEnterWalletAddress: FCWithChildren<{ + initialValue?: string; + placeholder?: string; + onSubmit?: () => Promise | void; + sx?: SxProps; +}> = ({ initialValue, placeholder, onSubmit }) => { + const context = useTestAndEarnContext(); + const [isAddressValid, setAddressIsValid] = React.useState(false); + return ( + + + + + + + + + + + ); +}; diff --git a/nym-connect-android/src/components/Growth/TestAndEarnError.tsx b/nym-connect-android/src/components/Growth/TestAndEarnError.tsx new file mode 100644 index 0000000000..1ad4f94cc8 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnError.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { Box, Button } from '@mui/material'; + +export const TestAndEarnError: FCWithChildren<{ error?: string }> = ({ error = 'An error has occurred' }) => ( + + + {error} + + + +); diff --git a/nym-connect-android/src/components/Growth/TestAndEarnPopup.stories.tsx b/nym-connect-android/src/components/Growth/TestAndEarnPopup.stories.tsx new file mode 100644 index 0000000000..7e000ca093 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnPopup.stories.tsx @@ -0,0 +1,162 @@ +/* eslint-disable react/jsx-pascal-case */ +import * as React from 'react'; +import { ComponentMeta } from '@storybook/react'; +import { Alert, Box } from '@mui/material'; +import { NymShipyardTheme } from 'src/theme'; +import { TestAndEarnPopup, TestAndEarnPopupContent } from './TestAndEarnPopup'; +import { TestAndEarnContextProvider } from './context/TestAndEarnContext'; +import { MockProvider } from '../../context/mocks/main'; +import { ConnectionStatusKind } from '../../types'; +import { + MockTestAndEarnProvider_NotRegistered, + MockTestAndEarnProvider_RegisteredAndError, + MockTestAndEarnProvider_RegisteredWithDraws, + MockTestAndEarnProvider_RegisteredWithDrawsAndEntry, + MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndNoWinner, + MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndWinner, + MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndWinnerClaimed, + MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndWinnerCollectWallet, + MockTestAndEarnProvider_RegisteredWithDrawsNoCurrent, +} from './context/mocks/TestAndEarnContext'; + +export default { + title: 'Growth/TestAndEarn/Content/Popup', + component: TestAndEarnPopupContent, +} as ComponentMeta; + +const MacOSWindow: FCWithChildren<{ + width?: string | number; + height?: string | number; + title?: string; + children: React.ReactNode; +}> = ({ title, width, height, children }) => ( + + + + + + + + + + + + + + + + + + + {title || 'Window title'} + + + {children} + +); + +const Wrapper: FCWithChildren<{ text: React.ReactNode }> = ({ text }) => ( + + + {text} + + + + + +); + +export const Stage0 = () => ( + + + + + +); + +export const Stage1EnterDraw = () => ( + + + + + +); + +export const Stage2GetTask = () => ( + + + + + +); + +export const Stage3Winner = () => ( + + + + + +); + +export const Stage3NoPrize = () => ( + + + + + +); + +export const Stage4EnterWalletAddress = () => ( + + + + + +); + +export const Stage5ClaimedPrize = () => ( + + + + + +); + +export const Stage6DrawsFinished = () => ( + + + + + +); + +export const Connecting = () => ( + + + + + +); + +export const Disconnected = () => ( + + + + + +); + +export const Error = () => ( + + + + + +); diff --git a/nym-connect-android/src/components/Growth/TestAndEarnPopup.tsx b/nym-connect-android/src/components/Growth/TestAndEarnPopup.tsx new file mode 100644 index 0000000000..dc1148c1e5 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnPopup.tsx @@ -0,0 +1,118 @@ +import React from 'react'; +import { Box, CircularProgress, LinearProgress, Stack, Typography } from '@mui/material'; +import { useClientContext } from '../../context/main'; +import ErrorContent from './content/TestAndEarn/Error.mdx'; +import ContentStep0 from './content/TestAndEarn/Stage0_intro.mdx'; +import ContentNotAvailable from './content/TestAndEarnNotAvaialble.mdx'; +import { ConnectionStatusKind } from '../../types'; +import { useTestAndEarnContext } from './context/TestAndEarnContext'; +import { TestAndEarnWinnerWithState } from './TestAndEarnWinner'; +import { TestAndEarnCurrentDrawWithState } from './TestAndEarnCurrentDraw'; +import { TestAndEarnDrawsWithState } from './TestAndEarnDraws'; + +enum Stages { + mustRegister = 'mustRegister', + registered = 'registered', +} + +export const TestAndEarnPopupContent: FCWithChildren<{ + stage?: string; + connectionStatus?: ConnectionStatusKind; + error?: string; +}> = ({ connectionStatus, error, stage = Stages.mustRegister }) => { + if (error) { + return ( + + + + ); + } + + if (!connectionStatus || connectionStatus === ConnectionStatusKind.disconnected) { + return ( + + + + ); + } + + if (connectionStatus === ConnectionStatusKind.connecting || connectionStatus === ConnectionStatusKind.disconnecting) { + return ( + + + Please wait... + + ); + } + + switch (stage) { + case Stages.mustRegister: + return ( + + + + ); + case Stages.registered: + return ( + + + + + + ); + default: + return ( + + + + Waiting for task information... + + + ); + } +}; + +export const TestAndEarnPopup: FCWithChildren = () => { + const clientContext = useClientContext(); + const context = useTestAndEarnContext(); + + React.useEffect(() => { + if (clientContext.connectionStatus === ConnectionStatusKind.connected) { + context.refresh(); + } + }, [clientContext.connectionStatus]); + + const stage = React.useMemo(() => { + if (context.registration) { + return Stages.registered; + } + return Stages.mustRegister; + }, [context.registration?.id]); + + React.useEffect(() => { + const interval = setInterval(context.refresh, 1000 * 60 * 5); + return () => clearInterval(interval); + }, []); + + if (!context.loadedOnce && clientContext.connectionStatus === ConnectionStatusKind.connected) { + const message = 'Waiting for data to be transferred over the mixnet...'; + return ( + + + + {message} + {/* {process.env.NODE_ENV === 'development' &&

{JSON.stringify(context, null, 2)}
} */} + + + ); + } + + return ( + <> + {context.loading && } + {/* */} + + {/* {process.env.NODE_ENV === 'development' &&
{JSON.stringify(context, null, 2)}
} */} + + ); +}; diff --git a/nym-connect-android/src/components/Growth/TestAndEarnTakePart.tsx b/nym-connect-android/src/components/Growth/TestAndEarnTakePart.tsx new file mode 100644 index 0000000000..b8a096acf6 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnTakePart.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { Alert, AlertTitle, Box, Checkbox, Link, Stack } from '@mui/material'; +import LoadingButton from '@mui/lab/LoadingButton'; +import { SxProps } from '@mui/system'; +import ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight'; +import { invoke } from '@tauri-apps/api'; +import { useTestAndEarnContext } from './context/TestAndEarnContext'; +import { Registration } from './context/types'; + +export const TestAndEarnTakePart: FCWithChildren<{ + websiteLinkUrl: string; + websiteLinkText: string; + content: string; + sx?: SxProps; +}> = ({ content, websiteLinkText, websiteLinkUrl, sx }) => { + const [agree, setAgree] = React.useState(false); + const [busy, setBusy] = React.useState(false); + const [error, setError] = React.useState(); + const context = useTestAndEarnContext(); + const handleNext = async () => { + try { + setBusy(true); + if (context.clientDetails) { + const registration: Registration = await invoke('growth_tne_take_part'); + console.log('Registration: ', { registration }); + await context.setAndStoreRegistration(registration); + if (registration) { + console.log('Registered...'); + } else { + setError('Failed to get registration details'); + } + } else { + setError('Failed to get client details'); + } + } catch (e) { + const message = `${e}`; + console.error('An error occurred', message); + setError(message); + setBusy(false); // the busy state only resets on errors, for success stats, the context will navigate the window away + } + }; + return ( + <> + + + setAgree(checked)} /> + + {content} + + + + + {websiteLinkText} + + + } + onClick={handleNext} + > + Next + + + {error && ( + + Oh no! Something went wrong + {error} + + )} + + ); +}; diff --git a/nym-connect-android/src/components/Growth/TestAndEarnWinner.stories.tsx b/nym-connect-android/src/components/Growth/TestAndEarnWinner.stories.tsx new file mode 100644 index 0000000000..03ed77aa53 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnWinner.stories.tsx @@ -0,0 +1,19 @@ +/* eslint-disable react/jsx-pascal-case */ +import * as React from 'react'; +import { ComponentMeta } from '@storybook/react'; +import { NymShipyardTheme } from 'src/theme'; +import { TestAndEarnWinner, TestAndEarnWinnerWithState } from './TestAndEarnWinner'; +import { MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndWinner } from './context/mocks/TestAndEarnContext'; + +export default { + title: 'Growth/TestAndEarn/Components/Cards/Winner', + component: TestAndEarnWinner, +} as ComponentMeta; + +export const Winner = () => ( + + + + + +); diff --git a/nym-connect-android/src/components/Growth/TestAndEarnWinner.tsx b/nym-connect-android/src/components/Growth/TestAndEarnWinner.tsx new file mode 100644 index 0000000000..41db329a2a --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnWinner.tsx @@ -0,0 +1,114 @@ +import React from 'react'; +import { Alert, AlertTitle, Button, Card, CardContent, CardMedia, Dialog, Typography } from '@mui/material'; +import { SxProps } from '@mui/system'; +import LoadingButton from '@mui/lab/LoadingButton'; +import winner from './content/assets/winner.webp'; +import { useTestAndEarnContext } from './context/TestAndEarnContext'; +import { DrawEntry, DrawEntryStatus } from './context/types'; +import { TestAndEarnEnterWalletAddress } from './TestAndEarnEnterWalletAddress'; +import Content from './content/en.yaml'; + +export const TestAndEarnWinner: FCWithChildren<{ + sx?: SxProps; + entry?: DrawEntry; +}> = ({ entry }) => { + const context = useTestAndEarnContext(); + const [busy, setBusy] = React.useState(false); + const [error, setError] = React.useState(); + const [showWalletCapture, setShowWalletCapture] = React.useState(false); + + const clear = () => { + setShowWalletCapture(false); + setError(undefined); + setBusy(false); + }; + + const handleStartWalletCapture = async () => { + setBusy(true); + setShowWalletCapture(true); + }; + + const cancelEndWalletCapture = async () => { + setBusy(false); + setShowWalletCapture(false); + }; + + const handleEndWalletCapture = async () => { + setBusy(true); + setShowWalletCapture(false); + + if (!context.walletAddress) { + setError('Wallet address is not set'); + return; + } + if (!entry?.draw_id) { + setError('Draw id is not set'); + return; + } + + try { + await context.claim(entry.draw_id, context.walletAddress); + } catch (e) { + const message = `${e}`; + console.error('Failed to submit claim', entry.draw_id, context.walletAddress); + setError(message); + } + setBusy(false); + }; + + return ( + <> + {showWalletCapture && ( + + + + )} + + + + + {Content.testAndEarn.winner.card.header} + + + {entry && ( + <> + {Content.testAndEarn.winner.card.text} {entry.draw_id}. + + )} + + {Content.testAndEarn.winner.claimButton.text} + + + {error && ( + + Oh no! Failed to submit claim + {error} + + + )} + + + + ); +}; + +export const TestAndEarnWinnerWithState: FCWithChildren<{ + sx?: SxProps; +}> = ({ sx }) => { + const context = useTestAndEarnContext(); + + if (context.draws?.current?.entry?.status === DrawEntryStatus.winner) { + return ; + } + + // when the user does not have any unclaimed prizes, don't render anything + return null; +}; diff --git a/nym-connect-android/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx b/nym-connect-android/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx new file mode 100644 index 0000000000..deea1049e7 --- /dev/null +++ b/nym-connect-android/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Box } from '@mui/material'; +import { SxProps } from '@mui/system'; +import Content from './content/TestAndEarn/WinnerEntersWalletAddress.mdx'; + +export const TestAndEarnWinnerWalletAddress: FCWithChildren<{ + sx?: SxProps; +}> = () => ( + + + +); diff --git a/nym-connect-android/src/components/Growth/content/TestAndEarn/Error.mdx b/nym-connect-android/src/components/Growth/content/TestAndEarn/Error.mdx new file mode 100644 index 0000000000..05afd5a492 --- /dev/null +++ b/nym-connect-android/src/components/Growth/content/TestAndEarn/Error.mdx @@ -0,0 +1,17 @@ +import { Alert, AlertTitle, Link } from '@mui/material'; +import { TestAndEarnError } from '../../TestAndEarnError'; + + + Oh no! Something went wrong + + Sorry about that. Here is some more information about the error that occurred: + + + + Any error reports that you send us will contain information about your client, the gateway you're using and your IP address. + + We need this information to make Nym better for everyone. + + + +If you'd like more information about Test&Earn please look on the Shipyard website. diff --git a/nym-connect-android/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx b/nym-connect-android/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx new file mode 100644 index 0000000000..557a800084 --- /dev/null +++ b/nym-connect-android/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx @@ -0,0 +1,25 @@ +import { Card, CardContent, Link, Typography } from '@mui/material'; +import { TestAndEarnTakePart } from '../../TestAndEarnTakePart'; + +### Test privacy & Earn tokens! + + +Help us stress test the Nym privacy system and have the chance to earn 1000 NYMs per day! + + +All you need to do is: + +1. Make sure you're running NymConnect and it is connected. +2. Note your reference number. +3. NymConnect will ping you a task every day. + +Complete the task, post it on Twitter #PrivacyLovesCompany or Telegram along with your reference number! + +Thank you for being part of the Nym community and helping to build a flourishing and free digital society. #PrivacyLovesCompany and we love you! + + + + + + diff --git a/nym-connect-android/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx b/nym-connect-android/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx new file mode 100644 index 0000000000..d519ce49eb --- /dev/null +++ b/nym-connect-android/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx @@ -0,0 +1,9 @@ +import { TestAndEarnEnterWalletAddress } from '../../TestAndEarnEnterWalletAddress'; + +### 🎉 Congratulations! One more thing... + +We need one more thing from you, and that is your wallet address: + + + +Once you've submitting your wallet address over the mixnet, we will be in touch to arrange sending your tokens to you. \ No newline at end of file diff --git a/nym-connect-android/src/components/Growth/content/TestAndEarnNotAvaialble.mdx b/nym-connect-android/src/components/Growth/content/TestAndEarnNotAvaialble.mdx new file mode 100644 index 0000000000..fc9a0a3c5d --- /dev/null +++ b/nym-connect-android/src/components/Growth/content/TestAndEarnNotAvaialble.mdx @@ -0,0 +1,3 @@ +## 😕 Sorry, Test&Earn is only accessible while you are connected to the mixnet + +Please connect to any service provider and try again once the connection has been established. \ No newline at end of file diff --git a/nym-connect-android/src/components/Growth/content/assets/matrix.webp b/nym-connect-android/src/components/Growth/content/assets/matrix.webp new file mode 100644 index 0000000000000000000000000000000000000000..2b1517166cd4d85be71b1a6589c01984414f0bbd GIT binary patch literal 1170192 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 z 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%0AY1&r(HrcX7DYOZJTf@ZFE+ zQ!nanBWl9fPLX0QNEG6tv5V zXXYJ^XkF5QMU7dD#@`Fs9!ry`bdZnmGOeLpdtb_&otg_s~IRV~>eXPKhv z&LPtO3TNjVORlumS-P@W3GAf7uU;)gWw2J`hDza8mfV|IENg*jU z=p%Id+Qx?G{)MR{<9|HnqJdfm?>`a&0-l6z2$)EA*Ra<($>h+45}d+fC)co)Us)9k z#rl-AI<4dzW#UlH0A-XUFa^N|9Ciw0$pIF1TZbqdy)(Har6gwf1j)B>*mAf`}ud^LN2G_w)+Eug=)HUAMG z0Wuiz@K!XtJ z7d9ZBx|a_x-G1mYf2iTUhu)k|8P)2h_NG#iOFpn<0};t{?@x(1mo|yWT9v&D;gqrK zX&fs%NpyBVzya_!0hRaEq{QbnZ}Fg+s&d(3>vB)b{N>UA4WYGC)#mjjqIgMf8HAmw zW~4|xf%KnV*(g!RmJIRnlV3g!p&;nYsLfF>FbYU=)7Eidj&EnyFr|^oINx)WX^2{) zBCr2YgzZtC^Gtf?dj>FB9*h(clNEii@i0vvnpCt3B+LYFNbUG<99eH;=P}YOqcza&9ctP`oXfuQ3^^%%NN*5kpo@SN50%C@9u)XPV|L`TEaFx1Q(pmC%`sF@FYNdOhnC-eUxb3U2wyLp7Sd#vO^anrF z#4!DW=BOl9-s$Xu045ObdQ-8HA)JY6Bks#kl);iehmqw)y${0v3nC7gnKig7%}9xX z7q2{H?}jBz&+xeEfHd4hz7+1g`Ntiysec7F(C32%k&Hq!EXCU$?=R|md$h))A!}fo zM!w@w*WLMB&TS_s8a&`CS`fSW#lvJfK$0@xqmlRRl6>k{1v@aXg-M@&9QZI zRwW=F*T@|vdj6mW30stp2k&uKLFk?SSM`uX4d$6*8J!C9!v@cM7|CfY)La^yU)eXZ zsHg|>Wi_WqA4JfU7#=Vvoe!7stN`UXNrxKO{D7tsm=9TD{7@0j%L-InvhBmB64hqT zk?aRH$a$k6Lf9VXegGo@MMfs61?kwrj9cc2lc$_Gudp-Hjv)edoB&?A#>RET;#cM+ zs>w}Wz)WwYFU?WJ8fYN&8Rd$x$iI`O+=8W}kj3#{7RWpo%oG#)OioM!=?qRRNE_Mg z%LBD*m7QVyg~|9oxIL{ygbu(b#e6wvvIe0q+Q*gq*=<`KW_c;9~I=Giof>8?oCVLN>qP(AlTL*}_w2YaoN*f+r1?!L!V5@p`4^Mk(lL|u zsE;-_-XtBA_Ki-sg)JgP3DWD7BAdg7)chNa5EKPHTauie|XEvQ3EH<#r*PC(<#ubsD@Q` zdVJ`E+j5Mfj|;qTf884T_`pk0F0-)_nfO8hev0rGbtyk9Je8F*?C$_QqFJg|{%)@> zMl1*F9dS2kdsLAwaGV*N?Ij%lJ@AwpZ3KYejtGy8v$m4Jc~CJ(eI^)v3LcmrFw~=L zSM+koDKm@WU9axask>$9(56r!Zw2$EcUnjnfF!Sdg2Az2CbirwgRrHz76?h6D&+X) z47_<`b9y{&S?zJQk!>$y4&!pLy1EKTb&%qf#-c7i;o`+*+HeFgI&!Ucc#eKky(L9C zd5oh2tf(6VnAyao9D6n*E9vtS81=q-K&R}JUvIz58^5m$v$R~9rT6+&Tvz%t#s9f+*^&O{=8J$@dcIPao7hbzatiw6{9F=gy>sSVM_3lf844vYR{n zl2w5=n|T`FZgN*}-d}+!I~>6Z-B`1Ry6dIdkg&#b4Bz5|lI!E-^nR=_qBXm=OB3qD z@gc?d2E!8!Wt0AOVA)6MjZT5DI#TLbX$(vjx#xY=rL=d@E{ z)}aUsLfQJ)bfv7OU$G9iz@Nre+>Q=Efh6O9mS3+vdc8FR&$%EobPuPHYS5W=?=p(>E2tgz{@Rfwkqb<=Q|6 zmDlBHifhnFgwGc``*9@Ja^R+ZK0g3=lP|P zo976y6jQfrwa07>>51g}Do`1>(X(Yf>sd=RB>f9d)egOW!X3*Ej`l7ft#H~C&WajD z+86W$SEty!Wu=u9pa{fN-Ot`IB?u2yTEiRU=cL*_)9-i*-ukPXlUmFIGFhyZOC7V? zpyK<3TaD2Ih^Sp=#j9bI8S_g+vv1MQ{AI1#y@l14G-N+SyZ^g5U{5;$K&XG=M{B-^ z?djBBBlSmNO%)ukp25Px_y(|C9Zt}_>3)=K)|IpXhqZAZpPsF{TziI=hrEH^nC?+H zVQJ}M7-hrp_GHEuXwCLz6YxM!J}o`>?^FV(&F^fA0jkIn6`G|6p$J|W?>RA?TnP$l z7Q9V=#;PHsi*w6I(sDwfw-cxK&IChapZ07OrsDIvJ<%q~qK!z3#5ssz+^7^r&MR%K zObKD{vWK}wPREa9+Hk|}QJ$x8>%Xp9Kb#{x1&w7&LnS(p3q#(~#gCJMg@0QI2kaD& zWfk~AWHfrh!*A+DF;w9%xc|{6>Fi?F@3Pi?9U68#SQ0VYco-EY0~}xJyu_vB5?NBj z?TNh6&zFIld4oAg0mHPAKa%gs#CXCK`LI7sp;W~Q9r_8If6b^49E_s?^NDkVwq#h3 z%NjmmD8QRKzy{f}n>lQS1E+MO-B;*wS!C^I&P-cgqO>|G{9THB{0RW?Im3zZrm0w| zy&{3c6O?(ZvNMKWZ%K&wnxgcWJnM+zrE&Nplic7yg-Wri<2G7=kZz4diKi(&QpCNX zH>PAp*2KWy;6L2}QE7pT$9)?2P~c%2z)RBMo^3iswz7FS@sG=DG)ds>!yUAGgN1WwHb0 zLV1YGl#gbl0Mj`*wb+kLUvg+>G^5G0Q+d>O)11x7hGEu+5#0HI6T6UOkmk8it^p(M(S{2Px*nc-fFX2WiHrP)`J_oBcfR%1R8~7nMkV~&kM|PTQPD($vun-tFpi@7zrWHpqm;| zzBZ%t&_;1;k2wWYpg&}*JGwCQE|VMqo$2m3NE9}w(4g-Y(ieSC0~Py;uc~_+R=2u% zRKvQf&MAk?|0PP2t-vlE8`Is}dEG6;XlxlPt7I#8^xPY;C>yo9;h^PO_Ok`B+w1f) z{=XQ`HxvsN^@^eAiZKwq%;(y3hMkAJ(R*}x+dq`~B*IL&ACR-Nn&EoGRfPe?ENFfju1ZSZW^A-z?*!takEpj(HI zK6%B9P+%&|#C|!>{s#0#+~H)CuG!^oqXm5+ll5_0<#5&A5xoaRmUo-B>ruj3AVYpA zX;9z{sWPxF0aFtosm;!e!e2%*2NX#4m#ZNlz24&^X1+MmUu$B}xn39`JovB9-+e}j z8$rX~ThJ0B2p% zoexSMS)hY50GphLB`TNwIsiF~rY04{26LL!91noFQ2tsLvZQA!0a(g88RXa?Wl25i zVEJYNiDKop)WFQvr6pwLCfUaq?=C7&u>|pA%#YyfIv~SHCn$ytB}cjH@dBGrNAemv z`#~8#yedl2{HXlOObGSeLybmd;1d?aoYIFPbl+CT7W)aTD|s6d{C^!)|9$1p(Kyul zw{U*((eb5)*JnKg0#^@!qLWBd>a~PJBPYC1L7Vf{q3@uiRHmP$I*j~Grw}7rsQhz9 zj5tmQ)>ogd3xW)GmXDIxz-06i5emeYy|nuWu#3-MmQj;#G_Scf?S@09-($zoz(xrc*U2jKHR>5JHza zpAJo$Hq4>Zt6Se-vmr#E=2`352}Ec$rlj-cjCy=|BzOR;M^TWVu9_}(-`Y4OTFJ{& z)>J&#O2&JbgdA@S)ed}RF1uxGa?>GD2#l8ai44LpQ8)TM6xb#|Z;$#Zin5W7%Rws2<7B;8_i;eT%{Mr<*h6So`KKOFkWf zw$BhFrrWzp;?ow^0CL7U?K9LCgRmUOQ#-#*++bt>msM0jy3K%@vd9y&#$sNiae!=` zJE(y++ykTvM4@n65dkm3P=4kxb-eQ=s8+@!V(2PO<3Aw^g^NHLUNpzJ7AH>=Xnv?Y z^0OyPzS9hVNqq;n<&bl>d{FTw5U^yJH%EX!QYiFEz@1&4tWarXQSkChDfhHFBc+mmdiro^hUwQhGOohfSs0okVZj#(m?2 zS#fCvRYO2rQ z&xKnYEV-5yyjNlpzSmPd-viHCGPWe3LY(E|i#Zx{5F9o?6z(MZ&o=xM5t`J0;#wDp+Pm9F;8ILNn0vk?2NQd6!}LHGi629;4H?lV#N}1 zqm+c0i~PO-;}=>xV~F%%nP=9nCI>UO{Kj$8iEc2E2Hp3tD7T893immDj#qn0`}_IE zKpisnJBm(<4AiHwPtCv^r7y$yK;Q!mVv0CoqO$!K7mz)3EyaraWLbH55QU-H?pMj( z7M)KV#CpO@v#iFcC8}ci#bH%9 zy02Rp>ge-bN_95a_OyH-`WPX5+x6H zR9UR3i_WqLOnlVUmIE=XUSAZry$z&u3(w<~TtZLVpo7K;Q;bO=$a58m#FuKHeCzeC zu4X!+Kab0-h0>s3t<{t6a~=hakH5Yn4`mcYqK+Q`rC?7(OI*pO9+9V#E!dDV(%=i+ zvNvU}kNyOX3ydeLd#p6?1V2hrroEL%;O1b(G*hr(0J=5(Ob@|s65-c}x)C4@4|*=& z1en~6RUy%{V|-_nI%2~XmAM=5%&KO(VNyZ7X__k%XaCz%x{5-suQrov<*urc4d`U? z)6lNKvMsz>6F>y((JRFr_95ZzQyUwE6`)4mwWsL_MYa@-sD<1R?b|?H2Bze&l)-KN zgexVDiV>@L5(BIMCWIvmOyf96c;oKo_HMeEyiHbb?q85zw>xF;Ww4Vx#usro71lBo z*h)8jD62Y)Y*8QqI+2vjP_<~nB38FK1yUR!^yoYjnBrS)yl&^X@t2czAKm*i-$_`M zQ_z1Z(({fPdA6uixypkvYF%1GlLtZ}c@NFX7Yl*#^jBh(KH#ix&hni=>XVTaY{f=_@3 z5$E4ULTNQ%p32;=Fnx}^T^s_w+jv(rvqTbE$L)A>NxOhQno4u6txym=>mG? zY^)n+3c#$AkVx%^7 zL}mCmuyFDqvqEoEui?*+b*NGG1=8Sf#KvJ4WxfkDwdkc(g2#SWG>y5PUM?=tzM9+RxwgMxXc7692z5 zlxfJge8@7*E=#0HZ6tsjiC_`Z$2a4qy78v>iM2c#a6xi{{yY*_kM3K-WoXm6;mnyUAc~1wn5Jn0Khta#gtTSVb*}cg((AF}=uH7IDAT$<(7vekod! zRm)0yANvZNQrsMc|L-J&XDR&uwaDh|?bzTzO8hf%p%!`2Ae|r2K*z6y4mrESKcRim zECwQB~eh@o@Gkza5c_`h9agKY;&55xOv%MmMdXD|2U1(bd~h=ot5lh zmfYOa$|Cp>6k4jhq|+k+r~O>35W!6K=XfU{TK0aeFYTt#3*lF?*P)p<_QD5CO~=)F zI&j<1t_6b?Fy!r?&1tMppNTG_Bp7e^_?dDI0Br~l{#&>g4LjT=UZ9P`R; z!R=8cNffe9y`{0D1+~reP9=>Dq%7^V6-_Tv>B}o9obuiOt6K8!t;}8b0cPB%sKaDK z8n|)iksXD=1I>M~MGgn6PsTA$U&bOB5?HycKi<&=&CO@KLPM*Yn~3CJ^dB0TcaKSy za>Ibf{$M$1zqv@L$`OW~gu;DY=}!kqv|!K`T=_dKMbm|5RgnxiH6S5<20X|OktDN~ ztZ`|%5RhdKtRm+_9x3!Oei5*))MJ9$WZD6Ui=01W70p@8E!NK4!0zPJWoW4R z_~!iyDK>^Qv_sp&nL-xn-jMY>A82$^N+!~<_yf&}w)>{+91MrWc4)jCB1Lcz{pT9A zb!jtx6P`1@(%yjm9B$G@;Jya@Znwj3ws4=bHdwf|8tGVR1JHXGLYkf zpaHs{lYVODPD2Mm&)1X$Ds&u0vl=m0ikg*nsP7^@lXLYDsEYPOvJHlR2LlA4zy>P! z(=@Kw0}lHMaqU$y4>rkJpuJ=%@({T^yhEPPTlrIg`Gur>*I&jVR!Y{m;o1(seDyrxNxeG)v0ZeJD_0byaj7`*w;;RO}6LM7TeQqUaqG(c=aZJLJ)G6WGl>6wcblTg?EG z{|dKOOAENrW6r30@%K|dEn(B*q|tKELMHmpMgJ>_k}sVFKPN6`W~&mu^%sytaBp|w zffosOb6&WB$1+NEdp-UJZSBRaF;U6tO*Se%_^7hA=mn(^E=^!5C<$YTC8MvRxOo>d$wvHpP0wP zC}0ZyPOZd{#mYY}hg|D_iN7c))!~bTaJYyPNP5C<2pQ*xJx(0EB*SS7k&IFB*fP`j zeSg*^O<{V@7i`-itO#(hzx4?E?3+pqjir?1RbslH?q9P%Y!4LL@0mJ-CYsn4PV7bpToC>y~~ip*4-eSbw1 z2iX1y>I=qwKjz&S*P%3~HDVnpcraRcD$=LpTTa&sGu}kPv+U@(9Q|W>YZ@-o8oKYBd+se8_H@q>obWYT=Q&h9*B`Q#f3z8ogf;ZBC-i1tC(wueAj7QgKlmm`|jM;VO z86Ry%#Ik?cc~;O4%?RtyhZcVs?2}B69ER9>}_d1D*1i22c=O#PH)&<{M!Jfsa5r*mL>qEBy z$zn&Ao-jBpN5qs!t_-y3rS#U;@N;Apokgwzo^kbucf6t?rRs^ zVrEcy@h0?P*!n&=5^`!?oio1g$VrV7cgoZ2D!}s}B+7dP!!x9YCE6*;R7U+XyJOs^ye!MEsmiCHleGs%0im(e zK{HAxK~KhvQjts#1}=wy$^dvvBCI5tyCES$)^%-?oI-L%vVY={WQleO*OlF zU1wnD1A3v*eAd?g5BHT?17dI=JmPj8>!BrvFi27&*-xU$T;UeNg1wuA!d!pWC8?G{ zb2@L`)PL_>M&zJ+Nrv-?AYa4E^Y{vAsTaQ}O^Vg}C@RCjH|K3{3)dqWp|%*@F>e%- z1OeRf%D_}XBdlHFri0YVyutnrRAl2bQNXz3q4LX2tyABidg7?tI4*!HjQCUV)a%6w zOw*AoLi4pl(}s}v-o%Vz0p0PtF7`z>B30{)Fu@=)^b!2(%Q&vjnHxL zn{~hBSHz)X#~@)Q6Z9fs?509`-Gwai^vw*+3aE!STu$~my$nq8Jq@br*6S=WBEEQ~RymY*)5xJ9dQfxq#F^+hHag zmJI9F2Hc_(+wr>=lv#Fg3zuQPake&GN0LMOW`(b0AvtH!QPILSk$dr4T{m;=6Gz6L z0#&!X%I~9VAIX=OZDCBm;1q#YK_&f9eDh5dP;?qp+1ImYcCQ;)eMk2x_ZjkHXGijVW%paEhh>2biUb!xM~R-eCc)st8m zA}z=vOExgq5O-4Qy;qy281Yj%s zg0Rs;3CFN7DxUxV@{m*_IxyxtZo>I0E0i@QBTI-R?WZV{%4UMLtFY~JGhH`p*~k!f z?&H|nX}|QRvYZ!*=+jrIh*K`i=7E3DgO;vb1tO4Y+wY!BK8DC0VF=e0y@Qw=!#~x{ zo)A!7CbdgVRCwrM=^vCM+%2Mh{S99UjeLV7!fHmLN^=>uv&Nn(LnoK=a2#_pTMX3Y`DjfkrNQVP*V^P|Sc@v=3xKwryp2rD-B-hqZd=}O^ecHtY%ZtqH`UaZ_ObaV~)PvFA zjb9{1S@n$H`m~Xi7M)&D4mG(})k6zzbO1a5>GzR8WWUt6dDol`b^2iynEX!%pe?JZtsld=NUrT4E5$+a%E<#!a>mf9e^V>!!)?XZDeI_5Teq&$-lzmr^ zR$qRR)pgk^kj#(o%Ko&$O#8FNU+CKy>v1=Jt@7CGx?Gak6Ty`IMkIPQMou-lZb>`b={q|SR(yUpIex@=C<)TaEjA!Or7bv zpYKB-iG^xU*7QfGD}<4}&FD^bWdGX_HBy!e#<}kwo*0x@Frt@M*PgYF_kmRxvkN>V z{dmI>x4oR@$Zoc-kjJ?QC4%lNPfs6e(2~T6C+#_ivk06xUWB0>^1wD6Nh(ey86Au- z2kl_vWU>oFMJBOh%~ez3@%2v?j)%iSx@2{a8)c{SNVJVvMg%p4pY7d~J9;Hjvw~5M zhPZbPAu6o>1$Q|AbbV9PMq;ucEwYg2`j?llLDUWp=8Bp>^=%s&F+GL!l@Jahel;+2 zExq`|V`huTI>3pzX(vnzH<)yWM4f^-cRDktf2z`Ni|kQGLPdWiAX-34y1BRY>1}B&GeE42t|cA z$AmA_a-1Sk$9- zXxnK8(;o14j-w8)A}X?{;HWa4uD8RS&Ve3Z(dK!7k1=tnl)2=Y`U~Lgxg4xv{a917 z8QzUV4sp^+RkND!7=L(@+F#aY8&&oTCGj%& z=9$M6Zny??ZkfU5I%)J(rOH0V9}YezU5Y|6Jz&IK&T?3Gxow5aGaaR@>v(F(iKZjg zL5R5;pr{@G42nGG#=9l6FQW@eIkNLQ6kgD0D%yhE?Jz6V`)0O!&6*#iJiiAyhM7;r zceuSJRksoa4rAn$ynUxf>yDC|OvJM_@wBHes~%e;*xPMWovK+qbmh_TdcPX|^)W&* zx-+tzBNNvwTyz)cVBLPf%rnMy7QN5xYU}O5lk|*T*SL0~ zg%l;Rf{nIM1-ih3VGZKm<1YA5Td}urjs7h7Ub&YFN z-Zy)WD@0(``0Y;F`lbWoakdj@k<1|Zq^yx;q9=2lAdg-Amp4}f9CO6_3t8NJ3f`XUbyLDIEeAcfKBSmgwh{PoX8VtNPR=tl8mSCnZN2rqMPGxLf3dufiS};% zd>JD|l_;f`|8Cl^9mUSVpC}ye=kOC&v9Ei$^apLavs7D0K`MexYfX)Wc&O1gv&Ay~ zlmGw#K~7CZ4od(400000007?s01W{ELjV8(R!}$~_DTQ%bRYqp0V?1D4go$a^7Al)WRz zAJu->{z-Y)`XAiC#QfU$zWvJ{e+m9)nV)L^k?a@zj|2Z{@fY_m{9j>6Jh)TfufhM* z^uYX&``(rPod3J-3;h%OKl~40JVw7C|9jX&`hWTVTJH%z!g`DJ;Ph2FqFft<3LlOv zr_(L{>Dvqo4$_70_yPX6yHsjE11-f;@^9>T7?a*{;uQjRu_6n=5#UIAfxhwR$xwtZ z44ejL|Amr2U1tKCp>OXFS`s4$3d!>|Esdg^Ng2KiEaLLV+_zlqy5EKCmv#k;LMxS* zgBeY*4C%)3J3eAya6|9;gOiiODCAT1QcJL|jSQ0~#QtFC?MAJZyAc2d{QJzECYRk1 zB2HkE9d2}KRIv3zk{5vv=Oh7blh2YOKC~#etLGo|?ad11xxv?{U*)tDt{jx$_)khy zr2nT+*KBuR)a#3EdI6sPpBttBmYz6KVkWWvRh}CiXEC@Jcw-q%6@!j|!UGNqOPeR* zc&3jsf$f58YjG%0>5`6A@?at;s!9eouHs`RmJgo?V*t+ahp|{RKQd;+#?{#xG+17} zt8pmh+hsk$1 zqw@I|^nnZSeDIa5KcKXDU^u-hEtQM{)b=rHl$XWm8*ulC4F>tlsyAMw)##j4?&XaD zX3mTcjU~(JS>txKIPpb+@@e37!@Oym(=&(oKXTRCl_|lGTy%=ya@98meqViPKqE9A zy}|EvH%Q1#$Fm|IB6=6%rV{71cK%;7W$i@;8hgms&s|lGyV4~nA*J20zQ>5d_km0#dC~a*D+;Gv*`e-Kuj0>1QxyMAcfo%BtF!8a zc45@G#x*AI>v)xatL{VJB>5K2-IITn2TT8Qh=2yHPTO2hwcZXnBXK5ztA|5C;Cyrk zW*e+mH}&OU*4B#NjGmQp%9c%+%Pz3!OnEXpFNhwpoz zQRqrSavF3AKj z@l_TYh8Fva+&zB<=?n165Ko&>tI%>hm!K3L=uhw8MZFf%kpu;oI(tj1vfaXc3Jk z@!-vE;~4oo9U_InOTRxG2|C?ph4E%mBIfHY*#QE~x<8PMZKl&_H(iIE1$7D@T@Sl8 z;``~$oI=KylY7{=0w_}j)^i9wRlpW?3M_3ql3SMZx?WUjt*^n5=fGudFCmbc`7Omh z;8AUXtPWrPZs2;`*>Y{D-g9w55wM<~>A{Z`%nit4BPUQwp+5sy8`WA#QG0?-dS=n} z|MD$^{49ylw6^kdlD8q-ruJw)h3Vq{W|}6!hwDR5D@HZgfexDAsDi#bM2}kTro%a{^mLs$$~Qd zdSS(R-7w-pvL4D;g8CckL_c`3kN`blJFL+ZH5@67DZWWdCmpg=od*xgsXvQAe_OkW zcfAps9Y_&niT_4G+Cu)XKWfAcQL`T(P`g}Asutc*WW+NV6x?bouNEm$RW8dE?aEjm zX4&0J9bn)~xyRgeI8}ERl!7l8aNj+7>9mymCF9J>Dum&jPZft>r%f3+&|HS+H>-sT zfc|zSA%B*H>$R^!J9ILdow7x{{3|xvN2c{yH&#xz-AyQb=zw#P(b}am|3m~KDJWZQ zVf1t$^(AXlGvQyu2(egwv{Vs=yMO-%H;DuEj{*vVIXMq^B!3DuQq$>D3qA(_qRb3Z zA&#SuiEtT*F5yFw^hTVv5L2RtxF%67{^fSs;x1Pkmw+N6kfnc7b{!+kIq=y zPBLjS5v8K!E8L4ChZ}}%!qoOhq2hE&2fyEry57NMjnc8XiTrJk$7@9j{K{0rekXfP zqxR;V$4#fWlGl2EnMyn|4(hjVdxLzza%Mf7I#(Iw@SXd56 z-kYIvh9xwYvt$XU5>XomUo)po!N1B39?)|{LQrzGwN=~QEKR(0v^84F3nRyH4F~DT zZ723c?ZgkQMTLi~pXrPh`f82fi<=Bes%3;3Et zDw|Xeu;UD8QX6pVIj-Xu5WI=kRC0uFX56Q*?`koSEVXFTcx!TAXC;gOSGJoDSpeB0 zEjK;iH+ihsMP!*oDEI2{kN<(jZs8xkhZ8|1Duv*xe5PL+5$1z z;@7=eJ26`B`pit!2Wu9p?YI^kQIm_GV%wTmCl-KVD;JL4zGim3-n#^vV4A?W(4^+# zmV(|s6|?4C8jAM}-8b_S;Az!zrFnf=hrRJ(qe)>_fv|28y!ep#$w zM6;h(kNDY$OPK}0=|KyQ94s>6PAx-7lavA4dYM?)f0 z3Leb_jQb^o>XU0wV^%?};{b+BOI?_e#w5&MIWgh;?yljJ}LO&B-;d38|<|lx!Sj#B*N`76J`dT`6qbXEhl$TO%V5lu_j~*u; zO?0edTM2h7pIt)pnYZB}uJ;UUIGp9pNcnP3fCchqeDy+1jBRixdL9<>C((9z4xPZz zfBCqjq{r>o`?NRMc|t8z8lFFA+4zn^{x=sia zzqJYekrItE4lSJwQV{xlwlKZw^+f; z^@uK~Y=8rxS3^>DxL1H6Qi{W5Yz5V0+BpG8rAuMiE?CVVX>>hgstSG0iZQO1);+o) z-9X(1|BzIh;cux2@C)G2r|8j&I>=qs-2v>7hRr_;gRBv(gZuB$>W=5JFHTbo=jsXO zk?|tf0zeI-1&l(vl#cd(E#mHlpzRh~WuL3h{iG5E>Z(MNf??QMy)KdcI#dPwxyPo{sfy8L3HJ&hwg=8qYUv{(K5Sg$4 z&ERSmahP~I_)P4&!4fMFkYn{(b1Jp`a&of(zIFwu4to382zWbh+ z_AjvpfHIw|e4irtVW+3?`hSyA_TJ%V32t3SwGKU1mUR#< zfsMfn<_oE7a64BsQ=A+>24E(vfd;TgYk$_gIQiTz2YsBFIUP^4MfGkJSG0o97g+l5 z2L@t`QWJzZ(Uq7!DTn=u&r+p$;5Vdb+b|s>TB2%@<0H~E)xI7hs`p;SCF>+bsK0Xs zT@)T4x;NNzcm>sP;@r^?vqYUFZUTYDfE=9%8OiNyKA!iye~lM< zB2C)Ql>`%k^2tQ2txa5YWNA+}W&@-`qivv?qdZLCBBeDkFY~%q`>Gq_BTh-s z>+fj_j5Cf-)==dy&|zV@Uu}tk$q+&*E}PN3F9CK-jZRrswYdn2S|RO6MVZ!tH0sNS z+F>(%@8$?8okX<+38hd`vzv2qUCb3Ggr-)8Bi04Vx^qtw7HQ3FI%5WN5#;s5kKr1H z6)+qqXZ!ct$xrTft(IAm=8kqC#Y3h|oC-W9b<4sIK*2YDXS+~x*#i_2!kH}rAnB@; zbjR?LhzMzX8P@)Pz;aWCU|4i+c07%n5(RTkgM{kix~*H+>t z{!$QS(qkfg)HR^&{;MNs8?@;`9L!*ic^>Nd;Y*O{>Ol%sHD8A3kL3_WR)n1y7tr$V zJkE_wY|U$s043pgR(7^j0Lhy9 zZEZP6cTm@#znC$qY+%~LW33p}vcS+GQz=lEMOmF=Se65*PPHB(>(IYjk?+y%%)M{n zkSdWC>+EbRj?oB(RCG7n!()up_fH;v0AuSiKq6qUZ*W(0Pe!&rEh~ue>7ZHo$Q07~ zd$Hx_BNpb!${WZT5Vza~3D-6~g%Y-Jx1l z8H>Dw8LN12ggqC3a)dor{-qz{q-Z(TA726eCREdF^yj_v*N|zg?2#vW)7@~yTxpX4 zs`o=A2W1?2MvP_6beA)e4-RXfexg+wzd6H}mor)S)XxB96t5~z8)AI@JVMpPdHQ@2 zml^PhoZdLU3D%jBfL~drWFK#9aD?(={;UWBsp?W>@|b_TXDw8sF;&k6)OglFp`J(& zQ#rK66}=_id%=WXhZ6-vk0ui*028M0t(wS5H@sM-AQd1IvCcp)$ zPY(i|J|i&j@(2%jXfkBqT6`#uxJ^hfUVv6R2sU4`0gqkrfw^qg-PAPM*tZP|y;DKz zy@5(p4}JcqPYzMLBFy^%UAw7nW&0}b{`%K1yWcfQu8mytkkgzfQ4q2sXDk|gxX9a( zQXNUXa6OL0J;+j;I>nZvZv@S>tN&*hF<`G z$xa+pDYiJ34nWue`2T9>g>4JL&Okcs*!XT=55m$hvy7s;qoDEl=SNe#i#*T?&FTkH z&4FDwX|90aE_7GP6z^R- zy@VTBP!niS#@2JW)SX26>(A{an@b?XseuUmcxr(0gSVn?x zI&f!plGGfxk8=)l#qB2d{@{K*PM&6C(fYJS*Lh+@`}*J`Pt#_@QaWklwQe;uB^x(!+u50gzJ&^Hj(aXzmqT-nZ@kBK2E!xRUpR39j_g?2Ay$X#qrMY;XG}cSsm+|3i7x(EUm31 z`_u&J)PS?o-hkaAA6E(etb+>+h?#+3UrXX!<+Q3_Mm~c&9Dc&do|p@oq&4mFnnjU`oGcv z-9CeuPawfk!GR}ue+q|Y<+R7V6QG>-=9c7O5A!8Z0ckap*>sdo>UQR?)RE9R)q z>5DGxXzcGNMU&Q?Y6wIEXtNYNkDH-GbzJ~sBlDLYdx7W1_O5|@7LVH6XB6h26dvE) z4nUi>^>{0Gg#QjS#&e|9o`K9+irr+S$1E&69(4!^N+0Of>v`VSI5!v)gjd(fEi=UP zyvKG9+!1>7JgOCFq?sAxHb@y-iHpFhk~B0TF!Wzt0RI++C*;|apUis`e1Fp;^@jOH zy72U1MrU+ECR~Of12u!$y~zHqiOE=YhBEzy2m+cO_8g+WZgCKSgbo2tY%i@YVBCSM zer^e0dFI=vs)@*o#yc%rDR6WgY*nyT=A_qinx~pc5p$cKGAXaj;K~VA`wR=F{b0w) zT!#li{sfE!Y&j=@tpfwXUd4LLA7-C^iDkM(p9})AIMq9(#{eTNk9Embyic${p?4rf zM>yjuV8+XSrP8idsp593?O?_;m_=_JBvxqFA7sN7$Dsd%3qA8(Q;ULawd9V3g2AjdpURkivF>cX@z0x_KH4Os;~&Rlb`3GYgJYnPt+Uwy-h9?|j729}0soqD zT3YfmWE1GQ{XB`Y)jOF+zLw6LHKGsqA@z%iStgHea2@{WfCMCOf!*U;$CBkRq>>e* zO&7Kv5K#>XxQRD~?6|w5+RT0c7p{a393Nw)K9J;xbPHuudI>QGQbq-}q&DIkVTLiz^T;roER2S0)NfD%3@4+9s1JvAoA#rYOYY3H8$Y z1gSN}pH%1aRV_j6T*)LM-z5t>^05ZgcmN>6WAD*eiu^}DIv5-pyD?fp z;%K`jt&FzaBN(66c32KmFlIlRGhWzR(0b{c++vH0z|TjF^1>lyu1iak8R=S*Ve2a# zxOR+Bl&g1?FQ{FhydD2c%Cw%$jnp{G1x`${jy159#yK9yq5A?i>xa5yEJ1bmIHluf zBEk+ASqub#$_y$aqo4A}Y1s5FdAG1>Ci`orPHyPWlVnx55o>+Thkxhk6#UZAqzJXX zl?w`N9H{`BB0o0l!!?*@Hhgdc^m-XOU~ai=)#!{J1`L{Amds_jqUD!U^?#5SFr7YR$&MWA#$95)e8rFUia7X2nFKoYK2$nw=H^0s%7V0EYVEBm2+H;W zdrcvS0rI1gV>Jj_PBV#HM7#itBI5NKEXMHXn~!OOLC5s4j{ZkTaY%jw3~5i)i}Jnr z9>%y+_)0@1i~x|b6Rkx`R*BplRFkoT-B79$l>Sty3>(U#nyn~U7u)ZOtu}opxYiX? z^f->6N6z+(=*$^?R?D9qGMh`;If8uDvnp*_whe<<5yAp5V{shEI5!<-FJ}AnP`z+% z$2Ejw03)lzM4x($2e>+{#gLgrwPh1b^)t=pb!j|Z#c6MFy+1JFE@YXb15|OHopaLM z{BNMdiiGUNI=q|@PdVR`^NOvi$YK+3;JG;ZjDiJbl5eFdinRxXORz)jaSHm zZpP~DNB8+i@;sgc)jH?Yz8){gF@@%$a z!KyBFM~hXl&tzZ*Sd#4PcL#W2YW{$PK{#!NgvL8@F>otBTTwN#K$M_c4~)i15}>vR z4mO=D%C$tCeoO}dpBi$*23brv(AY-KG@%>p*}*8`vq^Pnxe?H5rrxI}^BO`{0{Z9d z!rRG%(ED1yN_4uA`mGeW{@r(XP-ea!1~H~2^dxoEk~y?rmb1XB=Jqf;-WDmLbmL={C#eQ zQRrk9P~EJ8rhr*k6m2{{NJoImbS2gm%fs za0g*4dITNC+YUvdO`-{8oXad(WTBwOX`Ec=IQb5^sDlzwSgpcpBBcpAJx}+TP9h(L z&`2q%Ei&DF$%5zg+`$cjJWPjSppruTLS`p2YYO)=@J+M$NCm82hjBk?Y277Zl26nX-8cKoVf&AGj)Urgn3?RxHyOHZY zxB)ZH_?e8W5so-t9W1Ztd|@^ItANT!O zh36*0=6FA60as*6D5vw%rJeE*ytsen|F0-B*#gWiiJ? z80?#Md%RXq8rzmU2k1JXMs}g3!wPS^36HM(VmhKgs+cJL(8qAOZsY}cSfigF??|Q! zSL14B4--E{H_RC?TOZ}-LEP2-Q#dI-2Q_(5kI*e#dH_GjFi#UP`i@uuSu@kb#a`K` zrk|Q`&@AxZhZ55=E6S(!g~&^f!z6#r5gm}D_!43$swb&USZ7q_a=(0_XcvL`of)tL zM8@yJ#Rdc+nDs@k$2$b~LRgKBwQG)9DseK!ou6*!x5=-ZQlW#{gXf5{JvQ>ep-H&^ zZC598riSKTLM)(}@d!x1bjh|UR)Y1Q7N!kvbymt-2|8PLn!AkbOELml1FO%sN=uGU z%3rUAH^<+TwCuqR2jCi-0`l6k^v=u@xtW0z-6uF+8p-la-vE>WT9Pif z*di|S>?8SU#t>RVHR%ivKXyjeqyE46 zwLGjtJBur+&Z?hSDqoZk3(4Y^yf09nG(yD+cuR&{Mz)I}b z$_C08t`;4}Pr3oyIq3(s*l94#M4wV$t|QNy&$P?=UfGB!PfuZsf@()1p^0o1bF$m$ zq~c~NRpTsh%H`ZIKZT%CM)>!z5M&+Tm0YxPY47f7EU6&D&0hM9KMz`=446s=OaOfv zIwD8TbG!^D#}{e3b*;*L=2=@RR<9y{vOZERyco2oqLar6?;-{X`*u9x+$u|5%D6JI z{X>83fN{cYH=0@Vh=$4RR;`H@JQJ^}xs^3&0+cIEM(_0WlvEbY*IlV-cECUX4tB3S z-q}Wu9h72cf+Q}ZUYXp*xo=iD6F(BS8Ml*uVYAiHSvpa zuFnkovoPjVx6rAqS&8na_syV5#M+=vXIMEB3;4RH|U8o!#`c@uaL8UcxmAsfnQc}-R^)+6(Q%z;fBe&2%pEq3t)_+v`QAy zk=7Q=G_@-b^AZYf&C&e|B0lUv!%M^bWQ-mFNilXx2*xiQY-n4)sERf-;PW|Inax19?5MlL$qAMp7tUIhdPtN=}Rf6 zn{o@+Xv>|Ql|Bj=iNF^VSI>I_;@iFw@@Al?RR2@sPxAnfI2}1MAx89Zo3O2*R?$S} zNwCC=hQK^u8s1SXANVY_!1A&yTD>a$WnYx#jx*Wr1<{|%7$)ycPoYot-dFj{sxz## zl3f@?ELr_VC2^{qzDcE1>Me}?IpR2b6{;@%k;SbbTom$0Dzu%aiHSmV&JCf#0@VgB zNC82@<#{#V&r%m-W%7j4@LF}E&N5rryaSY$*N*f_=U>Hz_343N-T4XnAzYey&VSuJ zg0Z%mPSz*C6OHW@OrIO(PP@i5BRy+^X?JN(?J8aZh8b6O$U8HRK(yFv0hwrHMopVi zRMry}%7%8|>+nJQmX8C!WXVa*vkxd+{HXMgq9_FC_-};6sBSkmQhYHdDmlz# zr^0W9JZ$f;c%?2LkxaEtE7RI2Cw3)>R;)Lt)5vSx<4JM~yh5r6?0+h1BVDzOa_86> zO&a*v%su@nUF=_{@0=yQBK`}w?c=-0O3J0rs@}0^zkq%dt|xskko=VK2tQQXc!)Q_ zkw17+`Lme^o{ZKp)2fjbp!awsr}AqCM$LQ4GbQuN1WNVF`d@iQoDQ1;QlrxSA>YvW;i z9y>>c0BEI#l3bJLL%*nAGvC?uGf*F8sNu$gAyCb;%NqJ2<&ZIk9%%P;VGV{(lSO0q zgqCTKS)e@welbgV+CRTj8l8AoJqW_;o620$R84Y;Z1}%;bHX;197YJ^WvwH3mga&r z^@yTc0U75H+D%WD7BiA$=xrA!H4O@asW}sKX(~^u3ap5On(vYS{APO2fUOs=GopR{ z6v5YRDm+8A+k`+2XP0i8T^)w3jbG=rm4YW>aJbSNW7N=zEh&3~`BL$cC%b_Qc}Xhv z4&-a+jEQ);X zR9AcN9xz)bI~x`J^`6LwK;Wq%whVH$+W1=n6E}|rj5N9|(L9}n4e&qiQRJiu0b^>E zF?lp^C6nyZHZD;sR;;gnQMFOetV|yd=*?L(U&z_pY9-6TEJ>ECRIfYJ&5Z_0*R%KZ z9IFK^jcBB4ln{C(6x&$uRM~8c+?4Px&Ud*|>k!!PI*m=pE+P?59+aCKP^#IHG^5Xa z_^Z}Tet$@gz3-gB5m(R zb!1zEt{L1dw1oZ`Mn`Jc`qCRhR|;jee&Gm)p-nf6XRnw-P*=u~6@VDz+BEAe0P8jI zbt2MedVHEpaAl&lUbv5SwA9L*9Gw8 z9|n-1t%&E*AUrb!iMpGyPz-^ASO!}_2P08C0Ld+%Px*C5>iVh$@oTz&9)UV($!~}+ z#;!l*_i-(4Jx&%mNj8(0XJv;?mpkN?Fwr}X-Z+)Nciuq4WaXYUw$ZwqJ-d%Jo3*K- ze%;H_aD8^S-ZgW5mPba)ctd8)PtMEhD*i(>H;LTxrWjFK=R@BE+M(lF(K&2$QmbiQ z56_NfL@5*-ncJls&&m{}d{K|d60^6tY1=*g3pvt9T%Bv+{6bA67ImHTEk)f7fl~;G zy||@QQI%4c4b-e`;-d?*ZNJ9#&8(4(^*ZJ~+`iXas`%>39}w$w#|cRA zkt%=&Guu&pKix_b)20|2{xV_oIjOpW5aQERHOw8MfV*0TZQX%ukI;W0cB+7MY-;xx zeM&jsTteSp5O1JDJB_(pnL2fqzVpW?9fYa@$=A^gkj02{tN8YJS6Q0geokqU8m)+vkVE~A6FD4B_VQKwBPezLhT zs!R*D4-mV>&qP|vxmkYCl~t0T%g0J<_ATsfT;VPGX8!;db~vu&s2ulm+oePcu zw(HBCznl$CW=U`~ZYVrgqrq+H^Ex{rI2X?cL>in&uC|B%uI;PlH$7H0Um?)DD)O(v z^|F*~WQYiG3Etl{J?~-wk*L~Qa`vBo%sJonE_?jj0YXqv4wBkR#g^w%kaI%~IT%A) zlk@ac2hkG_MRS~N-D`^3a9T<1)WUS^=jU$b`3P<46$Di4lt5}yO3lcWq= zko^Io67ZWdFMBAg?4?`TWHmP!(@MmZcY{j5&xY_!lV9+RX$qHGl$C9}hE3zhZF;ZYtVV!)^)8^{= zyUYcC1$@^5YJ)p7*7cpX34av;Gv9R^;zg8zVGSb_4Zr5wSD~+L26iNU3fRqyrufL| zLx|m3y^jI0nx=Lqkpa@KxqFLO0fDXZVQ;|RNX6d{=6H;@W||fA#AN`D-oa_8;|mgUrZ4X5?Pjj5nXpa%|6Gqwn7{8_ly=^?mGcDT49 z4C`h~Z6iGiFh8{68buC$>&y>2R}R6cFa%96g$loXQRc4YxZ?BEFL6q^AWw9X16VIc z7RF$l%fcKjLv*ohj`m3^t}S(?-O54k5vP%&)$X1~UvLdIllc3;%oH2}kjN!#tTKN3 z9D|xWPg`o8EYXikm-w@(E8Cjt7b`;cz|2M%QK}1`IObWgL=_wmi;;^yi|7S@XkUk= zD%plQk3KtX^H2=DIk)(9=$UYa zOw0X5s}aP|)*&66ckY0}6Sa@@`J?7Zxq+_4+401qJ?nuDLCF>o(5K*mi5xG@c*s6x zHfB?iAax$j!B1@9LrA=015)JP+$B4WXG#F^ZA@6wyD_2|%~U6OYOIq~xMbAj87++r z_{DS&6kpbXTv_u!`ubCL+xnY88oi~}O%%NN>~=Isg+DzmQNb^Ulr>xCYl`%H0oZFv zKZL{GAb!h4`EhegtibklG9u@ZqMF7BS^vH82e`4G=}0oWErkx`m~r50t~cMFK4D$& zNTSd~bfe~xpj=g^RT?mYik*x6E0BAQb>g|X9Ua?l;Adzd^;hz)xSXtYHHI$h!-lnR z%?I5ZQFo)*x8oGB8`i*ptbQi-J< zm>9kyEA6p8T2%F3<}L29qVP%AH7 zy#G64JJ#YR(qCXcD@JBO%N_VYU&M@?h6)aTh+B$f3f6fUreqQ;%>ZJ+J0s-==nH>m zh|)eW3Uss?c0@YKjXMuGjf73=IOJ48PE==%q2wVUU3JRk8ce#-qwb}*PR|!%4X-bS zpkeX_YGqY(H@`4Iq;~T5Hwig^b;l>s+Oy9q4Y?t$R^QV{j5B0j3ZspAV?H{%zwW1^ z0?1hCw-`xBCJPbSz3`*hxivOCNVjoGRQ1!?O{;6yD(&S!Xfmi85 zpN-iBrlC!51zMvy-MB4l0v%P~?nvdby{}B$BiH#UAd+QM zwfp>9$(C5!xy=|LGlQQRXSsWo{McmOw$AUTSA1+`LKBW4`@VgnK@D~tPqpH$eMRXDz>-33@!w3sOt&n8?Xpr(c7+ z$o>rye0FHhoh)T5YxoKHO$(~60eDpTfp%TCJS?N!1D~sle%ySx>Hp#T(ha`OTF<*v z47JU!_J%qver48D{0<5lobibb!sc3=&bA1>Zz>eahL$3#=Ndu0-%fx^%!!A1KUtOx z0`cC7=X{yxk2{q-PcnG9-t72MpovSDa zy_hkK3#>!ezM9^>%91QA^vmS#Rl2_bx>dgce@WwQ3jobPxFAjf4yN2yL$tdu2{Co8 zo^EC3D3%ja&;@VPMJe2uYirrzt1%jRpY-53^$5thkXlxu98GWewy#@?4KUGlaka|U zq!!PQ4J*Y=PgatFcY7TX@|prR@eS4^-73|lE6Q639XqH>aSA_+3Qx_Yy;n3HrjhB+ zM6PW+wij3HZU=&?5nv><&CpM$3qIh-f~!8EFo~}8aiKM-X-Bkde|5RNSIhQOY@SNxS`-3#bx9LA$BsU_~0mzUMD!VdMtY}%}H&LgWoH(7)Hmpoo5(|3K>}<(3|E@rS zHFv#jQ)QXDz(Yo1 zr$p4l4)orSw8=R4jf#t%36(f`yEk`MnTU>=+LZL}*_2{+f#qm=;Y#DGwinxUxriWk z9_KI8BSAEg85+9;1$li47wcj-vd%MHFaKIsz}*I+F)DB;ZtElGR_h%M6GVY+jL@=GwRE^Q-dP>hgzZAT2O6l;Ix8UM(Dcy`=XJp!H+kxJbMS zd+i=Df9G%EAj69l*ucn2vZR2xAE`=J)shPcsqe!1)gU%hLAk9vPy6&XeWk1Pc_SuzsxF7u| z-zc`A8U}?huDtAiP}(nhzlJS!3F0#vJu^UvV z%%dzqZ}=N(jzeTa1JWIjsKEsHX>@Sya{MxiDuwOqh{kUB_Qzigk<^=K+-TCz4KckM zfryPDA5B$GyIJDWvFMv`_5_V?z0`#^B8#%5ZDu;F@EkW1-wJc)od;?X=jOuj!wTK6 zDYAjRj7CiqZYmNeZl>~5)efX_{^g`AJvmJ8G#`0p)FlE3Aef%loMJ1_S1Pd;Kl4_z zAcA8eMA%G%s8V|xiTw=Wyy#gnPz---NvSG zXV~J3;6k_dT{T{X^{Eh!vO|Uaxq1I;S06~uLJ`OX0wx<6^Lu`SPuZhH8v0EIfIr9n zV()~vn$3(R5sF-wo$9Tvmb+?G=suB#r3kk;C^$AgS9lX*nrY~0Vq#&I8DY#E${(r{ z%fFQn^Q-l4|1VxXo}a>W>IpXlak~-xrjN~l3ss@nfwK{Jk@7`v>ubfBX;7O7?e-ah zu~uCK(84+CKTV-Xfjqf+Y!rNeKactsVZBejb9ovez!aU=l_Xw{r(!^}7^F$%L75!C zfjoZw;_$+Bd)yjYRNCivx3vp#Gg(QOD|ArJ$~|Fin1X17dNhs1vljj~*JX)R2p3~$ za}Q_>m{7Pa_SJafXvgfje0%stq+onvF|k9J8SR|{ZcrG;Ac&U`u!r~EmX~6sNTNyx zHz}N6l(76aS-~+v1yr=ZMH+Xl{LZ@k(Uolj%R8D#xV~=_LJGIWQi?AXQ<9KFu#^Ji zeiU0~JYGpaMGjsgn;1CQeJk!UC9^{6Hyk0#&n7ELKC__XhG1y_ZHiW|Ivb_@W)N?KQ~jd!oZ>>QKDw$_$9p86=e{5tNsS0fkI=g{9hnf zG$#NvQsl6`#^$1Kc^ElW#ZSNpCnTS6RY$EF*%sbgu&Gs5zzqe0YPLjP`SQiIjN;omC&TyX3!ZX@ysQpX}q0)Ug|%#YnwU@<6( zAnVpED92T-zNr~5ZXJV>m2ThHZ8cI(%pWkmtAE)@(6cgc6E$|u0qT@m`&&>=x-#Fl z&nCA4h>GPk+JhAW7#f#+(>)vwoXqBezf4$xZrS~nAhVK7xe$61!YVQ~`Z^4!SZ5t+ zyC{91hFSMwMnKa~Tre=mdmVc~Ad5=v(qZ7xmPv#R{(765l7IM`T&RO*O+UjvlS_HN z4}dO~mS}gt0<%{dtT`%XY*F$Kh*1TAD&v~=guMm_)Q;#4+%sF!Z-Y_k(4(r zvM@h7_;6x3lFuIbC@Hn=4JcAyXDRl6B#0}|fM|a#xcO%hqMEGa(W(z7))JLD?nHTM ztso7aq0dulchJcSZ<{H?qt;jJpDWA?UWVL!{#;Rvl@=c@ELIU-zAK(lirzXGeE9HM z_LDhw8Jqj!tdhUEA@Ov%arG#P{FlAzdT7If!g;e`UVUfMKtP|X)+?cp|6xo>bK-B# zE@+fkZ5Siv_|u(IvUw`_OuB4oj$BW;PyUN3^b59Gy|Ntq{(AQZ8$)nkZbJ>oWw*E^ z@9xPU1eFpl9x+O1+&{J}WtMJlvRfq*a^(3Jd?iWeoAgg)J6@E2Bf?K_>4w4!Mqj{3 zSkgD?m`|{{=KSYxKz!u|2uJ9%!m}knuf8QrWmtizB(li6TI?3wikz0Chg=&pMKHurU zX&zd73^12R$@}fLLNR;A-%{L>OU+-2g4?BcyhLRtDfKg$B;_0uP7cq1~$jlHUt`ey3D&ZzI3&K=O5#}IPN{xSrUC!`7Wgnhdgr<%HxVxrQ) z+*Ydet*qMe=q&%F)8D0oaq2b?hJq`QRf9p;a_GryoS2_P^?)g`)aJy+O&G@|e_a)6 zMTS>!o4y>XWyA)@omsu|NjBSgt!wI&Reza37gv&871{~Ga(y?<*zCiF0kCDUW zs)mW7u398ubcz3ewt}3-Tljnh9CB-GpqH~ozcnV&kqh^!8*RK;XxJc618Lasb^E$1 z@;E;#(k2nOu!luM1D7^APEmw`gReUs8N=h}|HF9Xl&uxO;Q1Bv=lPzq%j9PcuH_Q< z(+ZLi6d;vWe_Fv|0LR2B26WZ=qLxnlsd%zlpyeVXhBzGmXStwewpFvu%1QQNSln1A z5kWUImTg{;Cj43(v8Gn%eTu#rUmAAVFa9;dC&$tKL)QKkk!)FS-D&M)MkAI?x(3^O z(b@S5d2XzAdpo%xZk?C(B&X#!9qz3p{!R>2uhY3lDv#Fex_=@h+u$c`y0!@-di zmE3PefKgC3>FBr=Ufyyae4aTW{LEcXz+Utv@-F>)gzu<~{Xw_A1w{$+CMG$cLdX0K z)%#Y~SH>@vrO*thC2DZnc?Gc&5MCI2FtuHtr;j-=bV0Z~9);#Sk!v}|PvWgpw2j_k zrW)GASH)JThjVK(gM;ceQq2KU=jia$8a;`#pHOpg(@rxs!r?C>X;UydChg) z@R+p~!_bcho~o(j&v9mE=S2kvmCN$PQd2<;5QGL&zL&r8q@7d{nap=b33^zlylmzoe5zx4Zaewz+QVb=1pp2{hP_S|PsutUQ zI;{uk70lQKgmBvwm-|gv^$m1m5^r!5hiw}<6z;5IRIUqA zN-uYY6mBtpG80BttkZHX#JrsFA5+=~P4PJ0P7La-=sF1Qk02Wuq$JjlAUZMD+qA`T zUSDw*koZWUM+NOC2qA^)5F}-!@87H9N#)ffwKpV^wJm$7SxvGUWlPb!YvW^0s2MsE?_eO%%2v(txp?&ooHWP0PkTMd!?p%oMoHr!LY0m4BX3FI`&%dMV7OEn8(qrzNTD4ZS*4pt=)4 zE+?r8XPy=u4~c}}Y?vBdU;&N}AqqLYKZS*5Bpirf_*?hMN9GpE1Jz8n@I{qL{}1)= zfft)aoWP~t&DpJF8;T};V%Om;Skk-1ZII-nwlT805COn`lA1p;CdzV-Qb7Q<^ZE59!LFJ zH_Nl7#Q?aiE7#!A5(z?qn1*@IeTnJ|XFIIHgtn>?z^K{rwiMo;ud{-)+4BNui?A zJou|y2xaA>TKz_XVE>xC?}b^ZLk zI*Y8j+|qxp@68M*8M=oV+c=v2MTWHj;-ZtMzwTe0JMffxHZ|ws`!#7zpD$_(rKAkK zy#ikSqE4RQ$Y5$&K8|bY$^}ilynSPTLc*qfVoYyo2m$4PfFLQs`Hqi594rieQKiRq zQ)?_ZGWH0K<1>vB{xV$q?Tq_kbo%vY5C>>`SU7DW<%MoKvQc$k(8<1l_SBEQMOhw% zS-%69kNjnn^(iNw%K#r!MHyjpV080$?w%mLUYXH6Gj)~9L+rCtHL8+ot4Z$;!UFom zv3rFPOduBUN_@-qW54LN7y2M0Ni|ImaNY?7?gF4(1*o z+x_GSB{Z-i#t!p@>*Xt^q3DilUKSy;kp!<$Eb;naR@P%mq^PdmHbscq42qR!(26Rl zd)^0c&y|;2p!5S*fAqrL_>N0o(hwvBrnSkJ`zNKrgSkwLQqXIyZd{Yb$v$q;+YxXK zUQ~nq)!L#_?k*xiJ&} z+THn)zw^GX-myAgvkCpbn5^?}?*#_jdw$fC)HrVP1hc~;*>X}*2`Ev}LYqCg2#~db-*(!ga zNa}WHk}R&4V<@oOx~5`l$%O9htm~^6SVnPIMXcJ@Qe`=Zj_@#80Ax+(A1X>PwvVj78EjA!jaN4NzWT!to$au>y!|ly??&(D7F`jmE(o zL3VMN<>V1|6l>OV@apYZ9YbihoPk5GV6eFVDR!930kb;rI1FJcA{CIzo=3v(MM}+` z|1;d!h^hlMAKOCqoTMU{NR@&A@Y3ad?SC61sUl7MROn<`igzClF8)Rn)CsE#TI^0@<&>t}(%#(^Ile-B( zx(X8)T3U&+*25MPYZ??6>YT6Pxto4#5xf(god(QYmd$tUikVUk5cI3iR37m(fi0$S zUsXR((`2n{B!FUCPfL;VFL|OvTAB%}^zOINPlAm(EQ{p=bd6QbMFK@!%h^2NwKBOb zNSagwMQtK;(mPk9H3h%$gPD4h+PbI9F2E*2_V9mcf{O>dO`m^nU1`#fK>ZvmMSM?h)9)ugO-0$OYA^zIXEs2Tb)G+eX zufntMIb%uppo}#9-?7-QTYU1By}pc4R$0I`YPbv=j*Lt7}q-%_LLfV-&L|i47gU1DN#vt~@9!Z^A;OoEC=bumAu-PEAHEP5=M^ z000000N()s4FLc`00011P&gnIP5=OOE&-hZD&PSQ0X|VAk3|B3GP3{xpq6&7Ud3+n zY%V`vy;>KQ2o-6pr+I7mFaHKCO0Ng&x487-oP~JlbfAZns?>aR{ZIL?_@9&>bpC_( z|MGt{elb5?$3Mn@edbTw590oA{Cocs_Mgb#+Wz-FM0|tuf%oGC_X>OW_|N+OnO}?l zr_#@~KlMK1e!;(?|6c!*>?eqyeTmn9$|PV#-0wYw6Jd`8->70+B*wkR=#KWCEsY+|1+ZJWC=7GO6vXJVFmr1FU@Mz+{f0Cm0rcU=yaNuDXVL!>R4%| z5ZuDaDQm$hBcofRSp9nn*|>yL#0xk^Jvzb%(03w_!1(sSJTd5J=ubhb`Zi zL`GJh(Lntl6y(SYv`q4LumS-9c_)3cZ+-SyTQP2O&({_625qk4{(Lnofc7TrS!|2G zfN+xHqgAA;jb@tm?o#P;-+0nf8ScGxo#g+W?*QgenOZ$wAPF0tyY?n|gp1Gbr~BkG zd{&(NAAqHALtU%z>*G{OKt3j136MJqniA9ksnE}*)p{I{|Z(!}=ed{w-5(qvk%(h=RtT>`OPMh)ngojjW zA7u|axy_n0WW~rwzE)95LgQm~-Ij9i8Uz31gt_xSHhsZF2YWIoK`LM~`lu-djJArS z1tC{$0FW9Qq@WUNBM@5%1N5CQJ_$r&`+qA)g31cbwtk5cmWF@Gdn?h+tS=|qAbEG; z99x#CEhZ_LD+CUFwhPP55?(rpdl74xq@*@cQf0ybZZ3GXX}+XFxcFz^g6kYQV=!}4 z>zsYOx8xp2!gdBTcXP+v8UBZQ3F|O$Ym=IRJtmD-VVp4m z{1cALDJSHk(Fj;z=#VVT(Fn2mBBW1LCRANl{Bu&fj0QrB?m2X+S+YuA%H?RerlCfV zZ^^Jn&W*|(!WeDA;!w*U^z5Z^kT?`=u_vB$4#mn1Xr~r?MGQ`vfJ?#nLnhg*_a70h zf;*vJ*;My)lw^wowLnWI!0EGGI;JpSu^EZ=Zhmy+dZcqriOyvxosXe%fc1`+3H>&W zf?N5H9b}Ls;2@oUPYu1WW*gW{^aW-{d(R$ijzJ~Z@uVOjqteM70#Q1+XmNJHpzx>X zFy9$Na0;+>mCCZrGu&KGD}npF&<7ct@I>wfpLbNkIhJG{&me46%a1iNL^%qMSj~-1m4b=Cd?hqMP%?PRi zMrnQh>l!EY-n#Nb3qr5j`Qx4-8`SNG`^hiW@)i{+sE2vc?Pq9IEUFOXBU(bu94PVH#Gc;k1f=y1US7>E~_ z7Gr%4UAje-3_)X_;x9h}PB}=)Zl_w$MD0BseUpdzr~H3d(*Ln$DGwD*1Owb9bw=HV z$2yK{;sDUTNf1V+H#}v#b|1PToETdbK9{XjNRNo-4ipnZImIV;=#XaRpwEMVO}gwp z=G>uwTDC)oS#TZiLsk|4Ou5Xi{RZ>Zt z)jIa{4HfSS0YpycgZyjx@BhP1=(=K~R8`CN~X-8Qf=?xj)h|`p-(y*)r4Q-7?@CPT zqWoY&6$Dtu#ZJw_3LzG+!^vZPBwxm9dAqv)*=7!_QYP6cc*`YIF+X7{KRTO#**ZVT z1SMXYF(3R0i(qwyV#Fn)WvK_4=c&dSU9CEjr3m&9oMVoB9tso5KrH}hOmW$ac7y=9 ziZXS0fGYK-a50s`wWr@WHmAk#%n`#g8AIZ5bG1NtTmGf&Q(rjNKD9y<#?D<~ayZTz zTjcrTQi+DsjvVUOCkXsHj682O3mXcqCKs3tTOOcwR|Vm1J0}kDLYK@c@H1rJaw&sf zbEe*5!G&;`v$_aJ*Y&A}=`w;9<_U^OANKGY3m_)Kizz|Y@!GeNq1|nw%N!D%`#*FH z2S2*YaiovN0Sj?3i&Y~}1^+jyL7IIqRz#BFE2USWC3v;Sz|;35L;W}ued!oKY=6LL za;;VgOyI?TA4r-}ejVHjKn$5xkU=8LOKY-g-(Cmn@_*HXXKZCtk!?68pPK$A0en}S zE6Gv;|E3CAd72dDM9bV7A*BVkbQy%LyZ&@-f}i&t$>ETaHGM{2SWjCtgF9e89Euca z*BhlwstI6dp9IbkFq2}FNsl zmvG{bwmHl_6sNN_b-yK|advdx`x*>kEAH@kC)+C-phGFbM#eLe{b3D`dXM)8e*@T$-C|Zyo-mlWzs2Q<3cpD@wugto-N&Je7b{R(CRyv;FHIf)U7LS1Mjbc9_VdTUz zA@pKxu=_)|B;ecn6?jvW-iyO{{0cX09xyJ$(tg3q;@(PKU;{5BW>vpRSqM>626#zP z^a^ML?KilCQ#1txb7qdsgj*dHW6fX*vK&<-jrFxSqO&ytRK4uBA(KW!z#8boSlV+0 z@5u?{;pl>Sq8i?$SP`HfVD-7c$u+D(1w3nfudV(k7ZNM>!ny*(Z!&!7NxvvuhqkKYF z*zr%@qw31YlQEiBe>i$GO0EqtJP{Sfzvj4Nj1$FP1*F3X1vbq%5-zQS8y7M#M-H6B z4AHukxEU^mtRXe90b=!|=nGohtO%r}Xdz#i|9n15vJ>%Yt``1r#+(ExNaN=DfLn%H zNeYHnqkqG0jDOSXIqG-#)}S_(d=#pWVFMrl$lET)$TKiyC;qxEWd zy1`>i`d;qpc#h||KDGo@OZrvjG_OGO(%z7kIYxW2rhy*Q`qGzCU1sZEQw^XF0P^cx z0P7>YyPUXBfqHN3L-6W-m()Az`h8fH3~!v}>39w+4lHM^O<(7z|H7~Fwi{Zv?CC3M zOH%_98pkL4s$l_qsWdLg7g80<*{oo>pI}?24YTX|{+Y1ryznx`UCN=OySN5b@YuI} z$y|+DTu4Lw>^caiP9dl zcUW#TyJ_U!6r?Pm(hfZ=GDO1m4_lzY9qsP^zBV@ZDqFnN7^v&?POvyDuanFT%Y-qK zw~qgbL;6M_=2eqCl`H3x!Pcyw&Z+FilUg#9D>a-TM<$X+LA_KTS4q{QgX?veTr;2} z=-f?}!DLGJ(K%+Nc3z-6y^?S_iLPWWMYIs%$1a}|6SOL*By8@bYfuq7G~z)b&5dO% z58yq6S&I^tkpt;UE205(O)|?w{xXtzj2BXo%ZumRSYOQWpef6Iv_W#br)M_JXu5!9 zB^vt_t$O7Pwja(#15hJBUy3WEQF&&rNo7M#OIUpL1 zndNzi1tB-Sf}#3c4QjrEuLlrVVA$ZTO>on`^ngy$see%;qk3My!qvW3M%z8j%1e*` z4Nz_u+=|BKrTV#$ONqmd#+&8TwYpOuKjCudJf0q;@Y7mcugST!*U8lx6X!a25FcaX zuF=l*IIzzR{}CeeIF4wbl^J7{I&hcq=B#jE;_%ve+6@Cg{!}9ezHvU4AIZNxkcC?T zSH5tnz3ri$vpTfF@XphdQK#ItV5%0@{A{NN4-;F~Vbxzt(jmPu;|^%MfTC_?c{Myr z?{BFd4W9qy*wgxBtY9q~xpm~7c#-jp5o8X6OP+;l3;}l?USWMB%mpgDE1q9ZAjF-K zg?Tv{=BXv0$eXEiW;Qjoe|SU7Ej*VkX)+ zYhc~U>hFe6{^(p^*L@J-|I(``^Qb~iPp$vfYP$TO&NqMW7R$zj#@3Ka;)Hl3W>i0W zpnZQX4*{T|6(k5kC-h=}fF(j-J9cvp96cvo#U8zvT^?l^QrX3)qNPr2I>-8BHB@w> z8xu$q$#exe%CjU1+a&|t)fGY@nr!(18`?J*;>9^4s%^|G$cbi zlmNd3*6@0t%ZCQ|d1z>9g<`qlRgR%MHr0+XtTGPMMkP}U!-Yi;QF7yCVJNDL2pP|( zc6@b~A8@qlnJK@*i8iU5I>1l*Na)!*;%Niki3!2ejAx z9+<`WNu^xIn??`XQbgJUb~Q^$;;!T0kXB@qxy~Y6<)6tx7+YbF)J;*f!R}G0s616c zW0i3X1Hr&UgMFh|m}Wt&fe}8Vewln?c@^f2s#Nb`eR9g9MFg4GMc{&6I3a~-xuxF6 z9)(Uee#c4Ie`G}ZH(U;;<{d;$3Ve?b4Z?it^*TL-A)a8rdF)D z47M{#WS7_Fu51Z*BgM>{$uo$OOP9MBt|gC_DiYjlZ2C@3Cs)y{S;nN0+>1tfpPVBjDmO+j*O*RW_8(LXTeu96*i1)%d8lpjR+>e<-UN@67>*L}LIY;U@KVlMEP79NGZ&rK4I#GYitqtp zipYIoOLuy|QK>p^O?pfTwDzYG*=>tMLg85ZHw^o)q@C|jAs09F+#CST5B-BV0ST!* zP$vmAKw<05Hunw&oRI0!T_1Z=yM&|}A%~-K3p*142PshW1F7N|zkmrc&Ef&=$S6JK z4o1o1vIj%3*!#wB!?u9LQ$^7we{-fK45MDR%Q z?&0kjcwIEqlIo{l5vE5^pjNVoJWUY5`6!d!C+52450sHq6rX~mO=lW8LIN&g2vxJY3mh=13?%RZV9_f+27o`R-a%6y z6&GvjZOJGG#$!Y2?@9;}Q~02LW``0QqvEi(x{DxApj^lXK@4}G+-hA7mr~^gHDFId zjwZOCqVR@{c|i>OKP$oYo4w_P+Qvx}cL-LmF!ugwFa|Rgfu9>>OJ~h?+bxfxXz8Ee z@J_?Nk$Vqros@`~v1FObu&Wiq?Eh#wH8ErMdy*~Y!+N4A65!! zOLKi*DtndN^B88>p}Va_3O^^rlb1bGRhp5hSQW)g7C#9r@qG&d@dTEfp5;g`UHQ~(v5jGB*ue*y>B{@c>vl7YQ`1X2k!nuore)iA+(Y~ z4Xth)&h|0NIW!{0^L}vNI9h4@VASaWzb+_1UXmwLQdg)vFvK zb%9q;Tm(gDyt;$74HChG133+m>Vbao-8jg^^df2RNrin`0W*}u5jFw#(FvFp;LXuw?+!0$u;dRh_q-^u*fpp|E zl?aI%HH$Cxapf((x`pmQ&5P8I{A#r8K)ig!^CjMGtvc4{BrSQ67IcEbg);T}?Tzf1 zZYb%ln@lYKfuG9VIutP7o`<`Y3%5PciY&~kEx02pgCv;NBF+fc!up~YGhupPsKo`h zd8!{$Y^Krn=ojvGZYik(vSxDI=449>g1bf49uL%b4=LXOn45AXiw0I#Bo8*KA7Ft` z7@badF+kmS=2kpl)8|eo66aKHpyf+qiN3BrFO7!&cSwXm^L9X%7kTv`+Fm5QAzw;~ zme1+lTEg5Cu;1R4J=Sq?UDYlMos9g(LLLLMT&@9Zy{D$(+eCW+RojSN>_-bKqg^o7KfP~{IbjY5g`;^8SR3cNGy&c)!9e~N>@n(;t$*91OSX5Wyo%Zv zJv5H3cMwuXEYGX`wb_dhj&*I!Qv?qsD@V1&qzKPza3i~;-hgsr5$s@+Pzm-k(pln! ziHJ)xRZ1l09ORW!NcG+)RxbgeWs%)>(T`)e^iw~nhfbU@7q_}Xt<%|!N6{RO+@#|F zy94(>v_>ZeQJW~<&*d z!3qe_c?z#*aXG`-QqL~L&zG1O&e*cJR?KUy0`wdNdLl`Njd{|LqRswYp^xW6mW+wN zKV#OSt&_mu#mN1JzcTNfhvMB|_+z@0VOW89Wuu&|V^86VfCkH)5xEf84a>r`eCwMTj$X;c+@(JL!bR>}*DC})Vfy~r?T+C9Rs67{$ z1WSN&_Av-Y!tK5FP$-MQ(nkGW`p;d&a$u#ld`mlZAl%+aO#kko*9w3=&DF53L*lgp zXv0pNpx?gPpK;_UX3spX-u3wB4Ju}~lmpgnJw3dq2Hb#`KuyNRh=cF96_GmE{h<8d zgcr~uLpbRgee-zX^FI9oB!lRXU(IeUIGl3K4Si(-GLhE005J;1}T9FAFI@ zoqz_oAqo{s!OjE72E|F>-MHU=Qau^qpds8p1nOIByW@aZLI)HQX59v(pvVx<;zjRH zjf&;C_WF9|eki9UbZ2)>Ha4Aek;jl@XG$aZrs0~%q|qE9921-oUSoOG$k3bO=&&^R zvYofz!)Kl3^+ODxGpNk)0j%oH6wx@V1nhiM3Z;&}=fWu!;_tgs+5aB>G_dAvF4{hH z5bQuQCuG<-(CX9kX7fB|KwQ8NB&0f)?eVbyXr!FCbL=<(WEiniest5?1wm!Z)-j>{ z&iRqF!7;_0TTod6Q`$EH_mBOg&{4yEhHWDnZ&0)@}}f}twIBlI2i zaA9%69E?4@=-Rh1iQeyr=2K!hVkm23PbY-VCV8P~*WrLvS?1>YT_ku#0q9pIsNPVJ zrRj*x7p35n07@%X0m0M^rJld=2^|YC!7#UD8NqetV&Nw^4O60anEmQ{Zu$c_o?Goi z^nULr7<#$Ic3i%WcIY9bbuJv!ijh7gbRfGWi%#Os6Re-KE}tr*Kxz>^frL^@)}AV* z-`3us1boIBuN!7IkpsiUp|nUdhXpX6{wwoPkSl6j>tSSPmo#)sfVWY-i^04D|U=mjO@_yYJTnTJ;TDKMp>5JnuWz-?4nK2=$%2#wpB0nfDLD5{Z4 zLWR|Q&Z-GYB(7r)v7>wOxP#vr+br8L0$&JtbdgUINPhQM}#pN2seFH=J8HNPn` zawl;x{L@4r+{PF&@;wR^3a?NzQDkC5 zisXo*&ZC&-I?QXHh1+XLU0Ml{fE7uOR6q299OLuWY9#NNChxp@(aq!!JyaA*zio1{i2 zUBr4hWt;?g-}@Zg1qN1hJzplF$BI2zsEbUK#>>D!QERM7o@R(-bRB$PsBZg3LM zcK`F(M>jCLN~g>*4eb?~n|&)Ci}y_j$X~m0U}(bp7Ro|WgUu4t#sWz8`0i~#u&uxW ztUG+(*b~ZNLG&y1?OFr`6SHIJZ1%VBx_}~iYR13+>b`(L1Cj*FA9m)`+78gD$VvB) z@(KC1P=E{v`<850H(B9t>-rmH`0pn2r71gK%8YRz63|hORcPS zy})2AJUY5r-7&X0;_@gu1U%%>2=`zNzGaFh^tjsmXmfH7c7p)g zk)h~&MI0|&Vdp@WlpMM_1rCeQjm-_jQZo-HB566TPY}hU*^#o|&>2t6YRiC%#qL|widH-tF3^sJfK%VjU2V^wu_#J| z16JozS0vu|52VeZ(a^{XjQSLR&jb%Mi?{uT_cY+)UYb-_U+RXU;oG}=omoO&gWeX4 z<39k-c#9$X>C+0Ft-qGy;+}!x%#DblhY(8`>M6lCw)>zbE_R!BiXZirERuwiKIVqB zPyX=m@T@}Clgs}z3FIKUENKS6V)6wt>&~&W=m#b7K+B^8fCEBK`o(GaJHeTP1x^k5 zUpnbAoZjL-h6B@QG^h13SdPw zAqd}*08C{>uFB&h@(Hl|X5}^}uuNjSII+0TfzXj2kh6$H+OUOmno&6A&Yh1r1!n;# zD+Att15eK%aIRnb+wuyg8$QZS1OO4lpTC1A9;VmzJkW~^0oby0^!5CJ3N2j?l4@tT zNtgU@<++?8X~z23$$H!TiWHRX0JDZ;XgSJ81Rqm#}TBPTbZ99bD;K{l?~1hF@2IRPgiarPL8R@^+R;*0g8VN~&@zyPXc7nPkuoQvm5xc~3RXGe5g-9(fgb0LB(97i z^Q-0DMsR!(I|;ay_edc~fQ`Yz*WTx3nzlcu!T?`MyH8zrfK3Iap$L*=!QX3?vMo_{ zXTrq*6+ojIzA{jdoKIOfHGo9!fjl>{0DR*PmTK5w%5rozZjS%5{K?=w1`lxxzqew_)C7 z(7G5VUw&OqH@~$`@g?VoTsMyEBv^X-|4mI;H)^*1zRn`m_zC%`F{ZuzeYrSigFnY1 z^Rk$xq;DxaZ7^Q)w#TWxY@H66J$dUr^>J5YQ8z#N&kKjZoV4u@&TxyvrOW#vlh)3f zA?D4>J9p=~UlzF<{i0OEM+df=;xdOGK6;J8Y_s~3oFoYFZkuf1;LVr+kyhLP7{2K! zmXuxUE_r?--zrV#`I1Ksirxny21nbPXIau7Qso=MM1|P8o7$XX&K`~(`*ZVjHk)Pa zN|_p)!iMV{-c(w<}s6Y`0uu?jPmcOWRtWwDyRUMF`^yD&TcHT%~N?Fy6xAZ>zxt zsUYg)p@g^0brRTgwKGTI^5g4ggiNfR($J{w0QA^`W3D?AR+(!*k2$5mm9sEFb@#jt zAZGBWj=~?BGFl*u1tQhC5xMuIB!n&KFnb1Q&R8vMeAjy@mPw+~)qx`ehD8$RoAMz@A|SSWNrhohr|Tr~fnj z!5L8yQ0q+q;b93T#y;B;%WLLG6y<2&mPMtR+~~)hqrb}LaG&>TuHh6iF4P`eU%4f( zElAdWd)-H~jBM|{M>~SMM)7~5d+fGZf!!M&v~Vx$?D&A(9L!O+KwU4MPZ3e?n=V$o z=ptiy)r(z!OL`D{mFImJ{0@EbTrN6~m_6!I8#iueQD{%dC-?9yvVytV6E*5KSYwj9 z--&|7yNJ*>ftHRJU1l|+b4x*PLtxUSYdJ+p_?PNiD65?(Nb1wO!rbn@TpzVX;-pgn z5*&r%+nXCXyI=QZqG4)`2PYt$hg@8(T1lWuPg#RA92>`XU*FdTB+w%wYS)Mk=@v}! zYLw0<_(wdWh+7Lxqxs~8s?uJfLxeelO`T2`NfW2y37%)1FRsV5RWceo@wu`p zJRwbbp8dK-yi&{@G3#xKjXUQ*p!Y0k2!l$m++;>$=YWIfz zLka_!t)mwd4j5|;y(=cG&?{gzMp&;sCBSzZ4`7WZ!z>mw$*rBM? zMXh9i@_@gShGve*GNra4k9B8rI2rsiS?tB{hji2Sc%TTBXb2*i+PfGIaBlX90f+gQ zkZSBC7v7{0+4hJf7$h-Qt6kMc%PDd0_0~dt<=YlHQ$MN2=vJ=aFrdNDy4Z$PMKnAR zyWA8?zpue|dx9o;l26`ll-+-_YaqLIFsZvaC6q^v?I1_`;U2h*eHv4n%1Nk+peCHz&gw8-W!;;%3u>;=q`q1A^$-D?C8KL;ew-X}@5R$l)iaG4{1za1A;zid`@tTvnC>$9{cdKVKq6-fdZ^)Osc zbif%5DAf=*yk(ks^p8@5i@kb@=}?(#*@lporKJ7Y@JTJbh0$LJGtqFAW z`Q$#owy!LR>a!E_fI2Z;Wzxy@P~8Hn+XSvs-s7|2q|j%b;TN88J-NN=`)0@#5|sBNxA&ix6W_GZrX z3i5W;mTgEVv1UQ?SW4EQ-m4)!k3AfLLWMqc%$44C5k*;w0Ml7c{qQT?#mZKg%K&E- zIIGIy16_J6SDFWt@j!_Rdx{YQ3s4KpK(o0VoW*Vpy|5*P$S3(qchfN>m!Xx8Jw?To zz<}y%aD5-{O6}K?uzp5C+=7EUHd9U55yrOaA|GMyI#$#ofd@0P^v|U|FPw2t`@py+ z%mFSvyeAbzQ{F#VgYx=4Z|ZcZ4nLwM^~?gcmmjp$1@J^DU~N`QzN79LD_~%C);;N^ zUbV66aVm`Zv=gp zJA))dUIkF@!b$F7+y~1$R6;MI<>5An{+t_wslwb0pE$5N-EdH)+?MMiI}8vjp7n2ZVzq&n_nyOqt?i{65*Y^zmy%B$!OPGBf|5<{+afZ6^!*}?}EwS~gBpe;@_SY=Y10Xq6 zzT=V*lJrV27Te;tc=sRk|K0qC_kXptL|mvlwQ2brPao90)!bU1too6gJ9GS^lUt2D z-qOnT{y$FPoaFNd;_x6(Lx-X}U{rHP0MOmpdVLyMXI z_!m*u3j-;p@UK&maryuAt(@H{n8VgWs}I_)0erWIviF+E1Txm^sQ9q%%!Puxv=cqp zDk{OUBr`9*9_@yBmjg*SacxtX=Dk(=V9~rVyckp~TDx|Uafs|P)?6eHa78l5l@?Pb zR$6MKSiKRM0XpGKLL!RLuu>WA@OmZF%N;z6+;vRaCXDLU)|dyn_Uc`h1^JH3Sj9}*XF}Zo;AD;4nIl_wB7i4bVlqmXjvOhS1L~kV+B@4@G@3ny(c7T~i~ewKSH<${_AN?<+g$FaMn$^k?ywfL z^%x!7)|w?_lPuUFJRMI-W~+er1iabAj!KFt$`3p)GvCGG+yLG-rWNz)>MO_-P459# zFzc;HT-ddV{cB=!P39_{>lGe-=V|hqUg&QGmRmSinz_2%w=DC$k0KfOP?AYE-|R|* z6$TRV<1_MB5vKk$>$Zy%aR5;u=Z6a7I28=bkRC@?C1T;DH7Ee1w@EX3FZk#bICIDe zVwF3xjNRPTR)xlqJ0j~ZdUfh}f+@O&;_A5~^exz>IA5YD;fk6uWgauIm%8rF=HE`6 z76=P?t8ebeqdrFndW+sdk#ebb)`zA7u{Pbh%Ya#wg}$FlpqS`J^bUzT#qMpS--{9s ze$Swbu4I+6UnYc2zV4w6VIiM#aVaNSKwc9l;L{?+9Bj%c-?5t%N|6G&J?7Zf{hS(SonQV8?Dne93gxf%7-a~0!eZ`Y5;E;D zDTB?w>dknE3)uc4iK-h4{7{dCBA3?YC6F*wiL)UCFC&d_8To_ zZXMm1vO)wvNUpca^2X~Ae)U0vknlU|t8CJtG#d^zXr3zH zzpKWC2JtWxoAyowjRpZG&2$91D;{naTq1sVcvBb;L6Vn~KC~|#`gB83CTQ42Vh~{Q zF;`7cP`n0zkNvHqny0?1+urPiqr2De<9R{#24ThWd-h3f9C@wm6t*)uQu5*eumA;- z{hA^D@{SEA#dEV)W<(KVNk3e41u%<89CD9t)^n$~)1BeOZPQ^~xqepCZS_k}cV2$7 z*0UhZ`Pp|9o?3;;=ZfP|gYZK$Z!+UHPTuk2Zm4YTD-O8R!{Fwfv1uualHsL!0Rv{_ z3z#6!Rl2_*bBzVq_jXRg>4b@vQjOM|P_YQ{0OpX^+hiaHzuesOfw)aMfVcYZZa2jj z$Tr$BX3xG)cLP|G3x;kREGrkL95y4arX8+X(+F+`a!Nmz3RfJ3k!|tvnZ-{vL@}h{ z*Gip1qBhqCN$F!citM?KVIZZJ&ExUuI!!Ab+k50yNoRhU-mqzSrUU2mS^f0k*r1E4 zRs7qGgPNeLLJx1f1Yv+x%Xko)`C5{9ERq1gR*Z>KRi`%34#wzaf!u>+Q%a~};FtnE z&Z%iH7Xn?}wuZ}%ZYt_Z^Y1T**q_=v2ndlo4L#s9)uRd>b2=C|?Xe>TMXCOhqqnOn zD}HwJxz5LXls7aN+wQ8kj>bslNL6fnQA7D$|g7jV)BO93!~ioV=l(uQO7gTh30@UsHQK5_jVWlN5R( zf!#2KlKG;48!~`}%9&lI;s{qRT3BJ_XS2P^8AT8Q{Lu)rQc(Mcs30rW!f>|~$!~zu zaf;XnY?YOZNDry_x~ebjv0oPWw)dU?ABbI`I7*=E-R59c408(DnB2x8q}H4|Cd!Gj zRh70*z_md^Gyl@r;3LL)biaC>g$dv!KQSEWA{lV%J$8!M)@Av*T(0CAz{G%_Jy0tN zMGLjv1=@rh{}VeZW)mjAh_eRVq1=dz?y2Gp#;zKsozhZv72$z!lAjK=2-E-%lhO=4E7r`t3&YG3Dd^U0DH~Y zaC=G1Y6C4YVlL6y)*qbQrQwcaS?Sm+U9e#R;m4n4D0xR+yo%qPobqdYmr*8SHlWA$#aBCymk?<;FRYl5Q|-4$BvWukIWx5pr1s3 zJE+youIZ$aD;Iy54y5tuh4ydn1&O7Zp0!+zviYJ03>x<7RKJ^2`!6R&E5qGw9P|di z2q9Gv(cOXq7^BL(?aY)Fkq}A+cL*7bRi)$iLT&X77o|PxK8~;#q(~oYG?qOt46MWs zo0%+ekxME!A)>~Z#d&!TE$cjk()duh@3-w&>?9Ud#jEYaXW>1XcPm;QwK2B=c7k1S zomIzSTJ|X6B15XrMCC+v5u`9xCTWr&nLHh6P;ba4h07|5bqEt0&e)#elNO<{;fn}a z{BOJ~pgb!0zct|_7D#4@Kbx|Pk$-&+Bg-Tu9YIK{k$JTNxH7$)!qd+k4!g%{8&~vG z%b-(?*-~O>$KkxUk3sHetBGE`tLywE5dZ9S^lG2Hok`=GNC7L%H(JA$505K2MdzwB z6ZbYEzEj-wznRNt{&SoupeWiYdec zNLp%)qH}l!%znPKTBqZC1o`DC&D?jYqDbSSjW)7k_Jv=yhh7O%lx)Lb2<(n%jlvyt){t$Pzc(a6MOH=0LNfY z`=-O;J}r^6XjHu}7E#~@JsDVr``?A(&csj-Y>_q!y{3h25vb9TPSt0{q=Pwy@{h7y zA7_J0Er8)o_nr>k-+h5q%re$+y8z5jkJF0Sv`bayF%XJTnDd-C6OQ5rebg`poEWUY z8yVR+q(fmme$h(}yy#xeW)@g-vaeE`B@hn<=lx53*lsEEs(VX-K9vI^)T?^Dl829y zr}Xforz8QbA`6Nb{`yX~K48=zXi$SxYK1as7;!y=n~FbrG~LB86Q^qy^GH4MEZb5V z6`fJBY@hM|sJmXkMk~VI9WHs6>Mus7J9=x9dX5=Ih=)8sAZ8|YZLi= zdcTH@<(LG*H@`O-;u!=eJxPT5b&T#ACKoB~t}7kaEvdR?65R5Ive!5y>^l0_5V?TE zc48j|rdT!RqRvhqmEB03g!v6H8#{>j<-N#3Rw!f#>Nj#~$9h#nEG{`>V4du&XWnc{ zX!xyF+1NPEW&_Jo<;YQ_i-7kj4KOk)A8esV@@z`%?%rVHk&{sI)>%%eUz=%|*&+P+?1U^yA#&x@B^7OSGwuxb)3!vpB0F2<+L?9*neU zx8R@!<9BI_|Kg%JQYYy3wb0bFTQ-LrKl_RrvShexB28Sto{|X%BrP2#Bl6#>LdJhev8)qd&*-qbGo8wDI*D* zL$=aE2Iki}Mu28rmeOz)R|kQokHp)+e?_@3VwQ86KMOUu_urs%-$8pU9s=;#Rsco2 zcF+yJl(Z%KmxwBlSXa}!jB!av0`90LEK;0gf{nfGCRxVXKqLtPO(_G%B=^yWe?Ba19)K%}gilYI zHP}MUatc#w0ztpr=YRSuc^PnS*r!)!YI3yadC%2utXSR-k^u@jZ;F3E1(sYO z#MJCaHL~$}Tj;Tboe+{O#VmF61VW{yJDlee({PGdz{~imTOT*s5}6dt2zV6^)kS^( zvGTQIC^`>Y@Zi#~Cx6_fY1O<4$ovkv?p++5=!SWnbNtF7Cm2bi*I}siy6fg z+!qF`k$sf#&2SHoEn%^vDSKp-v zDz-cganNlrG8=U={Ld(XN6YqUoWwf@z1PhLiEkMVRaz|7Pj_v;UIVX2BE)xPk-}x9 z&rhoMe%swyKqq;}1k7MI|CTD9U08Bj5bzP%cx-Ef@R|xDJDkP@?l&tiCl9 z2B-*YdR+lBvNOYqy;2_UlZ0LqrCM;|#OpLAP!WB3&IaflumECNLVKzN8(oTJU(X4r zuAc&_yy1|CmxGlXSZrZ5bOcuk9Ern3fz(UJNCa6g!nI4diH?l~RvwND$5Pt;AF+0Q z<5-%PpE4K($^^&J7ZY>xTzA}-oNe8Nz;1W~YZj^Aa}$?+@<#zj!k9Uit*Gcl$kYQ$ z-gsDM@#I8rd&Gt8cMfc_lasdcYkH2SxyYYnL9HnA{EWuDw|Rc~w1vaWH>6`8AD(iT zFl3_4J;x+jxaF+wM_LQ1Vzv8F~|c;J;Lv)Rfa~_;2u@S%1~0` zY03A5q$HIJxUQowM!vJ)onl1cIQyw0b24yn7{j`#c-lQzUQ_oHA45pHmEVa?b!lR8 zZgyL3cjqTA5Jh##8&h!mUec9pis-E4QXvzRkKI@8g| zhvYl0q|o4?$&&}c1QR`wQi7wGUvkMuyU+E*LnZ}_ux5W~rh@pVoN?|ub}BU>I!0HJ z)fmMcRTIQ6POjW{N$goS63cSSOAHvT3>43uXN4raP!n`Ecqv=o257!r+7kcNmO<|# zH&vGglc2F~r3kcb8>?5upy3ieAxZ=hj>4OPVi@iW_Oc7v=RjZAdt(+B%;d*jUw<^6 zUh47&$u#L+@aV={zVO|Z?FB_Eyc9wyqcbiU^SK8|{)i5-w}0C)(vdtXRl`XA@Mj#U zdw;CiKrqTNa`^)hVjw;DM{Sk$*0nj|^haUfNsu*LUfHm&C4)RbB}+@n(~%mTrUv*pSQj$A;t5v9(?pzV2 zfxq8P+vmHj);GLUrA*h=-5kV?>kaTyqAD7Qg@rVB`vnd4RXae;k+raV0DK+3h!o2G zJSzHLWPB@FsJJu7i7r(;$zuRIGKthH_S_bfm&7UWv`yFwB0mL3oAaIuSss8!C1*4Q z<9CZc$wgP1yg?KRJylYgc!Y^xgb!f?u)RBFyZ@;>>3(vu(g#|a)hkvz4fa$&++ub9 zba%9~fX*WTcB;O>^->_5C0AH6lGq%e*4@BFiSX<)Vf39?Zj! zruSLrleskI&cn~E$8ZN9t3_K$%LT-fWvu~$_*)W2HAMCikKtrEA$Unq`Flk4!tMU<3 zHvoaixY6hRSWdS07l8Bazdje2+(#)SO}GK`4JqH`W?;GrD2u#9- zDy36OHQS8T%mg8{0N&HE4*%ICqZr^t4x?tLcQhVIAm~8ta&3R%r_Ux^pdl6P5(@WX zl9Oc^(}=yAO^BTs1kg8;dC3P?IwS)Lc7VcZP8(bHjd-Gtk_dkW?mNaSV3yntM%1>1 zISwUxG6YK%Aa+o}%Ml7_8lH|1Z3Rwvh+~(G5Jh24Qm=2@;}OjZ&|ro7T`_0N(Km_f zA9vsMuRrdsf1Rya%Ua>25Z5&(+TsD{wBGyd6xKov&dQ^5JZ2{ z&~`DL7RM+Fi)v1xH8SJ>FR50Zm>PnO$0Po$g;-T83V1glSIc~7p5u9YscjWX6- zz=3W2v|I{nd1wJNV&u8B+nw{lcRRes^>;b7N-C`JqzqALoEb(o{{{cP$}A?1KdpgZ zt#`h3C2s!Ff*m?x)o%^*#VV%k^9MD_Tye3+uj5Zdvu0!S-|rvv$=EmsZ{HcY2KgaD zl_iYeBM>0BAl3c$(?`#?(-d8nc+&iJvL9UZUYVT{|0{Z%h5#Fsg{MtCCxS`QnFBGi zIt&t>C2aQ(50tq59Tg2C(Q)!sGcmU0`N!Mj#*&O39pi{!JEH6>+l9^EUCB%+T-vQE zak}OLr@A@xa0&MQu}YpO+<7!SBYhPA3+M0^CIMg3e&)ZG%*$oY&gH9JF@t1Y38Nb> zp|^*vx~!;`%Ag#mbHPRGF{(uTLw6LVE_ueE$ zRlaR=YPpkV0_sb42BEjYl6+||r+NcgYGC34qJB5`Wvw798Ncf|LB_b21pzgpM!K_6 z^e;T%zVA|CqX^FaV!f;-BubH6oA}9M(5BF*z_8&I8!ipevZ|uy5zYM^nSd^=Jv6l< z==zb z*t2+v-!96$*&}L)UGs`rg(N4fX1P1xUZoY5gusUz7>BT~au> zch`v?tjm!zJCfpIaY`}8{c&L#p~|Js9eh+cD|8Bi<4zpksmHpFUFYBi2Z-LA~ivYg|&`mgQ1~PdBVI$H`n3aqHLI zRfo9WbpbHI7T%$0i+31IM+8U;cNOoS$9kt@3$d3c`P!?kg!0I{>`_TVb5fR)+r9gLHf< znE}kXSGU^q%vkM%Iww6o0yC~uolO2*mrhRf?rNwC8vFK`3Tsw^3o!-7Bik}PXlj|I znsh|T+HHUE`L4dIy<&rJ)+&VXLNE+ZP^p{m?W2JhJ8NIvq&pGBeK`_eXIF|mHcnLE z5=YQ%i=~ONL`)3X<>UJ&xwUXoGXb}&GBUAjw%&=UfZ-sjs?TLL7fLQ@qn=wAGcCwm zC%6C#ac7`B>$srNY(ZV1CZ;oT2;j)2zXgu2SPUry&sswEB0aRP>o=^CvJ!mz^SWAo zy+6EiayyQ_H>p@XL}Fh4#?Y#LuzM~rhNy9QqPgSOSwUgBqqpGK*ftb0KKh^)69+-> zlGL@QlBS>9Tk$LtmjXkzu&~*0Les!muljd>a?PyL?`90-R)JBW&ia$xPJaHbaZX_K zat;64$JZEB^B~+>J{lrRCE0V?1D4go$+z+TSw3sZ{xuA1z-9Kk8JCATmsh0mY{BUK)vt>A%wd!2F`~xAWh* ze}nn2@n!q=IsNziuiBqdzSO@T{D1EU$4~Nn5B;m}gVbN#zpnqfUmcKSaHqc?g#Wea zZTSEA|IvEm_N)GnxF_^a?4Ry^fbll`AN}uO|LNc4Kll4p{ri8q^>zE_sJBgzNmFCT z_q*>ZY;U+Gv{bxl#sfr4LF>)I_w>v}Aqsnf;O?)cZr)nxLiw2d>x+?qLa>X06CVrpKoISj`AVm2fK z{r#Bxn@*PoYl<(-OnON~e`0vW*aN=C45K_zq!JmEt7DkR(=Lw?|COmC$dE&s*rhJzvh7N8FNj2hd$ zn~ViNosJYk^!7ycDP`cK-zhT`$@jRh3{5aS6Eer>Mdxqh9^nk*=mbiJQr1mwsiS`-~g zoC*|Xq!jZ;hfd2Erja?^`^f-sntnx?*jlKP{orASp!)mZ@`9BNrA}XTR;QBRZ)aIK zrr&ohF`Ma9C(wxCuD?gxKsLP38gk8}TKwJOjs)a=IFJCwDLgZWkzJExNH$+6~4S!8256Pe)dw%jSqedYK7$SPn^DF@a|Ah;wHuY~FvANluI713bk$ zBg5v2(Z*$f%W4heI0;o_ZH%oM@dtAV7;rS@7)J?em>1)Tn6P@m8+;9>!=3evWT*;E zTw_ubq-I3i8#h+xnliH!$osgJwMsA{^A9=T_pTZh;9webh z72g~FTEcn23UKN3OSQHfBEA%!;ISB@S^5Y*F3Q4X*YF-&ddrr5x&~X?rW$%PC3NP! z>a$m1WPzpG7Fyk(OpqcN@aY>=oeUlyp}_H0&TGF~6fA)EMWw0&6pVktvbKiSFy`>g z7_#@rn5_hf25!T2Gf6Xn?ogQ{lv_8DDjS(Ah{(E92azXr;K{>_t}ZP+S@*$yv%q>hxW@rQD@=^46VRmr!xFS2JK?KNFe`Hn!1add$TiqFHT zyW0Dg3HRg{y$fs&ed2ceV`-*%aec;!W{nBzGXuBPmE>ZjX2lV>N|9Mm)~&EWHot_c zxY_mQiNo&?ufR1+RCKKz!F_E`AD?pbKK6*K?f_-<|ajr|zk0EP(8tZ_EUiQq2De_YhC}A9u9y zw!h{x6EPi31d46aWI9tx zQf}KOhV@i5J5-bS;HD$4Xs%9skbO9)`xnh+_EXIim$BYmpBJMnoM~U)5a*!@d!*>} zsovk7qSu&w0_a2`c5;@Cg(|QZP7sn9!bP0hoTLR{Dj#y_7zk-2qz|KAMRak1v}l*`3>O>)1`U?$J?n#amenodznC*pk9QsWT z4lwX;-T4(A5^T*kV|}}WJ7_J5lxWy`-LP&GkZ+tX5vJWuASAs<`Bh z15!981f0plQG3#&(5?po0HVI3)@LS!+?T4MtINpgkqQyGb z8t+RZ3axexc=nW@7G0MwBKvx{lUtk}sm{D2s0fSiN(4*eV*>p{)QN5Y$n9Y77cjix zRDm&=dqT>fJ?jk%P1LBiA!Ay2Ijt*SgIzQ2P&WdvfeZsi!-#{x<2>PpZK>8l4rEMU zX~6dcpmFo?^$(vBH|(WCdq3A zXje61qEi`bq8mVZa2X8xI85UNGVvT&+C}8MAc+7nU-g*^XqYp*r7F#p*!#S0N=rN} z^G+%}t@_n(F59=7X|?VQ)~X}GQ|>n;-hLgb&(+Nmv$IC75MEzCuiv^{oyS!nE9HUl zct8&q4A*Awh!X|ws@w_S%v9tHCJ8)U`!bLY0092~C|2(bH$JklMP`p|h3~eHvEL$c z?V`-n#Ci4Y(n}l-uuN&@<~mPe+u|i~Kf6H2rx~~4or?VP_3-piFzjgecv|TXcuy_m z^g_bV%ol3W@rP3AjQQ@X$xht|c70Q@BGSl%OPW!gJ?B%na}BENF*geTcM{!X%8keP zCk&6DT@q|jmK7c1Xn%`fY)r(yzC!l=<9%Lb2WQ6v?#kx*akW(dF|E0}mpcabnLCB? z6D&ek8~Qhq8qfWRXr>cvTm~^jZR+(s3H(Lbr%inG3(~zey#v-^r(anBcDrig{q1%(c&S`@x9Xao_ArPoE z!q?|knNP)Ct?V7R{cUy04S=q8}=RIKK%<5Mh9WKY@J{niH0y#XMDhOsS2;zxGQ0!NoC4 z$n^h)RP+EsK)t^)Ki`NI?iVQ=eZ!B0k~T|ujx@E2qfE>t)cjoXMX_Y%f8@jPgw_X# z&8dr7ezp0rRC%DCG_oRmAg*{44RbYu4)45SJaxi7H94nYZS^F#_@}n?UZ_D-0gg!*50#Q4N^dE zjnWzeVk}843fpH5$fk0iw2rK8tUA73(Z7+v-(hAAb$2g zkkY<&OP`__))Q*iqNi8L!dJl^m3Ct@Ihy>;iSl3rAGL|vtAs63u=CRqq z3{5KN(~S;SXLF(>OBXG7S)uLmf8Ea`MvpN2RPS2OiLMRNRVy@e7;`_LLE?7%r^eaiBK0I0 z!+KS^iO;~46{LQTh18TXI)8r+MHpK9tqIXsX;0&+s{Pp_JuUvqwG<)^V4MT9$E554 z6WwYi_zUj}#w9)kP0?W8vfs)O2L4Z@w8eQloe(0yeU}24~Yrc#wVRS zb|Gcu>4anI^Fddl9=WkZV!8z0N~Cks)Rn+LwOt(wvLp>g_n1aY6{Q96t{vR9D#`$( zI4I@K(=_I+;K+-0+kQ453cp%9ahr+Y04N1ejfPu;D* zOqS9WO59bAbx~!2gM=BW+r!>7H4^-)*RE!2)@f#`jf2Lbh;0y*(d#@oHgewV$crDH^-0ktjh=&8sPZwI!LVcX57+s zT>u@D8S)ER$8lsNNFUZWQSS3M4n?`uTw5|x-XImx5yh#olpL5}T?YP-oA2bkc`>!9Mi;|L$ zH{1UO*zWaAzJdB~3TQwWsQ~V`cadAHe=(&x$LY`$O__BF8HE@1K$2&Ph+`(2N!}sD zK^I2D^2C+IlzcYv&RMYK5Qj&Qd1aE?+If?uK)jh6i&B6*cJ|7Ko!Li|W)7b|M<7JO z#`7-kr%~M2&0}&?F2$4W$fE|!x!NLBmHP=Uhj^KsFt zz{+X`QbyPnN;jTaOeBrZ&F45<) zdTOgMgfVY+L=$-beEVEcfyj6mOOFC1ugQLa=-e$6|M}ojRWTk(8b^W1 zt-#$|+Fd4Kjf&N?c6V4dr>NUp;$k$vhzzrFL%_vokevAW;`C|)4>I3vFWkHuZL_jS z?h<#IAuZ%xw4A3XzNr6uxcvKN@MUCB;u?!2lHGE)vqWGO_;Gkw|KVp-{y|7&S9w(hTy37Q}}^FFghBCSQ2#jBkQA~ zk8-Ztm>dJ!psT0_7|5(g8znmS-=iylt6Aes{zwvO()97OoD`e}2$(z2-@Xaq;GNtk+tiKVnd(`_7ltz1IYUHmmrx`M6@M zbZ&=|WbGoHVo&c@&*$>tvOOy(klA0^FL{mUjOXw0l^Su*G5D^?{%3rq6;?fxvbPa< zr{85s(_tq)Bm#iwO`mSpTcJ7}zvApLuT{-sqE;y(4(k#;oRNE?C^AA!hR?O2u;Vf z?s;!7le;>}1=du}eAp`(^XzX%P8|Xe{L0o=WHVpe;kNHLKS(ukohLVS5E`wJZ9Rqj z(5q6)r8LK@KqOoHJR&QEe^c{pp=D>zkh$I`N(j&)?wgw!v(-DT!_4HQe6F>jDVznD zu%L1g19o~bx4+n8vx%YqDI{X-ms9MDXIR;|VKfrj(Fi6;Q}BA$1G&+_ZE5&ofL@*K zr@F;yd`p8!DAjCf9GHHPjUD%t)D}9UCDH;oWsFn}I&7aoB7Z@iAWeUGtzFvEeBil` zgg%H9{(&o7&I%}kb&|^*nPT0O0H(0v^vKn{83P7+c`-Z}=dl`=@VJ)GI#+&?gn*X} z#w>Rqmn6QYeK#G&Ew4~Z<*y%V=Dh&-94pSq_C5yNUPxwg22w?x2m&fRi71<8c-Ec$ z1o#Y90oOtfDfaBh1BBoeMjG!A9-=4$=Wuf#CQwB~CK07e!dDCFW!|@giq9^!9$V?< zLEly*Kz_hH_bYT`5r;H{Om5haHBRRn$lD*@;pise&vE{4LqJH7y1CJXrPh3A6=|V2 zIcP`)G&(j+6fN|zYU^~Xgo~NUs&Qplq9Mwv^yf~lFK1bsGr~wdy4|nP|Y>f_9BB zA)18zV!OYvpZADG5#=p}Rxi|kI;upp=Q^UzAd*aXkP+jN_YjzTfAQ6F<}+miAoU0i zBXTFAQ2Q&avt1vH$~ zM5%Ms`DwEnavXW%*QHNb6k=*D##1(X$FbkCV!zH7wU=MDNIe=yGr6b4cqjVRaGO-$ zz;)FQ!E0gkbt7NOawwijy4wCLzoc<|R7=7NKj}Niz#<5%?m-mg>1cUjQBavU_7rv0 zFodTljLg%kvHcQ@4HJc zq8r-4%K`Y}56WO0qxPtZ?=stmHk*}rl6;yw$dTx9Nv%cok3Q<@p6r$u+p4XfFq*>g z@Xgl2uKf!BvjOefDEl<9>u2lA3H>EW> zoac6h9xb7sBbx%c5U>aK%Lb_n0|3Z5%Aii2opuF#w+6k_RiWX1ru=cC2idr|KPUna zu^IH_f+Qe16j{o*R^ck3+Oz$x#oA9^`WL)K!);r(k%dM5gTitZ;VURh5MV14n^>HD zV%Onzzn4+{j8mE}zoY!`jpkvu|LhFCxX7DRB}k?e-hY+{R}QA{#-+as61E z$LG%w#3=fb@I}aF8c4dzlU_7jW-22u`Xe zCJlKjuWPoX7*peVZ1qpH3h-I25{hf;1Fc43N{ACsq`3aexGjKx+G`w_ouct`d<%!R znQur+22m)QeU>v}g~eo#7;2g3f0pf$;pRen&QdgE!}HH!(LEtlL6UqLnWM|VL>7At zrS1k+_F#szK&k6Z({9-MQ%kn$LCxNXOh7<|r@?=>)Fz0``hTHire4+Afm-sll(tUH z8bt0q?&?#UK>d;9R`u-)Fg~Z?k|^a~lo_l7)7z?2x+RVlPK$;AO9D>tv&u9~lo%?8 zW40H-%AmtSnzytB;|9{bf@M?ZCiwp4wir!2Rs7f=VBS@{M3LS$?S>(^i}@b`dIJ?$ zXRO;2diu3wPg;t#UXYC!a=Zw_~vD*&Dh7*Nm^9l3^UyrI|gRn3}@a2$x!p2UQn zu@LMml#{cG=GdgJ@&q3W9n9O$mmY+S!yNha46C3!T+7TN#i}3mx^#l%h4fXxlaE`S zYgcJy$Y@oNC6e0pKb3s>(Ia>y2zTX~{?5$zdpBgJNNd;0{Z1~0sgqq&K59RnAUjw@ zbm*HHCFO-Li$Ihky|< zTZ1VzJmsX#U8)BPCK$*uM(D-R9Xbn@3@)1;D}|G;R2HFQ$`V?v^R7YdOnpY$gHuG|yi)rO zseePsV*?4ET_YgD)X{h+AJoBg6yLPu|JytrqQkXr383?y7U&`gf z`XR6=mWOOBi!O5&Wm1QTuEwBPC(DprmzBtcwZ6|p27M+Z@Y$D< z$wLuwbk(AVHXfE+z24a!*0-X&%W81=r8TNFF46Ab3Ps_q0xBL`Pv4_GN~-;1D+qe z@4rT)PU5u(W7+>wMNm2x$*B{L#2ii4lhotmz^U|5iWq{}&q@x_Y^Y2YO77dBBTTPN z2gH#dKyzX<@GVE_^Y)V%|M*So@5W&Ax4K zxH2be*LE?87EbE##)i zFPs`Ayh{@PStEO|aKIDiCV(02oQGg35OM$_b5zONqWI9vYyCAtM0o;{VmdgCIjvmu z6%uB_N!LRIN!LNS>VV>CJ!_Zq*#dt2u5%gF zw|<|j{6ZiJ#_6=hi@(*7M@L52L+NLojI)KmBy@(L_|$KV_jI~NR6;MzPx2SBK-0inx{(Cz5h1^ZEH|wb5awJ zW6@KUGTp~a%_{wh`Lci))^ZnD%SOM99m-TTL5W?4BFQwu2mv5$#!UVIpD#&dG4qU= zHY6sn(?xM|7S-dW1SC_OCZJ|;VWNsLnl04TE3FlC3FJBo2u{Y+5+E8xcM_$l=RAEK zwAA~AEW;X`$Y;{?X!U_XHfOiJhh7!HU@9Ux+OR^y*BMp?|5D%|g3Ygwa!+xv}fJi_KC(amG} zs?KZBI5a?lrLmTTCo=~$>&>Ft{3xVV$aXisl+8^5Gv440!R3yI{|C|<_1FQ%;fi(M zwGyYnpV+pC7b34SGrfrd8JG)(>>$LP+VKROXYjuV3@Jp0P%-aa#1ibDmlQo1LZzpa z86Kn0rQ@^@FD~Irp@*z}!ogX`ECYTa|Hv+M9}X)4Ii?YEoISjIwmoXoxWLW(o|(ZZ zdI4>NJB;esfQk7N4_vtK&7D!7I4n<+YY2=~n!)q}X45nwAT{3h;~y|Po?bpW<0Zm- z?;UXiJOjB>hk|J0vG*9=MUS@7)#(^mxz3netDzyRS%Ta~@)LTD2n8WqRW6w<<<;hCssZVG=BuJLec!2CD@{vHfD~N`` zt7O0dir|4O#knVE;*YIpw1H5_VYD6}NyAkx<%3yu1v!&Gw1?tH`9LHnWAXC)Vc%ob zVg!U(C0vsQDJ%7yKXaCNbc)e5zS8B_+p~Z0AOB6aq)t-rvW~L;DA=FKP;mD2RJhhE zj`csEV4PpoJ=^veo?J@^;olC6=C5=&2uf!FR%}!6R1s3k0by%t3~J4uhP_g@H>+M8 z#ZiJ0&}_jzMO*EM7Gtl_(X;r6GB(qSJgCZ2VWy*lYSUg6%L``YrD%x{=EdxXIWP~E zh#LcL4W*y|r0?Ts#A$1EcAn-^i&FQ zDDBC2StBm>`#~ZFkiFYxgrKjy@>U0LddTrWYucoK9lRbc9Y=~ogfsIynd{D`>cS`G z&aW`?TWo&e;4PwW6(9(OV)K-*R){i~aE2N_)MQPanh~{xKvjwpJ<{zFFuI{^cKM!rf4%j-Y?DZ# z`HwLR!^bkVhQ$yKf5}fXrU;V^5QPbCUH?8ok)xL0n9&CRP~k1n9mT@LVSjB`MHq2be0wC#1MZI|jnjG);$g!afvHB4Od3sCoH~S{!Rf8HmcR}1 zGd1S2UhjJ+qNmC=Z>UC5{mhr0f6O8k3p_~mF-4VR!TIf+g|nvA#(@O`IR)mSb4NzIv2h$p`*-BI;HjwVb1 zDLFlOKB-bsIc-A7TTg%(v!)V}rgZu>K)O0d=A!Cx1Yxt>rJ1{FD*w1AeE`O9e_IS9 zd6@{s^(Q9ZAfWan87;DK{6goXZy)QJWqFokMSqwyOCAl|4SyR|E8TJ4Xt2~q;I61YICku z-+OE%uv)A6P~zH?I|%RzL(3NpxJN28uJVyTnt{R+G(hFMCu-Zf06}=tkWN!)LKmAN zPuGhIXBwoB_q8t`O-JYSJ1>WNK^B5h8~{-u7b;PywI0Tu8wKej zE2#M=a2xPT(V9)XYi3d?tI=LEFZ~q=hWcifbQ(IEdtOC~RoN0~=5D#553o%`UwEOXQ3QH4F;< zy6FFxnwr30LlNV}+WsYK3k?EtZ!$W-d$aK)TpbM*ppl1opzHZk+RBGX+a<*^Jt}Xj z26%LYOi^`GK3IpXKf0zA>bI-hos*FYi)5L;&_a*gOyF>ZFa!=(aQ83?9Eo);PD-V+W1R;l6DiGI#hV&Ao%w|3RZ znWfzuE{6JE1myvlXHK0b`l}mnLPzfI0+SVL@vlsZ1DoKMUQ724Jq3oDAcJkFMKZb? zw9xnzMWhsgHNBo(yL4XKglvE8%@^j#&mn_fKc|Po3Yz9TT29zY?+(W%hd)0)3NZKe zqFD+6Xmtnb?kBJ_gGy~Rm0LImy5%sL&1YtpZc`2Rc!r7JIf`zjMI^RxAnQcs!2GS5 z%p-?rqp}x@ZaTTCzs5p}LFAwv<2x!(yU3K~bMnPx?qmiRgrd64S_bjRFmn*Cp?jO; zEB=t*B1D0?6X(O{LAq}9^cigdX|nwyc<`PR5mmiX1Oc{XELR4A9xA8Lm0OV(;$Y)E zlIz?PvE%>^_d?gLyyRhbhW?$Q-%aFjsT=ZLdpI1T*jMA$lFFaHLm{D(OuFI}6V>86 zA$2Fs#=32+i(ILcA#@=6>k^|Wjde=LK$?3Dq5IiI>lYzaZ>V;~L_<%fBCB(3PJ3e` z4qzlOjUfR6wJl4Ea|4f+bel}pUCOv-$->Jq6<4orz_ayl*qje{y97R|fl{O+}2zvq%XnKfK_6jq~) z|JYtMWy`acSl)Oh=7UqI?xi&PiNsWz*mcXKiq7XBdGSG6TY+Q-inv}u=tW5AbB zjddI!X7dzZ6T%rm6m$oi=A>zsU<01ME1QS(ObxNCjOC{oSBUlA{Jt0esm!zjHoPd3 zlGj~YGF>s=`c6Lzzz;q6Bdxd%$ahj!1dyU~j8R+DM% zYMq5i#r)C_+?ViMo{T4Y^#Ko|qKdXSq9sad?D{^eUykatOnCEcQ05!W*kYnvk>cF^ z5tzygM;&?(9ATCY!fPZ>Z&EXk@t4212z~C#qW6Jmb<|+qSvMkG?J;lm(9D>(bG7b> z6EwhTTu_K1`>N`wcRn66^Hh;Q(yBk>1{`fRy4yw(Dqq=#H{;F02B<~v-4$le7c6To zPogU^yeVdkv%0u2OWEL9YUl)*tqArI=42~LUQA@lI?gv`K-J?99FNj+sWC$(xkD-F z^YlJ8$AH+S*YXpa%nH9*j|?RWVgGk3FngA|byFdTlul>cwtWH4|FesEKS*?f|5aVJ5>J6!ayKx!XL@y@Sq1iUd8+J-#P>Zb7p}76corwWIY*PZ&XOx$E8j-}{0e6G$sDJo6CX5%m0D8(4 zAP`%PSoAx)_0A^^*oOQflMfr{;_#o3AR96_K>Wo5$)f)0nn023XDN^HILFF*YZ7^) zA!Et6MF_MrQL72SnhIFyUJ~dHJHq z$;5zc1*vO@;zi&6tV1yE)EVJHJ?9@=sO<#Mnw%OyTx;PFGIbLNLv6 z-O8-$xv06n>p}Cvon){~fNtczq6E&4X0SfrI@KY{E;c(v2Bd=emJ!V99H_-cZ??=^ z-m=uJfoKd`lIl)iTAZwPmr8fP;^A)o#_n_CE(y{4JSOjHi_yZqy`@eWo_;T$1wm`z zNbGA2l+!tFIv9^8#)~xvbWfPoo)Zu+i<9YxG4`cUu(J$#8SYH}&_|kzO9y-nd&QKA z+b3gx;#$cUvY;qr$w?!^Gzam_$lALJ-0KP~wT$2QXg5mL!X}RREazv9RZa%q0cK9A z^VuyKVcKB9nlPM_tf6}aZF2*N)arUhNDpqV-H1bI@CI%PK_AS<;GG!QV>w+>5eG97^8qKZ6kpXP^gpnVYNU(%9mOmSgYarjCq*ikk zKZ&^Md21D<)C8a`IJ~nJD zx~(TYz>1Lbvs>=Fh+0aVMc-5B22I$EAvz?sG!879z1==R0$mmlLf@hPH-$($vth-) zo*5>ay7iRucPqy%P!Wa%V}y16hfPCTUzDDeU#}hV8~)F#aXwMa3S(L2r=B(D)hv1w zsf}(U46pgD<7HW(P!ezyhm)*pq@jr#{xPU?#KjDD25wf5qvxuH8b9O)nQ{=I6ePMR zYVeE|cVG%j@IK;}E7?gHqz~)~r}x!ao`hP>I-z@3s71yXQ8z+6N2@tGhokz{IrQ+t zA54D?va_dj={6OkmAUIf8?4q?1Bj?SSp5ZNt^@}ex8M0onRfiReup5EZkUCh>kA@> zG66Tgn|XGu#tL)Y7~+vVy8cijkbPTZZ>`n^#6hfBA9WTbm02Ff7k2`Tajh@=x~*1>iT|(^Qiv2`I~}E-vh7CRx)|HH<(e{|a)3(fDPRGB3j5 z#3#uOXjab)n0>^F+aXNX3iZHqBn882@HN>J+mxYL>WJWbqwJF~P>5e}c49>p9u6O` zO;_ir_f|_o5;kAw)(_syuR@ zHiA)$xMcG4-I?t5h+lbLBX?nZF`#_Z(vW#0EKn9!#GH3yEs1?_Eud;E3u!G`<&lRH z1G=QF`hITLwDQ)^&^PuNBm%32u=|Ah*`lO>leX3Y!rr~t6Bv+R&8Uy?c4SihV~?4s zVZ1vURm(&WV~aIEu>6~$3MePGKT$2EJe8V%;p8|>%AFEk{=g@r`!p9eGz!eF*nTSq zFAbR^BMk$?*&2}bD0AE(2HSld-c1>2E#N!&Ld%f)7D5b=TiJ1bg}GvYa-dr!s}e1s zxWO05DS|mJ*2;0Q;c?6x-bjWi;Set4A;643@>onjd>C9Yj~>x@ThkReg2}xl*`65# zu!rU$VZ2=e;u^@%)?vd(+@W16B+V!aGoQ4Xh!j)AFgO9?NWjj($>$+sw*tHhw1*K0 zXRGW5DJuVLO=k|oJSByFzP6^0*j(WC)o`<<)V2DAP26CGZ>+;;{z>(Hx*Z8Q8PlqA zMZiDXhsYXh@&g>by4Gk}S!1=)DED-)4d9$KBtnldxV#7O+Gu@PBk zkle>&`71Xxh8|T?0xZ5a6Ask3klLfGyYYQ!cLonIvSoj~0df{J1OcdKMx{wh+NY$& zLdn^$J~?y3>TY?oPa;nYe$B$xwG<8f4Ijnwy6YqAFR2-lRO!CGq<7cDFy+o_^po1E zYWXw5+CI4-?_TX*Tz+q-mRQ5pTIFas?@SW(VpEtrA-SrMi#|91?xrP#e-%bX@5U)m zDJbSB0UtT0OD*({OaI5hjPZ-$`OsnFq$NIY*C#_zZAb< zA09!A(KF*NO3gR|PW!9B3BVI*$!bZJWHm1AB{CE1&Sxhe#fb%;_1+I^4$&$`KdMDv z@0)JWmyr`0R^;ZBe#<)<$H%Nr5NuY0Poh&O=S-m2UMaW>D8Wo5rH%oUdkGL{&CP(NFD|gVT+;eJA6EalxHM4$0d~gD!G~GRFX4gC0 zKZ-}tfpsx|Gu4Li8564J#WFA)(h}1hWQ+Gb;ix12HHOj3EFIkyQ$d^U zEG_(b$(9kJJ=tD!Z%j#zN%H;|?O_a%uaEycEj$vovPzQ8HWQjcLJht&EZEOT zC~hcYej>T129?neRG*y1lo#-ua{$lJNgZ?N@kGWP9UWcjFBkG%Q8D+5$9v5lTVAo& zzd|7GgFQoUi^rBd)AOW^ND;VcK!V?((upj}^FRO10sDj_gnJF3BRk=*>Al>9_Y^$c z^0$t}L7*js0GS4zG(18S>{h;cG{w6tixmj9mL{CAhD8TZD3d+0H*A$~a@BmjT^S7r zfgT^}wSV=MK1Fd*L!XXC$x+V&d8x;A{%WuW;>68*K8W4~xFtlOmQQll7m@Okuvn1S z;DO}x19p%0bu2nPKL7f=#sFVcAMa*oS>?y@%4;7{3i=I4)@d62XqtSxN-RS;w2cmDSuT)$CGutu@lZgJRYR(yfx(t*1NK<#dk{ zo=oTsB$40%^8(_rf%5<+QZVEy5`3!F*f^9c1iyY{L%hGF z!4aIrp74^ka>l-K3jiV_iaPO(aCRbv| zgK^w*P;MgML&nrEsm}G(Z}T(h@bo_+ZryS$w!S=#21t{wv)@tp82|6i+)TG{UO^Vk-Zs zdzC`a_8~D`cpUtr31jhCbCB`A7Go%FFsvDAwKsN=c$4JVB{4iumxZE9wr{%(eXVbd zpa$u8?1F(Wp-TX3(LU!S#an!amkvO#=8x_9veVk{&SL6;sq*rOae!goEjLyb3ft_` zw`x9OfoP?*Z%aK%^t-ZRCtgI0grZ464LdWb&G zPZ-=EnL#8H01|pP(R=Hx;^AiUqrgKUEJ9^K^txsvDsjo({5nV=VDY{&_8!B0VGhGhi}@&+{odZVwVLpHOy^r$oJ<^8MiUYb#K8jgm>7uRY}ZXvMt z-8u3w1S}2;Bc=Rbsl^igU{a+RcFt=??B3%Qd>coRu?TG9QxbZRT!B6Cj@p_-qx3xO`vicf^^i6_ z&p*Zq-Ml^g0&2BxMVu3J$v+WC$p?Hr82xxV%r-io{2AR6{Zb(FDS^HP65DK=fSm(p z3Ibk5B_mfPzeI)x6YUv+xo%6)c;@CQFhp-d1XbYdP~s(tB30z znt0C~3DT^>Z$zqktGV$$1yQ0upfq#p2%!;S2UhQ!W){BxrY<GXK_WT_K*GNGZk@)){o{8BV~(NtyJH6E7R4qf*bujcsiGU+~-hG zu1GbZM|l#hlXN_nq<5;zcB%}XqAVEA(x~ZWI2(Z?@UlUoNG^wH#@-^I(B9mth1vUb zaoa;>NmEuPo-3^}29^C9q1Hg{Aq+S!29!HoGtpR#u8eqWDuI}qa1M`Dkt(MkCCzIq zfY7v23vW0BSF1F|KC=m-{`b+Vctx0n*j#MB(RzaLeXKeB1@&PJkqf?UG|{XEgACd- zp4}WTditw*;S&ebI^3ISG@gVi(ks2LiS*&K7M?V^!R9H%xId(Y^W6O8;Ax z|K8VW+?|jJa-7c%t4WG?7%V;*QS-QtRpT3C!zB| zS+3fC-TVtdBD2Tw>YA4}`RW5EVjfqN*rmNtidt^|1iNHU_#m8C`%Ya(>LM$?M4P*) za6m0H0XrsEVFf0;wD}~CXcaNbc}WQ;Gx(a%@A)7KkGVCNblP|^T14k_@Hp)-m-jaR zJM}09MPED>fTbTV{~o^sHwtgMN0kLKAUiUtzQ#`k#{X8d6q4>SMf^*BxIA&aMEK8Z z8&U5u^lUmo1AV;NuDOX1IBO z&f^%nyzY+uFn;9iKt|NKG;|7Vj0k<`5$Xo2iN&z~c*y$TwqZ!M$#EXrv**erof4v4 z>;Q6N^J7{wik7YaDp+oOG6XXDUhqGYBsSO!$S@gU-Idkst2$tb++YC1!-Nl0{G~KL zrmSduco2D?Qa93g(_7B!jme^U_Foq{T z8Gp)@xiFyr4@mx;Djf2_P}y_zHs~uO&|4+~%aZR4`-V80Gy{zpX;D6dDz_MrqZX9# zv_gKRF@f<1;eR%3*E%;w+ z(BJZ>JMJ5c!RHiWFNF4Xu9$h-O4-n>KH-2p0*5T^~>5jl3i1jBQ%e z=dUG;%HWWW+d{zGf~}TrwwUS*l@-lbCtP@G>k-tj5{NHGA}#b5A5 zoT!YSg?*4$8%vJy{v%@oQGWF4b}-Kp0mFbO3Ahz zEG+EjKN9LlDjKtC0IA_XPfKkRi)zx%?+z_>jYV(Z9FXkpGCRakA)rKSi05gc5#;Vc zCn3X~Z%wRdT;`M`fmb8SdGi4BgAQdEN+dNA1lKtTzs_?I93|Nxi-2rx<@(~)`QsD< zW$z~W8}DLUw6{JZxIX@=AX#BSq*=913peR$$X)+Pr0FlJums?IVoBm{)GHj(Whr+J zk1#A2c$}WUkKOn}y6ZuPuBHZ+r%6KLv7uy}A^T2VzvojS>zIWv zrTgPXIA5rT1XgHb?Q%r}!ecZi+fS8&deC{F+bG{0@R-iH;QD5^^5I3D+A$-O3fil( z+!^)5`U(JhOGtPf7}^9mx9zf#A0>?+bAnkgC2?V&&#wdbUwAOoI?k;v{dMafQL}Nr z!<|b87jqNlOjz&y?O|kCMf~QhKFh$yOr76JK>*J$ZSZQPe?b3LWAwGX^^?>hP$5ui z6-FJ-`sKiB!|Pt0AlV=};UJ;Y)t@oIl;oW(2tYWGqWlN1RfB4%&+KVTdshOKPLa_t z4IQ}kA>S)iw54puNNjV4sd?!(7aieDFS1@s$d^FQnly!X7D~bO-1@6 z%@mTu>TH(Z(Gcgw)yMlLgV+})gxUND}c(hW(nnDS9u%9(R_ z$KY#FonBb(ag2$Jc#X(&)N#K4Wl7MQHh0AIhNafU6Nqx)RwF+6y)rWs5X_5$V}n`M)Zs4Sl<>~e3SW>$wcrrMaF~ykf5;W zxelG{C7eQ$>i$;xn+&Zo2FoLWEwrAb@*Fp?jkeI^z&_ zyOS-@V)wy|)k~DB_k;FTUlY(IbnlQclX*o_9Hpf+T9_)|Qcz>l0QNFaE#px)s`aD( zn4=!KS0RD1bg4e0!Q$lffPdvEyX-Sp93qk!3nSxJRT`{7q1P;xx1lcJCP{#O*mZip z=T-naE4F^yb%2bgUJd++B}%ji(eAp_qZ74ZEXYOzdn6O>K2HpRS!$om`LD=+om@_K z##61QUy34w2ysaw%yt?w6}EK6n3c>(G3k@BsUc01EQTizRQea z&Lax7wM6N|5@m>9q9qx?7P-y$F)c|C>ExfhV8QL;K6)Go;DRIpc%p+(ECNEE#KDdKPO29HVGfxE}@V3e4K?Ml1CIKkV5_Pyf=TiR77x#=u!OR`T(kLwF!FQ~p%60zI4<|FOY7fkRX3q6$ zR)^-?_sRGVy9jwrU}%MNY=DA%^dCU*<0*hugEAmROL+K^;^T~0d__)q-4zOi16|a+ z9#WQyXoW=7?(sV9NSL zXdz2Rx-$?sVG$7zRJm!r-N29k@4=@un80P_z^!@n!#eu^;u_d`7HwOJd#7$D_x&7V?|!?(QW^CU zPY%jyd&!5RgwRpK`_AV!etzvC9pIVYSBf%9qU{`ir};QufiIaiKW!o^oE8%t!?~pz z=zqPU98R7B9Cw2D$Tw9mhiX~?#-`Ikbu<;+8E~uw4X6xc6>1j&XIQE~2? zCEP#Ix48ZeFvyGw&MwWFev~rHcbF13;_GFRd-)Q5ch9FjQRREF;?h$6@di`nA6Dgn z8fG~}#tqaau3l?tCznhmm*#sgejZWme8= zT)gILOv@w{(2(N*)~e4X*~|Ey;x4-mO2rrNelw7+C=H04tZPILK=mJt{a+%VYf{!l zQ=Lu*@_?uG9yhb_ZYw`3#hAz$NasMuJ?6|cg26~IY1PziHxUyy1iah(<)G%^P}*is_`Z3B&~J+8Z*~>4TJdWq&qDLfr1Kyo#*8x0$yPu?}uYdP{vC|+QtE3 z(E4Xije1Tl5;oPFporA8LzPuHiqfLm&Cfab$5%S?2BQKG-?e;q)lL%TDMy$c=I>3+ z_VM3@@N!zB}R#B9tPt{Jq>G>4i4h}{9eVzCLNui#kSLXpr2yBZ5ORzN5t>4i~9(T&3P)M{6 z<^r%bj?^31c6{x&xu_pD_eqm3+5bfGrbXhC<+zbik8gmEfc*V{+#JUp=*1_#HtQc5 zfl+z)Q840)Y(FslUFYT%O#VGhY~2zntcxTlkCO z`VT^$`dYtngCud=H(yLBBn83c4RklYKK))N!&a<_G7L zlc~(^=Bim*iK4Yrpc zP9z-ui^iF*xTAY!ayBe^-azoR#`3lEh(LY}?=T|n3u$3!x^$CRg;z^sM5TWYVdJOB zD4#pV2&~9oN>kkv1k9)31!sy1-D8LDHVFY@XR&~d-jZ5fEmQ0F`cyw33+O|qr&oN* z^}j89i zp;_wG8c0ELRqWm-+6Oq8LeOYeIdgodHT??Xnio1?Tm~o|W_|TYdS{QN51ln?uQh8$~0HD*betmcMozkRFC?JrdUs#wyFs!0GVNHV^O# zbS4@wSMEV8fjBJ{w-j{zY+q?V_$Oi@vnWAnhf{IQkgh*J!M!QFtY;~RC>S&_jyCFsl(g)D8W2${QRpEQQ|C1McpsUO=#oGK~7CZJWl`s00000007?s01W{ELjV8(R!}$~Bu@YU^f&>X0V?1D4go$< zB#uOaqc^jF0HBt3k?iF@^ZZ1=55hVZmM6dIdg|SpF?(3Q;T`3+cLLu_xJzEY^EUKD z?G^aHMDgGBZ?*mv{(bjP@V_;FEB|T8f5U&7`%mg;+Hd54mG<}ke}O-__=xz&*Rl() zBlo}XKlObwzYqUU`oCO0(Er-^2mNpVbL-!T*X952`v?C?|2hB5+PA^)@IIp7vHf&? z7LPSB7J9+8S+I6KH?#GKQxic)rpWC~8OKUl5Qi&GOTY5v_}R6&fp5_VAp6@-XUCQ> z*vaKYtDRzvL0z|50KPfRxD1#o&TJCzMBTkjyPKEeG*TB>Y^B#v$G|RQO1zNagN^RF z_PY(#2}%isvDfkdzO1l$5;pm8V%^L$kY);G5emJ19~qwHxrnQJ91=q=2`Wk*t6qzQe8 zQFv?m${WMF*2!1@I z93x6!69g`z*}N;V4)RrEn_QsCSlA;JvGf=(jA_fO@}78C;vD%FJT$Y zo4$F}SKACYHC(-MqwM;9jlk2S?xRwYS)_J%RaCHE^3WOzeOOMZ2Ei{4Ay&T>dDhl z8P7IHHRMCQ_TsadzsL7?ef}rg*t<9!#Q;+A)&Q|YBW$42W?8V^)DPPDqu1J`_4jo0 z&W%9~&(5k;$-Tv0SDmM`LRuxlg|qi8%HhE%lv^%)|AdzBj;OhC zr7<49pp`%uCsx1Z<|7EKm;>`{n&^Q!Y>hFt-k9#_*avU$3+hx^s;`VxV4)xSl+(22Zh_9vF}?I1!bF@KqRg-n zO^`LmzkmmhE2A`8x&xd=oxj^$xQU3u$ynglq+=l&t{<5B4u5?fs_pVFZ$p7CV1;?kMgoVC~sFvEt zzSF0|^267YuWJC2&`dx7a>5Nzok&L)W38Y1Xc(1YrzSOE$_l#;y)~2?CceApE#&kS z`6Ff_^SROcS!{?4j7D&7v7BWdflzuxq0;+34UNrLpY()cb<(TYVz5UHdY|i({YfJI z|1+{)4m92kMCp4uw1kpGGL?`?@(>E znQ8#cey_Nha+y`}KEXFvpDJy4#Wc8%zt!T!~(79c;o<|K{48{{qAf zCC?-c1%lJ@0j!+Yrx#szK`*O$Wr=A$M2Muqh?nleNGtN{1HX39kli>Lo%Sxg|SKJ0j z1}hqSmtao4pL2P$`^3eOf0+R-2X4b!`<7VP2p0GiC)XbbwlJYSv<~v@Uxd9Tm>pf|HHOGPhjGu57SMPUD8V^&bnH%4*Y*Bs z*5(r6Y%rZoEaQlF#t6~zxR~hE4!exb-w(x6e+%3>>VwJFqYgn$hJ;Tih-wM51}^H2 z3q`#;h%w!_Ui;Ff+%aw*L^(OuK8!LBZ=u41L)DqS)H2jorYu|7yXJ zO%h06XyqKrkCcXtJyqM=3M#ob`)oC!pDPAYNo=i2g=7Lom{qq_KlG*$jCH;1G|-&_ z8Z)ourgegjDhN--rK2-oNM?GvT}mh@7I-h^P>o{w9W}WqFw_y=W!raqqm#jml%FSf z0X09Ly@jGpTOZX@>&x+DLvJZR6+5W2>1xfhw z;SEO5EPHi{=$r)?$_|oghTG8Ft+z^x7RQoXuck~G#F+h#;|5y-?9tAc19FQuhzPDN z1i32M&Rw_qKd9BMoQ7hYFyhFv0bJLH>aHd*X!=gDygrMJV#twvbu&&id=ih>Bf%U> zk;31=0RH?0OlB!pgdN)CwgEgGX8a{Rt;I^+r#uUuLj@%Mi@g@eee0K)%)7Sqq1}Mu z>c`L*;%MR20RiJ(22k!+fgC>F$KS^xXL25HdwfGjW?_7so$m=~YQ_94eDh&i`QxW1bKhh;!D2glh-krQUJ;E8Dx6g?OGAzr*6k>894>;AWzVC$aXh=UY+W zYr2DI1oie$#g@hMBh5UY&4xnG=a0dTCko{FhQa>BM=`(Lu7C#}`2a7DiLLeFItm3V z`=-ak!79<;tth06bAF<0y^r*A38+i2&eep2c1b~V1Lo2x?GFL)=kE(_E{`fC6p8=8 zfx&VmxcSmmQq2;j=1r4PwuL}gaC!Yf^Agr-=b=wbbKZ8idl1iJL$?Pd%&6A-B@~yL zci*|Gza&f1AddQQuzL2<2Oic`$V;0SpJR7SxJ;=IX7{~$hA+OE7V{4fWQH>(zN3+KaEca29X#eN zSb8LgjH1F1e-EpJY;w->y+R5hOL^vrw$@mosk5^)R6=$Q^*4vbxfTQI%~h81o?q!P zxGk<`urJ$YJULAxSmE}8qVS*!`TIH@Amtf}yA7jbAQTs$ zmxE6TH?Jop7G`kxRXpq6N#|Ne(%o0$I8f&s=key8Oe>zw9b!C<4gEZMs3T?@z-6$K zr1uEf1dsjQV!GJ+eAFWPUrZCB@eFO>xxJPW3I|_%!7)JMzy7>oi)q{zuh5eOZ8nE< zi4G%+ThpE>xuXx|i#-Ngs7+lk?iiUq-$gpw-5Ga;^Z(Z`vp#3ny8M(Hr&*f_Zp?Ra zz2a&arysX+-E^-y+IGKcCw#2;oZ1;1qzFAO**SFb`V%XPW8j7_VyF478_t`-`t^=m zE!(4v!Fml#dn?v$`pgj@;)lNds*NF{Q2D4S?zZeoead<2F^=SX*_2yn7R`84lh|ER zc_#))pTX?T-8%LYQS<`AJ+gnxXOG;(s(21$1N?WaOxx5ngWx|#aM%9tu|AC-H;dm& z`eLu(U8(Y=rjM5`rQQkR3HRV<-Ez+JPG0kqOzVEN6%4#f10*Uc;yOE0TT@s{_~jm^ z$AlHP!ZPvg#9|&(P7KRouW`C$HLL8TGu~Z`fiGUi8`#|$+N9qBkL210Lf-z$L%>G9($)o{zb*U1;cPCVjWIF#!A#Q`!|UEWz?EY5H6=U$eZd zcR}*-Utmz?O!EDIDoK8us7#DZ*12~%y_g%H{Q^;iaxkBq7|F5=+@H2#6BB=5gA!5S4_?Jy$c>SKp~(kzYygY2hjH89}i-w@?OflH2AAb z0*qw#!ZGsKJQCmd9KNpsag?#}N|jl5|D##xp2Dk_{c4Vmm-xX(58=)6dE09o89GgW zjjlKip70v=_h+K40kUu`6s@VoanH=3wjJ;$L&Qd7=p|reE5dM6VU>789|>2-G1<-e z3Z1d(J;q)eZKOS%z#>t)@SnQCK(0Au_wg>iEo2ZgsW?3B%I7QiB1{W;}Z8$cf|MsA^UXmTT(=m!1a`l z+&#nkf~Tyn-C%S=33o<7?JeDZ56{Q z!~#+{{rm}S{j49}VL0Y*%ug+L30ry5QrkQ}^d$4OR%f^@p-i|-%I*Pv`5+k!vUV^G z#}U^fWhXPLuZRfi!V@A5OyK6URXhX@2wH;-4vPkyepa$)D#{I_mJ|PdY(PbEO1!r< zK!&ta9y-t-_0sWl(_P-(H|K6B;PWDRN^f!Sym$p3&v!ba<1tZAHTIG@dlVq>?;VQC z9N!&ELluRcjASs4TQU8eEgchJm#mSt(bTnJ6E#a-Q5D6*bSrr0>&$X z?Q)hg6#%PW&iKW-@`Q{#rVtgLfAq_6#G~qQCu+@>`0)~4+18;{0Zo9-`hUi*6l9lH zw_2fQ7b9zF5;PJyw+EUfYUP%~6knM@U~UhE4?F-#?#6}pda03mgQ`?2N#JM&)~S2o zv^~yb=gTjsseZHbhn~X?_Vs$bGg@@nv{Se*_v^y<@T_Eo$Po-ZkAcg)!7fe|)RFpf zRI7Ly2I%Rvo3<37DP;dwvZ1gOS({~9c_CDtdup=EDthq{v-cRmYliF)?j>CKacv*b zqP}q;56|<7S@6M3`?UlyCTMc*)Ae|**4*;VLT={(YepNH9h&AYi4g7*Qa2IQg4#uC z8esq<;i9H?>nxqZ=9Iut!uCE)hI(>)TX3*8z*N|{-{f!%vBD1Yp(r4F1z&P4Sy*$tzjw&gGW6}Seii|y7s}_N@Az@tN@zc{ zS3MFIz0}%e;*(?e6v61%5hp8#nHO;^{rxnT1M?xVo&7t|kZy&&us`H4|L#ytxxgVq zyrq-(%qR7LQ4Us#zu%5zvx$2`Aq0rap$2~J7+F(ZoX4K;`cXgYZgcyk4yMBO*U@ccbJ2g z9bZXKjP&e$P|eK$%kLO|f)5!tv(jkH|Ap21fCmBO8~v!YlwyG|l1ln)(nQzbX?4*O zA9buT+z<1zr80bkM{Qw}I!}wwY=G*rYA}HNAvPBA^dLCC7;!clI640GX&9IL2h%l9 zX`)BY!5t9u=n5IRAc;iN4|*d+Eo=%;ks{gR3!WHIK?Z@ET#ps!sa_q-74M+j$lini zlVW1$?b_Dlq6m6vh>G!zIMC(VdjagOhPVk7lfTQ3E|`wR1c=&f+Z&_f^wF5B^0xHz zm9^$l^GLnHAS8VPV0Tc$H(Q8=huq9ZlNR)k?0`17!Prx)SR;b?*; zj%Utf%SOly_Vs`m(Twl9xuB<66QQ@WQfJX4Qs&-=jHLyEp z9@5R6O7NxJco>d=yg4Z~M`VpYcirfHDSaI^U35>{yLP0sN7_(=J4Dj@K43uagz_S* z$Voj%d2H)=e)NZ*O6L!ZLIf5dDeX5Hl!37qB|ku+)+uRK97EF-M`ouMmTfPA)u-6( z^ir`tY_n^TaOzP@`2&P)#>6AJ(KN;uybfqvq0Zw)d|P$)AcNExY#e7EqJWQc7Dz$N zpxqyXLYC@oXCc_2!~T3MVs5#@K1IIMn=mHC@dh?X+VTlO5G@sN4{Ax@@0*V&(VH`g_0nrSo&}a@K?>zi_7K)Qg-8K2yd{tC;?=Waq?4*?qz-@q~ZMS{2u#_+$ZqA_sO1+HKOqf6iZ#5ys=) zWp~K9(I1Kv3h}cS?_Aicdv{e0nOGBGjdwnxFp2p^h;K_=kUus;&5=p}qR zSdvV*ucL(q(c~&YsA@*q(mpbH)kkW~8^x6zkBa!i=E;zX+!kyzZRDjGzIKM1<5g z9fZ`ISPTsB8~3~JEl(By_vl=JO*0AD=?QQ*lfEbrowyrYWRnUYVGQxs)>;Pbgc2fJ z{3@c!|Gi7A4EZH*HEz0{?GvSOkOSj>4|yzYxrKkW_Lv+QOh+-Loz@c$dD+EzX+K1 zMBZkJt1(j3Ll>$feI6M7L_320)7s`!ZxIPNw`>f&JI@3$t+Gf8sO7hf(hNr+>`Ix_T_Ri~NXs-L!{xF3w3k9948P9Cs= zL%?vOabJurLCoSx)Cbks%4?h9SPZEkdgr=~faq`IgxItkuKJ+w2d^slKV zy=J`C&Z0At_V~`+gE0)6MV217#gAV_>75-~*ltq$*-=5*gB>8S3GC~j`}6TNO}s)5 z@Tsx{+Sw|M{_t7Rde+OAjgvi5>jOG5>O6Kf&gd?q_q*e57comN!pyT^w=+XZ2C>mDm=REZ6#V-}$rHfAEVLZ>KrU!!#1T5t zROuQc4;pFoGv3#~emno|(?UnC=e##5^XgTUZZrS-E?k77suBoCgmElsSRD6M~9w4>`n3X^^ zz0I(W#S~?7`5Aor*DX#%v27V?xzwo0Np8dVHJZ-+J(+})Lm;ZVO#E4udQwp@DwiPf z!TIwCB-5BM+K*3kZ6p?2JD6*CP=YqFO>S{k6~t!33`=$%6LnJ~{~=zA?K^cH2Lz*to4--XvpMr2y6EeQ7Obdx*zz|10H=2$E^h=1UhY*%*UAoy38ak724P_#%?ytpjP;#Z~;gQ1^X--LorNuP5vk|F`U6YH<$FK66H}`d?r5A zq<@qJPrh%(#lh<8gLEorlq-J_+&M=jbXQlr-1@674r3UZzNOe&c;~&U1{}U%m;Yh= zw>^HJ!o6us2eEOa9?c@wfz@dKqy+_+zbkgWzq#!Vi%>L)7l6BU-M4RMUI_d&B~95) z;KHj9&K%D;@nDcat7cl&6xPY28U=Bi&19Xe6le`L-k6Vx5tRoQfZC?QMZ3P}MER$L zk?k+A24KplFi47Z@{{l?4Ej+0LI#u`Xbz4?>vZfoh{Z1odaQm#2+KL3)tfQE|8tj+ zRy-*Ps3pv7p#0pqg?sC$z*xI<#ZwoKR&vJ?d5*iWmC{P9RAtocVwG>#c?nWEkpJeVoE8CmKH33#{bp(^E|Kl-Z#sK%nf+P^L)o6Ru2J7AxFPw z2cE%yA=DjXCD~Pmhqn@!U0&B`u2cYri5%R@`;NMB<_@;z6zmgf*BL_W_@upll1L@d zCQzp2+6B}7w*XT-6wUhp`3Z``0V2-sJY0bY<=Q+2!2S+jTbp&llNXQwp8AXet9oTa z$gvV37Wq9w`PYTAcVB@@|lzigcC*iiy_w#h*AtkDZ^EclXmLHK4^Zj(B zuh|vA69!j~LvpbZsg4JO!w}K^xB52BCU)_K85`-TK%{m6|C-9IN>{klSgUZWJ84)*~v@}QqvDVe0O+-peitj5Yg*&`&DM)#e+3|s?X&%uHN($*ulqf|bNZGk zEIL!T3Cxu_WGQ?(6_aJfveCbhxo zNESdA9K#N)+6Zqtxt~gSjfg`iqjY5Ie?;iZ^k1tA$#GDsp|gv<;jU5_6C2Wl$XBA4 z2_W{3*`C3J<+um=HfPV0{dIK2J)P~ z!0yEZvuh~#z~2%PETTG|DWIVEg!~4$(eCOa7V!V+Ac)moDH?sMTJkz{C(UMvCSYIC z>O0X9GJt;ZP@#;l$z^C_M9DhcM2fl;mK+pcYVN{ft*$ViK$j*m;F)jFFGQm;&8=V% z%JgvUBb5@rF>jb|3FK{7Y(bw_#|bIlw^lt}6`$Na1f7+=_(#fS_kNQ4A`eYY=RmR& zu;P-{wO(^#a8hYcesnx#U?|9nk`jxEKD@Ui<~<`eIeciLPrbYU4CvqwK1^8wg9|?f zwrL6iyJl400hT|P)Rtg(%ViZ(SWC3#jcej2G|mVUw<($QFJT4|d*Bt*H3#PA0KV*f ziSnCTP$n7S&fg>9$OA23+?58F^a8MCQIfzt(}hbg8<#tyRi=u<3?tYiw873+=w}h; zhymof?Q=T>7I-d+aXr`5g-pg|Zcr7v5@giRo>jrN z)!NGTP4+2xxp;2FcWEGOPrA4nq6c!+~Q29bdR_9RmF4>o7p}Q4{5@Ec_{rJ!5rdP^S z#t51Qy=04T-gu45oF9e2bx8bQs)@#=CVl$Sye8n(!}E{W*3H*vDhYGVuUN4fGM?IY@uK2+*EDAH>;>h{tFl+t{fMQ&T{7IWwRwvuuW{P&YN!bCH)B zt>o`(T~Q>f?4+2}!A-u=3cTZHM24*QN)_8F%jbbDWRvEaz6?hhD$AIRaGs>*E|t)K zXWX|~J^ncdE2IO0_U7UT_Ze&o?x?Qp z?oQ9YqlcWI^_H-gt6s16`s09N6%u1KCZuER5p|w|&3B#@(w0!gBzi&%j40=W!4D{W zt*x*VW@_;-IF2$Pv*6Mhr~N&)1rIeWg-`JuhGG-6Z^-e^sJcNJ6b&)o$$ zsCVi5$Tk0a%OQZQYi*!f@_3M$e@!$LE!j`wU?H1uE;xiG&y{Y9J7^QlmXUlCh1?#y z1MRs53t4C_XG^_356B3GYa^qt+B$3TKA}M1y(u9L*A9oFwh)%;^@29B!u3f*yZd+MzPvUrorBMRgj}TVkW?h(Qc(Jmi$q(HO!lUKQKAXZJgC zQ}uVanK5Sy;HVt@=wU$gejy19Gepc)H1jR`49V^nLQ{YGaZWiU4vv*TklrX;ykehS2; zel(T}D?TiKfB501*SXKoqijQz&pBGMS4LgOEjFJ4eC65+Orf(iOt8|Up!DMxD&Dpy z+%ZsV15}RP0_umP?9J@$p~Bi1s5OS!0tD%p8i8@A(t$Y9hPeE8zeEr^Tb9q12ROK)XyVN&gY4fV904-6^O_=rG85}fofRa z>(FnlkZ~oBiLZv+R8}oq-{;PJqgm}JxD&b6)p!f0euFrS5}{C@F87cIt*48ZU;o$< zW2LI|HW*l46Z?}<|I{<|qMEEmj<-QdqMkiBg{G*W;|wn#uBrh>x&K~Z#Ebw$L)Xm*f+E7 zRd-U7AZ)nL58nS>>3f#I66C+#zW0`GqNMz(EQ~e*?7dq5T}v+LPyRPdhLz*YDGl9| zZuCqXuzidElThnj!(h~^Uxz(k!w1f1ZBruJhim_V>$`_I35IS3Pn^YH>k}?EO>w2p zeMa@1!v3I_y7{a?hU#mlz+7)%GW6bSy3017L|)xUO3qPHf{sEiU!?)mzXpsiuXD3F z<1N)%{6y@DPCn!BSOZB1E%uDuc8WFTyfmY6O;teMst==*^P7V#OHlWG0mD$FOvqN& zwG_*C%HvqOVLV0aq91`_u6$_jC)eh=Z|Tcmc|#6gAzghO%fV(q5Lk%{t5r#R0~jgV z5#TvH-`&K}82PiQedASDvwLIIHnHe8J{Yb{=fKxLunoQ6_5><{qL!}a!Q~=I$Gn`# zruEkq=gNFBJ1%!JSidoNVH9(;%6*u7BYv4(PR`u!czz&^B#*yqBw6D1yaa}!S3Cqq zlzn#0|I22l-e8fRtQxo)uPA7A)gxTSS&%@F!)*;o0dpE?2+fo{h*+Sc9%>j@A4U+d zOk~uE93BOE4*C#-hC3Qa?cpJrP--^DwjEJx_3z7~*tDkCmd*PaTFQX_fi8hTfYO-& zF+zLH>mUZW2THq;`Y@@LXX*@gpxc#-aUayp7ZDObJF zg}QFMum=cT({kr_RqRTrKEmR_#wjk81xXgFM^as|ffBs6f?W&I3CW3`OT7uwiN0Mp zP+N__%{Jl}^iB8Xu+h3%&?#Y+GLWcAR>%gA6172G)%k1tUjpgsbaM+{`~7B!1YCDV zKQ}M`7-!+rlQg9rmgsSpa}a(zcG6E%&?<9d$sUTXz|1Cd_(fjH<=%VH(;F)&JHucS zvYS2VMYq9 z>!cEzY2#}0U~zTM@OCxI43>^Jl&?!obYNeG62FGe>bA~-y^9X)s^q81JkiA2-PG)G za+crwlvo3kbn(LnpLCh&gB~2 z+_BS*9fDc7>>f2vhu^SKo#l}!>1kTW^T!qDU%@pTCt2x(?kX^WLC~W8);$?SK{WiK z<=V866xJ3drEo#dV8LrIf_-x|r5poH+GF&fhHH>;>vZmyB(b>=P#B;Bb- zy9_8apc!bQ6ZmeQCu!GVaft3mrvpNQng)|+@b*4Zu@otFrF+TOROSJn{Q9tpFKr>nNg~rNV$`X!nC1%fB%%HX>VEgCbT@ zT;7Ws&P{?bReDu%O9W%Ju{g&sysh)EH_JbQJis<8sQ6V?=BImg}Kx;UFoJUuG~ zv4S1gzX@&Z8%v$_N3WQFApsT{R5S;>H7D-XtZ!|4LT8Glk;c~wXQY0hLe<=BrrAL) z_*?KyvLY~>`><^Izfrbeh~y~p=NqKHWSF*wv_AB4q!)((-Dx@m=B@~2V2F756{!HC z8hJ8T?{;^F^moy6wyx1fbg!28@Q1Q@P~e9S2Ywt|Y^>JvD)fsyTU*Ind?r{9(}xr% z=j{vO=cXO1+PUwflJG5m48C2zfPl_nKNmycYY6Oi$lJ<$H{Szi6EyV9lW z1>@S;=;-X{uppZ{&(_f9!r%*dI>V%OJMowzBwT5Q_G-g65|_Ha5W3XBtoM0lNDeg^ z>kZu8bt%n+eUGh{y{r^a+rAfVIxSLte2t3s=O|@SDn~l)KzrAzoB{z zR`@DyA|rfKXQt($b2QWFX|ve~{Kpb63@oSP2*+ayJb6H= z%AQO&-i>$@HW-O^JpLdo__m<#5ZW(Yf&QeNCdPcVzM}a6yz(fh*rxrxRLRB~^JU$! z=^JSF1`38ZfibMRyum^v1`-Dp~{m zph2cVy0&exa|-<7a5QzkH}+2gE|noQ*aB#c;vVb%?#T|x^uTQaV13lmt$0sj@gama zOHJTTUr23dh?jF>8lN54;t(*Zr6*$6K3!9-sO6T%<9xUs) zJx(NLCJ!A2+#L;LdF|V(#9aiFHw1)#LXVcJQZO*F3X^ZP76YFCN4!*?e~Bgh0jv%) ztaE0(AgNDV)(HRvVm!fV8hXY$%ZA%m;!u4r@oe%kFv@D$QEi-|Kj9|GN2M#u}X}xh+nEOZ;991`vc=(Qyo0pI`qqw%ppSVuE99LYXp94&eok$ zEnGA`X>WIZT;Xn&foE#`KAwjDTDGvmveGowIzZ8}V-BcF zY_!a>ua1Dgr&V^D0kryKw5f6np^h z1XNVAC=L=)JDaFqp@`(gF5A(U2g|GJTF!9yno48^eskJ4U=TJ@|Crs++52kCjL5l@ zQs=;E@BR9{4gN(WgBj~Y8g-!BtIIMbpkn}aoZ?%FdEwhAYwygq3k1DeM7!OgswnMP zP1IX>A4PO#bxfpc)i8XvkJ-RfDHJZRw_e0LNvwQda>(TF8FV}=pG?`J+92ch1Jhp?v27)# z9!J_yFa2I5>==;HoXlkd1Rmif5NNSh#0r6+DiAn^V(90B{RHrBjjB*{UGV4=kk#_> zb{}7{HAymH>R_;tQQ33ztk+2_T&nm@5%$Oe?14n3X4bv_n0=L&1%c1_yj0e4dx*~q z%6B|6r)~_QckiOU>XGQ+}xSeW;Q0%6)CD8WGXu@fOkNZkbY2K}*Bp&Au)$M3xk$ODNLx4*Izam(fvdoQW41u} z`j+?wA`k5n_oO%Dc0Qo4+bJ(0QmPM`wR?+c%D_dS z*WjV%q!4FFHjTKUQyU(CYg1w61%&u}<2R6wjBgd5oCBXgldP9K=@!n15&pj@!dq`C z#0X_Pf@OlpEhYg_zg;lvVNcnkw1V(Y;VV%C7t9xPRRtDUjVfDf;YVV~zf-*~F?BhX z=tO>yxw2IdpqYLNx?=Fv$VQ_CY3#38l?J&{*MRUE1<#WKXpsl8?gIQeqKW+hdMMQ z>LA$}q$^Qis%dREKqSNOrJ(t*Qm57SjjC1PDmV+Wil1iR^Oc@ z)3d-@pfv0}B2$rJGJW8&R7^jA@6sdzn|e`L0{65oaFN;`r70zDo#dnq(`q?SwmZSmOmk&SX~BgQ^ba>F(lxm zdT=6;m-dec;vqro%_gU8H0W9JwP*lFQ-wwhxK~ByDB?mfbs&`%n$d5%`{S_2TUoBU z5`NGT+Q`(~=dOZ@VRz;dob^aS1M>QJFPX9VK=I9Oi(3Qp!iSsq5%(7bJ`~||iE&h$ zl4fD-&mUL&Du3kC8WJo^yuo-r$645Z07mU(xhi!7;XJ!+N?gk&Ceia|ls!G=Ee?#9 zqXt#SEy_Hyj2D1W9>C=fMo3u7k6j682M^G1HkGDY1X7j5aRSYH4Z;XF^-h*n&$)9( zlFZ6gbWqjgo$k%GTDn?mifS+&as!WDRWnc8} zA&JyT87GT3y#AN7wP2OdOx6f#=Y_LteI^H}$otI?C@>VD;Jm!#S89;RYZC7&R@X76 zadKuzOXajvq1p2N3>cViOT9kc`c`vrURSTUFbAh8I&55zu};^LdDQhdC??vE6O2zO z$rUWCgtK~-lA{(&FQKR)cx-vk@bPt2$%jwoc@$93<7bW`3Y{31pelvb+Hbk26TMv} z!Z><#!d~r30_r1jaD_}bTgIQs@qOf{D}XCQL=op(ufNB#MZMA5bFk4!Q=sJ$xG)SC zO&lW`{>~p11u2_JC-GxnlC1RS=Z@%D1G;{k^xNUWz}eyg^enLEfki%PL9U?n1@F(O zmIoe)DUIFH0AjR}asPmH@V93uOqC%Q6Tdpv$TH6wgHshkv`aQ%YKIwAJ|FK0g{@g@ z6MlbP4mc`3tiZ-q_iQ3Kkcp&+da>we`iXK)S5dN-WrW*|6Sq0;)1Z!s)`OJU!)6N1 z8#dPKc}X?}{#Rnw0iNRLcFt7HOfXBi(B@+?djFF$IrSI@aoDo2iR} z^NfIWHce$CnA)s5@82&CbX=RzVA`~beM*K9ZxgSLpAPj6aa+! ztbnMfQekcXqPy`-AA7gBCLTOz(LmGfYWazNiY*f%pl510q{#+volV30Tw`v$3J6>* z56AO@Ll;I=^D2#0<*xH_0b%R&&F^&!HX@OVyYCND!`R1DW*4FT;c64aRXBNQ6Ifhb zus&sJz9$=&8B4i`*A<7IhTwUn0OR?w2}RFY^f&)hu`-7&r?tkTpk2J_ep-sBC)^Cr zHTY)q`>w*pjL|u;6?|o|-ej_0wiu%vSO?6UI-;*PAlyVj9PF{3;gmy6zJmn612dgV zdHI5k$7DwMlNKggMPz{(g$0sxL3>}*z+x&eoG{wm*Q)jrbueh3dc4(xG;lgSP;Jc( z03J=%5>8H}8#Wr&f`h{!1H3Utoem)hG}d1T%zBcQ0zPc zRL**uKnjJ&W86+al>5kOvpG3tS=0Igy?s2s!jB%zKmH{EwE?8dQydC_#B*=e6lXSS8+8djRbV*SCVaW5d zvVreLi|?33aM8t=U~q!U)SkOWA+5C1e%WXDyLSI8!YHiEBG(9Kow`_jYs;cM{n=5Vr zj~G$Vl>;HOb{mTcdnh;^Tz2IZavP%&94^^npa`&FaDcI>rAQm0Zx;Ju%1!MS+33}ZQ5%Ro3ec~ZJ;6u=Kl66eGB>3UX z)3py72QNgHH@(OXllg0bPXEt;-k-3naz_ob9FhB`p$#>kv#c&eAgns^FPtcpwi7sx zDj>BevHI+>;I|e|x;{RJc*9G!F3`UX(f|YDD(QJk@wu`Zw!HhnYo7O zdW8{E0g9VVxcQIYeg8ut&h=_K?wry3DD?-G$q5vWd|B9@#%=pYV-k5JH4Utq6C;EH zzb$@b_*lWKWewdY^u5U20*|%HQnOa73=q~Ikggz8-zaN!=S!V$;bvJ=yomjS!UUii z>@;fi^X(uLqqXqDx=40cnn<0I*keYgXajQn!OXuoZ`~y*fvl-&CHis?-};SY9pii~{hF@QGksEjShuMNR^;Z818ca_G(=YJh=3kvJ%L9pCCxu1O`}!6e z`!2d0`v7U7+rt$HET2sup>0Q*)>tRd*%4FIBmtvajMdh#vGuEdmDW5kKu{Q`M5D7hRuOdsJ)17jGNt~#@$%jn4Q0fABk1nFB5^ZfFs{IS%y0*+)eZ$ zXc9=94pD!ZsoiCu8nXyoqs!c51qiGsCqa(J$gBT9k+g%I=wDEw@Jv|!+94tqXesQH zf*auD+4M(wkZnbm;1pdxIpO;`5{J{1N@k=ZO1eH0RW2+0+bW28@+=fT=q2rHrR<395-p-!lNVPHR-V$@p4 z_9|3G)f%pnJM!{pWvF9ovSeYUwooi;)m>RXrBxnJL|}4qA;XA!j21-&=D{y&^Nir# z2C5Nss|g7LNbmCOSknw`C}^D+zNOgK1W1S!r3d1?5eDLN%oXswa|b&DOF|NB4Le`j zyN`Tw=Kicqv33**l~j53V8uN=BLYrIsbSJ~|6=lzJB-?i0~R*5SEO9Dmo5%yfqbcy zqp#|v0FIw9Zxk51lU5Bav2f~Kyo1FpL7-MhRa=;Iw8qqBHlwNrnpTcAy@T1ZGCXEJ z`V}PdGJDDPFD(*z+kpY?We1svyR?)6EkT4G@cdI5L5*a#$9ws%yU15<#~msSX5;s6qu%SXUs_5r%YM99B>;{bN|-DWmnD5bg*J0%XCf_%$3?aZFfN@iG;9z6Hk1mG#S%d@z}|A6lf#G&g3yX5 zH7&!S0FURlv1Z+$6~#k$i!bc<$FC{I@S4QWA74e`)J%z59p!EesgmlWYB0_e83VPy zZ?}UXfav-lB}ssgSh6bFCOiY@)JJ2W<#;(E^Sr||w@N?{$yvQv6(<&$hTY34GK7x_3^X55HfNBDO1mVlxe5|ox~8d(U#96BF(iHgH1#RJ^XC(`0Dw~)ArMTJ%ZyF<}FzVVp|5)i#m>#=A_>k z*`y+_5{ZZ?$rG1mHR7vUM=vF$FW~JfDyiGi#PE4Q>1+>HlAHUb*%VPku!0Q(E=3*= z3jy;EKQ2;(_^oWi64@)7TuMja#)EQz%V20p)>bovIB%rNDftWIdW zt-;|W$`68=n!N3^dPG`4&J)s^Ri0NS8y=VoeJg~=VrM}djlBq*>c;|QH!>Xu$Vt{)Cc`T0Q*Kl0CP1%@Yrp>Kb}#WV zMti!WCfdJC?Q%?n=0i}Y3KBww6$T-ldq)2F%6;Hj#pk8|JO*FsLqE$S!CB{#5i9K& zQw_cMM}PH%oL?Z=?wH?3&=fEX&Sv^p2yXvUG=+F=djtrd0R6_Oj+sd9-R?~%M?D2# zei&FomIS(cR<{9CCJ3xeWyXgiz+h)lv$ zYBa>H=nxw!Mj^atqa{j4c%GTiz|M#}luT|52XFAL%N~J8jA(O&S~dH012~7vQ&?`Y zvX;Fm_in=~Ar|~zaTpRuYPeCtgDHbW>GtBB(QL$Js z&I;vRV-`k*@&Bt{5S<~ecjNtZ>{PtbHs19~OM;qYEu2o{f6LIaYrj#OQ7VZQ(;Xom zF9T?Y;r}G1@50X)--TE(`y=jDubJhCy$hDcY4!|Pe)!9Fw0ShfkIxy4#SxwoJY}F; z%zHl$T9-b`XiV|P)_sfYFHE=xYDUu~VioTn%>>mQ=`@B%%Iwyki`PAacvrL+3@Ra36dHfj`cvK0M zB|_lGFMNK9Hq4|4CB{aISfdQ`&mSLS5OZvMo@15Tr7MdyX6Lml*0sB3?Xo4N!A9S~ zzQVZVW0u_S#1TN0Qa_hIKHEuuL7MaIWZsGB@p#hBX@W;6gyax!lV*eIupvq18-!=#C)tG#5})2Z zq+Kj)b`Dl~w1a{gX@bC4-A(@2^mFV+LxBHA`RfH8EP8|UV!3y}4;39w@+AMjpbB2a z5ztAp)NM$pvU4T#fPAn7@rL+#2>X`9;(gta4^C*KjRBl|c`w<{Gk0f~YLXAJ0ju5> z@W0y4C*_!O;I48O*a7F^FsB8KvM}&}$ku)~KYykbkV5^S#l6YVm7s9=JWS~GBPEp> z&v?z9f50Rx{F55cytEFM8O*4QyK(t1cXPl~OdmYbLNO4WROLl1RxT_GPSu+mfoM+! z?l}K4<(YNwaV@~bpjgG8B;KuoOfouOF4F1EMQ3N|nri;b@#au^O zr}2cR+E-_$?IDkRciNC*V*C-vtFkfIljHG!sc#9+?8N8vXGq1rNRO%gb*E2XZU27x z<*mQ;_fNw*p1k@F94+7=W|C)Ze)eERDDk5@2s&bQ4uH>m@6XtgWkzf-@F2dy0FgsE zvFZja4)Q@E5xVq4rx%A1E8r&oT?R|LA^vgcwB0Lq8Q!<7OxsmjJ77ybolMsXbjIsm zO!4ch{BOIEHk+_)wbH|gyberfi-=-$b5j^*Dl9o{e|W);X0OBZDwEZF)8c|oHBcsH@d~8mZD^tkBDOEGYH9<5N|HeCs; zRv}@XK~1C0q*BoG-t4VB8%;C6oFe#|o%B|9g@VZGAB8*4yD5Oh5_>| zO?m&{Y$lwkq2Mj*zFD4L{J-nIf)Rp$q+^qs$!(GE6U7gu23w1=otcIccd*SFNL|IB zQW!vd5h{RAEZDYa6uaatu`n939+}Hz7#R=R1No#gWbJok+X0SNri$@Md{DV=3qqeb zU)qa;U$dm4hNfL%&cRxUh?2>Gntyu;kRDt2oBa-x2H6|Rb}Qj5GkQ%Ker7W!AfU!k zSZT_`0sWtEnHB1&{Z5^)Veh7Fo2h*>H$K1astY84gE6$$lT|O#+GzzY<@re>yV{j% ztu&a8FjcV#iqxUYe>E)u9-?Cm(&T-pCb%g04Divawzj<&>iaf}liRQFZTIfnjHHc^ zq6JYgvaJo~UTq{H<|b1nMO*#Ya&+GrKO9nCtgE%Tu-TQgG3NeAjzi2Gr%UY3sc?ut z$O4wPow3iNp4(aIz96wTC!Jha!cJy6J-623H8H=}%Z6+W-ga?*pEE1}BLVt3Zo!5> z>v)K`&b>|`U+E5tyK=8FUl(L`Q+f&+z{V8PvkHTA?A8nYlQN@~f3C5am)Qd6P zi9xh|28g_YtUI%Q3nuo7RU#+rg&}}Dj?r&+5P#t-tXc3lW|5R5BHOmGUd8eOsPyLy z>23FqIp9IO0hsyR4LyV#{#ue!-Gb58BDi?rg^PUYECE_upwdomSMus`c(?U>4HE{YM6Xno9da0DL?OcAmq3|cqhRw#LW$s*AMnuon@q?<3btf-&WS?%PXtK z8Zmtw;gZ?7j!L)q_TiIWm9AOiT;O623?B-rdQ=#L2@7?kr=HoC1=RmA2v+r8ei(DJ z{Je>kH<{VbF>TOS$t!{T`fr8XT6pRJ06|VoM!-%0000000002r0RRmF073u&09H^q zAgE3N05moModGJ~0S*B^Q6!H=0)G~^fB>MDcB!JB7r4*rm~&t9s4SfVR8K7)`yb)O ziCRB|ch@C*lbx?IFRf={|NqLyKOSFB`%(Ev=TGQAasKo3W8)Le&jo)6{)d@=YoCe! zFZXxj=lT8x{@eX8{eMv(bAPt=@q^2SJ?Z=p{ZI1VxnF<(m;EoT|7ZW~|B(0t{)zp+ z{#USmC%=mS!|WyfKm5P{A8OwRU%+~be#d{{?7!(6V&BxyMo!A9wfNnj-`KMC6U`2Z z%gld=<@mzG%p)(Z&;%vaooA$WUZK`-mY>8_5axJzl#K!j+vgVTk3KUUb)6M6haVtv$}%#?n5_JDnY$h{cQo{RIYCvGRY#K?Ng52{L|$DaYggbgM#n|b`lK`j1LzKqWC{mvPP78y7DEj3Tln=ht1!AENP^sPznMlff{x zfdtqIJyuI-ICvv6jQ4!;0G=Lf4b3qHpS$h)b`oxg$B`wI)P(g!G zJ@oi`yQ@RYS#@`m=5t@eD?UgYjahV#az=oqs_3aa)|+A*PXgSmlek=L>Q8^4@ZF@S zS}fNn7uFdY3k2LqV4LjLuliXH8hjNH13Ih6t2-~aPfW0P9MGz(j$Usw z^SiSbr`D@$y#B6=A}nC0=IrdX4wA9EWSpzU z(yv)C$ZiY-vRh`&gpv<|^+RvCaC^3Y`GE9Otq>mCH;eg%uxWdrYR)*FWmKzvOvqbt zcHp%DLR3;=L@mm-%MX$GbICfZ23Tf6E+MG@Htp*{>gIDUoF{km6$TB4H4seC$V2yW zZgbgx%|?Z{suuAvqOHfCqO}a_O&*Z#-*c)sAR;I3j6ru}E`IZMWU_2
  • $uI=I`3 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 z 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%0DGu5|BKR4$kh!k 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%0D%{OY%Vnv&7Ir%O1##EOe(KI`-UPgKrw7 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

    2T|FdVh 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 )NSw^p*%xo*j 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

    OF)K;hIIf<;wc0gwGW?r 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�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

    #n^v^ z#t%g?d3Bhsw%HdsPPNlLxJ2L=T0d`qc9PCsncszooVGorFvGx1iZ= zm+(Am&yo*f_oSPHD#8F}L>frhbnn(W=HrypE$;_ zp^T^5=(|OmToh8Yj+ms4nsSC$_K`<)shwPyRR_jg92kne4abM*&i)2Y8IPL=Ij{=J z9o&6wujntTKV_g+v)ToNc6#E#^i}Vi!O|YJZJdB@S#K*=cYO5?lOyUPk(t$JIsr9Z z?S3h7M9$EY#di;OBvX9+0AB~=V%$BJjg6hQ>`fH7`x-n^0eFfjbj+p!IFNu1N^rV@ z&|%y7v6TZh{}Ya0s7*jD^wAb-?>NfTv&w{4`{`f{TI*!I%0Eu0Y7{}9@P8W<_STGrYNW6oO(?hX|v+x*9Nq}m(I^2y}2mZ`-rSUjl72@!u zLkB5tze~#0YSpRdP>v2O8Ux~o+)jIj0lQPvCyI;eCv(Jtok zNxz@!kIGdwj`Pp#-ks%~pH{5z`e?KMTdl~N{QAje6! ztsZEuauZxnA2d@oO`Y-NV`^yZuLW;}jnEc}h_5Qk$aJXA{;<|-WUx7$BS57M?ZXF; zPLRW;)n@9S_b)xB)(I@QnZPtV5?N-RBV?b(%_Xw>cAlZ0K`)%{oQG)fv%ox8ItM)c z$F%B-@z|1mgLn^8!4SR{f`6&kRbVajX~LVW;a+h1%xM`S*m?JXHTlc%GC^)#m8}+B z^pVZz37`~izf$>PXsEGmM>Mx7R`f06g zlZOCwU3wl#sUW-juIqE){Ur~PBma+BOdC&#fAYIOQyL1($Z5Z{`%`LO?ZGRWB}jO^ z8{iAJ-23Z6?JzUdv8-bP|7;La8C?Lf3CCsPdvk(^5H@JA`!VClOSThdPvhBH&09j! zY#6$tV_Vo}5uj07Yt^X7K>&G#Tq_>;hh+T&88SGd)YL$HFX9M*xN7%krAR1Y9}@j3 z?(an)pDE)Cz7RpqN;bzu#HXMsehcaCu)3s9a5B?fM=_8gYjNnPXhQ%MJpdWA@bJN| z=mNPNZpBd|ITnZc(RC7tq+POR4z6r=mK{O6uIGoTV=#H!A;R_)-u}msy^oVm@K*xH zMskDV2?F9uSVV8FC=J8xyOdvFSAvGzhjYcI2hlt4%74<)|K%$jNe<*GjPy`m3 zk=%Qx^9iAa*~d3ljj6QJG?0g5{@8#aMfKqF1Ljqs)Rx)>CH}>F-cr0o6VOES{68j;8Y8h@LT8$~DQcSk3oSIG0zaB_0 zy%%!sb_o3pfjnzJR;-o~_vNNy6FF!{Z-~~QMp2o8r&k>e+IQg`^#dI8C+}-SP1#7n zF3{b?x6XVJw>+m4*QsvjF(JqgFB-@(M#F0aQj$#AJC4xwu6F1qy05EQ?w1{F;qSh} z&aR;qNbwobs0h2SSCRhNvr1`i+)=-9=jJIjojS@l8J&AFO{B*eV48qC`;`X3XYmy~ zJ1N7@2=S)+vG}||J*dI2PpNFQv2L9C6<1s#AHx^V6K#oAU>E0CbM^-MUVXq% z56i+D9zLC)8BZP7BXo--SFwt6G61q=&RTaBDpnGMK9JmSNT07kW!T^T$%+5< z;YXw*B#6sq;d&uj%UOMBas$}g%`~F>2rR(c6GWH>ez>!rO}_zDo115rdPS=zThxC^Y{2nJD*22|X{ zy+#PQ=T3N!^+4}Ctc{>zB7)!av@UGM_MxQOcdHD2L7Lg8+6 zJMfG)J?GjkPU_bpwNZP8ke#=$h2-Z;`nGwDskF|i&>0^cv@eQ&B_qOByb}GGiobn( zYxKxKiG$egM59*7yDq|c-5y!5ihLITR(bZTA`Ih~>~S-e-;jJ2lVSF?yuv_@xvAW> zpo8=L?`80UlyrNR(u}10g5yal%G`rUl03c*sf)FmoAeLcxK0r9p`VP<>`7B*1|S~K zS^1-t#txZ|qh}mkcgM!Bd}c6i#bU3nDfg1cFB>EVtvnXIG}c;Mjq>HpyrVi?4oy_| zrkt+zdeMbj?0K>s$OkYjK-DS>0B61OERGEmCLf~!J9pzmr%g~2lu4KBPPa>^>U#PSa^XB zpM5zv0c7~=4F=6W2+`zmo+xK=_6DPnBQv%0IT634R3(sRY(;C)ut`MsV%GCMUB#uu zvOf3ldI~ul;CpY%67SJ&ONG4>IuxU9rS^b~P|r>EJmpwKda6uAz`tTsqa zF_;zn{)!@^3R>s9zbXM0N7!gEi%$zzf$!sX4 zU(7@tbtkFU58Bk@Q@*iPIRRc4#~QsG!6gzpqg@NtZ&@^fAE`tAWQ)dxC0s=FtztaU zul2Bs=heouGQw20sB=tlU)&*O<Jpyyd03+APl*H4+$wM!RY|lCvWxn#uRvUC0Sl>W z+l1|qF5*Blz*N5DB^~WkbGqDjCr|#^r0g_@Xk>=?ZwZ3&RsJ(pEbKNCjH&<2QTY8p zju*vz{GMP4No1n{l{1rUMg{^&t&{H2B&4oh5qz4-^S9`muqB5(CA(w11VPXyKncxa zcHh}GB@fAa2L0HW2gE4UVzRFvy500molLBz37cxE<1eorAX-*3VL8P4+bB%Cf;hwC zX4Mka_Oo~g{YG0PSBx4`+L3tREgc{-gT(BQ+xD$=!+1nu)KcbZOKySPXPX_PLiS~5)~lOLag8k!iXAKsZZ-H2SyMw zYkZA247of+PMeW2V{DEqNf%xn8IPZ*2=${?NUX~^i>8X|l4khDF1Xr7|CD7vvVz{G zGbsDIr@qpZm`Q)vLc~Npt zX?2bH4BGk}IrY;P<<|*bzPN;?v#o>>LTifk>36lYy~h-vZ8ubPg0)J{OLr?Vr;+~E z>3hlxRb`S*746Eua!Hk?9=3aewlAZeGYuUrC8C8)8szl zr<}OCITt$rP@uLf5Tx94xzh)ZlTHLWGW!a6r^7}|1X*<1Q?JQnFekMwQ$iN^I3pgC zca0fT86b}KlAfRT5nj)4;V@4B$zBO4>x`fFO-hBEv;O?L@5nY z_xcG4$qW!QZsU=_1$@LTAL61OoQpTUE5C^>$uyS&C%w?ktpHKzA}?WC>w7d=H}yvD zeppIc>RmiSlKe1X*dV`qoW8WMeh+P{#5d2o{ia#*ad$cP!t-Bb2F|3zyk^!dIlWe@ zNC#hbG^lXq^#=A!U}ahK(NTx1LSD7UqV{EjnifyP%o=bAb8}$=#XR{U@gn)Ig*42U zsz|BBqFv4rC5=I1HT5(lWoX`Bw8wg*GnVA&S8g3=wV-6<`=D6zfSd}w)YZA9w!l#wE_lel|PgM4yKM<*%%?YBm!=MRCfKsEl zNOe4dv4vYuY?_(9o0+`(W%+6P=>b9KD!rDt&r+H-`LwgAQF$H>^@R{iz3Ivk92eC_#x{H4k#AjTe{ZbdK$Ufuo{ef!Riy&a1|(&x&ryarmtJ+q zy)T&DzbxYAkV9=vjD{Rif1kRO9<9R>F+{i*my=CP^k$H)w&@09SIsa%8{yEYPRh4J z7ulW!v*kUv+g5|@!E8JeSUP{8`3pmw{Gy-b1Y<}|9nkp>#Z0Ue8H;ry8pJJ*Z|UD; z+j)KTtWCOITj&1`zapL7QeZq1sYB?D&S7pg52b=IfFaAJy`egx%^Kk38XINhGq-f5;k5kHN;9a68@ShFk zI$e`0rnxJQBpEEO_~_+XcfChFqa}*#Y!W&>BMB=0ia@^HG$Cyli-o8>0m|SMdT8Gp zlEE%6t(}k8c;|&fS3MEDjwz~-zqnXq1)sYm&Oy;phHIBRV2Kv6c z&kEsRPyBPc8>H@x2^&`A?sW&X=^G)z`1!6o8nT8tk%14vitW7pypTS%!IuR6TVnTKQC+SLDs(NjYbDa}7!o;f^Csd=J!tT$Tk?#MF@-I&RTr5QzjJ&K@=9?)jo^t- z!_-zbAi99ykDq#B7mfC5A{-|+LT;Ln?Cn@M^b;I|aMxI#C5lcuwpUVd$AAj}AAhK2 zB1|tWI_{C`mMcvxE*^tk1cm<`a?bFbWiDjZ8y!zGWCB+^pP=@+ME2jHOg6tw}Yu1 z_nmP!4JE4!0MSyPT0><2tg!9TMM@~ZO|R%NUrz$08X!&vhR)TXtsL-Fv{p>5R=;G1 zUMIL1uyGoasfgF(V*mRIm z>?BZtL0EDKRUV>kupl`ad_q5W^F?O?IbZ=uo&8~!34Y7Lx~1nwL{|&uuz^%J6lrAN z1FOAX;eN<_LB_}h)_j@Dp@{C3FNgkwKa|h;M=!~PKV7}e#sX1HWv_(@$Fa~cDc!~+ zg<@**-*W!y3k8x_miB01-WoZES~=)1unnq9GR9JX5^%!3m(yT`W1$@JIj+zUyEyxm z*@_~7w62RqBSgnl5x{+`53U^uU;kTk#&J5Rbq@a^@HK-qhhUWwI->Btv8qSi@B|up z91kosS-@Yc5meLRg>%u1W?Am`Q{%YXs*kU2s1zX4Y|fU5aLvli>99eQfZm}erA zBnon_dBOVe(X#8RZAUo_VB?0bTkP)FF@P&Ze?` zFo0rnT0(QF$tGHQi#W{tsp72t%4%fMj?6Pi2--B&n5Qt_nP`zv3ny37+TTYL37mTRb=}p5rC-iL={R18@eOmmztHLjIv^4kw zC4<2fgxYZYTJ zX8zMLP>Hs9MscjD*sVqSgOF56txj8G+64mk&R48lB8*pqUJ#9hXwSM<#76t&XO>E* zhvjIY=R&L?5foSe==3%l9@5;Z>; z#XGRoQLhyOR#p$nNYpn_2GbuOc!n>M$UDB zLRDe7o)R2jwtM4CY9@>i_}bYR^U|F&*^6~f-S*U+bh>r=fanjBhPzdKMUNoUBuxK|g1SgOSmR__uhY=VyT z78##PW38DSFnahJJ=8keS1fku=T|IMF$;*j?mLXUg$o7V+!!o24iZth&MH_zOMX5f zj8FXS{!S|Bt0GKE*LSPvbDZKeiFDWinfMlflXBI2>5MY1J#9@ll=^QHa6XZD8RVUR z;0vR7EZ;21W>Ek!~HB+MPvWFlciSv6zWc5qU{DCDnJ1mZ1L8yH3fxMM*R?e>|9 zZE>#tyL{A4)(f9x$DtiSa_ z7kTuh$(rtr3&k8R!U{~b*WU5gWc(V`HWxWIwp>mB=Z&9%XbbvE^h^EadD*-(@XH zd}0Pdk$vxC7NF%YxCOTQ2e4l4k)v3~CBpX*G%$*r+m^lbtoGH`D%XI6q%JTqEPI z>|SZvJ$}QzTH|ZREG_zzTQ7+S4zoyD7BugIH9@@WUF?0qTL}rp5X-Hdjj)lk-=rV` z!{Z|gF*&*Aowk$2K{qWd(gW9V^Xd33uThym4&^L!X&u7ccLA-7ylq=s-z=p~% zkS4)KOzKCjN$2p@SjzMYv0&N+G#nQAJo%L%wW!R)J+~++4Bg1u@kINz)$jWpu^o@K z^eyO=++A}i{4h0k`VZ}CTLcjeu66kGwD}l?PH?FJ~M8I&u{jJiw3V3a)_CH~V#C_yHSc-3y8H+E|=KCTM+)3ZZ8|&UUnxeOf+%_r?`Jf`zWG+-ZHtT%s&| z%SP7mfepY@_yrEl^=FcJo3EE6yz%=)UQ&U7q}Bjp1rU-Oex<1+<7UH|&2LtlNkUc)7M6YwC_Xg**IN;qQHlp6sNF z)Mxere9q4mR+M|x;JwBl1GBIuzCAlb%ZXdF9pt7UE{cajUI4U7w5FWKgOz|<=n3WLgrX!>aa43VOc zv(i#0(3=vc{Y#P=Y0n@a3)(Z9aZZLxS z+FsW2@nj@RC+F4|@w#6ki!O&ruh9N?fm&>9)a5tUI$$479^lv|#mfTu@bDiW5lp|# zUNM_vQ*B;t>_K0fQ-MhxakGxzyq0?gDvib1^qE80mQrBsvxQq!y=$B7YU3+l^_fGJ zJ9o&vu*5R*QpTRLpE!&Y@*Oi7h}?WAjkDbSsWqOY#YIVPe!io*f2sdgkK@PL?-jb4 zaU2k4qDFjnR7JOapyrPawU>IA;L&~FahW3)yDp*tgs}18w83R<93$8WA&3whfx`bk zvvBm(zDZ@;QEf^Q5Svch11L3ArUfdZ#Klp1=*(cC1X)kxT&0;NQ^@T?>C*sLi3@l} zbsr+rAF{(!A5=tSUGjS!PNTwJen81VR+UB0j*hYfMbG=_8?%`0`{`_I3+eGd`}Vdw z&}i3IKXgfN?MW*P*Pvcdf;*bc9oXz)ee_;AwS@n(ULeZ;MOhp~Q2D~Y{;aYuv{A1H z?|srqh%kA@Ijv3u)aemKDIGSnoujv5(*-K&PrJt0-C%*EB7J%XPs8l)r2_gkEuDa@RZ3lVp(9~p) zMsi7EyFv%i6mDjpCG&*tmT0U->3(iiXnky?^9p#f5#zBcD@6CH;? z@ppgP^khDHxH|ln4LBVQbq~HxMtC9Jr+>PS=i~n~3I7FR{k;nh@-`8~Ln?oHFRRmq z13~&7^JYCrhBBx7zH@EXvdITcq1^<~A@SKz@@OAfl$$LZCA?>KXvjM7E0kcIsRWpq zsjS1G*hg(F5$nxmc)k_vV7?mxZ0Rn$r26QHrfq>T{REyjSX8w|25Im2L|!L~xPAFe zlYBgCV}ps%98EisT&7R(*l$vloQ6gcfyfv>$v}GIu{WcGydd?B@7768R?;! z&j&B$+1{*UJH{BCn=eW!P6~@S{O>j@*rcr3Vb0H;u*bQn&6oWEO8!cq{MT4f+b*oq zJsYC991+SbYVCR{HsX1nDuVuT{Y#Wr6fnIgNpm}9kmit7y|eMUw+Y;R3UGB8c-ckY zJMTdi@n(8=tn4?NL<;T2~U6=|rg^#e)|R ze_1C)^RXwo9gQnAeN1Ucp!yu8Z=pUSkLj==_H&QHsGS zfA7pY!QJXIe7aeP4wEY-$iXoeemv`*IYkxp`|HPJtF7a&PnNL|>R7;v1&j)iJD~;3 zHSkZQHeFVCAnH1xA4_x1sd<^ef>O&}|D+F>&IB_7z5?r5ZNB-E+C&pwSn^~8eoNZE zHZSA(_rx*X0$@Jhzc(|(6gXW;%R#1Ci6xN!<^ZF*Xf>t|N=f^-DkHk;O-N*T*l9%^2dhY1U#e%4! zpK#_6IsrUDh)O;0o5l0YzDa2Se0%FbrfEXpewzM+hSel40xO~bN!p4@mL`@Q)0sNt z$mpD&&O8)2Rs{391`;7v=3Thz4Xe@_Jd*5Wj<$_oG<*fBW6hMk-SBZz+ELa(a1Ge; znvC!w&C*DIE5-_n94ZAA4CYlclk6r)BM!K#L$(y9mrtFA=QVorJT5nVX(q6B9F(%4 zyMeV6FXCsW<9WTQjGlXPN*Qc86F1DQVQnn-C*dN>(Ciw=UJ%)*rvKr6(K95Wa{#c} z1bHWEH`DI65@D4)9@)T|r5v_UcN9xDYHR5@RY-wQF&K_%Ox0N1^o1QqCsbfp!TXy6 zVpBzs;wam(Utp)x{SVg}(i0jO9s}UyHd(}wcN|G7~Y*5o+4(#cM+TH>x)($E#JOY@#P z0R^S6>T=Xz*VE3yZL4__d$-zRGg!uGRAzkss%5_$T;;!zb!xVEjX{fl0CKdLTzPIIgg0i)T7u|2N5?IksLVfL*XmQ$U6Ha_5a1$7eN%Po`e zk*0ZmeB1FUw?g$ZBali;guRGons?VsZ?L&b{&hN_3lYLi32qjXbM>^OY}rDr3j-RR zu0IVfgUz-&5mmWmBK>u!DJgLJX+i=@CQ^LlQcAU9Ecv}Mtr>ERDYz*2N8? zJIh)nRg>yej)>aNV3TqmK=DinPLm5$8MP?d>j|>@)C?!!I9vB|5}H%3tKvEU)EFYM zE~m(C`3yP8#3U0{``IV`2eVpQ53;Ta>#5bl>Cq5qj_SYKKdeUHwx24Rb?qtf)`-tk z-Wq-~Cxt9^`QtjV^}V@~O@=w_kjb8l==fzGzWZsze`6vE6U z*xxgBe)}MjzP|(+!rfA`GvBq>U9&5YjmF^POkP6+geZ%M*xv)%YVR$2c#Z{1($Rg} z+a3U)g^ub?jz{OLYkCSt=OL&d^h`KO^3$k*p)TTMw9avjq{wKLG$68@;Sf|_9H%J* z%aune&2hpPfJaUXsGA0*F?V=j6DV`{(eIs^7%yY}Gv27XcL>UI&Cu3PhX9QMJL*db zt~iBZ;-BZ6Bk`V+Gu<~O0ZpG-5~S!Nh+)pZCSFc;Y`Z#`RDLErGWU-ws>B(`HKi?& zzhG0?V}y8wj?T2vi(*V_BHTBWx`lWg*MM}Cy`yKZ%=lbGVL{j>lbFSFd@(CNx{z3- z59CQKK)GZ@i1Fdp?6=2$BtI+TVgfi4V<#3GxZxm{JtePa=Y{ z*rFjcn%F$E>r?ULOM0^GTGva>Sh!`mL7%>Lhf_EfR|%^N(r=if+}!=yCpTCbtN?vF zjqCR@)%O#vp_$5QBmB*wSlIS~$I(G6GL)aP$4-`G18Xr=3bJkg;atXqkzt75MS`$^?;hs6SC?PQ}LtFa##z!63=1FsgdU z`x=V3+`k&oVHIJ4Ywmz!RAXp13S#6z*b(-nk*MIppyo{d(Z9%B?*i5ARK_s!M^%Wr zRpSRh)3@vztsEKKZOV?Be0PwyZI(snKhoDts9rp*^~o)O<$K!Ha{Q*B9nn=2)Ijug z=_WNzfzMHIj+N`>9RJY9+q+-L33nDUdR(e$Jk(I%Iqx^jMco3zNV(~kltC>cqCToY zCA)k&4erSNE%(XtzPC8>vrZ_7{G36RyoC1I2SUM$dDPPE>V6I@ZKk`Hfnu06ON!FW zHTsMiK@;QVPCw5x#j}W)~w-hG1G}vG4v$c4b+}Jq)UwleAA#Sl13=u_Vh^=qO4ER zpb(44MRB(q!pNJGP)WSf@;OR2sY0QtUD_xDYDq%0BD63+@h~BHjrL;uRasPUv>F@t zcy!XmQxcEH~*6;w>$;LaDrEHF|Dp_Pj;4-dCG~uPm9Z8gO7y9uP~3 zat`E&$J3GEwEHX{7W^+Xk;dPOu>Ddsj%}th$IXti#H5EN1wL7DdXhpMYZ*Yt&<936 zaly>|r&3eTuz!z!j`O$7&zSM`NDk+`Ti1V5_{Dyy!E?}@A*ViwV1e(Kbf2?Xqiatc zp%%U>=l+~eq9|Er-AO39sI@S0Z2L;?8aPbR5BvXG7j>g@t}<8aj?gc9oj;+?ur@@~ zHMN(rdO`~8zst=Xsqq_H>hj^LwGR~0Qi=|h3Dp;CyyDjTF&+VObsf-Hf{~eJN4wo# zew9vjigp&Ds_M*ug9eZv@24c#_r>Yi{hB@-4>-)~?q@yl=2X@%?nAmt0ri1sm zIX#+Mz=TAhN|d{mJgl!Sad1#(Y9py%+QuF$t^Kj08gmr1j3}%5F^WK+IzwY@v^k9m zPu%^}%O>B_Evvc4!(yzZ_RF0j23xb~5OQ{)MO~iDh-W}?N21mTEx#4(KoC!aQYA|# z`5guK{5nT0;V-1)w269ve;{nJ%rks4)h_~&P1m~94yU3KF`GkQM~bn+r^a*OLkIi2 z?TPLR^^`sKM~aP5hDqF_iaBS2BMPjlCCeGDr)V(a?xTqLVAyw4OUg32B&o+6m2jF=_JB6$-{d_%D(A_GEKhdfvSaIZ>5E;OZO6Ulq z6g9g109N{Mh|>e-k#%iI^v;oize!{DXy9Ef^hS|)SZ%{Q2cpw+y(+LK4stvA{&Dt7 zvM_PNI)yzN80EIK_g=}fewSMR_O*gkj%?h&>lPy%{5RJe4O`VvG+r2>Vi?45;``F- z44dJk#??EK5M9h5jq=&7P;Nw4Gc_-!Dh*ejG68M)X(Ce0s#w=@ppnjhKqCGmMN>;L z(jNf^T|k6eRt|c%kXfFb`Apid)Hy+)T6NGhK8QSuzp3RYrC_3nkH~>oP}ye6*-bS5 z3(ATz0E>p+(0TlJyrll-)qgeG+opJlyuTq`Y+3Z_tGjenWY6bR#N=U7VYZoLF^^@^ zQbe;f8;uV8Mo+7r&*SBPJx+?K+mve+C;>y2vk;r4&sl?=h-3&ZqXF+z9=ImOA+G$h z4sr)%rQkny?l;_M9qT%W6Xf8iaJZC?w=5x!Zr*0}l7DAi?7ci1m$Pk_DnKRaAMH0B zeHAUTFQv4mp_ew2A7Li2a06UT&1IIPn65JA%77AVL2bfeCS+h%dnB$`s?x?P$p07{ z){v0k=w)bRg$Zorbm)cVL7EeL>c}rx=WgbyC25A|g=L&AEnBjj)ay#}-762@v~3!Q zm0vGG{A91&#Xk-&ea#2ZVRiPZ-Ef^zr`s=7J-zt%a2u{tLm}J=F4dX9sn;W^H!L2p zrgcLGoKM*+AE)~r6nbd?ROnho*cLh0kR&m;j4^A;bfT9fwrQc0>>=rev6_nO@{+tO6NA)sm9er|8myNBAwq-8IVf}VgDmN zR)c3LAdRxQ0iTY!H4+{l!lQ+OqJnJf+f}UEXulh@Y9X}D&Zsl>nEFpe8#+lEugGmO zL)WKEe#suga7iOiO3U<{P)mp-{VJPA2fNgFyW9K@WoWwn=k->zXq_-O`4e}tK>DI{ z8WgV$u80$%rQ1|%y$$(ewC^7x)>y#7GJvw*^=Q}jeV|AQQR?fC=%OFTcsdXD1{~F{(F4pYH!8&7(0U;k;Q3N=vb0+XboX^t*;y#=_f0RQJ8M3!AE?$n;NjLBb zy!H$F|5*o2eE06vDGOKcb+}p8pQ0CL;|$QQy}VBO(@qwOuDl;azyQSxX#73K@L)VN>a#uFm5WJdf4WL z4F_iw@dcUCsFPjLmt+w@@DKay^Z%L63PL)OVR3={Rp7HdABVC{xNvvrY-a=YR$m6E zOuEP3jJ5$grG{eZI|K;Z<9&pV0>9sUr|V@a2*W^R3RmI_m+7s)3}r0(F`Yh2+K<15 zpukr}#rHT_Cy-7rHfsQ+{(OvOMMnbbF5Zy|0K(TpUy*Bpg^3fsu(BUCR(}h45I&O` zAq=qVFKEVCV)*=+8Bc^ra~U&(`@#9RSaTI|w&Ws%A>f+%!yo&>+qdRE?OcW9O4sL` ztpxv(TrG=NE7p}@aBziIQRU{`@AuF7KeE0GSh*1VXd1C$CK|T(Z!FwzDj%qi;}3f9 zR_D3dUvZBHR08?4pGP%!pI@3gX3`P$9ayf}rf`uAnr(`>7yXj`e`TlEOl#S&OAtO8 zdhxw{bpLd4p+ECx#0U^5zq>*!jnV+ZCEU%XsW6mbpCZhwCik|k+9?IHx;o-7{F?+} zeB)w2jg`JEj{OOiw&|EMA?8}yqL$|O8{oWAF)jC{K)kwV7biY)UE04oT^Ez|M8wfp zxU<$G>romZ7c79f8Val#ce&oMX1TQhRcZ?fPm{bB$Jj>S{&Pl8%S=^0o4u`>9YJP) z)Xl~2Yy2CsN30pbs^kooPt?kRF7E1-kQJR8{}WF<1lmhIhKA$j3p*abQ5pjG<0(7* zy6AT3u>Ftgp>&$$xc5`|5}WQUVI)>s_a+^nXidKMBs8MJko>uEXJ`hZA5CC9BOA@c zC*)vRRN)UgPc;o|a7i?{nAyrJy{}Xz#ExEz}F z;WrDaVi2mPuf$!|O_zC#gc47eQmRUjLa=5&nX$g+5l$=8|0abqIlIFKb&RNHw>ffAJ4yYkSXK^1W42W1BigPtxe|>5%Y&{}3N56c-TOV-EyiHcGj9&b0EY2@pU05K1fm%H*7NqA{_Nm!Jfy)Q4zjZb;yDDjRdYZsRKdHJLtgb_vtkO^{(sd^7`0? zV!@5Ip-FINni4F9tkNREcHf%X$oYh%F;PA9B(%>G_v#SRof&-Gt=75$zaC>HnJ`f+P{k?-{n{H*bCrU-Qs#>MoB84Jy2 lg6xeI%*4ncuT1KG!LG|T7n$_D^fMM6+kP&il$0000I0002r0RRmF06|VkO$Gn}0RR90{{R3% zPEAHEV*mgE000000N()s4FLd900073P&gnIV*mi~R{@;?D&PSQ0X|V8jYOlOAtI}^ z90+g<31esm*xUb;zE2(fr=3f)QZE}BNJfX%RCPx8T#RqB8zYF_o z%_q#ii2X6_%hM<9FJa%;57|z>{%E|)zw!G5{-Nq~{g0}f(U;AW|9`ZH?uYKKDle0- zo_|69&%$3SUh)1L_ecCkyC3`h7CQsXU*?~PzlHuY_gCY$_}%&N3;g5y-}^uC9@)?W zaCd`$}^$d;Z_BFZBQLU-$pZ`_KQu|HJ+t z=MTD1-GAZ#@&9e`4gB}}kNpqw9^Rk-{mp*v|MK@({gVIWldY~2{BEE<+HQx6{*-O) zF>cf4%sb7-sEy@c7r0^_m(_R;@6HdJS_}*sYdvNQtqrFBIG-<0Qz3N%GqDLRr@P{P#a!Tud$97<7l(PR?MK%a=@Hvdz)6ofUBa8pXjxl5?WwgHJ> z+PACY)?Ut=@dw&F3(J?+w5cL(4&HsSWUT8#$QR|w<@vQA%G-PbncA#0w{LHD zC?|ooIFLC1URr@^e(=Y+l+HAXjE0X-B{ZYcK0VTTay-P&c-8)w(?8>0t~*vOAL_fg z+~PWrFTW9-r87f`hIe;ecrlklQ7xP8*g5VXy^V>hQ1!CFi}(e;-pabL`$T)H(O&|S zcNdjf^g1nYAWcok48F*d7|W#ix+u|hCNh=mk?;CH_TMBUP6>-$r7;CXY-@vO!U-9Y;pLoJ&1Vfv-avJ514l`M!Z!Fk!b)o&Jg zIrM{Qr7J&H*E=XndF(ya@|-99E+DG3)$4ed3_6fJ^P)nMrmOKDKKu z_!1m4>btzLyo{VL2Nbk=QzJbkG=7&mDr)i12bJ`_dyRZ#ag7W=trc>TY++vGQ8Dv0X3f#dehvTjne;|Z3b1{9; zCB-E~PXR#b*E^)Fee_wDY+It-=9Ae;qwK9eWO}gS_ai{*_hoMOBpICuy>nyNGWNoh0z zW|l2aTRK=X1E?aoVLBnmVa0&)IPCE0nPFu6bVrHI6KoB^!J*ifj{1Dr0`?%C3n88J z4YZMIo}JNno(7rDuV$w1T~yaB?s}*V#1osD=Btts<@cZJNM2iMQ0t|P>D5xLQW0kb zL#tfzIh|r3{#nbuO}tMlc2TMsYQ^)|D_Gyh}ngO;!w^JG5qS0t~I$ z)~gZ2U9Un*O$T;iWw^#W$Chfl$3uvQ57CGh)_gjH^6)~*?%#s0F%;i#-53C!Kd!ve z2@*4xpXw%-8ZbaIRGw^Yf@$$073?d>XAk_O8KwZf1X&Y&h8i;m^I43eQskkP}QsGsn!d-%_s&}50z8-vZw(-R=>Cj zuL}ZRdqMGGa#v?OzH{DENzdwor+c{CzuBYL(CDm)pIopsJ+!Bit^UH;VZ~Wzf{b*;L$h;y1e}%&HZM2hf%I7U+60b6XqW|CbJLj>{2XX&6N}zzec(SR+Megn!TwuB~7$Ep4uaS9S=}d z3)gr^xNj&~jhAS_oRORBzOFPo+ui73k`XyYHB#Kragk=C6)f%h(8tQt$LQ%B`J`OE zs5UZ;mZPuw-t!{=IQ@-6i(cjgg)gLs^=v<}V8-5g&>fyNv$xH|T9!$wmHg^a+NGJw zOfD6Dk91rhvmDkF2(xQHJIgqpt3XJHhd3uqi2-!jU4l<%NK)#^@Iqu?jm?EiB<1t? zdP30=)Rkbodu6*68ZZuO^+RfN_h!oJ^aqwFIK*ZfaKd+*D&Yw~eTNcSaNaCnNm-^j znX6>Ec#@IG)j0;rx)dfwUfj1z){II$EYQ0Xm8&*`#K0{?jogNeL^8v9@~12u?!Dq% zN1Ce!!Xf6wdHuJr9~>L3c${b}*&@XLLch9`&2B{KSQs0W*241irI~NXQ^Y%*hu|s4 zZK(B?InS#u2RcT8YsDuv^K7(Z&(qVdKVvPjNe@9HzMH)Gjg(HLi}!mvy5^j=yciO) zZ98dL2CSQNlwN>M{K17AkOs@)7|fL{8IN8_IE3dtL)LEbg`*p#qHsE}Qn4ZQDk_c= zF<9d6aEe6*-y2!;wlj^mlnR_ZN$?R_ad;}2affSN0~g-hyr?x?_%nq)@FOjM?#ga) z=TB*7Ww@n9o&s(nL-q!5{GZpOwl$z#o}Bs19iP@bwJ7|y>)Uy|>Fc&P`lvleqwxwe z5II$8e<00of6ANF)3~>Z!~%557Wk^|l(@$q75r2mFbj~=Hs>Nz#$BqDpw?RqJ*&2c zks};y<#usi;LzsLowSeu()+y>C8Ogz_wz*KhQ^S*BVmKfe3TQGFDMrE$L2?CPI-tfXwm%nt?NPTYbJ zEUnhMJICsC2{?Vp=@R%qQ_WzBD#QbwMI~hagY7D$J-C@;u+uyemu|ApfhuJNu=u;P0TkBQDjrqD z110!g2kDYWgRkzX_oNPy`NTa<&h*B8Pqu=_XWOsNz2~sZ%(e92U8b}Pvoq(twjZ>@|IiHdQ5`m*Kb7L0v*UkaU0Q<0?LUxwoo@#40mo7PJSu+0A+eG zoZ5BMjO~9hA}Ep|ukx=RqxMGS{1tVGhlVvVLR=+M@e3CTL!Dc_uLIQ%qZ&9@_a7T) zOs!*am1)9f3r$)oOv4vaTn$ULah8hTK%T%UtyQh!HhK>B)SQHuJV|vS*abi`~vy|{1W9L+{-TFHU)OQlC%q5wE>;w2#7?(i>y8q2ti*?$bJNFr(o;^cJD zAHELfB3ePah1zI8YylHh2*zJ*43X9*rHe<|!*4L~0qDQq|HG z6$hJ|NTZ|mwU@NWH!p&*c5$PxDy*Kb2wFy&KpEFj3UE<-;%l%3A`E%)QzWAqQu|)z zaWj@tD<*OX&NZ9hg}4!D=G#N(;tR)e;ILpWp_~Bj>*>y{c_XqG|2r>Ez2p?wGKbsn z74r(8i^*M_FOBs;m8w-XnrDfsbm9S=4YNJKOC>2Z=_6&f|J z!w&fTko<}*mpC%mc?H76oL`ni_eh8z8Tm7&-%CH^uS$-00w`v$vsPLwhE$_Ze=zH> zsY`Bw;1=iaZ?`Qb5~7 z1+)RZ?{CqPWP4xLLe}Pr%`%N2j=jNWR-u_OdhvQQlNaib3Zk0%J* zR5G@x0m*tY6nVwEry9x25diz}B0Y`?mM8NUtJLjDqZ|RqR27b0*MbIBY}pw$zKK@6 z6Y{+y$^~J`Oo+RpdJQHjAnby*!0ijt9x1`q9p4P6l7Jgf2y|$@atL&wy`NBzt*7$_ zTcQhQV=#jVsHITU45_Y{7CIyGUxQA8_^c*RGng0e zLT8DT8627|a1rj+#XOrJ?Srp@`ZWKog?||SpMnA{F~!3?=33|G^(G2EX$Cp@1D{?8 zhIdxXXDo0PFCkViXu#YQlVK_kyzeI~`HFQBSu~h!2?zuM1-oYjuphOK7bHPW-Ua3U zsJ49n6Do2{;4%A6krvs#u}op4!4*m@3BcuAddlXh(czj#`a^1k9PKetXH~tJhaREw z_8>z;evi%677-|;xlbS38t1;=(`1}Tw}$ZQn`hdD>*a+`CO}ruK7CF4`U3fgWs3G9j9z19Gwof9Kh;I%8{XcqRVd zqyczK{G>DmH9}Q-+H8eD{8$X&4*Q>qX0ku=Tx`!uMq1@`^-wOIGs?3|;K0fm$1hw9 zMm{Uvn6$w~R`B$f>>}FA!M<3_ovz*yjHYX_fi?`^8}Sz*)GEx>yVNE+-oX_!uwqx# z$T<5%)-O+2RgKi_pL;s>LS130V{6ljB{i=@>;OY?HgY;6ljTl5kHyl8%4fJKx$=BG z`2%sXzEA97u*nJ7QyWH+wmu$?BDdE()d3Z7LQKHewmL;VZNu8%Pq5DmYX!1Th~v;RDAc1rdSv9aqYuVVL-Qlt^o+^BfQi-m9RXltwGk?6aKbf zEldS`sTEj^zRg=8*5&-LWHpLF4xV4ddP}11JOGI(Y6i0SGORS3{N%zNa$dd= z?i?AWd^-b;)}0UwKcSaVQNH#0kpBQFd6T)3{NGLHzh~{b$BnGmAAGI)E5ih}S*R7X zLTAUcINL+{@jbh$5h82`56+yMy(uJ|QI9tXCjaC^s)c)TX7$(*Prz0~;Nd-y ziRt3W^C6kKY*pf2g05c$Ysv0=h9q4SVTksVb{5Q@33--}w0(k}*hwy?bwk-!4zcu; zMpnn8cieN_9==#LAi?gnhH)!f;HT0hWe*G?IZ>qEHa3I9U5Voc7eCPd?MD?t;hDq; zjOp!1m55VJa;J-RUY!vvXF-4g!IYow{euZjJ1}Yo_xOzW;o05SQgZJ=%6swOVpX|7 zdV*GEP0j4;q&ha5CEfZ7xmpR9u&1pjry!nnkTN=COlIb*`chr50^(wfy7*#bx-`5eO1+!?wmw>pwFD9n{KxxB``dR z8g|Gu9PsCB+oaW^)|)|raWABI&Bkk*SlooD(#`oT4yk$GtlRm98gJ3>^xwtg8AADd zQ5-;!5nMQ1Y;h>tQbTaKWt-Gs{=Q0PpG9DK5BO`Ut)P;01G01>m=A)b&_%Ju$=PWl zc#S~_Sg5CkE} zOMQ)Gmj9NN5|pj8(6|s9(^T$VEa#srT0UHXrbfLx*@n^+w3%HuaPMF@6G3>N(-tw`$~PTldZFkUWy1`3n6PX)8o(lNoew!*qnlY$UIrFaDHb|;RSK4BXvvIR5Mw3F*bj*R z7g5f2-T|Ga30$c(fb;onnk^*t3pO+*7~88wDd;w@e|g z;0VXqx&*5MK^mCYsf3p9X6Ob+<8khn%$`#{1Lc)bo~y7Qd=J(}d;X!4-ZM1P)-+Nl zmL}M;mQJs`O1!pf4K4c+@_b+ffd;hl6z_+mw(i7D1et%szk**wn;0(EqjSPOIme3J)IicpBLrM1MQ`!1hv20IQC+g>gowvEntDtCBf3luJy(Ke zx!lCDm|+Qp6l>Nq!;GMZipb2iI_&9QZ}q|Et*N3(vHmL$ul`+Depcf>Hk%_tP=kty zTXtQFxkTBbtxRXqHEGRz_V)ed7=c|_8I^guu5wQzcG+}DgSWfsCM(bhkqQB-i_oUH zgyF9KaW@YBnGEu8+E*^7^#kggvUamfO+*@)j|T7tsnJ z4$Wk^8F5?y)Fr8*9OvtilMKtb4#WJ_p-&@D=GEqif`R^E!CPlHA}~g&+@uP)N=) zW)Ns>n%1BizHTfjV}4K|eAuP0o2P!?=NAYFV<>^rEjK=$SI&Fc??WzBQ>|jGv5R8Q zEMoM>8a|i$14!7GlrNa-f{8B063M@-y!O{BUeFI>7p%Aj_lO0y9?g&JbQLbuE}5*; z)6SRWt;M#mz0L9dh!>Ug7rq(I$MeR@u`v)XIky>uJW9etHZHGrZwzns=4FU=|JCcs zCg!tHKwp`2dnjM|-+>4!e8r0#QiNUJRK)kb^0MnUWXXh+Yz58oA zu0u(#&|W=+bWn@!xk$Yiew@4KM&GGD)h1H!9*LDh{H*G1y z%vhlGxGQ9Csb89Y@p zhpb$tH{{yZLO2FfqOuoa4vpeneI}7LHUR~?M=QkjTP|P%3Y-+Bmv1I`VAmwTti8N0 z-iX0p-(E%RA9%MMHz(?QTx;DoCUqZCRO^I03sD{RMh?IN-0sz(0DoHjFbbdpK83W} zy_Q)TQf$((J?zm!N94LGa7jvLls;WS8UD=~%<6p`W}7&oe;55E0S2c9{Q)Q z0XHM-iZJWrLV8nS`iwLttDz@y?rMSDBp`Hc8?r6&|@QQj+% zvzkB@cS%BEv&;N7c%@As$f})YDpb|rqAng$I0K#9Ln!QU1_$=s5Ame zf8!XZ8o(t)U48A&(kFvo6aCb57f+egQEsV|9rm)bSCJj>$*)0#OGcV%HEO(4%g^w_ z3^XAM0eH;n&>x1mwSOwU50WN;j|C*rWZ3p6IZ_B#?6ZZu6YatJUtn8W7%2>&O%WKoyXeqP4lI|}LQ{zl7R-}$3 z`xmU9?Vy;W8$hT4&^L(ti>r>%?y9t#VFc>4PG7S@S87=8%btZm{Zlb~*z7xH1xV{? z1BnNVA_RSyr!PCzeW6sdAch~<-;ViD)@}dtJPH9U~-B72OK! zoj|1zTt)BLF?KDPl?PH=rbMXz=I(ysFy-ckm@u1!>Eq=h{U3GdmMGl=WD7)|CGsvL zQ=Xh+8MXFFD+^zV&ulfh{GswZ<*D0jW9(nf~yGHt4I|eEK zvHeH9-^?X<)-AGi39Kr5!T~$Hm0XlKzP*krQUBmlhi}~H%O=}{x@dHx>%QnG!{SOH z5>LI-2RsA$UHmKGwX%)9SALy@I-X$&q`39D7DUF4d&H}T^pzIevz-?P5r9n&ajCZA zY)}z&BBg+5E0BF3!xFnhoY^UurE6%am7O+z>aD;72u#c>Jjb?=$+9Frm*~P6&g}4pKi&q4` zLj?}Q;=8goSU30F4Sz+P#0NtMGgMaThzK3l<0M0*#qL%-dH*qB`sewQ45l_VJ^@|g z?+8lSZF$ZTYU;P$RB3rn;_f?u;FT`py-h85Yiq2r0xqP&({;}XMyP>L3|xP}(c6T> zAhoK3Zl}romk%oM*{2$q0QoLZycu9XvDJ4)d3T@j3%TpPo`SBVUDvw^_TTAz0LCy=UTuR%q zk~o(kP6ND*^W z=}lasa$rs2!QAy!vbyy#CQy7`cr$41>J91e#u)I_bIt8HfG8g#`&B{%^}|d}5;gf8C{{-N{0L+P7p#UULc-Q9VPDwiZzGw z`agRGv(MS@y4qfCo?>R+@*I4M+Ke77g2j{*WKpZc3|&mywKIC`>}BoRCuri2kS5(8 zA~|oJo`TVZT9kr>^3zt*a%7e&f+vvnP3r^?h48AOF#DyYrqv-o;(bZ>6gof$S3>{$ z;b760*|vnq*4nw4-z=ZC&-QOxdZ)%>Fcg}Kz-b%5asMA&Z|^VZ**EWaVTMrUxB_YT z8moli=0rw9p?jELfHr!t;Rs-3fND^1&;P7#-i6Y3(G*oaD{yh$fK!m0$5>3rBc$80 z31y186t{774HwT~X?72KGv81M053is|K+(XaqWXFU2o%cLj`a>+bHcS&c8W<%SWG0 zzUH+#h#zw*I)uFR15o_4+oLSkqj+J+-lEL5sl@pl8^-BZi)_czbC@1!gwvu~aQlst zxtn?hISYj>j!KAqSZ}BGU8^!>psI4g-2c;;2oE6c{IAm4)Ci;QZO^w8V_MqR^xwjj zF1L$-eM6Uj>sXQ-mJGGH1{*{{2@L>O`+O@CrT;)Ds?*1|?ec}vGvH1@pOW?B?(~Rx za;~q+{3+u+LC^D44c4^MW1gRO@2L;CAmQKkV(uYF=l>J@D-V=(bu0j@+v{TW-R#%H zNAIuxBRCyz^S-zLBK+4>7?L`p!?&&*UnCh85{4L4>? z+Zp`uAj$*I%XX&_7L@JS==g>49#1@R<;m@11(jQY`!>`0XS3){94p|Y-OmMSfr-4j z(RYFX=Mgiico$v;-L@PL(ca{@$PVDo3U@es8+J`j7}fgOo@taIh8lXp`U}nW7{TFZhY6+1!E6IXH5ZX2hm9!3nXm-Zy+qfrp zELpIO9Y`?p_QzgKuz*a4`=jXU7v5dL`}* zxMom`j??wQ5Lm>G;HF4oP~^vw=pq>twGx4D?)&->Xz_S&d`3{mIJfqy7TImiYprC5 z_y8KkQRzs#utyd%Lx!0kr@(nm8&or7%KxUgTuYCrR@8+AMpq7_+f&}8u$H?j>m&dD zFU)Iaxogq-K!ooje-D)~W)~_6>C5wTv0y&#of0sEgC^dp*#-S+M3vQQT25miczO;j zoku{BHP~fwM%{{z*QxnC4Bw3$PkQ;I`S-h1wv%l5zQW!+=z_S*G1%Thf_Ii-!Mbq) zv4&X679H0M97HSX2wWT`1M%hGK#_Z-_gLcM86lee`|Hx=`AC7uE^fu+67%~l;4hNw zPo4g~>}7y*di=HneJ1k?Z`Zh)gwj%NE2Vo9hvBy8(meeQD1$So0CuAL6gf*WKG$vw z;u!+X=Ln>*UBap#M~kMYlin@fy=URWd$U&E1Z~S%JsxGpXrPrR>A99W7Pd}|IO;F) z^Gw&O6(WeP9xd-lbSe86<2m|kg})pTrFj47Y@y*or;UPPlPLe@ zHb3O!YWEZgqFx$v-j(aLR@_z7a0f0%xq(MK@8=ux9zK8a!ES!N-+gwgnFAeiznl+k z7W1N98PY@)9qIROb$yz|y>r@d^g$b}PzuqXLK*!_9T}iYybVZHYS-qr+r(z~JA0a6 zNd{8WcFAcx9(EUnI_~p_A)`UB(ygs)?cUR%M+me>B{CMv!m#&vMM{nM7FMeAiqKJ9 ztziMVFaw=HO`%_|YPSqV_>R`}{w<_81DPhz`oKp(1!>8zvZGz*vR~)|J~7H0;bQ2- zsfIH<x%4wN%0FrJa=nboPd^;cjC8VClSoa0OQIcHA;zrX6Ti2=q)`g) z^ur72Je6-22hyL?Vz)Xm01Y4KN2gr;9|mfnO(~oQbxsRml<E4O~Ri0qJj-d|@xG$vv%|2Zmf4n(+n$j_3jwMG3s2csFKPcn^=! zgA&;u71{n+;)ji&RBy~LE%8;&N#CpC!% z1Md&{^y~Pr?Eb}{={0Df0c^t3c&N?@Q?eH|%Z1fo=z5VC8?GD3cA|D3e!|I*qBGI~ zc)wF%lv|{u3IH&6*(nsQ4lz#=*n?GQl=g{pPb!R32{^+ChA~*h;Ikx;Gw)}PrPyNvpfd}|Av68jvl#m3&xU7}`)!?T4_3ox-K(F^I z*ncu2v&`)t1*GQ&f9ce^)TgLH%6yPjJ?C~wMkJ7d{zX2qH25`)+!4I=v=&i8!pfWJfPVTjR9sIJUnkoPA6IA(qD1DutAp>x_#wR04zq;PTFp~ z(-F72O{vMs-3DN`92+2gV2a)DhbSXYVUx`bgw|bmXu9nPKmyB29PzHh4;%Y~3Z#*6 z+##1^-PG*4_7V=uC-}z)k>gv{Of|YBGNIxMw4E79;tePh`6*(32kr-kjtV>d@WWNT zmllT*K}+{2lGLG<`Z1>z({L00L`sLOb#dUHggk7vbb^F2xo2KKlF&UsF~fGUpc37b z2R|nChncM`&h)>J>UC{Fnm)<1-~SXNp8hO@kQllXlEtPp!}o35Z>*dud8^+r3kfu$ zuI*<4#yhYhxKc0bE2pMJzP#D-pSQL3df7sa*5U>23E(GZj=IO>*hNNc?Bc{&*UU<& zj?*5XPFFadfdBjLr0l@d-#|Tx8ErzG+vvj5{LE|gCeD@5Qd!Hq!7#v6_rxC_P$7LJ z*0evpNz$8yu@7o)?6-xMpmuds6e7vHa-LIwl3j{N0J3Y+o|d70+_$hPCrh3N0eE&N zPs*P0F!*qS_Na_8JvZNVre=|5=x7KF$Xt{`Brt@fz`6HFKu7kljtz-|;;+UR%C1X| z{t1ev;Q4h+4PYumI$aesanH%B3P-7YDEcr~*}!a1w^mrn1?dlSoFoD|DN|ns$?9I2 zZ8YfT9VPOp8bH7FyMfhL>l6$i$CQ+e1BrB|U3XDYI13JZ9v@-hzLN_;b;aP!Ta?a3 zfifFGtEPRggT`v6vNRU{MfbN*(Q*!aEAD96xM9NqAD}LWU_MQQ!FZNml$p2aH8DLs z#n5-l?)l^-BvcNeY4h`C&Pa)bW#j#{Nv5qGM&j{o!jJJ9qEAPfx1AOwgv2GMb~1q2 znkSgou7Z`#+y}7=?I5V(bNa+TiD&e{7)6?s{PUvj21c*T8SQ#zI!15$V|>nLfnjtU z0%zWI_)w_2f6UyZzJq4xA$(E@yUHhi%))KgJp0K-XYHE=VzOaK7if%3{M~A4VpR8w zS@$NC$q8M63P2iX-1VhUk?PUACl*ET;+pa_i!w|`*cx>Wta=r}G>fubwjs@(bk=z7 zVVkj!&z*7kp{5o4a@q)O^CtEFBzR5#kndqWyjuJWB3``YHYtsA;6?BF5l+8DvCtrY z?rvO%pABbu`=H{1`HG~Q3f^Gba)=gqzrXft+*Wc7Jo63Ffsv zIqR}E53RCh(Kyz=t;_aVs063|*$wHfl#{?cq)uFa%!Kr4(S>9ISwrUp$U;be&(QAz z?e}!&Q+PzjRTutfH_N1@r%xAn`-nx9upeXt>WzY%>rmV}EA4XPhPVJv1iI5l-6`e8 z=yjC!ajO+_9EZ>hP}fGCvZeGB0UU@gA1cEL0wrd;P(+Y0P>=|J;5=$dqhH+3r5mG2 z5%AlLrlbRO4Mw^nksU{K|3Vd9IRNr3*$qkKHOUnuqyns(pE?qY0Fa1RLmr36a`V>5 zO5A~wZ{4PCNRo#udXxtPk~RlrSmKv``MfCp2CAeL8vrYcTh3>Dz-Bs8!_r2!f6>hC zt*IU#>RU5fvK~2BCN_{eB}+Hjj#O5AE&qkh`Zz5dRp>JR^fTPPq++&e(6#yj$2)7f z3?eH35QRBp;UB=+a})Z{asXBTcCCEbQ~jX}TLbsbdV+aD0$M=};j@MxGgv1G9K2Un zq*ozGr&6J(g591USBKv|OBscCc+%Io)^K$&e2F%z^{h~;4LB^|O0xJXp--5ucTYW^ z2X}&;|6Jw+MAL8&I|I;)Vs?kX@}$Wo$2d#P6huI-(N=(+M><6|+<7@)HEVU%uh#y9 zOZR@kA3)snG;mbX!xX9`l zwAI=JIY!kGoMze?Kf<6TMjAP5#UTgTy&^yE0j*s0dt^>&9jL(MPmCPE|}-h`h^i+)Q3J z$eXD+$*wtRz&n#E3CsXcfUmkwYy@HV(_Qq?yK`tm{}F}?I&?tsLTxP_&bmP{KiFBH2))s=cc|8HO0^s zRfwSLm9mru9eTXDPZgT3RG)CQMiAYPMdbZ08im)!92%iDG@b@Hx z3`T;c(^c@y@>rvbFQy@^PI+iSn863J5?Ur%ga^K9F=*I5O*vgAIW@>&L~-aMTX?T~ z#<{_vm4My#YX<3b`N_PI;aS2U6J60fp1gtF4c9>e*YL&ZjOojh=P~o9vSq&b?vF|S z?fxFxfuRAIr*dKq!zublTw+rZ`y5t~J+guKfGkO=VAeSDZWdvh3E{?4p-firCO3K5 z)+Q|QgVm3yj@5Hj)}iZ^Z|s+SNsI%xQrvs9e05~6ybpUdEEFCgR`79$v(hq7b;21uOZ!hKUG#RLzp zU$+m{giv|pS`Gd#Ip#*gcacW3svWaDS`$Mx({uPLVS9VK&~5||1DI&^9xfRF28+R< ziMup)nOl<;vSZh>X3TGbq+=)`QQxXN%Z8`aXZA zK+7So&Vi*^)sBhq-w-j$WZi?{U&?;eMM=hySfMy=(J~DqrR8NOo)Fm<-W&lX0y=ZdU9hw zyiOMy6BAzT%O3%S%<&7eGj#NkpzJi$5kv$CmfCaWImbMCqk~D6<7aa;6pIK zES3XQqX_A;oVQxf41IRQNoK$A`uADv#6Qom)1%}04U!8P^2Z^=cAotCRN90GSTdPp zocbmwlMt34yT7Q8+)-*%M3Tsx5+%jj#uX3Wl-kDMGEGF75vlN5CBHBn)H_z%8Ex&J zH8^Uz7k8lnbjudwe81vM}Iaq54(qmIr z-Li+qP^QWx%{nIn}BOMI) z3$MW+jf`!+?fm&!l7Ish&=xZ35!YFj@?e(l3-Vaq0~WcuXlIxY+p>>UK<{9h0gm@E z_3-|^=$TP#&t8hk4Y}3f#$L%++AhlRkza5_8V%(!#CkIAQ+63;pW`=kjV)!k>cS-$ z`=LkPE!&bWCaR*}hH_MROGff>h8E$cA9F_7lmN_nLDR{z?-k3Uzf<}0Xck}+A7S(rG6U;axnsY)HEhbRo+;m3j);I zqy!qF>=CV;uHA2hr?f2uZdTeUB6-(QzxJ^{&-BZUq5Gi83&>_3T-2FBk>c7>m$>Fj z9O{xDc40AJ3{-(&8kS6s(4^U(0Bo-c>k(|pEV5r+vmseUdn6KSM1Nh~={+sK{~j*8Op%uMmjr}5J)Os*xS>PN!>Gn5Ie6?Ku6J`VLXtL+UMCr1VvdNhfI|FrYZz3ha~=+d#P%5a%zKgFnk4d*7>ba50c$ zfCG$@sNM%;9z{aPC2P1dIKDzY_|ZgHCcL3$jMW5NL@JqR*c}r|b0>jgr=dfp>=#FE zzF?+CX*`z&|1R)ROl0XSrMSYQk&+gprR5ij5tE6&DUS59W3d{j9~nXUSfDZ8n7;$T zK)yb%1A?22LTKy7Bm1d{HMKMzC@mdhIs(ADKRt5k8a%N9DtbE)s>qKEWL7SD%yTP> zH+M=)3-3m}Gh($#86YJdnXK=+PH2MKCKvT0B$I%e)=w`D{p7p$V5J;IPz-xT&4e&%xeUeVfJBY`<=uQE5X2d0Z%3l=>3LeA`@&>10c_|cGh*Vb=< zP0U}Sg=1mi-0#1hQBWIE@sA%7`-9Gzqg`gAQoWE84ltQE_RWJD<3jfxvPu0LcF>Pb zw6tugT~?$4zXgwo!hBjUrJp9tBe9M-8IIrYK0ba&4#%>-r_zLQ>6HfCo66XH-&tC$ zroTHR0;$TWnbDoS*U@r6`$Ui%9(pZbFD}zmfpZSd6eiPsr)7LKSRFs$1O^yPzFeE0 zxl%RiJ?CDd!!qNkz< z@ZJGyBp`I%*it4-f0@W>dIq=bkl49A-b)G`Y(}VN9lo8{QlI}-gD!nNG>H3lJJI|0 zml^CuOSwKdHN!fQ$E%8_55Bc;Uj9oLIL89>;30-|7^?%YwO(l;aX;S*mDi-tX5O7% zGgNkbls-)aYREhZzo6}EfDT#}06xfEtuT3ILB6G8h<60ToOK-0U&|kdV@MgAKN`RD z3fL;7f$D&c3l_R#1+KyO@1Sqz25N1l?({{+-63Uhu7B@bX@D@u&O=iqsQV7;D)(XDa;CKXQ$W;3ILBK3Q8(K~FzH#|i#wE}}# zC?T-@RwH)@sDi##e^ymuY19w~Lp1<&RXOe=LcoEdeGr>{HOE&kq$^vxs@8|AWkgjD z=J5$&s|d$K9JpSmTN%BiG+(+jHU)kPc*PJPXb6|4@55qd3|(b%L$g@S1eWb98VnK7 z&=#rBD0eLWuv2=Rr5Lk5hju0% z;YXS;nY^BLK283`hE{?^hJl|auxmjlypUF4@GS>aA-5_-x{VbI6ftabVA*&kJTl|T zc))Iy0TJA@%6DpwpQaxp8aIwVxIgGp5-q*W~tXccIy zaT{85{I(w1I`8RI3*hOr9Ht?{0e8faWLy=YeJr9ihZZr{j=F{&KxdiJPYriAXS1Tt zY0TG>B>P9knlJsB4`F#O6R-J`W24js%T%H+E-54pcblyfiVlaSw8&gfV+xQSFv@qy z;=@Qb))%`46)o~-|L?~{Zc9R zeJHVslN?)>yz)riRSh3`Bogq` z?>-!2L6ZmoS46RA6Cy(6Dt0MZuz;jrv9hKp$U{Yw0YxZAbtN5`*Lw&WSJk6YHL43VcheF zd(t;PO4AFbs+mZKjk318JZ*ftBxZT_2kc5FX(ni$lvBu=i`JYG&bH@1UG1XGEt?q=y0y=p3IqG zM=&Gbm@lR2P}wMCqTN{N2prV>2>-20>iSA3ofA;7Cfl%4w8qc3HTmR)v7u%e*q=$A zXIltz)D1twdf4;MLEXqQNk@!{3 z0(z8gR#@a2rsl79=7EV8BBa`Rz_W+R4`%W1E$)w-wf{m-_fD&>6rQhuWUuhi3Q~Z4 zGNr!z+pi!{LkQ$5)hm2X6n(pb03r5@KEGVfo%=v)+i+Ld9KipGKofCw>3WzN0cA+y_ZLp84TmzDLYk%3 z@n|9N6FqY}LeiMdBM9#>vHm6y5yrEQT#J9LF+YtTf&+GXzt&06yKZoZ`JQH7`C3Kx zQ$@?=jLo%K9qN=o6pjRmRFzl~d=4fU)b;qtr3t!S3{t!P8;-#uu2snb!bDf5H#b}GhRR=7jb=gk(ae0IG;UCL{)(Awbvj%mY)I4v zDZqp@CfUmMfpPFi9Kx^|llalXkndLZve>^)3fS}B;EgzgX0%@^eJ?7qN2J>-{;aZ)cUiZAih@c zn7!UVYWVi`uy!mg39zhD5E-8@Iu`Po3W7Hu>Aji*zx!vFMCGN7+h6&U8LuzH37M7w zC(y@F$X!3&DFa>Or6IU)c{pWOZD;TDzEi$f9tB~0v@A<)ge0Z@36?s4e4knR^-Q>j zPYw7T+T{=+m}U%Y?5RgL;)Bq4uOT)G3gsj~E!o+st zR@VsicY9-B!-Q&-2=r?>7EjN%> zjDMiC-Y8Z0_;-^fRalNYy9MM>Rw)G&g@Q%z;D`vHsKBqxuAtAKbQDuE2&7wkifVOW zGLe+kY<I6+sZ6OE{v0;Wt`o%#ahBE3F#JO9_GgO9Fnl>D1oAz| z%wi4Nxi8VXNCIZ}fVFonepYIO5kI8x$^6p|A)GG}I}8VgxH{ zxB*yRT8}3ppQu`>WUm=FW5bKYmnvt7-CoYZEF+OP3`IQdL)&PzlN-2}QTNrG(VKF0z@3 z)Ad4Q=gFa|ap>&L5ATw`Ub1<&n&-_I5k>W6|J=c=zsxqdj0gt6MlxDZlr87`xvcS# zlvWLeJS{Dj=lNx3yBx~1^~!v4UAQJs1DfA-+OyU18d!8)uOT~%tX(!^Bc2A)_q{Iz zM6PCd*5_Oaj81C01YH8~t-u-tj%G^)Y}q|Uh$qvj=`I#^Vs=o6f{c(IQH#7tOZXc` z4@{bpy{`)`ZuLVccqfw7f#Z*{B@XtIZ;g?B&zXLsw<`f{ZjiCz(!8(O@20+IZpHzN zNA##K+F+ZL6*CeqR3MgDP$Q}88MfzZ@2i@&9-r4%^s?==8-E550Rw30@0rW>s}@Or zCWpC-c;Ta1b9eEJv@0zbzL3->KNgDkzvL{H^t@c+%?QB^g!bj@b78Buk0h?ESe1Mu zLW5B+BZpH$yB0-878Wy<-ap-0q|{Xu<{0f=`PpqL0a8}IpgT+6CScH=K7^R(gYJm= zd!WFrp>8H@tNkr7moeru!8F`>nq((aqB!-ztvayaZYK};uTu|2>br?~|7H?h^e@t@ z9&nMmA2EN4hKY$;GaXj^IHiQv(?|VnYHmOw<0wGWzNQ4KF8gf z3QzS<)?>#5{&S~tMp7#q_m>Qn8cvD0DBid9T&8Nf|8f>)c|)FG%er*U6)@)3bZvQP zsH^6GxjnLJIotxigKe(RCXiIz$9#Pa(wq*lXOsGYqU+Cd!hix`X?Y#8Fm$DvJzZ`K>3Z0 zseGC3|_Pq%W`=x6~1RD@sdklHeNloc_ z@5a1PChkI1yEM%HIHvyTf|K|Ulp4IgIhS9VAV<(BVf;a^{1PMUMd5+vY9^pC+WL-W zBCfT}I~!N6fGb;L0ziaPKDo0eT|o_k@_qQ-VCieelsnT*u?-kCS~Bw{p;*YFJAKt4 z*}{vw6fq3-zXr7Gs*ZcBX)k5cL4%kks@X4pZot#j6p%$s7EUIfSA(NVSm$wcvu})h zCQ45#igdpBSo1DeO8;S^7djuj-R4S#su8>f8yh*rZ6tSrR4;p#gf{i#@j!Mx>Vm!H zr^gf#kSE$q)Z{Tm)2sz!Pj=F>TMlGjtT=I^86_3Q2jXbdU7=}LJ$8lrB|wY{k^O3c zj^1V+q{Is|eHOoMFYg*lqNCr6`a)^T8Fyw4LF;3UA48Ou>r(tdVo))y+!#*~!tA~I z!lB~zTZt{xvplcbgWYOA?!REP;Jp$gH&0UtHDR2K76j#1%b?h9m=;BuP-@cb)bUka zrL1THRg0>#@W*$F4iP(3&KnPY61l`tOpaVvdPd3PU1F}BUpGCj5*F&iQ4O^|G*=~i zkU7i}V~ zoqiGc`)>yUAbRt+be$=2sp8?g8|0wscWbpuz z?3>y?@bw)=h1|R?n$(fH6~FDsQTQ!<{V@+DH>uoe#K_#C*7BQ8FBn&2gt+e88-tU` z(b;`=>(NeJqeRk|ilUiOtk7F3?6kFivhsElzi;vx1=c_Mfuc5J7j6Y);&?1>flG0L zEDyOhqEU|zvI`n>w9)ee(Zb!z4UMJSa+doMI05~mKX>vYkPwxa(de>R$mSyq}ecovVH+EYKhcHEuS4N)JLcp?O z#=ozua&}9iQ{7}NB_b`6#^5js)rX_Gv!!JZqY#Ea%n|6Xx#^1iuuaX`K%>#(1^<_f=*FEReT*}ma{iYC5fRFCl#0@QK zgO@tAz2jyX!4xv(-ok^X^t|!Ci1A1>uZFZxNm5?OFMYXdw#m<#>|XqKF8I-lM#QiF zpCaE6Z$dz@S`(&U-QZ}TfmmB;Fe}C9Pa6t*zN&rVm^FuP1)SOSD7jgN>WS+Ck=q&6 z+M8CvJDWVcoXy6edUU69}kC{|h?57k2u=I@AWnurGxTj7#y7EA33TkRxO zB7_1>Q%#d@hn8J+S@rP;gD~^^aJBW>392le$Y?Wv7DHY>QJmI2xb>bX=+EQK+z;y* zcL8A~GZI&$2TObeI3q#XxBg|^-~DKmdV+5v}{Zm@k8bu&K7 zrDaEgle;YPQz+NTm|%+e?hCem2OhO;`04CPHjHm2IIoQHJ+k9ZqXx=lvaPvxeRr1y z>6EA}gz6dF6bt(=Ycf>THf$+i%!aW-T<$_7-k_txdIJdvx7+mu678klkt%u&VSNB< z(H;_)F9zpqDNtewZThy3yN`HI_VuUVCQGGd4CTvyvSExY;M~n_{P4r$6G>;oEgLq< z|3Re1Km0!WUQm}fGhj`@l;iR0>IHcSQmcZJhon`Br>Wc?l{4{MTac^Goxe9~zV>+^ z(4TLKZugT)POB!c6wMq)#k0m%-CE<{05OTKs6Q{0{OM1LA*dyPJ@04R61@o;efN?E z9_1r-@g_AM_QJf&kgwlNNm-{puXcB7v*+H6dP}LT$?+r3&NDd*Ioji}?V(=kTAqOa z2Pb=NRK)fkL+ridKL1u0jw{zTx_bAP8~@T>eagumDZj3hkNzI^K6VXw0%j~Shz(Lf z4X?FG^!b*I(ndjWk6j{I-S*+rC54g}6Q4xY5|Ua77s7VkZfMX34|jZe1b$w5a+e4h zO&lF%`Z6EKhcP_W-fVl)HM-?@#vlH3DmFZLh*A^{Y?l6gUyxf$vCX6qFumJPJ;GeQ%eKw=K^vYC!zU;FsMr%lSdXse#j}i|g>QaJ^GW66y7?+7& zK^vVtYws5&&Zm1pRN}KxMCx|0Q%jD&y(+3;y9R+}amDr&=aY~Mg{|G{`qtu#6}z|{ z$}B3AH2*MI8j=dB6AnE@ENi@qU#NB>wNT>JgCeE~K^H>+=J{WxOZHd{5DP6bA)Fgy zAYSnsbdzGC_m>l6KRGi$4bud;1NTHC&Ckyxm;OQRNxD|kjH0(WcKO8UE6MoNV)d1S zyH`=lm}L{hS9nr&E{Ceucr_5LblK%e88-8)^>2p-cL(M02TbuO;_NOd@bv2h=%@-) zUteNJEfTbP?_tzM`yW**_mPX^Es>thL3;z#nwe7XmxVxGxw+T;caH?7pCruYlp}G6 z%V*T(%3{|pY3qiQz5(^70onq4d1xFHAeiSK$unZB;WRc9bjZ<=Llk--4*Up#Z;OjX zgH#yX?YIKf1+C$lNMb~{UI+QFAys9SBxDP)!qqx3?gC9)E%+NE;}YcMM5O&G=!O+r zi*1dKWAfHawfQY0&BlRQ{Xr&TOpm5Lo42s*NKm2FkBQ@jZpKpN6>R#xq4cS}f)Q<6 zT&vVvZvLi^^v+dQ;59@^3ADCU*uDm*yI3j`+%Nr!*B?8zGix+sed64#;$AGoFxO{sC%YL`06M><(t8)HG>URxv}JnYko1*;y` zDoF`Ui6W>5ZUi#rS1=kBrzrsFe1oJFJo)LlU>!>kfR^Kjo#~kqQ0bgkrO=3$wdbx` z(S2P@Hge_dZ;KFs3-GwNj(J{iE;zaH1QGW}%_CnpTdMDq#5K7y4T8{_rF1oKQb5k) z?cKl=(L|?>r@&s6v1Kn4JqrP&*f1dP`H0?NR%^lo0tXAhcC1FVN3zlkrQej}IrCO8 zf$>7DhlM`Zrv5G;E<68O)$`K*I*hf@{>S!uWNZE_5ak;RW)y67Np2xUYCsdLrw{1g zL?9Aw#K@qff*TkdoBQ1^0ZK)W!(Br*@e=b<|9>li*0)`@z^1g0b(* zu>ly1F7PRi#s{_sMV|Sb{^yiYDHd*z3AdTzLvn&p#)EU005NPH<9h1w>tAoT2E7R6D+VL z%l}xVxUILPVWZ3x6_wNp|9Lan83mJVpj-pX5T`Bh4rx^>6e(qIu>1~#C+VUE@TT&+ zlR!xS!cqU(1~EtfwI^%L;omDbo#WdP(h55LKyQI)goqtNl}}M*P2Eqej*u%x=No2^ z0lUu6M3`sr!ntu$I;S)Rhsw`$-7Zq_Hyp*0NYgXtxZI9g_almxIBMJld>f|klnz1U zG^u4!h2)vI^kdr#^4xbuGHO{3HIU1e<$>$iCWrk!CDlTujq9m`WpAxxv>20dF8hr$ zY&g>Qm`dE=T_FiBTvXtY;o78g9jd%<9n~8BmJ$Z>o&LQ3(PM@Deq4i8F|}|}6_k4S zApM>=_`PJ%&BcQi$4OBk4Oeb@{UgBJ6eJY;CNJw$Nll+?T=#^ zU=GgzdAVX=g`0#{ty&JfV~F+vMF&o&RMah)Bj<9`JSZx38<-Q4r=(DMf!tT0+Q5q3 zH@MQf>(YVN)g=@0N}c)vn?Mc&rSW9zzEyG^YZes{bAI?dX1kDs1&Q&q9AHlx zm6>DmSU8}8cipDW#e;^C`SMqOC4@oEtuuIniK>)N%R%z1$cU*+pLNEczp zq#@IhGP@zbEn~(d=I>0;x!_O?h0(1j<3T%jQbs z)YQ!EH{t$BNpSo4=vo=cFSnluM3gHg_CiQQ&U?T>j$Eu&-Vz80e1@-JY8EbZaWA;T z!ReQooxbaE9m?dith%#M12!btJpwn7%zv5+z3-pv^ak~cOTw$3{R2)r!Rl`$W2Jfa zJ;+6@SR^-Ueu(V=Thg=pXyYbBa9kPdOKK3^3UVcm z{rd}2GA5$!33w+@b?qPJE1?B)P){)mo}v4(v+1z?;X}zKK#RFSjEnJQK2F7;kb2x$ zRD>T*zRGsb8t1K|GQt(a_%~6&7)gK~;LBtP=LYUcL2YM_&6BpsOTmO+8+BNBaP=U}hIdzj&IFaWe-B+s^)$*qNCCUG7!Om^9lN983l!f^>`IED5nS2nw z`m`4DmPP>zX-lduokb2@ev<~{OZ9VA1nCq8+1nq-n`MuxG;aR7&zEUj;+^yR1S9 zaz5VTlZxGQ4KDk!@X=3J`pp0h==N!=&leBrO?F$ojUkj>Vse#VMfeO7vkS1O6iXw& z7Oej3({y67C2De9w=_Att&T*}q!-GA*%9lk|6^=Ql-WOipmzN+@W9uV{983(MVlYO zVfj>ay^rMT*L}S~DPoL)=1ca3eyjprbKz;m1c%LhYzg6lJ$LajAJ(gD#fR-Xvo?0D z6jr9`uDsRrfePKOiYvkdzG`<$LVWy`W6M|d;3DTU)9qscKziSzylW~rLGsHzQdaIb zK7?98`BXA&k8y_eL&;P+;!V{9;^*cH>0dj%TcoFF_l38nL1BKOS*ha^_cUyW{T4XP zjyohu-aE3Pmg$gr!y~l|?BJ~Dw7{p)wj06amkhR;VEIZ2{k|W@cL_GXw1sf9GTM?Z zMZ2~^hM6!U1SN{mWB>wQI8?{J`j`|c$myVV_GQ+D@J>;TNcNv`6Ni~Of z+sAK6l){%RB-h%jF>w9}$s8D{$Ms?As0wnys)xDi&ni5uxC8hA`#Yg`QV_7u2SCV*JBZ8iHnw|FEjhW6p)F0Q{unH&e=J-!7QTeLogp3 z46VRpelGWD{}BwFZorKu8{8oL=h@nOYesdD^_%Nrb;$Qa9iKPoVGO>f_Dy=rq&-jn zVuHZUw;42nX-O1oy%$PRN`X)zUVYdQ)q3)UQWS_YF%z(-a~i)kyKN!!2R?Fp-Da}e z0RN!Le7C+pkBegQ8*rv|;RkUqf3-E?#b8%%n}j(|2tTB|9@GaXy~uLhG!UkZfNk!w z=)Wt+lFyLYRjo>?^DE2zqb4A+$yVKmg`vn8@at)RJ%5q3vBnlUA`!@B_s{B5bTdL?*ybF^ZR0kPd%qBtFk{m#7m;$ zU=DcZeQ;A4M-oZc{==7K|D&@EU^2D}B2ID-&fY~@f)%b8oSbw0;aXh z=KfKlU}(nsRKmg<^UXzU0(XA^l3+bl_{@_2?Plao2q(xbu0D008?5D+-IH!NRPq4^ zhl6$jUZ3X+J%Mk{sb=Yq@;7zk(;S+3%8Fpi<_HP(hWBNe&dnkZv3PQgpn^yR#THdO z5wLJI$rZVxJg**RBVqbTSVlgrgwjz$3t(Rf?FiSIoz)D?$p0roL@sE)zQNzf`efKz z5~_BVBL4yQ2m(B?=5G;EsYpPK{`d+fo33*Cy~M^zU?|WZ7%Iuy|r)%UNpih1=oT_>Jhg)+2@q~A5*Pz-MnrE`;$8>7W zfe(d3a>u~;euM3^+854)3ByNZSva2cS?3b)*t-HrBlhIxhj zae?~%Q~3@1OO9L6B(lQ*k@S6z3)V>zUKsNbMGPgJMg24I3TgC~U)I=*W4Em>S95x% zV+QzvVq{E%S#4H08BCayK03Bu3R*KPm6!ym4;#UuYYw%E@KT#{waEFWe!M5W7Jh42 zzA7_h@~ggESS%xf&W~CxMS`05LKP@x(D^6udSraTiQJ{3%pS04jK}n2WC`D-JTI|4 zXjHJ4aEu_IZ;g|Kd_iTSv^$1tZ%fEH>EeU}M7#E5sIGt-2FoTlK^dOWPH6;7g!Slk zRzN({)LCq=HWm(58ChbCE0u!%5f0jE2^>GN?ex7snjq{N~ zYVh8jvflk1Kw}*RtyWPN7pM%% zGw6Hxm4Ib-eE&rWc*=u@8A_3#hkkpo+~d)>sxYJKta#8?>l;$=;7bG&f6ex77w>FS z`-W=uvZK8;qG&eypD592oqWV0ZL0iJfc}G|#vp;79GA}~S?itoHAjRdN5|lH(T>2FrKk$8(*?TdvCo~3 zoelVKh;SrSSZv6mOz zXZRLzxS`~(LrUVq(UnFEDfGGLU0&mx{*xzC+qK6gXpb>!x1s=RzD)9X4I0``52c`* zH~>nod5kzx8Lc=c+MPYBqZ3PZ4^>n{?(71Ub5Lr7`g3=eecvST3yWmDHk~sSIi)(3-uj(E1|HGdJmC!N+f5BbW+f@xSN-Uy$WbpgPK!EuW>U8=57<|*k&NP5SA%ca_yoEMG zzmLuvZGO7MIIfV#48AaU$B`_|r!)WnK~7CZv}phU00000007?s01W{EPyhe`R!}$~ zoM`|6v}OUF0V?1D4go$*G~KVdp~`JVFP_8I*%(Et8VU3a3-n-~87 zXkXo&iSMC#CHe>SAM89M^7-&T;=gqN#C*~Iosa&}br<=U;*a8ghxZ5mSAPGp|3l~( z?XUPh-+j5@1&$w3j|KnM^zHm_{hp8gs`di@bN!S4AFv<$JV(DR|C87k`mgwp{GaW8 z=s)BC>;CKWOWgPF|M7qMf4KMv{)heN{@1UU|F3iZx}W}k?0hNy#DDui7D5ECqD~&N zD8kyhbdGS;DSH_Us?3!!4U@W0*d?>+P!~#^!!G7q^>vK9yEoP#M=raDpcajNJPKAR z&vTo)rLz{a#DG3U&*~$lV_~d3ldAc~AZ#TK$L~5#!8kmac(7YT;qPBZcXAI3M)RP5 z9=TP}58YI5X}5K=@%h;RVaj3ra~Y)dnM@~dw`a$F>W#;g1Ff(5LLT}5ZelOnX%&K5 z7C02-8oL3M9Sr2pUDBs{;gEMoc$Uei^=!gaCkAt<&a6^oHqzWz-|@Dmmhh`2y#w=? zjO~RW9^5V^xGg(!{|tk=72kTnXAF%|;skZVKBSsfBHIb+u3U&b%XPivKKK`Jvf@8& z4`WbK8=L{!6C%5U{TqSF1(BO9o2BqB&Fs(vn;#8%8dDJzXC0gZLXxW|+Cx|l%f3p( ziz$DRz%6Cj)}Q~ot~S_F)`Ry-ZSbnc^S4+Q7eOuY#Aoqx^qGVD7fygug(|LUH$wfq zBYe%-NLT3vV_%R$TJY=OU(z4`z+p^#7J9QeIPM=O2E)7l$lGr2n)^f$*$?7zw6~{6 zH>m~(O0TdIOE1yd8CV812$_}RJybmcT?i4}>{ z-lDrdiHVctzo}7HHE68F!q34KB5Q>%bEhk+2&3yaAjVrWZ*KK$4c*y~poS5-<^Y;d zTUDf8AnN$G8GWGj*FP2OVF%mmMQc_yvTq|muRgW~E; zTOqzwi~bI6R2KjQe_iLR?$t$|9yA0qBnVhKuia`^#{H{E9j_>b zeDLhx+`|GHLFNB;^l}CVe%^l#8fU^6KdzP^ykbtbg%s68LMHWesTaA>Mn5ofX3Y8u z#Zs${LK{*Ia%`X)u3)FB=pWxndENRfmCVXWi2zoa5i(3nzpdz2&Vu}KD}Oq1*_Yduj~v}I%Fu)`(@zx%JxN;D zZ(fW58>tp_1^-lCqz)km{~?DwVzo z1+`tjdL(j&RX)=lxzNJZ3W2JQ#6kO8&w4WZ_CmlbAS#~mF+(LhAk0E{0hwC#{8s9i z^v^Pi7w1_)g>r9nCN%OruHZfQRB8<$QR=;(_FeOsvp z{<;AkGnawO=1BC{;1U^*MT?FJA`|FF!ZEzRPdqXqASZItYTJVDOlEU=cF${#8qVp-PgD%p%xJIYtgtq}q zP-oIeg6#L|Ng7w-1ihmSwwy3Jm!8!0^-`i!59n_z-x+e(uC9|V8l4QiVKJOJ_oo4* zZZ~B6iWC_7Y$NAiTgFao?c!k7xY-hRWweIF`eOcD4~StqI6#hgzDPf7STR(D0+ln! z8PS+%9V8FU{XZ{glr=Wv*sAu*f0>mNp0-u&Q2&*2+C7Y34Z4H~Y7qfhE$J6FUV;_@>xYP& zi6Z3X?jK6-IV%(*Rke!)Ni?{7giSv%Y7U!=?8<{+h~2VRMTd^!pj%)(iq;z1ScAOu}NOc2mS(Ej6!Q)Rgp<1|M~XlmZ1IuSE;zv1297 zE_0U-lB$)>L-CK(ktwZJ%v0_6m0A?MxJmpN$fG5h4~?0fm;OP3 zif&t3&V}`2QnbEp(=4=J=Sv#X?s5|JAp-MI@o6$o+H_(lBx{?!ZhbG&wvztI%~a@r zt)+h&67H+bS!v9vHO0b!?T-ppjwAR#?!t_Zhc?E1nA;ib5|XrXof77_F|&rxI~}8; zt|*EYdN5HJ(usB#ejxmRL>DGHLc*JK^{7-H&02M}tyk7wFS)3Jq^VEmJ*~lGI;5JT zO>J}si$Za;L(vyrCfdg2Zi>=4M&|@PQhzEl0X~1OE`j_TcIN2+rSh5R@L(+^6-jsF*n0o2;g0?P9Bvyym#wh^ z`W4qZbeZ=pxk#BjX6QF;p*DlIu_-MlJY6(*&hFj9AbC&wwNyf111NKatpXvN4C>6* z%RiQS6S;1jj~ubCE_W}lxIjE;`oK>uk1|2bG|lXy#cqY=>sKUq$$GRB^Mk*Tr$15c z$7Nf}^|=1tIeHzC+-MXnr~a8SJU04+@@jv!#}HuAHW=RPl?bJB84<*xV*&WLjM-o^ z`|ml6oWfiqC}wA;>v&S_M@^UFHhXPN0NxOTgAN@YUsO9?b^_UxjhOHAc?;d7zCujS zbZKxwhxejb&ckjGhicdCj<5$>%f%VipMr>7(`bL20TFD2+wsh!gD}A}^UA-g+3iZZ zX_kAkaYl#TWWb>2yPJg4$?MzXY!=!rd-vbgRm|8imEzKZ{Ux#8vHli_vr`sWGS=J) znssMpE2t!;WiL)HFXyQOAilFZk1I@zJK%+zR-=-gTW?ls_Kul45Ba!X3J)5tqM|0;qH52yFOL1j`r*EOR^WS@fTLc!fL2-8OOK0>AbG z5SDV`wgtB|u*I{jBB3DW!a-$7_t(mer zRNm-cfW#?cF+L+{p zzVF|E5}7HDd0h(H9$gzg4;~cnfonvZ*~qO4Br{Mz-P)10Tg(wQck6*#Qmc{<2(TZijSe%-7_=7hoGdzwFbi165rFGQQXZ#X0u|98Zr4&Vg-@=j2s4 zNX=^0gK-&viKE&4ewC`J0M$+WA!~N+QG^o7*PhtYx|nA#exaDn&CB{Bc1!$38ohP; zrm|^8DlpS15Z4f2@w>zH_E04I>7g71j(0uPFfOpg@7p0X_unW{yN+>_kX=Bhly(Q3 zvSy@|uk-Xry8f=3_>M1=ymU$bR=I1k#Ifuxvv$dV7IkOqZ)xkgTC51Qwr#j@gKZ^E zyBPSVChsKmHJT7&Wi^@3Mtt1YZO#3ymXg7kNm~(t?-K_}6faHj$}1b?r>CD8ZP7Z} z9Cb@5bkdQ{VOWSFwZMubD2&f1;$b>$zXzh4J0u&N{4}X&+GZD{ zrn;QM0jp$1h;W~-RA_cLNm9$MprEb>_9Xk6*MuNrV!e zp|o~Cx`S{SeH%^d^#5*{fh8Byp#g~w2gQe3$VAWel+R#7XgSA2PR0M@Of5*AV#FPR z>bS1O#HK{q$uxuakm@Q0=rr=CaZ6lzB%t^oVUQ@}+0b3hdJAHxZKjUV&P4VwgF#~Z zhXnt?u*qh*1SYpmcfG*Ktzf3zdGj9|D}kEQ*^@p9qhn@V9_V5zBw6Gph)XD%3Fs?x zYv0ltvloxrDL)_=%UucRMr|vLdPbekYLX-QZr?QF_RE)|i-t`FX^?7JOw_1bgq0&C zw?VE{rnsvI0y(sOJK(T`>eW7DfHVh4rAvaDJ49m>rIK^Sbc#qWd0=36?IJ3AyB6OJ$5r}LVf`r>Oi zgqkcK&YAG#E9+O7Q$U|L(>=>+BE+$Wnj$zy#X13n(Z z{H|xvQciRrGum~TN>0e|Z@~*&suF0awp^`b0Cz1eQ0}b`3UqWC9=eIl1z1$3<@XC8 z{ISurNcldiA2n~b375#SfMjoEhoc?qyr;y7^s5g{CNgK;IM51~2ptS8a1 zRYaDmz)*s95xd?p+evI6J*|q`ZsNu?#al|hgZ4eBHYLzv@zGh~um8%*pQPD!1hEq9 z33wB`>TuEm{nmZ+-R$rP%!b|+>Bkh+j~lx{-qByE?UHH~>fKhPG;}Y#HXd8okk-IM zBQmqU!nl47sMm@qVCUE>N?Xb3V+h()k!Y3(1mC970?Ro$y#WgG<+`c=ugtGuj(Fdu zjpIVB$R>t3DK8VNc7Jlv4zYNTn9ZC?4EopoVjcd6e}Zj+Sge>z>-2t?(eM&;vkoYq zAk?))j&|G2&FAHB{7@!HBuj#Z6-Q9+2o~V7x@*b-aE}6J*utHpzi8v}@)4n* z4%Kp3i<(Y{x$jX zR)doFqpvyurSX(n%e{>zamHpXwy`g)KE|Q&H5v=|G60ZG%IPn4$;VdwHj}0SwQ-4% zAn?Hl@+bU~@>*xmJy0_5Yc+HO#ti9*cyfS`-`4uuD$|nLv=BF;UyoN&3PBZmm~iTO zJw^U4@0vE5oB14gS`y)930;Muy}3@Q-A0FFaJpkW&w7uMC5~Olp^F;C&%Sr4hj`0~ zbZ1yGO%Xh3tmqeGMa$bR0r_@*ydb>iV0zLSA|AyAk$dDxpOwd@!8Ik$8FMFD)$?DD z-~)C8Hv3_|&f7fPe<3Ie1Ik1{F8Aji&QPoTbYJhJjX|52ZO>F-X<|j(9}D$W$(CA- zt7vRdk`B3*-l9Cj(eoiqeqS9r)sr5FgQhWQ9DmHG^lhEccG3}C{rAVdxsHx4xwHm} z0w(@Z>8@&`M*yFA3em>M2qbm5i!G|tgY`RC2Ml(d~ zwM5z=yiRIoGIXEB;fSq_S?Z*K1--`&zyRSFIJ#PpD2`6n%@fP|7~TbyYup@38srUw z%jB-`id<76lut%)5-2|nD)r6I2j!o?$g6e0Pe-RigOB{YpTW=v6F+VJ83TcogM?hgR_dYpT4h1*d=bchC$t-%)I|IY+Dm!clh8%x$Z%f|Y@*hf89%;+V5C0}(T zXg@2^ij6*V(ND>?;_K)Q+V@L(rWR=P)i0C_y}vBC-NXqJiWKls9cYAr6pC9k z>H(u~`@BqwfS`O~C59n;ljVpzk+%}2pK5zJg{%`Ud{+_WVEN68on!G|_L}f8-SxoU zBZN0}%#mHUf|vm!t*jM5h_1$$^vp~QB^`nTt)t^8!w=&&d2Tojzd@yHh1m=pKN9Nu zDrnOjU40~cT!H>aHQxF@Rj<1`CzXFq9n`-$BYF%tleB7sGr~r}R4ZJ7Kf(FA#_=30 zHQ1}x3SfH%r5d3C%fI*uMX@`Q=EYBrEc+t?f6J1Uxj5Gvo4XQ`gE)+`-7l=I`T6+2 zJs!JY(9v~42-S)=m0(|QsFEx1%IEQvmaBT+gLbq<4_g?2DDQX@E!&OOqSL%;3hdi( zw&@uWLa3V%@m#qL{wv!=&jwP~ht$+qA~~3=c+flo7Jw%|n~E3IUbkxrbC%Oj_z}ov zxu*Y>LoFdIVU();hgA7f+THV5VK&w>Ls(!IY03sk^wVJXeZu}P-x@d&JL`{uQY73NLbp_+*o%t>5}E)b6k-AfIV&7@)T;cbJD6J4p%o3jN%#$G z&fpCZ;z3vG<8P?H6&~}D@%IDK6?5}n+L&Fl-p|#?vhW2w|9~KjxsQENw)&WNR0BF? z3<380OG6zVR*DL4wH0#zS2y%s0vc~2OQ;F#?-PEl{@uU z3>C-Ml0p^XD5q0AQHX{34ZDP@Sz~W4pIXkifx)fxLYS66K#NFD8D>gbVe(W%uY*jSR&*1JtH(hED9-y3L#h@UQ-P%yH0LJ?5NeTN z=p*!o8@F^ttXdM8WX*V-0D)ZO!<8Y8v2&jU>iD2~+uKDie#S-Gv2%z(?x#Di? z`so!Vn04FZh>r1}ZvC*aA(6JP;{CxLifh`8Cf3pBpZpQS*}|}mgC;qlk@Mp%*5aV? zPyM{e{c{;2>(B>~EQH)XjMWF|Ral5enBpuBJmfdR-oVt{_2|x;>Cp+w z$|>~^pv0S?tmROM)x~yl)naxPv-P|Bcm(|n(C$>cG4=q;OHYOjr3P|aM#~gD0O2bb zs)@Dj|3;49zS=K<>F$9#DOYw1>{E|wK74t=8up}wt_sAh>>|Zt+pu?qmoA@BQp*D4 z3+$aGmi)Z2%2@}$hOmT)rI6oFl9iRNWZMZUXQ;^rc8Y|dvDgN}t+&x@#po(L+R_-H zgm#Vd`DeC*fFoz*5!ep4zVF!}t2J;1QjLwzlMnUi72F=qprN zo4Obl%T;fy=fFot47IjkV*f8AT3x)enGc=Qx)X3mb`cbe6@4gk=7WH zx)nh42L;!j^MpIyVmYI;#G=vsco{qL;zv3uOqto6o$JlWSw8|ruamWotQ=5W3DS6B z;IHIYOiQ}zmykdxeG|lBqLpb*gyeLRq`}fuj$d6xVay{~3_P5q;IVT(ejR1^6B8e- zStuY&cz^ZHCFsBSK@_|HzuMSKj@4>q;nB`ZBcOAIUa!dfjl_Q=U39gLg)U2?$S6_O zrc|o*%M`85*DQ}g<=|(IOz7n;nZZycOynWA3^lA}ru4%H>V!gH$BdqUm2=mrVY4o^CmZ~m^jupAws=jWy9o)Zr)w8lv_cDkyM3~P~W zd^`l*{9^_H*%0xDzo>xb;*lNDLS(57b*dl3N*=PTg_q>Q7_dMWf@Ac`;TxU0UwsbM z8s;L?Y3B!zL^*<~4|cmZayMQ(3tj8oMYksqEti0@YFPHRYPjz%NJ z{WxJ|`}OgO#_mZSH)tPLqnJyP<Oi5RBcw2w%^f5&DWCP{)waZmJJhBQFd0?*|@=H0l zT{LvcT7RK7Bkm;vMncwAht;E@|P_YS&w+YFXHxqdJy|wLTP97hm?{g zpQ%UW{PUA^qj^q@9*7W3Rq^^PQZVl?8N!7Adu^P3j!B_9C#y}ppnSY#SwQ?+&2lq~ z6}w-WKyBjQ(ygt=mWy5W^b#qGn-P-jC+v46t32^szUy%v0f!a50ZfY=@wZ=09hy2f z+IV*MME<}SjHekbkXG_c0O^uXmT*qC+m{+e^2sq^A~WN9+SLwFFknJQxiS!sa(&V5 z055ru-EPE$C7wadX*Sp5KB8Bnp`Yd8g2CZ>SK3d(7H4|aj{7fWOtBZ@QcJ&T6#cZQ zYG-b2%^LkW(p6S{!`*>hJ(Ev;9Vy`P2im=FS1<3%F&NQ)ku>75i+zbqN6>{0Gi>P% zz)8aMYeQysZ`-W7Vw7r;ZL9f|*SuYwz6J_C!8PP{2~RN)#WR1*r+R{M34PS{)&~RT zty52U_ggJ)?kX92mm_D_S^NDy(B!|l#I6c_>g`0E)|7f)2D=8!Zby?vz)A)aG_Qwj zq86JCKrMBC7%~h?L`wEm!0-|E?)EQ-0`AaI;9&g~HTY`oi&}s2uBav43>047?O#g= zvIUS$ldtb#=!?R>o{)KKzXZ6_cY69|M;fUO=PJbVA$T(301B8GT0j-%foy&6k&FCQ zn<`MalS#ULH^%8>l`qr69M(r zs)G-12{O)y2zh9HtBio3<*YH|S+e1jhI5>(Kv=b+)bJ%UYZ1m82slv_?$cvUJsm7o zVq0&nD5j4_{)?0Rii32HhVZ*NQIGM%22`}1OxC7NMBrcv)UfNi3mA%8J5In#^`V|$32py0cCXRqNe!6&z|1&*J`}aW1u(Hm}TERY-4!OmRW-lDVA}b z-~QtLUT|4kLphZE!<_EYF6eYId~k$6^d1JY6yFk-X%|rYvF3OD%sd-A=>bl8X?yDoGwwSl+_d7ri zhb4so9Fsdo_=1z=zQF7HD-cv33h`-`_dpBG zluvtTYSb6$^G=RbUzIjd>0iBzMf8x=?+0PC=cgsZ+B{zv=Evx?N&M|84x(@*tJHru%v4!b!M%!d`Q!FalfH~u=Z3_C7s zsX+5es#ZH6E88=~s#>p}w|unSXJ|BJ;(ZANh0j8lC^Jy#GybFB(|es)O~G%+WCh_x zI~_;2TtHS*k2Jcl%nQaBuH&~k|Kl%j#S z)4D*y*b^^-tiR!J*EL!}G*sD(v@_&oq*HGgq_V+|x-tiUN{E@CX#gKdlUK9feMHhN zXKh~uRx7wG5(P#*QTD)1nvqb$6s@_;@z#gxEMvz<+5{Zz?}})&DMqzA&9}I8I(xenXt^i-1eE?fK4R zz~qrBBa(E(8EBjQ#JTmv?%>*fBh!#!pvrjjLmKnC;}(<})1QCdx_L>O(4^nAqyY8do z_$n7EOke}`F)ns?O%QAC>+9LX2qm*8m#;9*>fldKxqCkX5&&wM%1Q&H4KitPB1zYJ zgR+3mGZ}?aGKfes^XP-3?2i)Qy{(6g@-nMgkz00c-)Fr6^U&?%rlI`igV`lZqcTyL z)uOB_jUc}@bNBNWsGq2W4D`YuF)2Pi@K24@Xi&(G4M@3*8OpC)*a&f!7pS-z0I zC=-9^8CR~br5coUC`kBFGeN$a>+3hW%8Dy-YOrZ}Co9a*-9PDv5Nmrf_7m1o!ZzSt zp@w&PHba9sax=d=yB~(CQmVO)59yk!g{1z5GD~Ci@y0V;Tf`Tz=Ho*$>X4qY`1Hbz1&4v9-D+nT4s?(YYZI)cIV%NcSk~tEo`rY2J z)#fenJ+{&gAGwTtfo~2!XBvCE;FnV-U<&VNq57|go|AlR>Pw!^FhdM(C}^>-uTR=t z)?i+iL7g4BswhFhyW4o8biBSv5B4Hr_-Pj3c{Pq5Z?tUUXv5Zt{1zyC&mXg75}|Ug z)v&BhEG2UEo#g1|o)L=*F8_t=HdVGgDwg!ZGwiJ>>tVl|V=cI4aC_L2^ZZp@nc=?^ z*yxTSN2ro>7gxFbGl8Ar(fDze%SC?~VPaVKyay!WXt_IH9^b6n2A5+|9*6-SBb^KG zvBA1A^TrEA*?_F=IaP_iVg=#JhGC!@k|=#i2PMAVmqQ^%iKABrEIl^&+Pm&C{Y~Ko zH_NHE^q%uBml3bakmoLB6IB7At+4`N;_|ui204oRz$DPR6F|-+tnaAh_Q7v(igPV; zf<}-d{0DWr6979fk7W2UxklW*;;QJ~1m0XYntY@uaVP@pLnQ^ZKtX`?VRE8l;y+?F zx-Ij7Adymi^z7-)7i*PsCBK15@7oZH0-&6t>_3IHK^Rz=GN=Y7;=2#A*|_ZDU)pj^ z_k+dPGvlLRQ~hH{EL`zeAvr-Yup|h|XH83mSAWVZ7gEz@Qo7?bUbQpdNx)%jJSKb$ zp_CsmB6tzMX7DY6zJ~L69>$d9V?d?Y{(BZ@Hh(djvVvT=<*AHLU8kkEVQ-5ZWBZS) zho?BY+N;Ql>n?O}lEZsppnK`@5eK=<1{7dL!p0wC(K7ac^g^_wVb5!_blW3VoN=UH z7HkZdV_ayN$}>Ge?Y)Hdj$PO;#RbD{dpTU3zA^`q0M+ze_9ppIYlVD?>`3Bgfye?M z^xUmcltf&w=C9)&0^h`;{dB$)vVZ=^X6~si%UIkuG$gQLJ;zGBf`JNmMO6G-p5-}) zy(8Mb#=c63=&lK#nH48MHGAdq_R;VkTEaxXop|-)+zaS-G9NFQCGL(G>P0pD4HES& zH!=sT9CCNkZOb1D^xGr@TpJUo;iApn)1@ka!CPqGvk`e`ce`?1*Vue17;Kb*djHo5 z$OtIY4?=p)U`jQ44_kUIKs}0k+vh)wDyG=qz)%yg*aflSNsc4;&4R^?sU2~z zgkDInJn>7b$6Lh{yM=d(dH#0BvH0IRebRiNo(-Dik0ZZcpwJ)J?f%fAP2to2JA ze$Qu7ZOy;~22r3bu4HACIVa4q&#dIyJXg#L)wer;@+aQ^tT{eJ&|>{)(Vm3OOmE3w zB(xe6oD@R9wti+r`L@3RI1zVGgJS+O>|i&3c%e~@h^{wqZTxK*6{I^?&kU<{=^ae2 zL~0BqSP~#bk*;phQt-bErGa#kS)FT}C#b5Pv+$+?zW|wpGFx8=z&Njw42oQza57pF z6Cu+l#-&^=fii6%KHLdn&I99T(ITSE!k+z4jW5)S^&=`-t$u5oWTZsBl zP`XluhFX1y$4{lPYHTNME0;Z)S*#xUgd~>^A-JeH^y@|NxN-}s>OFf1%xXP>9%hnd zKA2*MRelLaq=T0%vM(GLReqi(;+V?UF{bcChRt7r3|}ne2ARow7RGslEzOAjH&krW7HVdfAbI6mT_5m4ojpeUW!` zk|hV1B87HU#23btx=bOYMf=PlJjs)F@f%@eG2w$1CI6f%h#KxLfQ>wWef^~^kV>mw zARv8-K@{kbydTQp%&~8vGe+mH3%`n&Z@X2*@#KvWR~ZNjd)~IQX6jwr1Ne=!!-Kt* z)YEEY`r)bn519%bv}&U9%aEKrcVQuIFiFn504yWAFnWFhlHOiFSU7-9-p)FhqZHXc zakG=rF)#zxGiuN@R$Y;{($aYtp&8hU#STTiEf(&e8mbWi13A!0XVanB^cW*L&p%n8 z3GDPJ36&#l`?6MH+p`XBg8JQDjbi5v;1GgX_z%Ew`zQ{}__JM{X$(*Z7IySox*d3VP?*n(67~m22;mH{eH--g^K<7B5u4R0&4z zP%)%XL^hE`dBA3DYku07DG*p)Vt7liEbMK7;BK{L+ZBuVcdPNBanJM`H13XgQyRgJ zQK68dn|v;dgDTiA^SgJ$kljIm{Z(hnftv>;Dya`HtZ_$h(u_waPV+t#=;PEh`6KWl z2)a(6%Y{+Fs7dj8aict8yZ4v?@kyGE#M?7e z0;76?+1<+}vel=Hlu{P|X7!penaqX4r%zP1-ewxXrq0d=RQUE8J&an(^_6)NH>RI+ z86lf5`<9%?tAiPx@nDUDnW1oVvCdo8^B(cv+UFr3pDOJfTH@SIJXj)rE|}=Tmu8e! zBfZv(16y-8q3ETeFh!59oFZY}X?e4)wvSq7%Y{{mQ=q1CleQbHgm-Gp{_;j}P4u*@j5J?{}+{rLdQA&6#!oiHsokR+XrvJzEw> zrwpLlz7c_Tjo?6;7u@^&Cx8A8Uj^H|mfyjJeR>6qZE_ye=kDc^U&2ck9Rw<;;aTm> zPZt0m2lfxl>(RL!NlzP7{ZEe={Wh4tw`Yq~t%^n^`e*#tf~j!|e+#<1cP^~$8!-Pi z=95vxy>@h(s@r#7&a=<56KDOUshDrgu0GJedQe`9tb={Nup25lc1gKP-ouN*_}ra` zA?rTJ#<&b4$sfj1&Q}P1yEp%MBwI^YZrhM}VHF_51mvIE&M0-(ofZfyW8W&!K8D3} z0~89f4#$g-9A-{jW+vwvCK+Yd@>#zz>gVHUGF@RvmOI7NgU}{ttDyl*B$z9XDIf*N zK^=1|kIV{XcgW%7-(VrAdMv8skAAloIH(fe;P9nbeNJPE;{lB&ikJhRsU3kG!n1aw zZs)INJFRIg5j55X{v)&*dhtgNO-lsFy=eKw+zJ*dp6NGtywV;VTfy2h+oN$>zQ-a| z_(5>@RYgGvr+-im(<|w*4u}wmqMDRga21l&J> zFw|tu%5?|#F#8+A&Y1!{g3T*=x5?1%#uC%6^4PJU1Yzf&wR`dLhnt;yhj#>zh@#yR zP7pEP;A?P%WU?V?LL1_$m6JZ z%pAkJ(qdM6sl;D`DR;t~nEGtW;pLx+5y;N=5Dr#KZ+ zf~tY}V%f7mG*L(i);wkmP7=E2!0A(%W;e%)uLiUPy|r# zGc-u}3b1fY>guGA`^I3n8j0ua0y^7aJtlgQ9pUw(|sK^gw0XG zgSlK~@2o{=zuGS@LMDWIjv^}Y4C(K)rKuz|;x^Tdl)}9+#5@f?fCM|8_O)V_(8HdC z6Z_-2+raxjz(Fa-Y0#fb5+-aQ)VhvZPbiqLmydDms9XhXQ<34k^ zI=YAD+A2T`o0G=Z>)B`S^8Jbn3WWDHe!9!Yce_`M`7hV0+7%; zSE%=1Bi&^3(2?qX&h4xoS;d7u+8s;}nA@$tkru?C40P27`>9i4EulY7lLmN&gnxt5 z=yPi=HD?pm(*(RyK)CC4gyQ@W9oNPtZHm=4MOpb~#_kw7KZQB?hNUeF-3U;ZE(hqw zDKrrv*Z)89ha}bU12)Ew4#TQ>c#KG+h79l3P{b%X_1IVB% zH&p|-y2zf%E#wCiFqCpeeywZHB-r>=WE_8hECa}g5K8GVZ;F}OO-vGFhn87hd~DEd zZ*q&D$G*gU+{g;A^1}dj!F6F7ZV&(>5&P@6&+LV1`N-CJP_AOHF|~E|PrMq!AB@>C z**}2`YXx{^(<3Xu@BVe{w6hi@^c`(wFHtggd0=*8^^T$WX1am@x+AHT|3&||Y`|yR zH*i7vDV=tjGDlH-gJ9dG&0Q$1ZJ77X>#Qu>rCIE>RDju59u(gWlHW04CH1uXgMxIt2P%3t||sATIGY`!!}^3>nVBPP1!A z3r$K8I~UMpDPM}hLD@xC2UwS$NPCHA|I_+_+>7;FAMeuS-pUhg>hDyB&r#^UwA5{M zI=%nv!#_m@f5C<|?h|cQoh~&%*>~lK*4-I3u9)%9B&vn0ifY|0T8J^3_X|2p#YB`K z?OseNg#bZQ(Qcm18LQPjOUu{DWIB`F|P^|obzOC9xlGO*7!PQ+&sxMX1 z2uwHiAMF%IA9_>@N`NUth({%FO|)o}z)vVro;C-xRU!NIzXx1vJT)?% z!PyGMwHDe37JBt}pEABT5#cttOnGeDVVJd=Mu$$XTeU=LGDBIv(=}BhCM`$<@oI?t zO7FdG^w6VbC{}{5i{<>Yanh+C+UIoGN5V8Y&Zn&*Q|p(LiHO8? zz&Kf+c`L#M8HP#8M2#_#(AuN(z=0#k0)$REmPOK2UfaL?5j*dvFubQ@F}mprpb8 z?)})iOX;DpH-5N?QTfh#Tk8-NLiyUeh=`+xSEpvNj zPkPo*zj0Z&F|fYZPy4_Bkk11cd|4(9v^ApvAA;*#aLc9T;G~qa@HlZ#jM!gfk_~g0 z(!O&w$S;?P2(H+9p8dwsk34zDxGQd-f+c7aPmo1QYH6n3cYCGDUC~SR(T^H32m#9) z_pkBGi0WIyK{z`ipWhK@RAG{k;R_JVb`V#Eb84Ve%Dh6FubmhPlX1oQ$m(=!|V#T5!-|L(byy!WG-*m-66#+IsV zZ&N(ko{oordNr$m1;cJWleI>>W!%ia7C>c zoe9R?UUGW7Y1`*wl-C_rY>3JgkI2keTHxz26atUd$hQ6=C6<+3{UCLcv;tN^8^LbwVA(}RxFNhCiJo{}{8{2Ty$p~@!LGyHF0=SL31 zhSQqViDSUZUD&=Hmcy8f6{_OArYVP*&On==_)9`IhCP+Q*TM91Z?QwXml%G{M2VK% zjH+(s#q|;jD>LtYy!+$VlUw1D)iJgo1W@1&y;*DZO%L;daME0oa6a zBl>#^+)tPar56EA*PvB>)6_o`siJL(l_ zbc`t0XRo=)DloJ^{Mfm8LYBk^{CT+RS;qwK){x1l)aYrXISZWC4sS$(4x3*bp-<1O z>PV-6UEO_(JJ)7(A~M+3g8oi52O|wx`W1CEYmtW|POG0=`oYl~WS@Jh9_6Dw)RXGB zg@X6`QVY-QJwA8=`JlZ1k+G(=$@6LPU{!U{&LR3S3xqUsl2~$$gBqD--t@>Y?sv#7 zx=V{_2shq$|5&aMam3D-d!m3unJrxGA;u_sUUG$%r%id|!`f?V{FG?LSd|mkDhx*8_aT{D=3Iq6SYX%MRTWaFe4_Yx_4MI6nB zt`%nGDTNjB?LZ~bQtKE_ij%{_c z9q|qgNsK3*+w(6_Qr0W%juGLO9=X+m_gvJp`l&6#U6fscYx9#Z)>OP{T(+T(FEZ*t zNWfkdy&%DvJv2q%BboLO)BA`KBirD&T$ zj$?XaV-)S3FV{U-LM9y%!nChshLoG=gBEnr6^2n4ZvXNV}*k=`{x zRlit3*}qE#{*V!rluer2qPCVLM4&_$p+|a4>MJ{axN-f2M%RJ<+l09(^^ zz9p`bwm8?djyhRHQnQ^6)o}xfAhpc(*XdQuq=U>P{ss)++hS4VX-&XaJJY-(9Oa<$ z;hfqVr;Yn>gHsv8v)!NMfV2kNyeJD8vPF*ayCGB5i z2VwUc2fWuNt6 zzS&h1%-*jBJ9{Ik-d|j(ULlrdDr@~;zh|+D$wzI;fyrWYsRO+490b?E`&kCoyVVVD zx*v-Y4O|b;Vj`YO`K&UY_d{LetTbT&u-W4+l z1#o|mL7Lu@6)XnARi28C7`r(_!hm ze^7wHCffmyUw9k?Q5(_tGyq09=hfzCypFphxskNB=<6C)rEhq4fWumC7{QG_A+@@< zqmcUFt+g%_iOeS~6Gxq~^KDI=^ts@>EPM5nJ!t_&3l1`yv%RUg)=u9*SxSo1d=vNr z6XTQ7|l)ObX*GYb7{2Ni z??Hay?wHxoCMXIewA&g>-j{p!wuoJ^d!fDV))pN5MGVkngW8ui_hpWW6Xs2;hosB} z8-G~ZeaJVlWw}iB8?BQ*m`u%Z_Jut9w!Rcjl+bJG7<%f&fC~+Meb_+hwmFkWK6A+n z^ald7Ey5}LgBdnWBcxFQA3&iTxD)m`a=rnx`%dM*Pm3h9M1{pI%Vvp3XMY_AGt-BF z;1UT?&IlyGBIVqFZwjrdvMhxicTOGvLZdT`Kms7(#qbujlQ;D$A6SkyF`G1K#Es`nV8m6wg;z-?mnhV#WpUOMmgbVM!--- zbsVa1eLYPf3v1%yhthX2iO;)VAQ*p%Q~p+xs&n{wb*2Cs28O;RW*|}%9;(QUq)`tE zJL;THR7!v-NRgph1ZfUT?vH}rPX!}{=2#n1*Ff*W%R8TntX_3raALxs6R7eAIxiPw znI<>2SYG?3gke?e$2Em1bVok;f|+O8+8OwHQXuv|5o3sh$vjnsn+kUTjf2%JC8Tj> z6-h~K$x}tkUjTDX%GGL%Tr0yX0l~Zricz2*R?C9W)z)4TZG@6VUb*|lfM)m8t0>Mv z^9nrzj`bK8qu%C#EZc5*K4|zS_@yjrn<%)K2FN+Q39VSed1**n$TJNdIk+0I{sw%1 zFxBcvKo-e)(a*N7rIlT{Ux)vd)mwBII9l7`_@CHqzt)=6H5j@xP02~Lv}bfe8mm$N zf6?b=d?{vx6ZH{C-*BNzj3lN!jM}B}XFgAfKI9LdBejN}n#&N0Rqz3DWm!{!8AR$y zYWYjEdoMWi%k1Lvu< zUk!`DFf zqXVklPk-+X2Kc#Ld&opBS`JnQ6xm2Ypz#?C3Rfj(QFgDTCPv{Roh5r_!ydnF#PkZq z>MlieMx1NgGLMp&Td5G)gIoF*h*D{FZKev7R}JUw61?^pVQ>Omcy%YgJw3w%e(?^C zeuy+h5}sDs1i5gK?DXfk()n(1Xl@wr#p;G)YWwcPngFrQFb20=p=RpTl)@oG6k4kt zhLSphh-;^kx-yYzImUY#XxwI8?!;VO3)OUZTl`}R(p>(*Pdzj9=g^{uHS?OLex>gR ze{tc>8mou%fkw0+uCL~MA5bcW3I#t&qmMN#{(Mr4Peof}ivp>bDm+txE6FEM@|^)^ z&os~EWXCf2oDma!-awZWr-1f|yml!)W%0@-93B6( zPR?vO7-}P8zD<(IUbpDF(Vvob6!AcE0AX#H)Lp@&j`brjEnJhTu8SJL)`(hPF3Z*N zs&H*hC<4ajajZXYhO~_gxhVKIzM|DiO!y-VOV4~XzfGf6c%g2+d{;p2$Otkox*^+v zfayQDJro_b^Kp7S!Ko}3{?1$vChx;os8G}Y1~+3fejyCo1s4E`M9G{Vji7e+$E}>d z`kk?bH_;r0*b>W!ETnvurmVDQ?nG_;jfjyVgS#RuahoEHO2Fh8ZgX`z&!*w{gENL} z6yt?^18Gk{LW;j$-PPhl93u-QinKVDj!VPDs4+3?L^{v& z5Wy6!@I0T2I&LVw2*Jd-Uj&yEeF;N%KC4+9wQ<--G|DR=iWxzNvB(tkw1BOa{Jv}@ z1PUPc+(9!dieZSH`q?$9hH3 zAxaqz!P~T)w%8fziI?O(GDy^$WMcWIhWkhp>230qf@`orn4Rj84q}0*LSRODZtV;v zZ}v@G3eUg1TM5`VD)Y4dex@)}IK$J3++W@TV#3EsGfpr8`|2dFkB}f~p151tSk<(L z1uC%g#9wwe4{6av7U2u&)95-QT`3@+vHT5RfJ!=fC3}u6q|i zMyq!);^ztG8)$d?uo&=U<0^G`M1`!RewX{6J=Hd2W}B&jzbrk_#XAl+zNoW(w>bDj z0|KONk?|kL)=1q?6C&c_C4*6!9G+|1iEwi554q9OIZa#_vcA2-+J| zx{`ReE;g@JA`XqmFnAoffgePb_egkK>p&WYle`MoZ@8O^0g!toeg0u1T`xPdTkjp& zs3M(MtB93Jx4p1y?^fjY6lsCVXcezk}!0dk6i4IQ-Z=G*ZbF78HyV0W! zP)>*r5rP!wx#wQE>c~0)gi2VWlNRRs$BT^>SAb{^yopP32(0#4Z6IFhDFTa@2jN@u zQGP0Aw}oNP=z{{!a<5;-y|YMKY^}zjZu}CNFj38MMr4*o7lKNmdbynHO$KbLzUe$0 zPO%_f-t_(1OYM2w?qU_Tb2Y3U&1f$g4F+mx+&)5Y0|pPjc8n_Fcz?g#gLB}$L&g z^IOWMXgnZj&{_==ymyhC7|SUL@CIv4%oKmyS}9`YD!`oP0P2v8T1r(G6o!gjD1s85 zEbgmk^=zL=znVOfUnCHT*ma>`Ma1vtT>1yyf^@Rb#?gI>NiETCqdY}F97X7rT83si zMW;QnT?&M3gK&>-MJlA=jafAS`4Z(iwO%u1$n*5L8r&T-Mec)WHabx!-HauE%2rxm z?^1TJDfvo%ORA}XB3_r62R)6fO@X=Ri)j365jxV3Wh|7%*T&9-k1gkRcMm1jIm zE%-xEtT3)v?6fiyKx&*;O4-9l@H*y&!LfDOdMkR%sD;BY>RyvX@}D{OG3aJ|6<_C* z9?jE=zoPIjcyVW2{kC5!--I4xdaRi$Cd{vZKd3=Y{R@Ui{C$I6VjmfmO&DnLc@yRd z&1mSleW&CMbD`1`c{RZIXzal*s<1FyXTAjBPZ6cAaRt6kIwVn`bdV)C&bFs`1UJMh z3qDFNyzde28jXP|z25>U&u2W3oOdISy21o(1rYM~pvGrZw%e#VOdwfZ5~9K(Li`mg zJ&mMM4NA1q)C0I^+ne9E4JwS}Flr^5e_IVTTWQ={j00{;jQxUVscW2EjjsBg) zzNdItDcM;~XP%t*C^GIWQlcFX)W|eSAW&oL;^=S#bE`DYI5OFRVk~GcetXwyP#*AA zUVZ|5x9i_6;gD+D{x?r*q1FmiLf@U`Z*5)|7;+fycC-0LZ;SW<-KiTms&A<=PMRPG zb$sG*+^8u?Im$sLJw80g85{vtASr&{D{cL6o;Ym7T*iQ zt#JRX)s&l4m3a|FU_Nzdq#?9&U>?S|PecMmDZ-Z8NZPA^C4Z5v#(L6oX9~$qOZi(5 ztExg+!`_VLbQzAj^G|$|+u(v*$V~wP@!>RYM0f{G*Ev3Arpl6oj#SoRCIAexFbDYb zKQQi)Ky1gx;gkHMu;l04_U|t#!b#soGhw##+3v67HJ3Hl@(qL@z!>K>ZoWDQCnh7O zQ%B)z*QQLM+y2$PsPfXR-~kr&W3(AFD)WdL587i`dX+q8zdHF#e8}R~Dyj-i1#rd~ z+l@>He$3_xQ6prSyztU6JEHE5jKkNPp(IaA4)zJ}?Dy0k_laT%eyk=uPb2u=I1IEG z-*#1<(T@iv_)6iVuh0QV4^37KKQWnVfOm-$8#k*nZjYv;8g8`6>?qla4BWbvWax!j zuDH-`B2&r!;}Vhp>DIV1)SV=N39H<7b#zE%+l@Ag-C#VCB1kzPl|x&bw9X{Uw4CCb zwnzloeJ7!^?|3rr_Mp(X?co4+bYKzP?bwQEKE{j0>st`rxQ(sTHA?q+Bq#^>VuE5Jl7))s>E{Q*s7mW_WTO>Oz3E36yZ0sh zn8v+*YF&53flNJS|B3K3n7yr!fHUx_<-TmE@H0g=J#Tw&c66P8<9~flpd6OUQ?fLb z*Kb%&*(A3I7uB{ohOks4=$QtgXmhNJ`eS14{#80fs4BY58d!U zUiq$n+-?Pv+Z(Kx#b7FPRxkHk-oZ^s)2^nSq3kn95<=x*kT z&@0Tm3%w&Bex+5={tPm&kbf}g7BcYasOD?vp=2k=9BZUTJtLMYgUXQTLyZ^*17gqe zAsWB%X<;v-8A)XW!3_%w{qW@W(~b2KMNTw8hk=8BakV=AIt}qOo}$KsYl$M&Y@!(J z$WBH_>N_3?5Bb%;U~PJt+fwJWP|%P!_*vz&{}`|0ri!&Ld(->}7>uY_zf(VadGu%X zY;{Cq?N9`Lq8GLlrY2q_3MQd}5W-6GE0qEesF@|Hir1!Ar!Wbh%Pgu;P*pf>lE+`p zB46AmJy>$ya>*t|7?WvVqIzCAdY|NYc!ev z|DI_-QwHI+(B@mTCNq4WGp7ACAV?h2B2XvnE}y2o+T%|IUasn+99kf?e*c>)aF(0N zK*6X`KM{He`L<7mx?U(>!4jbzc(odG0PS~ZbQ^^^2bSW$uWab;-ctQZx~Ys2h!OK1>%ap|O!rBwt@bDdzQ z1VtR1FgIRl2f1Gd5+dItT=s~c__BGMTGwI&m#=LR-DjjhxOLf?q5W*^<__ysg(q3G`Q)e=AcX>EDL##qveLPZb3mV}B`Td&*MZ^(R!U1`U#u zMf$P@ep}6TQmTfEtkaTEp`5IrZNXBnJ?}$D!=kSOM^v{SQRxf^`h%WK+@zr-h1Rpk zBAAnL3bg@426tK`BYY9RrW94Z0u&ytXkL!NKq`;~q|qi+KrN`sK5DIxmC4n7!&?(N zx$w>6i@#;Y0_A_=S~oO3aBg(LRpXDFIO-+61`ic2s8f3m9)LY<@BWdgj(cS`t8N*~ z4OuKVHBH8mexiby3h6E&wz`KAA{&9TS8-yxmjq~N>Ojrm3oi}p2Kdqu^!4Uq@;z%I zX)_guXr@*4On^xNMllM=1Z^^d21CMJO!HwPA_SywBoF$yj*aee+=$~ggH3`l)Ou;$ zjy2JP7gHYfm$Z#)3h8xW@`RIAaB=XDz9A+AuMN@x@L1vjW0$u=4#oH2l?{tp(%E1h z+*x2(kOd*iY@$^6lrU1M)1d;u&?k6fYX!Y)Zj#hPlUvwr-aeZEM~cVG@L zNwLs5+O78jqfQV~g49E@*JiJWJr366M{bd=2mlh@Od0Rwy-p>!&DUWoN5f0@SqP$J zzTZ(l{y*LtI{(R(duaxf0@H4}i^?K+&y6f03{|z&N(nB*8i5dVyt;M8%_HL@>Dxm2 zDa=`RUK@3mK_!<0-WJkoAEyG#DYQ#xu9QNrD0oGcH5wf|Dab$Q0YSGmaql^a4eX4~ znNQV|^%f55?fd|Udv_>*He>lNGDM623y`!leMKA&mL6?(*?bDHb|3~5)qym7=B=jD zXh#-4eh^j*3Cww2>niKt6o!;txo(`y^+Su+cEKgBH5O*yAzN-6-3gxQXlnHHrWgZ& z^m^`vLmE!s3Kj_pDpg0(EIG_pC;GMsH3Bsv@$gYxykueJ`WqIw=DIRqw#V56sJEI^8oR2|R-%v3gk&PE1R4+ReDK9q_xykstaYlb zh9X-Wf~bfcz)Ob{qDW~Ykh1MPJW%$ zU6WF&E@{p3W=nu@hr;tXo5 zyE=X5jVI-?f|P@+iH{JacMd$E>Xyvb#ITFfaSs@$%09!?IDw_#w62c4xTDs)AwKWJ zmOzpWD<5$Obf5Hz`#_9dm3nAFT9kE$T8v*M+2NFfS9U&T-KW4>O!!!zLLCoz-KU1N z#yi%1maR)7f5{&liyv{1$jn2DX+^<22dsERuru#mEug)|YSMD~lLqGk6|`Z+0nf7) zRa(Omx6QI`CRP>=Jun_in?y(=`*1Gu-kXMJr~47CmFzyY4JQoTMo=GGYcb=YXI%|Y zsD|y;r$=|tGF*!OC~p;JBzZaG=sL;vHU0jco9Ib{5{)-fwa!5j+tY(ss=R#ok6wRGrm?q%o^ta~j!-sv%Z44@^~JGyN?`*2yVnL}0m1-f>quwv9bi?Z_vSSQDOh{0lp&HT+?Yt9>F3&S_g%sL2pc z#-?59jbX(W|JQ%`NX|{0WvDBnih4-Jz@^!hu-$97>xwz z+)q{ZxuE|e9O$&Vl>a)uCsvB_0Fo}3*{qTvItGBs$T6fhrBZl$S=Lv3H2z#~je zfS1ekL&zV&{4^gio^QZ&_a^3o#@??9Cyb1dxSYHM8$<)Rn5(VV!LpOja^}ijYZj;~ zv7YQENZA37XdTmy)jE=zJftgYJsaTyLVRg0m1cM42kEb#qSqyt zTIRw9D<<<)mv786^0zr=MW!3QV#Q* zmm!~r^CuNMYRNidZq8SF3)~NE98x*@R^m@R7Zc&ehAke1;sQN3h3PlO;HAQ^xk(J% zS3oYDRG@5dYH(})kK=vixGu13bQdL*e9||+YO(P@_@=}xboW1a7!0#AHWQN;g*Ndy z(c1sVB&>C$ph+?4cAyy@1 z*&(tIkh53&wc1J{rx6B_E8PWYl3QgTF()Qim8UxrH~n~C5lRiAl`hO>(S<4}v7_`E zm>vA-a08W*NQ)dhfL(18({`h@1$K{aACV~5eu(mwjy96NB0r;t$)!Z8zz-;i$CfTL zIQINKDxR>EO5Fg@%z{f*$!X)m$5vg`cCgIGFF=4OVxjR;P&hx&4}$WLMSO)h0%2FnfgCW(NZU ze8rrdvwSJaM0T&&;;tCNF6>Fq=z+UEh*JNunyu$F8E$Rnu-e+&dObkoYMES%`jjrX z2O!on0x`|QUgXg5ZFe69z{u&S3S_!#;EQ&C%|>!B!p#v@n>o*Fo17wkac+4Lm%;~b z-}02zol)||e%I{7YBEjcs)~NKms2x4qz1lIPcuypa>?NT#eLXW$k2-ET+R|Xt5*;! zAyt5u;iS~Tq}qEB{kw$n6%8F?Se-Z5eljj`4Rl2Mi}7_foZuuggPX+%FN@w!m4sJB zcXC*om|DEWt}H~F^~i|so!l#*PV4ZF<6f$p(`IT&c@n##99t+EVh*NSByuDe#d#8c zn>H7M%l_gkXgE_hBQX<~vJ`q;G3o6|8=77iy`4p7_0k?Awl2~buoV+qmqEq(SM;U* zZnS}R2)xyGZRpDs-L#2VcZTO%?e%CxU8rm#zh zU}g(@UN-!{rW=QQW7rZ#8fG#{J?E(2^~Fgd4G?n~`AP`fBQ5+qj@VMKrb5hO(ymFK z^7_sN`g$`j+lv0BLfW9k&SpSo8||RHc}p-~=9}W}!GC@GMe#-9+;Lx<9pgp4CU=}e zBKU%N!<$OqkRO_IEu=6syo^?*-Iv4OxG;SE+2k^zb#=oEE40TA-emv+nUj+llhbKAhyYtq z_yKOd3%Weie8y8RMMqC}nr)X$y@z02lk`yDw6)fq&^7}Bl)-<3%%h-5iJ&dwdfsbh7HvE(UtIAh*X<&I~$K$=AL8DT&9RX3cdFeY}FN;CVWMP^({SV126&N1R=tDQ0 z#KYv~qz_T#p0R`|q_x@E<~AHj+?Z$7Xjkcu&{X(HN{6_!B z1(11!Z_MEk$U9P2l;ifDx%x0eF*DHWA|9A>Qb z9+YKj7Axa|VFi`~I4$?&M6ED_KkUb8s=D}-M~CURy$8}YXeABtKxJZ^KS)2_0=D$l z$bqM3y@Um9^ftI0=d&yHuzzm_k}-cn&o`A%fCT2wLtmH{NwLr)%oU{gN#(Jb&8f1v z1z^u{iwv5Pusj}~F-w4jRiMvk%FifS$7BTNerxCwO`qj|ZA#6016CNNEU5qpId^$U zd7%PJU=QjcVov`|dYofJ(|w9)IxYK_jyUM!D)|wrbDnL-JRq7=i|7^W!$ekyn-wkK zEnyZrr7>~k%=-lvdjk1&&ahD6&B}8yCKQpS zG;DgUTq#oe+5ScO<}R7n*<^}Y8etlp)mX{bB@L^7P4#|=A?kSma7C=GA@20 zb|^FT$N-XTUi=3cu6H+2^~~(P?H>XBSS!XlvQF6&HSC=A?|x*9uh13ac7VvNHM+4{ z9bf)_fbM&74pPx_qlcR6kmh^A%nf$n5VKo?V=idKrCrq&;3$#j zIKIKrHshb#eoDF3YJ2`A5gq)BalE$90&f&yOqJo<{;!dgXd0?p5}^g#hLkad6qbS* zNb<^dI|JL9de1(BZ86+gUZ~m%6y`jBi9yW>xB#_Ui!qnIMWjo0sjkgFXfS`ivKc{9 zQ=Ty!vi)#kS@K_Gi5+`)0JrqR{tGm#Vzm>gOz{=sU&GDDpkS#RBk+bwE7)%V@8`vt zjFF0Z9XuVO=)7ho!!Huw9=(BOx-vBLu^F1ACp2|xi#S(vnhzAk_UELkl}{v{fThVr z)Td+tAw1Mm#LDq678?KmkE|3zVZwwGg-de&WOgze>;P(hBCKH^RtrnZ{yoZl3rl^@-Uw@KWyL}Nk-Td+BJ!Q##Aiau==fk=$ zR_#aDG#QMC7i&a1&-icVKs#tq#0cii!extd@Y3)N!r{h<%ZMaYC&)!$QV)?vE^ErsgVFUVcc2#ct;4e1eH-)+eqdxQ)Ry5BH-eu7?#5ZBJz z{QGas+)S*rNy!R|yaiUz!Xau@=Ol`g*tUvKyt=US{s^h>=>7e7rol?Jt)e*qalKFI zue~9t5u(n9f96tDP%qyi6zbj+4y|y>RKS1mxaeaaxtYbZlFX=5_Wj0!w7$d+(sA8e z#{5HiYi47MC3liJUYI#3JAboUv1U4F6;sE0W@yFylLsawjma#fzGkRH4@#Yp@cK`T zC%TVdI*#!(u2W^zO^n~VL0juD;lnSy;;v^V$vR;u$1;>v!xZiaXn{X$)EO>V@Zj2B z_k-fTufz=y1TbOwY={+iyf~zol`e<`w+Al;mG-vT_DXx6xK(;P%jcZhsJkfS;CrHV z&`&p_c|0LbqF%Nc^OnIiwNj);{zUK4eDo-hrkjt%TMI=Rwj9iX6}e}fqci?sS8Fk4 zh3$aZ>qh=q-RZU(oplLGBi@Hmi*ac6ayUC+YD;Y z{2cwic`>BpS*V{i3Z6zm^3%+O1Eu=vIhmYkGhlclXqB%NA&nW|rI^&=WeE?aFxaM3 zDhfy96Y%8@#O#NoN@b*uNKBla!{ygVls}yjmdGm>NHaa7Zeh*K2r=M!2IJ0^f-KCM z6X0XiEy<#=002QwO-3wk0000000000-vIy(0RT_{0034{I3N^m007i_0i6LV-~kQ+ zK2ai#M1rwK!hisvmNv2H+r1O02E~#${a(s=*W=&N|0U_c$Nn7rZz~=ZcAuKZN`8{| zYyWT8mzcloXHMTUK4)H^JqSOlbyIpB`LciT_KEVD)7JWLkl&;Ix$uwkFR*`8`Lq5L z=4$Qzt!gjxZ^NIx{~_)({4W0gb^fc+BlDl^U+;f6el+{5-0Kn^!QK=9z3Mgko^Af+ z{>#`4`S0~__kO>3{r+42->@I_kMQ67|Iq$QeNg|)|I^I(@1OC%_y4>22mXQm=l-Ah zAKxGI|2^OTKkfV_{nr2g?xFiz|CJI)byy0@5--@J>Xx$OGb$zws!Uj#%V^@eR+^Yngq8hB>p~d}1i|W|`ag9?CyV`I5!xet3(q~sx3V<4mygpDH zG_arTrR}ZPgUP;_w$^5MJ11=G(#Cre2@|lU)gbpDq&*Pqy_|Cb;Ozt8yk=R#JY!kJ z_PKGvXwQ3;yj34RJ?lWWF6??%-Xt!IrsiyMwLHL@2w)xprX5z2?Jzk*aXI!fvjC~E@@FrGuEnikkkz+nX1Q)g^H46oAJdzUK)cT zby95cm*@#QA~zlN2Gfiwdu~;03$%BAepzfWxE|@d{B5d3=*dtKRHBILQ^`OAspDH|C0hlIyE^E8?p(JauY7mFSEY&de|xbL=uErZ5Px)!Q&$T zgvLhm==b$E>>G*r_1aVTB^PTNHk(f1!yDJB9>XVoq+vPgOu<76{DqS6;)v7QkEC$^ zGl;20Ms)HcLKR&u9Wk2>aD9x+1Ayt>8INRs-8z)L7Y9nd5Oybn#qT`Iga8ehf$?|h z8}UMtUS)7Rdzh<@7Yz{j?}F#s^h=wop`wOih1kECNehc_@iQ# z+l5=R8!%phvY0gaMBrlqlmYfw-1@9{tFw@df3en<>&OW7-hZt^KFZ?r7rzZj`;&J{ zIlSk0n1+FcxJ~s~2Xt&bM|nZ7sf^IE##!C5kFk=xPj4zmbojb-)VZWFAZrsD8D@Yi z6X%;uy$*noJB4Bs8~GxCayfgvvTZzSu4&eQ1#s7>1FXPLJcL!w*+ z_G`E*c98@Nb)og{P2ICbGZYQ6kq)yZ`>Cda6ydy*uK?(Gg&JpTiN4h7D4q*ce)W%F z!`vPATx%54;UlQBkL+r~Heqa?&ASK~(-2uz5ZubDW4%j_KXU}UHKvWfiU8qa;j^&x zy7a^CLsBC7sfjX0H_$gW#7lmFl;V7Xhz5MDH4cBysKK)0+_pe|+qB;SOX<76iyhvF z&159!OCErPT!p~V3zbj*G8IYZXF&JO051>ybp!`8Fr6evFQyiPm zN+WT`i?57KaJf~(eJFGpbtM|addkb5DLOSMh|D=Rg6dKb=q%O!+)f|1K(v+MXzG*J(*E*$_R{$$7>nHc_C28`_|gEk zNsq}tJeWYZDvy8;W&>B{voiuAebVTTcRx0gK=4G~F2`1+9|wvz>}6rpwp;g3KlspK zkHE1QruQktP7M2`0Hn%!*6Pf0Ky}^oyFbZp`ay)PKN_K&rk+=d?sPD7 zK3vW?pheZZ6g@5Wo>da%a#wl=FsuaD6*bFG#fFG{jePGatz94XH6b%emZM1!C>=SR z!*76IgLYXaDlx16*For{f#=q#r67!5PV=Qve!q(?BZ>)77=XZ+X^n6 z^xzSG=Mq|+!>8qvg`5|pKN~$2k1Fs1ns);p(hqkJ$=;m3>x!eWcH+JTj9jS zSkw=lqXIQT?^UK8^&f3hlzaUu8b$PB*zSBtVVA{N8f*s|x}xrCV!AN(N0?QIVct3Q7l)Ojg`D!&v^V{Kd*8{J z+3SDUrD(zsxS)C+To#XfHorLX9KB5Qtmfa(FUR>j<_?JvjbrdM>C+|*92SaBI_TIT zLkww?C{0uj6qJj&t3x=rJZxNzHoC;#_8azM8G#wHHy)=*PpNSmS=1#MFwzJO_c)L8DbL|Q}ziQVYKRoS1y1d+aHb2H=)H0f!UWX%0m zLvPMv`27avA%eEGohsA4d=QcLY&hlwg#h4|h+EeO3uRWu2eY!qH?)Nf3Mn;~4V8&? z%xv!I6F|a$iar`vDcn*VzDM2T;hY<%4!B?2%1n>ya5=}MMn2kWSCYWMsbLLC(cD?O zkhkAer>X(W7rk9_4kW@9zWF9De=VvH&+;n-JHaD$bezh@bXPg@@YPK@GJ0ST;6biZ z!1j!M`_Ww@{N>lGh=krhW;NSIeeq$ zc&241zilq7we+9BUa$P)lx?sl@dFrza*wJp>;CUGh0ZH`me{A=$I1$1TW(SpQv~)qsQC_j#e(($G?(vDs|I!0ykeAdq|@E7hcb1`Awprgt%yC{9hC|xktX= z%a#?F<(t{Z3SD1<8jXh?enz7Xwrl^+RTR&h?zfvHD1K?V)EXj z6Aaogj2fYlGnD*JR&7RExonrdXJ4F487C>B^s~5mz2WbX6DYz-&G+4t9wANdhT+(Y z-r|%Og8Kn^QzSLJMeN$n0B9w zOFD%MYIn?o0wN#2Ka?Sc^4$(;3kH=$E7G=yM$;I&`f1-v+AXHR=s7JL+MW+>jhNIz zHP!TMgE~yD4iKl^DfF&UDzIzw^WPNAu64AGlNh}-`vuoui6c!@^8~vmj2yd>3Vsf% zKNbxcl*7E`Q}y)3+aXWZ=o|NYAV@ojDDz1c>5bn}|QOWhi@p4{jR z4kZ^c(?l_hW77zbkkgj-ho75ZE2fmWg|y*j$)r>)?z}LcRd2%Xiq{@qSIWov*Pkr; z5Jg5b*Sm**AGIkUb4OXn*R2R?uCPaUNx3kvE}Zu=fY)X3GJbA4?oQ(xum)l ztvd1-(a0>;i>ppqTaIkxQ^>!dda(P)!{*V23yFh*6)AI0Q3tsS|K?3ZTc{e` zVM+yZ;TnNjPJbWsBuZUlfeA1s@y8qt=R&RqJR$n{u; ze|XxD1*vOW!XTBRQG{uhFNo)+n-~M=KRRM=G1R5y)w*aOoITFZAH|QC9Nrz*GMzse zD~$~fJbvtm5siOJHi8a3yGYi{A4;D>5iFze(ehQ=Dy(wI*Zu@)Gy>VTJfKr>xWc&X zs8|W`eMmgHP82R@=Q$0youuLbFU1>}swx*9qe~vR-R^4Z@h&LXZ8tnmdDkiqH|Ntk z&>Kv>PN`V4ZQW9>GTXa)!?Ktt|AK|F##cTiMNPx-!IAG@;jheV-0Gl5wYw6H-nBF= zMnP}-E{kYOSh>0tgW}8s(LtNvj#LfL`tFL~1j-kMsl)_!xZ5l-%X5^ofnxD@7PO<-j8l(?7N+shqv-t;TRUp$ntDhYw1HA25#r5YPel~Mj?p3h_@0~ z5>Nq~JP{dAr}e{{9{CBO0t))569Cf?_i2%mSJ*G~a6nyy)Mk@gyDa=UrKVO2m+lm| z#}lT*MU)nVs~i7iPt)#MEtGgB@;Tjs5cgD~n3x9c z^5G)2zQm55gK4VpeWW12nQAOMjSfgvjm=b;QrG%W({U7JLi}LhmA4uz@F2?nXnaee z;lKvZNOAFD1qw4$6P?N=u)3f?=02y6V3}AYCowhiOUV4i1#4cq7`o#!lE7OtU?*;# zo@U?Z<#4r(fv0kK+aDK#t?BWr=E(kr0Nov4VHg6|JcVM<~s)xuIkqXPVr%`no1 zJp2s15vPLQLczDEx*um|BJim6}v-9jbTZKYVD^9uc)c&_KfY~^e%GougHIj(Fz*FT0$&^aISfT+c+@Vqip*^WHqx+*( z?#?E7f|m(`+BW0~p3^7SI(@T+IwZweFoBeGeGF_AfcagU*R~$HbLD4)_ec|%Z`i)> z{*?z7rWr%CAVr)w+ zUexSQIREBJ|2Q$Z0xj3AHI40IoHzMR-R0H0oM;1EwfdEk_ zr~ag^?T#yX;a)qf5JPcH{=Dv|Te=2D&a7hIFmg5mnOfYHSKA(7ZJW)CrLnBFyKJiI zwjoyRerW+A2=%tI-F?|FilwIn?P&J$Y;bAA)BM{djdOs%IKYck#?2n>;&7aDa`}73 z8C8F7ffq1YQ2-HQv7kz6XK0v$uArr_j^8#UH^{RTz3V5dG7$af=aw*>k%p3w>VU>_ zFON~30~DeXl%(XMjITv-v)9Zp8~H*!S$o{x^<_0NLU!--drdRFd})OA@@P192z$!% zdw8|U!KM?m1P+0{kgbSyqpj#>+6q`V(&C2eJ-*`1_r&;m+*b|^tx)b%v zCPh6o4=L`vuO#UJL`IHWoH>^fXQQr?oQlM`LXH{oi1o{{WjUfr`2LI=BvgRrey_Nh z6T~i@<9~vpbR^c*iD|_VD8|f^VmuBN%v~jpa|{uGGltsEPs1X<#Dcx9#2PuU%ZFyf zd#@={zy$AqW8(%-DTuJL`gZde|7hux%D@L%n7m6_oFU}%o_&%`vEn(^prFMK!HPh_ zS-(6%Z<`vfOYB|zT4Cyf9~?epS-?)inr9*}@1Yd7t%eGKn&;(7X>#KbUz`1H+S zis-G!n-+?$>VAR^yp8_}D1|rx__Ea+ZyOqRbKLJJR%i96u5N#@b&gHsU~+kMRt#rCg@d7O z%0@{d-3IntzW3RMutYRG7<|qf*`}j6U*YnRK8@vo?BfgU|DO&EKR0PB`YSe?t`B6BD~#`=dy{<^2v5<;n}_`1A(ZJq^@6KW`a%bQhyB%! z25O!hZ3gdkux!uf4`_jy2+8ITm^CRzzPFWy#g$um8zU#LlugBY>5 z&|(x9X*$f2n%(11E_Ad`aXoL3#=U=i1B;;F61gaSov66Y{$@_KH1IC6+O4^@CE$v; zaHNM#3&e~Ag2xUO8lOfv&A(G~eK+GE*2bSSxkl*8H|sejf2>=i5PT`xVt7v{S`$=Pz`|_9FuA#{Q|i&(53+27N#uy zas6C*U&AC4ggogDBSy+m0L|JJ{Fg7J7Q_Lo^gRF(nSo>kV-UMd75%x>U3djg1}Yo0l#vkp8aJpxI#g(wG!*$7Hk zw9tS*$a>=(>t))Fut0}Y_}Jbzm!*Ry&>5Y;cM46KXg@5&gRfuJ9<}e6q9;p}4gRTX zE?$EF{!Eo$1;xZ|+1XM=aNuHp>Z#^V*R1;%1Uyx%AQ|GTzloWjyL&Jpl+O$KCqF`@ z!mHr!UDY)-^r+OV63ROe(?jH7`^SyIOI`hfn`HmJ#@+SWQXMSm+u@uRgNoZiy8-RF ze0=G*C-6(IPS=9KdWH!$%7}lDnnhAP@kH$>*7b(2tea#6R(&y4%En|`r_C(+Z|HmY zsxxOaDpKnrTzZtAJwL}a)K3}FP+Ard?Xd=0tx)(iFD{fsi=wR|(~@;s;mhuy5Xpjp z&NzOUYm3yX_4Beg%)VFk*m6R`8EA}FFIrDLS&uWO29S))-aLxpM9S<ibxxiLU}l%j+MCr zhrHb}2>bJ(ls-_gT-%{vE++n6_}}26Lj#DcAx=(gUJ)2+3045e=L)F&Djx~Y#sSZ$wTlTE~8)!Ys*@5tlUq9FHJ6Y9kUreGImW)(yTCT z;5fed+Ga)nV#4#iob@-GLQmi~nniOSrjx(a2KTEHl}4M_sUvslKz*LS-R|&IpNU9c zK#FP)?UO$`7L0K*c=7~K)EoAxzCis`s5U+o-mkbk5ZEf}1twWrGmWIBz9)EFHL9eW#iZ-+dJaOF z!$xfdB-8yj8k<}=@KWq#pPv2w3YBPig_jN(D1lROE?vhqM zVZ|YMVKOZPoXOvh4h(fye=~A(LsGSWCTX=w~nG;?#1C}(LGN?q(f#s7kBELGz|I6*~0 z#{5yo@1@V%5u7&PN>26sTr zgHhIX-D~rk(+YR@C3f5AmgyE|!H2r%6GwA0tSI5-PnS=)6>U;XkcXE(3l)&%-=qel zUgQbH-qXmS6B{Kurf|#B=8(vn$EL@(NixY>l5%i_?3)MrBjkM{51qpSxpuP&g#j4; zTP?*-d0c{Iv=WA4`vqK5GqO3mzs6ga47RKwLL4EFH{={D!23}r8{Ys3d859uae?_k zPLX8lM=u8YxGavqf0N#U7kUut_gh0I&zU9|#Rz)Xin3?Ff*T=z?2^c(y_1Kmu`59e z#){?0O@8rgDiUEenTfzA)BLU#?=4#J$VSx@y*eUMVMx_Kp}h~m6bub$p&07c7x4ld zq<|5~0x_6GTo74j21f@NcHn4yPDKSxD}&S_gLijcDiQyDp0T4)meJ4ci_3Lif{pnW zvtm=8C0;wN&{SZi2=<#7f;*WSg#YTp=td*3)GtX9MmJnr0m%?Jemi9BO~4{nqxP=-o21A@<&pgaW-fjrOa#RPo5{ z{dme07ic-QM|Y=c&yeBS32J(v-7~Hb`7WcLBaZnu8}bh}0im^JXYyF%Ae4&es7q=>}jXXbU`&fqmHt1-?Y?6SgZ}{F|GOP=G`F>*+p1bP2WT zH8$C!1railVHGd`4mdnQQ5Dcg)_!z^I>l@HYgJ7rUL{7Xu(2iU-SEWqwFHQ_dCM2h zlohK(sn1a(-Hni?{hkjP>h~L8xRAZ-y{wUW{UIx`sy6Xkp=fHB6TP1YEa73^c*)WO zpN%9GvQ(5Lm>WHOHruD30Lvag7RB}gI4eVi<;F_jno7yTh@d0q z68DpW%a`x3>pejQpX6{Hm;IPSD-j(=Ooi9xHnKZJ{DUk)wsy>ZPkzd(pz>wH;9^&hB0MTXA+Y1w~P6W03D(+`3m1@`GH_eUHRlbi9pmx1!m?-k; zMyrR6%7yVSBdl@*ra|>wv)peEh6rA@&LU(a`VhLdaIc>sVKYhN7ST_!j7p;NSb;fsw$d$zqdU6VK_sPl=jc&)Q&TPFa>uRu- z|EqwN>?&<*_7%@I0yz!bQM@aDx^fjcOCYT&9v=w~u55xy;?I|Q#>;8K88R9NO?CE= z2cCp+?v-IS<*`aEM|{TD%UhoL{)vts?+^;SYC*a$Kf zERQiY3?=onibI~EgIWe0t$Z-EPvBoWpPTq5C*m%X&fdX(aMO=F$xJ1Yz!>T5$wrk) zSbA$>5=p3;24;&8DHp272Ry^z80RabKE(M}o&L~@>4^OgQh0{BEUK=@)g1HwwbjK~ zL8_BOW#9t7tn;y+{`AbNPjH1o`)P;A96vg9(469WP46y{2d(EBPAp^Pw>e_1xk+~8 znAt^vj!nS1{hLI+_XaEjbQdu@7HC^5>iipZV2P6G?PL*v;LRide8$h_LG}60GXWNk zKuq?MKRY4w&zUChI*0A9>r4z&;f5S<3cHy z#OnBoSBqslTdC>~KyY3N@Y`QappT@3Mrtzl$(Eu>h`Bm*_whflvmvj9rwR>%P`IelV`;BgIpbD;;h9C#cR~bpr_Cs& zcgHZ5wICe-uee9Gcvq`6VIh%`^TuAMYdX!SEV^4sVPjhtA|bi!13kEaI~urh!VkzC z^c1NU6Rr1i>~4$>$CHO4R+*(RU#2oEJ(8EHAIrQUT{l*s$d#k6CLXjXW4Z2_%Z^SB zB?85DQ?#dwpG=DC7wL?PRS-mn%mPoQ)rsGcdV9>&F6<2Djt_0}xiwWpxc3G=eSr^5 z9?eS{J+#Wqe$H&_lfGt*XKIfFYH38%2gFiFvU*pHe0wthyMyl&Ize-9xDXK0VlB!* zzW-)5<9O-tko%tz^afRyRe+yt&~I#N@a#HlntA8_xEtzGx+7 z6tLnecWW}rQhV&!l{i^GUEL0pQUt`4*)^ghX?pUONt|I}Z|EWyTQ(Y0y8bou|U03i?@&cGdx*W7rwiKer#t0@_~aXDbYl zrRvxzEU+2R7k~I{2-pK9iZ7qGqOTYA_|rM}gK_T0pI8xP4@c*8V?~S5Ss`586wr}X z0K=AY_A6*w*ySA#hrgQ8LX>`4j%HwhR+CVzB066zlg~i?CVXrZcZj`#k#@0MG?=$Q zk$i)UX+oi)dLeZ?9$@w>;yjCwXqHZ;Q!3MCc0q+w)a!A)X$Sd9Em15sO@O6QBVH~g zxDGl{)xuY9>zHh1^BZ;#g^6D``v#-QFo3P-MEj9?VPWx#zv8KK1 zxwS|wk07nRB^6JeX)GT-g2+#wQ547CU812cz+aC3=%Qwsu>w$C$E+V&d?C^};iOcE z6)twbzVB5|+!}pS>5P>^4iDsNPKQ`{^MDm4f5R5ZmM#qX;3Y%RvOMzA}f*u`Ap8Oa5}ZJKYir zBm*Sf#Lh-P*2mv`S2Gl9EO3Kr)4(u1adey}BFz!u=vGCNMi>*D@Wb`C2}jx& z7li4Z3IlmG?A*dG~3Xty9IHZYu2T>Vn-B{1}W93)cB^TAsnvYN9jw4~JBSd+=h`;sM>y;UMQiOP~M;Qs;-|+K*+JFC> zj{p6OkiuJQ_5hzUSBHb^Dh{1$Y~gvsFSUR7fAq3{&U{yM$0}ks$YpaiE1xp5JbK7@ zCT(VWx!D?QC|ZY&pvL&sLg;kp7DEvUdW&>qLCCduCb)czK-(-MNx2e;hTW+Y!Z8YD z`8VveG3C9Cp$=^^{s?WC4OjS8XKiuw?i&A$r_|Z2p?F)XqXfTBy3Q)|{=i&%XD7vs z1m5`yNq@l$XH>Cgnp1k7kGkrT_=?Pk^Y8PagzxAlj5#=Ui!Q*jygH<`xbBZk8erXc zzfK?}4SvP8#*46@KF7xo{*Wp%`piPg9RXJ~EZ?O5&ACP{pevdyVufw6x>%_SbQuSJ zD+xHu%pu|8lHQ~Hgy&VZTTea977H#gJR(<(aSBgTv&qM?h8Dj59OLXzyAQDKIl*ZOS)lmLGN(-4K*f*!0)f2jtCfDZB}bg@9R>L z-)CR3N~Ti0TJLnF@lf0*mI|byOxI1Xi>@Sxj>Sbagp|}qwsrrrldl{M{l{+q@pEqR zOADP1l^?W@I$L9Z7Vm_CDP=-d=IVTw=1Im>5^nl+oHh0Q+Y4r7FGqe^Ov5kYJ(NpwXjt#+GZFsvhhnT;PM#DItPO&w zTW=kvM~WA*n%wE+LGDdo@OU78%8Xs&XCQbDH}d=&wGp17|BtdSHkYPk#-@!IhG>XN z0L`uY@-?KRcl!?Q{X5!_k-+C%}1hlD;AS2^qZAa&Av>va8w zVBu5{$ti(X3O@ZO5Pd&sKh2xQbBC*2=dJH~qQCk@3M`Vn4-nV5@F|}x48=qaanWs! zkaU8o>giTt$xYDZiDQs-3E*{rQE_xNS{I};Xb4z^Q_aQQ-dhgLr9hqY?@_u|3u6QI zC$Xdkg@_1ye3i)^g#x^Tq}4ASI>n zx?pybT4Q^X#D46{1Ejo5lg9wR%=pf`As6cd;uRxvF;oZsR`4J*Se;V7zq}(Acu1z| zJ>=Rm10q>rk0LYfBJtcZmHUbHhr{Pu?C`}wy9*2;9x`Do9Y8-MW)nJ!H6H9H-<>v1 zpwv2ntu@2Zd=QdfMrm18Ght8C&6nKqo(s2FTnM8yeoxIVrgT(D`M0y7?elC&6Xvq^ z=m{K%hvPy3`ywq>V9=KACYzHWX$7!WxM$9Ic|5Uz9M^l(tQCisEx9Aw0F=sGc^Ep6 z-cP&3Rsl369XYTGKAKaYv+W(Vj7x0aygW~ zdZ18Pc0{Kt0N*x-LVt$nxgi0(-#aok{|f6!Y~}=|XP`3iAM@mA*5L2{p<|~1L#=vl zfWJY;x5f~(utUky{uj^#c@zxi1*{hfKRaVGd-Yyk{0)11{jm)uQ)pR=zRTq)u0qKS zkjj4B@y)<(4&iR>I@5Q(hk>TfV-hXf) z^6qCmKNhr%-*$RtfORe@$sdA<(YU68_(x0_ZFhA;y(tX&xvyLEq^$}F@Nnx!cdd7r zSc^*IhW+V6Rml_c%~k^~)2=2V28sm|C6xhMb?oB0Gajnb8NF_B4GE~uVs-0T%Y@RN zjSm+6zY6Rr`_6G(Xl^X_`y2gU)2XNb2z_||XBPmp70BPD3gN#*7#ipL+`dHX!Su=1 zas+_Pr%J>+o~YZK?0>Lf6?0=V;=4(0+E`Lhr!mQe#w=~R$Rv^xQ~C~WTk^%obS&s! z$dPa4`Uz2Y3Yi$W2+fyDu)t)H@T2n50wohg?_oEc%mx^Lig`>D(&JT7rxiqq+%ITL zpjTkX)Hy$6G)=#2%!d(6)#O*``cyVa($W(5@G%Ogs~8yvxjqhBctPFyU0piH+iP-i zFnn6BqD~CI`j2*w^P-w&=*pMyMrqkTu*R&ze+`tI+S1})hqX$e*{*oo_@By^HSe~i z_WJtwcV0Ws4Ng*E?x~ex$Ldap-GqDg)x2S0lo(SQm|$%mi<@soJ2g+3aids9^WPg* zZ2dIdr}@xQSY5u-4B=+8zPW(oQohz8jyXf;g!VBe$(RHCA_*d~f{LRvyPx`AOjvGZ z0yiplP5|-wG}jd@Rovez@^iY_&;a&tmPszMLo8(tdaw&HghHjygMxqPug*B#-J1Xq0X(I?rXa#{N}2 zdO2{2c}|dPIiw{56lZUq(EHuPCNga>8 zif&megKt%|=}d+}18#~$rY=M^;a>;w3i>9!yhDHJZ&f#P+zEb{g4@jEkK-sACvb&4 zh7|}~oS404 zuulH|7az5bipRh>@BnD&-^-msGpmPCxg#uPK8*arVsRTH{x>29d`tAme$ZEcAzvx>}T zdy^o4s^N1kZ)#0x#bwi~DsLWy!m2dR^~>L->Qnno7 z0GWcP5(gAsbc9;YanHT@6u52j)-l|jYUQxN5EjdRE04%Y3c;h?vy|en1D)+eJ;*b# zB`=jHEb?|`waj`Ta~yaq&UME2XsMZ)!Ml=UPN&W9Hm;<}@I|5U0Z4>4z!lKIhsCRW z>hYBy3*j-1C`9P=RfUN&jJ=HAF{Q;`)#l zaik()xDL#hwVXxtEV<+t3|cj4cZU954`$ew_2|QqnU;O7mHvL{mg=6zja-j2?tOUn zfo)Mx#tvD=b4tT+1&3#~=tn!jz>sHjAUju|np5YU>ka0(luFbboVxt53*aBl6X_n= zjvBbDA{LesezNpw@%!&))6M{5LYIToz1MPd6K=@(Px9JH?yt!iX9={_(2(E3|41U{ zggJ)20>g4%b(}Dy{;NvJ+W~v#(a|-iV3h%eOBy5FORZjceOdafQ29~Mc;lJ65jRFA zQIa{(9tvSuPIct+n*1>8kdPXFj?o4j07^tWLz6X{ats|--TRy9>3f3Q-I*Pr*|C~x zL8jwoWl;a0Ze)POHBwN&@A{FU1ju)xw=aDWHy?|_mlO}d4DZb}y&vrp*T3Z{1L(Tu ziFy}*zlGR!hNquoz;n1AZ78lkwy;$pWZ&6h*|+F*Wn!_DoZS;DHvn!bx@SO9v{E*$ z${Hw}22;#D#fL)qic*ECcy*eReMnngB+u_e%Q@J|>wOrLh9B zoI@VShwcZWbPJaJc;p^jp>NcWas|u413<`&11L@40BF4T$xBZs#sp|8bj5m}^eY-W z^38MW2B`l z+&>^~i7R2jlIJMJ5flnb{)Q}U?9KKZxW3s;Lngp25fmjbNJ%s4y&V_yL~ibTPHou9 z5+&V_9ALwCj?36u||TBf%)H4r8%<8dZzqd{)C3gHJ!>1pa z$-k4y^u_e>~_1B*ucOh42%ri|Dz3Ihj?u-th41Q-=wSlNQoJS8q(;EF8d@^JCk zMrx3K+x6nIet&CaYC1dScTt5oqUDpx#1lXsCoke{##=ClHSy{_Ha$A5MuAx)F zLFkby6vhbDVQYHryx_`wPl4Uiw*@r#3VKUuixN*CMF+H{^F^F^G#+)T)jk~AVP5m% zmzc~+=Jdxo7vk0PhGLek11I~gacCyTe}G#_E}gJIrn3`L$A;Xl)2Z}J9Li(PRk#{jEzRhJ zWA3_WyW znLK$xJx}JCew3deG95x^A@;L#AR+<#r>HeS{3#&tVtj=P0?x&P?Z{2Y_SP{sNgq0s zzCNKq3PZOFW$JZAvTi@HcM2o_!!rerDw%Inm+7u$H&5n{#t@{&89+fVlGDn=b$}GK zuUY5Yd(~y9-^7oBNm*FtUF)Z3X~VH0vXzEnXr%>+SvUyVr;{89$cX@00!Q!NW>n~I zKwIjH0v`F~!EF8ml|DOEU1SUn7y8;?czpaVi9n1^e`0h%IqozN@$Yu0J~b>8QU*B) z^a#$^vt62Gj6R#t91I67adqk~AGkSUx|oJCGe6X(tQYtCs_p?iuP1f$B`(fR>3w{{ zU~%XJ&iJ}Dq=uY)8EUgNn9La*P9){ZRYDpXY_52!DgsXrll0eMy;@p>x(^Q)Q-P&E zw>KmJ6gdc+J8a+ZQj01_!Z>|~RjQ&U%)I!nB%jI3o!XznR%U>>&h^_;GPKM4WGIi zE1aS`(X|<(HvKtq>b*A56{u;0zLGt<$Xz%?a9`8SxMnL)aR6;tu^-E(EEfp5-lc4! zOS?_!RPDG|GW*)dnu~`1R7!>)Z!(mA_xic>EvJ3gl+u?7gnhX8j?d;PF*go0o%m?@Ox*z!i2?Q2_18=EE6 zPLy^>)|cQ7s7W9OF7#Lc0UeU@b_!WZn^@qxP4jCs!ehKJ*X)jHlQqoRc^KXzjhFp? zw>rech8eeQ%1dbF=P2J8o*SJe!4v+Qsao^7pOuarON@Zv&%3R*e?*&8K*E!hq54@#CbT3u3)t zDA&X$qqM=-xn{f?w%_dZn!a4%Zw%J) zUGq)~IIqjgQ@`n4RFx^w*tADgrleDPetqvmdP@zhh(zl@KA2J+C2bsX>PSM zeW-Duc2GMkVDV8(tS)%dg=b2<|4LK#MG%i$qhr|;3CLYYv{h_MC?0$-v?}7DH~YU2 z*g!tySwbd06*cm%UPJUXTQ3QJ|LeRq-L@h)=ciSsTSc3QzZmaj2373Quc(40$E5~b zUE!HrSZaM+%Eg@I@4kOloH49}eVH#Dd4zMY_nA4=bV?4xNCq5R)>%H4foa;U*8BKw z^y;O1xOmtJe=CvHbEFr>AK8&qu4M6x`v$$*=()NU_xz>c6q~K?Laj%wtPisdW_6sv?PGAQV$4mmLPohW zw`~P#vgw2<*elLO{b7EETIip=GfWc>6h^1ePFY+pC(L2L!pPxv8d_Dua6rZjKMBDv zqK6W#H|%oX>)p;2jubh})O=T>J9fOFO+0(;6=0_dlz2%a8`QEsB)=nL^>+fN(pgFzVa2fb zin^`8EWi`gTU{-l!i*g5@+S9?1@ZHaqazD>n{pD~|CsuNah^e^52IS*K zfZIsG+RmXeyrXh(MZgJ#QPgXYucT~)eWxdrHK2?N9Q}Du5il*ksSoZ=$~dJcF<<>h z58SbfI#&tYt%$o*cIeoNol|9te>V&+QJ8fgAwuqWU@@}0!t6jcM zUavrj5K64i{Jk}t3Ys#TjE?PO;v3B54qsL&Eq9Hzs>92GqMqrN_{i*LQN2K^0FG6Y z)y1(kK_|xk*~W2p#w^eufqFNH{yP(o+pqEzJ;(oCU-k;}D&$&WIoh3~osM%I%eVtx z@zp{~uO3_rd->OYw9EOHE}X-Cf~$Lni-?e8pE#65hf`F4DN(Atd@HLv`8x;U_4$3D zS!oQXUh6L#Q0H-CxT=*6_ES6NW(1p{ujcgfNqK0XtCoWZH5uy2YopsZ??xyPCJ6TKOa{LFjdvnyM+W# zNSzQVO-;4`?-kYBX_7-~^0x?Bi!X5e6JahK_{sLd4(~L0nMfYLQzE)&&R#%nf8@AX zyx0P!Eg(HK2tLb;x=eNqqwojpL`JFoyU3W|pyG&2)_GXN9gW;3n}Aeo zzrJROI`nRwJw?F-Cf`)__WuAv3U^DcqO~35SXZG4VbKh&2uyvoKf1OmT1Zsg6CUU_ zc?oG=;>-?YiGuvL-SaMh@!~;x4umuhP+;?c&Bhjt2e1V`Z2+qK*YvM%y#LolEWGR^pn3K&(y1^gQyo?1G`b?5t z2sN%d0Wh6wy50oq~J1FGXg|ZEoT`28e z;tiROuB3W@68jP0=z8X#!=Jw~;w{CR>tKmNh!_imB)%DT#PS%$&Ap$kF~LWg0|V(C4ALHoFWSM^lnrbz<+}EES+Z9 z1`BGdIOR;SOb(L+1h?3JdfDn;f(Qk- z_!D9RVKY!#?zg2AwPuQYnXPr2b`w!xL&uM*UI*-Bkw_)YHndBjlwVW74qL<+T@lM< z2FcPR^njholn^!xJYiy^lz_Wbte%@ZhN(e49tRvq9oaVEq zXQiS#9j!JdY|jhI&8P$k#=;3e;6fN5Ya(R2z`Q?Yv>2^7?{JUslZ z3V4c!alw-%1m2$U4r^WqD-BA0FBb%{70nAX+m6#(WpwA;KPTGIvYcmb{-(d&8+ z{>nG~2%5=QUA9;+{_zz0jf+ z+I$hIaaHJC*`WuxXbw1&`GxK3f2Ij&6u&Tc6?$h5kbo={@z|yR49QA(-A1hx7s=cM z{wPvo%8p*fa&p_&D);Z)T@FsQyKsdoXIv2{Hw+2J_)UR!#&0&)k=sI*oQd+zF!vvY ze@38h;b{}-vR!qV$9rM!S}7$-$^&D%8I?`1y~$h9tt#Jtg7W9rC26=#O?!gz!Ck6p zwcboWV9rzp2T|gpWOWj6d}V(Snh72u(I1@k7Ga%e;jmPB2?;#b)w3XVww?_1)G=0M zpisttadoCsXuIig9)tEP6H#;CY5`hwg@*;@d)Pmor)!cvzeQF<4{P(yOXVA%3$Zfz`1bL$`@Im}{KRA>;Q!8X^{gzufXg4gfawE?FzoK|cbKI@mwzfZbr0p6* zRv7keVJdDqm7kW=c>@`6s_%_Al8CXW*d;ffCLqhj>`RB7nG+t!Y*3s2ZAwO4k3=KS zXZo@PS$->O-`j9o45e$Jjx4{nIC4w@@O!s6IbYt#=bOfuOtzYuMg4X#yf6B%Yt`MV z=K>TOp@K*Az!(3o#&%%I<;DtcW)*iuHc0I}h&Yn(3K$R=~ru`Wfc(naed+W~P zT>zKL)t=a_9~<`x`%^`ZJS}8B+y8wk4}o>VZvMBQR(1r#slh<2+qOz zH-#0$SPKq8ShaT}s6Cf;=rDbr=Hafp^iqeNRccTimJnRuBKnidzK`n?o>DJ((EyUD z3}(pBO@>YSlP(yPSSv|vjreW<{uhtD(2Ad4Uvykbvh4WX@4G;B>IfQuj|;__fAg@D zZLoWoI}@^YR*6oNGIY@$Utd14BqZqF1xVdqDLE{41)2#mLp8nCc6sTik4^ zqXCWIo2m5L0^Wqwlr`)$H`UsxZoKD|D&U0H_3LuNrCdvgQn(F}UijW+DqU=a}nR6d5MT2!hN zu!CZ;>@bv`nrVXF2+@St_$ISm%N#;vG_&fC*sR4T5XA(sNSX4mY#Ja`YZX|HZxua} zb@^O0Q%t*yp~t%-^Q2WLQ=!c+!mV!f7Zv6{6D;5=UK%X3hiuD2)qEk`DTf1P7{%T~ z9D~W#6TUbK;(Rh91iy{Vc{UtKfCgGSD2p{v_jJhfw%$iNulM+rqQ`||87(#nQ6*AP zGg02Fr2>Co(bGli@1moCZf8#xhH1u1r1PV^Cpud!`I=eOQHinmdPnyas5{UtMDQpA zr6bVn@|^FkTOrtlfsCskx|&nn#8GFY|AYHih80eLsl*F~LYCkkg^wC0_KLE|m>X+* z3Mr1U3G3*AP|1VZHBk!ICB+F#DMzB3A%)y~Z0xAMqyM59acG!v-?sC>`fhJh*u)}U!)WkOi~5|7+FZ5nRFd*92^Bw=6vbZ z!raa1{p@ja>Z*$O+NQ$R_$jkcN`7`BRas5$m(`7HCPy9)ESpO*EtzerZUgJPBB7g7QYyLq-90j&e;U(M!7$R+U{B6p0 zi5W_iZBKDL+|Qj{4Q2FMfD?UR zgp@vGkRPdT@LPO2HaN)AYF|^8)LH623rEN-R1;tiEeQhF!6uiCx_MrHYcOa_j>o6< z{a{ht&E377qFf7!pC?^tE@KH|YL_Zp77E_&M*R((~mRw>j8xDf+Z!+v54^fH8 zSzvo%NEBV+EpYQOFS~ySe{LBO+x1)6ktbkHd9mxthk#C4c%iPb5B3o-e7!g#y*N za;Jq|6Y67R-e#-<8Nz3^E$h}++*~VP06y28MZqAEMmT~w3zLLJVucC-mJJDT-0@?& zVz-SJkp3oZ!O%^I?WnL=qUcsza~o@v^@*8sGsxnC5k2}(HOT1j z!%|4nW(u;k7i+hvXtB3v|PUOnM#l z%WbQjo*8?oBmf|us9J-FA<3OaAx&er`q`(s0v&eBUKcl}>Q1lfV(@Rj7k0^A-dMrJ zT`eI{Oe^A|rdA?*uk0M20l#9;6Ju6BdPRU8dEx(if!hdnHUd&>@$E6(s3wXxSklI^ zkWIw4*$HCo7c-4Es)~xF#}EcDlHq9gB9E=9caZi!ZLdYY3tuVWrORa?Anm2(5i}=H z%*r>sOaWPN)q_hNdZacH(r%$UH}_D1rg?LM-Wses!A5L=S_EBu5xI3TKoIaphYpF} zV^AOLRo6^r=nW1RNV@L+YTor^HsP$XXN>cK1WsvPp<>f!^@eE|I+@VyB|in62T?$gkh_Q*5w z@qe0)JI@U>5uq%k2+&s4f0}FKottVFYC{j4)^3#7DZ%3u>}i*n)>I4t zXJpcCK0IlvCwxJI%VxQTKRwZrIRz`0834Cd8Nrtt2PBZw3DUcxJ5M^oK@mSS6sH#r zZT`-E7;gC~g^6!Q+BkCXg#YRD&8~Y8zwxHPZD3c0#io++KBP+w>6$XudVk?U=0=c~ z^;AX;k}iW`>%iHeidNLp*tnQDvI$ypC-Q6)u)0~ly@zkB;_Q=Au-8{tb%XGOO$JgKYy>a>9kr5CcyUgHm%zTQ=qEqkLlQ*bVz{)L=*@se}dx$A6Oz< z)EUI6X>j>K_gm`$EPsFT2CAQr0?wOvPt3x;owaz11yo9@oXUSBhcw3^2W|%Bhd{Bk zk+#pJY)}Kkw##;$2H^=soV^rn>OI5Fsy0C^-hAe{z3Bhum;BAdapH7?1xfqh87m&Q zdt={U6qIx%2ABru6#3{z>({n;4krOB?0; z!tEs_kx}D(4_T7;+i{+L%T}F;{zdZ1iL=V@2R( z3iQ;Y@-*8d^^;r)*ZqGI!UAsb#xCH$z_b+Ih)-bdaKS`~#%W>QZt2RX4Ey}lP-fN; zoIeG{FF{7{vYo~Ha3t9X|KsvcO`F!)T&va*Pm7KOitsGxiYR2pK)K6>qKT2v3-lXq z;~E|)GDq9gh%GxCB5*|mL{?v(BDEFv^)Pg1<58FC6YT&IFvL%bh%n|hn}~Sqp94+d z33(b+SEGlxm~y#Hk^WuC!7z`!*^Y_9PPw2wtnob%Tclzw+WcpS6WFY`)ZS`%)LXX( z;${;4O_2ez)7JghAfnklrvf@aGz==*)m`Y@AONpxtwzR)Pi?ap166P;A!jC?@hwq! zkPta4McZ7cj{GJdyF3?=bzHUmw#`vBM`&ZqA^S@qP$~|7ieJbzhAmjtEUg|xG%PGM=V>#t%G^+AAtL|QT*$84SlJ<^(!R^QyO!`1ojr^;M_bN66s)9L9{qAiW}%Y? z!QLwVgvw8x(hjT2I|O7mlGRiN!{MkP{Qq|ymEnx*u(qR+$QSa0uTAW&QvyQb4z{ee z(wt_x`?{7Mnj~ls3~{2?3kb(?CLB4sY;`$@+k5S2ftiMyq3=rI*XBXJhi4R2fOku_ zwkb_Z;1esyP%z=3onYT`ntZV0UhKam_mVQ|E2r^@>iO z6(@#OV%!iI_86QpErId4AlS4@?*M^xwyH9IRM7Z?eGeIMJ5-yLNlr72u8u*44S*o@ zT1>#@BBaYCx0uLzX_^Ci_!6RQn$PPL87gdM$w;X03w_z;AvR>jRHa zb#gNWl>e54t*)2i+O;HIMwJIY<|A<%LiBpj5l+^tDO$D$S0V1m-o$ZLi~ZO3SDz4W zKc6~Gd(fBesKwWQe-J}AHRzULAeR7*%gs~@1KbzA3}A1u`NCP0(U=)AID_7A@ia#dLv7)HA!e` z-J#ijVUo8XygJ;t208mnk{LRGajzw1i$8|3+gye6c2#U0bS>F`o5M&4CiE$5pdssi ztB^IitOayJ0opFzC&8`W`Nf2llNMn)pq803L3X;?GTCpb(UTWJ!a+r)CR3i=7@8iCB!4zz6l6)M?^f>4aHA45XOy1-xs@e!Qw zxWUp30}0B9^COeh@h9P&90}2&qgSsW;NY-&zm!bm+WN>W-7~l=F^TE6r)1);2d(%L zW{FlAV7q}L>s=%1!F4Q$rtoMrA1VnTZ=D9*zn)z)0Bp@2in1M4vH>^J?$iw=ojm*N zyqdCWR4R{*D!|M+`Qp^J&*acuz-vJVQR(}wDn}fP4lMw$QTfD?!m`z8w?Vd0htV1Y z=2{CB~>%6$iI z=w{EV|E|QQin*B|Z?YLa^^_CVkz37pU}p)duHRzFMX^#?EAV|Su5WoeLDE#OU6}#r zwBK)>VBNEQ=OA{>a9~V-mOL2Un5+E*l7*5Z zl?6vS9GDNCT}Q9h*R1ockCcV!_e7w#CiP-;`BPXEtB66Xf{-dJT1~-=z!wfzLjj>_ zmcACmj7*kJNSM?7f(nL4#pFtP?qWxr!pL|XxPp0{2f7B(!MXU$>xHX?XOX&;GJqJLqtzW4M9+Rn17IO%)!{7Kt0L&3RI zx^>Fm3twbA5UbAUdLpYJ~(^$W4UN%kzDXiP%f7K-m$T7&`A--RXx`-)FnwqWv> z+lZSg(HC!BQblGHK`t$!a;t_Oae&YIK~489gsG)dw+ogUEVZm${Sxzd zXoTKvS9BW;z+1%@1_UTwnEyUttx=qr0W)%NBZ)*5hPA9apgf&F1FX%yk zRa8keu&1IfAP@?tvbj-B6q{?9Cep#akVf)9j2x2f8+_J^ZhZK=j=E%+Dd&d2 zI5f|j8l^h28P;4`AU#v;>Kc+^{EVz$0*PP&-*T+wEu$7v54D3!LV^^+ z!K6>;v)YT0d*||h;P;s5E7bv|dn>GiQSTfcP)5PLo=oNFUxQIuncst5fFp%M7wuIu z5-(53IxGl~1UO``vbNEI&iBZMJLlp*tp>-W)7vw1PSnal>F4?EFq708Ybp&(qIOu; zR7XXU4GWGI&w8S#D? zmlVj5Z(>+LZmVTlAW=%r>7Jn*A)hY?{47_=QAKLur73pjayA-Q`w#$CS*?=7h2 zL*{Arx$yWJTv~Fgj}&U4Bl_PTc~k9SeKykWu}nj zwiR;spJcfA8Ub}5ct)VRP70JjCi6G1Ia&by3&{9Gf+JCGi(u#Ro_g?|nEy-3cbbUm z*C;_2^7SY#f@EP6@?;BX0QjOA)6Xd0YL+5RV6aI}RZ)7b6Kx@oG14_;+G9o(VkMtAqjy97nrs}Vj zB%D2zc=elAhKo$~s-NfViZkCIegB7QGPO_!VDF<$3-21?>XWRt#?=2 z4!CDql&iX@s`LEKOai`d1pB-x7;-J?erOmi$-WuE8T#SZ8BUiHOImX#p>zlk0n|vK z05d=#N@mdHv^lp_ZUyTe>DUgAZ{Z-3VQlGx#>l5eVFr97qft%R9-{2<*NfKCv>J7B zr%VjzNh~lywz^$@=dG}AEf(eeK^?`gjgde-tos~Vwyve`M2U*z#t#LvgZ&y@=BY|I zzl*5nEF9xuR(eaY!2?e=JVt>?`)+qC;#5xi>=Hr3(1|CQgCh|h`n9@Y5EbbmX;o`k zeeOM%D>7dj$HtKPop(NC(yfA1vs@WxN<50XazZ^LI5o69=b1Ly)r?#2u489KD#V5V zZF-De2&wQ{BzG0*33;IE*{c{vxH&|9&ig8--4 zkD>k>_*3@vIYP`+!!|7NhtfKeOjl(|vj?WtLnes|y4O27HqBQ%M`GE}B1Jpi5B6qR z&j)9PBzDO>Kyny-njz-}2bdB=Wul-oqUF{3B~ZQkU83R!be6U3qy^gjKT?fyZ5r>vSIHpg!FXhCjj(mTo5{F&X$NXWj?Ugz_Yd>X7% zY&X2$ZYwd_a;2{xCca&Q@)Is*o1N8aYZLSLPMrf2Uwvs<4jCxjq~Kq!>^7C5B{UPm zF%@28FnzM+yd&DlaK7Yjck<|LOrk94SB3wTvhKhaA$=6F;#4=+qaGU6FE|G)+7`G8 z7dTG1-ZwTKK-jBXd}MUX`#Vm|lz))`AjSqv)8BE?{-^s3<1y9IFRo$u7_1R!Xwx|7 zv>lb&Jj&O#oG&g7mpRw3l%PC5qUGVe(0UIGjw9&~C z(e=U%{O_*#>&VaH^RwX$oSTjj*i{+i%D3z-DgoIA-6g^P)gg5 zUex^W^P}HfC20hM&{q>L^mC2_e}RFZ%vHE-nie>un7-pAp~(ZW)Lm_CyjGW#2cGLj}k zE1o~7GtQtP29yMeLHvj3fwKl{Q3=gZUn3^^1}E&N(U;C9QKQpS9)TpaU7AeO`)5}pIkKYCmXFr2W~`QI?Kwqnr06Gxq8PFfI9kJb%gS6C*8HRx zgU!DY$3ejET-r&?>*_~hMy6y*_?_O7`pI8ajE-~0Q!&(EzNN}<(@(3dV1T_J8DWL$ zubux%Bvn?!fcw!0P;|nwp~WMR0skt|l<3#<=)r|nqVjNpJ^G$}t(B=Wm%M_`Wl9X$ zIy!)S6n_ucn;RiEIU>LbhSL9?zg~y**f#1B%aPMAJY7Bx(5!pnRfPZ>r!R zeWp(RD|a;iWQU$6ul1Ov#5$B4MW_gg8!)tqp7AwWy*PPxj_Jd@IwzaPDa5E53Ud&8 zB97UGgN&dKP-du!YI^|`8&Px{WgCIZ<0ck%Id=k_#{)kU;~K<-8RZ96fr`dWM7z#D z6l@f9`~-ivHQ$0>5NsvcB>`3(Ebt!VrucJcgP@|U3AJS^7iNxa+hQlD%9rzKdCZ0k5izn60KQ^ ze`Norrf9T?o_%5i;O#A#nueUL2Ma5@S7}Fb6W2GKdhu_Iw^X=ylz#$)jGML zUnCrSDAl~C+y^~kAQoTuT1t=Gp{}e$BPggc|I#+-r;n`qylrOG#&0?Nf{+8yo(u1G z1~l-ipGkfPBD|QUpnmPYve^VdfM+0M4h}T8V{PjlWHWJwuQ2eL-f6J2 zs{lNrkQphY4PGMKx6<8o_KzqHQhZAQNwC2o_J(OXQmUAOBqCctWc;BHj@E@v*6@b06w}|WDJ0N9n~-B zB_(QkK&>9M?3I7Eip}(^u`VfuSjPmV@;s*%6utY+MtB#tTb>c(hm~ix{O~(I&^E%vTh?U2VeBcJi7ogOA4(yf zRmj5mD2;(B8<7@pmg~U$|PCP%RVHjq1IKso!<;q+3m`v zr6RB2v`KplVZy(fzNuzW(m;oADq@03>1w`|)mOJulqcN7w;UlQ9O9V6^u*gk2qA$;#&=_(UxlFgO$rk^GHQSa>#-Z%8Q=!UqpXhJWsSFh=AGV z1p~u@h(A3$#hX&V#Gc@bhp;8G{X1TE+JM})CRSUS!KgVeU6)%aM+i9cODF zMsMwfv}BwvbqBxI%h_i0!xw}BRFCbQKk(*rVG9FRSH2xa8*OC6|J(#nO0~j*a8q?TtAf7*Dvy&lFyrri5%g^!>S*^x0{i_d zy+Q#T5|uuekJQp8SDZS4PgQxO>GZ2Y-FzXmM3NxovK|iDqG|UrLzcrvvm$RTmM-NFc93!){n~TVQv_n89mpHXH89 zK~!t_D2c>+9axTfPLvJVkm`0v9<%aW!(VC_>@SUt<++tJ>j%off&c(PPEAInVgLXD z000000N()s4FLd900011P&gorVgLXXR{@;?D&PSQ0X|V8jzt2QK*fLnpq4g^T@$0< z3&m=4lI$>QEU7tWObh@){Mqu;0`@cdK7IU$-iN<_@#lZS4%G7|^N-}b+JDsbz2+(U z>-!_u)6B=2@2B7Co~6Iq`lvk?JlDVZdqw{7dPHY0`5F2z^uO&qFY=7kOFXDg1_f~l>O=V{QVF7 zev|#J|GDl5{QLWd`=4OH^Z1MUzwMX6AN4=*pZ34Xe(L|k`knuS|EK$3L_fNJ!2jF+ zr{Ej;|Mw62KjeSU_bC0@|LgyQ;V<@M|C$YynMK(N$zf1&gYJ-m)z|-F|5$$oe2XC9 z;*uX2~vlv^f#BXkrIz3@1F-*5}bM-I%B^UR#P|P^Z}x z7ZF=N&d=Q}yCW7gE=P9;fzHmrhkfWC1K|29T5&3&)UkcFw-=Op?~{jVEq_G!{;v&j z>GgxiI90p8odr`KGa@_`LGfh*R+4g1wLTNMdIxaQx<^QMo2u=MZ&x7}M+UU8SCEoQ zv|VCQ_@lr>a#A&1WSA?5?rz>+!)+nf2EWG`kC?Um|Fb;ReRhCThQxNDSLBq(6 zdjy9cZJ|O8j7WL+q*DaI>?)(esKmtF0rm%0uSd~D&H*B~X=BI`eXf`ygs&UB$#h3} z;1A#8Mt#4)rpwCx3jbyk+N*7S^8mUaU*5HSe~p_E1WcNQoY=i-aoAl*um7;+>* z5_wNN#8ouZl=xr=DwvftE!^7ObyeprprpiD-*g$bK6D^du+72W1p5w6K6gsDQ97o%L%3=y%^+2hNU;=0*NLzb0 z5Vtfy4M~W&ScZdcDEC#g@_I{Iz;U_+GOtS~M+Qoab`6qirb$e;pJ|H@D|UcW?KZ#V zjjRjki4;b-MuYQ;F@sWYDJg1qhyNRPMDF@Fs(V?s$4`vnCU~3v#kh~uz`>o{n_(Cf zky1W@aZ|Rl+i?OC$``Xfh7l!B10+vwxWgPeu}Ivy&tWWBiHJxc^s^OGR?Aa1X&&w z3NpE8m$;9?`<`)fGqBa<9SnW$HfXfB+x_n(>fWHJvjn5Gw7^^UELS=7eRbQ*Y~$yC z;)0JoB3@1V-_az;CEEVOi(dKtD*INEzRg7f7=_8p!8kT)^j>{*%VM)%$5nQ?k8o+k za+{03-?WP~%vobyLi`e2J$K+1Ul7vXjXtXnl|o2{Q#zMqVQPd|hCQY6Fl7w-2gJNPe+e^_>Sq`*ie`#;xFNIN=W=bk7(aocC1oX z!_dtF?sahEy1TcTICc%ix3idE-)T7MiTIm+Y|`ff29lCfsR>9^7-d+M!` zuB7Ik6qgiJN%?esYry>;1W*JWK%5J{o8*!00|=KDA|`#Vb1KcgdEet8y&1~D+O6cI z5!!a&Doysi=|OSW6(BBcdBK(A+ur(ll(@ip z3UlV)ljv1Xc(Xnr+7Q_BYKbab47!G%6jZpqA4I%LB-b%eTx>A)E_nkC>yjgVAWTy* zo*;v6yuQ6Fh!EEnS*xg^N#4;#QL}|p56dxcGffUanwp1by0z7tglG2>1g&?7VXEchNNbgyJQY zQa|l~)rD%jUvwdEEYOlRoe*gw%LTj;UXdaFw;4dUe9p{A=@$9ApPyj4L!Eemw(~XY6nh_G)$}^b!n1BoM?0@c6thMU7Afeq0 z&)&49Wp><0+i#8&I1!Oh>m!O9m;z(jLLNL%q4K#Vc~L;j5Sb79XrwRn{r@j%k+pou zk8`nAdzakkbf~f652Wl&SQlB(i|O0YNIHcWGX>xu^pk1dJE!o?*a7(9FomVU$oz2& z1@-I!2JbW|_lb;Mq3TmGx^Y&}WorGuE<^ ztv`JBBlFqZVD`h0r0uRjAIp4Gk!I=(mb};KzZXou~G9uoYJMOSgsF)B_f#f$~ zEcF2lT8woVGG1}0QkQp&B6K1ozySX5pp7Q~_9egl65sxbZ^7U1#9Ji7h5DTS ze0tR7pCH@j12Az!`POHbAsf7yFhhWp3;}A}8w9Wi%)$3D70vLM+hB5?+u78l z+Kg-47OKb%zD(xWO+MQ!`tT6lz8jQ*3pU~wdBGcxRd?EGg zt62=?b!YY$MsPu(qC5k@2$lM?v=}<2Z_>=qg7+z6{!*0|sz^RhEMS)gBE}((Am7e2 zn$&R~EKw1w5*ShQy3e-1X(~jxP~n;uNp0CRuSGi>5Om6u>H&d}~cP^29zy-69|bYH+pU_&$B9 zThX2V70J$fO5W@QS7jr?aT*VQB`#tc%gsWPz$9OeviQ=J@`4;qx&9 z-yvQU&rLn;M5eD%Jg|Sp^O6Br41yv+1ZwnoFWL&7UZv_s861RW7otjTcyI}7bKTqE zc;b4&XE1UUc~)QKH6fO%K+%|pVo&${FaY_WcSJ)W4ry(-`I9y?%l9xX5RdL=8E-`% z=M)7In9-4)PE~2j8Ex7hFnrN(EEkLajJ2sI@f~MR>A<2PNszSV70>Gq!o3^0@Y?CQ*nS&GKUKZk!6wBO2I-+(my zT-&wp9-1T5r_j$2BoT}iau@OB58XOCYVgV-W6ehhG5$!Hhg50V1b+{!ax0x6MACE;2V9huR_ay00NFv@KhLU>7e zS6{GF@HF%Vm30L2*3|CIT!2DWS=DdWqdg5i3PwMM`z;_Sno8kP;26Ye$uwZv%a#&J z`P0kt-SX{kqZ3GKTi{Q)E5W!Em81R{W7B|z?1eI#v0$`|-R>7xKbaK(K6L4`@%^T` z5$DBc2&HExE;9fP^yB*@Oa9N~z2Knei0_IQfd(F$&Bdt5K*g=5Rc=FPJmCfG`!>*u z{{mmnCz!{t9n!+Va?kH|P07&1RKZIU!I)ltjI?pl{4Q%t%lh4@k#Z}-X#;C_(DW_L z4K|)>3F=t{i#Xj0G#4oMW(~j11M8sO{)N=3|$C6~sR`0Z&dx+(Uc9FC4 zrhRvnhzv7_)VtZlYnB0rlGeH$bMcAYRe_HrZF_T)K%jyh-N)H|r4xh_IrT|F(#Z-{k=rvxE>swoAf z|2VqLP1KR7yf9uaTg0ox>IjgElqTlXs~?_z92vr3S4T+3nWw)qnE;eb_&LV=-}C+A z0mAZ-c*o%Mj;%vVTZHGrkloqefu~1OD>Bh@|C`)t3pgpe6d7?$N7~Ol-RQ6G_I=u} zNJGal^nG5EXv@#=y@3+8Jx#-8h8CtVS@G-w9IoyO(hb4eywPk3`EV&Y8 z;}9REo4d1O$TlyQ%eF2ge%NytKGtJzZ%aK8+ZB5q1X!ONJc9rf%_qfygmwEWlohohiS~lxd<+EX)ZWC_tQI_pO zKj@94@B60A=!fcFocD-GAga}cGs+SD_9S2O{;-*A*_y&4i33YZqn)$THA^K3(9?Z; zFNCI4sjZu^fk1aYZHxY}SkM!2v1n=6(w9@e%pxl{^R zdsy+ZWR{4Vjkj?jeKkMO&uP6R(h;VWmRh-!qXJx;awJ~lE6>K-W~$Uv4o&Ue+PvTHKPFg%gFDH0`kU&aSd4nue!ax&9m3e?I2OmEWtio z>)>r;trGHaMqm75-m9T656tLP!B4$?XBTFz^~M%VKqot!1@7gdTg%bzP2>U0CrzCr znnnnYfFB*5Oj-&C(QOUBS{y&IIaB;r!8YEIvE9F=h0B&#OPksqpM=L_AN-uX-Jupt z?JRNWn3;@G#jvlQ0g`wEZ^Ee3C0+)gTEoP zwDF2?d53PfW8@0FUfUKPr-1_crZKDPF|+?W@I|D&%8P!6Y&7A72@CSi99$`xjaY&B zt*rgUdvA&uilLVenWRr*B~_*eW!{gEsH{Sfd2+5$Z5_r*+~*)cbpPeg4*4jT%cpxV z0<-WE2`LI;@=5%-6#Kp(Cfm!3bBeM?euZgCN7sp)f`JMCc003@<5v6O7z856AeJQg z_#BSdG#@Q7-eJGJ$%LlyfSUYkmYi0Y0|%1V*~upjWp+_y?){-p_Iz;ToU<%I?DuB9&A zlsRT+5doNaJ8XOv$by}2P7hS0$j+5yzPw4CU>bX3${ITK7FB5n$QHgU{C}61Lbk4O zt=6BwY)fQFK|guah$4EROC<`y$z*D|#>H8_^$U6GI!V~WT?b}rFhN@>6Bxmn&>|cr zZXKH1?MsLczc%v3#26BPCCb9=2aLO=Y(v}kmJlHTJ}-gs1oe?je*0q%H>%{A0(~wRk?i}_1@k6#G9QnltyePMHsZb+TXy~=gKj2 zLrf7+Jw(e4Z7eK}1BhV+_jxdX>C2;?;Bp`{^lFZ7&J=?W~OMJV^T$1_0-1h=?X z5OyAxt|J+uD7xAKqU~pX`JIixL8{i@eo)+Y+;Hty(c2Yxa9*L3W+g}W=a5sEp9myb zf)}+S7fR-^l)ohN7Ogj~(K3dIYi=25)G2-WA&PsgkHG!><-RG3%nZ)z&bRCz!YvF- z?2L8Bh%6y+BMmg7&5$o4ca;F9!o{`h)rCMr9V%e{K@=^Xw|IGJ=G6<@WoJ=>{2PkB{qL^!=Hc^?#5; zejitetx)yhXMbILW+WHCISO-xOU?mkpd$jl8A)r+wVoOYrKp;Mz%*yce+AQF5yZ<3 z)Km};q59VzhUyBVDD#mW6Rl%la?j?LIUx5Upl3ho?WDIyZMnfgAF&s;rG(`|%AlaK zAm$5M^LL)09STsMCW#sD#s|jizyyP$_cs_%i_}#BYh$kx3JwR7WN;L_SA+_@yIXf^ zN5mhh``xU&>1ki($(r+(Jk7T=Om=GP(XBKi#=ERw3NK+h6f5G+tW)C8QZO0=E$eq5 zY@VGqR!d#y+iG*T({ltLRLpy}KQd^vk7ns`lva8C!6`(E`^)&S7d+a);m|`Blp_y2 zZw&qHc?GTV`QlpZi9)`?!F-XJD~v7N_&I@XDFV}287U7w)NERwcb7YUw`&U}M~)!@ zRP6vD6qnspL2tdBea>BWjH6cybNHs4?=0?AA5U;IB6T3Nx7ZUIH7zbpynfaT9q5ui z@=oCSvnB+Gfp_2VqDNmk+Q4(Hy!uEJdMTt6sM~()GKY^D}xpLel&X} zd}&<9Jyz59(a9tGdA@vJ&vp3n&fM~ZhPv62%Y*br^kUxO^IJ*jp4AP!F`2OAZ(b+4 z_lHrsutoM99oieK(7ne*{z6Ecl3Vj=l%F%4yWET#;u@yc{J3U>d0f2mltm z%S0ILjht4#1(YvlX4pMQQSKD!s->3?nKJ|Y@WuWPMu;G|sQ#vVhHvWwwCAqWGrmk` z+Jw5cob``Vt&U6*&bbR_QdKSaAX1PdIsIDa+a%$mb}mBVerTWYGG^61po@9X_Pf~N zTTy~MkLb&}mJW6!G#9D&48yaq0^79;6ZT=iolUAJiAm@=l9cc#wOz)pkcd>KdtMB7 z+B&Os$Znnom{*Z2TJP|C!_-J!RmGK>&Ay{8XRHs$Td)@;`89wqNsvcY1F##$_=n2n z@7^c7j-T{}ZOA2G`ZQto{}UqVWeHl#24+ z#Te5`qX(;v5nD3p$txKbGhpe9A_Ng}GKiKQ&q=ZRFz7>bdGqdH6;@eG$D`r~l?j~@ z77S-CQ_kqjH@N7{$eBO`v1CZZ3Rd}icy3;>xmp9|W*v(nz}5dOH5kHrJc;FDj%=gy zIp+%!E%L4_VUxWt-t0ZSg#{sOR__|+!Z&X1-^S`?=m%AAh)-!X(XIIP&Y6}APCWIm z1H9$A8Qbst8eX5%K?6x!oJy%`3o5)fI{s%;TPtrB3kdH&#DIXmh!jrIm;&B#Ev}R2 zC*d^zt8R8Th?!OHpbBV3hX7S0q^H3`X;%YlF8lsin=Ty-v$mC<421M7kO& zz`w8@VWXLohr;rOzTqUp8GF4AHNYk#M6O&RPgmUzX$FfHD{RID>gC{s>O*TFsmM3z zR$pwN`Z_eeOJ6-`#RDwtV$7dqs5%+1-4i@^s{cT)s=>2!17F%WON!giV*bD6`eRl; z4nXp^sEqFvM0y{4WJtjje?>b?mu_XOe)d8C>^TZbRsXx8sypl*vr=Dy-~j-f>=tw( zVx;-0CL-E|7cVd4JIJdJ1p7$@^P5JoLX-jrq+E1xZUeW})p)oC=2G&mEpcdfvD-Dq z&4uPCQtTljC$I!B$9!D-NJ98QH$PKJsm*&5tRv$TvWWb&BA7InqgR*u$)RPf$WlQk z>mGs8{cNiL`5Cug<&Y5S8htqqaJ8mvXdXPmpDV=AGka5Gi+K!2>X8FKVh?@d3Y*XD z9glejOG6TG9$!85#!z0OB2rDv4w1zhRqK1T%ML!rt&YtY7Kk0lIA8U# z;p4tvMC^XC*#L~sZ4oG*hj!5hcFon(@~nMT_AOgqS?A@s1CPeTd#V?~@{))~Le(2w zx8j(R?c?+>efktl%H;6@hRO_NS{II>URW`IM>IHSbFNaBVRLEPal~K}2Kw&k_|2Ea z1ufcYe`tCEg{D%UtWEpHsMZ#N`&ue z$!Jkv(ZLW*u0RlM*to)+pSw+Y&FeZt_Hc5u1Z%U%x>kj##;D zhcDBay!e2KgkD}mKVGOHA3$WjJt6`^+DH1L1UXtQB&Czo?f&svF;2I@k5Z5DGC zZvp;OWp_(crwPEusUU8TO2}X5<({CiE!S=$?3!md4N{SIw-s;tXsU%6WM$LvC!LA8 z$z<}Ij^wMn*GFTEvV0iA^9e8$nKUgnH}K7*G*yn^A^bnJeCkzLqDTDM2~g2`=W<~% zR+~n#z^+u~P<_3eWnLSxFU2oDGPI9>x-~$VHK6*+<9IwiD;!+AW*-I3ie&EG(CK+5 z;iJ_MM?y;>eJ1|RHRNzw=>4!F-{&BN>t+z1Wfw!P_2r3M+&XDAS)y$N*rZ+Ik(=H{ zXA`?Uq(2Q>wK?yvV@N)+q=*vijCFLG=+p4__5;SWcHEkCW8QP0}1cLnkQ;Do@2c6uk#D3Gk2cq-^lWY zwc}4YgPshB<>VwpmyfO_*kKc%@T_9x9j>X>Ah%7}8|}*cNYYi(7D31O8~lVM z&(=}-eKJ4qROqC?dIWKjc1mv~Fo!P3(w8k!_b`7h{Wm8r>b=n`+MXD;W8e38Si6PG za8WO+O>4fNLKIR)K44m_t+F`%aulP0JMgO2G1C9#^X`KcFdF{<5AfG1itpp&F31xX z{#9{8@|kx{P+dly#(oP|43SIg)N|ytLR+ZcgTK(W65I$B$O^3+*Jue=KS|v1LAjgd3h^LYIb>j-j#)4k-n{?Kw_2TWE4Oiv3H^tQ4r(sNkMjw@l_(57-uBh;2Gn zLJTQ4B%G~Hj4Y_IAa}g1AM+jB(~-?6`3dH~fk6Ox)Avc7c3?>M&kq>B6uOf9a%=CM z$)bL$X)3qCaNrVi|HPL^0dAv-1-;b-S?=D;Ep87J7a7-}J z{)ks_0CX@omuUW?ll$*v4)WHe5{-1lA4rKCwfTYI+uxy&v4<(@j;IlZTk`IN+&FA+ z;08Uy*U8p!h%vN?!vpu>%D!%|((&iMP0Mq;x!W?lf|3Xu;+;(B3W>X>nPHK4JvWjV zqNvRgD_c!dut0!9k63bI0GS5NNOO6&HRCQWH*_k}VQSuoQP%~!ZZw+8x8#S75(=V{k+jxyZqaPvaI2?Xw{&&TLZ-^ZNB!LPFkWM2meIgxpm^#ngoj7$M zzy<;Wj6yC690@t)bbkKn0XloL*ideh1U_v7kOg?HEIG#=1$uKEBI>U{5#NjK`=~+e zap}w5T*=M4AD|_LsE)(yP)28rYy_jQfQU#JFHA?h&qnu;ggA+P#OnmooVf$Q4}fzIoV8F;r(m0f#gaT3jJwRf+BK)POUx9?~}Ie8TxFOZ5BU;>QGg?MU;o zs#zcamXek(N6%l3acjX7o92ou*1U#ElB$@*Jz8TaF+s*r7Ei#rraW@SXV4BHIQeU# zWkD)=ij9rJSDBjO;zdo|ik=7EbGGM8Axv7c8kQiWFw7(7Xqho^K{#(2htZ_L#~HBh zQSFaLZliX{YysLV36o5_Jlgds7=ST-II z|5o}6(&OcEI5}|7p`&tXQ6+=u{?DF3qn%P=xlQi4>_n(Qd`SiYO*7%aYSnv5p{tZL zjQIniQ=@EhOg zXSEIj;WNZ&jmhkUo!ZKw4YnE>?Pmwdr%w}0{Sr~dlY4_00Z>EWds(bE&VAo z5I1(BRSst&ge!jYQ#K}6KM5J-h9g1gZ({>lJ50QZb%C7neBLH?>UrrQNsgD{G~!A1 zST8?-yWStErn8Crn=93?4~c^XRj!0WXS6Yx(oK|oLsq9QH<9V(_(=vBlR6A!DCWMU z|Mi13*A7umavtFWUpNtn@IDZ?7uERSCg*tvp0C*~*t6-*GtXGY_#KfsI2?+J!CG}H z9et5i_Ux$%tKN?fVN&}5w_jpK`6f<(o_~c~aPM~_3D9t8SM^#V>%L8aw=WK=cyk;N z50~>@;G;ne>n;tA>cPqQYmytPud=~}lwV}&W1(%R)eU<}&xl#^Nx%*_CxiJf-uNda zr~yVelgYz(mC-O~CJm`Qsp#S9e8?AyQ0#hs-|10&{2)rxpA|^ewS4mD*3Q}uQ=0^_ z5BS80ipwG3R(Y!So)Re08VBz!6na*veeD4Uh1t8ETyP;QuOFLsDY$N7bHG4~4{RN( z{OiXMUIMp13^KtZmT}nnOi~)?gMfmmmNjc9s1fn}Z^C7Pt$b{C9UlC{_1$<|4+$z0 z>YktP9)4MIf5aH3+C08CfYe$o^x{HnnA0p@(2c%Zm)vXfpd+t7KwyQxv_;5Pqmz)mD*W4VONeXMsv7{n zJD=w7_RK{P9yhmX+3$&sW5sDi9=ss?WPi-x8@VLGYH-d3NkCn(veW0GC|>tD^WuSV z0~WdN2~Hs5E)+rKFvi&%4gF2V6zT=8boAEJh~MGXM$NqY_lypqoX|1yb~^mw6C8>LvD z*s$Q?W`axMUanet-k|5ovHVtL*QBBk#y+l?YKF!*O34F+xg?F?5Fg4FV@m{!fFCvhV$^oIygkH(RBvd5~JMc@#*| zr}b``&lp>;aeftu7*6!#nkcRofZKqVT3wth~68fl{inv~tY zMoKHIDD~Q-yw@_yb{c#O&6x43(_F_(I@gd{`XC0FJQdEfyVM~WFQ8Seskl@r30p;c zMugQVgZ>WmbGFTo-pT~?-TtQH_O7A(UIL{Q$V=VvTlksSk_%zi zBB-j-66#!mQmMEhv3il66Hr2S8^1ANYsewg{KUgiQAT9HcpLD!*W?Ee9s;+V&=#kV zLjIHMHY(w`6>IoMg1OriJ=dQNb<-@)trn2%ym4|Y%#4syyDQCy^haal4f;Vax-9pn zs3d*TCmH~8!6u3T$nw|`!{|u6>p{kpdY^_UEQ<in8>Q)M(|J_9EKv0%gGfFhe;J(hfFQiYvM5fdB^nMCu+}w zbFqwZ-<(RZ-O39Jlp3a52)tn z9#!l3Kh={nsZSS(QsnT8|9YSJ6aM+=4#k!V^CpI40L;*!v&^ zQ;^C_%kDg=K4SwXP8D-uDJK>KMGln zf}UrgGuKrd(!so@O+_=10$F2+8Stva*2SE%#Z#4DcFP!hJqSzyN4hA4_aJjU-``}v z`nS+;0-1A!rC{!fcjY zQ@=W-Y6tm<5rKQ76^JY)sSI=wPC|$w@m3+*^vliIhI@p|?c+_b3QSC<`EF`a&~VoD zyloa2lho|!P6MP9JUEE)hO7F$n9T=Om&hb{c^shpqECqvNRqckvhg{FzJFH|qr?G< z>%D3K4>B2#)q+okblaweUs={eVrnpVM?)f1XtIDpH!k!19=2X;>wiA~-plWrUP={< za_>CVZHlMvTlDF8MhiZ#G-I#S<$5EKyFijVHFwYj(sisR!r?$ECO8lj$z@uGA_kT@ z&WF|JEV0j|`h1z@}hYUCYI>&_i07uLjj<8W;R ze4FG!d$g)X^Kaqbb9#iRL59>#fO%5kL=fHF4raN_1UR1;MsY%T+6yqPMf{2L@OmrQu|OO_FzT}M6$cpgG?qq-O0T!H=g>eTM%ACP3Xpv z*@y0j_rbDf2~Uz&E#YUwzH^=U&&~hx9Zc&30I1HSa>}`NknGoyjCLi#q1*~%1uCyQ z<8h#G+HVE{TP(2>_dig5uIUYRpy-{Cz^j~Gq-<_=qohSvl! z@|!M_wjW4hfn7FM+7c~c1O4!bPFHs-e>>VV>j1f*hNK$#)AV?BNaw_%5XU|_QMwTZp*JaNR&z?f4Ys7;&?P{u+OJb5D0Rb9tkJ5~Mi>ms-lF_16BVP`7|k|Q z$nbI-b)QZXgYgt6&L7K@@1tT5FvAxaTyO5$eZR|W0Gto{(wne2HNTL>D59H>Yr{Qm(@3JwyLodM}Y)|e9?k7|BN{CMk4#ALgUYU z1x$%5%2oA@`o*>lqTM--qsd27N;gbD`pPQq`iE501JE8_2$nT~7%Kc)l7k7!MD&O$Nh7n-0%2$n?{EK2$$%&J9uhKayKLnRTB0b2 zVm|GM4M{;PKkh{)i1{Bw{iNPp_!0pvtMQ>ryO`c=L1d?ZJSeZBa; zjC*sKRbk3Cx2RAsJf2wtVyJ+53=#Ps@v`K5w8ffhz-r^~$J^>kAG1PSn#G@wH zy1n*}!XOVrht1m>eG4J(ZdYXiR(I@jP+!Y<+;jzx{gCOX|2u1&x9?*5AOFer5=P(t z^u?@`UU_`j1Z9wCw$YA?7H*crOd0N!NTIXlC?Oh?*FbA6j&%i>V!oiIddb&-mB>v} z^y0K+kwlj)0Ue0AQ@^ugd`n5*h9g*zFyqla_jRl1{LBB4nCF*Y@`Aa)WRYcnwT6u?bL01diWaOYRgoU z?67w%q-+ag95WeqisQSOai|Aa4;jzpLgbQpkE5$W!7B(S)_={W$RQgoaAI?%?&tn# znZQ7?C~%JqV+#%UJeE4WXCAW7B4F=Qtj9oOqF4giBF>c@X zJL%Q2!K-hTm%N{1w2`W#;QEs{|Ki#Re462D3dXau!!b)u|NdFVljU25=X6>jyuwZU zZ_QqXULE2lzG6TLQvaR^C4lgl`67-RzhZ!SaT&~Vl#fBPp=1N!xItIR=()D-Qt6Q3W7}?JNY={DD@#dnE(~NbcHlG5Eb8u6_`swFJ zLl84Dar-E{5-EYcw&rU61;o+QQt-Z#!X#05u%khh-&M5yJVYDS-i-jHs{mHTas`NYkQT!303wg7LAkVo^J# zF+zh~m{$RBQK3rylPyL`by9jOfO=qFj;K=F4S|OmT^|qox*#9y=Xj}BYzfeS^QN_L< zt0H2T#^HLCw2TRUdIn=K-V97q2v7jSvmiyfC9`;ejmjd*%isNP1kLGBm< zRcgMMiF620*&K0P^=dfI!(&~5|8gY+tEW)m-2sJx`fyEu5G?w7`a>Hkje8b@$ph z{q#lyzSx29COM%|30rVP-gt%1Quvn#0+svSk%Yr&s5gt9ODwHfT6C(NrK{}2jwpf)zf9I-PNdMa-B;=Hk>wKzWGn@Y@46C=L5Tyt&q zKD6_cLQ~Vgz)t0V^fC8t?b5P%@OCNwZ(KE3>axp27#K?D2p#u zJv>`jyJ({GM)4yRVDW5N`(_1pp;I)AHOmZcyI1?38W`52g19o(G&DN!vC@s}5}>P< z`quS}V~|Hf1FgU%ldwkOFV!kgGQ+1(M9AM&VW^in`5UXh)68!})VD_kw*-sK%))Y3 zDm80*FURIpRvL}lUicQ%XD#$;m32G|6DTJ}B_nX?#pKpUKOgP5W+zD1IyqWz3u1!B zzlZK_!oer76VtU5uk7E3+)&RQ-)R)h_ZRGTOOWgoCvle?5yN)s9l5 zE)}c*;r)}VptiGt#|bTTjC<-|>_hh|2FKY}3`ftA2V^E&-yHi)C!@r;&dc%z^{2YW zatuFvkL`v2X*XOaZfRFGaUtmuAY#;& zdn1wgP%3ZnH4Drh+yLV}>xvpP7bdSQ2YXjE^=QJxY!+QFz+3O&%l1m^caeNmw&{cj z*l4;V-rM78j1(A|4_7RZRIz0XpsDFhr_i0uZn;r&k+JAAi>}GzyqY>C0CGz_#aaUB z%9Z;NWlq5SN*X?_Wk04QYi4@48mhjF(?&rlb z78bBeEr_P|eTGs011SVM-)+?2tI#3*;v8*y<`qkEk)juGE9HFtlE{X`v%P0cYr_G} zCjuP3jgi|9YE2urYNYAyPl6DkuTuaJs*-exTO*na&1w!s{{YRgJBndMw>!{l!$*Wsef!PBW8?j=1HtYxt!=~nwmGe>e$3GYC z9*xw~+H&w4JMVYQDm+=}GQhq1H{KkL^W2q#hvoskNVEk-uh+x-NV&;zIVF|1apMtQ z5<3KpTtH5@EHfwho_t`Dps`>HLk<&hE;e;-%A$Tw2dS5-fzl{^<>^*P3%}YGWqxcX zrReNOIZ@VQjuilOll>UqcB9hLIT}?h^%<^d!{rQUpuOg#WCvwGs(2p8qSLfdGNT2t zFQ*kGkJI9d)#?$ct#?hfjO$)S`t~G1G|*zn5bjbThx|I8rRGFsRr84}rGN{BM>|U2 z*2q9NpUJ^l6y#VL|yX+=7X*^gicA(q$RUji_?Hs$y(HbG(+jP33M{hfL+3z z0B?B|OOGgLPyh_LS>;jlA;k&F3OF*}SYGC@3E_>JRuN=91s#f%%Dv(FSUO|3PWa~& ztV^a{?8I$OoX5YR`ODKGM zDp+U5s`0QaJ7wthB6?;9&vp}dcjEzX71?PI4iPHcp4p!SIC6KonNgr?`>V%nG!u%P z48S4p(ghpScSL`TUv^Q+A|ZJuxft*vm&Vko&26EpnlA3s-vY=f-C$f?y5XO37bK!m zbgad0bgyVLb&vXdm;JsccFXMUep{DC{d+^9!Tav^V&<2KQaM>IgpGnVM5T`=s)Xs1 zd6Lky2YTUFi96bUX=#RN2UdG;oe8Z2J)QX~v+<<_1qu+=i*Y?iN{<}|88_H}uO~bU zYx4~KQQe=cDkPLwC5h1^es4dR<_l3%3J$(IN4)sPyVh3J{GA{S_{)ugr?v@aHhAm9R99AyBW!PpE zUtk#XCF|7VAgA0FjKL?Q#Jm0|7#Q8XGrTLRk8eQ=B%8=W$n@np{{U9qb+4l2@ejIH{(2?1N`>_`DNMA zahBTu>1AXvqYQF`x#2CQKe6*dBkP`dCTq-Ao4S3ud8F%T)8yC7QEj5J{B&6krUi7_ z0_253k^b0I8HKF@VR%*E60{Bedq3Vu?U8fkGUA1se}{{i$U7v0|7Y0j)vN7=<)7GKW~^^X8PCJ z-I2Q8k`A4Ll9E+#hQ{M5z^8$|_l64XBlkPWYJ5$U2VrG(ug;0^jSi$bR*Io>N&Oe& zQQTJcKiy`5ZH#6QI{C+@xbL=*1Zz4G-=WrtjL!eCQ=&6>0%bHT;0oiF6HIP9&@T_m6eWn7x*c zo^DNRjVE$W61MmRr!Jwt6C|qe&+Gk;AOZ%ohQM>( zJ@7r)p^QGy#&tl4EhA1xZMZUG(nLJ5vk?Dw^M_cIJg}MJIo6Apka;V|-t^gI{wgKP3W3Nh| z%M+z5JR@Fsq$64Jl0(Dt$b#Ap&qaS;^QxQ*Lkc!B;R1M=m*YW}VX%9Y_i(hc-Q87p zE$1U43=dF{Q+VBpvmg`vTb{8}P>Cf4IZ290kVD}hb-T+cSt-qQ+&8Zk^%6@+JOwg4bAHu`j zW%l_OPae5lP(kd(9-xGGx&&U{&xj-gF9Na%zveR4!3AfU-RY|dw&5CN!&4{+ zFH$(7^$A_4Gqc|1=>iej+bwXOUTXq=f};0dnJ}rV5Um)fMmLEY)oQ2U+nTN~UGdV? zE0{}a(P-<6Ff47R;BA<{l*?wU9VAI!W#pqdt$#NHJw5Ya0f9opG}kxLy;KZS@fH)i z=x6|?21Mcif-21%wW=WY-{&!UQynZz42UybERQPujg>Oo8kJ~%3oZkgHr;m5J6~~Z zt*t&JuV5W9fj97qf6mmvld*)39xP4EE;glYwZa7Dt!h04v-B?Sehh2{BH28~1MTxs zL9J*qnI`3wk#QJa3U)hvd9B`|uVBr!qFl8{niG{R<{PORW( zKNrMyslTT{*oP0FVUzGWHuZiA^|>Duda5EVY(ck~$RzVeeo!=rV(6fw#HnTrH~2Ej zRF1{<(!Z7fPormBQT`l+Gy13{UHj9wU^o!Ww65&DtXJ@4+o9DdSwGOrnN8B;E$S{@ z%SnhUVwljMP)eo4rI&M%RbfV5?LZOjV`mDqI-5`kxeI^Xf1JL`b-gH=egs0jV_>9VJpT>Z#uU;)J=kUQP@(O(QRd!lR9S^? zz)ef;l;XentQ&^E#KU9;26ck9^4{UnvO;LwSNIihAxP4HOnp#y9`CleuTl8p^o!72 z1cJRc{=$8`%a6|*S{ zZgI8yYmv@lb5B_ar(C*DY{j)8Y?rhha!H|w<7q& z%4k9zsHEM8hs!|Yp3CD7@{`B56|Alq^<>3u0j-L~)k|)yF;i0xj~NZIMRK&n@-I6h zDFvYYrP25jmTl`PJc6c2Zj;1{7pZF+FpdbKhHJDrow4p=lUUiBcvq^v{X3Du5U-3wDmy3nG z!EC{h%!dDnb$2^uYBxoN#!T3St|SV@Jwj{Etk7NwC6gHN?W91_nw9TKVJv9(hai3~ z3V^oZTa}OO?`|6&mbpQ<4!2Y#?nIJs-yG8!n-G^QM&?y*;o6kyT-NOHNwb*2I-a>$ z_q*WwaXl=Lr1tBjJgkz$b<^72sH77lZUlz4S&*5$i4GHZ z(tUkSQ9~`WU$7CB!B)rFg)n+u7;_b#t~eLdG@0!h6TE0F5Om@u%$ee%nuCtta^pTL z0QJQPEaC*)b7&5WrYKOz@QvP^_XLn$W_8gd?T$)+7hoMLD_z9PUw3fq62CBq+_#M? zK|<8v{cm*Q>{8A!)Wj2e4>O+D?GhFvpwM){=c_SjC!9y!VcL92DKqgoUOvuFnm|0{ zYRAHC2Xmv~a2Wv&N#))388Ze2VGkD7b-A$cfemZ1*3}uLv{oy*d2RsfCc}W_s<7o=C{{9uA<3Fq z@qiL!(N*1sEjeJf&2@f8t&ciJ9FvML5(K~fZkxS@o1DTpg@1D+tL#2-Ki$yjK}iie zkO(M53V*wMS$fd4ax{GPgGU~$T9JjejDBwBV5OH1JCzskwlcfw_ zdfiD1X`f4{v;EFeI>bfSFSFCHmOF#G<07dm^flThbcO-26Ga_ZTaDb*Y}_(3H3IZ> zZwO!az`?zUXjuzy{w4WjhA_rg2^v#u?!aSZU3UXXg_TF1z6iC3a4~!MReEIZnf8Cm zbcf=%vYAqn>8YdGHBrFXk1L(RoS1w{Hq2Ho{^p}C81(Xl;eC}Wg}837eKjWSzDSvU z@mTVYYGlPPWAtorGYF6u^JYZ+4W1=^86)NitlCf-p3YU%e@ObUO9U?BR^)c8_4C*@ z7hA+!pl=9eEPA<|fzHesF^-Oe(CH7Qpi}>CCz_GVEp94IihFpukV}C7Jb@B`uuCBg z&Pgg=8+S?bbnYJf^W@JoAs@BhYJl@T8R>+;imnnt1w^z3B#8z69uNoIt)!)6B_P>qz+n+`A+SDxy1cmK&WpDdC|F zJ1e@6PKTm1D2klJ64-wpBhX$iE*dTy@vi#gm5M*Yv87FRz&IxW6&weDbdA|=l``~I z=6>MU+89{zVE0F;Ytj8qOozTL!qW{LQU-99-)nmOPi$f91KHO~OxqqnBMg>^=V}>O zRd8H40E;uIFKtxN6cqjK>Hf7l--GTs>uDLEj9|G8#dv2$%fKC9LZEqFn6Pa7f`wmJ z^QN9_AozeQcjSbgV{d>;54UeNL?Y=~bAcaH^EuucEXT3Z@iMRh)=eT)F-Ab>K^Qu@ zz@>yfG!rlQY-RvDEeC?<~4Ci{Vg$GnPoB0X?bvhX(M(YEt% zRnL_810bALC+}R#bA86ky?{aDDXi70A4g8@#m%ZO3&18VfJp87X;`zm%2MZNSJHKh zohuR7g#ZnjdPKa2ygE8KSor#B@v2;R2o47jT3aFN>oZ(RVAANw`dikmab57ny;3#U zb>!XKg${?M8>KtawCmPvjwp=uQDR!)Z5KJmt1C~CdFBudikI(`NB9=i{$Q{y_9=vj-MIn zIB2LvFI1$&r>txi-dBMBH{5A$sC#kC=VI_N5eMPr;Ooo^X_*u(O{lp%c`dvlNuZQ~ zP3TK#+`+CoXloZ(=sizMzv%OriVMGks$j!&jPRsPX13B8*fK@hqRiqRwHFh)n z{k8ea8`_I4C z%uQMoV=`5N%+nM;Yqu~gQD(R+Z;#y~V?qKpzK=Ij6F*3H9-|(A)79Z=fTn*$a|z>1 zl%?0Uu6Ix@w6}2p!dv1-4uUQL4DVdq?zFW2mPsOxYR?Wve(88M0RcvBq(8ZQ%nRjf8#=i2coT*0sF`6j= zg9q?KWq|OR6)9-r<4;BXsQT{*hKI~5NDoAHVbDR8KT`wLl_Tjh1jbPRJ)%X4$ntC6 z1tF0B@~9kkIAg z{mf_7zQr!sqYq;ax%@sFYd#0(9F#lBs~l^Cr+sthgB7?&m;+xs$*SkO_?7Bsz6%VQRxKed^=dR--fWjvCowAa5$~h zg+`m3Z~sLr-eYXdWhMp)alKw>@Tr=$G!I4|@qFO>gF;X86+Gu&2ca+5!pWb_U;98? zp6jh!X|b!Tu&;-1Ks*{3PrJ!YPNezeRrIsmeG5Ftk5Z;+q6E&dg7<|0$PG`)Lu4n> zho}W?TaMSbkUH)3a?fQmQ`2xJ15B^Kr^2z~&7=epXenv$G2L4v6(SOY-)u4AJZQ%( zo?p%le@fuswg22a7s_~4G;kgsoTS@t3pN1LSnW@SN1Xj|G^zZok&O&SfRzMv65?|$ zv=1tYxfMOPSAX4`!R$#nE{NE|(hOOIsFo)olSkKWDf>z*LB9gv?eXVt>X-VH&T$FAV&wq?X?; z(M*mn5v8fg5TlXZt0ZfY!w7f`*%yqFvQdFZ*f&x;Fn!1<)tU;) zYtG6hyeS+d!2!T?83r?6tU>M)*mvV5?55d`s;|6##|=UJc6an2*3pjTY+d^iO^~Z6-E1haBwV^%LNTB040;%rs?4uv+h-*mA{x<@*!&Q3vXHe_-TpSGc}mDJyr?8k23xI00_)3Ix)Y;J*JcIP{@C)b0gh2GGlPfT@@G+U5f z$n$D_UyW}9R*q_gqNR_O;p5T8c>T*)0OWX;%ir02i2b_Xm%k%?FcBHopjs-*0LwO3x8_q@eR1E-f&n6 zAH`e6Zf;SQ_#hFr9#TpE5^jWgMhituvai4D6W74RsNZI^1L-&D@~064|J^G%j2a;f zT*r%{Eq@}dFlLXJk-?Bpeyx^vtRX*glk%tmv-57%4o!K5a z4moMn4GAg9ie+u{dw9SS&25A8u~f4gEoCCxX#)r?P#Gfe4{N$F7HTR*?+S7G7ouB) z=-XWtmCF&9a8@T5#X>tQ|Lnbg-JuG=0k1cFT_-6 zg0V4FjywMtvw?2cIo6E>HW$Xsif(8*qmsxEIbmzI16W z4-##M_%v#8U~x#9Q;`YY3CQRh>Oo`yJ4s8A3n3uUS^4H)9Lz@(9)5>fr;G8R1Xas= z&RXMhpu2kc8XQ#8rFY-VZMcmE!QcBQ8@wo#df|ylAawP~$=oOTq!Miszhnq0yFegP zDUQ5Yk2pv>Z60AkG^M93gk*aRIyFl6!CcN+9&KaTcmkH<$8`yrRoRvBl$V^+)A4)I znb`zlG@38p?stu$A!*fFF{sNLERMX{NDk8X>wWJyJ(RtPBpM!=-cr451rzMm`wg(- z0pg6iCV6loj(PSOoF6j*Jc9K`mk-L=Y&AhP;4}(u#5xZ z?Qi4FToF7Z1czNzctragO6XCk{ar3ek=%THAj6`aTw5=EBK}Q(QSgn^S4HJ^a+YsdP{}%cZfA{HM#o}i zK4a*Pu4o7>-Yr0H>oEIT!rg{MiNrZ|w~N}o0px6=5hw+1bn-M7oJ)}wjr(r5p@WR*PXsh^t50xcz6Pd$%%p1OaUC5pd;zs#C0y>yYx!~TZh*TPytSi z#Gp9$0a`8;H%JUuceXORyFxo!N8usW$B=oy)>{$SGen*jS=1VSCKg{-ydGstR-c$eOVVb$9$mqp21270>99hcRt}3*`^XU80_x?iVD-Y| z0joG1utq>6ssXpreDRmIv(&z!8Eyeqo(g`e$GgdbpNB^!b<&Aknap@PT@KN)=PR;4 zG>~e1NK@!~46Lm8+I@}==5JcUZ7jRH$AJPA>GW#No0Xj%17X6kZeoXrro6R`JQ&f@ zuAp)s6HtDbsrm?fUo8s%R|hK*&0%a2A?cD8asSs3z<5J8Vb+V&$D6p?RV|(zGZ?(h z_dqDIE(tKw6=k3*MPK^WxD#IWk6TA|%vJ+>g43*7$8?&?JFa5umlWrQAP$qzd-i=%_GH#p#y=ru`6O^rL6PZ4pY>ui`a`w(A!0zbw5eC;{K99bdyse?K%eS5m zkjk-0AhrP{?KJ!Umw_E#JK)Mr)%wN9u054~5uLbjpHw$e2en!3xwUz};__F8`tTap zcNq{3IV}6Q3c8Y|A^=np0lGh2EP83y+a2eIMLV}5ndhq<`&LV|(8A0}8veIKp*F{s z9bK(@u^{F~?`(|9j9&=*uWb%Y2oL9SiN^t}(0qAsoRrXQRii4R`1VMUB=zODK~~w_ zDF}yq>wRccM&C*O;(EA;aNP*zD7O;j)A|)?S*z3IrUDAjqRDC9Kt#*=zXC>=>MGP3 z4}WidW!p|wXg-!4XZn(vq=G=^6nuHES&Gp3;rQdSzlem*rG2z!y;D~Sbuo&THJ_B* zL*@^dME^bFtT88J3E2T;q|jTlNv%3VXde)Upwflctvb>y=>L(^V+=C6U+&gU?)JnU zjhcv+5jLBV%LHtsLuuQ6zISBtfVaKPN80Y9y*G8r24x^I;#cvp;wv|4Ta^FGyJ${H z93338GEHC#iC1aR?0DoJ%j*$b`%9Tb%%2xQI0a9eg3?AeF`uM{xQ7RP`4WM#eAj)a zDy%ey;WsT2(tPW-sqcXABP@P?3@yMTe?R&{rPx=Zbs4_}Z7sY@E#$XHGdZ;q#Sx3= zDZf%V7xaKKz!|okiEV!v(Z$+cDw+s?o&v{Xa0Ff#^fu$I?a7N(Dijkks3`nk4TEF}k-^SMLr6LzJ7=n2MSCQ=GIG27{br-;yY#to^Vy3o;7q>fQ_SEWNZ z5-yp`SWs}p7)vhd1Y)ixuTmE(d+FKpLFUxAq@u+(JwuY#;;H7}_R4RQVvM8G`Th4i zEwT6LKT?f+jX5@dA)e2KAf)-B=*d75_n`vK&sACgV6OZVMd^$*1Uz;(T%-xO6l@N! zz(O#}30X=GbU{ou$ChMLl%@C*u#0!EbBmi=EV~hEBS(|AF$HJ<06|VoMnYl$00000 z0002r0RRmF08jt`09H^qASz-20Q6e{odGJ~0S*B^Q6i2+g0D!w005wtHf+3w%lf<7 zvJcF6rn+3$etpkfKP2zptDb87Kk*;BKHofp;U~g=?dOBQF5dG*^H1XZsruvd9Q~2$ z^X9AfKh)3E7xiyZKj^>odgr|y{MWzvdqMwS|EuXMr`Po_CEq{(d;PEFcb)!NJ?Z=Z z?oaq{oO|8&Td1eZKMDT({MYWs$S?6b{rQ#t@2Fqqf7CzR{%&yh0AI2n@xR9V1^$nm zUu->q|C@ho|9kfd^jH3`55LX-(DnuXss1nj2l+3`uc_bofBFBq{K5BC`$hj#=c>Yd7W%6xDLE~Md(u>(`H5_byms$TcIA$qPHY(bwy3a{f_b0nVfv(^% zC%Se?NWA&8n~;~PzY>8)GKwc~vt!gD=$O+be#s3(Z`rj`Up!txREU70aNQLiZ;eCW z@0rXGWDka+^MBM@0ynliU(qzzl&K@SFqt*}Gk;}QA3`R#lA;;PH(FaKc7Hw}(VY)UGP8Yv^5^!)u^lmFCZ{$TjP#1{%ZR z4Emjd5m$;frk~GLhY^RsRD2VxNoNnzVwHJhxRBl4&jGPZm%T`wL@tiC?`GNm!nbWh zZyy${COOuL+Rscl-~vHm&QK;#!z}yNS2kp=AYidG4x}21+!L(=rz$l_NhfAGOL#dN zKivR5vWlROc9)oGLiu3sIB}tMy7vz3z z47qKe?!ggH?w&QoSn<#z0Ml@KbGm&x!i7I2u99FHa5@Rh@XL8=De_ z`~Uaq6t;s!M33AkI&w}eD%w620;7Uk5CD8MsqnJnH>z!o|0F-&f2D@P`_7| zX|nXlugw4vTQ5DbKJ4#GvY}C2FTOs9;~fya$1!D@d&ap=WPh|6eGX?eaKE`$d?IrSnpgxwG-sK`h&!a1wBus5U>!9YXg2=Q|iLwbPq*>|-_1_>(cCpDknJ0y|m zBDq<2PG)r3ML!du&*c@4V3o6efn$$%*h5WbpPx(#3J$IwAo9}KM#R$1@a7gl1#u+z z&gLjNRO4HHAu_DjhHQeHf=NP(`EJ@MD+nHoH6NAq-EQmxxfyhkSG*L1rlZqdsR_9-a6dk4rzs6$o6`A<+|cll5I!hU2FCd4otR6? zErYJ$JkCIOcLSb?Tk9vrcZowbcX3fH)=-e`uSmY+x@kij*@bIbi;%B*kU4=f z3$*CjQJ)KDBpHq(;n=x5<133R}rOQ|C~>r+r>>C&}wa32o%&yjSX=&*1^4W(HuG5t(Ct! zid($~P9gsnLfpdI$ylO?HYgRVYT4}Wned#Pd=ieh5Ge-KE%a5oyyf;vA9(QmVOz`h z#)Jo!9bbBPRp-Kr9HLv!V)9fGnkj*BAC3fexO^MjCbs=JUruAV*-<8-I4+2wm6!Y$ z|3dPD=grw?M8N`J>UP~hq9n5IA`DU$$RMiH0&#Z`9)Ys$ymeO2cV)75f`&AYp~K0x z7U(PC_l#Gjf1p~PUy93Zz3z1Pn>-1!@y?SYCr?4N%TTy2{#}A)z87w=)z`6zPXyr$EsgF>#eDl z({4U({rZF&${0ikMoO_l*=G%q0_uw!B~DMhxp6=JraJHVEW~n&CmXlVpS6)rjIun= ze%HiMD+@@kwe2yXBv34yB-#WKSj9yf#t_|IW;N{#dh~fX&nMS%ZmzNjcR8iW90*_) z>{E&>gsrfKxA+J`iYO#A5%Y}>&u`kl3K$yEG=y^1Dgxem4)q16Ybol4A`0o_6)>Ya zT0p(*Hn3?bhfWqj&J8xm6i`pcfPgJ2st#{R2SzT<>)T|LL@bHSPn9t@7NI@5?>Y$4 zlm|50%-m(8TBkGVNJSAT+tK>u-gnTpS(iuHWm$li~AgRKqcJoK_PvL>5UO`@hJ`Z&QrhwIVKbAn!qD#h* zcV~=DAK%lDcQx)D*Q}k%p9hc$lcC>$Afj*p1N}$)F?ZEwX|=a93X#2Dv94+|3T!9P z#W1GmeQgP0q0yQruE1krnFOuBlxu|v`N$?-ksONzkDfyx^B`N|@Y{rbKnb7ek=AQ< zz+{h==|OR=$*^By9$U_=Ugg&_m1vEo$4-BV6Whf1+>7tg{_-x3J1m8(zRkU#6zY)g z0L3TP#xA{1YR$ps`uRd7ZA2$TDPYnp6;VqRZ;TasTBS1ln@xcfF52n3rnO9d$O1Mo z{}^6Y!m&vzIPA%ng1Mq)QZVN3UDj8x%=trasEj>EECR1?v@N&xq700rT~0K_=NMAg zj2`NMPIN&F9YnH`%&0Uw&DA`_@px}y>>V{Vr7P_oDnZEdGbQ$yLnC=Xo%i{go0R3CJwqpZgIi4Z#CoWi zFQ=cs*-6J94m{2f`e*JUm;`!_WoPd>mA4-7J*e%5wVl`$3Xg`ybTl8Fp5&x@k^74Q z#7PS%0092}t~ZZt+9@*cE=^N-cXI72ou0r?6;oZDceua@pmouxcG=`Hhtm)yYSX&8 zR{@bNw*UWUF8`+R-_bSrM-uh#?8Cao@;_`@w6!j*=u-e6ej-}n6EpWGtk4ayZiO-^ zEDC)gzjMB!R)r7RcmqjmuZNxFfCZ*qc}m$$Z%+S-9iKkEzp3Jv%*DSav*4Hb~GPj%h^5f_zrU|+YIOPiL>3-N%Q zB)ij}{wWM?I2RB~y5Iq}zGel>Sbra-yfa;R3V^Ta{0WZ6rv*`@l{2S$1wP1T(OsA7 zgFAl_m(9s+mZo$5r|91(Fjy*)q%rt2B2hHW7KxW}jv7Z4WppN^S%iGDG2s##C6kqE z$!xBf6neK6)`{T(7VnL?Wn)FGEIW|$1)_fy_s8o*W#-?`TB6gs7V%Erb%RF!1jS(l4I*~CY0N7QQ0^Fw*5i{|#D`@-(bgq1dIOS4MW%}kqChV;$$$^{0o z#T@7mP9%-k*-F^>D{<%tDT})p5e*@@?4tEWDdw03CGy&*o;>WEDnG;S*V-$9BT;k_ z%6M$Nng1ZBE9s+mzZ+x`M8(S%wqFdteGct`S1&y4 zS74p^flWkf6NQ?aYE(8~_boMWeMYgUNa2iwIjCj4cbrBU!@KfK?T%WV#C;4q?G}N> zHVUs_Em42**X=Rfo|S1hP!wa+fg4x0KkpAaioOB(v;Pgb9A*m@st-Ks1(<8w?(2dr z-wJ*_DHqhz1S_6OXSyXueZJF!Wu(ibD|+3!BOg#wE-a)r5hi);WMMq|8)^p1Hocm( zXN18-Qgf{!y*kg?iP0Fj1y0os+#KfNuGD;nqzYh>e^<>`SnPQ42y*NfyzY%3+(6y? zG&!q8wp;~fM~#9#P2a_N+k8^~yUGwYhuto&`BH%6_2SiohZHW!rLfH@uPS|oZ3SUm zxMey)xy78yo;F(1;!dxB*m7!HCG?btwgeC> zI@w44>dyd4W4Y9&=|R_7#=`*c3d>_ZH9P`F3DMN;I+(aGAqRj#n!^u)*cx}I-xOo_ouE9@B3=uq|!0kjq#)k?FGpqxUu zN%~A2@=xqSd7#tEwA&~0L#{Y-Lm=bnBUJ^$1tZ@9L%qKyRV-!iG$Z+cYWYQoL$eG7fHF$m{xJeh; z#VucyNEXSghfTK)?lpXs)eaznp+ylswno$P~9%DZFwv@Pi{-rZA7Ky)# zBO8*02u5mG{cZcVW0{5x+!!Sy)z-=V;q(L*01f0rO_1VR8;?n``@n~-Ii8k9DExTF z_q|H+9qH9XSrPRL!X=Ur>}rF2sjA*LgOV8X(8I)^s9D%6&3pz=ba_juB_>XM>n1~ zH{>CELgR1etSwnx99XB#J!k!Nsvsez5&9RxVJ|^L2Omw@=F}i>k<+Y&6o6LIf;FCx znBr6^*c8DIv*qX(RzPO9DI7)ErdPzI^MapV-Unf|URFCl*(}$Fb1F_|ku-hXRGEN@ z7zg<0u%AxclYW&RKo#$3HWw;?3CV+qjtVAWHW+?2lk2DwHD)G<9!Iv|AaqM!{Q>{8 zH$b-e(`qsJ%b*Q0@TLs+E%R2oCVYf~a!m#8i=n(M>;CwBq?(rm2mu&j>YUen@{?mM zPS(ifnyIi;1Dds?@pUgAQLLpj!nY?;dLUl#Ci|BBiv2<^P8jhc7sdC8|A#o7+`I_AxV+(3q9AatCqi*)0*PF4?W>%?b)Z5U_L{zD|*iwmWCih4|4V; z>wDs!yZw-`-$V6>5c26fM3vB!x^vLB_ljFVcL<~7*1G4jAZ?-xk7dU&Z}*=lexQ*E z-sj)ODwMEA*iH>kCcK1_sCbpC5jX4<9BZ=6;xC8`5k)i*43hN9Gwxn>@x)8x=wMMB zJ^~330nO4Jb{y)p5Ce)p!baeJcBPx=yXq5{iIvG_?#n|rYEl&OQ9Y5R8vJ?Jpi*jK z4jqK>8dwbLr5lJf>{U25p2ecE{a|J6b>r0fM%#Vd(*w> zuTE0s2PxCu#;&(iF^}loiVTpUy%_rWU%(ee$o}%jLyx8OL$46>$F(-6ywps>SBG8< z>7BzCZjgRn_x(jSJD@aR31!n%$s zN!Q&v@|}SEluAc*5~1M`JSfJ*m|7>Xjm-@1u<*5A2g+9xEAw@Wh1DJ9Ms%`zWPn@uHA1N zNDg+@yFt>LMZ$K>w1ere3mnc691hB)?*LYFElfY61FO=<;i1;301Ye=kgNcRJ`wMz z*di0c(87Cp`+09YN_uK?Gr03Dl$cJ58a(P@C~jZ$9WTyUZewlble}j4Ak?OAf7Xpx zqmM$)!c~cf-}qGGWEH*`0T`yhIJ2{2ZD^;j&INg z;TL_uSU+KP4q9TLbkK}vkusA)-5=J!8Q!OK08lt3$K$&ENf6|sls8ktG@+jGXO0|= zN{}uz-{J-(C9}dcJ@hL0QT7>z0y`gx#np_3cR3G9t4w7`Z;gh^lrKT(RE*gxsyP{q zlKjvo7{?h1A=|HvTFm6tSei@0R1F#$m$=mKGUm?{f8 z1x))x=%R}1g%Zd|WN8aD!8pq`3QgT;!DFTrKaLX)GgX(Br%3O_1vVp zb|Ebt!H|xgcOV*m*UpNHmk2~yZm5Oc8O34zy?2re)V+hW`@w&AXpR=6fhX3Fk{2>u z(7EtMlM@t1wfd?LcMPT4hXE>wHXq`OLup|LKD$e>!H+WM#px8{RbnS#nxvF-Z$w5n zCs+HDwK&+HH{Y=Cw6UZa<3z*XUa3DT^B5h|27JzY&inAOr?kJFw}8I8fbyc5FCN|6 zqD~iMZ;-jsB2I~g#NqB01M|p5%>zqyihKvwH}7(@SOfHb6YcIyQ>U{m z!Kkwm9ze}l=4{!8D}pi%)5e}jLxvhg<8o<(o~lt}3MezYj1_`I%@*FL zHVWT5*nxtfq2-RjcA7A`CS`J#Qv`n3z%%MR+h}V5#bneNhB)JKOZ*q?^R|-2eviv+ z)XB-a-}41l-kXYD0kKe6-uVz=!3#EM6ru;<;40!I$4Pqi$rmJGd3^n+e)V6QL2906 zGA+7XN5W-17lB$UIOpw9L?gRo?QAa??v_R;f2}vSaaT&}E^6gBRrGiqO_-)Mq`p%g zF3zZk2@Bd53ddQJG_i|bkIr2{&p;|mdX4i7ux_wSM8JctLvCx*MKy(r`@s}dm0ATL z409PKQu|0*ZXE}8Po2X?h z%#+|{-}jVcZAjS16Xs2su|5%8KdkV%v=~ZBIDF6OkSzBwC?49n6kY74#OeB4MTT|* z2)r^LIjCc?lV&Jv+*$6dtT-?~!q9;9-6{R=zHF~_qw68bH{oewO>M9AD8vT291zI6 zytEXE@F2M$Xa{{ApsM~{!>d9sI0i*j-)Mr=7Izd16UeVE1J0U7zmS>Df|A>;yK>Cy ze4}k0{8Y$t7tZMdpT^uEOQ-&XS-TY^**jP5(Pzp%Y$o$aTaOWT(-LY2wtpTOLbnz< z`%4o(aNq+y=(nQW9xPv0MaVm!Mb}nig z5(4-^*AbwK85W4PQ6g(_zBb|rEhYs%_=ZF8pWXIP#F$E{d)F?eFX2(I3 z`%1RXLsI`fnpgyR68MxHNa4RfFIM(6rAatvl+w&*zP1rIfyM=+D|A&XAJGo{6Mg_` zT__7ct78s>AP|wYjT%zq*l<79EBrJu`F_GBcYwPc{VAb8!ste+F2JhkMgI0g1G|sm zwQ#-g#jSr zj+z5QB7-Eo!;F~@`(H-ua%{9+A0I^XhIA~&NzO#d7uAY(=E~aV{zoth^|zB~O9vr~ z?^KXUX+dBzVob_JWVWmRopIr0dXn+~0q^2;9mOQI-N=w`fS$#V>Ru~?=$QXrvz6owfRwEQabx z0kfiJqri!CsOx-fglWtB%!M37lhT3BuN3bs?OS$~wR0AQdxcu7ZAL;neKD4so zCT#Mc;+a%QIVHsG1S0Bm7ZqcWyIsbJP}Th<6Hs9l0+xIzQcfiDi5<7;(o@i!S#4Pm zKvUBdTlYVgS5~~lIPa?{<~;gJb$kZTy6u|DJ|^Pv`;ZKKD{~E$zkuKby9Yn%rz+pI zd6UGMI^`UJpb`Mw7^~@-erZ}?iCN%)@Rwe0#+=iRadu`6aIAM=JA!UFlxZZeUyV{{ zO8+FV+$!u86ue7+1iCEg*1#65seZLk8xOC2&;F+MhwLQ|q8Vgd9Pn^PS}|734OCTo zzjJIsnaMy`r`Pv=#`UeruK38*)PR%UZfpsSGDFS?vr~5wsvQ2x(aygIB+D1sj z%t>2?SVZOxR7enoj6&h4w#Zg03W8g-;$kQ|Tw42ab~{$cFNH3Xa(`;3UT?LI!E1UY zqSoZ6TpC5fA?rai>45L+j<>%j)D?{^pF;`_kPhB!IZ*)ZvyI%D;nv$*t@$#7mZO@% zrl<*nR^sD`+KCCT*AX*onYYELfr_Ns7WLS4bqV!xrqrwf2VUUt0HZeOWIrm;wt-bHLO=|NMF- zo>Du_;_#)6arUzG7%*wIAF%f<+A3>*DpvCJ76f5AkwYi*9k**-c2K2Wq#{rdr5_t^BctjXr9H7*cT4}NOeGJX) zakK^c>4gHWyQ)iMP!4KQdE)pO?OhK=CFy%mkV;j!X*P!;y>O0LLy-%QCZkO)=l*@R zFt3@9p@%ZB^HHm1OTWTZiXx^KMPTI z{FcY%os3rq7z2Z%Px&UB+_J%9+dM_rM?XL3TEYl13>g5d4!+>hJ3WjNG_@CqdaD_t|H}Q-pG| zQv$qg#42yDIPX15djZh6)@D8Ou4e6(@TEkX3ev~8e80Tvvvf#p9e%;dfC7Zwl{#k_ zGtuub*8(O_L8(G~^;ZQo+)V_Qyb`q){tK zE^SjGZIvc=i&2%#%M^zeoP*4;Q9BW^MfNJlq49w{lB?b=kP{_Wjukv7^Ho&Lr3nU~ zUgh{K%OO|`(rC6Djhm`t7YBd^>lj`Y`I;GV_lbG0e1Tj-<@Vq!Qmw@VZ8<%gn2zmK z;S9D2GZX6KIMv2fGxBh|-|*Bd=7=1yYZ>DNyGH4^%Zm3-NLqX`eE84LpvGaeSk1X#QjAuj-x$1o0CM3oaKoLYp`?ZXM1nBOU=ZmfQ|W4F zYdCULyvO|k&}i0!oDRudAP#ZZkhe0Rq>!9dfDJRMzYo+Ws(s0G(7u=F6zzIu^s)6q zRCNofjI$scWdE5V)htA6Xw}EO(-^%RW-e-3ZPW6Zr?DxBrRMVp*h%k`n}x+44x(hZnjGx z@)~r`&gp2|9NdG~#Y;cG=~jQ-s3p0_aqBJZxU~>0Zd3y)zWPzfw_bZ$WZwI0Nx~Vj zW9v*wiP(-JlU6EMi@Am!08T)$zgz$d4`1XdAiC!0Vna_+e220g2D(M$eEY-E6OYtg+K5_wS`!U)kD5hFC+_D6#lVWP4h7+oA1y*CQ{0-l6 z@=(yU_b&@WB4fI#7OO5&Ez`#)6b$YTn)311E z7m?NVn7F%YZ{f?9Hkn*w{rf&DfsR<)A_1X4C~$bh@^bg5Ac1vh86oGF{dU>GuMLJ= zOc!5{wbN%)j3#s^=gmw^Pe2#K$&Gf7g&7isnon( zo=jDREOrr9AKZpKcXo^7k6#`*pJVxZ33VL)Yj)F(oU$jjtH%0HuL@wY#hF7LR% zEnx?PBOH~tN_(S!iNr6|cf>eUix3PL$h)zU?+i|@9>`tV*VIJ91Zbn7F1vuULBwF6 zPm6$i&!e*Y3DdccM3ZE@sNwoq*1}-1WU%%UedoBfJz|ekw`4gzqEK1s)B~Hx)HATs zP2Aw3`&9yRV%69xD*nqFLO6`4)R*|1mTV6?ioC_KmXobLWJLZD>_zS;tHK4qv^yu* z2xMEf^I**MO5A`h>)jliqeN3ncx_5yVx?*|w5x5XWfAhVKALz)4ar{96{uZgEVdap zeLc|p|4Rqq5ohq8k4H0EzUFdl_SmL~$_9L1e6UoZW999gJ_q(qS|*j~ke~w{I7JOk z!$bprygjK0G9;XNpL5a;qbkfx^EJ&x|Cn4V<6z%`FofQOQ#;SLxk#~vY|xhVl>|99 zr2Kp(6%YbFx?JKht@xAf*7SEh9)BQ!=jK14R)KcR9Jx(`!cjJ(<(#8}(P3y2%nx?i z0>h4%!(s~G@7QM=V*8-dCGRtnI-rJU`fDnVAu#_ED60#dzUEz$2Jp*2b4ceB?V+F9 zFH=3AJQzc+L5;;dPN+1c>Ws)fFGexA*?GG8KG2b2lW4P=Lp^s8vFRQNQ|NNjNt{71 zLzn;$C0mrX%40nDqx8*dSkn{!ok@R<%BD4Rp*#T)qD8(Akzg=-#qAPZT1%2idqw{H zX{!J_?~N*HM;~2C!f`a&v(>BO{MCJ8INh|MuR-U-&70x*hb*2{mPUo`DU%u|7x{=j zXOG2JVz~sPlrK}w?AI*flNXd*8djZ*Sr7+{r0COW8iY~L-d>W%$q{!mOl!qxkqUS& zU^>zCpcpWHHvSH;5Ffi4naI9`Z^|YlM)x1kc0uYuiuds0g1#n!J2SgTJyRP8d=jUF z!zWE(?_Y71Ub#j7qe%-pS-#jt44uXII&&lB$7t%nd=m- z>8PK6*GR<}DYK>dp|umL(?giW+gfW<$)dR21jI&6rax|@glG&k`RgEwZf63-4e-5t zqkcroYvwU7gWs?C4=Omx`|2frM|Z;r2-3LU*(_Y_Bew_cV8i)7W zAtyaEEx+??8M*JD>DQyS|C&5MJpLm9ERd!9TdUkU{~HJ$aF)#Xkqb!|lc3;S_sa_Y+IV={zenK^jXfpx*alXkAym`kG*LxYf!t7< zfehZ-n67OVg+cjpaEtTW4FZVXY7ofWg?159Dk{)@R%*WX^-QM3Ao1mo{ckl^%cpv{ zX!0S3Mb{t0$eVbc8@5PphMqK_MpZuF9#rgLqP5EC;b|vLs-yHz-)a3jAL+aBlS*UDH)tN-V<-j0-Lqr! zWWv&N1U1=Sv1Sm7UycC!Uh7I;jXniV?X=%QEg`TWgc0t27`=Zs3*N~C)p3dqwQKq< zSo@=%+Kb1=!%V=PTW994a9F`(Z)xioJ+Kh49q9U17?>82;Wqfr-cFx+p`5k=j_;a6 zr0-leLh(Z=G8?bq$ZP_OF%N>(P$C(If;60_b@*L{Y(%w?4}@f0x09SeJDOZ*LliHY~Q2T-W%QufU!PjU!M#Yamrju*&OQo0mC{A z?|4LTN7`?{rz?^}2*cqI^$j4i6)Kn<;d`t2Zd#=pd#s6g2n#3LZmQD$XqOA#x)8vf zU~UxeBlcLdH8TGn7_u#aU=b`-+R@A#opJbrsGsj<{Me3+X_CS$WSGipuI<%3$45WL z6wmHbXcRK%C4|(2WyXx!w;8lcpw?Tq46BsA^INik`f5tp)Wxq#9vK~f(0E&rwjleA zPxYk6=C=bBL*7vx)5Hfs=YR-yCO+DI{;zC0-aX=nJuU?LK&j-Kr!Cq05Ddf-+Bp*N z7AOB%;Ht3<#nYz8w+9wcYd8f3bl~xVt|T`9B$E6|DNiYBQ@`)~K32v~?qrd$jlb(Z#4;MFeFl*+p+f3BPW0E%O*$^Cy!QA((#EeZI&pZ zH;$j!j=X4DAP!s`Yc958Y#h#6}klE|f!E@K$>HDCm^8O%iwKXsxz zn9uMq{R}Px(?9s)-n&o9AV3U$DTQ2#nuTVlz^4@FuApk=-OrQ{q@4OxuNUEo%wBwt zX{l*oc5+6J-PY!Rl07MQ+mUIvVosBKA1T2~M$V&zkS9%$h3)f z_Ii(GL>Op3D(~?S5Sq-IZRrU+j^cWFJ>&JMea7jyFY!F0NW5c97Y2qpF=FEk5xM7G z+QWxejJ`a=VaoglcSs^Hs%G%?zs1vSPSrbLE(LLx&|auIq2PJIytKqfR(90|dWaA3 zO$3N*J!Oj$49xr)|N05E%>}j#jkzk(33u_&6G_+eLpBwE>J`Sp4&yT@g7iY?AW%)^ zOaJQr<45tsa!&%9CZ~Tw&~@8)r+t5N!*xJvGvGWKBVj-jF*erKm8o-m=6PcFnwY$A zJs}l#1VHf6`y<8^CNdSy^j7MHxWa#qV}hHk{K7)yaeh9%H_)TpoYJUFC5 zm$%I7wO2DPvj)Zs7b|7FdTFFpx!G1#NCDz={-l%pY1-JiSjunpfXrP7xd0X45QKBm z24B-9Q^U!|u-!2K>#N%%-dh%laB0K&4(bcCO_9=Ad~Zm3M=J5zU^Y~bABm8Rl=Jb7{RyHBwme$fzF_IPPVRzV(`2S!fhma zNz2J(xLZ?AOk2pMVEEcMDbb8&XkYNp$W@T%M8tfa(KP@;O)k^;z@2KZ1)@r4f!^I8 zN9VPQ+BVyV(9RZof?_iQ5gh!0+Tf>k zKx>Jmehd(XVj7?Xb9x*?el%p2XtmCyNyqaZ!EuF|g6R4XoulQZI zbowjqLLX$Z=>`SiXL+9bAG=UOSo3T?nUEPgbCQlb6$2$MOmneQC|KkGjrmQa8WFy_ z%=-Xy21;dPGO-@>ziFZAGj)TjCof0oKUO43Iy)pg;0e;5f1(I_dyLO;{{Cm zXliW^sA>TS^hAdfTeXdCjKu#Efa#h?OrJLzN$ZGimIJFSASNBS{p{T|dH{w!2a=5o zPWh2@XLcLQ&O{%`H@q1|rl%RsOB>iBY#Lczt;nxnR&oI$1k*fu5B3ENBQFpA+JYCQ0b*N{syq+l9 zdX7>&!~H{#0-+fbh|GiuvwvfgsPe>LiLSrB%x(Ckf*>sg*4u+{3y{W%I3NS@ss-~j z7sBCAXzNkO)fj1JsRV`v{yR-B-9_$5FqbF%Xw9}OXv70l->*)VUzY5%?;gIu*B~5^<|VOx$tr@9a4qI$_ZsM*li{qvvH;sDwn_Ay zyyMQXs~*B(LlFcT4apfBvW;vda?kPRGE$w^^%c-n$dD+?m2G%9!;ki_`~pwS?9ktQ zY*kwDBE%rr56ngadW?Q|@GPx^@)1>eO}MSt+GxW(tz8P=@-r7?$|PpmxGwKE7W>=- z_6s{1!X|KA_kUc_>zW=ZER{MxEl9UUJ?oNBjP3uXh! z^ITouiQ+1{6#i)tD{67Ny`~wv=UwgJ{w(QzpMx^WT6Sx+$svyM9lRYxLs8;vP91%m zsJ4mFcTMB$H3s0S zv}JEy@Eih$PM8M+5;n&9@0SP%Ye|aq3PtEBBrc5~hWXIhvb8Iuo*9Lz`Tv&oCf@3l zKl_$bW2a=LFen2899f3mFLxXqod%URTL5*BqVkLHW(IELfOkwKfNx&L9oju4v}bRo zNGg8pvMRf+a`!#dx^dz?d+2b<{mpYm8zL!a{7s9wrp*-OM8332XQHM!J}Kwj!1eWk z&er21QV#KGKzHhi&?MI4SCrwlXzRu_yu)*qPU_n>TBUVvbbicYMoTygX#sZYiT0Bq zobEVu1ee}}mP*(|P*I;9oFM4WG4-iuxQhdKngdcD`0kwS3QzbxsjF?m0b0Jy$oOAro@5az`U}

    ;3Bv^0k&>l~HN$#E3Z}53KS_(If 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%0DTt-U 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�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ຫ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

    aZz$=`_SyMv@SAXAPReah1Gk`YMFVY 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

    6uO^~ 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 literal 0 HcmV?d00001 diff --git a/nym-connect-android/src/components/Growth/content/en.yaml b/nym-connect-android/src/components/Growth/content/en.yaml new file mode 100644 index 0000000000..849323e24e --- /dev/null +++ b/nym-connect-android/src/components/Growth/content/en.yaml @@ -0,0 +1,43 @@ +testAndEarn: + mainWindow: + button: + text: + default: Join Test&Earn + entered: Test&Earn + claim: Claim your reward + popup: + disconnected: Test&Earn is only available when connected. Please connect to any service provider. + help: + url: https://shipyard.nymtech.net/test-and-win + popupWindow: + title: NymConnect Test&Earn 🌈 + notifications: + takePart: + title: Thanks for taking part in Ter&Earn + body: Watch out for new tasks 👀 and take part to earn + youAreInDraw: + title: Thanks for completing the task ✨ + body: Post a message on Telegram, Discord or Twitter for a chance to to be selected 🤞 good luck + task: + afterText: Copy your reference number + beforeSocials: "And include it in your post to:" + draw: + next: + header: The next task starts + winner: + claimButton: + text: Claim your reward! + card: + header: You are a top contributor! + text: Congratulations, you have earned the reward for + status: + chip: + Pending: Good luck 🤞 + Winner: Rewarded! + Claimed: Claimed + NoWin: No rewards + text: + Pending: Task completed. Good luck 🤞 + Winner: Well done 🎉 + Claimed: You have claimed the reward 💰 + NoWin: Sorry you were not a top contributor, better luck next time! diff --git a/nym-connect-android/src/components/Growth/context/TestAndEarnContext.tsx b/nym-connect-android/src/components/Growth/context/TestAndEarnContext.tsx new file mode 100644 index 0000000000..a28fd221e2 --- /dev/null +++ b/nym-connect-android/src/components/Growth/context/TestAndEarnContext.tsx @@ -0,0 +1,272 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import React, { createContext, useCallback, useContext, useMemo, useState } from 'react'; +import { forage } from '@tauri-apps/tauri-forage'; +import { invoke } from '@tauri-apps/api'; +import { ClientId, DrawEntry, Draws, Registration } from './types'; +import { useClientContext } from '../../../context/main'; +import { ConnectionStatusKind } from '../../../types'; + +export type TTestAndEarnContext = { + loadedOnce: boolean; + loading: boolean; + clientDetails?: ClientId; + registration?: Registration; + walletAddress?: string; + draws?: Draws; + isWinnerWithUnclaimedPrize?: boolean; + isEnterWallet?: boolean; + error?: string; + setWalletAddress: (newWalletAddress: string) => void; + clearStorage: () => Promise; + toggleGrowthWindow: (windowTitle?: string) => Promise; + setAndStoreClientId: (newClientId: ClientId) => Promise; + setAndStoreRegistration: (registration: Registration) => Promise; + enterDraw: (drawId: string) => Promise; + claim: (drawId: string, walletAddress: string) => Promise; + refresh: () => Promise; +}; + +const defaultValue: TTestAndEarnContext = { + loadedOnce: false, + loading: true, + setWalletAddress: () => undefined, + clearStorage: async () => undefined, + toggleGrowthWindow: async () => undefined, + setAndStoreRegistration: async () => undefined, + setAndStoreClientId: async () => undefined, + enterDraw: async () => ({} as DrawEntry), + claim: async () => undefined, + refresh: async () => undefined, +}; + +export const TestAndEarnContext = createContext(defaultValue); + +const CLIENT_ID_KEY = 'tne_client_id'; +const REGISTRATION_KEY = 'tne_registration'; + +export const TestAndEarnContextProvider: FCWithChildren = ({ children }) => { + const clientContext = useClientContext(); + const [loadedOnce, setLoadedOnce] = useState(false); + const [loading, setLoading] = useState(true); + const [walletAddress, setWalletAddress] = useState(); + const [registration, setRegistration] = useState(); + const [clientDetails, setClientDetails] = useState(); + const [draws, setDraws] = useState(); + + const setAndStoreClientId = async (newClientId: ClientId) => { + await forage.setItem({ key: CLIENT_ID_KEY, value: newClientId } as any)(); + setClientDetails((prevState) => { + if ( + prevState?.client_id !== newClientId.client_id || + prevState?.client_id_signature !== newClientId.client_id_signature + ) { + console.log('Setting client details'); + return newClientId; + } + console.log('Skipping client details'); + return prevState; + }); + }; + const loadClientDetails = async () => { + const data: ClientId | undefined = await forage.getItem({ key: CLIENT_ID_KEY })(); + if (data) { + try { + setClientDetails((prevState) => { + if (prevState?.client_id !== data.client_id || prevState?.client_id_signature !== data.client_id_signature) { + console.log('Setting client details'); + return data; + } + console.log('Skipping client details'); + return prevState; + }); + } catch (e) { + console.error('Failed to get registration'); + } + } else { + const clientId: ClientId = await invoke('growth_tne_get_client_id'); + await setAndStoreClientId(clientId); + } + }; + + const loadRegistration = async () => { + const data: Registration | undefined = await forage.getItem({ key: REGISTRATION_KEY })(); + if (data) { + try { + setRegistration((prevState) => { + if ( + prevState?.timestamp !== data.timestamp || + prevState.client_id_signature !== data.client_id_signature || + prevState.id !== data.id + ) { + console.log('Setting registration'); + return data; + } + console.log('Skipping registration'); + return prevState; + }); + } catch (e) { + console.error('Failed to get registration'); + } + } + }; + + const loadDraws = React.useCallback(async () => { + setLoading(true); + let clientDetailsForDraws = clientDetails; + try { + if (!clientDetailsForDraws) { + console.log('[loadDraws] client details not set, trying to get...'); + clientDetailsForDraws = await invoke('growth_tne_get_client_id'); + } + + if (!clientDetailsForDraws) { + console.log('[loadDraws] failed to get client details not set, skipping...'); + setLoading(false); + setLoadedOnce(true); + return; + } + + const newDraws: Draws = await invoke('growth_tne_get_draws', { clientDetails: clientDetailsForDraws }); + console.log('[loadDraws] draws = ', newDraws); + + // find the entered draw and keep a reference + const entered = newDraws.draws.find((draw) => draw.draw_id === newDraws.current?.id); + if (newDraws.current) { + newDraws.current.entry = entered; + } + + console.log('[loadDraws] setting draws'); + setDraws(newDraws); + } catch (e) { + console.error('Could not get draws: ', e); + } + setLoading(false); + setLoadedOnce(true); + console.log('[loadDraws] done, loaded once'); + }, [clientDetails]); + + React.useEffect(() => { + loadClientDetails().catch(console.error); + loadRegistration().catch(console.error); + }, []); + + React.useEffect(() => { + if (registration && clientContext.connectionStatus === ConnectionStatusKind.connected) { + setTimeout(() => { + loadDraws().catch(console.error); + }, 1000 * 3); + } + }, [registration?.id, registration?.timestamp, clientContext.connectionStatus]); + + const refresh = React.useCallback(async () => { + console.log('Refreshing...'); + + console.log('Loading client details...'); + await loadClientDetails(); + + console.log('Loading registration...'); + await loadRegistration(); + + console.log('Loading draws...'); + await loadDraws(); + + console.log('Refresh complete.'); + }, [clientDetails]); + + const clearStorage = async () => { + await forage.setItem({ key: REGISTRATION_KEY, value: undefined })(); + }; + + const toggleGrowthWindow = useCallback(async (windowTitle?: string) => { + try { + await invoke('growth_tne_toggle_window', { windowTitle }); + } catch (e) { + console.error('Failed to toggle growth window', e); + } + }, []); + + const setAndStoreRegistration = async (newRegistration: Registration) => { + await forage.setItem({ key: REGISTRATION_KEY, value: newRegistration } as any)(); + setRegistration(newRegistration); + }; + + const enterDraw = async (drawId: string): Promise => { + if (!clientDetails) { + throw new Error('No client details set'); + } + if (!draws) { + throw new Error('No draws set'); + } + + const existingEntry: DrawEntry | undefined = draws.draws.filter((d) => d.draw_id === drawId)[0]; + if (existingEntry) { + throw new Error('Already entered into draw'); + } + + const entry: DrawEntry = await invoke('growth_tne_enter_draw', { clientDetails, drawId }); + console.log('Entered draw', { entry }); + + await loadDraws(); + + return entry; + }; + + const claim = async (drawId: string, newWalletAddress: string) => { + if (!clientDetails) { + throw new Error('No client details set'); + } + if (!draws) { + throw new Error('No draws set'); + } + if (!registration) { + throw new Error('No registration set'); + } + + const registrationId = registration.id; + + const args = { + registrationId, + clientDetails, + drawId, + walletAddress: newWalletAddress, + }; + console.log({ args }); + await invoke('growth_tne_submit_wallet_address', args); + + await loadDraws(); + }; + + const contextValue = useMemo( + () => ({ + loadedOnce, + loading, + clientDetails, + registration, + walletAddress, + draws, + clearStorage, + toggleGrowthWindow, + setWalletAddress, + setAndStoreClientId, + setAndStoreRegistration, + enterDraw, + refresh, + claim, + }), + [ + loadedOnce, + loading, + walletAddress, + registration, + refresh, + draws, + draws?.current?.last_modified, + draws?.current?.entry, + draws?.draws.length, + clientDetails, + ], + ); + return {children}; +}; + +export const useTestAndEarnContext = () => useContext(TestAndEarnContext); diff --git a/nym-connect-android/src/components/Growth/context/mocks/TestAndEarnContext.tsx b/nym-connect-android/src/components/Growth/context/mocks/TestAndEarnContext.tsx new file mode 100644 index 0000000000..b4388ddb72 --- /dev/null +++ b/nym-connect-android/src/components/Growth/context/mocks/TestAndEarnContext.tsx @@ -0,0 +1,262 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import React from 'react'; +import { DateTime } from 'luxon'; +import { TTestAndEarnContext, TestAndEarnContext } from '../TestAndEarnContext'; +import { DrawEntry, DrawEntryStatus, DrawWithWordOfTheDay } from '../types'; + +const methodDefaults = { + loadedOnce: true, + loading: false, + refresh: async () => undefined, + setAndStoreClientId: async () => undefined, + setAndStoreRegistration: async () => undefined, + clearStorage: async () => undefined, + toggleGrowthWindow: async () => undefined, + setWalletAddress: async () => undefined, + enterDraw: async () => ({} as DrawEntry), + claim: async () => undefined, +}; + +const mockValues_NotRegistered: TTestAndEarnContext = { + ...methodDefaults, +}; + +export const MockTestAndEarnProvider_NotRegistered: FCWithChildren = ({ children }) => ( + {children} +); + +export const testMarkdown = `**Create a sentence including "Nym" and one or more of the following words** *(in any language)*: + +- Privacy +- Pleasure +- Pineapple +- Mix +`; + +const mockValues_Registered: TTestAndEarnContext = { + ...methodDefaults, + registration: { + id: '1234', + client_id_signature: 'signature', + client_id: '5678', + timestamp: '2022-12-12T18:17:37.840Z', + }, +}; + +export const MockTestAndEarnProvider_Registered: FCWithChildren = ({ children }) => ( + {children} +); + +const allDraws: DrawEntry[] = [ + { + draw_id: '1111', + timestamp: DateTime.now().toISO(), + id: 'AAAA', + status: DrawEntryStatus.pending, + }, + { + draw_id: '2222', + timestamp: DateTime.now().toISO(), + id: 'BBBB', + status: DrawEntryStatus.noWin, + }, + { + draw_id: '2222', + timestamp: DateTime.now().toISO(), + id: 'BBBB', + status: DrawEntryStatus.claimed, + }, + { + draw_id: '2222', + timestamp: DateTime.now().toISO(), + id: 'BBBB', + status: DrawEntryStatus.winner, + }, +]; + +const draws: DrawEntry[] = [ + { + draw_id: '1111', + timestamp: DateTime.now().toISO(), + id: 'AAAA', + status: DrawEntryStatus.pending, + }, + { + draw_id: '2222', + timestamp: DateTime.now().toISO(), + id: 'BBBB', + status: DrawEntryStatus.noWin, + }, +]; + +const drawsWithWin: DrawEntry[] = [ + { + draw_id: '1111', + timestamp: DateTime.now().toISO(), + id: 'AAAA', + status: DrawEntryStatus.winner, + }, + { + draw_id: '2222', + timestamp: DateTime.now().toISO(), + id: 'BBBB', + status: DrawEntryStatus.noWin, + }, +]; + +const drawsWithClaim: DrawEntry[] = [ + { + draw_id: '1111', + timestamp: DateTime.now().toISO(), + id: 'AAAA', + status: DrawEntryStatus.claimed, + }, + { + draw_id: '2222', + timestamp: DateTime.now().toISO(), + id: 'BBBB', + status: DrawEntryStatus.noWin, + }, +]; + +const current: DrawWithWordOfTheDay = { + id: '1111', + start_utc: DateTime.now().toISO(), + end_utc: DateTime.now().plus({ day: 1 }).minus({ second: 25 }).toISO(), + last_modified: DateTime.now().toISO(), + word_of_the_day: testMarkdown, +}; + +const mockValues_RegisteredWithAllDrawsAndEntry: TTestAndEarnContext = { + ...mockValues_Registered, + draws: { + current: { + ...current, + }, + draws: allDraws, + }, +}; + +export const MockTestAndEarnProvider_RegisteredWithAllDraws: FCWithChildren = ({ children }) => ( + + {children} + +); + +const mockValues_RegisteredWithDrawsNoCurrent: TTestAndEarnContext = { + ...mockValues_Registered, + draws: { + draws: drawsWithClaim, + }, +}; + +export const MockTestAndEarnProvider_RegisteredWithDrawsNoCurrent: FCWithChildren = ({ children }) => ( + {children} +); + +const mockValues_RegisteredWithDraws: TTestAndEarnContext = { + ...mockValues_Registered, + draws: { + current, + draws, + }, +}; + +export const MockTestAndEarnProvider_RegisteredWithDraws: FCWithChildren = ({ children }) => ( + {children} +); + +const mockValues_RegisteredWithDrawsAndEntry: TTestAndEarnContext = { + ...mockValues_Registered, + draws: { + current: { + ...current, + entry: mockValues_RegisteredWithDraws.draws!.draws[0], + }, + draws, + }, +}; + +export const MockTestAndEarnProvider_RegisteredWithDrawsAndEntry: FCWithChildren = ({ children }) => ( + {children} +); + +const mockValues_RegisteredWithDrawsAndEntryAndWinner: TTestAndEarnContext = { + ...mockValues_Registered, + draws: { + current: { + ...current, + entry: drawsWithWin[0], + }, + draws: drawsWithWin, + }, + isWinnerWithUnclaimedPrize: true, +}; + +export const MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndWinner = ({ + children, +}: { + children: React.ReactNode; +}) => ( + + {children} + +); + +const mockValues_RegisteredWithDrawsAndEntryAndNoWinner: TTestAndEarnContext = { + ...mockValues_RegisteredWithDrawsAndEntry, + isWinnerWithUnclaimedPrize: false, +}; + +export const MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndNoWinner = ({ + children, +}: { + children: React.ReactNode; +}) => ( + + {children} + +); + +const mockValues_RegisteredWithDrawsAndEntryAndWinnerCollectWallet: TTestAndEarnContext = { + ...mockValues_Registered, + draws: { + draws: drawsWithWin, + }, +}; + +export const MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndWinnerCollectWallet = ({ + children, +}: { + children: React.ReactNode; +}) => ( + + {children} + +); + +const mockValues_RegisteredWithDrawsAndEntryAndWinnerClaimed: TTestAndEarnContext = { + ...mockValues_Registered, + draws: { + draws: drawsWithClaim, + }, +}; + +export const MockTestAndEarnProvider_RegisteredWithDrawsAndEntryAndWinnerClaimed = ({ + children, +}: { + children: React.ReactNode; +}) => ( + + {children} + +); + +const mockValues_RegisteredAndError: TTestAndEarnContext = { + ...mockValues_Registered, + error: 'Error message text will go here', +}; + +export const MockTestAndEarnProvider_RegisteredAndError: FCWithChildren = ({ children }) => ( + {children} +); diff --git a/nym-connect-android/src/components/Growth/context/types.ts b/nym-connect-android/src/components/Growth/context/types.ts new file mode 100644 index 0000000000..c7574b282f --- /dev/null +++ b/nym-connect-android/src/components/Growth/context/types.ts @@ -0,0 +1,64 @@ +export interface ClientId { + client_id: string; + client_id_signature: string; +} + +export interface Registration { + id: string; + client_id: string; + client_id_signature: string; + timestamp: string; +} + +export interface DrawEntryPartial { + draw_id: string; + client_id: string; + client_id_signature: string; +} + +export enum DrawEntryStatus { + pending = 'Pending', + winner = 'Winner', + noWin = 'NoWin', + claimed = 'Claimed', +} + +export interface DrawEntry { + id: string; + draw_id: string; + timestamp: string; + status: DrawEntryStatus; +} + +export interface DrawWithWordOfTheDay { + id: string; + start_utc: string; + end_utc: string; + word_of_the_day?: string; + last_modified: string; + entry?: DrawEntry; +} + +export interface ClaimPartial { + draw_id: string; + registration_id: string; + client_id: string; + client_id_signature: string; + wallet_address: string; +} + +export interface Winner { + id: string; + client_id: string; + draw_id: string; + timestamp: string; + winner_reg_id: string; + winner_wallet_address?: string; + winner_claim_timestamp?: string; +} + +export interface Draws { + current?: DrawWithWordOfTheDay; + next?: DrawWithWordOfTheDay; + draws: DrawEntry[]; +} diff --git a/nym-connect-android/src/components/HelpPage.tsx b/nym-connect-android/src/components/HelpPage.tsx new file mode 100644 index 0000000000..788f7264d5 --- /dev/null +++ b/nym-connect-android/src/components/HelpPage.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Stack, Typography } from '@mui/material'; +import { HelpPageActions } from './HelpPageActions'; +import { HelpImage } from './HelpPageImage'; +import { StepIndicator } from './HelpPageStepIndicator'; + +export const HelpPage = ({ + step, + description, + img, + onNext, + onPrev, +}: { + step: number; + description: string; + img: any; + onNext?: () => void; + onPrev?: () => void; +}) => ( + + + + + How to connect guide {step}/4 + + + {description} + + + + + +); diff --git a/nym-connect-android/src/components/HelpPageActions.tsx b/nym-connect-android/src/components/HelpPageActions.tsx new file mode 100644 index 0000000000..17e513120f --- /dev/null +++ b/nym-connect-android/src/components/HelpPageActions.tsx @@ -0,0 +1,20 @@ +import { ArrowBack, ArrowForward } from '@mui/icons-material'; +import { Box, Button } from '@mui/material'; +import React from 'react'; + +export const HelpPageActions = ({ onNext, onPrev }: { onNext?: () => void; onPrev?: () => void }) => ( + + {onPrev ? ( + + ) : ( +

    + )} + {onNext && ( + + )} + +); diff --git a/nym-connect-android/src/components/HelpPageImage.tsx b/nym-connect-android/src/components/HelpPageImage.tsx new file mode 100644 index 0000000000..27a8dcdca3 --- /dev/null +++ b/nym-connect-android/src/components/HelpPageImage.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export const HelpImage = ({ img, imageDescription }: { img: any; imageDescription: string }) => ( + {imageDescription} +); diff --git a/nym-connect-android/src/components/HelpPageStepIndicator.tsx b/nym-connect-android/src/components/HelpPageStepIndicator.tsx new file mode 100644 index 0000000000..b5dff42b34 --- /dev/null +++ b/nym-connect-android/src/components/HelpPageStepIndicator.tsx @@ -0,0 +1,15 @@ +import { Box } from '@mui/material'; +import React from 'react'; + +const Step = ({ highlight }: { highlight: boolean }) => ( + +); + +export const StepIndicator = ({ step }: { step: number }) => ( + + + = 2} /> + = 3} /> + = 4} /> + +); diff --git a/nym-connect-android/src/components/InfoModal.tsx b/nym-connect-android/src/components/InfoModal.tsx new file mode 100644 index 0000000000..ed628de7eb --- /dev/null +++ b/nym-connect-android/src/components/InfoModal.tsx @@ -0,0 +1,69 @@ +import { Close, ErrorOutline } from '@mui/icons-material'; +import { Box, IconButton, Modal, Theme, Typography } from '@mui/material'; +import React from 'react'; + +const styles = { + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 200, + bgcolor: '#292E34', + p: 1.5, + borderRadius: 0.5, + height: 'fit-content', + border: (theme: Theme) => `1px solid ${theme.palette.grey[700]}`, +}; + +const ModalTitle = ({ title, withCloseIcon }: { title: string; withCloseIcon: boolean }) => ( + + + + {title} + + +); + +const ModalBody = ({ description, children }: { description: string; children?: React.ReactElement }) => ( + + {children} + + {description} + + +); + +export const InfoModal = ({ + title, + description, + show, + children, + Action, + onClose, +}: { + title: string; + description: string; + show: boolean; + children?: React.ReactElement; + Action?: React.ReactNode; + onClose?: () => void; +}) => ( + + + {onClose && ( + + + + + + )} + + {children} + {Action && ( + + {Action} + + )} + + +); diff --git a/nym-connect-android/src/components/IpAddressAndPort.tsx b/nym-connect-android/src/components/IpAddressAndPort.tsx new file mode 100644 index 0000000000..4e7618ed87 --- /dev/null +++ b/nym-connect-android/src/components/IpAddressAndPort.tsx @@ -0,0 +1,97 @@ +import { Box, Stack, Tooltip, Typography } from '@mui/material'; +import React from 'react'; +import { styled } from '@mui/system'; +import { writeText } from '@tauri-apps/api/clipboard'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; + +const IpAddressAndPortContainer = styled('div')({ + '.hoverAddressCopy:hover': { + cursor: 'pointer', + textDecoration: 'underline', + textDecorationColor: '#FB6E4E', + textDecorationThickness: '2px', + textUnderlineOffset: '4px', + }, +}); + +export const IpAddressAndPort: FCWithChildren<{ + label: string; + ipAddress: string; + port: number; +}> = ({ label, ipAddress, port }) => { + const [ipAddressCopied, setIpAddressCopied] = React.useState(false); + const [portCopied, setPortCopied] = React.useState(false); + + React.useEffect(() => { + if (ipAddressCopied) { + setTimeout(() => setIpAddressCopied(false), 2000); + } + }, [ipAddressCopied]); + + React.useEffect(() => { + if (portCopied) { + setTimeout(() => setPortCopied(false), 2000); + } + }, [portCopied]); + + return ( + + + + {label} + + + Port + + + + + + SOCKS5 proxy hostname copied to the clipboard + + ) : ( + <>Click to copy SOCKS5 proxy hostname + ) + } + > + { + await writeText(`${ipAddress}`); + setIpAddressCopied(true); + }} + > + {ipAddress} + + + + + SOCKS5 proxy port copied to the clipboard + + ) : ( + <>Click to copy SOCKS5 proxy port + ) + } + > + { + await writeText(`${port}`); + setPortCopied(true); + }} + > + {port} + + + + + ); +}; diff --git a/nym-connect-android/src/components/IpAddressAndPortModal.tsx b/nym-connect-android/src/components/IpAddressAndPortModal.tsx new file mode 100644 index 0000000000..8ed6d51e20 --- /dev/null +++ b/nym-connect-android/src/components/IpAddressAndPortModal.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { Box, Button, Typography } from '@mui/material'; +import { InfoModal } from './InfoModal'; +import { CopyToClipboard } from './CopyToClipboard'; + +export const IpAddressAndPortModal = ({ + show, + ipAddress, + port, + onClose, +}: { + show: boolean; + ipAddress: string; + port: number; + onClose: () => void; +}) => ( + Done} + > + + + Socks5 address + + + {ipAddress} + + + + + Port + + + {port} + + + + +); diff --git a/nym-connect-android/src/components/LogViewer/index.tsx b/nym-connect-android/src/components/LogViewer/index.tsx new file mode 100644 index 0000000000..f2a9d2e6d0 --- /dev/null +++ b/nym-connect-android/src/components/LogViewer/index.tsx @@ -0,0 +1,97 @@ +import React, { FC, useEffect, useRef, useState } from 'react'; +import type { UnlistenFn } from '@tauri-apps/api/event'; +import { listen } from '@tauri-apps/api/event'; +import { Box, Paper, Chip, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material'; + +// see https://github.com/tauri-apps/tauri-plugin-log/blob/dev/webview-src/index.ts#L4 +enum LogLevel { + Trace = 1, + Debug, + Info, + Warn, + Error, +} + +const getLogLevelName = (value: LogLevel) => { + switch (value) { + case LogLevel.Trace: + return 'Trace'; + case LogLevel.Debug: + return 'Debug'; + case LogLevel.Info: + return 'Info'; + case LogLevel.Warn: + return 'Warn'; + case LogLevel.Error: + return 'Error'; + default: + return 'Unknown'; + } +}; + +// see https://github.com/tauri-apps/tauri-plugin-log/blob/dev/webview-src/index.ts#L147 +interface RecordPayload { + level: LogLevel; + message: string; +} + +export const LogViewer: FC = () => { + const unlisten = useRef(); + const messages = useRef([]); + const [messageCount, setMessageCount] = useState(0); + + useEffect(() => { + listen('log://log', (event) => { + console.log(event.payload); + const payload = event.payload as RecordPayload; + messages.current.unshift(payload); + setMessageCount((prev) => prev + 1); + }).then((fn) => { + unlisten.current = fn; + }); + + return () => { + if (unlisten.current) { + unlisten.current(); + } + }; + }, []); + + return ( + + + + + + + Severity + Log message + + + + {messages.current.map((m) => ( + + + + + {m.message} + + ))} + +
    +
    +
    + theme.palette.divider, + }} + > + {messageCount} log entries since opening this window + +
    + ); +}; diff --git a/nym-connect-android/src/components/NeedHelp.tsx b/nym-connect-android/src/components/NeedHelp.tsx new file mode 100644 index 0000000000..12d9587a5f --- /dev/null +++ b/nym-connect-android/src/components/NeedHelp.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { Box, Button, Typography } from '@mui/material'; +import HelpOutlineIcon from '@mui/icons-material/HelpOutline'; + +const HELP_URL = 'https://docs.nymtech.net'; + +export const NeedHelp: FCWithChildren = () => ( + + + +); diff --git a/nym-connect-android/src/components/ServiceProviderInfo.tsx b/nym-connect-android/src/components/ServiceProviderInfo.tsx new file mode 100644 index 0000000000..a6289b5c41 --- /dev/null +++ b/nym-connect-android/src/components/ServiceProviderInfo.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Divider, Stack, Typography } from '@mui/material'; +import { ServiceProvider } from 'src/types/directory'; + +export const ServiceProviderInfo = ({ serviceProvider }: { serviceProvider: ServiceProvider }) => ( + + + Connection info + + {serviceProvider.description} + + + Gateway {serviceProvider.gateway} + + + + Provider {serviceProvider.address.slice(0, 35)}... + + +); diff --git a/nym-connect-android/src/components/ServiceProviderPopup.tsx b/nym-connect-android/src/components/ServiceProviderPopup.tsx new file mode 100644 index 0000000000..660fee4134 --- /dev/null +++ b/nym-connect-android/src/components/ServiceProviderPopup.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Autocomplete, Box, Dialog, DialogProps, TextField, Typography } from '@mui/material'; +import { Service, ServiceProvider, Services } from '../types/directory'; + +export const ServiceProviderPopup: FCWithChildren< + DialogProps & { services: Services; onServiceProviderChanged: (sp?: ServiceProvider, s?: Service) => void } +> = ({ services, onServiceProviderChanged, ...dialogProps }) => { + const options = services.flatMap((s) => + s.items.map((sp) => ({ id: `${s.id}-${sp.id}`, title: sp.description, service: s, sp })), + ); + return ( + + + // filterOptions.filter((o) => o.title.toLowerCase().includes(inputValue.toLowerCase())) + // } + options={options} + groupBy={(option) => option.service.description} + getOptionLabel={(option) => option.title} + onChange={(event, value) => onServiceProviderChanged(value?.sp, value?.service)} + isOptionEqualToValue={(option, value) => option.id.toLowerCase() === value?.id.toLowerCase()} + renderOption={(props, option) => ( + img': { mr: 2, flexShrink: 0 } }} {...props} fontSize="small"> + + {option.id} + +

    {option.title}

    +
    + )} + renderInput={(params) => } + /> +
    + ); +}; diff --git a/nym-connect-android/src/components/ServiceProviderSelector.stories.tsx b/nym-connect-android/src/components/ServiceProviderSelector.stories.tsx new file mode 100644 index 0000000000..c7df76ea4a --- /dev/null +++ b/nym-connect-android/src/components/ServiceProviderSelector.stories.tsx @@ -0,0 +1,342 @@ +import * as React from 'react'; +import { ComponentMeta } from '@storybook/react'; +import { Box } from '@mui/material'; +import { ServiceProviderSelector } from './ServiceProviderSelector'; +import { Services } from '../types/directory'; + +export default { + title: 'Components/Service Provider Selector', + component: ServiceProviderSelector, +} as ComponentMeta; + +const width = 240; + +export const Loading = () => ( + + + +); + +const services: Services = JSON.parse(`[ + { + "id": "keybase", + "description": "Keybase", + "items": [ + { + "id": "nym-keybase", + "description": "Nym Keybase Service Provider", + "address": "Entztfv6Uaz2hpYHQJ6JKoaCTpDL5dja18SuQWVJAmmx.Cvhn9rBJw5Ay9wgHcbgCnVg89MPSV5s2muPV2YF1BXYu@Fo4f4SQLdoyoGkFae5TpVhRVoXCF8UiypLVGtGjujVPf", + "gateway": "Fo4f4SQLdoyoGkFae5TpVhRVoXCF8UiypLVGtGjujVPf" + }, + { + "id": "shipyard-keybase-1", + "description": "Nym Keybase Service Provider", + "address": "D55ksecHzY6vAeqk8MCTzCfj2pqwJeKCKZCUUGnwGnn3.FS42vXS5a6GNTb1qk3aVk5mjSiJCAuawbBVyQZZVfhvt@DfNMqQRy6pPkU8Z5rBsxRwzDUzAMXHPFwMhjF16ScZqn", + "gateway": "DfNMqQRy6pPkU8Z5rBsxRwzDUzAMXHPFwMhjF16ScZqn" + }, + { + "id": "shipyard-keybase-2", + "description": "Nym Keybase Service Provider", + "address": "DFdDtW7LNBATxQ4ef3jNbqs3cRE8b9wDZTCctHCQRULa.4AbKiTNVUwYFWHhy98o5pT9dELiUrkXoJQ9wHqPgf6GV@GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN", + "gateway": "GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN" + }, + { + "id": "shipyard-keybase-3", + "description": "Nym Keybase Service Provider", + "address": "6Y1HE1jJ92P9yoHer11TR4A2NdZePrLGaBNFf65MnYGe.FwXoh217odQDWNmViqzNX28fauYrjB3PYLrVvpqnQrX4@5vC8spDvw5VDQ8Zvd9fVvBhbUDv9jABR4cXzd4Kh5vz", + "gateway": "5vC8spDvw5VDQ8Zvd9fVvBhbUDv9jABR4cXzd4Kh5vz" + }, + { + "id": "shipyard-keybase-4", + "description": "Nym Keybase Service Provider", + "address": "3zzhLtWvaJgn755MkRckG5aRnoTZich8ASn395iSsTgj.J1R5VuxXbh2eNHiaRbrwbKGXrrEQcHKLdzf8eg9HTB6q@3B7PsbXFuqq6rerYFLw5HPbQb4UmBqAhfWURRovMmWoj", + "gateway": "3B7PsbXFuqq6rerYFLw5HPbQb4UmBqAhfWURRovMmWoj" + }, + { + "id": "shipyard-keybase-5", + "description": "Nym Keybase Service Provider", + "address": "CHuXdZJYQ8xH7ekgN9gAuVtQ7ZikjjHEZY5BSN7yc5mN.29dFvqicKQQQvoX1vup44mspmc249RH5xgLibWMwTYGT@CfWcDJq8QBz6cVAPCYSaLbaJEhVTmHEmyYgQ6C5GdDW9", + "gateway": "CfWcDJq8QBz6cVAPCYSaLbaJEhVTmHEmyYgQ6C5GdDW9" + } + ] + }, + { + "id": "electrum", + "description": "Electrum Wallet", + "items": [ + { + "id": "nym-electrum", + "description": "Nym Electrum Service Provider", + "address": "DpB3cHAchJiNBQi5FrZx2csXb1mrHkpYh9Wzf8Rjsuko.ANNWrvHqMYuertHGHUrZdBntQhpzfbWekB39qez9U2Vx@2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh", + "gateway": "2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh" + }, + { + "id": "shipyard-electrum-1", + "description": "Nym Electrum Service Provider", + "address": "8Tb73cFQpXCLpgxEA2VSDru2hHrcZ3KQcyMsGbxcTjBp.4x5tu66k8YkHk4tYac1qwEFbNq5WsKiX5kR51q5KKH88@4WgKhJdmUffz4e1o1ftVAGS3HnG56LiNAxA9dmaekrVd", + "gateway": "4WgKhJdmUffz4e1o1ftVAGS3HnG56LiNAxA9dmaekrVd" + }, + { + "id": "shipyard-electrum-2", + "description": "Nym Electrum Service Provider", + "address": "GR6z31MwCsvxHrnvvVN1Cpasd8aQ1giwQqPTZM9dN7VH.5rEiqakSPDrBtKmvpU8Shnhz6gRM85JLoB7AX4h7PJYr@5Ao1J38frnU9Rx5YVeF5BWExcnDTcW8etNe9W2sRASXD", + "gateway": "5Ao1J38frnU9Rx5YVeF5BWExcnDTcW8etNe9W2sRASXD" + } + ] + }, + { + "id": "telegram", + "description": "Telegram", + "items": [ + { + "id": "shipyard-telegram-2", + "description": "Nym Telegram Service Provider", + "address": "C4w6ewbQtoaZEeoaaNw1xVASChqo4WVjNfuYEUFjZxpc.8F1D7rQXf2jGoj1Ken7PiGDM8HS2Ug79wSoc9nZ1iqh1@62F81C9GrHDRja9WCqozemRFSzFPMecY85MbGwn6efve", + "gateway": "62F81C9GrHDRja9WCqozemRFSzFPMecY85MbGwn6efve" + }, + { + "id": "shipyard-telegram-3", + "description": "Nym Telegram Service Provider", + "address": "DStL3BEUZuQZfbij1KAY3BvJh8rC5jpr9mc6AQ6aTLUu.Ax9foYaKfFgX6g8y393GoNpKkKrnDGFGRZwxDv9R7X6M@FQon7UwF5knbUr2jf6jHhmNLbJnMreck1eUcVH59kxYE", + "gateway": "FQon7UwF5knbUr2jf6jHhmNLbJnMreck1eUcVH59kxYE" + }, + { + "id": "shipyard-telegram-4", + "description": "Nym Telegram Service Provider", + "address": "8gRdGTzsDxYzpasRQhsRg59MCgNNhnfag2oFfwwZPXnB.DtDrGz7ScVm4o7sN4K3CYUJveYgz7fcXELBVLNDfMS9Y@3ojQD6V7skM1bSXJX7fVQvscjmcgptzdixQEaAha2ixh", + "gateway": "3ojQD6V7skM1bSXJX7fVQvscjmcgptzdixQEaAha2ixh" + }, + { + "id": "shipyard-telegram-5", + "description": "Nym Telegram Service Provider", + "address": "AR3oEM6Uvmfs6fyddwSehoBUKCFxz7MdFi4z7aahuHuY.3ZKapg9A3Py1PXhyLbCJr8ZbJsEV6NZdN1WJaGGut5tj@EEyq16v63aotPBCepxUpCgAojrNasZ6Hk1PjpRyBAdEp", + "gateway": "EEyq16v63aotPBCepxUpCgAojrNasZ6Hk1PjpRyBAdEp" + }, + { + "id": "shipyard-telegram-6", + "description": "Nym Telegram Service Provider", + "address": "7n1BYhsXSwcr8Qim8AqZTAodqFia4QG6T7CRc1ihQHpv.7o4trpGqu2LHMUiXc3dddgfGET1CFFcAK9gKYoHoSn5e@BTZNB3bkkEePsT14GN8ofVtM1SJae4YLWjpBerrKYfr", + "gateway": "BTZNB3bkkEePsT14GN8ofVtM1SJae4YLWjpBerrKYfr" + }, + { + "id": "shipyard-telegram-7", + "description": "Nym Telegram Service Provider", + "address": "Gv4TWhUKrvJfqh1jBRPGEQrikNZvZse2kS3ZgN9Z2nAZ.7KGPaaqUEum2C59jLvw7f8Ug8a48YuZdjjZu3t4JES4U@C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi", + "gateway": "C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi" + }, + { + "id": "shipyard-telegram-8", + "description": "Nym Telegram Service Provider", + "address": "8Mqgp12cpF6FSXMeqzxgFgQXvTSapyNqGAi5wy7ub4ge.7z7PDsiJGiGxGz4p77v5L5fZhXBJ5qNZ8CgJwYNr6H6J", + "gateway": "3zd3wrCK8Dz5TXrcvk5dG5s9EEdf4Ck1v9VgBPMMFVkR" + }, + { + "id": "shipyard-telegram-9", + "description": "Nym Telegram Service Provider", + "address": "F3N5eiPDZcGFC985Go4Mpv8p9uxFD1L3jRUdrLCbrZLm.EyTxWwwTwYpPrJBmc97GLd1LpUAphjptS5y1ed182bGk@GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ", + "gateway": "GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ" + }, + { + "id": "shipyard-telegram-10", + "description": "Nym Telegram Service Provider", + "address": "G7y7e1nVBr8fmQSzdeAxXnCmmmJb5k8N3E8LBV31KE5g.GRRUCj6t6cCUUjakmTWzidMLiYA7EdCedKnup8osaBC6@AJad2R9virYEYXEsTcicN5y5tyPoixrhhAGsxoESZVnc", + "gateway": "AJad2R9virYEYXEsTcicN5y5tyPoixrhhAGsxoESZVnc" + }, + { + "id": "shipyard-telegram-11", + "description": "Nym Telegram Service Provider", + "address": "2kq9Z7RyDZtb8kxXjyP3ZT8VMWHg6JXFDChGuuNBk7Hw.F5XYbBaGSoF8qAo8faPcaNRPHEq3Y25BDcwESeabUS9S@HaLyPQrhBTq75dnGeBUdYWeFVA2BBn39MgkhEt3VTMMM", + "gateway": "HaLyPQrhBTq75dnGeBUdYWeFVA2BBn39MgkhEt3VTMMM" + }, + { + "id": "shipyard-telegram-12", + "description": "Nym Telegram Service Provider", + "address": "GegdtpNzYj4QCgpih9Kxv7ZVZxmVdxYHsDkiPsbT71XG.E8xtE8mrapjzFtyuziZSrsScAKhwZMH5wNpKWtKfzJ5Y@9Byd9VAtyYMnbVAcqdoQxJnq76XEg2dbxbiF5Aa5Jj9J", + "gateway": "9Byd9VAtyYMnbVAcqdoQxJnq76XEg2dbxbiF5Aa5Jj9J" + }, + { + "id": "shipyard-telegram-13", + "description": "Nym Telegram Service Provider", + "address": "4SsrDQeEtG3mpeD9nN5CDdGaCsxFvNeYMhoviDzNNB9f.GyqG6iK5rBvhe3HXLR11m6ULpf13ATgYvkkidLmteDLs@5EpkkrMFYAM3XcaztXnZwBWquURHSKsyc9JxUCengDFS", + "gateway": "5EpkkrMFYAM3XcaztXnZwBWquURHSKsyc9JxUCengDFS" + }, + { + "id": "shipyard-telegram-14", + "description": "Nym Telegram Service Provider", + "address": "9JoHRu2RrSD1fjbj9NSTASgjv9Szep7Nhd9L2PywxbBi.AZhAUDNX6iH8BqXyR5c7TJuzpwMEvDXrabNLGuRukvVf@9xJM74FwwHhEKKJHihD21QSZnHM2QBRMoFx9Wst6qNBS", + "gateway": "9xJM74FwwHhEKKJHihD21QSZnHM2QBRMoFx9Wst6qNBS" + }, + { + "id": "shipyard-telegram-15", + "description": "Nym Telegram Service Provider", + "address": "3K174ijjXqCkhMDT9xLcqjS4MXk2QsqZt4PdgNcuUrnn.BNnHnQmWoj6Uo6kkS1QkPqsdHaXrcwyR9F6MnnzDkZJL@C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi", + "gateway": "C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi" + }, + { + "id": "shipyard-telegram-16", + "description": "Nym Telegram Service Provider", + "address": "BqX5Q3MEcbTnM39hUswQchLW68SrqbhL8K5ucrLmtP39.AWrVsFoVC9s6KjdpcasATmZPA3GtMsUxcfHpAkuNdtFG@Emswx6KXyjRfq1c2k4d4uD2e6nBSbH1biorCZUei8UNS", + "gateway": "Emswx6KXyjRfq1c2k4d4uD2e6nBSbH1biorCZUei8UNS" + }, + { + "id": "shipyard-telegram-17", + "description": "Nym Telegram Service Provider", + "address": "2tQxccgcqdkuUvLqgiEkEN4rNRZ5QknygnKAFcS4gfoe.EVrY5q5sqDqBUbS3wHsRRZhk2MAw1S17hNoH1Bicyv7n@DAGQxdxwAkwjaLjTw1B9vndia4YyFD15qRgcTQxrmkom", + "gateway": "DAGQxdxwAkwjaLjTw1B9vndia4YyFD15qRgcTQxrmkom" + }, + { + "id": "shipyard-telegram-18", + "description": "Nym Telegram Service Provider", + "address": "8YG1rcEauJA814Nd7hSxjNe2UrRwrGsrXTm1Cmd3gRrU.FxYaYqpNN8PciNsySs3zYPrTB1J8AYUu9DBsM2vVDDfF@7EfEESLo71GUvx3UEW79LgTegHUBPUocUzGyJVv6LHog", + "gateway": "7EfEESLo71GUvx3UEW79LgTegHUBPUocUzGyJVv6LHog" + }, + { + "id": "shipyard-telegram-19", + "description": "Nym Telegram Service Provider", + "address": "HPiXADVFLwLQPNpPtyYefzvYntC6tp9UJ5fJZGfkqvDt.2EUUxmeT3AiaUzAcE5SyXRAk8a2JXBkRz4B8McSdkrST@9ACTkYraCqE9jMb6zb6ne8EDQGGhZw5ykNiq9YRUdHTD", + "gateway": "9ACTkYraCqE9jMb6zb6ne8EDQGGhZw5ykNiq9YRUdHTD" + }, + { + "id": "shipyard-telegram-20", + "description": "Nym Telegram Service Provider", + "address": "2QLnEEnTmf2NRWtcQPWBeRcg7Hej5WSPWRWwtTpEEZWF.BheS78ozc8ngvhsXNNnshdJzpoYsmEvhfn3WKUYF5dRU@C2uyokSPoxhku9GexRxEo1e8KPZ7q6e8FXmK3gtY8kkF", + "gateway": "C2uyokSPoxhku9GexRxEo1e8KPZ7q6e8FXmK3gtY8kkF" + }, + { + "id": "shipyard-telegram-21", + "description": "Nym Telegram Service Provider", + "address": "FuBbnwiANfaXZnn683jBapK5XVm5ttgZSykU3vqPSHoD.94MFGv1VcBLTkRwzBDQUkWjvqtZYVBrJg2Q8JGbizcib@CTqYPY8htdAQMXCzRW9SjZzZuqYwSt2iUh6HPaNgmTvK", + "gateway": "CTqYPY8htdAQMXCzRW9SjZzZuqYwSt2iUh6HPaNgmTvK" + }, + { + "id": "shipyard-telegram-22", + "description": "Nym Telegram Service Provider", + "address": "9EbQx5jQznSVbftFom7sqUSHAACrsfvMhrzhaFt4A3SZ.D1FQCirL4YKwfcmtMGvB5Rugt5sAzGEhdSjJ3bHVQRZ@7Zh1Sz5dXpA6s53CbtcdqhQhLqwf4cLynL7KqHKcjrG4", + "gateway": "7Zh1Sz5dXpA6s53CbtcdqhQhLqwf4cLynL7KqHKcjrG4" + }, + { + "id": "shipyard-telegram-24", + "description": "Nym Telegram Service Provider", + "address": "6Umawwvf551VyB3Ko46NgKLqJdTFJeToCM67mrTmM3G.3A4sesBac4KGuMTFjvYBwLpksMJvbMbteGJQgmm4PV4Y@AnnYnEtBjB2a5sHmeRCnBq43qxyHDf95Bqd7cwQyKNLR", + "gateway": "AnnYnEtBjB2a5sHmeRCnBq43qxyHDf95Bqd7cwQyKNLR" + }, + { + "id": "shipyard-telegram-25", + "description": "Nym Telegram Service Provider", + "address": "CDtxTeoyqq83JpV9G8cR5HRHRdMMaVspQsCwH3Qnajt3.F5EHK9HFcdGrE2hqA7bK9AUmkbihujYDhtNNqHKxW765@BDkeNx7JQm5NsQakst9s8htogZXhpTQedFAgZpvsGCqH", + "gateway": "BDkeNx7JQm5NsQakst9s8htogZXhpTQedFAgZpvsGCqH" + }, + { + "id": "shipyard-telegram-26", + "description": "Nym Telegram Service Provider", + "address": "HukZkLG2DoarQEqaoDLuqW1GFf2NSHDUMGBZiyJGRYJD.9GyU8wPsyzcvRjcyk8hiNpTJbXCmq5F3VoVhFBZYuHR3@GsGEZiDBz8SWfHGaK5SDmhfbTEM55v37WCYYcT9wTSxN", + "gateway": "GsGEZiDBz8SWfHGaK5SDmhfbTEM55v37WCYYcT9wTSxN" + }, + { + "id": "shipyard-telegram-27", + "description": "Nym Telegram Service Provider", + "address": "773y8iMVJiRk4dRbjQzkJVbrei4TwkePNE5WTEttt77d.3Mw47C9XZj3oAzk1iSqC5Y36tbBsjtaTtdgaHM3Zsdma@7fiZtNL1RACQTwGrKLBT9nbY77bfwZnX9rqcWqc53qgv", + "gateway": "7fiZtNL1RACQTwGrKLBT9nbY77bfwZnX9rqcWqc53qgv" + }, + { + "id": "shipyard-telegram-28", + "description": "Nym Telegram Service Provider", + "address": "6jQJEorCu7YiP9HdDaMeHxcNhxeNmZ1kpd836GnqLZX.HsJqEmNTszGecsKqFB37i84nBXxqf4ETgrKmKmBvMGHC@FYnDMQzT49ZGM23gVqpTxfih14V6wuedNXirekmt37zE", + "gateway": "FYnDMQzT49ZGM23gVqpTxfih14V6wuedNXirekmt37zE" + }, + { + "id": "shipyard-telegram-29", + "description": "Nym Telegram Service Provider", + "address": "BiCSyovpFMuSnTvF2TdiuZwrytXDrd9AH47ZMcCxscVC.G9YpdicA9BBNoVHDgjWjgt17wv5WYKWcbE3vPJJVpSJD@GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ", + "gateway":"GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ" + }, + { + "id": "shipyard-telegram-30", + "description": "Nym Telegram Service Provider", + "address": "AQRRAs9oc8QWXAFBs44YhCKUny7AyLsfLy91pwmGgxuf.CWUKoKA1afSKyw5BnFJJg19UDgnaVATupsFhQpyTEBHJ@EBT8jTD8o4tKng2NXrrcrzVhJiBnKpT1bJy5CMeArt2w", + "gateway": "EBT8jTD8o4tKng2NXrrcrzVhJiBnKpT1bJy5CMeArt2w" + }, + { + "id": "shipyard-telegram-31", + "description": "Nym Telegram Service Provider", + "address": "6YqjAZK3Pr1ngiBLcDkotboB5WiN6k6NPpbXvShH4pR5.9Ss6VW3Xbyi8LuxduNNwnXEv9njHCQ2PLSP1UK6tsoa5@42XCK9dMS9m5XJLzQd2dBuwimk6ndZnczhZaV5VPFkQD", + "gateway": "42XCK9dMS9m5XJLzQd2dBuwimk6ndZnczhZaV5VPFkQD" + }, + { + "id": "shipyard-telegram-32", + "description": "Nym Telegram Service Provider", + "address": "EmYWLeybmj86Vzr62vxuZ3T15jwMNHggzK7sQwid96yp.GyaF9WprSr56cxUdGf5TpcUvAjb2VbAr8CVBrmBUYAaw@GL5wESoz4oSbpBaTki9qB9213FGUQXCiRjbzDkhWwoBC", + "gateway": "GL5wESoz4oSbpBaTki9qB9213FGUQXCiRjbzDkhWwoBC" + }, + { + "id": "shipyard-telegram-33", + "description": "Nym Telegram Service Provider", + "address": "4PDb96cck5btTj6G7rsomqwHJsp4qu8uPvFCbwHfjFUx.C5dKbaoakH7egsZvAueRbwLFbmxnQaVMeSr6QTMpuBAA@58ceEFaLJh6zAo3cirzT1BDQm7D3L5acnQrxGH1D6TAY", + "gateway": "58ceEFaLJh6zAo3cirzT1BDQm7D3L5acnQrxGH1D6TAY" + }, + { + "id": "shipyard-telegram-34", + "description": "Nym Telegram Service Provider", + "address": "BeZbeMf9vcpUf368qDd85dtLwXLj4Ee5bsHMB2fUD8uX.HELVbppkwU1jmzUAUrCEbHeJfVciSeo8VGAkbJSpwxsb@ADdHkiTfkpsSt31zVToWW9j3KikH24aLAAwDKtCYE5jY", + "gateway":"ADdHkiTfkpsSt31zVToWW9j3KikH24aLAAwDKtCYE5jY" + }, + { + "id": "shipyard-telegram-35", + "description": "Nym Telegram Service Provider", + "address": "Bp4JRFyf7GB9L9J95AqMPnz9zbGmPnViA5fDXKeNraLJ.D6CTdcjJVxDmH2UQvzXuPWg9Se9xXYe76uDMypXvhzd7@6UjGEeQZK14C5K2kenycTkqt7qRjEHGLgaQx3FWySo3N", + "gateway": "6UjGEeQZK14C5K2kenycTkqt7qRjEHGLgaQx3FWySo3N" + }, + { + "id": "shipyard-telegram-36", + "description": "Nym Telegram Service Provider", + "address": "91h7io6BGhVjbtC7dbbRcScyTJcTfnMsTQZ6aWMVsrWR.Epb4hANXCp8cGEY3wSgawux991ti9Z5Y1FHTMzAKFa6E@DF4TE7V8kJkttMvnoSVGnRFFRt6WYGxxiC2w1XyPQnHe", + "gateway": "DF4TE7V8kJkttMvnoSVGnRFFRt6WYGxxiC2w1XyPQnHe" + }, + { + "id": "shipyard-telegram-37", + "description": "Nym Telegram Service Provider", + "address": "Cy2wuwKpWZ3iWzKU3ZWL1qqcVfJ5Cq85dU7UHVWwv2gc.9AhC9b2zVcLnXLGriMdxjpsWJpq6iAdCavDi63udbL89@678qVUJ21uwxZBhp3r56z7GRf6gMh3NYDHruTegPtgMf", + "gateway": "678qVUJ21uwxZBhp3r56z7GRf6gMh3NYDHruTegPtgMf" + }, + { + "id": "shipyard-telegram-38", + "description": "Nym Telegram Service Provider", + "address": "GgUeUWW1NRSuquZYeZf3WkppE92EQUHJrFjNZtYU1jow.CSEjwrRi4f4uyw7N6L2LPKw2tB8spcMbFu99wHZzFZSj@77TSuVU8d1oXKbPzjec2xh4i3Wj5WwUyy9Lr36sm8gZm", + "gateway": "77TSuVU8d1oXKbPzjec2xh4i3Wj5WwUyy9Lr36sm8gZm" + }, + { + "id": "shipyard-telegram-39", + "description": "Nym Telegram Service Provider", + "address": "kz4zWwSkYiQxqxXFPNcGUByTPQWXascD9RfYsmSxY7n.ajp3SjbBVBjrU9nXpSQXAXzbb6EHJJyhbY6cc1ajayx@BTZNB3bkkEePsT14GN8ofVtM1SJae4YLWjpBerrKYf", + "gateway": "HyS2UZtZX3kQXdazbdE99DhCjBXjbG61LC9QsmXwbxrU" + } + ] + }, + { + "id": "blockstream", + "description": "Blockstream Green", + "items": [ + { + "id": "nym-blockstream", + "description": "Nym Blockstream Green Service Provider", + "address": "GiRjFWrMxt58pEMuusm4yT3RxoMD1MMPrR9M2N4VWRJP.3CNZBPq4vg7v7qozjGjdPMXcvDmkbWPCgbGCjQVw9n6Z@2xU4CBE6QiiYt6EyBXSALwxkNvM7gqJfjHXaMkjiFmYW", + "gateway": "2xU4CBE6QiiYt6EyBXSALwxkNvM7gqJfjHXaMkjiFmYW" + } + ] + } +]`); +export const Loaded = () => ( + + + +); + +export const ServiceAlreadySelected = () => ( + + console.log('New service provider selected: ', serviceProvider)} + /> + +); diff --git a/nym-connect-android/src/components/ServiceProviderSelector.tsx b/nym-connect-android/src/components/ServiceProviderSelector.tsx new file mode 100644 index 0000000000..741465dac4 --- /dev/null +++ b/nym-connect-android/src/components/ServiceProviderSelector.tsx @@ -0,0 +1,147 @@ +import React, { useEffect, useMemo } from 'react'; +import { Box, CircularProgress, MenuItem, Stack, TextField, Tooltip, Typography } from '@mui/material'; +import { Service, ServiceProvider, Services } from '../types/directory'; +import { useTauriEvents } from '../utils'; + +type ServiceWithRandomSp = { + id: string; + description: string; + sp: ServiceProvider; +}; + +const defaultServiceValue = { id: '', description: '', items: [] }; + +export const ServiceProviderSelector: FCWithChildren<{ + onChange?: (serviceProvider?: ServiceProvider) => void; + services?: Services; + currentSp?: ServiceProvider; +}> = ({ services, currentSp, onChange }) => { + const [service, setService] = React.useState(defaultServiceValue); + const [serviceProvider, setServiceProvider] = React.useState(currentSp); + const [resetTrigger, setResetTrigger] = React.useState(new Date().toISOString()); + + const handleSelectSp = (newServiceProvider?: ServiceProvider) => { + if (newServiceProvider && newServiceProvider !== currentSp) { + setServiceProvider(newServiceProvider); + onChange?.(newServiceProvider); + } + }; + + // when the user clears local storage, reset the selector + useTauriEvents('help://clear-storage', () => { + setService(defaultServiceValue); + setServiceProvider(undefined); + onChange?.(undefined); + setResetTrigger(new Date().toISOString()); + }); + + useEffect(() => { + if (!serviceProvider && currentSp) { + setServiceProvider(currentSp); + } + }, [currentSp]); + + useEffect(() => { + if (services && serviceProvider) { + // retrieve the service corresponding to this service provider + + const match = services.find((s) => + s.items.some( + ({ id, address, gateway }) => + id === serviceProvider.id && address === serviceProvider.address && gateway === serviceProvider.gateway, + ), + ); + + if (match) { + setService(match); + } + } + }, [serviceProvider, services]); + + if (!services) { + return ( + + theme.palette.common.white}> + + Loading services... + + + ); + } + + const servicesWithRandomSp: ServiceWithRandomSp[] = useMemo( + () => + services.map(({ id, items, description }) => ({ + id, + description, + sp: items[Math.floor(Math.random() * items.length)], + })), + [services, resetTrigger], + ); + + if (!service) return null; + + return ( + + + {servicesWithRandomSp.map(({ id, description, sp }) => ( + handleSelectSp(sp)}> + + + {sp.id} + + + {sp.description} + + + Gateway {sp.gateway.slice(0, 10)}... + + + Provider {sp.address.slice(0, 10)}... + + + } + arrow + placement="top" + > + {description} + + + ))} + + + ); +}; diff --git a/nym-connect-android/src/components/ServiceSelector.stories.tsx b/nym-connect-android/src/components/ServiceSelector.stories.tsx new file mode 100644 index 0000000000..56be7c19ee --- /dev/null +++ b/nym-connect-android/src/components/ServiceSelector.stories.tsx @@ -0,0 +1,342 @@ +import * as React from 'react'; +import { ComponentMeta } from '@storybook/react'; +import { Box } from '@mui/material'; +import { ServiceSelector } from './ServiceSelector'; +import { Services } from '../types/directory'; + +export default { + title: 'Components/Service Selector', + component: ServiceSelector, +} as ComponentMeta; + +const width = 240; + +export const Loading = () => ( + + + +); + +const services: Services = JSON.parse(`[ + { + "id": "keybase", + "description": "Keybase", + "items": [ + { + "id": "nym-keybase", + "description": "Nym Keybase Service Provider", + "address": "Entztfv6Uaz2hpYHQJ6JKoaCTpDL5dja18SuQWVJAmmx.Cvhn9rBJw5Ay9wgHcbgCnVg89MPSV5s2muPV2YF1BXYu@Fo4f4SQLdoyoGkFae5TpVhRVoXCF8UiypLVGtGjujVPf", + "gateway": "Fo4f4SQLdoyoGkFae5TpVhRVoXCF8UiypLVGtGjujVPf" + }, + { + "id": "shipyard-keybase-1", + "description": "Nym Keybase Service Provider", + "address": "D55ksecHzY6vAeqk8MCTzCfj2pqwJeKCKZCUUGnwGnn3.FS42vXS5a6GNTb1qk3aVk5mjSiJCAuawbBVyQZZVfhvt@DfNMqQRy6pPkU8Z5rBsxRwzDUzAMXHPFwMhjF16ScZqn", + "gateway": "DfNMqQRy6pPkU8Z5rBsxRwzDUzAMXHPFwMhjF16ScZqn" + }, + { + "id": "shipyard-keybase-2", + "description": "Nym Keybase Service Provider", + "address": "DFdDtW7LNBATxQ4ef3jNbqs3cRE8b9wDZTCctHCQRULa.4AbKiTNVUwYFWHhy98o5pT9dELiUrkXoJQ9wHqPgf6GV@GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN", + "gateway": "GJqd3ZxpXWSNxTfx7B1pPtswpetH4LnJdFeLeuY5KUuN" + }, + { + "id": "shipyard-keybase-3", + "description": "Nym Keybase Service Provider", + "address": "6Y1HE1jJ92P9yoHer11TR4A2NdZePrLGaBNFf65MnYGe.FwXoh217odQDWNmViqzNX28fauYrjB3PYLrVvpqnQrX4@5vC8spDvw5VDQ8Zvd9fVvBhbUDv9jABR4cXzd4Kh5vz", + "gateway": "5vC8spDvw5VDQ8Zvd9fVvBhbUDv9jABR4cXzd4Kh5vz" + }, + { + "id": "shipyard-keybase-4", + "description": "Nym Keybase Service Provider", + "address": "3zzhLtWvaJgn755MkRckG5aRnoTZich8ASn395iSsTgj.J1R5VuxXbh2eNHiaRbrwbKGXrrEQcHKLdzf8eg9HTB6q@3B7PsbXFuqq6rerYFLw5HPbQb4UmBqAhfWURRovMmWoj", + "gateway": "3B7PsbXFuqq6rerYFLw5HPbQb4UmBqAhfWURRovMmWoj" + }, + { + "id": "shipyard-keybase-5", + "description": "Nym Keybase Service Provider", + "address": "CHuXdZJYQ8xH7ekgN9gAuVtQ7ZikjjHEZY5BSN7yc5mN.29dFvqicKQQQvoX1vup44mspmc249RH5xgLibWMwTYGT@CfWcDJq8QBz6cVAPCYSaLbaJEhVTmHEmyYgQ6C5GdDW9", + "gateway": "CfWcDJq8QBz6cVAPCYSaLbaJEhVTmHEmyYgQ6C5GdDW9" + } + ] + }, + { + "id": "electrum", + "description": "Electrum Wallet", + "items": [ + { + "id": "nym-electrum", + "description": "Nym Electrum Service Provider", + "address": "DpB3cHAchJiNBQi5FrZx2csXb1mrHkpYh9Wzf8Rjsuko.ANNWrvHqMYuertHGHUrZdBntQhpzfbWekB39qez9U2Vx@2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh", + "gateway": "2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh" + }, + { + "id": "shipyard-electrum-1", + "description": "Nym Electrum Service Provider", + "address": "8Tb73cFQpXCLpgxEA2VSDru2hHrcZ3KQcyMsGbxcTjBp.4x5tu66k8YkHk4tYac1qwEFbNq5WsKiX5kR51q5KKH88@4WgKhJdmUffz4e1o1ftVAGS3HnG56LiNAxA9dmaekrVd", + "gateway": "4WgKhJdmUffz4e1o1ftVAGS3HnG56LiNAxA9dmaekrVd" + }, + { + "id": "shipyard-electrum-2", + "description": "Nym Electrum Service Provider", + "address": "GR6z31MwCsvxHrnvvVN1Cpasd8aQ1giwQqPTZM9dN7VH.5rEiqakSPDrBtKmvpU8Shnhz6gRM85JLoB7AX4h7PJYr@5Ao1J38frnU9Rx5YVeF5BWExcnDTcW8etNe9W2sRASXD", + "gateway": "5Ao1J38frnU9Rx5YVeF5BWExcnDTcW8etNe9W2sRASXD" + } + ] + }, + { + "id": "telegram", + "description": "Telegram", + "items": [ + { + "id": "shipyard-telegram-2", + "description": "Nym Telegram Service Provider", + "address": "C4w6ewbQtoaZEeoaaNw1xVASChqo4WVjNfuYEUFjZxpc.8F1D7rQXf2jGoj1Ken7PiGDM8HS2Ug79wSoc9nZ1iqh1@62F81C9GrHDRja9WCqozemRFSzFPMecY85MbGwn6efve", + "gateway": "62F81C9GrHDRja9WCqozemRFSzFPMecY85MbGwn6efve" + }, + { + "id": "shipyard-telegram-3", + "description": "Nym Telegram Service Provider", + "address": "DStL3BEUZuQZfbij1KAY3BvJh8rC5jpr9mc6AQ6aTLUu.Ax9foYaKfFgX6g8y393GoNpKkKrnDGFGRZwxDv9R7X6M@FQon7UwF5knbUr2jf6jHhmNLbJnMreck1eUcVH59kxYE", + "gateway": "FQon7UwF5knbUr2jf6jHhmNLbJnMreck1eUcVH59kxYE" + }, + { + "id": "shipyard-telegram-4", + "description": "Nym Telegram Service Provider", + "address": "8gRdGTzsDxYzpasRQhsRg59MCgNNhnfag2oFfwwZPXnB.DtDrGz7ScVm4o7sN4K3CYUJveYgz7fcXELBVLNDfMS9Y@3ojQD6V7skM1bSXJX7fVQvscjmcgptzdixQEaAha2ixh", + "gateway": "3ojQD6V7skM1bSXJX7fVQvscjmcgptzdixQEaAha2ixh" + }, + { + "id": "shipyard-telegram-5", + "description": "Nym Telegram Service Provider", + "address": "AR3oEM6Uvmfs6fyddwSehoBUKCFxz7MdFi4z7aahuHuY.3ZKapg9A3Py1PXhyLbCJr8ZbJsEV6NZdN1WJaGGut5tj@EEyq16v63aotPBCepxUpCgAojrNasZ6Hk1PjpRyBAdEp", + "gateway": "EEyq16v63aotPBCepxUpCgAojrNasZ6Hk1PjpRyBAdEp" + }, + { + "id": "shipyard-telegram-6", + "description": "Nym Telegram Service Provider", + "address": "7n1BYhsXSwcr8Qim8AqZTAodqFia4QG6T7CRc1ihQHpv.7o4trpGqu2LHMUiXc3dddgfGET1CFFcAK9gKYoHoSn5e@BTZNB3bkkEePsT14GN8ofVtM1SJae4YLWjpBerrKYfr", + "gateway": "BTZNB3bkkEePsT14GN8ofVtM1SJae4YLWjpBerrKYfr" + }, + { + "id": "shipyard-telegram-7", + "description": "Nym Telegram Service Provider", + "address": "Gv4TWhUKrvJfqh1jBRPGEQrikNZvZse2kS3ZgN9Z2nAZ.7KGPaaqUEum2C59jLvw7f8Ug8a48YuZdjjZu3t4JES4U@C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi", + "gateway": "C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi" + }, + { + "id": "shipyard-telegram-8", + "description": "Nym Telegram Service Provider", + "address": "8Mqgp12cpF6FSXMeqzxgFgQXvTSapyNqGAi5wy7ub4ge.7z7PDsiJGiGxGz4p77v5L5fZhXBJ5qNZ8CgJwYNr6H6J", + "gateway": "3zd3wrCK8Dz5TXrcvk5dG5s9EEdf4Ck1v9VgBPMMFVkR" + }, + { + "id": "shipyard-telegram-9", + "description": "Nym Telegram Service Provider", + "address": "F3N5eiPDZcGFC985Go4Mpv8p9uxFD1L3jRUdrLCbrZLm.EyTxWwwTwYpPrJBmc97GLd1LpUAphjptS5y1ed182bGk@GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ", + "gateway": "GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ" + }, + { + "id": "shipyard-telegram-10", + "description": "Nym Telegram Service Provider", + "address": "G7y7e1nVBr8fmQSzdeAxXnCmmmJb5k8N3E8LBV31KE5g.GRRUCj6t6cCUUjakmTWzidMLiYA7EdCedKnup8osaBC6@AJad2R9virYEYXEsTcicN5y5tyPoixrhhAGsxoESZVnc", + "gateway": "AJad2R9virYEYXEsTcicN5y5tyPoixrhhAGsxoESZVnc" + }, + { + "id": "shipyard-telegram-11", + "description": "Nym Telegram Service Provider", + "address": "2kq9Z7RyDZtb8kxXjyP3ZT8VMWHg6JXFDChGuuNBk7Hw.F5XYbBaGSoF8qAo8faPcaNRPHEq3Y25BDcwESeabUS9S@HaLyPQrhBTq75dnGeBUdYWeFVA2BBn39MgkhEt3VTMMM", + "gateway": "HaLyPQrhBTq75dnGeBUdYWeFVA2BBn39MgkhEt3VTMMM" + }, + { + "id": "shipyard-telegram-12", + "description": "Nym Telegram Service Provider", + "address": "GegdtpNzYj4QCgpih9Kxv7ZVZxmVdxYHsDkiPsbT71XG.E8xtE8mrapjzFtyuziZSrsScAKhwZMH5wNpKWtKfzJ5Y@9Byd9VAtyYMnbVAcqdoQxJnq76XEg2dbxbiF5Aa5Jj9J", + "gateway": "9Byd9VAtyYMnbVAcqdoQxJnq76XEg2dbxbiF5Aa5Jj9J" + }, + { + "id": "shipyard-telegram-13", + "description": "Nym Telegram Service Provider", + "address": "4SsrDQeEtG3mpeD9nN5CDdGaCsxFvNeYMhoviDzNNB9f.GyqG6iK5rBvhe3HXLR11m6ULpf13ATgYvkkidLmteDLs@5EpkkrMFYAM3XcaztXnZwBWquURHSKsyc9JxUCengDFS", + "gateway": "5EpkkrMFYAM3XcaztXnZwBWquURHSKsyc9JxUCengDFS" + }, + { + "id": "shipyard-telegram-14", + "description": "Nym Telegram Service Provider", + "address": "9JoHRu2RrSD1fjbj9NSTASgjv9Szep7Nhd9L2PywxbBi.AZhAUDNX6iH8BqXyR5c7TJuzpwMEvDXrabNLGuRukvVf@9xJM74FwwHhEKKJHihD21QSZnHM2QBRMoFx9Wst6qNBS", + "gateway": "9xJM74FwwHhEKKJHihD21QSZnHM2QBRMoFx9Wst6qNBS" + }, + { + "id": "shipyard-telegram-15", + "description": "Nym Telegram Service Provider", + "address": "3K174ijjXqCkhMDT9xLcqjS4MXk2QsqZt4PdgNcuUrnn.BNnHnQmWoj6Uo6kkS1QkPqsdHaXrcwyR9F6MnnzDkZJL@C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi", + "gateway": "C7J8SwZQqjWqhBryyjJxLt7FacVuPTwAmR2otGy53ayi" + }, + { + "id": "shipyard-telegram-16", + "description": "Nym Telegram Service Provider", + "address": "BqX5Q3MEcbTnM39hUswQchLW68SrqbhL8K5ucrLmtP39.AWrVsFoVC9s6KjdpcasATmZPA3GtMsUxcfHpAkuNdtFG@Emswx6KXyjRfq1c2k4d4uD2e6nBSbH1biorCZUei8UNS", + "gateway": "Emswx6KXyjRfq1c2k4d4uD2e6nBSbH1biorCZUei8UNS" + }, + { + "id": "shipyard-telegram-17", + "description": "Nym Telegram Service Provider", + "address": "2tQxccgcqdkuUvLqgiEkEN4rNRZ5QknygnKAFcS4gfoe.EVrY5q5sqDqBUbS3wHsRRZhk2MAw1S17hNoH1Bicyv7n@DAGQxdxwAkwjaLjTw1B9vndia4YyFD15qRgcTQxrmkom", + "gateway": "DAGQxdxwAkwjaLjTw1B9vndia4YyFD15qRgcTQxrmkom" + }, + { + "id": "shipyard-telegram-18", + "description": "Nym Telegram Service Provider", + "address": "8YG1rcEauJA814Nd7hSxjNe2UrRwrGsrXTm1Cmd3gRrU.FxYaYqpNN8PciNsySs3zYPrTB1J8AYUu9DBsM2vVDDfF@7EfEESLo71GUvx3UEW79LgTegHUBPUocUzGyJVv6LHog", + "gateway": "7EfEESLo71GUvx3UEW79LgTegHUBPUocUzGyJVv6LHog" + }, + { + "id": "shipyard-telegram-19", + "description": "Nym Telegram Service Provider", + "address": "HPiXADVFLwLQPNpPtyYefzvYntC6tp9UJ5fJZGfkqvDt.2EUUxmeT3AiaUzAcE5SyXRAk8a2JXBkRz4B8McSdkrST@9ACTkYraCqE9jMb6zb6ne8EDQGGhZw5ykNiq9YRUdHTD", + "gateway": "9ACTkYraCqE9jMb6zb6ne8EDQGGhZw5ykNiq9YRUdHTD" + }, + { + "id": "shipyard-telegram-20", + "description": "Nym Telegram Service Provider", + "address": "2QLnEEnTmf2NRWtcQPWBeRcg7Hej5WSPWRWwtTpEEZWF.BheS78ozc8ngvhsXNNnshdJzpoYsmEvhfn3WKUYF5dRU@C2uyokSPoxhku9GexRxEo1e8KPZ7q6e8FXmK3gtY8kkF", + "gateway": "C2uyokSPoxhku9GexRxEo1e8KPZ7q6e8FXmK3gtY8kkF" + }, + { + "id": "shipyard-telegram-21", + "description": "Nym Telegram Service Provider", + "address": "FuBbnwiANfaXZnn683jBapK5XVm5ttgZSykU3vqPSHoD.94MFGv1VcBLTkRwzBDQUkWjvqtZYVBrJg2Q8JGbizcib@CTqYPY8htdAQMXCzRW9SjZzZuqYwSt2iUh6HPaNgmTvK", + "gateway": "CTqYPY8htdAQMXCzRW9SjZzZuqYwSt2iUh6HPaNgmTvK" + }, + { + "id": "shipyard-telegram-22", + "description": "Nym Telegram Service Provider", + "address": "9EbQx5jQznSVbftFom7sqUSHAACrsfvMhrzhaFt4A3SZ.D1FQCirL4YKwfcmtMGvB5Rugt5sAzGEhdSjJ3bHVQRZ@7Zh1Sz5dXpA6s53CbtcdqhQhLqwf4cLynL7KqHKcjrG4", + "gateway": "7Zh1Sz5dXpA6s53CbtcdqhQhLqwf4cLynL7KqHKcjrG4" + }, + { + "id": "shipyard-telegram-24", + "description": "Nym Telegram Service Provider", + "address": "6Umawwvf551VyB3Ko46NgKLqJdTFJeToCM67mrTmM3G.3A4sesBac4KGuMTFjvYBwLpksMJvbMbteGJQgmm4PV4Y@AnnYnEtBjB2a5sHmeRCnBq43qxyHDf95Bqd7cwQyKNLR", + "gateway": "AnnYnEtBjB2a5sHmeRCnBq43qxyHDf95Bqd7cwQyKNLR" + }, + { + "id": "shipyard-telegram-25", + "description": "Nym Telegram Service Provider", + "address": "CDtxTeoyqq83JpV9G8cR5HRHRdMMaVspQsCwH3Qnajt3.F5EHK9HFcdGrE2hqA7bK9AUmkbihujYDhtNNqHKxW765@BDkeNx7JQm5NsQakst9s8htogZXhpTQedFAgZpvsGCqH", + "gateway": "BDkeNx7JQm5NsQakst9s8htogZXhpTQedFAgZpvsGCqH" + }, + { + "id": "shipyard-telegram-26", + "description": "Nym Telegram Service Provider", + "address": "HukZkLG2DoarQEqaoDLuqW1GFf2NSHDUMGBZiyJGRYJD.9GyU8wPsyzcvRjcyk8hiNpTJbXCmq5F3VoVhFBZYuHR3@GsGEZiDBz8SWfHGaK5SDmhfbTEM55v37WCYYcT9wTSxN", + "gateway": "GsGEZiDBz8SWfHGaK5SDmhfbTEM55v37WCYYcT9wTSxN" + }, + { + "id": "shipyard-telegram-27", + "description": "Nym Telegram Service Provider", + "address": "773y8iMVJiRk4dRbjQzkJVbrei4TwkePNE5WTEttt77d.3Mw47C9XZj3oAzk1iSqC5Y36tbBsjtaTtdgaHM3Zsdma@7fiZtNL1RACQTwGrKLBT9nbY77bfwZnX9rqcWqc53qgv", + "gateway": "7fiZtNL1RACQTwGrKLBT9nbY77bfwZnX9rqcWqc53qgv" + }, + { + "id": "shipyard-telegram-28", + "description": "Nym Telegram Service Provider", + "address": "6jQJEorCu7YiP9HdDaMeHxcNhxeNmZ1kpd836GnqLZX.HsJqEmNTszGecsKqFB37i84nBXxqf4ETgrKmKmBvMGHC@FYnDMQzT49ZGM23gVqpTxfih14V6wuedNXirekmt37zE", + "gateway": "FYnDMQzT49ZGM23gVqpTxfih14V6wuedNXirekmt37zE" + }, + { + "id": "shipyard-telegram-29", + "description": "Nym Telegram Service Provider", + "address": "BiCSyovpFMuSnTvF2TdiuZwrytXDrd9AH47ZMcCxscVC.G9YpdicA9BBNoVHDgjWjgt17wv5WYKWcbE3vPJJVpSJD@GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ", + "gateway":"GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ" + }, + { + "id": "shipyard-telegram-30", + "description": "Nym Telegram Service Provider", + "address": "AQRRAs9oc8QWXAFBs44YhCKUny7AyLsfLy91pwmGgxuf.CWUKoKA1afSKyw5BnFJJg19UDgnaVATupsFhQpyTEBHJ@EBT8jTD8o4tKng2NXrrcrzVhJiBnKpT1bJy5CMeArt2w", + "gateway": "EBT8jTD8o4tKng2NXrrcrzVhJiBnKpT1bJy5CMeArt2w" + }, + { + "id": "shipyard-telegram-31", + "description": "Nym Telegram Service Provider", + "address": "6YqjAZK3Pr1ngiBLcDkotboB5WiN6k6NPpbXvShH4pR5.9Ss6VW3Xbyi8LuxduNNwnXEv9njHCQ2PLSP1UK6tsoa5@42XCK9dMS9m5XJLzQd2dBuwimk6ndZnczhZaV5VPFkQD", + "gateway": "42XCK9dMS9m5XJLzQd2dBuwimk6ndZnczhZaV5VPFkQD" + }, + { + "id": "shipyard-telegram-32", + "description": "Nym Telegram Service Provider", + "address": "EmYWLeybmj86Vzr62vxuZ3T15jwMNHggzK7sQwid96yp.GyaF9WprSr56cxUdGf5TpcUvAjb2VbAr8CVBrmBUYAaw@GL5wESoz4oSbpBaTki9qB9213FGUQXCiRjbzDkhWwoBC", + "gateway": "GL5wESoz4oSbpBaTki9qB9213FGUQXCiRjbzDkhWwoBC" + }, + { + "id": "shipyard-telegram-33", + "description": "Nym Telegram Service Provider", + "address": "4PDb96cck5btTj6G7rsomqwHJsp4qu8uPvFCbwHfjFUx.C5dKbaoakH7egsZvAueRbwLFbmxnQaVMeSr6QTMpuBAA@58ceEFaLJh6zAo3cirzT1BDQm7D3L5acnQrxGH1D6TAY", + "gateway": "58ceEFaLJh6zAo3cirzT1BDQm7D3L5acnQrxGH1D6TAY" + }, + { + "id": "shipyard-telegram-34", + "description": "Nym Telegram Service Provider", + "address": "BeZbeMf9vcpUf368qDd85dtLwXLj4Ee5bsHMB2fUD8uX.HELVbppkwU1jmzUAUrCEbHeJfVciSeo8VGAkbJSpwxsb@ADdHkiTfkpsSt31zVToWW9j3KikH24aLAAwDKtCYE5jY", + "gateway":"ADdHkiTfkpsSt31zVToWW9j3KikH24aLAAwDKtCYE5jY" + }, + { + "id": "shipyard-telegram-35", + "description": "Nym Telegram Service Provider", + "address": "Bp4JRFyf7GB9L9J95AqMPnz9zbGmPnViA5fDXKeNraLJ.D6CTdcjJVxDmH2UQvzXuPWg9Se9xXYe76uDMypXvhzd7@6UjGEeQZK14C5K2kenycTkqt7qRjEHGLgaQx3FWySo3N", + "gateway": "6UjGEeQZK14C5K2kenycTkqt7qRjEHGLgaQx3FWySo3N" + }, + { + "id": "shipyard-telegram-36", + "description": "Nym Telegram Service Provider", + "address": "91h7io6BGhVjbtC7dbbRcScyTJcTfnMsTQZ6aWMVsrWR.Epb4hANXCp8cGEY3wSgawux991ti9Z5Y1FHTMzAKFa6E@DF4TE7V8kJkttMvnoSVGnRFFRt6WYGxxiC2w1XyPQnHe", + "gateway": "DF4TE7V8kJkttMvnoSVGnRFFRt6WYGxxiC2w1XyPQnHe" + }, + { + "id": "shipyard-telegram-37", + "description": "Nym Telegram Service Provider", + "address": "Cy2wuwKpWZ3iWzKU3ZWL1qqcVfJ5Cq85dU7UHVWwv2gc.9AhC9b2zVcLnXLGriMdxjpsWJpq6iAdCavDi63udbL89@678qVUJ21uwxZBhp3r56z7GRf6gMh3NYDHruTegPtgMf", + "gateway": "678qVUJ21uwxZBhp3r56z7GRf6gMh3NYDHruTegPtgMf" + }, + { + "id": "shipyard-telegram-38", + "description": "Nym Telegram Service Provider", + "address": "GgUeUWW1NRSuquZYeZf3WkppE92EQUHJrFjNZtYU1jow.CSEjwrRi4f4uyw7N6L2LPKw2tB8spcMbFu99wHZzFZSj@77TSuVU8d1oXKbPzjec2xh4i3Wj5WwUyy9Lr36sm8gZm", + "gateway": "77TSuVU8d1oXKbPzjec2xh4i3Wj5WwUyy9Lr36sm8gZm" + }, + { + "id": "shipyard-telegram-39", + "description": "Nym Telegram Service Provider", + "address": "kz4zWwSkYiQxqxXFPNcGUByTPQWXascD9RfYsmSxY7n.ajp3SjbBVBjrU9nXpSQXAXzbb6EHJJyhbY6cc1ajayx@BTZNB3bkkEePsT14GN8ofVtM1SJae4YLWjpBerrKYf", + "gateway": "HyS2UZtZX3kQXdazbdE99DhCjBXjbG61LC9QsmXwbxrU" + } + ] + }, + { + "id": "blockstream", + "description": "Blockstream Green", + "items": [ + { + "id": "nym-blockstream", + "description": "Nym Blockstream Green Service Provider", + "address": "GiRjFWrMxt58pEMuusm4yT3RxoMD1MMPrR9M2N4VWRJP.3CNZBPq4vg7v7qozjGjdPMXcvDmkbWPCgbGCjQVw9n6Z@2xU4CBE6QiiYt6EyBXSALwxkNvM7gqJfjHXaMkjiFmYW", + "gateway": "2xU4CBE6QiiYt6EyBXSALwxkNvM7gqJfjHXaMkjiFmYW" + } + ] + } +]`); +export const Loaded = () => ( + + + +); + +export const ServiceAlreadySelected = () => ( + + console.log('New service provider selected: ', serviceProvider)} + /> + +); diff --git a/nym-connect-android/src/components/ServiceSelector.tsx b/nym-connect-android/src/components/ServiceSelector.tsx new file mode 100644 index 0000000000..5eb8361d3c --- /dev/null +++ b/nym-connect-android/src/components/ServiceSelector.tsx @@ -0,0 +1,179 @@ +import React, { useEffect } from 'react'; +import { + Box, + CircularProgress, + Divider, + FormControl, + InputLabel, + MenuItem, + Select, + Stack, + Typography, +} from '@mui/material'; +import { Service, ServiceProvider, Services } from '../types/directory'; +import { useTauriEvents } from '../utils'; +import { ServiceProviderPopup } from './ServiceProviderPopup'; + +export const ServiceSelector: FCWithChildren<{ + onChange?: (serviceProvider?: ServiceProvider) => void; + services?: Services; + currentSp?: ServiceProvider; +}> = ({ services, currentSp, onChange }) => { + const [service, setService] = React.useState(); + const [serviceProvider, setServiceProvider] = React.useState(currentSp); + const [isPopupVisible, setPopupVisible] = React.useState(false); + + const getService = () => { + if (!services || !currentSp) { + return undefined; + } + return services.find((s) => + s.items.some( + ({ id, address, gateway }) => + id === currentSp.id && address === currentSp.address && gateway === currentSp.gateway, + ), + ); + }; + + useEffect(() => { + if (!service && currentSp) { + setServiceProvider(currentSp); + setService(getService()); + } + }, [currentSp, services]); + + /** + * Gets a random service provider from the currently selected service. + * + * If there is no service selected, or it does not have items, `undefined` is returned. + */ + const getRandomServiceProviderForService = (serviceToUse?: Service): ServiceProvider | undefined => { + if (!serviceToUse?.items.length) { + return undefined; + } + return serviceToUse.items[Math.floor(Math.random() * serviceToUse.items.length)]; + }; + + const handleServiceSelected = React.useCallback( + (newService?: Service) => { + console.log(newService?.id, service?.id); + // if the user has chosen a new service, then pick a random service provider + if (newService?.id !== service?.id) { + const newServiceProvider = getRandomServiceProviderForService(newService); + setServiceProvider(newServiceProvider); + onChange?.(newServiceProvider); + setService(newService); + } + }, + [service], + ); + + // clears the display and fire on change (to trigger upstream storage clearance) + const clearServiceProviderAndFireOnChange = () => { + setService(undefined); + setServiceProvider(undefined); + onChange?.(undefined); + }; + + // when the user clears local storage, reset the selector + useTauriEvents('help://clear-storage', () => { + clearServiceProviderAndFireOnChange(); + }); + + const handleAdvancedSpChange = (newServiceProvider?: ServiceProvider, newService?: Service) => { + setPopupVisible(false); + setService(newService); + setServiceProvider(newServiceProvider); + onChange?.(newServiceProvider); + }; + + const handleNewService = (newServiceId?: string) => { + const newService = (services || []).find((s) => s.id === newServiceId); + setService(newService); + }; + + if (!services) { + return ( + + theme.palette.common.white}> + + Loading services... + + + ); + } + + return ( + + + + Select a service + + + + setPopupVisible(false)} + onServiceProviderChanged={handleAdvancedSpChange} + /> + + ); +}; diff --git a/nym-connect-android/src/config.ts b/nym-connect-android/src/config.ts new file mode 100644 index 0000000000..f405ceac15 --- /dev/null +++ b/nym-connect-android/src/config.ts @@ -0,0 +1,3 @@ +export const config = { + DOCS_BASE_URL: 'https://nymtech.net/docs', +}; diff --git a/nym-connect-android/src/context/main.tsx b/nym-connect-android/src/context/main.tsx new file mode 100644 index 0000000000..bba01764e7 --- /dev/null +++ b/nym-connect-android/src/context/main.tsx @@ -0,0 +1,231 @@ +import React, { createContext, useCallback, useContext, useEffect, useMemo, useState, useRef } from 'react'; +import { DateTime } from 'luxon'; +import { invoke } from '@tauri-apps/api'; +import type { UnlistenFn } from '@tauri-apps/api/event'; +import { listen } from '@tauri-apps/api/event'; +import { forage } from '@tauri-apps/tauri-forage'; +import { Error } from 'src/types/error'; +import { TauriEvent } from 'src/types/event'; +import { getVersion } from '@tauri-apps/api/app'; +import { ConnectionStatusKind, GatewayPerformance } from '../types'; +import { ConnectionStatsItem } from '../components/ConnectionStats'; +import { ServiceProvider, Services } from '../types/directory'; + +const TAURI_EVENT_STATUS_CHANGED = 'app:connection-status-changed'; + +type ModeType = 'light' | 'dark'; + +export type TClientContext = { + mode: ModeType; + appVersion?: string; + connectionStatus: ConnectionStatusKind; + connectionStats?: ConnectionStatsItem[]; + connectedSince?: DateTime; + services?: Services; + serviceProvider?: ServiceProvider; + showHelp: boolean; + error?: Error; + gatewayPerformance: GatewayPerformance; + setMode: (mode: ModeType) => void; + clearError: () => void; + handleShowHelp: () => void; + setConnectionStatus: (connectionStatus: ConnectionStatusKind) => void; + setConnectionStats: (connectionStats: ConnectionStatsItem[] | undefined) => void; + setConnectedSince: (connectedSince: DateTime | undefined) => void; + setServiceProvider: (serviceProvider?: ServiceProvider) => void; + + startConnecting: () => Promise; + startDisconnecting: () => Promise; +}; + +export const ClientContext = createContext({} as TClientContext); + +export const ClientContextProvider: FCWithChildren = ({ children }) => { + const [mode, setMode] = useState('dark'); + const [connectionStatus, setConnectionStatus] = useState(ConnectionStatusKind.disconnected); + const [connectionStats, setConnectionStats] = useState(); + const [connectedSince, setConnectedSince] = useState(); + const [services, setServices] = React.useState([]); + const [serviceProvider, setRawServiceProvider] = React.useState(); + const [showHelp, setShowHelp] = useState(false); + const [error, setError] = useState(); + const [appVersion, setAppVersion] = useState(); + const [gatewayPerformance, setGatewayPerformance] = useState('Good'); + + const getAppVersion = async () => { + const version = await getVersion(); + setAppVersion(version); + }; + + const timerId = useRef(); + + useEffect(() => { + invoke('get_services').then((result) => { + setServices(result as Services); + }); + getAppVersion(); + }, []); + + useEffect(() => { + // when mounting, load the connection state (needed for the Growth window, that checks the connection state) + (async () => { + const currentStatus: ConnectionStatusKind = await invoke('get_connection_status'); + setConnectionStatus(currentStatus); + })(); + }, []); + + useEffect(() => { + const unlisten: UnlistenFn[] = []; + + // TODO: fix typings + listen(TAURI_EVENT_STATUS_CHANGED, (event) => { + const { status } = event.payload as any; + console.log(TAURI_EVENT_STATUS_CHANGED, { status, event }); + setConnectionStatus(status); + }) + .then((result) => { + unlisten.push(result); + }) + .catch((e) => console.log(e)); + + listen('socks5-event', (e: TauriEvent) => { + console.log(e); + + setError(e.payload); + }).then((result) => { + unlisten.push(result); + }); + + listen('socks5-status-event', (e: TauriEvent) => { + if (e.payload.message.includes('slow')) { + setGatewayPerformance('Poor'); + + if (timerId.current) { + clearTimeout(timerId.current); + } + + timerId.current = setTimeout(() => { + setGatewayPerformance('Good'); + }, 10000); + } + }).then((result) => { + unlisten.push(result); + }); + + return () => { + unlisten.forEach((unsubscribe) => unsubscribe()); + }; + }, []); + + const startConnecting = useCallback(async () => { + try { + await invoke('start_connecting'); + } catch (e) { + setError({ title: 'Could not connect', message: e as string }); + console.log(e); + } + }, []); + + const startDisconnecting = useCallback(async () => { + try { + await invoke('start_disconnecting'); + setGatewayPerformance('Good'); + } catch (e) { + console.log(e); + } + }, []); + + const setSpInStorage = async (sp: ServiceProvider) => { + await forage.setItem({ + key: 'nym-connect-sp', + value: sp, + } as any)(); + }; + + const setServiceProvider = useCallback(async (newServiceProvider?: ServiceProvider) => { + await invoke('set_gateway', { gateway: newServiceProvider?.gateway }); + await invoke('set_service_provider', { serviceProvider: newServiceProvider?.address }); + if (newServiceProvider) { + await setSpInStorage(newServiceProvider); + } + setRawServiceProvider(newServiceProvider); + }, []); + + const getSpFromStorage = async () => { + try { + const spFromStorage = await forage.getItem({ key: 'nym-connect-sp' })(); + if (spFromStorage) { + setRawServiceProvider(spFromStorage); + setServiceProvider(spFromStorage); + } + } catch (e) { + console.warn(e); + } + }; + + const handleShowHelp = () => setShowHelp((show) => !show); + + const clearError = () => setError(undefined); + + useEffect(() => { + const validityCheck = async () => { + if (services.length > 0 && serviceProvider) { + const isValid = services.some(({ items }) => items.some(({ id }) => id === serviceProvider.id)); + if (!isValid) { + console.warn('invalid SP, cleaning local storage'); + await forage.removeItem({ + key: 'nym-connect-sp', + })(); + setRawServiceProvider(undefined); + } + } + }; + validityCheck(); + }, [services, serviceProvider]); + + useEffect(() => { + getSpFromStorage(); + }, []); + + const contextValue = useMemo( + () => ({ + mode, + appVersion, + setMode, + error, + clearError, + connectionStatus, + setConnectionStatus, + connectionStats, + setConnectionStats, + connectedSince, + setConnectedSince, + startConnecting, + startDisconnecting, + services, + serviceProvider, + setServiceProvider, + showHelp, + handleShowHelp, + gatewayPerformance, + }), + [ + appVersion, + mode, + appVersion, + error, + connectedSince, + showHelp, + connectionStatus, + connectionStats, + connectedSince, + services, + serviceProvider, + gatewayPerformance, + ], + ); + + return {children}; +}; + +export const useClientContext = () => useContext(ClientContext); diff --git a/nym-connect-android/src/context/mocks/main.tsx b/nym-connect-android/src/context/mocks/main.tsx new file mode 100644 index 0000000000..9b4341cc23 --- /dev/null +++ b/nym-connect-android/src/context/mocks/main.tsx @@ -0,0 +1,30 @@ +import React, { useMemo } from 'react'; +import { ConnectionStatusKind } from 'src/types'; +import { ClientContext, TClientContext } from '../main'; + +const mockValues: TClientContext = { + appVersion: 'v1.x.x', + mode: 'dark', + connectionStatus: ConnectionStatusKind.disconnected, + services: [], + showHelp: false, + serviceProvider: { id: '1', description: 'Keybase service provider', gateway: 'abc123', address: '123abc' }, + gatewayPerformance: 'Good', + setMode: () => {}, + clearError: () => {}, + handleShowHelp: () => {}, + setConnectedSince: () => {}, + setConnectionStats: () => {}, + setConnectionStatus: () => {}, + setServiceProvider: () => {}, + startConnecting: async () => {}, + startDisconnecting: async () => {}, +}; + +export const MockProvider: FCWithChildren<{ + children?: React.ReactNode; + connectionStatus?: ConnectionStatusKind; +}> = ({ connectionStatus = ConnectionStatusKind.disconnected, children }) => { + const value = useMemo(() => ({ ...mockValues, connectionStatus }), [connectionStatus]); + return {children}; +}; diff --git a/nym-connect-android/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf b/nym-connect-android/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0fea34ba24ec13e9636f3ed04d575da62586be26 GIT binary patch literal 580468 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

    KDPq=O;8gv5j; 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 M07*qoM6N<$f_|#uPXGV_ literal 35631 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ð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 { const { appVersion } = useClientContext(); return ( - - + + Version {appVersion} diff --git a/nym-connect/src/components/AppWindowFrame.tsx b/nym-connect/src/components/AppWindowFrame.tsx index 89a68f7f66..164ac64baf 100644 --- a/nym-connect/src/components/AppWindowFrame.tsx +++ b/nym-connect/src/components/AppWindowFrame.tsx @@ -1,20 +1,21 @@ import React from 'react'; import { Box } from '@mui/material'; import { CustomTitleBar } from './CustomTitleBar'; -import { AppVersion } from './AppVersion'; +import { useLocation, useParams } from 'react-router-dom'; -export const AppWindowFrame: FCWithChildren = ({ children }) => ( - - - {children} - - -); +export const AppWindowFrame: FCWithChildren = ({ children }) => { + const location = useLocation(); + + return ( + + + {children} + + ); +}; diff --git a/nym-connect/src/components/ConnectionButton.tsx b/nym-connect/src/components/ConnectionButton.tsx index 29fb90c1db..1dd72f78df 100644 --- a/nym-connect/src/components/ConnectionButton.tsx +++ b/nym-connect/src/components/ConnectionButton.tsx @@ -10,13 +10,13 @@ const getStatusFillColor = (status: ConnectionStatusKind, hover: boolean, isErro } switch (status) { - case ConnectionStatusKind.disconnected: + case 'disconnected': if (hover) { return '#FFFF33'; } return '#FFE600'; - case ConnectionStatusKind.connecting: - case ConnectionStatusKind.disconnecting: + case 'connecting': + case 'disconnecting': return '#FFE600'; default: // connected @@ -29,11 +29,11 @@ const getStatusFillColor = (status: ConnectionStatusKind, hover: boolean, isErro const getStatusText = (status: ConnectionStatusKind, hover: boolean): string => { switch (status) { - case ConnectionStatusKind.disconnected: + case 'disconnected': return 'Connect'; - case ConnectionStatusKind.connecting: + case 'connecting': return 'Connecting'; - case ConnectionStatusKind.disconnecting: + case 'disconnecting': return 'Connected'; default: // connected @@ -89,7 +89,7 @@ export const ConnectionButton: FCWithChildren<{ - {status === ConnectionStatusKind.connected && hover ? ( + {status === 'connected' && hover ? ( = ({ status }) => { + serviceProvider?: ServiceProvider; + gatewayError: boolean; +}> = ({ status, serviceProvider, gatewayError }) => { + if (gatewayError) { + return ( + : undefined}> + + + + Gateway has issues + + + + ); + } switch (status) { - case ConnectionStatusKind.connected: + case 'connected': return ( - - Connected to + : undefined}> + + + + Connected to Nym Mixnet + + + + ); + case 'disconnected': + return ( + + Connect to the mixnet ); - case ConnectionStatusKind.disconnecting: + case 'disconnecting': return ( - + Disconnecting... ); - case ConnectionStatusKind.connecting: + case 'connecting': return ( @@ -37,20 +70,7 @@ const ConnectionStatusContent: FCWithChildren<{ ); - case ConnectionStatusKind.disconnected: - return ( - - You are not protected - - ); + default: return null; } @@ -62,29 +82,18 @@ export const ConnectionStatus: FCWithChildren<{ connectedSince?: DateTime; serviceProvider?: ServiceProvider; }> = ({ status, serviceProvider, gatewayPerformance }) => { - const color = - status === ConnectionStatusKind.connected || status === ConnectionStatusKind.disconnecting - ? '#21D072' - : 'warning.main'; + const color = status === 'connected' || status === 'disconnecting' ? '#21D072' : 'white'; + console.log(gatewayPerformance); return ( <> - - {status === ConnectionStatusKind.connected && gatewayPerformance !== 'Good' ? ( - - Gateway has issues - - ) : ( - - )} + + - {serviceProvider ? ( - }> - - {serviceProvider && {serviceProvider.description}} - - - ) : null} ); }; diff --git a/nym-connect/src/components/CustomTitleBar.tsx b/nym-connect/src/components/CustomTitleBar.tsx index 41c71137b9..85a89fd540 100644 --- a/nym-connect/src/components/CustomTitleBar.tsx +++ b/nym-connect/src/components/CustomTitleBar.tsx @@ -1,9 +1,9 @@ import React from 'react'; -import { ArrowBack, Close, HelpOutline, Minimize } from '@mui/icons-material'; -import { Box, IconButton } from '@mui/material'; +import { ArrowBack, Close, Menu, Minimize } from '@mui/icons-material'; +import { Box, IconButton, Typography } from '@mui/material'; import { NymWordmark } from '@nymproject/react/logo/NymWordmark'; import { appWindow } from '@tauri-apps/api/window'; -import { useClientContext } from 'src/context/main'; +import { useNavigate } from 'react-router-dom'; const customTitleBarStyles = { titlebar: { @@ -24,22 +24,34 @@ const CustomButton = ({ Icon, onClick }: { Icon: React.JSXElementConstructor ); -export const CustomTitleBar = () => { - const { showHelp, handleShowHelp } = useClientContext(); +const MenuIcon = () => { + const navigate = useNavigate(); + return navigate('/menu')} />; +}; + +const ArrowBackIcon = () => { + const navigate = useNavigate(); + return navigate(-1)} />; +}; + +const getTitleIcon = (path: string) => { + if (path !== '/') { + const title = path.split('/').slice(-1); + return ( + + {title} + + ); + } + return ; +}; + +export const CustomTitleBar = ({ path = '/' }: { path?: string }) => { return ( {/* set width to keep logo centered */} - - { - handleShowHelp(); - }} - /> - - - - + {path === '/' ? : } + {getTitleIcon(path)} appWindow.minimize()} /> appWindow.close()} /> diff --git a/nym-connect/src/components/ExperimentalWarning.tsx b/nym-connect/src/components/ExperimentalWarning.tsx new file mode 100644 index 0000000000..122f741d0b --- /dev/null +++ b/nym-connect/src/components/ExperimentalWarning.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { Box, Typography } from '@mui/material'; + +export const ExperimentalWarning = () => ( + + + This is experimental software. + + + Do not rely on it for strong anonymity (yet). + + +); diff --git a/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx b/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx index 92c88ec321..ffca05043b 100644 --- a/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx @@ -25,7 +25,7 @@ export const Wrapper: FCWithChildren<{ disabled: boolean }> = ({ disabled, child export const TestAndEarnButtonArea: FCWithChildren = () => { const clientContext = useClientContext(); const context = useTestAndEarnContext(); - const disabled = clientContext.connectionStatus !== ConnectionStatusKind.connected; + const disabled = clientContext.connectionStatus !== 'connected'; const pinger = React.useRef(); const doPing = async () => { diff --git a/nym-connect/src/components/Growth/TestAndEarnPopup.tsx b/nym-connect/src/components/Growth/TestAndEarnPopup.tsx index dc1148c1e5..2535f2ef6f 100644 --- a/nym-connect/src/components/Growth/TestAndEarnPopup.tsx +++ b/nym-connect/src/components/Growth/TestAndEarnPopup.tsx @@ -28,7 +28,7 @@ export const TestAndEarnPopupContent: FCWithChildren<{ ); } - if (!connectionStatus || connectionStatus === ConnectionStatusKind.disconnected) { + if (!connectionStatus || connectionStatus === 'disconnected') { return ( @@ -36,7 +36,7 @@ export const TestAndEarnPopupContent: FCWithChildren<{ ); } - if (connectionStatus === ConnectionStatusKind.connecting || connectionStatus === ConnectionStatusKind.disconnecting) { + if (connectionStatus === 'connecting' || connectionStatus === 'disconnecting') { return ( @@ -77,7 +77,7 @@ export const TestAndEarnPopup: FCWithChildren = () => { const context = useTestAndEarnContext(); React.useEffect(() => { - if (clientContext.connectionStatus === ConnectionStatusKind.connected) { + if (clientContext.connectionStatus === 'connected') { context.refresh(); } }, [clientContext.connectionStatus]); @@ -94,7 +94,7 @@ export const TestAndEarnPopup: FCWithChildren = () => { return () => clearInterval(interval); }, []); - if (!context.loadedOnce && clientContext.connectionStatus === ConnectionStatusKind.connected) { + if (!context.loadedOnce && clientContext.connectionStatus === 'connected') { const message = 'Waiting for data to be transferred over the mixnet...'; return ( diff --git a/nym-connect/src/components/Growth/context/TestAndEarnContext.tsx b/nym-connect/src/components/Growth/context/TestAndEarnContext.tsx index a28fd221e2..5c4776a4a7 100644 --- a/nym-connect/src/components/Growth/context/TestAndEarnContext.tsx +++ b/nym-connect/src/components/Growth/context/TestAndEarnContext.tsx @@ -151,7 +151,7 @@ export const TestAndEarnContextProvider: FCWithChildren = ({ children }) => { }, []); React.useEffect(() => { - if (registration && clientContext.connectionStatus === ConnectionStatusKind.connected) { + if (registration && clientContext.connectionStatus === 'connected') { setTimeout(() => { loadDraws().catch(console.error); }, 1000 * 3); diff --git a/nym-connect/src/components/HelpPage.tsx b/nym-connect/src/components/HelpPage.tsx index 788f7264d5..5cc7815117 100644 --- a/nym-connect/src/components/HelpPage.tsx +++ b/nym-connect/src/components/HelpPage.tsx @@ -6,24 +6,26 @@ import { StepIndicator } from './HelpPageStepIndicator'; export const HelpPage = ({ step, + totalSteps, description, img, onNext, onPrev, }: { step: number; + totalSteps: number; description: string; img: any; onNext?: () => void; onPrev?: () => void; }) => ( - + - How to connect guide {step}/4 + How to connect guide {step}/{totalSteps} - + {description} diff --git a/nym-connect/src/components/HelpPageImage.tsx b/nym-connect/src/components/HelpPageImage.tsx index 27a8dcdca3..8e9920ca4d 100644 --- a/nym-connect/src/components/HelpPageImage.tsx +++ b/nym-connect/src/components/HelpPageImage.tsx @@ -1,5 +1,6 @@ import React from 'react'; +import { Box } from '@mui/material'; -export const HelpImage = ({ img, imageDescription }: { img: any; imageDescription: string }) => ( - {imageDescription} +export const HelpImage = ({ img, imageDescription }: { img: string; imageDescription: string }) => ( + {imageDescription} ); diff --git a/nym-connect/src/components/HelpPageStepIndicator.tsx b/nym-connect/src/components/HelpPageStepIndicator.tsx index b5dff42b34..02d0b3338e 100644 --- a/nym-connect/src/components/HelpPageStepIndicator.tsx +++ b/nym-connect/src/components/HelpPageStepIndicator.tsx @@ -1,15 +1,14 @@ -import { Box } from '@mui/material'; import React from 'react'; +import { Box } from '@mui/material'; const Step = ({ highlight }: { highlight: boolean }) => ( - + ); export const StepIndicator = ({ step }: { step: number }) => ( - + = 2} /> = 3} /> - = 4} /> ); diff --git a/nym-connect/src/components/InfoModal.tsx b/nym-connect/src/components/InfoModal.tsx index ed628de7eb..8b1157689e 100644 --- a/nym-connect/src/components/InfoModal.tsx +++ b/nym-connect/src/components/InfoModal.tsx @@ -18,7 +18,7 @@ const styles = { const ModalTitle = ({ title, withCloseIcon }: { title: string; withCloseIcon: boolean }) => ( - + {title} @@ -27,7 +27,7 @@ const ModalTitle = ({ title, withCloseIcon }: { title: string; withCloseIcon: bo const ModalBody = ({ description, children }: { description: string; children?: React.ReactElement }) => ( {children} - + {description} diff --git a/nym-connect/src/components/IpAddressAndPortModal.tsx b/nym-connect/src/components/IpAddressAndPortModal.tsx index 8ed6d51e20..8afe0acd1b 100644 --- a/nym-connect/src/components/IpAddressAndPortModal.tsx +++ b/nym-connect/src/components/IpAddressAndPortModal.tsx @@ -3,6 +3,9 @@ import { Box, Button, Typography } from '@mui/material'; import { InfoModal } from './InfoModal'; import { CopyToClipboard } from './CopyToClipboard'; +const FONT_SIZE = '12px'; +const FONT_COLOR = 'grey.400'; + export const IpAddressAndPortModal = ({ show, ipAddress, @@ -16,12 +19,15 @@ export const IpAddressAndPortModal = ({ }) => ( Done} + title="You are half way there" + description="Check NymConnect menu for supported apps" + onClose={onClose} > - + + Paste below values in the proxy settings of your app + + Socks5 address @@ -29,7 +35,7 @@ export const IpAddressAndPortModal = ({ - + Port diff --git a/nym-connect/src/components/PowerButton.tsx b/nym-connect/src/components/PowerButton.tsx new file mode 100644 index 0000000000..426028a767 --- /dev/null +++ b/nym-connect/src/components/PowerButton.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import { ConnectionStatusKind } from 'src/types'; + +const getStatusFillColor = (status: ConnectionStatusKind, hover: boolean, isError: boolean): string => { + if (isError && hover) { + return '#21D072'; + } + if (isError) { + return '#40475C'; + } + + switch (status) { + case 'disconnected': + if (hover) { + return '#FFF'; + } + return '#BBB'; + case 'connecting': + return '#FFF'; + case 'disconnecting': + return '#FFF'; + default: + // connected + if (hover) { + return '#E43E3E'; + } + return '#21D072'; + } +}; + +export const PowerButton: FCWithChildren<{ + onClick?: (status: ConnectionStatusKind) => void; + isError?: boolean; + disabled?: boolean; + status: ConnectionStatusKind; + busy?: boolean; +}> = ({ onClick, disabled, status, isError }) => { + const [hover, setHover] = React.useState(false); + + const handleClick = () => { + if (disabled === true) { + return; + } + if (onClick) { + onClick(status); + } + }; + + const statusFillColor = getStatusFillColor(status, hover, Boolean(isError)); + + return ( + !disabled && setHover(true)} + onMouseLeave={() => !disabled && setHover(false)} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/nym-connect/src/components/ServiceProviderInfo.tsx b/nym-connect/src/components/TooltipInfo.tsx similarity index 60% rename from nym-connect/src/components/ServiceProviderInfo.tsx rename to nym-connect/src/components/TooltipInfo.tsx index a6289b5c41..2d76c6859e 100644 --- a/nym-connect/src/components/ServiceProviderInfo.tsx +++ b/nym-connect/src/components/TooltipInfo.tsx @@ -7,14 +7,23 @@ export const ServiceProviderInfo = ({ serviceProvider }: { serviceProvider: Serv Connection info - {serviceProvider.description} Gateway {serviceProvider.gateway} - Provider {serviceProvider.address.slice(0, 35)}... + Service provider {serviceProvider.address.slice(0, 35)}... ); + +export const GatwayWarningInfo = () => ( + + + Connection issue + + + Try disconnecting and connecting again + +); diff --git a/nym-connect/src/context/main.tsx b/nym-connect/src/context/main.tsx index bba01764e7..3ea8a3cad2 100644 --- a/nym-connect/src/context/main.tsx +++ b/nym-connect/src/context/main.tsx @@ -21,19 +21,17 @@ export type TClientContext = { connectionStatus: ConnectionStatusKind; connectionStats?: ConnectionStatsItem[]; connectedSince?: DateTime; - services?: Services; - serviceProvider?: ServiceProvider; - showHelp: boolean; error?: Error; gatewayPerformance: GatewayPerformance; + selectedProvider?: ServiceProvider; + showInfoModal: boolean; setMode: (mode: ModeType) => void; clearError: () => void; - handleShowHelp: () => void; setConnectionStatus: (connectionStatus: ConnectionStatusKind) => void; setConnectionStats: (connectionStats: ConnectionStatsItem[] | undefined) => void; setConnectedSince: (connectedSince: DateTime | undefined) => void; - setServiceProvider: (serviceProvider?: ServiceProvider) => void; - + setShowInfoModal: (show: boolean) => void; + setRandomSerivceProvider: () => void; startConnecting: () => Promise; startDisconnecting: () => Promise; }; @@ -42,28 +40,40 @@ export const ClientContext = createContext({} as TClientContext); export const ClientContextProvider: FCWithChildren = ({ children }) => { const [mode, setMode] = useState('dark'); - const [connectionStatus, setConnectionStatus] = useState(ConnectionStatusKind.disconnected); + const [connectionStatus, setConnectionStatus] = useState(ConnectionStatusKind.connected); const [connectionStats, setConnectionStats] = useState(); const [connectedSince, setConnectedSince] = useState(); - const [services, setServices] = React.useState([]); - const [serviceProvider, setRawServiceProvider] = React.useState(); - const [showHelp, setShowHelp] = useState(false); + const [selectedProvider, setSelectedProvider] = React.useState(); + const [serviceProviders, setServiceProviders] = React.useState(); const [error, setError] = useState(); const [appVersion, setAppVersion] = useState(); const [gatewayPerformance, setGatewayPerformance] = useState('Good'); + const [showInfoModal, setShowInfoModal] = useState(false); const getAppVersion = async () => { const version = await getVersion(); - setAppVersion(version); + return version; }; const timerId = useRef(); + const flattenProviders = (services: Services) => { + return services.reduce((a: ServiceProvider[], b) => { + return [...a, ...b.items]; + }, []); + }; + + const initialiseApp = async () => { + const services = await invoke('get_services'); + const allServiceProviders = flattenProviders(services as Services); + const AppVersion = await getAppVersion(); + + setAppVersion(AppVersion); + setServiceProviders(allServiceProviders); + }; + useEffect(() => { - invoke('get_services').then((result) => { - setServices(result as Services); - }); - getAppVersion(); + initialiseApp(); }, []); useEffect(() => { @@ -129,12 +139,18 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { const startDisconnecting = useCallback(async () => { try { await invoke('start_disconnecting'); - setGatewayPerformance('Good'); } catch (e) { console.log(e); } }, []); + const setServiceProvider = async (newServiceProvider?: ServiceProvider) => { + if (newServiceProvider) { + await invoke('set_gateway', { gateway: newServiceProvider.gateway }); + await invoke('set_service_provider', { serviceProvider: newServiceProvider.address }); + } + }; + const setSpInStorage = async (sp: ServiceProvider) => { await forage.setItem({ key: 'nym-connect-sp', @@ -142,51 +158,36 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { } as any)(); }; - const setServiceProvider = useCallback(async (newServiceProvider?: ServiceProvider) => { - await invoke('set_gateway', { gateway: newServiceProvider?.gateway }); - await invoke('set_service_provider', { serviceProvider: newServiceProvider?.address }); - if (newServiceProvider) { - await setSpInStorage(newServiceProvider); - } - setRawServiceProvider(newServiceProvider); - }, []); + const removeSpFromStorage = async () => { + await forage.removeItem({ + key: 'nym-connect-sp', + })(); + }; - const getSpFromStorage = async () => { + const getSpFromStorage = async (): Promise => { try { const spFromStorage = await forage.getItem({ key: 'nym-connect-sp' })(); - if (spFromStorage) { - setRawServiceProvider(spFromStorage); - setServiceProvider(spFromStorage); - } + return spFromStorage; } catch (e) { console.warn(e); } }; - const handleShowHelp = () => setShowHelp((show) => !show); + const getRandomSPFromList = (serviceProviders: ServiceProvider[]) => { + const randomSelection = serviceProviders[Math.floor(Math.random() * serviceProviders.length)]; + return randomSelection; + }; + + const setRandomSerivceProvider = async () => { + if (serviceProviders) { + const randomServiceProvider = getRandomSPFromList(serviceProviders); + await setServiceProvider(randomServiceProvider); + setSelectedProvider(randomServiceProvider); + } + }; const clearError = () => setError(undefined); - useEffect(() => { - const validityCheck = async () => { - if (services.length > 0 && serviceProvider) { - const isValid = services.some(({ items }) => items.some(({ id }) => id === serviceProvider.id)); - if (!isValid) { - console.warn('invalid SP, cleaning local storage'); - await forage.removeItem({ - key: 'nym-connect-sp', - })(); - setRawServiceProvider(undefined); - } - } - }; - validityCheck(); - }, [services, serviceProvider]); - - useEffect(() => { - getSpFromStorage(); - }, []); - const contextValue = useMemo( () => ({ mode, @@ -197,31 +198,28 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { connectionStatus, setConnectionStatus, connectionStats, + showInfoModal, setConnectionStats, + selectedProvider, connectedSince, setConnectedSince, + setRandomSerivceProvider, startConnecting, startDisconnecting, - services, - serviceProvider, - setServiceProvider, - showHelp, - handleShowHelp, gatewayPerformance, + setShowInfoModal, }), [ - appVersion, mode, appVersion, error, + showInfoModal, connectedSince, - showHelp, connectionStatus, connectionStats, connectedSince, - services, - serviceProvider, gatewayPerformance, + selectedProvider, ], ); diff --git a/nym-connect/src/context/mocks/main.tsx b/nym-connect/src/context/mocks/main.tsx index 9b4341cc23..ea86bb365d 100644 --- a/nym-connect/src/context/mocks/main.tsx +++ b/nym-connect/src/context/mocks/main.tsx @@ -6,19 +6,18 @@ const mockValues: TClientContext = { appVersion: 'v1.x.x', mode: 'dark', connectionStatus: ConnectionStatusKind.disconnected, - services: [], - showHelp: false, - serviceProvider: { id: '1', description: 'Keybase service provider', gateway: 'abc123', address: '123abc' }, + selectedProvider: { id: '1', description: 'Keybase service provider', gateway: 'abc123', address: '123abc' }, gatewayPerformance: 'Good', + showInfoModal: false, + setShowInfoModal: () => {}, setMode: () => {}, clearError: () => {}, - handleShowHelp: () => {}, setConnectedSince: () => {}, setConnectionStats: () => {}, setConnectionStatus: () => {}, - setServiceProvider: () => {}, startConnecting: async () => {}, startDisconnecting: async () => {}, + setRandomSerivceProvider: () => {}, }; export const MockProvider: FCWithChildren<{ diff --git a/nym-connect/src/index.tsx b/nym-connect/src/index.tsx index 8f682fd98b..7041b86787 100644 --- a/nym-connect/src/index.tsx +++ b/nym-connect/src/index.tsx @@ -7,6 +7,9 @@ import { NymMixnetTheme } from './theme'; import { App } from './App'; import { AppWindowFrame } from './components/AppWindowFrame'; import { TestAndEarnContextProvider } from './components/Growth/context/TestAndEarnContext'; +import { BrowserRouter as Router } from 'react-router-dom'; +import { AppRoutes } from './routes'; +import { GlobalStyles } from '@mui/material'; const elem = document.getElementById('root'); @@ -14,15 +17,18 @@ if (elem) { const root = createRoot(elem); root.render( - - - - - - - - - + + + + + + + + + + + + , ); } diff --git a/nym-connect/src/layouts/ConnectedLayout.tsx b/nym-connect/src/layouts/ConnectedLayout.tsx deleted file mode 100644 index da4c757208..0000000000 --- a/nym-connect/src/layouts/ConnectedLayout.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from 'react'; -import { Box, Divider } from '@mui/material'; -import { DateTime } from 'luxon'; -import { IpAddressAndPortModal } from 'src/components/IpAddressAndPortModal'; -import { ConnectionTimer } from 'src/components/ConntectionTimer'; -import { ConnectionStatus } from '../components/ConnectionStatus'; -import { ConnectionStatusKind, GatewayPerformance } from '../types'; -import { ConnectionStatsItem } from '../components/ConnectionStats'; -import { ConnectionButton } from '../components/ConnectionButton'; -import { IpAddressAndPort } from '../components/IpAddressAndPort'; -import { ServiceProvider } from '../types/directory'; -import { TestAndEarnButtonArea } from '../components/Growth/TestAndEarnButtonArea'; - -export const ConnectedLayout: FCWithChildren<{ - status: ConnectionStatusKind; - gatewayPerformance: GatewayPerformance; - stats: ConnectionStatsItem[]; - ipAddress: string; - port: number; - connectedSince?: DateTime; - busy?: boolean; - showInfoModal: boolean; - isError?: boolean; - handleCloseInfoModal: () => void; - onConnectClick?: (status: ConnectionStatusKind) => void; - serviceProvider?: ServiceProvider; -}> = ({ - status, - gatewayPerformance, - showInfoModal, - handleCloseInfoModal, - ipAddress, - port, - connectedSince, - busy, - isError, - serviceProvider, - onConnectClick, -}) => ( - <> - - - - - - - - - {/* */} - - - -); diff --git a/nym-connect/src/layouts/ConnectionLayout.tsx b/nym-connect/src/layouts/ConnectionLayout.tsx new file mode 100644 index 0000000000..d37c7ec888 --- /dev/null +++ b/nym-connect/src/layouts/ConnectionLayout.tsx @@ -0,0 +1,30 @@ +import { Box } from '@mui/material'; +import React from 'react'; + +const layout = { + display: 'grid', + gridTemplateColumns: '1fr', + gridTemplateRows: '80px 180px 1fr', + gridColumnGap: '0px', + gridRowGap: '4px', + overflow: 'hidden', + height: '100%', +}; + +export const ConnectionLayout = ({ + TopContent, + ConnectButton, + BottomContent, +}: { + TopContent: React.ReactNode; + ConnectButton: React.ReactNode; + BottomContent: React.ReactNode; +}) => ( + + {TopContent} + + {ConnectButton} + + {BottomContent} + +); diff --git a/nym-connect/src/layouts/DefaultLayout.tsx b/nym-connect/src/layouts/DefaultLayout.tsx deleted file mode 100644 index 29858afe7f..0000000000 --- a/nym-connect/src/layouts/DefaultLayout.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react'; -import { Box, Typography } from '@mui/material'; -import { ConnectionStatus } from 'src/components/ConnectionStatus'; -import { ConnectionTimer } from 'src/components/ConntectionTimer'; -import { InfoModal } from 'src/components/InfoModal'; -import { Error } from 'src/types/error'; -import { ConnectionButton } from '../components/ConnectionButton'; -import { ServiceSelector } from '../components/ServiceSelector'; -import { useClientContext } from '../context/main'; -import { ConnectionStatusKind } from '../types'; -import { Services } from '../types/directory'; -import { TestAndEarnButtonArea } from '../components/Growth/TestAndEarnButtonArea'; -import { AppVersion } from '../components/AppVersion'; - -export const DefaultLayout: FCWithChildren<{ - error?: Error; - status: ConnectionStatusKind; - services?: Services; - busy?: boolean; - isError?: boolean; - clearError: () => void; - onConnectClick?: (status: ConnectionStatusKind) => void; -}> = ({ status, error, services, busy, isError, onConnectClick, clearError }) => { - const context = useClientContext(); - - return ( - - {error && } - - - - Connect to the Nym
    mixnet for privacy. -
    - - This is experimental software. Do not rely on it for strong anonymity (yet). - -
    - - - -
    - ); -}; diff --git a/nym-connect/src/layouts/HelpGuideLayout.tsx b/nym-connect/src/layouts/HelpGuideLayout.tsx deleted file mode 100644 index d56fd6b0ae..0000000000 --- a/nym-connect/src/layouts/HelpGuideLayout.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React, { useState } from 'react'; -import { HelpPage } from 'src/components/HelpPage'; -import { Button, Link, Stack } from '@mui/material'; -import Image1 from '../assets/help-step-one.png'; -import Image2 from '../assets/help-step-two.png'; -import Image3 from '../assets/help-step-three.png'; -import Image4 from '../assets/help-step-four.png'; - -export const HelpGuideLayout = () => { - const [step, setStep] = useState(0); - - if (step === 1) - return ( - setStep(2)} - /> - ); - - if (step === 2) - return ( - setStep(1)} - onNext={() => setStep(3)} - /> - ); - - if (step === 3) - return ( - setStep(2)} - onNext={() => setStep(4)} - /> - ); - - if (step === 4) - return ( - setStep(3)} - /> - ); - - return ( - - - - - ); -}; diff --git a/nym-connect/src/pages/connection/Connected.tsx b/nym-connect/src/pages/connection/Connected.tsx new file mode 100644 index 0000000000..63da0d6fb1 --- /dev/null +++ b/nym-connect/src/pages/connection/Connected.tsx @@ -0,0 +1,75 @@ +import React, { useState } from 'react'; +import { Box, Stack } from '@mui/material'; +import { DateTime } from 'luxon'; +import { IpAddressAndPortModal } from 'src/components/IpAddressAndPortModal'; +import { ConnectionTimer } from 'src/components/ConntectionTimer'; +import { ConnectionStatus } from 'src/components/ConnectionStatus'; +import { ConnectionStatusKind, GatewayPerformance } from 'src/types'; +import { ConnectionStatsItem } from 'src/components/ConnectionStats'; +import { IpAddressAndPort } from 'src/components/IpAddressAndPort'; +import { ServiceProvider } from 'src/types/directory'; +import { ExperimentalWarning } from 'src/components/ExperimentalWarning'; +import { ConnectionLayout } from 'src/layouts/ConnectionLayout'; +import { PowerButton } from 'src/components/PowerButton'; + +export const Connected: FCWithChildren<{ + status: ConnectionStatusKind; + showInfoModal: boolean; + gatewayPerformance: GatewayPerformance; + stats: ConnectionStatsItem[]; + ipAddress: string; + port: number; + connectedSince?: DateTime; + busy?: boolean; + isError?: boolean; + serviceProvider?: ServiceProvider; + onConnectClick: (status: ConnectionStatusKind) => void; + closeInfoModal: () => void; +}> = ({ + status, + showInfoModal, + gatewayPerformance, + ipAddress, + port, + connectedSince, + busy, + isError, + serviceProvider, + onConnectClick, + closeInfoModal, +}) => { + return ( + <> + + + + +
    + } + ConnectButton={ + + } + BottomContent={ + + + + + + + } + /> + + ); +}; diff --git a/nym-connect/src/pages/connection/Disconnected.tsx b/nym-connect/src/pages/connection/Disconnected.tsx new file mode 100644 index 0000000000..f92d70ad55 --- /dev/null +++ b/nym-connect/src/pages/connection/Disconnected.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { Stack, Typography } from '@mui/material'; +import { ConnectionStatus } from 'src/components/ConnectionStatus'; +import { ConnectionTimer } from 'src/components/ConntectionTimer'; +import { useClientContext } from 'src/context/main'; +import { InfoModal } from 'src/components/InfoModal'; +import { Error } from 'src/types/error'; +import { ExperimentalWarning } from 'src/components/ExperimentalWarning'; +import { ServiceProvider, Services } from 'src/types/directory'; +import { ConnectionStatusKind } from 'src/types'; +import { ConnectionButton } from 'src/components/ConnectionButton'; +import { PowerButton } from 'src/components/PowerButton'; +import { Box } from '@mui/system'; +import { ConnectionLayout } from 'src/layouts/ConnectionLayout'; + +export const Disconnected: FCWithChildren<{ + error?: Error; + status: ConnectionStatusKind; + services?: Services; + busy?: boolean; + isError?: boolean; + serviceProvider?: ServiceProvider; + clearError: () => void; + onConnectClick: (status: ConnectionStatusKind) => void; +}> = ({ status, error, onConnectClick, clearError, serviceProvider }) => { + return ( + <> + {error && } + + + +
    + } + ConnectButton={} + BottomContent={ + + + You are not protected + + + + } + /> + + ); +}; diff --git a/nym-connect/src/pages/connection/index.tsx b/nym-connect/src/pages/connection/index.tsx new file mode 100644 index 0000000000..9489137367 --- /dev/null +++ b/nym-connect/src/pages/connection/index.tsx @@ -0,0 +1,85 @@ +import React from 'react'; +import { forage } from '@tauri-apps/tauri-forage'; +import { DateTime } from 'luxon'; +import { useClientContext } from 'src/context/main'; +import { useTauriEvents } from 'src/utils'; +import { Connected } from './Connected'; +import { Disconnected } from './Disconnected'; + +export const ConnectionPage = () => { + const context = useClientContext(); + const [busy, setBusy] = React.useState(); + + useTauriEvents('help://clear-storage', (_event) => { + console.log('About to clear local storage...'); + // clear local storage + try { + forage.clear()(); + console.log('Local storage cleared'); + } catch (e) { + console.error('Failed to clear local storage', e); + } + }); + + const handleConnectClick = async () => { + const currentStatus = context.connectionStatus; + if (currentStatus === 'connected' || currentStatus === 'disconnected') { + setBusy(true); + // eslint-disable-next-line default-case + switch (currentStatus) { + case 'disconnected': + await context.setRandomSerivceProvider(); + await context.startConnecting(); + context.setConnectedSince(DateTime.now()); + context.setShowInfoModal(true); + break; + case 'connected': + await context.startDisconnecting(); + context.setConnectedSince(undefined); + break; + } + setBusy(false); + } + }; + + const closeInfoModal = () => context.setShowInfoModal(false); + + if (context.connectionStatus === 'connected') + return ( + + ); + + return ( + + ); +}; diff --git a/nym-connect/src/pages/menu/Apps.tsx b/nym-connect/src/pages/menu/Apps.tsx new file mode 100644 index 0000000000..59d2823b69 --- /dev/null +++ b/nym-connect/src/pages/menu/Apps.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { Divider, Typography } from '@mui/material'; +import { Box } from '@mui/system'; + +const appsSchema = { + messagingApps: ['Telegram', 'Keybase'], + wallets: ['Blockstream', 'Electum'], +}; + +export const CompatibleApps = () => ( + + + Supported apps + + + Messaging apps + + + + + + {appsSchema.messagingApps.map((app, i) => ( + + {app} + + ))} + + + Wallets + + + + + + {appsSchema.wallets.map((wallet, i) => ( + + {wallet} + + ))} + + +); diff --git a/nym-connect/src/pages/menu/Guide.tsx b/nym-connect/src/pages/menu/Guide.tsx new file mode 100644 index 0000000000..2323d68a82 --- /dev/null +++ b/nym-connect/src/pages/menu/Guide.tsx @@ -0,0 +1,47 @@ +import React, { useState } from 'react'; +import { HelpPage } from 'src/components/HelpPage'; +import Image1 from '../../assets/help-step-one.png'; +import Image2 from '../../assets/help-step-two.png'; +import Image4 from '../../assets/help-step-four.png'; + +export const HelpGuide = () => { + const [step, setStep] = useState(1); + const TOTAL_STEPS = 3; + + if (step === 1) + return ( + setStep(2)} + /> + ); + + if (step === 2) + return ( + setStep(1)} + onNext={() => setStep(3)} + /> + ); + + if (step === 3) + return ( + setStep(2)} + /> + ); + + return null; +}; diff --git a/nym-connect/src/pages/menu/index.tsx b/nym-connect/src/pages/menu/index.tsx new file mode 100644 index 0000000000..156ab061e4 --- /dev/null +++ b/nym-connect/src/pages/menu/index.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { Apps, HelpOutline } from '@mui/icons-material'; +import { Stack, Link, List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; +import { Link as RouterLink } from 'react-router-dom'; +import { AppVersion } from 'src/components/AppVersion'; + +const menuSchema = [ + { title: 'Supported apps', icon: Apps, path: 'apps' }, + { title: 'How to connect guide', icon: HelpOutline, path: 'guide' }, +]; + +export const Menu = () => { + return ( + + + {menuSchema.map((item) => ( + + + + {}{' '} + {item.title} + + + + ))} + + + + ); +}; diff --git a/nym-connect/src/routes/index.tsx b/nym-connect/src/routes/index.tsx new file mode 100644 index 0000000000..37bb876d91 --- /dev/null +++ b/nym-connect/src/routes/index.tsx @@ -0,0 +1,18 @@ +import { Routes, Route } from 'react-router-dom'; +import { ConnectionPage } from 'src/pages/connection'; +import { Menu } from 'src/pages/menu'; +import { CompatibleApps } from 'src/pages/menu/Apps'; +import { HelpGuide } from 'src/pages/menu/Guide'; + +export const AppRoutes = () => { + return ( + + } /> + + } /> + } /> + } /> + + + ); +}; diff --git a/nym-connect/src/stories/AppFlow.stories.tsx b/nym-connect/src/stories/AppFlow.stories.tsx index f0c8428058..011a269610 100644 --- a/nym-connect/src/stories/AppFlow.stories.tsx +++ b/nym-connect/src/stories/AppFlow.stories.tsx @@ -4,10 +4,10 @@ import { Box } from '@mui/material'; import { DateTime } from 'luxon'; import { AppWindowFrame } from '../components/AppWindowFrame'; import { useClientContext } from '../context/main'; -import { ConnectionStatusKind } from '../types'; -import { DefaultLayout } from '../layouts/DefaultLayout'; -import { ConnectedLayout } from '../layouts/ConnectedLayout'; import { Services } from '../types/directory'; +import { Disconnected } from 'src/pages/connection/Disconnected'; +import { Connected } from 'src/pages/connection/Connected'; +import { ConnectionStatusKind } from 'src/types'; export default { title: 'App/Flow', @@ -36,15 +36,15 @@ export const Mock: ComponentStory = () => { ]; const handleConnectClick = React.useCallback(() => { const oldStatus = context.connectionStatus; - if (oldStatus === ConnectionStatusKind.connected || oldStatus === ConnectionStatusKind.disconnected) { + if (oldStatus === 'connected' || oldStatus === 'disconnected') { setBusy(true); // eslint-disable-next-line default-case switch (oldStatus) { - case ConnectionStatusKind.disconnected: + case 'disconnected': context.setConnectionStatus(ConnectionStatusKind.connecting); break; - case ConnectionStatusKind.connected: + case 'connected': context.setConnectionStatus(ConnectionStatusKind.disconnecting); break; } @@ -52,11 +52,11 @@ export const Mock: ComponentStory = () => { setTimeout(() => { // eslint-disable-next-line default-case switch (oldStatus) { - case ConnectionStatusKind.disconnected: + case 'disconnected': context.setConnectedSince(DateTime.now()); context.setConnectionStatus(ConnectionStatusKind.connected); break; - case ConnectionStatusKind.connected: + case 'connected': context.setConnectionStatus(ConnectionStatusKind.disconnected); break; } @@ -72,7 +72,7 @@ export const Mock: ComponentStory = () => { return ( - = () => { return ( - undefined} + closeInfoModal={() => undefined} status={context.connectionStatus} busy={busy} onConnectClick={handleConnectClick} diff --git a/nym-connect/src/stories/ConnectedLayout.stories.tsx b/nym-connect/src/stories/ConnectedLayout.stories.tsx index 216e9c38db..b572d58490 100644 --- a/nym-connect/src/stories/ConnectedLayout.stories.tsx +++ b/nym-connect/src/stories/ConnectedLayout.stories.tsx @@ -2,23 +2,28 @@ import React from 'react'; import { ComponentMeta, ComponentStory } from '@storybook/react'; import { Box } from '@mui/material'; import { DateTime } from 'luxon'; -import { ConnectedLayout } from '../layouts/ConnectedLayout'; -import { ConnectionStatusKind } from '../types'; +import { Connected } from 'src/pages/connection/Connected'; +import { ConnectionStatusKind } from 'src/types'; + +const onClick = () => undefined; export default { title: 'Layouts/ConnectedLayout', - component: ConnectedLayout, -} as ComponentMeta; + component: Connected, +} as ComponentMeta; -export const Default: ComponentStory = () => ( +export const Default: ComponentStory = () => ( - undefined} + showInfoModal={false} + closeInfoModal={() => { + return undefined; + }} status={ConnectionStatusKind.connected} connectedSince={DateTime.now()} ipAddress="127.0.0.1" + serviceProvider={{ id: 'service 1', description: 'good services', address: 'abc123', gateway: '8910xyz' }} port={1080} stats={[ { @@ -32,6 +37,7 @@ export const Default: ComponentStory = () => ( rateBytesPerSecond: 1024 * 1024 + 10, }, ]} + onConnectClick={onClick} /> ); diff --git a/nym-connect/src/stories/ConnectionButton.stories.tsx b/nym-connect/src/stories/ConnectionButton.stories.tsx index efce95ace4..d1aa35b0b5 100644 --- a/nym-connect/src/stories/ConnectionButton.stories.tsx +++ b/nym-connect/src/stories/ConnectionButton.stories.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { ComponentMeta, ComponentStory } from '@storybook/react'; import { ConnectionButton } from '../components/ConnectionButton'; -import { ConnectionStatusKind } from '../types'; +import { ConnectionStatusKind } from 'src/types'; export default { title: 'Components/ConnectionButton', diff --git a/nym-connect/src/stories/DefaultLayout.stories.tsx b/nym-connect/src/stories/DefaultLayout.stories.tsx index ba311a410b..e7362ae685 100644 --- a/nym-connect/src/stories/DefaultLayout.stories.tsx +++ b/nym-connect/src/stories/DefaultLayout.stories.tsx @@ -1,23 +1,30 @@ import React from 'react'; import { ComponentMeta, ComponentStory } from '@storybook/react'; import { Box } from '@mui/material'; -import { DefaultLayout } from '../layouts/DefaultLayout'; import { ConnectionStatusKind } from '../types'; +import { Disconnected } from 'src/pages/connection/Disconnected'; export default { title: 'Layouts/DefaultLayout', - component: DefaultLayout, -} as ComponentMeta; + component: Disconnected, +} as ComponentMeta; -export const Default: ComponentStory = () => ( +const onClick = () => undefined; + +export const Default: ComponentStory = () => ( - {}} error={undefined} /> + {}} + error={undefined} + onConnectClick={onClick} + /> ); -export const WithServices: ComponentStory = () => ( +export const WithServices: ComponentStory = () => ( - = () => ( ]} clearError={() => {}} error={undefined} + onConnectClick={onClick} /> ); diff --git a/nym-connect/src/stories/PowerButton.stories.tsx b/nym-connect/src/stories/PowerButton.stories.tsx new file mode 100644 index 0000000000..97681cc974 --- /dev/null +++ b/nym-connect/src/stories/PowerButton.stories.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import { PowerButton } from 'src/components/PowerButton'; +import { ConnectionStatusKind } from 'src/types'; + +export default { + title: 'Components/PowerButton', + component: PowerButton, +} as ComponentMeta; + +export const Disconnected: ComponentStory = () => ( + +); + +export const Connecting: ComponentStory = () => ( + +); + +export const Connected: ComponentStory = () => ( + +); + +export const Disconnecting: ComponentStory = () => ( + +); + +export const Disabled: ComponentStory = () => ( + +); diff --git a/nym-connect/src/theme/theme.tsx b/nym-connect/src/theme/theme.tsx index abda87ef72..18678fce98 100644 --- a/nym-connect/src/theme/theme.tsx +++ b/nym-connect/src/theme/theme.tsx @@ -20,7 +20,7 @@ import { */ const nymPalette: NymPalette = { /** emphasises important elements */ - highlight: '#FB6E4E', + highlight: '#21D072', success: '#21D073', info: '#60D7EF', warning: '#FFE600', diff --git a/yarn.lock b/yarn.lock index 07c6d1bd97..14943476c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1105,7 +1105,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== @@ -10597,18 +10597,6 @@ hex-rgb@^4.1.0: resolved "https://registry.yarnpkg.com/hex-rgb/-/hex-rgb-4.3.0.tgz#af5e974e83bb2fefe44d55182b004ec818c07776" integrity sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw== -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -10618,7 +10606,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -11572,11 +11560,6 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -12844,7 +12827,7 @@ longest-streak@^3.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -14953,13 +14936,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -15953,7 +15929,7 @@ react-is@17.0.2, react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^16.10.2, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: +react-is@^16.10.2, react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -16030,7 +16006,7 @@ react-resize-detector@^7.1.2: dependencies: lodash "^4.17.21" -react-router-dom@6: +react-router-dom@6, react-router-dom@^6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.7.0.tgz#0249f4ca4eb704562b8b0ff29caeb928c3a6ed38" integrity sha512-jQtXUJyhso3kFw430+0SPCbmCmY1/kJv8iRffGHwHy3CkoomGxeYzMkmeSPYo6Egzh3FKJZRAL22yg5p2tXtfg== @@ -16038,34 +16014,6 @@ react-router-dom@6: "@remix-run/router" "1.3.0" react-router "6.7.0" -react-router-dom@^5.2.0: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - react-router@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.7.0.tgz#db262684c13b5c2970694084ae9e8531718a0681" @@ -16639,11 +16587,6 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -18077,12 +18020,7 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0, tiny-warning@^1.0.2: +tiny-warning@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -18882,11 +18820,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" From 71aadc8e1bf6b27b9535be0bfed7dfa4030b8c35 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 31 Jan 2023 13:44:41 +0100 Subject: [PATCH 270/591] update versions for the release v1.1.8 --- clients/client-core/Cargo.toml | 2 +- clients/native/Cargo.toml | 2 +- clients/socks5/Cargo.toml | 2 +- explorer-api/Cargo.toml | 2 +- explorer/package.json | 4 ++-- gateway/Cargo.toml | 2 +- mixnode/Cargo.toml | 2 +- nym-api/Cargo.toml | 2 +- nym-connect/package.json | 4 ++-- nym-connect/src-tauri/Cargo.toml | 2 +- nym-connect/src-tauri/tauri.conf.json | 16 ++++++++++++---- service-providers/network-requester/Cargo.toml | 2 +- service-providers/network-statistics/Cargo.toml | 2 +- tools/nym-cli/Cargo.toml | 2 +- 14 files changed, 27 insertions(+), 19 deletions(-) diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index 438ebd72ee..dccad37eca 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "client-core" -version = "1.1.7" +version = "1.1.8" authors = ["Dave Hrycyszyn "] edition = "2021" rust-version = "1.66" diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 810655a5be..2c781bb799 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.7" +version = "1.1.8" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 6f2fe7149b..fe107c6f42 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.7" +version = "1.1.8" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index 3d4e48f1ab..5d09ccb5c3 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "explorer-api" -version = "1.1.7" +version = "1.1.8" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/explorer/package.json b/explorer/package.json index 3ca03f5b56..c4b82c7a78 100644 --- a/explorer/package.json +++ b/explorer/package.json @@ -1,6 +1,6 @@ { "name": "@nym/network-explorer", - "version": "1.0.3", + "version": "1.0.4", "private": true, "license": "Apache-2.0", "dependencies": { @@ -120,4 +120,4 @@ "last 1 safari version" ] } -} +} \ No newline at end of file diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index f40035d9d1..1928ca5576 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-gateway" -version = "1.1.7" +version = "1.1.8" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index ea5577f64c..69b4deb6e2 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-mixnode" -version = "1.1.8" +version = "1.1.9" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 5b585b5b05..e3a242e195 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.7" +version = "1.1.8" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-connect/package.json b/nym-connect/package.json index abc3664d4f..127ac38de1 100644 --- a/nym-connect/package.json +++ b/nym-connect/package.json @@ -1,6 +1,6 @@ { "name": "@nym/nym-connect", - "version": "1.1.7", + "version": "1.1.8", "main": "index.js", "license": "MIT", "scripts": { @@ -113,4 +113,4 @@ "webpack-merge": "^5.8.0", "yaml-loader": "^0.8.0" } -} +} \ No newline at end of file diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/src-tauri/Cargo.toml index dd88c73c49..54c39aac73 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.7" +version = "1.1.8" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/src-tauri/tauri.conf.json b/nym-connect/src-tauri/tauri.conf.json index 0335f391d3..deff29513f 100644 --- a/nym-connect/src-tauri/tauri.conf.json +++ b/nym-connect/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.7" + "version": "1.1.8" }, "build": { "distDir": "../dist", @@ -19,7 +19,13 @@ "active": true, "targets": "all", "identifier": "net.nymtech.connect", - "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], "resources": [], "externalBin": [], "copyright": "Copyright © 2021-2022 Nym Technologies SA", @@ -44,7 +50,9 @@ }, "updater": { "active": true, - "endpoints": ["https://nymtech.net/.wellknown/connect/updater.json"], + "endpoints": [ + "https://nymtech.net/.wellknown/connect/updater.json" + ], "dialog": true, "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IENCNzQ2M0E5N0VFODE2NApSV1JrZ2U2WE9rYTNETTg1OTBKdE5uWUEra0hML2syOVUvQ2lxZmFZRzZ1T3NWbGM0eVRzUTVhVwo=" }, @@ -78,4 +86,4 @@ "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'" } } -} +} \ No newline at end of file diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 9814c3e338..bc48c72adb 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-network-requester" -version = "1.1.7" +version = "1.1.8" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] edition = "2021" rust-version = "1.65" diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index 2e6d067ab4..accdccc977 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-statistics" -version = "1.1.7" +version = "1.1.8" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index f866e7fa82..7680ea44fe 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.7" +version = "1.1.8" authors.workspace = true edition = "2021" From 19c47692606e33563742681087bdc2fb9cf07b98 Mon Sep 17 00:00:00 2001 From: joeiacono2021 <90098521+joeiacono2021@users.noreply.github.com> Date: Tue, 31 Jan 2023 12:54:55 +0000 Subject: [PATCH 271/591] Changelog Updates for RELEASE 1.1.8 on 31/01 --- CHANGELOG.md | 17 ++++++++++++++--- explorer/CHANGELOG.md | 10 ++++++++++ nym-connect/CHANGELOG.md | 8 ++++++-- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 834a822334..0f1f1b7ffa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,21 +4,32 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// # [Unreleased] -### Changed - -- nym-api: an `--id` flag is now always explicitly required ([#2898]) +# [v1.1.8] (2023-01-31) ### Added - dkg rerun from scratch and dkg-specific epochs ([#2839]) - nym-sdk: add support for surb storage ([#2870]) - nym-sdk: enable reply-SURBs by default ([#2874]) +- Rust SDK - Support SURBS (anonymous send + storage) ([#2754]) +- Rename `'initial_supply'` field to `'total_supply'` in the circulating supply endpoint ([#2931]) +- Enforce the --id param on the nym-api init command ([#2873]) +- Circulating supply api endpoint (read the note inside before testing/deploying) ([#1902]) +### Changed + +- nym-api: an `--id` flag is now always explicitly required ([#2898]) + +[#2754]: https://github.com/nymtech/nym/issues/2754 [#2839]: https://github.com/nymtech/nym/pull/2839 [#2870]: https://github.com/nymtech/nym/pull/2870 [#2874]: https://github.com/nymtech/nym/pull/2874 +[#2931]: https://github.com/nymtech/nym/issues/2931 +[#2873]: https://github.com/nymtech/nym/issues/2873 +[#1902]: https://github.com/nymtech/nym/issues/1902 [#2898]: https://github.com/nymtech/nym/pull/2898 + # [v1.1.7] (2023-01-24) ### Added diff --git a/explorer/CHANGELOG.md b/explorer/CHANGELOG.md index b021d3babc..783c2c67d8 100644 --- a/explorer/CHANGELOG.md +++ b/explorer/CHANGELOG.md @@ -1,5 +1,15 @@ ## UNRELEASED +## [nym-explorer-v1.0.4](https://github.com/nymtech/nym/tree/nym-explorer-v1.0.4) (2023-01-31) + +- Add routing score on gateway list ([#2913]) +- Add gateway's last Routing Score to the gateways list page ([#2186]) +- Upgrade Sandbox and make below changes: ([#2332]) + +[#2913]: https://github.com/nymtech/nym/pull/2913 +[#2186]: https://github.com/nymtech/nym/issues/2186 +[#2332]:https://github.com/nymtech/nym/issues/2332 + ## [nym-explorer-v1.0.3](https://github.com/nymtech/nym/tree/nym-explorer-v1.0.3) (2023-01-24) - Stake Saturation tooltip on node list and node pages updated ([#2877]) diff --git a/nym-connect/CHANGELOG.md b/nym-connect/CHANGELOG.md index cbf60772f4..9fab419681 100644 --- a/nym-connect/CHANGELOG.md +++ b/nym-connect/CHANGELOG.md @@ -4,8 +4,12 @@ ## [nym-connect-v1.1.8](https://github.com/nymtech/nym/tree/nym-connect-v1.1.8) (2023-01-31) -- New user interface -- One click connect +- Add supported apps in the menu + update guide ([#2868]) + +- Copy changes to remove the dropdown: ([#2777]) + +[#2868]: https://github.com/nymtech/nym/issues/2868 +[#2777]: https://github.com/nymtech/nym/issues/2777 ## [nym-connect-v1.1.7](https://github.com/nymtech/nym/tree/nym-connect-v1.1.7) (2023-01-24) From 0a3e42700c9cf77e06fc86e442a7bd5704fd7022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Tue, 31 Jan 2023 14:58:47 +0200 Subject: [PATCH 272/591] Fix vote soft error everywhere (#2941) --- nym-api/src/coconut/dkg/verification_key.rs | 15 +++++++++------ nym-api/src/coconut/helpers.rs | 18 ++++++++++++++++++ nym-api/src/coconut/mod.rs | 15 ++++----------- 3 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 nym-api/src/coconut/helpers.rs diff --git a/nym-api/src/coconut/dkg/verification_key.rs b/nym-api/src/coconut/dkg/verification_key.rs index 15f0138a90..9aed655cfa 100644 --- a/nym-api/src/coconut/dkg/verification_key.rs +++ b/nym-api/src/coconut/dkg/verification_key.rs @@ -5,6 +5,7 @@ use crate::coconut::dkg::client::DkgClient; use crate::coconut::dkg::complaints::ComplaintReason; use crate::coconut::dkg::state::{ConsistentState, State}; use crate::coconut::error::CoconutError; +use crate::coconut::helpers::accepted_vote_err; use coconut_dkg_common::event_attributes::DKG_PROPOSAL_ID; use coconut_dkg_common::types::{NodeIndex, TOTAL_DEALINGS}; use coconut_dkg_common::verification_key::owner_from_cosmos_msgs; @@ -203,21 +204,23 @@ pub(crate) async fn verification_key_validation( .iter() .position(|node_index| contract_share.node_index == *node_index) { - if !check_vk_pairing(¶ms, &recovered_partials[idx], &vk) { + let ret = if !check_vk_pairing(¶ms, &recovered_partials[idx], &vk) { dkg_client .vote_verification_key_share(proposal_id, false) - .await?; + .await } else { dkg_client .vote_verification_key_share(proposal_id, true) - .await?; - } + .await + }; + accepted_vote_err(ret)?; } } Err(_) => { - dkg_client + let ret = dkg_client .vote_verification_key_share(proposal_id, false) - .await? + .await; + accepted_vote_err(ret)?; } } } diff --git a/nym-api/src/coconut/helpers.rs b/nym-api/src/coconut/helpers.rs new file mode 100644 index 0000000000..986bb6b305 --- /dev/null +++ b/nym-api/src/coconut/helpers.rs @@ -0,0 +1,18 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::coconut::error::CoconutError; +use validator_client::nyxd::error::NyxdError::AbciError; + +// If the result is already established, the vote might be redundant and +// thus the transaction might fail +pub(crate) fn accepted_vote_err(ret: Result<(), CoconutError>) -> Result<(), CoconutError> { + if let Err(CoconutError::NyxdError(AbciError { ref log, .. })) = ret { + let accepted_err = multisig_contract_common::error::ContractError::NotOpen {}.to_string(); + // If redundant voting is not the case, error out on all other error variants + if !log.value().contains(&accepted_err) { + ret?; + } + } + Ok(()) +} diff --git a/nym-api/src/coconut/mod.rs b/nym-api/src/coconut/mod.rs index 8d4999f32a..dd059923cb 100644 --- a/nym-api/src/coconut/mod.rs +++ b/nym-api/src/coconut/mod.rs @@ -5,6 +5,7 @@ use self::comm::APICommunicationChannel; use crate::coconut::client::Client as LocalClient; use crate::coconut::deposit::extract_encryption_key; use crate::coconut::error::{CoconutError, Result}; +use crate::coconut::helpers::accepted_vote_err; use crate::support::storage::NymApiStorage; use coconut_bandwidth_contract_common::spend_credential::{ funds_from_cosmos_msgs, SpendCredentialStatus, @@ -33,7 +34,6 @@ use rocket::State as RocketState; use std::sync::Arc; use tokio::sync::Mutex; use validator_client::nym_api::routes::{BANDWIDTH, COCONUT_ROUTES}; -use validator_client::nyxd::error::NyxdError::AbciError; use validator_client::nyxd::{Coin, Fee}; pub(crate) mod client; @@ -41,6 +41,7 @@ pub(crate) mod comm; mod deposit; pub(crate) mod dkg; pub(crate) mod error; +pub(crate) mod helpers; pub(crate) mod keypair; #[cfg(test)] pub(crate) mod tests; @@ -301,6 +302,7 @@ pub async fn verify_bandwidth_credential( state.mix_denom.clone(), ); + // Vote yes or no on the proposal based on the verification result let ret = state .client .vote_proposal( @@ -313,16 +315,7 @@ pub async fn verify_bandwidth_credential( )), ) .await; - // Vote yes or no on the proposal based on the verification result - // If the result is already established, the vote might be redundant and - // thus the transaction might fail - if let Err(CoconutError::NyxdError(AbciError { ref log, .. })) = ret { - let accepted_err = multisig_contract_common::error::ContractError::NotOpen {}.to_string(); - // If redundant voting is not the case, error out on all other error variants - if !log.value().contains(&accepted_err) { - ret?; - } - } + accepted_vote_err(ret)?; Ok(Json(VerifyCredentialResponse::new(vote_yes))) } From be90d03129b917db9f373236892c7e9e5fe891f3 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 31 Jan 2023 14:01:25 +0100 Subject: [PATCH 273/591] changelog cleanup --- CHANGELOG.md | 14 ++++---------- explorer/CHANGELOG.md | 2 +- nym-connect/CHANGELOG.md | 1 - 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f1f1b7ffa..8d663f273b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,26 +8,20 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ### Added -- dkg rerun from scratch and dkg-specific epochs ([#2839]) -- nym-sdk: add support for surb storage ([#2870]) -- nym-sdk: enable reply-SURBs by default ([#2874]) - Rust SDK - Support SURBS (anonymous send + storage) ([#2754]) +- dkg rerun from scratch and dkg-specific epochs ([#2810]) - Rename `'initial_supply'` field to `'total_supply'` in the circulating supply endpoint ([#2931]) -- Enforce the --id param on the nym-api init command ([#2873]) - Circulating supply api endpoint (read the note inside before testing/deploying) ([#1902]) ### Changed -- nym-api: an `--id` flag is now always explicitly required ([#2898]) +- nym-api: an `--id` flag is now always explicitly required ([#2873]) [#2754]: https://github.com/nymtech/nym/issues/2754 -[#2839]: https://github.com/nymtech/nym/pull/2839 -[#2870]: https://github.com/nymtech/nym/pull/2870 -[#2874]: https://github.com/nymtech/nym/pull/2874 +[#2839]: https://github.com/nymtech/nym/issues/2810 [#2931]: https://github.com/nymtech/nym/issues/2931 -[#2873]: https://github.com/nymtech/nym/issues/2873 [#1902]: https://github.com/nymtech/nym/issues/1902 -[#2898]: https://github.com/nymtech/nym/pull/2898 +[#2873]: https://github.com/nymtech/nym/issues/2873 # [v1.1.7] (2023-01-24) diff --git a/explorer/CHANGELOG.md b/explorer/CHANGELOG.md index 783c2c67d8..2bdbaeab0e 100644 --- a/explorer/CHANGELOG.md +++ b/explorer/CHANGELOG.md @@ -8,7 +8,7 @@ [#2913]: https://github.com/nymtech/nym/pull/2913 [#2186]: https://github.com/nymtech/nym/issues/2186 -[#2332]:https://github.com/nymtech/nym/issues/2332 +[#2332]: https://github.com/nymtech/nym/issues/2332 ## [nym-explorer-v1.0.3](https://github.com/nymtech/nym/tree/nym-explorer-v1.0.3) (2023-01-24) diff --git a/nym-connect/CHANGELOG.md b/nym-connect/CHANGELOG.md index 9fab419681..c1bf4a7b85 100644 --- a/nym-connect/CHANGELOG.md +++ b/nym-connect/CHANGELOG.md @@ -5,7 +5,6 @@ ## [nym-connect-v1.1.8](https://github.com/nymtech/nym/tree/nym-connect-v1.1.8) (2023-01-31) - Add supported apps in the menu + update guide ([#2868]) - - Copy changes to remove the dropdown: ([#2777]) [#2868]: https://github.com/nymtech/nym/issues/2868 From 76b07d487b8c7582628eb6ad085fe1b5aae3b528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Fri, 3 Feb 2023 13:36:26 +0000 Subject: [PATCH 274/591] introduced '/circulating-supply/total-supply-value' and '/circulating-supply/circulating-supply-value' endpoints (#2965) --- nym-api/src/circulating_supply_api/mod.rs | 6 +- nym-api/src/circulating_supply_api/routes.rs | 63 ++++++++++++++++++-- 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/nym-api/src/circulating_supply_api/mod.rs b/nym-api/src/circulating_supply_api/mod.rs index 9d0e984ab6..900d38380b 100644 --- a/nym-api/src/circulating_supply_api/mod.rs +++ b/nym-api/src/circulating_supply_api/mod.rs @@ -15,7 +15,11 @@ pub(crate) mod routes; /// Merges the routes with http information and returns it to Rocket for serving pub(crate) fn circulating_supply_routes(settings: &OpenApiSettings) -> (Vec, OpenApi) { - openapi_get_routes_spec![settings: routes::get_circulating_supply] + openapi_get_routes_spec![ + settings: routes::get_full_circulating_supply, + routes::get_total_supply, + routes::get_circulating_supply + ] } /// Spawn the circulating supply cache refresher. diff --git a/nym-api/src/circulating_supply_api/routes.rs b/nym-api/src/circulating_supply_api/routes.rs index 898248445a..da6aea1d22 100644 --- a/nym-api/src/circulating_supply_api/routes.rs +++ b/nym-api/src/circulating_supply_api/routes.rs @@ -1,15 +1,30 @@ -use rocket::http::Status; -use rocket::serde::json::Json; -use rocket::State; +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 use crate::circulating_supply_api::cache::CirculatingSupplyCache; use crate::node_status_api::models::ErrorResponse; use nym_api_requests::models::CirculatingSupplyResponse; +use rocket::http::Status; +use rocket::serde::json::Json; +use rocket::State; use rocket_okapi::openapi; +use validator_client::nyxd::Coin; + +// TODO: this is not the best place to put it, it should be more centralised, +// but for a quick fix, that's good enough for now... +// (for proper solution we should be managing `NymNetworkDetails` via rocket and grabbing display exponent +// value from the mix denom here. +const UNYM_RATIO: f64 = 1000000.; + +fn unym_coin_to_float_unym(coin: Coin) -> f64 { + // our total supply can't exceed 1B so an overflow here is impossible + // (if it happened, then we SHOULD crash) + coin.amount as f64 / UNYM_RATIO +} #[openapi(tag = "circulating-supply")] #[get("/circulating-supply")] -pub(crate) async fn get_circulating_supply( +pub(crate) async fn get_full_circulating_supply( cache: &State, ) -> Result, ErrorResponse> { match cache.get_circulating_supply().await { @@ -20,3 +35,43 @@ pub(crate) async fn get_circulating_supply( )), } } + +#[openapi(tag = "circulating-supply")] +#[get("/circulating-supply/total-supply-value")] +pub(crate) async fn get_total_supply( + cache: &State, +) -> Result, ErrorResponse> { + let full_circulating_supply = match cache.get_circulating_supply().await { + Some(res) => res, + None => { + return Err(ErrorResponse::new( + "unavailable", + Status::InternalServerError, + )) + } + }; + + Ok(Json(unym_coin_to_float_unym( + full_circulating_supply.total_supply.into(), + ))) +} + +#[openapi(tag = "circulating-supply")] +#[get("/circulating-supply/circulating-supply-value")] +pub(crate) async fn get_circulating_supply( + cache: &State, +) -> Result, ErrorResponse> { + let full_circulating_supply = match cache.get_circulating_supply().await { + Some(res) => res, + None => { + return Err(ErrorResponse::new( + "unavailable", + Status::InternalServerError, + )) + } + }; + + Ok(Json(unym_coin_to_float_unym( + full_circulating_supply.circulating_supply.into(), + ))) +} From 9881a9475744efe40bee1f4f5eae3fbb67fa0efa Mon Sep 17 00:00:00 2001 From: farbanas Date: Fri, 3 Feb 2023 15:12:18 +0100 Subject: [PATCH 275/591] bumped nym-api version --- nym-api/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index e3a242e195..7d2c8b379b 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.8" +version = "1.1.9" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", From bd61679c585c65aee2e6fee2ad10fd41f35189ae Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Fri, 3 Feb 2023 08:46:40 -0100 Subject: [PATCH 276/591] Binary checker, introduction --- tests/README.md | 15 +++ tests/assert.sh | 186 ++++++++++++++++++++++++++++++ tests/build_and_run.sh | 28 +++++ tests/nym-gateway-binary-check.sh | 38 ++++++ tests/nym-mixnode-binary-check.sh | 34 ++++++ tests/socks5-binary-check.sh | 2 + 6 files changed, 303 insertions(+) create mode 100644 tests/README.md create mode 100755 tests/assert.sh create mode 100755 tests/build_and_run.sh create mode 100755 tests/nym-gateway-binary-check.sh create mode 100755 tests/nym-mixnode-binary-check.sh create mode 100755 tests/socks5-binary-check.sh diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000000..14e3487dd3 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,15 @@ +## Binary init checker + + +### WIP +A simple tool to ensure that all binaries init with the correct format, using the assert.sh library + +Simply run `./build_and_run.sh $GIT_BRANCH` + +This will run through all the binaries anc check the fields that we expect to be initialised when passing the parameters into nyms core binaries + +## TODO + - Introduce all binaries + - Sort paths and locations + - Tidy up + - Run in CI \ No newline at end of file diff --git a/tests/assert.sh b/tests/assert.sh new file mode 100755 index 0000000000..ffd2b9551b --- /dev/null +++ b/tests/assert.sh @@ -0,0 +1,186 @@ +#!/bin/bash +# assert.sh 1.1 - bash unit testing framework +# Copyright (C) 2009-2015 Robert Lehmann +# +# http://github.com/lehmannro/assert.sh +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +export DISCOVERONLY=${DISCOVERONLY:-} +export DEBUG=${DEBUG:-} +export STOP=${STOP:-} +export INVARIANT=${INVARIANT:-} +export CONTINUE=${CONTINUE:-} + +args="$(getopt -n "$0" -l \ + verbose,help,stop,discover,invariant,continue vhxdic $*)" \ +|| exit -1 +for arg in $args; do + case "$arg" in + -h) + echo "$0 [-vxidc]" \ + "[--verbose] [--stop] [--invariant] [--discover] [--continue]" + echo "`sed 's/./ /g' <<< "$0"` [-h] [--help]" + exit 0;; + --help) + cat < [stdin] + (( tests_ran++ )) || : + [[ -z "$DISCOVERONLY" ]] || return + expected=$(echo -ne "${2:-}") + result="$(eval 2>/dev/null $1 <<< ${3:-})" || true + if [[ "$result" == "$expected" ]]; then + [[ -z "$DEBUG" ]] || echo -n . + return + fi + result="$(sed -e :a -e '$!N;s/\n/\\n/;ta' <<< "$result")" + [[ -z "$result" ]] && result="nothing" || result="\"$result\"" + [[ -z "$2" ]] && expected="nothing" || expected="\"$2\"" + _assert_fail "expected $expected${_indent}got $result" "$1" "$3" +} + +assert_raises() { + # assert_raises [stdin] + (( tests_ran++ )) || : + [[ -z "$DISCOVERONLY" ]] || return + status=0 + (eval $1 <<< ${3:-}) > /dev/null 2>&1 || status=$? + expected=${2:-0} + if [[ "$status" -eq "$expected" ]]; then + [[ -z "$DEBUG" ]] || echo -n . + return + fi + _assert_fail "program terminated with code $status instead of $expected" "$1" "$3" +} + +_assert_fail() { + # _assert_fail + [[ -n "$DEBUG" ]] && echo -n X + report="test #$tests_ran \"$2${3:+ <<< $3}\" failed:${_indent}$1" + if [[ -n "$STOP" ]]; then + [[ -n "$DEBUG" ]] && echo + echo "$report" + exit 1 + fi + tests_errors[$tests_failed]="$report" + (( tests_failed++ )) || : +} + +skip_if() { + # skip_if + (eval $@) > /dev/null 2>&1 && status=0 || status=$? + [[ "$status" -eq 0 ]] || return + skip +} + +skip() { + # skip (no arguments) + shopt -q extdebug && tests_extdebug=0 || tests_extdebug=1 + shopt -q -o errexit && tests_errexit=0 || tests_errexit=1 + # enable extdebug so returning 1 in a DEBUG trap handler skips next command + shopt -s extdebug + # disable errexit (set -e) so we can safely return 1 without causing exit + set +o errexit + tests_trapped=0 + trap _skip DEBUG +} +_skip() { + if [[ $tests_trapped -eq 0 ]]; then + # DEBUG trap for command we want to skip. Do not remove the handler + # yet because *after* the command we need to reset extdebug/errexit (in + # another DEBUG trap.) + tests_trapped=1 + [[ -z "$DEBUG" ]] || echo -n s + return 1 + else + trap - DEBUG + [[ $tests_extdebug -eq 0 ]] || shopt -u extdebug + [[ $tests_errexit -eq 1 ]] || set -o errexit + return 0 + fi +} + + +_assert_reset +: ${tests_suite_status:=0} # remember if any of the tests failed so far +_assert_cleanup() { + local status=$? + # modify exit code if it's not already non-zero + [[ $status -eq 0 && -z $CONTINUE ]] && exit $tests_suite_status +} +trap _assert_cleanup EXIT diff --git a/tests/build_and_run.sh b/tests/build_and_run.sh new file mode 100755 index 0000000000..f6ff95f3cd --- /dev/null +++ b/tests/build_and_run.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +PWD="../" +GIT_BRANCH=$1 +VERSION_NUMBER=$2 + +# lets make sure the branch is up to date +# --------------------------------------- +git checkout develop +git fetch origin +git checkout $GIT_BRANCH +git pull origin $GIT_BRANCH +# --------------------------------------- + +echo "working directory ${PWD}" + +#build all binaries... +#expect the cargo tool chain to be installed on the machine +cargo build --release --all + +#here there should be the applicable binaries to test inits + +./nym-mixnode-binary-check.sh "$VERSION_NUMBER" + +sleep 2 + +echo "running gateway binary check" +#./nym-gateway-binary-check.sh "$VERSION_NUMBER" \ No newline at end of file diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh new file mode 100755 index 0000000000..7489553617 --- /dev/null +++ b/tests/nym-gateway-binary-check.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -e + +. assert.sh -v -x + +PWD="../" +RELEASE_DIRECTORY="target/release" +VERSION_NUMBER=$1 +WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr +MOCK_HOST="1.2.3.4" +OUTPUT=$(for i in {1..8}; do echo -n $(( $RANDOM % 10 )); done) +ID="test-${OUTPUT}" + +echo "the version number is ${VERSION_NUMBER}" + +cd ${PWD}${RELEASE_DIRECTORY} + +if [ -f nym-gateway ]; then + echo "running init tests" + # we wont use config env files for now + # unless we want to use a specific environment + OUTPUT=$(./nym-gateway --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) > /dev/null 2>&1 + + # get jq values for things we can assert against + VALUE=$(echo ${OUTPUT} | jq .wallet_address) + VALUE=${VALUE#\"} + VALUE=${VALUE%\"} + + # do asserts here based upon the output on init + + assert $(cat ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) + assert_end nym-gateway-tests +else + echo "exting test no binary found" +fi + + diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh new file mode 100755 index 0000000000..1e62b21318 --- /dev/null +++ b/tests/nym-mixnode-binary-check.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +. assert.sh -v -x + +PWD="../" +RELEASE_DIRECTORY="target/release" +VERSION_NUMBER=$1 +WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr +MOCK_HOST="1.2.3.4" +OUTPUT=$(for i in {1..8}; do echo -n $(( $RANDOM % 10 )); done) +ID="test-${OUTPUT}" + +echo "the version number is ${VERSION_NUMBER}" + +cd $PWD/$RELEASE_DIRECTORY + +if [ -f nym-mixnode ]; then + echo "running init tests" + # we wont use config env files for now + OUTPUT=$(./nym-mixnode --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) > /dev/null 2>&1 + + # get jq values for things we can assert against + # tidy this bit up - okay for first push + VALUE=$(echo ${OUTPUT} | jq .wallet_address) + VALUE=${VALUE#\"} + VALUE=${VALUE%\"} + + # do asserts here based upon the output on init + + assert $(cat ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) + assert_end nym-mixnode-tests +else + echo "exting test no binary found" +fi diff --git a/tests/socks5-binary-check.sh b/tests/socks5-binary-check.sh new file mode 100755 index 0000000000..74c27dbf69 --- /dev/null +++ b/tests/socks5-binary-check.sh @@ -0,0 +1,2 @@ +#!/bin/bash +# TODO \ No newline at end of file From 9ad9fd36e2d4071c48b470536dd6a8cec739f412 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 09:58:34 +0000 Subject: [PATCH 277/591] build(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 (#2961) Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/commits) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3e0a888957..43d1330c14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10855,9 +10855,9 @@ htmlparser2@^6.1.0: entities "^2.0.0" http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" From b29bd8bcc311105ae2991d6bbb9958e45b1a5a45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 09:59:08 +0000 Subject: [PATCH 278/591] build(deps): bump http-cache-semantics in /nym-wallet/webdriver (#2960) Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/commits) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- nym-wallet/webdriver/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nym-wallet/webdriver/yarn.lock b/nym-wallet/webdriver/yarn.lock index 41f18e8bd4..f5ea58a825 100644 --- a/nym-wallet/webdriver/yarn.lock +++ b/nym-wallet/webdriver/yarn.lock @@ -1312,9 +1312,9 @@ hosted-git-info@^2.1.4: integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" From 02e1dc01af316f09b3350d022abd0efa156ea2e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 10:00:09 +0000 Subject: [PATCH 279/591] build(deps): bump ua-parser-js in /nym-wallet/webdriver (#2909) Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.28 to 0.7.33. - [Release notes](https://github.com/faisalman/ua-parser-js/releases) - [Changelog](https://github.com/faisalman/ua-parser-js/blob/master/changelog.md) - [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.28...0.7.33) --- updated-dependencies: - dependency-name: ua-parser-js dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- nym-wallet/webdriver/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nym-wallet/webdriver/yarn.lock b/nym-wallet/webdriver/yarn.lock index f5ea58a825..0c01bfb5cc 100644 --- a/nym-wallet/webdriver/yarn.lock +++ b/nym-wallet/webdriver/yarn.lock @@ -2471,9 +2471,9 @@ type-fest@^0.21.3: integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== ua-parser-js@^0.7.21: - version "0.7.28" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" - integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + version "0.7.33" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" + integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== unbzip2-stream@1.3.3: version "1.3.3" From ef8ecd42a31af3204988d356623c6cac25f4e24f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C8=99u?= Date: Fri, 3 Feb 2023 12:28:34 +0200 Subject: [PATCH 280/591] Fix flaky dkg test --- nym-api/src/coconut/dkg/dealing.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/nym-api/src/coconut/dkg/dealing.rs b/nym-api/src/coconut/dkg/dealing.rs index a32176c9b0..9e7fe3c74a 100644 --- a/nym-api/src/coconut/dkg/dealing.rs +++ b/nym-api/src/coconut/dkg/dealing.rs @@ -59,7 +59,7 @@ pub(crate) mod tests { use coconut_dkg_common::dealer::DealerDetails; use cosmwasm_std::Addr; use dkg::bte::keys::KeyPair as DkgKeyPair; - use dkg::bte::Params; + use dkg::bte::{Params, PublicKeyWithProof}; use rand::rngs::OsRng; use std::collections::HashMap; use std::path::PathBuf; @@ -186,8 +186,18 @@ pub(crate) mod tests { let mut bytes = bs58::decode(details.bte_public_key_with_proof.clone()) .into_vec() .unwrap(); - let last_byte = bytes.last_mut().unwrap(); - *last_byte += 1; + // Find another value for last byte that still deserializes to a public key with proof + let initial_byte = *bytes.last_mut().unwrap(); + loop { + let last_byte = bytes.last_mut().unwrap(); + let (ret, _) = last_byte.overflowing_add(1); + *last_byte = ret; + // stop when we find that value, or if we do a full round trip of u8 values + // and can't find one, in which case this test is invalid + if PublicKeyWithProof::try_from_bytes(&bytes).is_ok() || ret == initial_byte { + break; + } + } details.bte_public_key_with_proof = bs58::encode(&bytes).into_string(); }); From d57b486bf41c5fee684c2ba3eebf5dcafb10a87f Mon Sep 17 00:00:00 2001 From: Mark Sinclair Date: Fri, 3 Feb 2023 11:35:03 +0000 Subject: [PATCH 281/591] GitHub Actions: add action to build and upload binaries to CI server --- .../build-and-upload-binaries-ci.yml | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 .github/workflows/build-and-upload-binaries-ci.yml diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml new file mode 100644 index 0000000000..102b9106c7 --- /dev/null +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -0,0 +1,106 @@ +name: Build and upload binaries to CI + +on: + workflow_dispatch: + push: + paths: + - 'clients/**' + - 'common/**' + - 'contracts/**' + - 'explorer-api/**' + - 'gateway/**' + - 'integrations/**' + - 'mixnode/**' + - 'sdk/rust/nym-sdk/**' + - 'service-providers/**' + - 'nym-api/**' + - 'nym-outfox/**' + - 'tools/nym-cli/**' + - 'tools/ts-rs-cli/**' + pull_request: + paths: + - 'clients/**' + - 'common/**' + - 'contracts/**' + - 'explorer-api/**' + - 'gateway/**' + - 'integrations/**' + - 'mixnode/**' + - 'sdk/rust/nym-sdk/**' + - 'service-providers/**' + - 'nym-api/**' + - 'nym-outfox/**' + - 'tools/nym-cli/**' + - 'tools/ts-rs-cli/**' + +env: + NETWORK: mainnet + +jobs: + publish-nym: + strategy: + fail-fast: false + matrix: + platform: [ubuntu-20.04] + + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@v3 + + - name: Install Dependencies (Linux) + run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Build all binaries + uses: actions-rs/cargo@v1 + with: + command: build + args: --workspace --release + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: wasm32-unknown-unknown + override: true + components: rustfmt, clippy + + - name: Build release contracts + run: make wasm + + - name: Prepare build output + steps: + - shell: bash + run: | + rm -rf ci-builds || true + mkdir ci-builds + + cp target/release/nym-client ci-builds + cp target/release/nym-gateway ci-builds + cp target/release/nym-mixnode ci-builds + cp target/release/nym-socks5-client ci-builds + cp target/release/nym-api ci-builds + cp target/release/nym-network-requester ci-builds + cp target/release/nym-network-statistics ci-builds + cp target/release/nym-cli ci-builds + + cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm ci-builds + cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm ci-builds + + - name: Deploy branch to CI www + continue-on-error: true + uses: easingthemes/ssh-deploy@main + env: + SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} + ARGS: "-rltgoDzvO --delete" + SOURCE: "ci-builds/" + REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} + REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} + TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ env.GITHUB_REF_SLUG }} + EXCLUDE: "/dist/, /node_modules/" + From b0d7169b391ff46b6a6ee8e92bafb0056237f57e Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:46:07 +0000 Subject: [PATCH 282/591] Update build-and-upload-binaries-ci.yml --- .../build-and-upload-binaries-ci.yml | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 102b9106c7..0b7004d6d5 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -74,23 +74,22 @@ jobs: run: make wasm - name: Prepare build output - steps: - - shell: bash - run: | - rm -rf ci-builds || true - mkdir ci-builds - - cp target/release/nym-client ci-builds - cp target/release/nym-gateway ci-builds - cp target/release/nym-mixnode ci-builds - cp target/release/nym-socks5-client ci-builds - cp target/release/nym-api ci-builds - cp target/release/nym-network-requester ci-builds - cp target/release/nym-network-statistics ci-builds - cp target/release/nym-cli ci-builds - - cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm ci-builds - cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm ci-builds + shell: bash + run: | + rm -rf ci-builds || true + mkdir ci-builds + + cp target/release/nym-client ci-builds + cp target/release/nym-gateway ci-builds + cp target/release/nym-mixnode ci-builds + cp target/release/nym-socks5-client ci-builds + cp target/release/nym-api ci-builds + cp target/release/nym-network-requester ci-builds + cp target/release/nym-network-statistics ci-builds + cp target/release/nym-cli ci-builds + + cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm ci-builds + cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm ci-builds - name: Deploy branch to CI www continue-on-error: true From a9124a63f928c22d53b9d9f3ec00cd197d1dcecd Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 3 Feb 2023 11:57:32 +0000 Subject: [PATCH 283/591] Update build-and-upload-binaries-ci.yml --- .github/workflows/build-and-upload-binaries-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 0b7004d6d5..7013aef554 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -100,6 +100,6 @@ jobs: SOURCE: "ci-builds/" REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} - TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ env.GITHUB_REF_SLUG }} + TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ env.GITHUB_REF_NAME }} EXCLUDE: "/dist/, /node_modules/" From d7cd942dec7a8d6066d96f07783adcda77eff221 Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 3 Feb 2023 12:03:13 +0000 Subject: [PATCH 284/591] Update build-and-upload-binaries-ci.yml --- .github/workflows/build-and-upload-binaries-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 7013aef554..048400f548 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -100,6 +100,6 @@ jobs: SOURCE: "ci-builds/" REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} - TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ env.GITHUB_REF_NAME }} + TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ env.GITHUB_REF_NAME }}/ EXCLUDE: "/dist/, /node_modules/" From 8bbf766eeb2b26b6205f12599ac47ea4a0858a36 Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 3 Feb 2023 16:14:29 +0000 Subject: [PATCH 285/591] Update build-and-upload-binaries-ci.yml --- .../build-and-upload-binaries-ci.yml | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 048400f548..08b3d1a280 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -75,21 +75,23 @@ jobs: - name: Prepare build output shell: bash + env: + OUTPUT_DIR: ci-builds/${{ env.GITHUB_REF_NAME }} run: | rm -rf ci-builds || true - mkdir ci-builds + mkdir -p $OUTPUT_DIR - cp target/release/nym-client ci-builds - cp target/release/nym-gateway ci-builds - cp target/release/nym-mixnode ci-builds - cp target/release/nym-socks5-client ci-builds - cp target/release/nym-api ci-builds - cp target/release/nym-network-requester ci-builds - cp target/release/nym-network-statistics ci-builds - cp target/release/nym-cli ci-builds + cp target/release/nym-client $OUTPUT_DIR + cp target/release/nym-gateway $OUTPUT_DIR + cp target/release/nym-mixnode $OUTPUT_DIR + cp target/release/nym-socks5-client $OUTPUT_DIR + cp target/release/nym-api $OUTPUT_DIR + cp target/release/nym-network-requester $OUTPUT_DIR + cp target/release/nym-network-statistics $OUTPUT_DIR + cp target/release/nym-cli $OUTPUT_DIR - cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm ci-builds - cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm ci-builds + cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm $OUTPUT_DIR + cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm $OUTPUT_DIR - name: Deploy branch to CI www continue-on-error: true From 64acddead654280e19b32d24dd2677cff3e3968d Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 3 Feb 2023 16:36:44 +0000 Subject: [PATCH 286/591] Update build-and-upload-binaries-ci.yml --- .github/workflows/build-and-upload-binaries-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 08b3d1a280..ff91a9978b 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -80,6 +80,7 @@ jobs: run: | rm -rf ci-builds || true mkdir -p $OUTPUT_DIR + echo $OUTPUT_DIR cp target/release/nym-client $OUTPUT_DIR cp target/release/nym-gateway $OUTPUT_DIR @@ -98,10 +99,10 @@ jobs: uses: easingthemes/ssh-deploy@main env: SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} - ARGS: "-rltgoDzvO --delete" + ARGS: "-avzr --delete" SOURCE: "ci-builds/" REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} - TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ env.GITHUB_REF_NAME }}/ + TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/ EXCLUDE: "/dist/, /node_modules/" From 5d10e6245042e3c4029e4ba79404d10f41c4df6e Mon Sep 17 00:00:00 2001 From: Fran Arbanas Date: Tue, 31 Jan 2023 14:42:16 +0000 Subject: [PATCH 287/591] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec9414c775..535c53482e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// - nym-api: an `--id` flag is now always explicitly required ([#2873]) [#2754]: https://github.com/nymtech/nym/issues/2754 -[#2839]: https://github.com/nymtech/nym/issues/2810 +[#2810]: https://github.com/nymtech/nym/issues/2810 [#2931]: https://github.com/nymtech/nym/issues/2931 [#1902]: https://github.com/nymtech/nym/issues/1902 [#2873]: https://github.com/nymtech/nym/issues/2873 From be1ec79b01255c208cc2b639fdc642b60f3d9db0 Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 3 Feb 2023 16:54:49 +0000 Subject: [PATCH 288/591] Update build-and-upload-binaries-ci.yml --- .../workflows/build-and-upload-binaries-ci.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index ff91a9978b..12902ade16 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -46,6 +46,15 @@ jobs: runs-on: ${{ matrix.platform }} steps: - uses: actions/checkout@v3 + + - name: Prepare build output directory + shell: bash + env: + OUTPUT_DIR: ci-builds/${{ github.ref_name }} + run: | + rm -rf ci-builds || true + mkdir -p $OUTPUT_DIR + echo $OUTPUT_DIR - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools @@ -76,12 +85,8 @@ jobs: - name: Prepare build output shell: bash env: - OUTPUT_DIR: ci-builds/${{ env.GITHUB_REF_NAME }} + OUTPUT_DIR: ci-builds/${{ github.ref_name }} run: | - rm -rf ci-builds || true - mkdir -p $OUTPUT_DIR - echo $OUTPUT_DIR - cp target/release/nym-client $OUTPUT_DIR cp target/release/nym-gateway $OUTPUT_DIR cp target/release/nym-mixnode $OUTPUT_DIR From b62c969a7c5ca0969aff539486fcdf36576964c9 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 1 Feb 2023 12:45:51 +0100 Subject: [PATCH 289/591] fix: wrong parameter type for addresses in generator commands (should be AccountId instead of String) --- .../cosmwasm/generators/coconut_bandwidth.rs | 13 +++++++--- .../cosmwasm/generators/coconut_dkg.rs | 11 +++++--- .../validator/cosmwasm/generators/mixnet.rs | 22 ++++++++++------ .../validator/cosmwasm/generators/multisig.rs | 26 ++++++++++++------- .../validator/cosmwasm/generators/vesting.rs | 13 +++++++--- 5 files changed, 55 insertions(+), 30 deletions(-) diff --git a/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs b/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs index e135f5282c..788810c8be 100644 --- a/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs +++ b/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs @@ -1,10 +1,13 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::str::FromStr; + use clap::Parser; use log::{debug, info}; use coconut_bandwidth_contract_common::msg::InstantiateMsg; +use validator_client::nyxd::AccountId; #[derive(Debug, Parser)] pub struct Args { @@ -12,7 +15,7 @@ pub struct Args { pub pool_addr: String, #[clap(long)] - pub multisig_addr: Option, + pub multisig_addr: Option, #[clap(long)] pub mix_denom: Option, @@ -24,8 +27,10 @@ pub async fn generate(args: Args) { debug!("Received arguments: {:?}", args); let multisig_addr = args.multisig_addr.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) - .expect("Multisig address has to be set") + let address = std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + .expect("Multisig address has to be set"); + AccountId::from_str(address.as_str()) + .expect("Failed converting multisig address to AccountId") }); let mix_denom = args.mix_denom.unwrap_or_else(|| { @@ -34,7 +39,7 @@ pub async fn generate(args: Args) { let instantiate_msg = InstantiateMsg { pool_addr: args.pool_addr, - multisig_addr, + multisig_addr: multisig_addr.to_string(), mix_denom, }; diff --git a/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs index 6fe83c4959..9d83de31bf 100644 --- a/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs +++ b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs @@ -7,6 +7,7 @@ use std::str::FromStr; use coconut_dkg_common::msg::InstantiateMsg; use coconut_dkg_common::types::TimeConfiguration; +use validator_client::nyxd::AccountId; #[derive(Debug, Parser)] pub struct Args { @@ -14,7 +15,7 @@ pub struct Args { pub group_addr: String, #[clap(long)] - pub multisig_addr: Option, + pub multisig_addr: Option, #[clap(long)] pub public_key_submission_time_secs: Option, @@ -44,8 +45,10 @@ pub async fn generate(args: Args) { debug!("Received arguments: {:?}", args); let multisig_addr = args.multisig_addr.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) - .expect("Multisig address has to be set") + let address = std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + .expect("Multisig address has to be set"); + AccountId::from_str(address.as_str()) + .expect("Failed converting multisig address to AccountId") }); let mix_denom = args.mix_denom.unwrap_or_else(|| { @@ -86,7 +89,7 @@ pub async fn generate(args: Args) { let instantiate_msg = InstantiateMsg { group_addr: args.group_addr, - multisig_addr, + multisig_addr: multisig_addr.to_string(), time_configuration: Some(time_configuration), mix_denom, }; diff --git a/common/commands/src/validator/cosmwasm/generators/mixnet.rs b/common/commands/src/validator/cosmwasm/generators/mixnet.rs index f5fb1f4c46..8d47ffbca6 100644 --- a/common/commands/src/validator/cosmwasm/generators/mixnet.rs +++ b/common/commands/src/validator/cosmwasm/generators/mixnet.rs @@ -6,15 +6,17 @@ use log::{debug, info}; use cosmwasm_std::Decimal; use mixnet_contract_common::{InitialRewardingParams, InstantiateMsg, Percent}; +use std::str::FromStr; use std::time::Duration; +use validator_client::nyxd::AccountId; #[derive(Debug, Parser)] pub struct Args { #[clap(long)] - pub rewarding_validator_address: Option, + pub rewarding_validator_address: Option, #[clap(long)] - pub vesting_contract_address: Option, + pub vesting_contract_address: Option, #[clap(long)] pub rewarding_denom: Option, @@ -77,13 +79,17 @@ pub async fn generate(args: Args) { debug!("initial_rewarding_params: {:?}", initial_rewarding_params); let rewarding_validator_address = args.rewarding_validator_address.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) - .expect("Rewarding validator address has to be set") + let address = std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + .expect("Rewarding validator address has to be set"); + AccountId::from_str(address.as_str()) + .expect("Failed converting rewarding validator address to AccountId") }); let vesting_contract_address = args.vesting_contract_address.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::VESTING_CONTRACT_ADDRESS) - .expect("Vesting contract address has to be set") + let address = std::env::var(network_defaults::var_names::VESTING_CONTRACT_ADDRESS) + .expect("Vesting contract address has to be set"); + AccountId::from_str(address.as_str()) + .expect("Failed converting vesting contract address to AccountId") }); let rewarding_denom = args.rewarding_denom.unwrap_or_else(|| { @@ -92,8 +98,8 @@ pub async fn generate(args: Args) { }); let instantiate_msg = InstantiateMsg { - rewarding_validator_address, - vesting_contract_address, + rewarding_validator_address: rewarding_validator_address.to_string(), + vesting_contract_address: vesting_contract_address.to_string(), rewarding_denom, epochs_in_interval: args.epochs_in_interval, epoch_duration: Duration::from_secs(args.epoch_duration), diff --git a/common/commands/src/validator/cosmwasm/generators/multisig.rs b/common/commands/src/validator/cosmwasm/generators/multisig.rs index 38e645aeae..95650fa5d6 100644 --- a/common/commands/src/validator/cosmwasm/generators/multisig.rs +++ b/common/commands/src/validator/cosmwasm/generators/multisig.rs @@ -1,12 +1,14 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use clap::Parser; -use log::{debug, info}; +use std::str::FromStr; +use clap::Parser; use cosmwasm_std::Decimal; use cw_utils::{Duration, Threshold}; +use log::{debug, info}; use multisig_contract_common::msg::InstantiateMsg; +use validator_client::nyxd::AccountId; #[derive(Debug, Parser)] pub struct Args { @@ -20,10 +22,10 @@ pub struct Args { pub max_voting_period: u64, #[clap(long)] - pub coconut_bandwidth_contract_address: Option, + pub coconut_bandwidth_contract_address: Option, #[clap(long)] - pub coconut_dkg_contract_address: Option, + pub coconut_dkg_contract_address: Option, } pub async fn generate(args: Args) { @@ -33,13 +35,17 @@ pub async fn generate(args: Args) { let coconut_bandwidth_contract_address = args.coconut_bandwidth_contract_address.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS) - .expect("Coconut bandwidth contract address has to be set") + let address = + std::env::var(network_defaults::var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS) + .expect("Coconut bandwidth contract address has to be set"); + AccountId::from_str(address.as_str()).expect("Failed converting bandwidth contract address to AccountId") }); let coconut_dkg_contract_address = args.coconut_dkg_contract_address.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::COCONUT_DKG_CONTRACT_ADDRESS) - .expect("Coconut DKG contract address has to be set") + let address = std::env::var(network_defaults::var_names::COCONUT_DKG_CONTRACT_ADDRESS) + .expect("Coconut DKG contract address has to be set"); + AccountId::from_str(address.as_str()) + .expect("Failed converting DKG contract address to AccountId") }); let instantiate_msg = InstantiateMsg { @@ -49,8 +55,8 @@ pub async fn generate(args: Args) { .expect("threshold can't be converted to Decimal"), }, max_voting_period: Duration::Time(args.max_voting_period), - coconut_bandwidth_contract_address, - coconut_dkg_contract_address, + coconut_bandwidth_contract_address: coconut_bandwidth_contract_address.to_string(), + coconut_dkg_contract_address: coconut_dkg_contract_address.to_string(), }; debug!("instantiate_msg: {:?}", instantiate_msg); diff --git a/common/commands/src/validator/cosmwasm/generators/vesting.rs b/common/commands/src/validator/cosmwasm/generators/vesting.rs index 0b0695ef4c..c73885587a 100644 --- a/common/commands/src/validator/cosmwasm/generators/vesting.rs +++ b/common/commands/src/validator/cosmwasm/generators/vesting.rs @@ -1,15 +1,18 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::str::FromStr; + use clap::Parser; use log::{debug, info}; +use validator_client::nyxd::AccountId; use vesting_contract_common::InitMsg; #[derive(Debug, Parser)] pub struct Args { #[clap(long)] - pub mixnet_contract_address: Option, + pub mixnet_contract_address: Option, #[clap(long)] pub mix_denom: Option, @@ -21,8 +24,10 @@ pub async fn generate(args: Args) { debug!("Received arguments: {:?}", args); let mixnet_contract_address = args.mixnet_contract_address.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::MIXNET_CONTRACT_ADDRESS) - .expect("Mixnet contract address has to be set") + let address = std::env::var(network_defaults::var_names::MIXNET_CONTRACT_ADDRESS) + .expect("Mixnet contract address has to be set"); + AccountId::from_str(address.as_str()) + .expect("Failed converting mixnet address to AccountId") }); let mix_denom = args.mix_denom.unwrap_or_else(|| { @@ -30,7 +35,7 @@ pub async fn generate(args: Args) { }); let instantiate_msg = InitMsg { - mixnet_contract_address, + mixnet_contract_address: mixnet_contract_address.to_string(), mix_denom, }; From 4e057cd250b87a60027d66c3b5401e5bc70d6c72 Mon Sep 17 00:00:00 2001 From: Mark Sinclair <14054343+mmsinclair@users.noreply.github.com> Date: Fri, 3 Feb 2023 17:10:13 +0000 Subject: [PATCH 290/591] Update build-and-upload-binaries-ci.yml --- .github/workflows/build-and-upload-binaries-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 12902ade16..c8e5bc924e 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -104,7 +104,7 @@ jobs: uses: easingthemes/ssh-deploy@main env: SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} - ARGS: "-avzr --delete" + ARGS: "-avzr" SOURCE: "ci-builds/" REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} From 8dbddb7b7e2c81384bdd9c6d51f3425ed64af736 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 1 Feb 2023 17:16:53 +0100 Subject: [PATCH 291/591] fix: formatting --- common/commands/src/validator/cosmwasm/generators/multisig.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/commands/src/validator/cosmwasm/generators/multisig.rs b/common/commands/src/validator/cosmwasm/generators/multisig.rs index 95650fa5d6..3821374fd0 100644 --- a/common/commands/src/validator/cosmwasm/generators/multisig.rs +++ b/common/commands/src/validator/cosmwasm/generators/multisig.rs @@ -38,7 +38,8 @@ pub async fn generate(args: Args) { let address = std::env::var(network_defaults::var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS) .expect("Coconut bandwidth contract address has to be set"); - AccountId::from_str(address.as_str()).expect("Failed converting bandwidth contract address to AccountId") + AccountId::from_str(address.as_str()) + .expect("Failed converting bandwidth contract address to AccountId") }); let coconut_dkg_contract_address = args.coconut_dkg_contract_address.unwrap_or_else(|| { From 795977a75d24a0f097214d940a2add2e55eb169e Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Mon, 6 Feb 2023 10:56:39 +0100 Subject: [PATCH 292/591] NC Android - setup APK publish (#2967) * ci(nc-android): init workflow apk build & release * ci(nc-android): setup nc android project for APK publish * docs(nc-android): update readme * ci(nc-android): add note in the workflow --- .github/workflows/nc-android-apk.yml | 127 ++++++++++++++++++ nym-connect-android/README.md | 10 +- nym-connect-android/package.json | 6 +- nym-connect-android/src-tauri/Cargo.toml | 10 +- .../nym-connect-android/app/.gitignore | 1 - .../nym-connect-android/app/build.gradle.kts | 112 --------------- .../.editorconfig | 0 .../.gitignore | 2 - .../nym_connect_android/app/.gitignore | 1 + .../nym_connect_android/app/build.gradle.kts | 111 +++++++++++++++ .../app/proguard-rules.pro | 0 .../app/src/main/AndroidManifest.xml | 0 .../nym_connect_android}/MainActivity.kt | 0 .../arm64-v8a/libnym_connect_android.so | 0 .../armeabi-v7a/libnym_connect_android.so | 0 .../jniLibs/x86/libnym_connect_android.so | 0 .../jniLibs/x86_64/libnym_connect_android.so | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_foreground.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_foreground.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../app/src/main/res/values-night/themes.xml | 0 .../app/src/main/res/values/colors.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/themes.xml | 2 +- .../build.gradle.kts | 0 .../buildSrc/build.gradle.kts | 0 .../nym_connect_android/kotlin/BuildTask.kt | 45 +++++++ .../nym_connect_android/kotlin/RustPlugin.kt | 59 ++++++++ .../gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../settings.gradle | 0 nym-connect-android/src-tauri/tauri.conf.json | 4 +- 50 files changed, 360 insertions(+), 130 deletions(-) create mode 100644 .github/workflows/nc-android-apk.yml delete mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore delete mode 100644 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/.editorconfig (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/.gitignore (59%) create mode 100644 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore create mode 100644 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build.gradle.kts rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/proguard-rules.pro (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/AndroidManifest.xml (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android/app/src/main/java/net/nymtech/nym-connect-android => nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android}/MainActivity.kt (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/jniLibs/x86/libnym_connect_android.so (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/jniLibs/x86_64/libnym_connect_android.so (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/layout/activity_main.xml (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/values-night/themes.xml (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/values/colors.xml (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/values/strings.xml (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/app/src/main/res/values/themes.xml (98%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/build.gradle.kts (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/buildSrc/build.gradle.kts (100%) create mode 100644 nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/BuildTask.kt create mode 100644 nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/RustPlugin.kt rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/gradle.properties (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/gradle/wrapper/gradle-wrapper.jar (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/gradle/wrapper/gradle-wrapper.properties (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/gradlew (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/gradlew.bat (100%) rename nym-connect-android/src-tauri/gen/android/{nym-connect-android => nym_connect_android}/settings.gradle (100%) diff --git a/.github/workflows/nc-android-apk.yml b/.github/workflows/nc-android-apk.yml new file mode 100644 index 0000000000..ea12e94f1d --- /dev/null +++ b/.github/workflows/nc-android-apk.yml @@ -0,0 +1,127 @@ +name: NC Android APK Release + +on: + workflow_dispatch: + push: + branches: + - "release/nc-android-v[0-9].[0-9].[0-9]*" + +jobs: + build: + name: Build APK + runs-on: ubuntu-latest + env: + ANDROID_HOME: ${{ github.workspace }}/android-sdk + NDK_VERSION: 25.1.8937393 + NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/${{ env.NDK_VERSION }} + SDK_PLATFORM_VERSION: android-33 + SDK_BUILDTOOLS_VERSION: 33.0.1 + + steps: + - name: Install Dependencies (Linux) + # https://next--tauri.netlify.app/next/guides/getting-started/prerequisites/linux/#1-system-dependencies + run: | + sudo apt-get update + sudo apt-get -y install \ + libwebkit2gtk-4.0-dev \ + build-essential \ + curl \ + wget \ + libssl-dev \ + libgtk-3-dev \ + squashfs-tools \ + libayatana-appindicator3-dev \ + librsvg2-dev + + - name: Install Java + uses: actions/setup-java@v3 + with: + distribution: "temurin" + java-version: "17" + + - name: Install Android SDK manager + # https://developer.android.com/studio/command-line/sdkmanager + run: | + curl -sS https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -o cmdline-tools.zip + unzip cmdline-tools.zip + mkdir -p $ANDROID_HOME/cmdline-tools/latest + mv cmdline-tools/* $ANDROID_HOME/cmdline-tools/latest + rm -rf cmdline-tools + + - name: Install Android S/NDK + run: | + echo y | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses + echo y | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager \ + "platforms;$SDK_PLATFORM_VERSION" \ + "platform-tools" \ + "ndk;$NDK_VERSION" \ + "build-tools;$SDK_BUILDTOOLS_VERSION" + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Install tauri cli + run: cargo install tauri-cli --version "^2.0.0-alpha.2" + + - name: Install rust android targets + run: | + rustup target add aarch64-linux-android \ + armv7-linux-androideabi \ + i686-linux-android \ + x86_64-linux-android + + - name: Setup Nodejs + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install yarn + run: | + npm i -g yarn + yarn --version + + - name: Checkout + uses: actions/checkout@v3 + + - name: Build frontend code + run: | + yarn install --frozen-lockfile + yarn build + yarn workspace @nym/nym-connect-android webpack:prod + + - name: Build APK + working-directory: nym-connect-android + env: + WRY_ANDROID_PACKAGE: net.nymtech.nym_connect_android + WRY_ANDROID_LIBRARY: nym_connect_android + # TODO build with release profile (--release), it will requires + # to sign the APK. For now build with debug profile to avoid that + run: cargo tauri android build --debug --apk + + # TODO add the version number to APK name + - name: Rename APK artifact + run: | + mv nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build/outputs/apk/universal/debug/app-universal-debug.apk \ + nym-connect-debug.apk + + - name: Upload APK artifact + uses: actions/upload-artifact@v3 + with: + name: nc-apk-debug + path: nym-connect-debug.apk + + publish: + name: Publish APK + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Download binary artifact + uses: actions/download-artifact@v3 + with: + name: nc-apk-debug + path: apk + # TODO add a step to upload the APK somewhere + # - name: Publish + # uses: ??? diff --git a/nym-connect-android/README.md b/nym-connect-android/README.md index 73e541083d..a97d3c8ea0 100644 --- a/nym-connect-android/README.md +++ b/nym-connect-android/README.md @@ -21,10 +21,11 @@ https://next--tauri.netlify.app/next/guides/getting-started/prerequisites/linux# ## Installation -Inside the `nym-connect-android` directory, run the following command: +Inside the `nym-connect-android` directory, run the following commands: ``` yarn install +yarn prewebpack:dev ``` ## Development @@ -34,7 +35,7 @@ or a real [device](https://developer.android.com/studio/run/device) connected. Inside the `nym-connect-android/src-tauri` directory, run the following command: ``` -WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android dev +yarn dev ``` #### Debugging @@ -43,10 +44,11 @@ https://next--tauri.netlify.app/next/guides/debugging/application#mobile ## Production -To build the application bundles (APK and AAB files), run the build command. +To build the APK, run the build commands. ``` -WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android build +yarn webpack:prod +WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android build --debug --apk ``` # Storybook diff --git a/nym-connect-android/package.json b/nym-connect-android/package.json index 2d9c094109..13e96efdde 100644 --- a/nym-connect-android/package.json +++ b/nym-connect-android/package.json @@ -8,9 +8,9 @@ "webpack:dev": "yarn webpack serve --config webpack.dev.js", "webpack:dev:onlyThis": "yarn webpack serve --config webpack.dev.js", "webpack:prod": "yarn webpack --progress --config webpack.prod.js", - "tauri:dev": "RUST_DEBUG=1 yarn tauri dev", - "tauri:build": "yarn tauri build", - "dev": "run-p webpack:dev tauri:dev", + "tauri:dev": "WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android dev", + "tauri:build": "WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android build", + "dev": "run-p webpack:dev:onlyThis tauri:dev", "prebuild": "yarn --cwd .. build", "build": "run-s webpack:prod tauri:build", "storybook": "start-storybook -p 6006", diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect-android/src-tauri/Cargo.toml index e967c9729a..6b9ddc186a 100644 --- a/nym-connect-android/src-tauri/Cargo.toml +++ b/nym-connect-android/src-tauri/Cargo.toml @@ -19,9 +19,6 @@ crate-type = ["staticlib", "cdylib", "rlib"] # tauri-build = { version = "2.0.0-alpha.0", features = [] } tauri-build = { git = "https://github.com/tauri-apps/tauri", branch = "next", features = [] } -# tauri-codegen = "2.0.0-alpha.0" -# tauri-macros = "2.0.0-alpha.0" - [dependencies] anyhow = "1.0" bip39 = "1.0" @@ -41,8 +38,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_repr = "0.1" tap = "1.0.1" -# TODO swithing to `rfd101` temporarily, untill https://github.com/tauri-apps/tauri/pull/6174 is merged -tauri = { git = "https://github.com/tauri-apps/tauri", branch = "rfd101", features = ["clipboard-write-text", "native-tls-vendored", "notification-all", "shell-open", "system-tray", "window-close", "window-minimize", "window-start-dragging"] } +tauri = { git = "https://github.com/tauri-apps/tauri", branch = "next", features = ["clipboard-write-text", "native-tls-vendored", "notification-all", "shell-open", "system-tray", "window-close", "window-minimize", "window-start-dragging"] } tendermint-rpc = "0.23.0" thiserror = "1.0" tokio = { version = "1.24.1", features = ["sync", "time"] } @@ -70,3 +66,7 @@ custom-protocol = ["tauri/custom-protocol"] # opt-level = "s" # lto = true +[profile.release] +strip = true +opt-level = "s" +lto = true diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore deleted file mode 100644 index eddc6bd989..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/src/main/java/net/nymtech/nym-connect-android/generated diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts deleted file mode 100644 index 56d94386ff..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts +++ /dev/null @@ -1,112 +0,0 @@ -plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") - id("rustPlugin") -} - -android { - compileSdk = 33 - defaultConfig { - manifestPlaceholders["usesCleartextTraffic"] = "false" - applicationId = "net.nymtech.nym_connect_android" - minSdk = 24 - targetSdk = 33 - versionCode = 1 - versionName = "1.0" - } - sourceSets.getByName("main") { - // Vulkan validation layers - val ndkHome = System.getenv("NDK_HOME") - jniLibs.srcDir("${ndkHome}/sources/third_party/vulkan/src/build-android/jniLibs") - } - buildTypes { - getByName("debug") { - manifestPlaceholders["usesCleartextTraffic"] = "true" - isDebuggable = true - isJniDebuggable = true - isMinifyEnabled = false - packagingOptions { - jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") - - jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") - - jniLibs.keepDebugSymbols.add("*/x86/*.so") - - jniLibs.keepDebugSymbols.add("*/x86_64/*.so") - } - } - getByName("release") { - isMinifyEnabled = false - // proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") - } - } - flavorDimensions.add("abi") - productFlavors { - create("universal") { - val abiList = findProperty("abiList") as? String - - dimension = "abi" - ndk { - abiFilters += abiList?.split(",")?.map { it.trim() } ?: listOf( - "arm64-v8a", "armeabi-v7a", "x86", "x86_64", - ) - } - } - create("arm64") { - dimension = "abi" - ndk { - abiFilters += listOf("arm64-v8a") - } - } - - create("arm") { - dimension = "abi" - ndk { - abiFilters += listOf("armeabi-v7a") - } - } - - create("x86") { - dimension = "abi" - ndk { - abiFilters += listOf("x86") - } - } - - create("x86_64") { - dimension = "abi" - ndk { - abiFilters += listOf("x86_64") - } - } - } - - assetPacks += mutableSetOf() - namespace = "net.nymtech.nym_connect_android" -} - -rust { - rootDirRel = "../../../../" - targets = listOf("aarch64", "armv7", "i686", "x86_64") - arches = listOf("arm64", "arm", "x86", "x86_64") -} - -dependencies { - implementation("androidx.webkit:webkit:1.5.0") - implementation("androidx.appcompat:appcompat:1.5.1") - implementation("com.google.android.material:material:1.7.0") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.4") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") -} - -afterEvaluate { - android.applicationVariants.all { - tasks["mergeUniversalReleaseJniLibFolders"].dependsOn(tasks["rustBuildRelease"]) - tasks["mergeUniversalDebugJniLibFolders"].dependsOn(tasks["rustBuildDebug"]) - productFlavors.filter { it.name != "universal" }.forEach { _ -> - val archAndBuildType = name.capitalize() - tasks["merge${archAndBuildType}JniLibFolders"].dependsOn(tasks["rustBuild${archAndBuildType}"]) - } - } -} diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/.editorconfig b/nym-connect-android/src-tauri/gen/android/nym_connect_android/.editorconfig similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/.editorconfig rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/.editorconfig diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/.gitignore b/nym-connect-android/src-tauri/gen/android/nym_connect_android/.gitignore similarity index 59% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/.gitignore rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/.gitignore index 1eed4c2fbd..b2ed2681b2 100644 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/.gitignore +++ b/nym-connect-android/src-tauri/gen/android/nym_connect_android/.gitignore @@ -9,8 +9,6 @@ /.idea/assetWizardSettings.xml .DS_Store build -/buildSrc/src/main/java/net/nymtech/nym-connect-android/kotlin/BuildTask.kt -/buildSrc/src/main/java/net/nymtech/nym-connect-android/kotlin/RustPlugin.kt /captures .externalNativeBuild .cxx diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore new file mode 100644 index 0000000000..cd06a0a15a --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore @@ -0,0 +1 @@ +/src/main/java/net/nymtech/nym_connect_android/generated diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build.gradle.kts new file mode 100644 index 0000000000..a81c779421 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build.gradle.kts @@ -0,0 +1,111 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("rustPlugin") +} + +android { + compileSdk = 33 + defaultConfig { + manifestPlaceholders["usesCleartextTraffic"] = "false" + applicationId = "net.nymtech.nym_connect_android" + minSdk = 24 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + } + sourceSets.getByName("main") { + // Vulkan validation layers + val ndkHome = System.getenv("NDK_HOME") + jniLibs.srcDir("${ndkHome}/sources/third_party/vulkan/src/build-android/jniLibs") + } + buildTypes { + getByName("debug") { + manifestPlaceholders["usesCleartextTraffic"] = "true" + isDebuggable = true + isJniDebuggable = true + isMinifyEnabled = false + packagingOptions { + jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + + jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") + + jniLibs.keepDebugSymbols.add("*/x86/*.so") + + jniLibs.keepDebugSymbols.add("*/x86_64/*.so") + } + } + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + } + flavorDimensions.add("abi") + productFlavors { + create("universal") { + val abiList = findProperty("abiList") as? String + + dimension = "abi" + ndk { + abiFilters += abiList?.split(",")?.map { it.trim() } ?: listOf( "arm64-v8a", "armeabi-v7a", "x86", "x86_64", + ) + } + } + create("arm64") { + dimension = "abi" + ndk { + abiFilters += listOf("arm64-v8a") + } + } + + create("arm") { + dimension = "abi" + ndk { + abiFilters += listOf("armeabi-v7a") + } + } + + create("x86") { + dimension = "abi" + ndk { + abiFilters += listOf("x86") + } + } + + create("x86_64") { + dimension = "abi" + ndk { + abiFilters += listOf("x86_64") + } + } + } + + assetPacks += mutableSetOf() + namespace = "net.nymtech.nym_connect_android" +} + +rust { + rootDirRel = "../../../../" + targets = listOf("aarch64", "armv7", "i686", "x86_64") + arches = listOf("arm64", "arm", "x86", "x86_64") +} + +dependencies { + implementation("androidx.webkit:webkit:1.5.0") + implementation("androidx.appcompat:appcompat:1.5.1") + implementation("com.google.android.material:material:1.7.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.4") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") +} + +afterEvaluate { + android.applicationVariants.all { + tasks["mergeUniversalReleaseJniLibFolders"].dependsOn(tasks["rustBuildRelease"]) + tasks["mergeUniversalDebugJniLibFolders"].dependsOn(tasks["rustBuildDebug"]) + productFlavors.filter{ it.name != "universal" }.forEach { _ -> + val archAndBuildType = name.capitalize() + tasks["merge${archAndBuildType}JniLibFolders"].dependsOn(tasks["rustBuild${archAndBuildType}"]) + } + } +} diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/proguard-rules.pro b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/proguard-rules.pro similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/proguard-rules.pro rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/proguard-rules.pro diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/AndroidManifest.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/AndroidManifest.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/AndroidManifest.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/AndroidManifest.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/java/net/nymtech/nym-connect-android/MainActivity.kt b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/MainActivity.kt similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/java/net/nymtech/nym-connect-android/MainActivity.kt rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/MainActivity.kt diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86/libnym_connect_android.so similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86/libnym_connect_android.so rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86/libnym_connect_android.so diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86_64/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86_64/libnym_connect_android.so similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86_64/libnym_connect_android.so rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86_64/libnym_connect_android.so diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable/ic_launcher_background.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/drawable/ic_launcher_background.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/layout/activity_main.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/layout/activity_main.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/layout/activity_main.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/layout/activity_main.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values-night/themes.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values-night/themes.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/colors.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/colors.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/strings.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/strings.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml similarity index 98% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml index 1de86a4c9a..7178979168 100644 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml +++ b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml @@ -13,4 +13,4 @@ ?attr/colorPrimaryVariant - + \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym_connect_android/build.gradle.kts similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/build.gradle.kts rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/build.gradle.kts diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/buildSrc/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/build.gradle.kts similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/buildSrc/build.gradle.kts rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/build.gradle.kts diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/BuildTask.kt b/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/BuildTask.kt new file mode 100644 index 0000000000..63289a3731 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/BuildTask.kt @@ -0,0 +1,45 @@ +package net.nymtech + +import java.io.File +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.logging.LogLevel +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.TaskAction + +open class BuildTask : DefaultTask() { + @InputDirectory + @PathSensitive(PathSensitivity.RELATIVE) + var rootDirRel: File? = null + @Input + var target: String? = null + @Input + var release: Boolean? = null + + @TaskAction + fun build() { + val rootDirRel = rootDirRel ?: throw GradleException("rootDirRel cannot be null") + val target = target ?: throw GradleException("target cannot be null") + val release = release ?: throw GradleException("release cannot be null") + val home = (System.getenv("HOME") ?: "") + val cargo_home = (System.getenv("CARGO_HOME") ?: "$home/.cargo") + println("gradle Rust plugin: CARGO_HOME $cargo_home") + project.exec { + workingDir(File(project.projectDir, rootDirRel.path)) + executable("""$cargo_home/bin/cargo-tauri""") + args(listOf("tauri", "android", "android-studio-script")) + if (project.logger.isEnabled(LogLevel.DEBUG)) { + args("-vv") + } else if (project.logger.isEnabled(LogLevel.INFO)) { + args("-v") + } + if (release) { + args("--release") + } + args(listOf("--target", target)) + }.assertNormalExitValue() + } +} \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/RustPlugin.kt b/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/RustPlugin.kt new file mode 100644 index 0000000000..5e8dcdb3ac --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/RustPlugin.kt @@ -0,0 +1,59 @@ +package net.nymtech + +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.Plugin +import org.gradle.api.Project +import java.io.File +import java.util.* + +const val TASK_GROUP = "rust" + +open class Config { + var rootDirRel: String? = null + var targets: List? = null + var arches: List? = null +} + +open class RustPlugin : Plugin { + private lateinit var config: Config + + override fun apply(project: Project) { + config = project.extensions.create("rust", Config::class.java) + project.afterEvaluate { + if (config.targets == null) { + throw GradleException("targets cannot be null") + } + if (config.arches == null) { + throw GradleException("arches cannot be null") + } + for (profile in listOf("debug", "release")) { + val profileCapitalized = profile.capitalize(Locale.ROOT) + val buildTask = project.tasks.maybeCreate( + "rustBuild$profileCapitalized", + DefaultTask::class.java + ).apply { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for all targets" + } + for (targetPair in config.targets!!.withIndex()) { + val targetName = targetPair.value + val targetArch = config.arches!![targetPair.index] + val targetArchCapitalized = targetArch.capitalize(Locale.ROOT) + val targetBuildTask = project.tasks.maybeCreate( + "rustBuild$targetArchCapitalized$profileCapitalized", + BuildTask::class.java + ).apply { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for $targetArch" + rootDirRel = config.rootDirRel?.let { File(it) } + target = targetName + release = profile == "release" + } + buildTask.dependsOn(targetBuildTask) + project.tasks.findByName("preBuild")?.mustRunAfter(targetBuildTask) + } + } + } + } +} diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle.properties b/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle.properties similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle.properties rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle.properties diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.jar b/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.jar rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.jar diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.properties b/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/gradle/wrapper/gradle-wrapper.properties rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.properties diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew b/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew.bat b/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew.bat similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/gradlew.bat rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew.bat diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/settings.gradle b/nym-connect-android/src-tauri/gen/android/nym_connect_android/settings.gradle similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym-connect-android/settings.gradle rename to nym-connect-android/src-tauri/gen/android/nym_connect_android/settings.gradle diff --git a/nym-connect-android/src-tauri/tauri.conf.json b/nym-connect-android/src-tauri/tauri.conf.json index 0572848f3b..2e50e25325 100644 --- a/nym-connect-android/src-tauri/tauri.conf.json +++ b/nym-connect-android/src-tauri/tauri.conf.json @@ -6,8 +6,8 @@ "build": { "distDir": "../dist", "devPath": "http://localhost:9000", - "beforeDevCommand": "yarn webpack:dev:onlyThis", - "beforeBuildCommand": "yarn webpack:prod" + "beforeDevCommand": "", + "beforeBuildCommand": "" }, "tauri": { "bundle": { From 5a89e894a937cfc99bd16a98339bc91af46d5cbb Mon Sep 17 00:00:00 2001 From: cgi-bin/ <6095048+sven-hash@users.noreply.github.com> Date: Thu, 2 Feb 2023 10:34:08 +0100 Subject: [PATCH 293/591] typo: electrum (#2954) --- nym-connect/src/pages/menu/Apps.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-connect/src/pages/menu/Apps.tsx b/nym-connect/src/pages/menu/Apps.tsx index 59d2823b69..fb73d0b343 100644 --- a/nym-connect/src/pages/menu/Apps.tsx +++ b/nym-connect/src/pages/menu/Apps.tsx @@ -4,7 +4,7 @@ import { Box } from '@mui/system'; const appsSchema = { messagingApps: ['Telegram', 'Keybase'], - wallets: ['Blockstream', 'Electum'], + wallets: ['Blockstream', 'Electrum'], }; export const CompatibleApps = () => ( From 3e23bdf3c0c5975187079cf6a537e96037257fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 7 Feb 2023 09:49:19 +0000 Subject: [PATCH 294/591] Feature/service provider interface (#2934) * added additional workspace-wide dependencies * Added conditional serialization on 'BinaryBuildInformationOwned' * initial framework for service provider messages * updated request/response tags to account for existing variants of Socks5Message * handling legacy deserialization * another serialization revamp to account for legacy version * legacy client working with versioned network requester * socks5 client deserializing responses into updated structures * using new structures for sending in socks5 client * SendRequest wrapper for Request::Send variant * created named fields for all variants of 'ControllerCommand' * Versioning socks5 requests + moving to proper Socks5Request struct * Updated backwards compatible Socks5Response * unused imports * poc ServiceProvider trait * wip * implemented 'ServiceProvider' trait on the Network Requester * Socks5RequestError * added properly serialized ErrorResponse to ControlResponse * fixed version serialization + feature selection * handling of version control requests * improved SocksProxyError by providing more concrete variants and removing generic case * got rid of ServiceProviderClient trait and wrote simple example showing control requests * tests for serialisation backwards compatibility * post-merge fixes due to method renaming * enum boxing to make clippy happier * making sure to not drop buffer channel when starting `DirectClient` * Using nym-sdk in the example * Replaced printing version to stdout with proper log call --- Cargo.lock | 23 + Cargo.toml | 6 + clients/client-core/src/config/mod.rs | 7 +- clients/native/src/client/config/mod.rs | 8 +- clients/native/src/client/mod.rs | 61 +- clients/native/src/commands/init.rs | 2 +- clients/socks5/Cargo.toml | 5 +- clients/socks5/src/client/config/mod.rs | 35 +- clients/socks5/src/client/mod.rs | 2 + clients/socks5/src/commands/init.rs | 4 +- clients/socks5/src/error.rs | 11 +- clients/socks5/src/socks/client.rs | 162 +++++- clients/socks5/src/socks/mixnet_responses.rs | 84 ++- clients/socks5/src/socks/mod.rs | 2 +- clients/socks5/src/socks/request.rs | 49 +- clients/socks5/src/socks/server.rs | 5 + clients/socks5/src/socks/types.rs | 76 ++- common/build-information/Cargo.toml | 4 + common/build-information/src/lib.rs | 50 ++ common/nymsphinx/anonymous-replies/Cargo.toml | 2 +- .../src/connection_controller.rs | 47 +- common/socks5/requests/Cargo.toml | 6 +- common/socks5/requests/src/lib.rs | 130 ++++- common/socks5/requests/src/msg.rs | 97 ---- .../src/network_requester_response.rs | 112 ---- common/socks5/requests/src/request.rs | 233 ++++++-- common/socks5/requests/src/response.rs | 403 +++++++++++-- common/socks5/requests/src/version.rs | 21 + .../src-tauri/src/config/mod.rs | 2 +- nym-connect/src-tauri/src/config/mod.rs | 2 +- service-providers/common/Cargo.toml | 25 + .../common/examples/control_requests.rs | 74 +++ .../common/src/interface/control.rs | 204 +++++++ service-providers/common/src/interface/mod.rs | 121 ++++ .../common/src/interface/request.rs | 172 ++++++ .../common/src/interface/response.rs | 163 ++++++ .../common/src/interface/version.rs | 133 +++++ service-providers/common/src/lib.rs | 184 ++++++ .../network-requester/Cargo.toml | 2 + .../network-requester/src/core.rs | 533 ++++++++++-------- .../network-requester/src/error.rs | 7 + .../network-requester/src/main.rs | 4 +- .../network-requester/src/reply.rs | 169 +++++- .../network-requester/src/socks5/tcp.rs | 21 +- .../src/statistics/collector.rs | 51 +- .../network-requester/src/statistics/mod.rs | 2 +- 46 files changed, 2790 insertions(+), 726 deletions(-) delete mode 100644 common/socks5/requests/src/msg.rs delete mode 100644 common/socks5/requests/src/network_requester_response.rs create mode 100644 common/socks5/requests/src/version.rs create mode 100644 service-providers/common/Cargo.toml create mode 100644 service-providers/common/examples/control_requests.rs create mode 100644 service-providers/common/src/interface/control.rs create mode 100644 service-providers/common/src/interface/mod.rs create mode 100644 service-providers/common/src/interface/request.rs create mode 100644 service-providers/common/src/interface/response.rs create mode 100644 service-providers/common/src/interface/version.rs create mode 100644 service-providers/common/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 0f404263c8..11067679cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -458,6 +458,7 @@ dependencies = [ name = "build-information" version = "0.1.0" dependencies = [ + "serde", "vergen 7.5.0", ] @@ -3734,6 +3735,7 @@ name = "nym-network-requester" version = "1.1.8" dependencies = [ "async-trait", + "build-information", "clap 4.1.3", "client-connections", "completions", @@ -3751,6 +3753,7 @@ dependencies = [ "rand 0.7.3", "reqwest", "serde", + "service-providers-common", "socks5-requests", "sqlx 0.6.2", "statistics-common", @@ -3850,6 +3853,7 @@ dependencies = [ "rand 0.7.3", "serde", "serde_json", + "service-providers-common", "socks5-requests", "tap", "task", @@ -5493,6 +5497,22 @@ dependencies = [ "serde", ] +[[package]] +name = "service-providers-common" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "build-information", + "log", + "nym-sdk", + "nymsphinx-anonymous-replies", + "serde", + "serde_json", + "thiserror", + "tokio", +] + [[package]] name = "sha-1" version = "0.9.8" @@ -5674,6 +5694,9 @@ name = "socks5-requests" version = "0.1.0" dependencies = [ "nymsphinx-addressing", + "serde", + "serde_json", + "service-providers-common", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 8dca8bb3eb..0e4a5cf2c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -76,6 +76,7 @@ members = [ "integrations/bity", "mixnode", "sdk/rust/nym-sdk", + "service-providers/common", "service-providers/network-requester", "service-providers/network-statistics", "nym-api", @@ -105,4 +106,9 @@ homepage = "https://nymtech.net" edition = "2021" [workspace.dependencies] +async-trait = "0.1.63" log = "0.4" +thiserror = "1.0.38" +serde = "1.0.152" +serde_json = "1.0.91" +tokio = "1.24.1" diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index e6085720a2..04f6f5b90c 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -171,10 +171,15 @@ impl Config { self } - pub fn with_gateway_endpoint(&mut self, gateway_endpoint: GatewayEndpointConfig) { + pub fn set_gateway_endpoint(&mut self, gateway_endpoint: GatewayEndpointConfig) { self.client.gateway_endpoint = gateway_endpoint; } + pub fn with_gateway_endpoint(mut self, gateway_endpoint: GatewayEndpointConfig) -> Self { + self.client.gateway_endpoint = gateway_endpoint; + self + } + pub fn with_gateway_id>(&mut self, id: S) { self.client.gateway_endpoint.gateway_id = id.into(); } diff --git a/clients/native/src/client/config/mod.rs b/clients/native/src/client/config/mod.rs index f7f08b2008..d87019e735 100644 --- a/clients/native/src/client/config/mod.rs +++ b/clients/native/src/client/config/mod.rs @@ -2,9 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::client::config::template::config_template; -pub use client_core::config::Config as BaseConfig; -pub use client_core::config::MISSING_VALUE; -use client_core::config::{ClientCoreConfigTrait, DebugConfig}; +use client_core::config::ClientCoreConfigTrait; use config::defaults::DEFAULT_WEBSOCKET_LISTENING_PORT; use config::{NymConfig, OptionalSet}; use serde::{Deserialize, Serialize}; @@ -13,6 +11,10 @@ use std::net::{IpAddr, Ipv4Addr}; use std::path::PathBuf; use std::str::FromStr; +pub use client_core::config::Config as BaseConfig; +pub use client_core::config::MISSING_VALUE; +pub use client_core::config::{DebugConfig, GatewayEndpointConfig}; + mod template; #[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone, Copy)] diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index 9c58b614e8..ad8d166024 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -11,19 +11,22 @@ use client_core::client::base_client::{ non_wasm_helpers, BaseClientBuilder, ClientInput, ClientOutput, ClientState, }; use client_core::client::inbound_messages::InputMessage; -use client_core::client::key_manager::KeyManager; -use client_core::client::received_buffer::{ReceivedBufferMessage, ReconstructedMessagesReceiver}; +use client_core::client::received_buffer::{ + ReceivedBufferMessage, ReceivedBufferRequestSender, ReconstructedMessagesReceiver, +}; use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder; use futures::channel::mpsc; use gateway_client::bandwidth::BandwidthController; use log::*; -use nymsphinx::addressing::clients::Recipient; use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx::receiver::ReconstructedMessage; use task::TaskManager; +use tokio::sync::watch::error::SendError; use validator_client::nyxd::QueryNyxdClient; -pub(crate) mod config; +pub use client_core::client::key_manager::KeyManager; +pub use nymsphinx::addressing::clients::Recipient; +pub use nymsphinx::receiver::ReconstructedMessage; +pub mod config; pub struct SocketClient { /// Client configuration options, including, among other things, packet sending rates, @@ -45,6 +48,13 @@ impl SocketClient { } } + pub fn new_with_keys(config: Config, key_manager: KeyManager) -> Self { + SocketClient { + config, + key_manager, + } + } + async fn create_bandwidth_controller(config: &Config) -> BandwidthController { let details = network_defaults::NymNetworkDetails::new_from_env(); let mut client_config = validator_client::Config::try_from_nym_network_details(&details) @@ -120,10 +130,17 @@ impl SocketClient { return Err(ClientError::InvalidSocketMode); } + // don't create bandwidth controller if credentials are disabled + let bandwidth_controller = if self.config.get_base().get_disabled_credentials_mode() { + None + } else { + Some(Self::create_bandwidth_controller(&self.config).await) + }; + let base_builder = BaseClientBuilder::new_from_base_config( self.config.get_base(), self.key_manager, - Some(Self::create_bandwidth_controller(&self.config).await), + bandwidth_controller, non_wasm_helpers::setup_fs_reply_surb_backend( Some(self.config.get_base().get_reply_surb_database_path()), self.config.get_debug_settings(), @@ -157,10 +174,17 @@ impl SocketClient { return Err(ClientError::InvalidSocketMode); } + // don't create bandwidth controller if credentials are disabled + let bandwidth_controller = if self.config.get_base().get_disabled_credentials_mode() { + None + } else { + Some(Self::create_bandwidth_controller(&self.config).await) + }; + let base_client = BaseClientBuilder::new_from_base_config( self.config.get_base(), self.key_manager, - Some(Self::create_bandwidth_controller(&self.config).await), + bandwidth_controller, non_wasm_helpers::setup_fs_reply_surb_backend( Some(self.config.get_base().get_reply_surb_database_path()), self.config.get_debug_settings(), @@ -168,6 +192,8 @@ impl SocketClient { .await?, ); + let address = base_client.as_mix_recipient(); + let mut started_client = base_client.start_base().await?; let client_input = started_client.client_input.register_producer(); let client_output = started_client.client_output.register_consumer(); @@ -185,21 +211,38 @@ impl SocketClient { Ok(DirectClient { client_input, + _received_buffer_request_sender: client_output.received_buffer_request_sender, reconstructed_receiver, - _shutdown_notifier: started_client.task_manager, + address, + shutdown_notifier: started_client.task_manager, }) } } pub struct DirectClient { client_input: ClientInput, + // make sure to not drop the channel + _received_buffer_request_sender: ReceivedBufferRequestSender, reconstructed_receiver: ReconstructedMessagesReceiver, + address: Recipient, // we need to keep reference to this guy otherwise things will start dropping - _shutdown_notifier: TaskManager, + shutdown_notifier: TaskManager, } impl DirectClient { + pub fn address(&self) -> &Recipient { + &self.address + } + + pub fn signal_shutdown(&self) -> Result<(), SendError<()>> { + self.shutdown_notifier.signal_shutdown() + } + + pub async fn wait_for_shutdown(&mut self) { + self.shutdown_notifier.wait_for_shutdown().await + } + /// EXPERIMENTAL DIRECT RUST API /// It's untested and there are absolutely no guarantees about it (but seems to have worked /// well enough in local tests) diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index b56e570ce7..a49cb6101c 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -147,7 +147,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> { .await .tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?; - config.get_base_mut().with_gateway_endpoint(gateway); + config.get_base_mut().set_gateway_endpoint(gateway); config.save_to_file(None).tap_err(|_| { log::error!("Failed to save the config file"); diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index da121b4ad0..e1a186d9ed 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -19,8 +19,8 @@ log = { workspace = true } pin-project = "1.0" pretty_env_logger = "0.4" rand = { version = "0.7.3", features = ["wasm-bindgen"] } -serde = { version = "1.0", features = ["derive"] } # for config serialization/deserialization -serde_json = "1.0.89" +serde = { workspace = true, features = ["derive"] } # for config serialization/deserialization +serde_json = { workspace = true } tap = "1.0.1" thiserror = "1.0.34" tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal"] } @@ -45,6 +45,7 @@ nymsphinx = { path = "../../common/nymsphinx" } ordered-buffer = { path = "../../common/socks5/ordered-buffer" } pemstore = { path = "../../common/pemstore" } proxy-helpers = { path = "../../common/socks5/proxy-helpers" } +service-providers-common = { path = "../../service-providers/common" } socks5-requests = { path = "../../common/socks5/requests" } task = { path = "../../common/task" } topology = { path = "../../common/topology" } diff --git a/clients/socks5/src/client/config/mod.rs b/clients/socks5/src/client/config/mod.rs index 8499637c5e..a47de5de99 100644 --- a/clients/socks5/src/client/config/mod.rs +++ b/clients/socks5/src/client/config/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2021 - Nym Technologies SA +// Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 use crate::client::config::template::config_template; @@ -9,6 +9,8 @@ use config::defaults::DEFAULT_SOCKS5_LISTENING_PORT; use config::{NymConfig, OptionalSet}; use nymsphinx::addressing::clients::Recipient; use serde::{Deserialize, Serialize}; +use service_providers_common::interface::ProviderInterfaceVersion; +use socks5_requests::Socks5ProtocolVersion; use std::fmt::Debug; use std::path::PathBuf; use std::str::FromStr; @@ -90,6 +92,16 @@ impl Config { self } + pub fn with_provider_interface_version(mut self, version: ProviderInterfaceVersion) -> Self { + self.socks5.provider_interface_version = version; + self + } + + pub fn with_socks5_protocol_version(mut self, version: Socks5ProtocolVersion) -> Self { + self.socks5.socks5_protocol_version = version; + self + } + pub fn with_anonymous_replies(mut self, anonymous_replies: bool) -> Self { self.socks5.send_anonymously = anonymous_replies; self @@ -117,6 +129,14 @@ impl Config { .expect("malformed provider address") } + pub fn get_provider_interface_version(&self) -> ProviderInterfaceVersion { + self.socks5.provider_interface_version + } + + pub fn get_socks5_protocol_version(&self) -> Socks5ProtocolVersion { + self.socks5.socks5_protocol_version + } + pub fn get_send_anonymously(&self) -> bool { self.socks5.send_anonymously } @@ -187,6 +207,15 @@ pub struct Socks5 { /// The mix address of the provider to which all requests are going to be sent. provider_mix_address: String, + /// The version of the 'service provider' this client is going to use in its communication with the + /// specified socks5 provider. + // if in doubt, use the legacy version as initially nobody will be using the updated binaries + #[serde(default = "ProviderInterfaceVersion::new_legacy")] + provider_interface_version: ProviderInterfaceVersion, + + #[serde(default = "Socks5ProtocolVersion::new_legacy")] + socks5_protocol_version: Socks5ProtocolVersion, + /// Specifies whether this client is going to use an anonymous sender tag for communication with the service provider. /// While this is going to hide its actual address information, it will make the actual communication /// slower and consume nearly double the bandwidth as it will require sending reply SURBs. @@ -201,6 +230,8 @@ impl Socks5 { Socks5 { listening_port: DEFAULT_SOCKS5_LISTENING_PORT, provider_mix_address: provider_mix_address.into(), + provider_interface_version: ProviderInterfaceVersion::Legacy, + socks5_protocol_version: Socks5ProtocolVersion::Legacy, send_anonymously: false, } } @@ -211,6 +242,8 @@ impl Default for Socks5 { Socks5 { listening_port: DEFAULT_SOCKS5_LISTENING_PORT, provider_mix_address: "".into(), + provider_interface_version: ProviderInterfaceVersion::Legacy, + socks5_protocol_version: Socks5ProtocolVersion::Legacy, send_anonymously: false, } } diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index a6c88ed31a..f2e7bf708c 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -132,6 +132,8 @@ impl NymClient { self_address, shared_lane_queue_lengths, socks::client::Config::new( + config.get_provider_interface_version(), + config.get_socks5_protocol_version(), config.get_send_anonymously(), config.get_connection_start_surbs(), config.get_per_request_surbs(), diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index 38df141afe..94ea24db77 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -153,7 +153,9 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { .await .tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?; - config.get_base_mut().with_gateway_endpoint(gateway); + config.get_base_mut().set_gateway_endpoint(gateway); + + // TODO: ask the service provider we specified for its interface version and set it in the config config.save_to_file(None).tap_err(|_| { log::error!("Failed to save the config file"); diff --git a/clients/socks5/src/error.rs b/clients/socks5/src/error.rs index 96e98f91cc..5d9092867f 100644 --- a/clients/socks5/src/error.rs +++ b/clients/socks5/src/error.rs @@ -1,6 +1,6 @@ use crate::socks::types::SocksProxyError; use client_core::error::ClientCoreError; -use socks5_requests::ConnectionId; +use socks5_requests::{ConnectionError, ConnectionId}; #[derive(thiserror::Error, Debug)] pub enum Socks5ClientError { @@ -28,3 +28,12 @@ pub enum Socks5ClientError { error: String, }, } + +impl From for Socks5ClientError { + fn from(value: ConnectionError) -> Self { + Socks5ClientError::NetworkRequesterError { + connection_id: value.connection_id, + error: value.network_requester_error, + } + } +} diff --git a/clients/socks5/src/socks/client.rs b/clients/socks5/src/socks/client.rs index ff7caa1b6b..d7a8e26b3e 100644 --- a/clients/socks5/src/socks/client.rs +++ b/clients/socks5/src/socks/client.rs @@ -16,7 +16,10 @@ use proxy_helpers::connection_controller::{ }; use proxy_helpers::proxy_runner::ProxyRunner; use rand::RngCore; -use socks5_requests::{ConnectionId, Message, RemoteAddress, Request}; +use service_providers_common::interface::{ProviderInterfaceVersion, RequestVersion}; +use socks5_requests::{ + ConnectionId, RemoteAddress, Socks5ProtocolVersion, Socks5ProviderRequest, Socks5Request, +}; use std::io; use std::net::SocketAddr; use std::pin::Pin; @@ -128,6 +131,8 @@ impl AsyncWrite for StreamState { #[derive(Debug, Copy, Clone)] pub(crate) struct Config { + provider_interface_version: ProviderInterfaceVersion, + socks5_protocol_version: Socks5ProtocolVersion, use_surbs_for_responses: bool, connection_start_surbs: u32, per_request_surbs: u32, @@ -135,16 +140,27 @@ pub(crate) struct Config { impl Config { pub(crate) fn new( + provider_interface_version: ProviderInterfaceVersion, + socks5_protocol_version: Socks5ProtocolVersion, use_surbs_for_responses: bool, connection_start_surbs: u32, per_request_surbs: u32, ) -> Self { Self { + provider_interface_version, + socks5_protocol_version, use_surbs_for_responses, connection_start_surbs, per_request_surbs, } } + + fn request_version(&self) -> RequestVersion { + RequestVersion { + provider_interface: self.provider_interface_version, + provider_protocol: self.socks5_protocol_version, + } + } } /// A client connecting to the Socks proxy server, because @@ -173,7 +189,9 @@ impl Drop for SocksClient { // if we never managed to start a proxy, the entry will not exist in the controller if self.started_proxy { self.controller_sender - .unbounded_send(ControllerCommand::Remove(self.connection_id)) + .unbounded_send(ControllerCommand::Remove { + connection_id: self.connection_id, + }) .unwrap(); } } @@ -248,19 +266,26 @@ impl SocksClient { // Send an error back to the client pub async fn send_error_v4(&mut self, r: ResponseCodeV4) -> Result<(), SocksProxyError> { - self.stream.write_all(&[SOCKS4_VERSION, r as u8]).await?; - Ok(()) + self.stream + .write_all(&[SOCKS4_VERSION, r as u8]) + .await + .map_err(|source| SocksProxyError::SocketWriteError { source }) } pub async fn send_error_v5(&mut self, r: ResponseCodeV5) -> Result<(), SocksProxyError> { - self.stream.write_all(&[SOCKS5_VERSION, r as u8]).await?; - Ok(()) + self.stream + .write_all(&[SOCKS5_VERSION, r as u8]) + .await + .map_err(|source| SocksProxyError::SocketWriteError { source }) } /// Shutdown the `TcpStream` to the client and end the session pub async fn shutdown(&mut self) -> Result<(), SocksProxyError> { info!("client is shutting down its TCP stream"); - self.stream.shutdown().await?; + self.stream + .shutdown() + .await + .map_err(|source| SocksProxyError::SocketShutdownFailure { source })?; self.shutdown_listener.mark_as_success(); Ok(()) } @@ -268,11 +293,20 @@ impl SocksClient { /// Initializes the new client, checking that the correct Socks version (5) /// is in use and that the client is authenticated, then runs the request. pub async fn run(&mut self) -> Result<(), SocksProxyError> { - debug!("New connection from: {}", self.stream.peer_addr()?.ip()); + debug!( + "New connection from: {}", + self.stream + .peer_addr() + .map_err(|source| SocksProxyError::PeerAddrExtractionFailure { source })? + .ip() + ); // Read a byte from the stream and determine the version being requested let mut header = [0u8]; - self.stream.read_exact(&mut header).await?; + self.stream + .read_exact(&mut header) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; self.socks_version = match SocksVersion::try_from(header[0]) { Ok(version) => Some(version), @@ -284,7 +318,10 @@ impl SocksClient { if self.socks_version == Some(SocksVersion::V5) { let mut auth = [0u8]; - self.stream.read_exact(&mut auth).await?; + self.stream + .read_exact(&mut auth) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; self.auth_nmethods = auth[0]; self.authenticate_socks5().await?; } @@ -293,8 +330,15 @@ impl SocksClient { } async fn send_anonymous_connect_to_mixnet(&mut self, remote_address: RemoteAddress) { - let req = Request::new_connect(self.connection_id, remote_address, None); - let msg = Message::Request(req); + // TODO: simplify by using `request_version` + let req = Socks5Request::new_connect( + self.config.socks5_protocol_version, + self.connection_id, + remote_address, + None, + ); + let msg = + Socks5ProviderRequest::new_provider_data(self.config.provider_interface_version, req); let input_message = InputMessage::new_anonymous( self.service_provider, @@ -309,8 +353,15 @@ impl SocksClient { } async fn send_connect_to_mixnet_with_return_address(&mut self, remote_address: RemoteAddress) { - let req = Request::new_connect(self.connection_id, remote_address, Some(self.self_address)); - let msg = Message::Request(req); + // TODO: simplify by using `request_version` + let req = Socks5Request::new_connect( + self.config.socks5_protocol_version, + self.connection_id, + remote_address, + Some(self.self_address), + ); + let msg = + Socks5ProviderRequest::new_provider_data(self.config.provider_interface_version, req); let input_message = InputMessage::new_regular( self.service_provider, @@ -350,6 +401,7 @@ impl SocksClient { let input_sender = self.input_sender.clone(); let anonymous = self.config.use_surbs_for_responses; let per_request_surbs = self.config.per_request_surbs; + let request_version = self.config.request_version(); let recipient = self.service_provider; let (stream, _) = ProxyRunner::new( @@ -363,8 +415,16 @@ impl SocksClient { self.shutdown_listener.clone(), ) .run(move |conn_id, read_data, socket_closed| { - let provider_request = Request::new_send(conn_id, read_data, socket_closed); - let provider_message = Message::Request(provider_request); + let provider_request = Socks5Request::new_send( + request_version.provider_protocol, + conn_id, + read_data, + socket_closed, + ); + let provider_message = Socks5ProviderRequest::new_provider_data( + request_version.provider_interface, + provider_request, + ); let lane = TransmissionLane::ConnectionId(conn_id); if anonymous { InputMessage::new_anonymous( @@ -413,7 +473,10 @@ impl SocksClient { self.started_proxy = true; self.controller_sender - .unbounded_send(ControllerCommand::Insert(self.connection_id, mix_sender)) + .unbounded_send(ControllerCommand::Insert { + connection_id: self.connection_id, + connection_sender: mix_sender, + }) .unwrap(); info!( @@ -491,7 +554,13 @@ impl SocksClient { /// into the Authenticator (where it'll be more easily testable) /// would be a good next step. async fn authenticate_socks5(&mut self) -> Result<(), SocksProxyError> { - debug!("Authenticating w/ {}", self.stream.peer_addr()?.ip()); + debug!( + "Authenticating w/ {}", + self.stream + .peer_addr() + .map_err(|source| SocksProxyError::PeerAddrExtractionFailure { source })? + .ip() + ); // Get valid auth methods let methods = self.get_available_methods().await?; trace!("methods: {:?}", methods); @@ -505,27 +574,45 @@ impl SocksClient { response[1] = AuthenticationMethods::UserPass as u8; debug!("Sending USER/PASS packet"); - self.stream.write_all(&response).await?; + self.stream + .write_all(&response) + .await + .map_err(|source| SocksProxyError::SocketWriteError { source })?; let mut header = [0u8; 2]; // Read a byte from the stream and determine the version being requested - self.stream.read_exact(&mut header).await?; + self.stream + .read_exact(&mut header) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; // debug!("Auth Header: [{}, {}]", header[0], header[1]); // Username parsing let ulen = header[1]; let mut username = vec![0; ulen as usize]; - self.stream.read_exact(&mut username).await?; + self.stream + .read_exact(&mut username) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; // Password Parsing - let plen = self.stream.read_u8().await?; + let plen = self + .stream + .read_u8() + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; let mut password = vec![0; plen as usize]; - self.stream.read_exact(&mut password).await?; + self.stream + .read_exact(&mut password) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; - let username_str = String::from_utf8(username)?; - let password_str = String::from_utf8(password)?; + let username_str = String::from_utf8(username) + .map_err(|source| SocksProxyError::MalformedAuthUsername { source })?; + let password_str = String::from_utf8(password) + .map_err(|source| SocksProxyError::MalformedAuthPassword { source })?; let user = User { username: username_str, @@ -536,11 +623,17 @@ impl SocksClient { if self.authenticator.is_allowed(&user) { debug!("Access Granted. User: {}", user.username); let response = [1, ResponseCodeV5::Success as u8]; - self.stream.write_all(&response).await?; + self.stream + .write_all(&response) + .await + .map_err(|source| SocksProxyError::SocketWriteError { source })?; } else { debug!("Access Denied. User: {}", user.username); let response = [1, ResponseCodeV5::Failure as u8]; - self.stream.write_all(&response).await?; + self.stream + .write_all(&response) + .await + .map_err(|source| SocksProxyError::SocketWriteError { source })?; // Shutdown self.shutdown().await?; @@ -551,12 +644,18 @@ impl SocksClient { // set the default auth method (no auth) response[1] = AuthenticationMethods::NoAuth as u8; debug!("Sending NOAUTH packet"); - self.stream.write_all(&response).await?; + self.stream + .write_all(&response) + .await + .map_err(|source| SocksProxyError::SocketWriteError { source })?; Ok(()) } else { warn!("Client has no suitable authentication methods!"); response[1] = AuthenticationMethods::NoMethods as u8; - self.stream.write_all(&response).await?; + self.stream + .write_all(&response) + .await + .map_err(|source| SocksProxyError::SocketWriteError { source })?; self.shutdown().await?; Err(ResponseCodeV5::Failure.into()) } @@ -567,7 +666,10 @@ impl SocksClient { let mut methods: Vec = Vec::with_capacity(self.auth_nmethods as usize); for _ in 0..self.auth_nmethods { let mut method = [0u8; 1]; - self.stream.read_exact(&mut method).await?; + self.stream + .read_exact(&mut method) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; if self.authenticator.auth_methods.contains(&method[0]) { methods.append(&mut method.to_vec()); } diff --git a/clients/socks5/src/socks/mixnet_responses.rs b/clients/socks5/src/socks/mixnet_responses.rs index f562ee5b68..8f1348f795 100644 --- a/clients/socks5/src/socks/mixnet_responses.rs +++ b/clients/socks5/src/socks/mixnet_responses.rs @@ -5,8 +5,9 @@ use log::*; use client_core::client::received_buffer::ReconstructedMessagesReceiver; use client_core::client::received_buffer::{ReceivedBufferMessage, ReceivedBufferRequestSender}; use nymsphinx::receiver::ReconstructedMessage; -use proxy_helpers::connection_controller::{ControllerCommand, ControllerSender}; -use socks5_requests::Message; +use proxy_helpers::connection_controller::ControllerSender; +use service_providers_common::interface::{ControlResponse, ResponseContent}; +use socks5_requests::{Socks5ProviderResponse, Socks5Response, Socks5ResponseContent}; use task::TaskClient; use crate::error::Socks5ClientError; @@ -52,6 +53,39 @@ impl MixnetResponseListener { } } + fn on_control_response( + &self, + control_response: ControlResponse, + ) -> Result<(), Socks5ClientError> { + error!("received a control response which we don't know how to handle yet!"); + error!("got: {:?}", control_response); + + // I guess we'd need another channel here to forward those to where they need to go + + Ok(()) + } + + fn on_provider_data_response( + &self, + provider_response: Socks5Response, + ) -> Result<(), Socks5ClientError> { + match provider_response.content { + Socks5ResponseContent::ConnectionError(err_response) => { + error!( + "Network requester failed on connection id {} with error: {}", + err_response.connection_id, err_response.network_requester_error + ); + Err(err_response.into()) + } + Socks5ResponseContent::NetworkData(response) => { + self.controller_sender + .unbounded_send(response.into()) + .unwrap(); + Ok(()) + } + } + } + fn on_message( &self, reconstructed_message: ReconstructedMessage, @@ -60,38 +94,28 @@ impl MixnetResponseListener { if reconstructed_message.sender_tag.is_some() { warn!("this message was sent anonymously - it couldn't have come from the service provider"); } - - let response = match Message::try_from_bytes(&raw_message) { + match Socks5ProviderResponse::try_from_bytes(&raw_message) { Err(err) => { - warn!("failed to parse received response - {err}"); - return Ok(()); + warn!("failed to parse received response: {err}"); + Ok(()) } - Ok(Message::Request(_)) => { - warn!("unexpected request"); - return Ok(()); - } - Ok(Message::Response(data)) => data, - Ok(Message::NetworkRequesterResponse(r)) => { - error!( - "Network requester failed on connection id {} with error: {}", - r.connection_id, r.network_requester_error + Ok(response) => { + // as long as the client used the same (or older) interface than the service provider, + // the response should have used exactly the same version + trace!( + "the received response was sent with {:?} interface version", + response.interface_version ); - return Err(Socks5ClientError::NetworkRequesterError { - connection_id: r.connection_id, - error: r.network_requester_error, - }); + match response.content { + ResponseContent::Control(control_response) => { + self.on_control_response(control_response) + } + ResponseContent::ProviderData(provider_response) => { + self.on_provider_data_response(provider_response) + } + } } - }; - - self.controller_sender - .unbounded_send(ControllerCommand::Send( - response.connection_id, - response.data, - response.is_closed, - )) - .unwrap(); - - Ok(()) + } } pub(crate) async fn run(&mut self) { diff --git a/clients/socks5/src/socks/mod.rs b/clients/socks5/src/socks/mod.rs index 16603839ff..36cc580480 100644 --- a/clients/socks5/src/socks/mod.rs +++ b/clients/socks5/src/socks/mod.rs @@ -33,7 +33,7 @@ impl TryFrom for SocksVersion { match version { SOCKS4_VERSION => Ok(Self::V4), SOCKS5_VERSION => Ok(Self::V5), - _ => Err(SocksProxyError::UnsupportedProxyVersion(version)), + _ => Err(SocksProxyError::UnsupportedProxyVersion { version }), } } } diff --git a/clients/socks5/src/socks/request.rs b/clients/socks5/src/socks/request.rs index ecf9b656f3..782273f8b7 100644 --- a/clients/socks5/src/socks/request.rs +++ b/clients/socks5/src/socks/request.rs @@ -28,7 +28,10 @@ impl SocksRequest { log::trace!("read from stream socks4"); let mut packet = [0u8; 3]; - stream.read_exact(&mut packet).await?; + stream + .read_exact(&mut packet) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; // CD (command) let Some(command) = SocksCommand::from(packet[0] as usize) else { @@ -43,7 +46,10 @@ impl SocksRequest { // DSTIP let mut ip = [0u8; 4]; - stream.read_exact(&mut ip).await?; + stream + .read_exact(&mut ip) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; // USERID let _userid = read_until_zero(stream).await; @@ -76,12 +82,17 @@ impl SocksRequest { let mut packet = [0u8; 4]; // Read a byte from the stream and determine the version being requested - stream.read_exact(&mut packet).await?; + stream + .read_exact(&mut packet) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; // VER if packet[0] != SOCKS5_VERSION { warn!("Unsupported version: SOCKS{}", packet[0]); - return Err(SocksProxyError::UnsupportedProxyVersion(packet[0])); + return Err(SocksProxyError::UnsupportedProxyVersion { + version: (packet[0]), + }); } // CMD @@ -103,26 +114,41 @@ impl SocksRequest { let addr = match addr_type { AddrType::Domain => { let mut domain_length = [0u8]; - stream.read_exact(&mut domain_length).await?; + stream + .read_exact(&mut domain_length) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; let mut domain = vec![0u8; domain_length[0] as usize]; - stream.read_exact(&mut domain).await?; + stream + .read_exact(&mut domain) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; domain } AddrType::V4 => { let mut addr = [0u8; 4]; - stream.read_exact(&mut addr).await?; + stream + .read_exact(&mut addr) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; addr.to_vec() } AddrType::V6 => { let mut addr = [0u8; 16]; - stream.read_exact(&mut addr).await?; + stream + .read_exact(&mut addr) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; addr.to_vec() } }; // DST.PORT let mut port = [0u8; 2]; - stream.read_exact(&mut port).await?; + stream + .read_exact(&mut port) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; let port = merge_u8_into_u16(port[0], port[1]); Ok(SocksRequest { @@ -179,7 +205,10 @@ where let mut result = Vec::new(); let mut char = [0u8]; loop { - stream.read_exact(&mut char).await?; + stream + .read_exact(&mut char) + .await + .map_err(|source| SocksProxyError::SocketReadError { source })?; if char[0] == 0 { break; } diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index 0b193dc9d4..2d4f01f8c5 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -86,6 +86,11 @@ impl SphinxSocksServer { mixnet_response_listener.run().await; }); + // TODO:, if required, there should be another task here responsible for control requests. + // it should get `input_sender` to send actual requests into the mixnet + // and some channel that connects it from `MixnetResponseListener` to receive + // any control responses + loop { tokio::select! { Ok((stream, _remote)) = listener.accept() => { diff --git a/clients/socks5/src/socks/types.rs b/clients/socks5/src/socks/types.rs index e561d0025d..b7f7023115 100644 --- a/clients/socks5/src/socks/types.rs +++ b/clients/socks5/src/socks/types.rs @@ -1,3 +1,7 @@ +use socks5_requests::Socks5RequestError; +use std::string::FromUtf8Error; +use thiserror::Error; + /// SOCKS4 Response codes #[allow(dead_code)] pub(crate) enum ResponseCodeV4 { @@ -8,9 +12,8 @@ pub(crate) enum ResponseCodeV4 { } /// Possible SOCKS5 Response Codes -#[allow(dead_code)] -#[derive(Debug, thiserror::Error)] -pub(crate) enum ResponseCodeV5 { +#[derive(Debug, Error)] +pub enum ResponseCodeV5 { #[error("SOCKS5 Server Success")] Success = 0x00, #[error("SOCKS5 Server Failure")] @@ -31,30 +34,55 @@ pub(crate) enum ResponseCodeV5 { AddrTypeNotSupported = 0x08, } -#[derive(Debug)] +#[derive(Error, Debug)] pub enum SocksProxyError { - GenericError(Box), - UnsupportedProxyVersion(u8), -} + #[error("{version} of the socks protocol is not supported by this client")] + UnsupportedProxyVersion { version: u8 }, -impl std::fmt::Display for SocksProxyError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - SocksProxyError::GenericError(err) => write!(f, "GenericError - {err}"), - SocksProxyError::UnsupportedProxyVersion(version) => { - write!(f, "Unsupported proxy version {}", version) - } - } - } -} + #[error("failed to write to the socket: {source}")] + SocketWriteError { + #[source] + source: std::io::Error, + }, -impl From for SocksProxyError -where - E: std::error::Error + Send + Sync + 'static, -{ - fn from(err: E) -> Self { - SocksProxyError::GenericError(Box::new(err)) - } + #[error("failed to read from the socket: {source}")] + SocketReadError { + #[source] + source: std::io::Error, + }, + + #[error("failed to shutdown underlying socket stream: {source}")] + SocketShutdownFailure { + #[source] + source: std::io::Error, + }, + + #[error("failed to extract ip address of the connected peer: {source}")] + PeerAddrExtractionFailure { + #[source] + source: std::io::Error, + }, + + #[error("failed to authenticate user due to malformed username: {source}")] + MalformedAuthUsername { + #[source] + source: FromUtf8Error, + }, + + #[error("failed to authenticate user due to malformed password: {source}")] + MalformedAuthPassword { + #[source] + source: FromUtf8Error, + }, + + #[error(transparent)] + Socks5ResponseFailure(#[from] ResponseCodeV5), + + #[error("could not complete the provider request: {source}")] + ProviderRequestFailure { + #[from] + source: Socks5RequestError, + }, } /// DST.addr variant types diff --git a/common/build-information/Cargo.toml b/common/build-information/Cargo.toml index 0f56bec7f1..e76a5002c9 100644 --- a/common/build-information/Cargo.toml +++ b/common/build-information/Cargo.toml @@ -6,6 +6,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +serde = { workspace = true, features = ["derive"], optional = true } [build-dependencies] vergen = { version = "7", default-features = false, features = ["build", "git", "rustc", "cargo"] } + +[features] +default = [] \ No newline at end of file diff --git a/common/build-information/src/lib.rs b/common/build-information/src/lib.rs index f2060154f0..c5d7e7b4af 100644 --- a/common/build-information/src/lib.rs +++ b/common/build-information/src/lib.rs @@ -4,6 +4,7 @@ // TODO: at a later date this crate should probably also expose `ContractBuildInformation` // and be used by our smart contracts +#[derive(Debug)] pub struct BinaryBuildInformation { // VERGEN_BUILD_TIMESTAMP /// Provides the build timestamp, for example `2021-02-23T20:14:46.558472672+00:00`. @@ -53,6 +54,19 @@ impl BinaryBuildInformation { } } + pub fn to_owned(&self) -> BinaryBuildInformationOwned { + BinaryBuildInformationOwned { + build_timestamp: self.build_timestamp.to_owned(), + build_version: self.build_version.to_owned(), + commit_sha: self.commit_sha.to_owned(), + commit_timestamp: self.commit_timestamp.to_owned(), + commit_branch: self.commit_branch.to_owned(), + rustc_version: self.rustc_version.to_owned(), + rustc_channel: self.rustc_channel.to_owned(), + cargo_profile: self.cargo_profile.to_owned(), + } + } + pub fn pretty_print(&self) -> String { format!( r#" @@ -84,3 +98,39 @@ impl BinaryBuildInformation { ) } } + +#[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct BinaryBuildInformationOwned { + // VERGEN_BUILD_TIMESTAMP + /// Provides the build timestamp, for example `2021-02-23T20:14:46.558472672+00:00`. + pub build_timestamp: String, + + // VERGEN_BUILD_SEMVER + /// Provides the build version, for example `0.1.0-9-g46f83e1`. + pub build_version: String, + + // VERGEN_GIT_SHA + /// Provides the hash of the commit that was used for the build, for example `46f83e112520533338245862d366f6a02cef07d4`. + pub commit_sha: String, + + // VERGEN_GIT_COMMIT_TIMESTAMP + /// Provides the timestamp of the commit that was used for the build, for example `2021-02-23T08:08:02-05:00`. + pub commit_timestamp: String, + + // VERGEN_GIT_BRANCH + /// Provides the name of the git branch that was used for the build, for example `master`. + pub commit_branch: String, + + // VERGEN_RUSTC_SEMVER + /// Provides the rustc version that was used for the build, for example `1.52.0-nightly`. + pub rustc_version: String, + + // VERGEN_RUSTC_CHANNEL + /// Provides the rustc channel that was used for the build, for example `nightly`. + pub rustc_channel: String, + + // VERGEN_CARGO_PROFILE + /// Provides the cargo profile that was used for the build, for example `debug`. + pub cargo_profile: String, +} diff --git a/common/nymsphinx/anonymous-replies/Cargo.toml b/common/nymsphinx/anonymous-replies/Cargo.toml index 5ddb069e19..6128eaecfc 100644 --- a/common/nymsphinx/anonymous-replies/Cargo.toml +++ b/common/nymsphinx/anonymous-replies/Cargo.toml @@ -12,7 +12,7 @@ bs58 = "0.4" serde = "1.0" thiserror = "1" -crypto = { path = "../../crypto" } +crypto = { path = "../../crypto", features = ["symmetric", "rand"] } nymsphinx-addressing = { path = "../addressing" } nymsphinx-params = { path = "../params" } nymsphinx-types = { path = "../types" } diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index bfe0fbae55..98eb12e9a9 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -6,7 +6,7 @@ use futures::channel::mpsc; use futures::StreamExt; use log::*; use ordered_buffer::{OrderedMessage, OrderedMessageBuffer, ReadContiguousData}; -use socks5_requests::ConnectionId; +use socks5_requests::{ConnectionId, NetworkData, SendRequest}; use std::{ collections::{HashMap, HashSet}, time::Duration, @@ -36,9 +36,38 @@ pub type ControllerSender = mpsc::UnboundedSender; pub type ControllerReceiver = mpsc::UnboundedReceiver; pub enum ControllerCommand { - Insert(ConnectionId, ConnectionSender), - Remove(ConnectionId), - Send(ConnectionId, Vec, bool), + Insert { + connection_id: ConnectionId, + connection_sender: ConnectionSender, + }, + Remove { + connection_id: ConnectionId, + }, + Send { + connection_id: ConnectionId, + data: Vec, + is_closed: bool, + }, +} + +impl From for ControllerCommand { + fn from(value: NetworkData) -> Self { + ControllerCommand::Send { + connection_id: value.connection_id, + data: value.data, + is_closed: value.is_closed, + } + } +} + +impl From for ControllerCommand { + fn from(value: SendRequest) -> Self { + ControllerCommand::Send { + connection_id: value.conn_id, + data: value.data, + is_closed: value.local_closed, + } + } } struct ActiveConnection { @@ -235,13 +264,13 @@ impl Controller { loop { tokio::select! { command = self.receiver.next() => match command { - Some(ControllerCommand::Send(conn_id, data, is_closed)) => { - self.send_to_connection(conn_id, data, is_closed) + Some(ControllerCommand::Send{connection_id, data, is_closed}) => { + self.send_to_connection(connection_id, data, is_closed) } - Some(ControllerCommand::Insert(conn_id, sender)) => { - self.insert_connection(conn_id, sender) + Some(ControllerCommand::Insert{connection_id, connection_sender}) => { + self.insert_connection(connection_id, connection_sender) } - Some(ControllerCommand::Remove(conn_id)) => self.remove_connection(conn_id), + Some(ControllerCommand::Remove{ connection_id }) => self.remove_connection(connection_id), None => { log::trace!("SOCKS5 Controller: Stopping since channel closed"); break; diff --git a/common/socks5/requests/Cargo.toml b/common/socks5/requests/Cargo.toml index e7bd46d279..f8bb8336ca 100644 --- a/common/socks5/requests/Cargo.toml +++ b/common/socks5/requests/Cargo.toml @@ -7,5 +7,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +thiserror = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } + nymsphinx-addressing = { path = "../../../common/nymsphinx/addressing" } -thiserror = "1" +service-providers-common = { path = "../../../service-providers/common" } diff --git a/common/socks5/requests/src/lib.rs b/common/socks5/requests/src/lib.rs index b7da4498fa..f2bf2124e4 100644 --- a/common/socks5/requests/src/lib.rs +++ b/common/socks5/requests/src/lib.rs @@ -1,12 +1,128 @@ -// Copyright 2020-2022 - Nym Technologies SA +// Copyright 2020-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -pub mod msg; -pub mod network_requester_response; -pub mod request; -pub mod response; +use service_providers_common::interface; +use service_providers_common::interface::ServiceProviderMessagingError; +use thiserror::Error; -pub use msg::*; -pub use network_requester_response::*; pub use request::*; pub use response::*; +pub use version::*; + +pub mod request; +pub mod response; +pub mod version; + +pub type Socks5ProviderRequest = interface::Request; +pub type Socks5ProviderResponse = interface::Response; + +#[derive(Debug, Error)] +pub enum Socks5RequestError { + #[error("failed to deserialize received request: {source}")] + RequestDeserialization { + #[from] + source: RequestDeserializationError, + }, + + #[error("failed to deserialize received response: {source}")] + ResponseDeserialization { + #[from] + source: ResponseDeserializationError, + }, + + #[error(transparent)] + ProviderInterfaceError(#[from] ServiceProviderMessagingError), +} + +#[cfg(test)] +mod tests { + use super::*; + use service_providers_common::interface::RequestContent; + + #[cfg(test)] + mod interface_backwards_compatibility { + use super::*; + use service_providers_common::interface::ProviderInterfaceVersion; + + #[test] + fn old_client_vs_new_service_provider() { + let old_serialized_connect = vec![ + 0, 0, 2, 254, 34, 100, 192, 20, 13, 171, 0, 16, 56, 48, 46, 50, 52, 57, 46, 57, 57, + 46, 49, 52, 56, 58, 56, 48, 34, 112, 17, 182, 225, 6, 174, 216, 160, 41, 72, 236, + 160, 90, 156, 3, 250, 41, 243, 53, 191, 178, 218, 53, 170, 14, 185, 33, 94, 153, + 25, 41, 6, 82, 169, 187, 88, 246, 211, 57, 68, 225, 228, 231, 116, 29, 119, 235, + 160, 14, 156, 205, 66, 1, 75, 204, 204, 220, 14, 150, 191, 203, 174, 88, 121, 173, + 83, 219, 188, 164, 194, 212, 238, 228, 4, 128, 48, 105, 224, 83, 17, 246, 233, 16, + 235, 223, 68, 87, 13, 40, 34, 186, 218, 204, 126, 145, + ]; + + let new_deserialized = + Socks5ProviderRequest::try_from_bytes(&old_serialized_connect).unwrap(); + + match new_deserialized.content { + RequestContent::ProviderData(req) => match req.content { + Socks5RequestContent::Connect(connect_req) => { + assert_eq!(connect_req.remote_addr, "80.249.99.148:80".to_string()); + assert_eq!(connect_req.conn_id, 215647648274976171); + assert_eq!(connect_req.return_address, Some("3KRydEpanwjFhq5GAraVjRUF1Tno7w7oc4EwJYTGNo5J.RgZ7uMJHruBQqD5hC9Ghi3sqiTn6NycfM5qCfJz6yoM@9Byd9VAtyYMnbVAcqdoQxJnq76XEg2dbxbiF5Aa5Jj9J".parse().unwrap())); + } + _ => panic!("unexpected request"), + }, + _ => panic!("unexpected request"), + } + + let old_serialized_send = vec![ + 0, 1, 108, 102, 28, 19, 50, 178, 37, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 69, 84, + 32, 47, 49, 77, 66, 46, 122, 105, 112, 32, 72, 84, 84, 80, 47, 49, 46, 49, 13, 10, + 72, 111, 115, 116, 58, 32, 105, 112, 118, 52, 46, 100, 111, 119, 110, 108, 111, 97, + 100, 46, 116, 104, 105, 110, 107, 98, 114, 111, 97, 100, 98, 97, 110, 100, 46, 99, + 111, 109, 13, 10, 85, 115, 101, 114, 45, 65, 103, 101, 110, 116, 58, 32, 99, 117, + 114, 108, 47, 55, 46, 54, 56, 46, 48, 13, 10, 65, 99, 99, 101, 112, 116, 58, 32, + 42, 47, 42, 13, 10, 13, 10, + ]; + + let new_deserialized = + Socks5ProviderRequest::try_from_bytes(&old_serialized_send).unwrap(); + + match new_deserialized.content { + RequestContent::ProviderData(req) => match req.content { + Socks5RequestContent::Send(send_req) => { + assert_eq!(send_req.conn_id, 7810961472501196273); + assert_eq!(send_req.data.len(), 111); + assert!(!send_req.local_closed); + } + _ => panic!("unexpected request"), + }, + _ => panic!("unexpected request"), + } + } + + #[test] + fn new_client_vs_old_service_provider() { + let return_address = "3KRydEpanwjFhq5GAraVjRUF1Tno7w7oc4EwJYTGNo5J.RgZ7uMJHruBQqD5hC9Ghi3sqiTn6NycfM5qCfJz6yoM@9Byd9VAtyYMnbVAcqdoQxJnq76XEg2dbxbiF5Aa5Jj9J".parse().unwrap(); + + let new_connect = Socks5ProviderRequest::new_provider_data( + ProviderInterfaceVersion::Legacy, + Socks5Request::new_connect( + Socks5ProtocolVersion::Legacy, + 215647648274976171, + "80.249.99.148:80".to_string(), + Some(return_address), + ), + ); + + let legacy_serialised = new_connect.into_bytes(); + let old_serialized_connect = vec![ + 0, 0, 2, 254, 34, 100, 192, 20, 13, 171, 0, 16, 56, 48, 46, 50, 52, 57, 46, 57, 57, + 46, 49, 52, 56, 58, 56, 48, 34, 112, 17, 182, 225, 6, 174, 216, 160, 41, 72, 236, + 160, 90, 156, 3, 250, 41, 243, 53, 191, 178, 218, 53, 170, 14, 185, 33, 94, 153, + 25, 41, 6, 82, 169, 187, 88, 246, 211, 57, 68, 225, 228, 231, 116, 29, 119, 235, + 160, 14, 156, 205, 66, 1, 75, 204, 204, 220, 14, 150, 191, 203, 174, 88, 121, 173, + 83, 219, 188, 164, 194, 212, 238, 228, 4, 128, 48, 105, 224, 83, 17, 246, 233, 16, + 235, 223, 68, 87, 13, 40, 34, 186, 218, 204, 126, 145, + ]; + + assert_eq!(legacy_serialised, old_serialized_connect); + } + } +} diff --git a/common/socks5/requests/src/msg.rs b/common/socks5/requests/src/msg.rs deleted file mode 100644 index 906c643524..0000000000 --- a/common/socks5/requests/src/msg.rs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2020-2022 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use thiserror::Error; - -use crate::network_requester_response::{Error as NrError, NetworkRequesterResponse}; -use crate::request::{Request, RequestError}; -use crate::response::{Response, ResponseError}; - -#[derive(Debug, Error)] -pub enum MessageError { - #[error(transparent)] - Request(RequestError), - - #[error("{0:?}")] - Response(ResponseError), - - #[error(transparent)] - NetworkRequesterResponseError(NrError), - - #[error("no data")] - NoData, - - #[error("unknown message type received")] - UnknownMessageType, -} - -#[derive(Debug)] -pub enum Message { - Request(Request), - Response(Response), - NetworkRequesterResponse(NetworkRequesterResponse), -} - -impl Message { - const REQUEST_FLAG: u8 = 0; - const RESPONSE_FLAG: u8 = 1; - const NR_RESPONSE_FLAG: u8 = 2; - - pub fn conn_id(&self) -> u64 { - match self { - Message::Request(req) => match req { - Request::Connect(c) => c.conn_id, - Request::Send(conn_id, _, _) => *conn_id, - }, - Message::Response(resp) => resp.connection_id, - Message::NetworkRequesterResponse(resp) => resp.connection_id, - } - } - - pub fn size(&self) -> usize { - match self { - Message::Request(req) => match req { - Request::Connect(_) => 0, - Request::Send(_, data, _) => data.len(), - }, - Message::Response(resp) => resp.data.len(), - Message::NetworkRequesterResponse(_) => 0, - } - } - - pub fn try_from_bytes(b: &[u8]) -> Result { - if b.is_empty() { - return Err(MessageError::NoData); - } - - if b[0] == Self::REQUEST_FLAG { - Request::try_from_bytes(&b[1..]) - .map(Message::Request) - .map_err(MessageError::Request) - } else if b[0] == Self::RESPONSE_FLAG { - Response::try_from_bytes(&b[1..]) - .map(Message::Response) - .map_err(MessageError::Response) - } else if b[0] == Self::NR_RESPONSE_FLAG { - NetworkRequesterResponse::try_from_bytes(&b[1..]) - .map(Message::NetworkRequesterResponse) - .map_err(MessageError::NetworkRequesterResponseError) - } else { - Err(MessageError::UnknownMessageType) - } - } - - pub fn into_bytes(self) -> Vec { - match self { - Self::Request(r) => std::iter::once(Self::REQUEST_FLAG) - .chain(r.into_bytes().iter().cloned()) - .collect(), - Self::Response(r) => std::iter::once(Self::RESPONSE_FLAG) - .chain(r.into_bytes().iter().cloned()) - .collect(), - Self::NetworkRequesterResponse(r) => std::iter::once(Self::NR_RESPONSE_FLAG) - .chain(r.into_bytes().iter().cloned()) - .collect(), - } - } -} diff --git a/common/socks5/requests/src/network_requester_response.rs b/common/socks5/requests/src/network_requester_response.rs deleted file mode 100644 index eba3f88dd9..0000000000 --- a/common/socks5/requests/src/network_requester_response.rs +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2022 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use crate::ConnectionId; - -#[derive(Debug)] -pub struct NetworkRequesterResponse { - pub connection_id: ConnectionId, - pub network_requester_error: String, -} - -#[derive(Debug, thiserror::Error, PartialEq, Eq)] -pub enum Error { - #[error("no data provided")] - NoData, - - #[error("not enough bytes to recover the connection id")] - ConnectionIdTooShort, - - #[error("message is not utf8 encoded")] - MalformedErrorMessage(#[from] std::string::FromUtf8Error), -} - -impl NetworkRequesterResponse { - pub fn new(connection_id: ConnectionId, network_requester_error: String) -> Self { - NetworkRequesterResponse { - connection_id, - network_requester_error, - } - } - - pub fn try_from_bytes(b: &[u8]) -> Result { - if b.is_empty() { - return Err(Error::NoData); - } - - if b.len() < 8 { - return Err(Error::ConnectionIdTooShort); - } - - let mut connection_id_bytes = b.to_vec(); - let network_requester_error_bytes = connection_id_bytes.split_off(8); - - let connection_id = u64::from_be_bytes([ - connection_id_bytes[0], - connection_id_bytes[1], - connection_id_bytes[2], - connection_id_bytes[3], - connection_id_bytes[4], - connection_id_bytes[5], - connection_id_bytes[6], - connection_id_bytes[7], - ]); - let network_requester_error = String::from_utf8(network_requester_error_bytes)?; - - Ok(NetworkRequesterResponse { - connection_id, - network_requester_error, - }) - } - - pub fn into_bytes(self) -> Vec { - self.connection_id - .to_be_bytes() - .iter() - .copied() - .chain(self.network_requester_error.into_bytes().into_iter()) - .collect() - } -} - -#[cfg(test)] -mod network_requester_response_serde_tests { - use super::*; - - #[test] - fn simple_serde() { - let conn_id = 42; - let network_requester_error = String::from("This is a test msg"); - let response = NetworkRequesterResponse::new(conn_id, network_requester_error.clone()); - let bytes = response.into_bytes(); - let deserialized_response = NetworkRequesterResponse::try_from_bytes(&bytes).unwrap(); - - assert_eq!(conn_id, deserialized_response.connection_id); - assert_eq!( - network_requester_error, - deserialized_response.network_requester_error - ); - } - - #[test] - fn deserialization_errors() { - let err = NetworkRequesterResponse::try_from_bytes(&[]).err().unwrap(); - assert_eq!(err, Error::NoData); - - let bytes: [u8; 5] = [1, 2, 3, 4, 5]; - let err = NetworkRequesterResponse::try_from_bytes(&bytes) - .err() - .unwrap(); - assert_eq!(err, Error::ConnectionIdTooShort); - - let bytes: Vec = 42u64 - .to_be_bytes() - .into_iter() - .chain([0, 159, 146, 150].into_iter()) - .collect(); - let err = NetworkRequesterResponse::try_from_bytes(&bytes) - .err() - .unwrap(); - assert!(matches!(err, Error::MalformedErrorMessage(_))); - } -} diff --git a/common/socks5/requests/src/request.rs b/common/socks5/requests/src/request.rs index 3148f6cd84..39857c2a26 100644 --- a/common/socks5/requests/src/request.rs +++ b/common/socks5/requests/src/request.rs @@ -1,7 +1,9 @@ -// Copyright 2020-2022 - Nym Technologies SA +// Copyright 2020-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::{Socks5ProtocolVersion, Socks5RequestError, Socks5Response}; use nymsphinx_addressing::clients::{Recipient, RecipientFormattingError}; +use service_providers_common::interface::{Serializable, ServiceProviderRequest}; use std::convert::TryFrom; use thiserror::Error; @@ -16,19 +18,19 @@ pub enum RequestFlag { } impl TryFrom for RequestFlag { - type Error = RequestError; + type Error = RequestDeserializationError; - fn try_from(value: u8) -> Result { + fn try_from(value: u8) -> Result { match value { _ if value == (RequestFlag::Connect as u8) => Ok(Self::Connect), _ if value == (RequestFlag::Send as u8) => Ok(Self::Send), - _ => Err(RequestError::UnknownRequestFlag), + value => Err(RequestDeserializationError::UnknownRequestFlag { value }), } } } #[derive(Debug, Error)] -pub enum RequestError { +pub enum RequestDeserializationError { #[error("not enough bytes to recover the length of the address")] AddressLengthTooShort, @@ -41,8 +43,8 @@ pub enum RequestError { #[error("no data provided")] NoData, - #[error("request of unknown type")] - UnknownRequestFlag, + #[error("{value} is not a valid request flag")] + UnknownRequestFlag { value: u8 }, #[error("too short return address")] ReturnAddressTooShort, @@ -51,13 +53,13 @@ pub enum RequestError { MalformedReturnAddress(RecipientFormattingError), } -impl RequestError { +impl RequestDeserializationError { pub fn is_malformed_return(&self) -> bool { - matches!(self, RequestError::MalformedReturnAddress(_)) + matches!(self, RequestDeserializationError::MalformedReturnAddress(_)) } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct ConnectRequest { // TODO: is connection_id redundant now? pub conn_id: ConnectionId, @@ -65,27 +67,128 @@ pub struct ConnectRequest { pub return_address: Option, } +#[derive(Debug, Clone)] +pub struct SendRequest { + pub conn_id: ConnectionId, + pub data: Vec, + pub local_closed: bool, +} + +#[derive(Debug, Clone)] +pub struct Socks5Request { + pub protocol_version: Socks5ProtocolVersion, + pub content: Socks5RequestContent, +} + +impl Serializable for Socks5Request { + type Error = Socks5RequestError; + + // legacy requests had the format of + // 0 (Message::REQUEST_FLAG) || 0 (RequestFlag::Connect) || for connect requests + // 0 (Message::REQUEST_FLAG) || 1 (RequestFlag::Send) || for send requests + // the updated formats use + // 3 (Socks5ProtocolVersion) || 0 (RequestFlag::Connect) || for connect requests + // 3 (Socks5ProtocolVersion) || 1 (RequestFlag::Send) || for send requests + // in both cases, the actual data is serialized the same way, so the process is quite straight forward + fn into_bytes(self) -> Vec { + if let Some(version) = self.protocol_version.as_u8() { + std::iter::once(version) + .chain(self.content.into_bytes().into_iter()) + .collect() + } else { + std::iter::once(Self::LEGACY_TYPE_TAG) + .chain(self.content.into_bytes()) + .collect() + } + } + + fn try_from_bytes(b: &[u8]) -> Result { + if b.is_empty() { + return Err(RequestDeserializationError::NoData.into()); + } + + let protocol_version = Socks5ProtocolVersion::from(b[0]); + Ok(Socks5Request { + protocol_version, + content: Socks5RequestContent::try_from_bytes(&b[1..])?, + }) + } +} + +impl ServiceProviderRequest for Socks5Request { + type ProtocolVersion = Socks5ProtocolVersion; + type Response = Socks5Response; + type Error = Socks5RequestError; + + fn provider_specific_version(&self) -> Self::ProtocolVersion { + self.protocol_version + } + + fn max_supported_version() -> Self::ProtocolVersion { + Socks5ProtocolVersion::new_current() + } +} + +impl Socks5Request { + // type tag that used to be prepended to all request messages + const LEGACY_TYPE_TAG: u8 = 0x00; + + pub fn new( + protocol_version: Socks5ProtocolVersion, + content: Socks5RequestContent, + ) -> Socks5Request { + Socks5Request { + protocol_version, + content, + } + } + + pub fn new_connect( + protocol_version: Socks5ProtocolVersion, + conn_id: ConnectionId, + remote_addr: RemoteAddress, + return_address: Option, + ) -> Socks5Request { + Socks5Request { + protocol_version, + content: Socks5RequestContent::new_connect(conn_id, remote_addr, return_address), + } + } + + pub fn new_send( + protocol_version: Socks5ProtocolVersion, + conn_id: ConnectionId, + data: Vec, + local_closed: bool, + ) -> Socks5Request { + Socks5Request { + protocol_version, + content: Socks5RequestContent::new_send(conn_id, data, local_closed), + } + } +} + /// A request from a SOCKS5 client that a Nym Socks5 service provider should /// take an action for an application using a (probably local) Nym Socks5 proxy. -#[derive(Debug)] -pub enum Request { +#[derive(Debug, Clone)] +pub enum Socks5RequestContent { /// Start a new TCP connection to the specified `RemoteAddress` and send /// the request data up the connection. /// All responses produced on this `ConnectionId` should come back to the specified `Recipient` Connect(Box), /// Re-use an existing TCP connection, sending more request data up it. - Send(ConnectionId, Vec, bool), + Send(SendRequest), } -impl Request { +impl Socks5RequestContent { /// Construct a new Request::Connect instance pub fn new_connect( conn_id: ConnectionId, remote_addr: RemoteAddress, return_address: Option, - ) -> Request { - Request::Connect(Box::new(ConnectRequest { + ) -> Socks5RequestContent { + Socks5RequestContent::Connect(Box::new(ConnectRequest { conn_id, remote_addr, return_address, @@ -93,8 +196,16 @@ impl Request { } /// Construct a new Request::Send instance - pub fn new_send(conn_id: ConnectionId, data: Vec, local_closed: bool) -> Request { - Request::Send(conn_id, data, local_closed) + pub fn new_send( + conn_id: ConnectionId, + data: Vec, + local_closed: bool, + ) -> Socks5RequestContent { + Socks5RequestContent::Send(SendRequest { + conn_id, + data, + local_closed, + }) } /// Deserialize the request type, connection id, destination address and port, @@ -111,23 +222,23 @@ impl Request { /// The request_flag tells us whether this is a new connection request (`new_connect`), /// an already-established connection we should send up (`new_send`), or /// a request to close an established connection (`new_close`). - pub fn try_from_bytes(b: &[u8]) -> Result { + pub fn try_from_bytes(b: &[u8]) -> Result { // each request needs to at least contain flag and ConnectionId if b.is_empty() { - return Err(RequestError::NoData); + return Err(RequestDeserializationError::NoData); } if b.len() < 9 { - return Err(RequestError::ConnectionIdTooShort); + return Err(RequestDeserializationError::ConnectionIdTooShort); } - let connection_id = u64::from_be_bytes([b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]]); + let conn_id = u64::from_be_bytes([b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]]); match RequestFlag::try_from(b[0])? { RequestFlag::Connect => { let connect_request_bytes = &b[9..]; // we need to be able to read at least 2 bytes that specify address length if connect_request_bytes.len() < 2 { - return Err(RequestError::AddressLengthTooShort); + return Err(RequestDeserializationError::AddressLengthTooShort); } let address_length = @@ -135,7 +246,7 @@ impl Request { as usize; if connect_request_bytes.len() < 2 + address_length { - return Err(RequestError::AddressTooShort); + return Err(RequestDeserializationError::AddressTooShort); } let address_start = 2; @@ -150,19 +261,19 @@ impl Request { None } else { if recipient_data_bytes.len() != Recipient::LEN { - return Err(RequestError::ReturnAddressTooShort); + return Err(RequestDeserializationError::ReturnAddressTooShort); } let mut return_bytes = [0u8; Recipient::LEN]; return_bytes.copy_from_slice(&recipient_data_bytes[..Recipient::LEN]); Some( Recipient::try_from_bytes(return_bytes) - .map_err(RequestError::MalformedReturnAddress)?, + .map_err(RequestDeserializationError::MalformedReturnAddress)?, ) }; - Ok(Request::new_connect( - connection_id, + Ok(Socks5RequestContent::new_connect( + conn_id, remote_address, return_address, )) @@ -171,7 +282,11 @@ impl Request { let local_closed = b[9] != 0; let data = b[10..].to_vec(); - Ok(Request::Send(connection_id, data, local_closed)) + Ok(Socks5RequestContent::Send(SendRequest { + conn_id, + data, + local_closed, + })) } } } @@ -182,7 +297,7 @@ impl Request { pub fn into_bytes(self) -> Vec { match self { // connect is: CONN_FLAG || CONN_ID || REMOTE_LEN || REMOTE || RETURN - Request::Connect(req) => { + Socks5RequestContent::Connect(req) => { let remote_address_bytes = req.remote_addr.into_bytes(); let remote_address_bytes_len = remote_address_bytes.len() as u16; @@ -197,10 +312,10 @@ impl Request { iter.collect() } } - Request::Send(conn_id, data, local_closed) => std::iter::once(RequestFlag::Send as u8) - .chain(conn_id.to_be_bytes().into_iter()) - .chain(std::iter::once(local_closed as u8)) - .chain(data.into_iter()) + Socks5RequestContent::Send(req) => std::iter::once(RequestFlag::Send as u8) + .chain(req.conn_id.to_be_bytes().into_iter()) + .chain(std::iter::once(req.local_closed as u8)) + .chain(req.data.into_iter()) .collect(), } } @@ -216,8 +331,8 @@ mod request_deserialization_tests { #[test] fn returns_error_when_zero_bytes() { let request_bytes = Vec::new(); - match Request::try_from_bytes(&request_bytes).unwrap_err() { - RequestError::NoData => {} + match Socks5RequestContent::try_from_bytes(&request_bytes).unwrap_err() { + RequestDeserializationError::NoData => {} _ => unreachable!(), } } @@ -225,8 +340,8 @@ mod request_deserialization_tests { #[test] fn returns_error_when_connection_id_too_short() { let request_bytes = [RequestFlag::Connect as u8, 1, 2, 3, 4, 5, 6, 7].to_vec(); // 7 bytes connection id - match Request::try_from_bytes(&request_bytes).unwrap_err() { - RequestError::ConnectionIdTooShort => {} + match Socks5RequestContent::try_from_bytes(&request_bytes).unwrap_err() { + RequestDeserializationError::ConnectionIdTooShort => {} _ => unreachable!(), } } @@ -241,13 +356,13 @@ mod request_deserialization_tests { let request_bytes1 = [RequestFlag::Connect as u8, 1, 2, 3, 4, 5, 6, 7, 8].to_vec(); // 8 bytes connection id, 0 bytes address length (2 were expected) let request_bytes2 = [RequestFlag::Connect as u8, 1, 2, 3, 4, 5, 6, 7, 8, 0].to_vec(); // 8 bytes connection id, 1 bytes address length (2 were expected) - match Request::try_from_bytes(&request_bytes1).unwrap_err() { - RequestError::AddressLengthTooShort => {} + match Socks5RequestContent::try_from_bytes(&request_bytes1).unwrap_err() { + RequestDeserializationError::AddressLengthTooShort => {} _ => unreachable!(), } - match Request::try_from_bytes(&request_bytes2).unwrap_err() { - RequestError::AddressLengthTooShort => {} + match Socks5RequestContent::try_from_bytes(&request_bytes2).unwrap_err() { + RequestDeserializationError::AddressLengthTooShort => {} _ => unreachable!(), } } @@ -255,8 +370,8 @@ mod request_deserialization_tests { #[test] fn returns_error_when_address_too_short_for_given_address_length() { let request_bytes = [RequestFlag::Connect as u8, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1].to_vec(); // 8 bytes connection id, 2 bytes address length, missing address - match Request::try_from_bytes(&request_bytes).unwrap_err() { - RequestError::AddressTooShort => {} + match Socks5RequestContent::try_from_bytes(&request_bytes).unwrap_err() { + RequestDeserializationError::AddressTooShort => {} _ => unreachable!(), } } @@ -295,8 +410,8 @@ mod request_deserialization_tests { .chain(recipient_bytes.iter().take(40).cloned()) .collect(); - match Request::try_from_bytes(&request_bytes).unwrap_err() { - RequestError::ReturnAddressTooShort => {} + match Socks5RequestContent::try_from_bytes(&request_bytes).unwrap_err() { + RequestDeserializationError::ReturnAddressTooShort => {} _ => unreachable!(), } } @@ -338,7 +453,7 @@ mod request_deserialization_tests { .cloned() .chain(recipient_bytes.into_iter()) .collect(); - assert!(Request::try_from_bytes(&request_bytes) + assert!(Socks5RequestContent::try_from_bytes(&request_bytes) .unwrap_err() .is_malformed_return()); } @@ -376,9 +491,9 @@ mod request_deserialization_tests { .chain(recipient_bytes.into_iter()) .collect(); - let request = Request::try_from_bytes(&request_bytes).unwrap(); + let request = Socks5RequestContent::try_from_bytes(&request_bytes).unwrap(); match request { - Request::Connect(req) => { + Socks5RequestContent::Connect(req) => { assert_eq!("foo.com".to_string(), req.remote_addr); assert_eq!(u64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]), req.conn_id); assert_eq!( @@ -423,9 +538,9 @@ mod request_deserialization_tests { .chain(recipient_bytes.into_iter()) .collect(); - let request = Request::try_from_bytes(&request_bytes).unwrap(); + let request = Socks5RequestContent::try_from_bytes(&request_bytes).unwrap(); match request { - Request::Connect(req) => { + Socks5RequestContent::Connect(req) => { assert_eq!("foo.com".to_string(), req.remote_addr); assert_eq!(u64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]), req.conn_id); assert_eq!( @@ -446,9 +561,13 @@ mod request_deserialization_tests { fn works_when_request_is_sized_properly_even_without_data() { // correct 8 bytes of connection_id, 1 byte of local_closed and 0 bytes request data let request_bytes = [RequestFlag::Send as u8, 1, 2, 3, 4, 5, 6, 7, 8, 0].to_vec(); - let request = Request::try_from_bytes(&request_bytes).unwrap(); + let request = Socks5RequestContent::try_from_bytes(&request_bytes).unwrap(); match request { - Request::Send(conn_id, data, local_closed) => { + Socks5RequestContent::Send(SendRequest { + conn_id, + data, + local_closed, + }) => { assert_eq!(u64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]), conn_id); assert_eq!(Vec::::new(), data); assert!(!local_closed) @@ -477,9 +596,13 @@ mod request_deserialization_tests { ] .to_vec(); - let request = Request::try_from_bytes(&request_bytes).unwrap(); + let request = Socks5RequestContent::try_from_bytes(&request_bytes).unwrap(); match request { - Request::Send(conn_id, data, local_closed) => { + Socks5RequestContent::Send(SendRequest { + conn_id, + data, + local_closed, + }) => { assert_eq!(u64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]), conn_id); assert_eq!(vec![255, 255, 255], data); assert!(!local_closed) diff --git a/common/socks5/requests/src/response.rs b/common/socks5/requests/src/response.rs index 07d78be964..fd7a31d942 100644 --- a/common/socks5/requests/src/response.rs +++ b/common/socks5/requests/src/response.rs @@ -1,46 +1,239 @@ -// Copyright 2020-2022 - Nym Technologies SA +// Copyright 2020-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::{ConnectionId, Socks5ProtocolVersion, Socks5RequestError}; +use service_providers_common::interface::{Serializable, ServiceProviderResponse}; use thiserror::Error; -use crate::ConnectionId; +// don't start tags from 0 for easier backwards compatibility since `NetworkData` +// used to be a `Response` with tag 1 +// and `ConnectionError` used to be `NetworkRequesterResponse` with tag 2 +#[repr(u8)] +#[derive(Clone, Copy, Debug)] +pub enum ResponseFlag { + NetworkData = 1, + ConnectionError = 2, +} + +impl TryFrom for ResponseFlag { + type Error = ResponseDeserializationError; + + fn try_from(value: u8) -> Result { + match value { + _ if value == (ResponseFlag::NetworkData as u8) => Ok(Self::NetworkData), + _ if value == (ResponseFlag::ConnectionError as u8) => Ok(Self::ConnectionError), + value => Err(ResponseDeserializationError::UnknownResponseFlag { value }), + } + } +} #[derive(Debug, Error, PartialEq, Eq)] -pub enum ResponseError { +pub enum ResponseDeserializationError { #[error("not enough bytes to recover the connection id")] ConnectionIdTooShort, + + #[error("{value} is not a valid response flag")] + UnknownResponseFlag { value: u8 }, + #[error("no data provided")] NoData, + + #[error("message is not utf8 encoded: {source}")] + MalformedErrorMessage { + #[from] + source: std::string::FromUtf8Error, + }, } -/// A remote network response retrieved by the Socks5 service provider. This + +#[derive(Debug)] +pub struct Socks5Response { + pub protocol_version: Socks5ProtocolVersion, + pub content: Socks5ResponseContent, +} + +impl Serializable for Socks5Response { + type Error = Socks5RequestError; + + // legacy responses had the format of + // 1 (Message::RESPONSE_FLAG) || for data responses + // 2 (Message::NR_RESPONSE_FLAG) || for error responses + // the updated formats use + // 3 (Socks5ProtocolVersion) || 0 (ResponseFlag::NetworkData) || for data responses + // 3 (Socks5ProtocolVersion) || 1 (ResponseFlag::ConnectionError) || for error responses + // so for serialization an optional version tag is prepended + // and in deserialization it's just the case of shifting the buffer in case of non-legacy response payload + fn into_bytes(self) -> Vec { + if let Some(version) = self.protocol_version.as_u8() { + std::iter::once(version) + .chain(self.content.into_bytes().into_iter()) + .collect() + } else { + self.content.into_bytes() + } + } + + fn try_from_bytes(b: &[u8]) -> Result { + if b.is_empty() { + return Err(ResponseDeserializationError::NoData.into()); + } + + let protocol_version = Socks5ProtocolVersion::from(b[0]); + let content = if protocol_version.is_legacy() { + Socks5ResponseContent::try_from_bytes(b) + } else { + Socks5ResponseContent::try_from_bytes(&b[1..]) + }?; + Ok(Socks5Response { + protocol_version, + content, + }) + } +} + +impl ServiceProviderResponse for Socks5Response {} + +impl Socks5Response { + pub fn new( + protocol_version: Socks5ProtocolVersion, + content: Socks5ResponseContent, + ) -> Socks5Response { + Socks5Response { + protocol_version, + content, + } + } + + pub fn new_network_data( + protocol_version: Socks5ProtocolVersion, + connection_id: ConnectionId, + data: Vec, + is_closed: bool, + ) -> Socks5Response { + Socks5Response { + protocol_version, + content: Socks5ResponseContent::new_network_data(connection_id, data, is_closed), + } + } + + pub fn new_closed_empty( + protocol_version: Socks5ProtocolVersion, + connection_id: ConnectionId, + ) -> Socks5Response { + Socks5Response { + protocol_version, + content: Socks5ResponseContent::new_closed_empty(connection_id), + } + } + + pub fn new_connection_error( + protocol_version: Socks5ProtocolVersion, + connection_id: ConnectionId, + error_message: String, + ) -> Socks5Response { + Socks5Response { + protocol_version, + content: Socks5ResponseContent::new_connection_error(connection_id, error_message), + } + } +} + +#[derive(Debug)] +pub enum Socks5ResponseContent { + NetworkData(NetworkData), + ConnectionError(ConnectionError), +} + +impl Socks5ResponseContent { + pub fn new_network_data( + connection_id: ConnectionId, + data: Vec, + is_closed: bool, + ) -> Socks5ResponseContent { + Socks5ResponseContent::NetworkData(NetworkData::new(connection_id, data, is_closed)) + } + + pub fn new_closed_empty(connection_id: ConnectionId) -> Socks5ResponseContent { + Socks5ResponseContent::NetworkData(NetworkData::new_closed_empty(connection_id)) + } + + pub fn new_connection_error( + connection_id: ConnectionId, + error_message: String, + ) -> Socks5ResponseContent { + Socks5ResponseContent::ConnectionError(ConnectionError::new(connection_id, error_message)) + } + + pub fn into_bytes(self) -> Vec { + match self { + Socks5ResponseContent::NetworkData(res) => { + std::iter::once(ResponseFlag::NetworkData as u8) + .chain(res.into_bytes().into_iter()) + .collect() + } + Socks5ResponseContent::ConnectionError(res) => { + std::iter::once(ResponseFlag::ConnectionError as u8) + .chain(res.into_bytes().into_iter()) + .collect() + } + } + } + + pub fn try_from_bytes(b: &[u8]) -> Result { + if b.is_empty() { + // TODO: bad error type since this branch could be reached in the 'versioned' case + // after reading 1 byte already + return Err(ResponseDeserializationError::NoData); + } + + let response_flag = ResponseFlag::try_from(b[0])?; + match response_flag { + ResponseFlag::NetworkData => Ok(Socks5ResponseContent::NetworkData( + NetworkData::try_from_bytes(&b[1..])?, + )), + ResponseFlag::ConnectionError => Ok(Socks5ResponseContent::ConnectionError( + ConnectionError::try_from_bytes(&b[1..])?, + )), + } + } +} + +/// A remote network network data response retrieved by the Socks5 service provider. This /// can be serialized and sent back through the mixnet to the requesting /// application. #[derive(Debug)] -pub struct Response { +pub struct NetworkData { pub data: Vec, pub connection_id: ConnectionId, pub is_closed: bool, } -impl Response { +impl NetworkData { /// Constructor for responses pub fn new(connection_id: ConnectionId, data: Vec, is_closed: bool) -> Self { - Response { + NetworkData { data, connection_id, is_closed, } } - pub fn try_from_bytes(b: &[u8]) -> Result { + pub fn new_closed_empty(connection_id: ConnectionId) -> Self { + NetworkData { + data: vec![], + connection_id, + is_closed: false, + } + } + + pub fn try_from_bytes(b: &[u8]) -> Result { if b.is_empty() { - return Err(ResponseError::NoData); + return Err(ResponseDeserializationError::NoData); } let is_closed = b[0] != 0; if b.len() < 9 { - return Err(ResponseError::ConnectionIdTooShort); + return Err(ResponseDeserializationError::ConnectionIdTooShort); } let mut connection_id_bytes = b.to_vec(); @@ -57,7 +250,7 @@ impl Response { connection_id_bytes[8], ]); - let response = Response::new(connection_id, data, is_closed); + let response = NetworkData::new(connection_id, data, is_closed); Ok(response) } @@ -71,54 +264,154 @@ impl Response { } } -#[cfg(test)] -mod constructing_socks5_responses_from_bytes { - use super::*; +#[derive(Debug)] +pub struct ConnectionError { + pub connection_id: ConnectionId, + pub network_requester_error: String, +} - #[test] - fn fails_when_zero_bytes_are_supplied() { - let response_bytes = Vec::new(); - - assert_eq!( - ResponseError::NoData, - Response::try_from_bytes(&response_bytes).unwrap_err() - ); +impl ConnectionError { + pub fn new(connection_id: ConnectionId, network_requester_error: String) -> Self { + ConnectionError { + connection_id, + network_requester_error, + } } - #[test] - fn fails_when_connection_id_bytes_are_too_short() { - let response_bytes = vec![0, 1, 2, 3, 4, 5, 6]; - assert_eq!( - ResponseError::ConnectionIdTooShort, - Response::try_from_bytes(&response_bytes).unwrap_err() - ); + pub fn try_from_bytes(b: &[u8]) -> Result { + if b.is_empty() { + return Err(ResponseDeserializationError::NoData); + } + + if b.len() < 8 { + return Err(ResponseDeserializationError::ConnectionIdTooShort); + } + + let mut connection_id_bytes = b.to_vec(); + let network_requester_error_bytes = connection_id_bytes.split_off(8); + + let connection_id = u64::from_be_bytes([ + connection_id_bytes[0], + connection_id_bytes[1], + connection_id_bytes[2], + connection_id_bytes[3], + connection_id_bytes[4], + connection_id_bytes[5], + connection_id_bytes[6], + connection_id_bytes[7], + ]); + let network_requester_error = String::from_utf8(network_requester_error_bytes)?; + + Ok(ConnectionError { + connection_id, + network_requester_error, + }) } - #[test] - fn works_when_there_is_no_data() { - let response_bytes = vec![0, 0, 1, 2, 3, 4, 5, 6, 7]; - let expected = Response::new( - u64::from_be_bytes([0, 1, 2, 3, 4, 5, 6, 7]), - Vec::new(), - false, - ); - let actual = Response::try_from_bytes(&response_bytes).unwrap(); - assert_eq!(expected.connection_id, actual.connection_id); - assert_eq!(expected.data, actual.data); - assert_eq!(expected.is_closed, actual.is_closed); - } - - #[test] - fn works_when_there_is_data() { - let response_bytes = vec![0, 0, 1, 2, 3, 4, 5, 6, 7, 255, 255, 255]; - let expected = Response::new( - u64::from_be_bytes([0, 1, 2, 3, 4, 5, 6, 7]), - vec![255, 255, 255], - false, - ); - let actual = Response::try_from_bytes(&response_bytes).unwrap(); - assert_eq!(expected.connection_id, actual.connection_id); - assert_eq!(expected.data, actual.data); - assert_eq!(expected.is_closed, actual.is_closed); + pub fn into_bytes(self) -> Vec { + self.connection_id + .to_be_bytes() + .iter() + .copied() + .chain(self.network_requester_error.into_bytes().into_iter()) + .collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[cfg(test)] + mod constructing_socks5_data_responses_from_bytes { + use super::*; + + #[test] + fn fails_when_zero_bytes_are_supplied() { + let response_bytes = Vec::new(); + + assert_eq!( + ResponseDeserializationError::NoData, + NetworkData::try_from_bytes(&response_bytes).unwrap_err() + ); + } + + #[test] + fn fails_when_connection_id_bytes_are_too_short() { + let response_bytes = vec![0, 1, 2, 3, 4, 5, 6]; + assert_eq!( + ResponseDeserializationError::ConnectionIdTooShort, + NetworkData::try_from_bytes(&response_bytes).unwrap_err() + ); + } + + #[test] + fn works_when_there_is_no_data() { + let response_bytes = vec![0, 0, 1, 2, 3, 4, 5, 6, 7]; + let expected = NetworkData::new( + u64::from_be_bytes([0, 1, 2, 3, 4, 5, 6, 7]), + Vec::new(), + false, + ); + let actual = NetworkData::try_from_bytes(&response_bytes).unwrap(); + assert_eq!(expected.connection_id, actual.connection_id); + assert_eq!(expected.data, actual.data); + assert_eq!(expected.is_closed, actual.is_closed); + } + + #[test] + fn works_when_there_is_data() { + let response_bytes = vec![0, 0, 1, 2, 3, 4, 5, 6, 7, 255, 255, 255]; + let expected = NetworkData::new( + u64::from_be_bytes([0, 1, 2, 3, 4, 5, 6, 7]), + vec![255, 255, 255], + false, + ); + let actual = NetworkData::try_from_bytes(&response_bytes).unwrap(); + assert_eq!(expected.connection_id, actual.connection_id); + assert_eq!(expected.data, actual.data); + assert_eq!(expected.is_closed, actual.is_closed); + } + } + + #[cfg(test)] + mod connection_error_response_serde_tests { + use super::*; + + #[test] + fn simple_serde() { + let conn_id = 42; + let network_requester_error = String::from("This is a test msg"); + let response = ConnectionError::new(conn_id, network_requester_error.clone()); + let bytes = response.into_bytes(); + let deserialized_response = ConnectionError::try_from_bytes(&bytes).unwrap(); + + assert_eq!(conn_id, deserialized_response.connection_id); + assert_eq!( + network_requester_error, + deserialized_response.network_requester_error + ); + } + + #[test] + fn deserialization_errors() { + let err = ConnectionError::try_from_bytes(&[]).err().unwrap(); + assert_eq!(err, ResponseDeserializationError::NoData); + + let bytes: [u8; 5] = [1, 2, 3, 4, 5]; + let err = ConnectionError::try_from_bytes(&bytes).err().unwrap(); + assert_eq!(err, ResponseDeserializationError::ConnectionIdTooShort); + + let bytes: Vec = 42u64 + .to_be_bytes() + .into_iter() + .chain([0, 159, 146, 150].into_iter()) + .collect(); + let err = ConnectionError::try_from_bytes(&bytes).err().unwrap(); + assert!(matches!( + err, + ResponseDeserializationError::MalformedErrorMessage { .. } + )); + } } } diff --git a/common/socks5/requests/src/version.rs b/common/socks5/requests/src/version.rs new file mode 100644 index 0000000000..2fd70a42d5 --- /dev/null +++ b/common/socks5/requests/src/version.rs @@ -0,0 +1,21 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use service_providers_common::{define_simple_version, interface::Version}; + +/// Defines initial version of the communication interface between socks5 clients and +/// network requesters (socks5). +// note: we start from '3' so that we could distinguish cases where no version is provided +// and legacy communication mode is used instead +pub const INITIAL_INTERFACE_VERSION: u8 = 3; + +/// Defines the current version of the communication interface between socks5 clients and +/// network requesters (socks5). +/// It has to be incremented for any breaking change. +pub const INTERFACE_VERSION: u8 = 3; + +define_simple_version!( + Socks5ProtocolVersion, + INITIAL_INTERFACE_VERSION, + INTERFACE_VERSION +); diff --git a/nym-connect-android/src-tauri/src/config/mod.rs b/nym-connect-android/src-tauri/src/config/mod.rs index 849c89df5c..4e8f2751f1 100644 --- a/nym-connect-android/src-tauri/src/config/mod.rs +++ b/nym-connect-android/src-tauri/src/config/mod.rs @@ -121,7 +121,7 @@ pub async fn init_socks5_config( ) .await?; - config.get_base_mut().with_gateway_endpoint(gateway); + config.get_base_mut().set_gateway_endpoint(gateway); print_saved_config(&config); diff --git a/nym-connect/src-tauri/src/config/mod.rs b/nym-connect/src-tauri/src/config/mod.rs index 9c51348b42..38073d0d72 100644 --- a/nym-connect/src-tauri/src/config/mod.rs +++ b/nym-connect/src-tauri/src/config/mod.rs @@ -141,7 +141,7 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str ) .await?; - config.get_base_mut().with_gateway_endpoint(gateway); + config.get_base_mut().set_gateway_endpoint(gateway); config.get_socks5().save_to_file(None).tap_err(|_| { log::error!("Failed to save the config file"); diff --git a/service-providers/common/Cargo.toml b/service-providers/common/Cargo.toml new file mode 100644 index 0000000000..e6787d2ee6 --- /dev/null +++ b/service-providers/common/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "service-providers-common" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +build-information = { path = "../../common/build-information", features = ["serde"] } +nymsphinx-anonymous-replies = { path = "../../common/nymsphinx/anonymous-replies" } + +async-trait = { workspace = true } +log = { workspace = true } +thiserror = { workspace = true } +serde = { workspace = true, features = ["derive"]} +serde_json = { workspace = true } + +[dev-dependencies] +# for the control requests example +anyhow = "1.0.68" +tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } + +nym-sdk = { path = "../../sdk/rust/nym-sdk" } + + diff --git a/service-providers/common/examples/control_requests.rs b/service-providers/common/examples/control_requests.rs new file mode 100644 index 0000000000..2a800ea7d3 --- /dev/null +++ b/service-providers/common/examples/control_requests.rs @@ -0,0 +1,74 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +// use nym_client::client::config::{BaseConfig, Config, GatewayEndpointConfig}; +// use nym_client::client::{DirectClient, KeyManager, Recipient, ReconstructedMessage, SocketClient}; +use nym_sdk::mixnet::{MixnetClient, Recipient, ReconstructedMessage}; +use service_providers_common::interface::{ + ControlRequest, ControlResponse, ProviderInterfaceVersion, Request, Response, ResponseContent, +}; + +fn parse_control_response(received: Vec) -> ControlResponse { + assert_eq!(received.len(), 1); + let response: Response = Response::try_from_bytes(&received[0].message).unwrap(); + match response.content { + ResponseContent::Control(control) => control, + ResponseContent::ProviderData(_) => { + panic!("received provider data even though we sent control request!") + } + } +} + +async fn wait_for_control_response(client: &mut MixnetClient) -> ControlResponse { + loop { + let next = client.wait_for_messages().await.unwrap(); + if !next.is_empty() { + return parse_control_response(next); + } + } +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + // technically we don't need to start the entire client with all the subroutines, + // but I needed an easy way of sending to and receiving from the mixnet + // and that was the most straightforward way of achieving it + let mut client = MixnetClient::connect().await.unwrap(); + let provider: Recipient = "AN8eLxYWFitCkMn92zim3PrPszxJZDYyFFKP7qnnAAew.8UAxL3LwQBis6WpM3GGXaqKGaVdnLCpGJWumHT6KNdTH@77TSuVU8d1oXKbPzjec2xh4i3Wj5WwUyy9Lr36sm8gZm".parse().unwrap(); + + // generic service provider request, so we don't even need to care it's to the socks5 provider + let request_health = ControlRequest::Health; + let request_binary_info = ControlRequest::BinaryInfo; + let request_versions = ControlRequest::SupportedRequestVersions; + + let full_request_health: Request = + Request::new_control(ProviderInterfaceVersion::new_current(), request_health); + let full_request_binary_info: Request = + Request::new_control(ProviderInterfaceVersion::new_current(), request_binary_info); + let full_request_versions: Request = + Request::new_control(ProviderInterfaceVersion::new_current(), request_versions); + + // // TODO: currently we HAVE TO use surbs unfortunately + println!("Sending 'Health' request..."); + client + .send_bytes(provider, full_request_health.into_bytes()) + .await; + let response = wait_for_control_response(&mut client).await; + println!("response to 'Health' request: {response:#?}"); + + println!("Sending 'BinaryInfo' request..."); + client + .send_bytes(provider, full_request_binary_info.into_bytes()) + .await; + let response = wait_for_control_response(&mut client).await; + println!("response to 'BinaryInfo' request: {response:#?}"); + + println!("Sending 'SupportedRequestVersions' request..."); + client + .send_bytes(provider, full_request_versions.into_bytes()) + .await; + let response = wait_for_control_response(&mut client).await; + println!("response to 'SupportedRequestVersions' request: {response:#?}"); + + Ok(()) +} diff --git a/service-providers/common/src/interface/control.rs b/service-providers/common/src/interface/control.rs new file mode 100644 index 0000000000..2cb2c11120 --- /dev/null +++ b/service-providers/common/src/interface/control.rs @@ -0,0 +1,204 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::interface::{Serializable, ServiceProviderMessagingError}; +use build_information::BinaryBuildInformationOwned; +use serde::{Deserialize, Serialize}; + +#[derive(Debug)] +pub enum ControlRequest { + Health, + BinaryInfo, + SupportedRequestVersions, +} + +#[repr(u8)] +enum ControlRequestTag { + /// Value tag representing [`Health`] variant of the [`ControlRequest`] + Health = 0x00, + + /// Value tag representing [`BinaryInfo`] variant of the [`ControlRequest`] + BinaryInfo = 0x01, + + /// Value tag representing [`SupportedRequestVersions`] variant of the [`ControlRequest`] + RequestVersions = 0x02, +} + +impl TryFrom for ControlRequestTag { + type Error = ServiceProviderMessagingError; + + fn try_from(value: u8) -> Result { + match value { + _ if value == (Self::Health as u8) => Ok(Self::Health), + _ if value == (Self::BinaryInfo as u8) => Ok(Self::BinaryInfo), + _ if value == (Self::RequestVersions as u8) => Ok(Self::RequestVersions), + received => Err(ServiceProviderMessagingError::InvalidControlRequestTag { received }), + } + } +} + +impl Serializable for ControlRequest { + type Error = ServiceProviderMessagingError; + + fn into_bytes(self) -> Vec { + // current variants do not require sending any data apart from the tag + vec![self.tag() as u8] + } + + fn try_from_bytes(b: &[u8]) -> Result { + if b.is_empty() { + return Err(ServiceProviderMessagingError::EmptyControlRequest); + } + + let request_tag = ControlRequestTag::try_from(b[0])?; + match request_tag { + ControlRequestTag::Health => Ok(ControlRequest::Health), + ControlRequestTag::BinaryInfo => Ok(ControlRequest::BinaryInfo), + ControlRequestTag::RequestVersions => Ok(ControlRequest::SupportedRequestVersions), + } + } +} + +impl ControlRequest { + fn tag(&self) -> ControlRequestTag { + match self { + ControlRequest::Health => ControlRequestTag::Health, + ControlRequest::BinaryInfo => ControlRequestTag::BinaryInfo, + ControlRequest::SupportedRequestVersions => ControlRequestTag::RequestVersions, + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct BinaryInformation { + pub binary_name: String, + pub build_information: BinaryBuildInformationOwned, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct SupportedVersions { + pub interface_version: String, + pub provider_version: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ErrorResponse { + message: String, +} + +#[derive(Debug)] +pub enum ControlResponse { + Health, + BinaryInfo(Box), + SupportedRequestVersions(SupportedVersions), + Error(ErrorResponse), +} + +#[repr(u8)] +enum ControlResponseTag { + /// Value tag representing [`Health`] variant of the [`ControlResponse`] + Health = 0x00, + + /// Value tag representing [`BinaryInfo`] variant of the [`ControlResponse`] + BinaryInfo = 0x01, + + /// Value tag representing [`SupportedRequestVersions`] variant of the [`ControlResponse`] + SupportedRequestVersions = 0x02, + + /// Value tag representing [`Error`] variant of the [`ControlResponse`] + Error = 0xFF, +} + +impl TryFrom for ControlResponseTag { + type Error = ServiceProviderMessagingError; + + fn try_from(value: u8) -> Result { + match value { + _ if value == (Self::Health as u8) => Ok(Self::Health), + _ if value == (Self::BinaryInfo as u8) => Ok(Self::BinaryInfo), + _ if value == (Self::SupportedRequestVersions as u8) => { + Ok(Self::SupportedRequestVersions) + } + _ if value == (Self::Error as u8) => Ok(Self::Error), + received => Err(ServiceProviderMessagingError::InvalidControlResponseTag { received }), + } + } +} + +impl Serializable for ControlResponse { + type Error = ServiceProviderMessagingError; + + fn into_bytes(self) -> Vec { + std::iter::once(self.tag() as u8) + .chain(self.serialize_inner().into_iter()) + .collect() + } + + fn try_from_bytes(b: &[u8]) -> Result { + if b.is_empty() { + return Err(ServiceProviderMessagingError::EmptyControlResponse); + } + + let response_tag = ControlResponseTag::try_from(b[0])?; + match response_tag { + ControlResponseTag::Health => Ok(ControlResponse::Health), + ControlResponseTag::BinaryInfo => match serde_json::from_slice(&b[1..]) { + Ok(binary_info) => Ok(ControlResponse::BinaryInfo(binary_info)), + Err(source) => Err( + ServiceProviderMessagingError::MalformedBinaryInfoControlResponse { source }, + ), + }, + ControlResponseTag::SupportedRequestVersions => match serde_json::from_slice(&b[1..]) { + Ok(supported_versions) => Ok(ControlResponse::SupportedRequestVersions( + supported_versions, + )), + Err(source) => { + Err(ServiceProviderMessagingError::MalformedErrorControlResponse { source }) + } + }, + ControlResponseTag::Error => match serde_json::from_slice(&b[1..]) { + Ok(error_response) => Ok(ControlResponse::Error(error_response)), + Err(source) => { + Err(ServiceProviderMessagingError::MalformedErrorControlResponse { source }) + } + }, + } + } +} + +impl ControlResponse { + fn tag(&self) -> ControlResponseTag { + match self { + ControlResponse::Health => ControlResponseTag::Health, + ControlResponse::BinaryInfo(_) => ControlResponseTag::BinaryInfo, + ControlResponse::SupportedRequestVersions(_) => { + ControlResponseTag::SupportedRequestVersions + } + ControlResponse::Error(_) => ControlResponseTag::Error, + } + } + + fn serialize_inner(self) -> Vec { + match self { + ControlResponse::Health => Vec::new(), + // TODO: is serde_json the right choice for this? + ControlResponse::BinaryInfo(info) => { + // As per serde_json documentation: + // ``` + // Serialization can fail if `T`'s implementation of `Serialize` decides to + // fail, or if `T` contains a map with non-string keys. + // ``` + // + // And since `BinaryInformation` does not contain any maps and its serialization + // is fully derived with serde macros, the below cannot possibly fail, + // so the unwrap is fine + // (unless the serde's macro is bugged but at this point we're already out of luck) + serde_json::to_vec(&info).unwrap() + } + ControlResponse::Error(error_response) => serde_json::to_vec(&error_response).unwrap(), + ControlResponse::SupportedRequestVersions(supported_versions) => { + serde_json::to_vec(&supported_versions).unwrap() + } + } + } +} diff --git a/service-providers/common/src/interface/mod.rs b/service-providers/common/src/interface/mod.rs new file mode 100644 index 0000000000..7921e926e4 --- /dev/null +++ b/service-providers/common/src/interface/mod.rs @@ -0,0 +1,121 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub use control::{BinaryInformation, ControlRequest, ControlResponse, SupportedVersions}; +pub use request::{Request, RequestContent, ServiceProviderRequest}; +pub use response::{Response, ResponseContent, ServiceProviderResponse}; +pub use version::{ProviderInterfaceVersion, RequestVersion, Version}; + +use std::fmt::{Display, Formatter}; +use thiserror::Error; + +mod control; +mod request; +mod response; +mod version; + +#[derive(Debug, Error)] +pub enum ServiceProviderMessagingError { + #[error("{received} does not correspond to any valid request tag")] + InvalidRequestTag { received: u8 }, + + #[error("{received} does not correspond to any valid response tag")] + InvalidResponseTag { received: u8 }, + + #[error("{received} does not correspond to any valid control request tag")] + InvalidControlRequestTag { received: u8 }, + + #[error("{received} does not correspond to any valid control response tag")] + InvalidControlResponseTag { received: u8 }, + + #[error("request did not contain any data")] + EmptyRequest, + + #[error("response did not contain any data")] + EmptyResponse, + + #[error("request did not contain enough data to get deserialized. Got only {received} bytes.")] + IncompleteRequest { received: usize }, + + #[error( + "response did not contain enough data to get deserialized. Got only {received} bytes." + )] + IncompleteResponse { received: usize }, + + #[error("control request did not contain any data")] + EmptyControlRequest, + + #[error("control response did not contain any data")] + EmptyControlResponse, + + #[error("Received provider data response while control was expected")] + UnexpectedProviderDataResponse, + + #[error("Received control response while provider data was expected")] + UnexpectedControlResponse, + + #[error("Attempted to use control request in 'Legacy' mode")] + ControlRequestInLegacyMode, + + #[error("the received binary information control response was malformed: {source}")] + MalformedBinaryInfoControlResponse { source: serde_json::Error }, + + #[error("the received error control response was malformed: {source}")] + MalformedErrorControlResponse { source: serde_json::Error }, + + #[error("the received supported versions control response was malformed: {source}")] + MalformedSupportedVersionsResponse { source: serde_json::Error }, +} + +// can't use 'normal' trait (i.e. Serialize/Deserialize from serde) as `Socks5Message` uses custom serialization +// and we don't want to break backwards compatibility, plus being able to know the expected protocol version +// ahead of time is very useful. +pub trait Serializable: Sized { + type Error; + + fn into_bytes(self) -> Vec; + + fn try_from_bytes(b: &[u8]) -> Result; +} + +#[derive(Debug)] +pub struct EmptyMessage; + +#[derive(Debug, Clone)] +pub struct Empty; + +impl Display for Empty { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "n/a") + } +} + +impl Version for Empty {} + +impl ServiceProviderRequest for EmptyMessage { + type ProtocolVersion = Empty; + type Response = EmptyMessage; + type Error = ServiceProviderMessagingError; + + fn provider_specific_version(&self) -> Self::ProtocolVersion { + Empty + } + + fn max_supported_version() -> Self::ProtocolVersion { + Empty + } +} + +impl ServiceProviderResponse for EmptyMessage {} + +impl Serializable for EmptyMessage { + type Error = ServiceProviderMessagingError; + + fn into_bytes(self) -> Vec { + Vec::new() + } + + fn try_from_bytes(_b: &[u8]) -> Result { + Ok(EmptyMessage) + } +} diff --git a/service-providers/common/src/interface/request.rs b/service-providers/common/src/interface/request.rs new file mode 100644 index 0000000000..fefa1ffae6 --- /dev/null +++ b/service-providers/common/src/interface/request.rs @@ -0,0 +1,172 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::interface::version::Version; +use crate::interface::{ + ControlRequest, EmptyMessage, ProviderInterfaceVersion, Serializable, + ServiceProviderMessagingError, ServiceProviderResponse, +}; +use log::warn; +use std::fmt::Debug; + +pub trait ServiceProviderRequest: Serializable + Debug { + type ProtocolVersion: Version + Debug + Clone; + type Response: ServiceProviderResponse; + // TODO: should this one perhaps be separated into RequestError and ResponseError? + type Error: From + + From<::Error> + + From<::Error>; + + /// The version of the provider protocol attached on the particular request. + fn provider_specific_version(&self) -> Self::ProtocolVersion; + + /// The highest version of the provider protocol that can be supported by this party. + fn max_supported_version() -> Self::ProtocolVersion; +} + +#[derive(Debug)] +pub struct Request { + pub interface_version: ProviderInterfaceVersion, + pub content: RequestContent, +} + +#[derive(Debug)] +pub enum RequestContent { + Control(ControlRequest), + ProviderData(T), +} + +#[repr(u8)] +pub enum RequestTag { + /// Value tag representing [`Control`] variant of the [`Request`] + Control = 0x00, + + /// Value tag representing [`ProviderData`] variant of the [`Request`] + ProviderData = 0x01, +} + +impl TryFrom for RequestTag { + type Error = ServiceProviderMessagingError; + + fn try_from(value: u8) -> Result { + match value { + _ if value == (Self::Control as u8) => Ok(Self::Control), + _ if value == (Self::ProviderData as u8) => Ok(Self::ProviderData), + received => Err(ServiceProviderMessagingError::InvalidRequestTag { received }), + } + } +} + +impl Request +where + T: ServiceProviderRequest, +{ + pub fn new_control( + interface_version: ProviderInterfaceVersion, + content: ControlRequest, + ) -> Self { + Request { + interface_version, + content: RequestContent::Control(content), + } + } + + pub fn new_provider_data(interface_version: ProviderInterfaceVersion, content: T) -> Self { + Request { + interface_version, + content: RequestContent::ProviderData(content), + } + } + + pub fn into_bytes(self) -> Vec { + if let Some(version) = self.interface_version.as_u8() { + std::iter::once(version) + .chain(self.content.into_bytes(self.interface_version).into_iter()) + .collect() + } else { + self.content.into_bytes(self.interface_version) + } + } + + pub fn try_from_bytes(b: &[u8]) -> Result, ::Error> { + if b.is_empty() { + return Err(ServiceProviderMessagingError::EmptyRequest.into()); + } + + let interface_version = ProviderInterfaceVersion::from(b[0]); + let content = if interface_version.is_legacy() { + RequestContent::try_from_bytes(b, interface_version) + } else { + RequestContent::try_from_bytes(&b[1..], interface_version) + }?; + + Ok(Request { + interface_version, + content, + }) + } +} + +impl RequestContent +where + T: ServiceProviderRequest, +{ + fn tag(&self) -> RequestTag { + match self { + RequestContent::Control(_) => RequestTag::Control, + RequestContent::ProviderData(_) => RequestTag::ProviderData, + } + } + + fn serialize_inner(self) -> Vec { + match self { + RequestContent::Control(control) => control.into_bytes(), + RequestContent::ProviderData(provider_data) => provider_data.into_bytes(), + } + } + + fn into_bytes(self, interface_version: ProviderInterfaceVersion) -> Vec { + if interface_version.is_legacy() { + if matches!(self, RequestContent::Control(_)) { + // this shouldn't ever happen, since if client is aware of control requests, + // it should be aware of versioning and shouldn't attempt to send those + warn!("attempted to serialize a control request in legacy mode"); + Vec::new() + } else { + self.serialize_inner() + } + } else { + std::iter::once(self.tag() as u8) + .chain(self.serialize_inner().into_iter()) + .collect() + } + } + + fn try_from_bytes( + b: &[u8], + interface_version: ProviderInterfaceVersion, + ) -> Result, ::Error> { + if interface_version.is_legacy() { + // we received a request from an old client which can only possibly + // use an old Socks5Message, which uses the entire buffer for deserialization + Ok(RequestContent::ProviderData(T::try_from_bytes(b)?)) + } else { + if b.is_empty() { + return Err(ServiceProviderMessagingError::IncompleteRequest { + received: b.len() + 1, + } + .into()); + } + + let request_tag = RequestTag::try_from(b[0])?; + match request_tag { + RequestTag::Control => Ok(RequestContent::Control(ControlRequest::try_from_bytes( + &b[1..], + )?)), + RequestTag::ProviderData => { + Ok(RequestContent::ProviderData(T::try_from_bytes(&b[1..])?)) + } + } + } + } +} diff --git a/service-providers/common/src/interface/response.rs b/service-providers/common/src/interface/response.rs new file mode 100644 index 0000000000..3114e1d66e --- /dev/null +++ b/service-providers/common/src/interface/response.rs @@ -0,0 +1,163 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::interface::{ + ControlResponse, EmptyMessage, ProviderInterfaceVersion, Serializable, + ServiceProviderMessagingError, ServiceProviderRequest, +}; +use log::warn; +use std::fmt::Debug; + +pub trait ServiceProviderResponse: Serializable + Debug {} + +#[derive(Debug)] +pub struct Response { + pub interface_version: ProviderInterfaceVersion, + pub content: ResponseContent, +} + +#[derive(Debug)] +pub enum ResponseContent { + Control(ControlResponse), + ProviderData(T::Response), +} + +#[repr(u8)] +pub enum ResponseTag { + /// Value tag representing [`Control`] variant of the [`Response`] + Control = 0x00, + + /// Value tag representing [`ProviderData`] variant of the [`Response`] + ProviderData = 0x01, +} + +impl TryFrom for ResponseTag { + type Error = ServiceProviderMessagingError; + + fn try_from(value: u8) -> Result { + match value { + _ if value == (Self::Control as u8) => Ok(Self::Control), + _ if value == (Self::ProviderData as u8) => Ok(Self::ProviderData), + received => Err(ServiceProviderMessagingError::InvalidResponseTag { received }), + } + } +} + +impl Response +where + T: ServiceProviderRequest, +{ + pub fn new_control( + interface_version: ProviderInterfaceVersion, + content: ControlResponse, + ) -> Self { + Response { + interface_version, + content: ResponseContent::Control(content), + } + } + + pub fn new_provider_data( + interface_version: ProviderInterfaceVersion, + content: T::Response, + ) -> Self { + Response { + interface_version, + content: ResponseContent::ProviderData(content), + } + } + + pub fn into_bytes(self) -> Vec { + if let Some(version) = self.interface_version.as_u8() { + std::iter::once(version) + .chain(self.content.into_bytes(self.interface_version).into_iter()) + .collect() + } else { + self.content.into_bytes(self.interface_version) + } + } + + pub fn try_from_bytes(b: &[u8]) -> Result, ::Error> { + if b.is_empty() { + return Err(ServiceProviderMessagingError::EmptyResponse.into()); + } + + let interface_version = ProviderInterfaceVersion::from(b[0]); + let content = if interface_version.is_legacy() { + ResponseContent::try_from_bytes(b, interface_version) + } else { + ResponseContent::try_from_bytes(&b[1..], interface_version) + }?; + + Ok(Response { + interface_version, + content, + }) + } +} + +impl ResponseContent +where + T: ServiceProviderRequest, +{ + fn tag(&self) -> ResponseTag { + match self { + ResponseContent::Control(_) => ResponseTag::Control, + ResponseContent::ProviderData(_) => ResponseTag::ProviderData, + } + } + + fn serialize_inner(self) -> Vec { + match self { + ResponseContent::Control(control) => control.into_bytes(), + ResponseContent::ProviderData(provider_data) => provider_data.into_bytes(), + } + } + + fn into_bytes(self, interface_version: ProviderInterfaceVersion) -> Vec { + if interface_version.is_legacy() { + if matches!(self, ResponseContent::Control(_)) { + // this shouldn't ever happen, since if service provider received a legacy request + // it couldn't have possibly received a control request (unless client is trying to be funny) + warn!("attempted to serialize a control response in legacy mode"); + Vec::new() + } else { + self.serialize_inner() + } + } else { + std::iter::once(self.tag() as u8) + .chain(self.serialize_inner().into_iter()) + .collect() + } + } + + fn try_from_bytes( + b: &[u8], + interface_version: ProviderInterfaceVersion, + ) -> Result, ::Error> { + if interface_version.is_legacy() { + // we received a request from an old client which can only possibly + // use an old Socks5Message, which uses the entire buffer for deserialization + Ok(ResponseContent::ProviderData(T::Response::try_from_bytes( + b, + )?)) + } else { + if b.is_empty() { + return Err(ServiceProviderMessagingError::IncompleteResponse { + received: b.len() + 1, + } + .into()); + } + + let request_tag = ResponseTag::try_from(b[0])?; + match request_tag { + ResponseTag::Control => Ok(ResponseContent::Control( + ControlResponse::try_from_bytes(&b[1..])?, + )), + ResponseTag::ProviderData => Ok(ResponseContent::ProviderData( + T::Response::try_from_bytes(&b[1..])?, + )), + } + } + } +} diff --git a/service-providers/common/src/interface/version.rs b/service-providers/common/src/interface/version.rs new file mode 100644 index 0000000000..906846d438 --- /dev/null +++ b/service-providers/common/src/interface/version.rs @@ -0,0 +1,133 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::interface::{EmptyMessage, ServiceProviderRequest}; + +/// Defines initial version of the communication interface between clients and service providers. +// note: we start from '3' so that we could distinguish cases where no version is provided +// and legacy communication mode is used instead +pub const INITIAL_INTERFACE_VERSION: u8 = 3; + +/// Defines the current version of the communication interface between clients and service providers. +/// It has to be incremented for any breaking change. +pub const INTERFACE_VERSION: u8 = 3; + +/// Defines full version of particular request that includes version of common service provider interface +/// and provider-specific protocol. +#[derive(Debug, Clone)] +pub struct RequestVersion { + /// Defines version used for the interface shared by all service providers, + /// such as available control messages and their serialization. + pub provider_interface: ProviderInterfaceVersion, + + /// Defines version used specifically by particular provider's protocol. + /// For example, it could be the socks5 protocol used by socks5 client + /// and the network requester. + pub provider_protocol: T::ProtocolVersion, +} + +impl RequestVersion { + pub fn new( + provider_interface: ProviderInterfaceVersion, + provider_protocol: T::ProtocolVersion, + ) -> Self { + RequestVersion { + provider_interface, + provider_protocol, + } + } +} + +pub trait Version: std::fmt::Display {} + +#[macro_export] +macro_rules! define_simple_version { + ($name: ident, $initial_version: ident, $current_version: ident) => { + use serde::{Deserialize, Serialize}; + use std::fmt::{self, Display, Formatter}; + + #[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd, Serialize, Deserialize)] + #[serde(tag = "type", content = "version")] + pub enum $name { + Legacy, + Versioned(u8), + } + + impl $name { + pub fn new(use_legacy: bool) -> Self { + if use_legacy { + Self::new_legacy() + } else { + Self::new_versioned($current_version) + } + } + + pub fn new_legacy() -> Self { + $name::Legacy + } + + pub fn new_versioned(version: u8) -> Self { + $name::Versioned(version) + } + + pub fn new_current() -> Self { + $name::new(false) + } + + pub fn is_legacy(&self) -> bool { + matches!(self, $name::Legacy) + } + + pub fn as_u8(&self) -> Option { + match self { + $name::Legacy => None, + $name::Versioned(version) => Some(*version), + } + } + } + + impl From for $name { + fn from(v: u8) -> Self { + match v { + n if n < $initial_version => $name::Legacy, + n => $name::Versioned(n), + } + } + } + + impl Default for $name { + fn default() -> Self { + $name::Versioned(INTERFACE_VERSION) + } + } + + // I'm not fully convinced about this just yet... + impl Display for $name { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}", serde_json::to_string(&self).unwrap()) + } + } + + impl Version for $name {} + }; +} + +define_simple_version!( + ProviderInterfaceVersion, + INITIAL_INTERFACE_VERSION, + INTERFACE_VERSION +); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn interface_version_ordering() { + // in case something is done to the original enum/macro, make sure the below assumptions still hold + assert!(ProviderInterfaceVersion::Legacy < ProviderInterfaceVersion::Versioned(0)); + assert!(ProviderInterfaceVersion::Legacy < ProviderInterfaceVersion::Versioned(1)); + assert!(ProviderInterfaceVersion::Versioned(1) < ProviderInterfaceVersion::Versioned(2)); + assert!(ProviderInterfaceVersion::Versioned(42) < ProviderInterfaceVersion::Versioned(100)); + } +} diff --git a/service-providers/common/src/lib.rs b/service-providers/common/src/lib.rs new file mode 100644 index 0000000000..8331ea4775 --- /dev/null +++ b/service-providers/common/src/lib.rs @@ -0,0 +1,184 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::interface::{ + BinaryInformation, ControlRequest, ControlResponse, EmptyMessage, ProviderInterfaceVersion, + Request, RequestContent, Response, ResponseContent, ServiceProviderRequest, SupportedVersions, +}; +use async_trait::async_trait; +use nymsphinx_anonymous_replies::requests::AnonymousSenderTag; + +pub mod interface; + +// FUTURE WORK: +// for next version (v4) of the interface, refactor `reply::MixnetAddress` from the socks5 SP +// and move it here so that you could optionally attach your sender address with any request for easier responses + +/// Trait that every ServiceProvider on the Nym network should implement and adhere to. +#[async_trait] +pub trait ServiceProvider +where + T: Send + 'static, + Self: Sync, +{ + type ServiceProviderError: From<::Error>; + + // TODO: refactor to use some version of `reply::MixnetAddress` + // in case explicit address was provided + async fn on_request( + &mut self, + sender: Option, + request: Request, + ) -> Result<(), Self::ServiceProviderError>; + + async fn handle_request( + &mut self, + sender: Option, + request: Request, + ) -> Result>, Self::ServiceProviderError> { + match request.content { + RequestContent::Control(control_request) => self + .handle_control_request(sender, control_request, request.interface_version) + .await + .map(|maybe_res| { + maybe_res.map(|control_res| Response { + interface_version: request.interface_version, + content: ResponseContent::Control(control_res), + }) + }), + RequestContent::ProviderData(provider_data_request) => self + .handle_provider_data_request( + sender, + provider_data_request, + request.interface_version, + ) + .await + .map(|maybe_res| { + maybe_res.map(|provider_data_res| Response { + interface_version: request.interface_version, + content: ResponseContent::ProviderData(provider_data_res), + }) + }), + } + } + + async fn handle_control_request( + &mut self, + _sender: Option, + request: ControlRequest, + interface_version: ProviderInterfaceVersion, + ) -> Result, Self::ServiceProviderError> { + if interface_version.is_legacy() { + // control requests didn't exist in the legacy version + Ok(None) + } else { + let response = match request { + // Version 3 requests: + ControlRequest::Health => { + self.handle_health_control_request().await?; + Some(ControlResponse::Health) + } + ControlRequest::BinaryInfo => { + let info = self.handle_binary_info_control_request().await?; + Some(ControlResponse::BinaryInfo(Box::new(info))) + } + ControlRequest::SupportedRequestVersions => { + let versions = self.handle_supported_request_versions_request().await?; + Some(ControlResponse::SupportedRequestVersions(versions)) + } // + // TODO: if we ever add new request for interface version 4 (or higher), + // we need to include a check to make sure we return a `None` if passed `interface_version` was 3 + }; + Ok(response) + } + } + + // I don't think you can do anything more simple than that, but allow for custom implementations + // in case, for example, you wanted to include additional statistics collection here + async fn handle_health_control_request(&self) -> Result<(), Self::ServiceProviderError> { + Ok(()) + } + + // well, this has to be handled manually + async fn handle_binary_info_control_request( + &self, + ) -> Result; + + async fn handle_supported_request_versions_request( + &self, + ) -> Result { + Ok(SupportedVersions { + interface_version: ProviderInterfaceVersion::new_current().to_string(), + provider_version: T::max_supported_version().to_string(), + }) + } + + async fn handle_provider_data_request( + &mut self, + sender: Option, + request: T, + interface_version: ProviderInterfaceVersion, + ) -> Result, Self::ServiceProviderError>; +} + +// #[async_trait] +// pub trait ServiceProviderClient +// where +// T: Send + 'static, +// Self: Sync, +// { +// type ServiceProviderClientError: From<::Error>; +// +// fn provider_interface_version(&self) -> ProviderInterfaceVersion; +// +// fn get_control_response( +// maybe_res: Option>, +// ) -> Result, Self::ServiceProviderClientError> { +// let Some(res) = maybe_res else { +// return Ok(None) +// }; +// +// match res.content { +// ResponseContent::Control(res) => Ok(Some(res)), +// ResponseContent::ProviderData(_) => Err(Self::ServiceProviderClientError::from( +// ServiceProviderMessagingError::UnexpectedProviderDataResponse.into(), +// )), +// } +// } +// +// fn get_provider_data_response( +// maybe_res: Option>, +// ) -> Result, Self::ServiceProviderClientError> { +// let Some(res) = maybe_res else { +// return Ok(None) +// }; +// +// match res.content { +// ResponseContent::ProviderData(res) => Ok(Some(res)), +// ResponseContent::Control(_) => Err(Self::ServiceProviderClientError::from( +// ServiceProviderMessagingError::UnexpectedControlResponse.into(), +// )), +// } +// } +// +// // async fn send_control_request_anonymously( +// // &mut self, +// // request: ControlRequest, +// // ) -> Result, Self::ServiceProviderClientError>; +// // +// // async fn send_provider_data_request_anonymously( +// // &mut self, +// // request: T, +// // ) -> Result, Self::ServiceProviderClientError>; +// // +// // TODO: extend the traits and messaging to allow for attaching own address +// // async fn send_control_request_with_address( +// // &mut self, +// // request: ControlRequest, +// // ) -> Result, Self::ServiceProviderClientError>; +// // +// // async fn send_provider_data_request_with_address( +// // &mut self, +// // request: T, +// // ) -> Result, Self::ServiceProviderClientError>; +// } diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index bc48c72adb..26239e66c6 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -29,6 +29,7 @@ tokio-tungstenite = "0.17.2" # internal +build-information = { path = "../../common/build-information" } client-connections = { path = "../../common/client-connections" } completions = { path = "../../common/completions" } network-defaults = { path = "../../common/network-defaults" } @@ -36,6 +37,7 @@ nymsphinx = { path = "../../common/nymsphinx" } logging = { path = "../../common/logging"} ordered-buffer = {path = "../../common/socks5/ordered-buffer"} proxy-helpers = { path = "../../common/socks5/proxy-helpers" } +service-providers-common = { path = "../common" } socks5-requests = { path = "../../common/socks5/requests" } statistics-common = { path = "../../common/statistics" } task = { path = "../../common/task" } diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index cc49b7fbf4..b7b16ec7e3 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -1,18 +1,23 @@ -// Copyright 2020 - Nym Technologies SA +// Copyright 2020-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 + use crate::allowed_hosts; use crate::allowed_hosts::OutboundRequestFilter; use crate::error::NetworkRequesterError; +use crate::reply::MixnetMessage; use crate::statistics::ServiceStatisticsCollector; use crate::websocket; use crate::websocket::TSWebsocketStream; use crate::{reply, socks5}; +use async_trait::async_trait; +use build_information::BinaryBuildInformation; use client_connections::{ ConnectionCommand, ConnectionCommandReceiver, LaneQueueLengths, TransmissionLane, }; use futures::channel::mpsc; use futures::stream::{SplitSink, SplitStream}; use futures::{SinkExt, StreamExt}; +use log::warn; use nymsphinx::addressing::clients::Recipient; use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; use nymsphinx::receiver::ReconstructedMessage; @@ -20,21 +25,34 @@ use proxy_helpers::connection_controller::{ BroadcastActiveConnections, Controller, ControllerCommand, ControllerSender, }; use proxy_helpers::proxy_runner::{MixProxyReader, MixProxySender}; +use service_providers_common::interface::{ + BinaryInformation, ProviderInterfaceVersion, Request, RequestVersion, +}; +use service_providers_common::ServiceProvider; use socks5_requests::{ - ConnectRequest, ConnectionId, Message as Socks5Message, NetworkRequesterResponse, Request, - Response, + ConnectRequest, ConnectionId, NetworkData, SendRequest, Socks5ProtocolVersion, + Socks5ProviderRequest, Socks5Request, Socks5RequestContent, Socks5Response, }; use statistics_common::collector::StatisticsSender; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; -use task::TaskClient; +use task::{TaskClient, TaskManager}; use tokio_tungstenite::tungstenite::protocol::Message; use websocket_requests::{requests::ClientRequest, responses::ServerResponse}; // Since it's an atomic, it's safe to be kept static and shared across threads static ACTIVE_PROXIES: AtomicUsize = AtomicUsize::new(0); -pub struct ServiceProvider { +pub(crate) fn new_legacy_request_version() -> RequestVersion { + RequestVersion { + provider_interface: ProviderInterfaceVersion::Legacy, + provider_protocol: Socks5ProtocolVersion::Legacy, + } +} + +// TODO: 'Builder' is not the most appropriate name here, but I needed +// ... something ... +pub struct NRServiceProviderBuilder { websocket_address: String, outbound_request_filter: OutboundRequestFilter, open_proxy: bool, @@ -42,13 +60,108 @@ pub struct ServiceProvider { stats_provider_addr: Option, } -impl ServiceProvider { +struct NRServiceProvider { + outbound_request_filter: OutboundRequestFilter, + open_proxy: bool, + + websocket_stream: SplitStream, + controller_sender: ControllerSender, + mix_input_sender: MixProxySender, + shared_lane_queue_lengths: LaneQueueLengths, + stats_collector: Option, + shutdown: TaskManager, +} + +#[async_trait] +impl ServiceProvider for NRServiceProvider { + type ServiceProviderError = NetworkRequesterError; + + async fn on_request( + &mut self, + sender: Option, + request: Request, + ) -> Result<(), Self::ServiceProviderError> { + if let Some(response) = self.handle_request(sender, request).await? { + // TODO: this (i.e. `reply::MixnetAddress`) should be incorporated into the actual interface + if let Some(return_address) = reply::MixnetAddress::new(None, sender) { + let msg = MixnetMessage::new_provider_response(return_address, 0, response); + self.mix_input_sender + .send(msg) + .await + .expect("InputMessageReceiver has stopped receiving!"); + } else { + warn!("currently we can only send generic replies via reply surbs and we haven't got any : (") + } + } + Ok(()) + } + + async fn handle_binary_info_control_request( + &self, + ) -> Result { + Ok(BinaryInformation { + binary_name: env!("CARGO_PKG_NAME").to_string(), + build_information: BinaryBuildInformation::new(env!("CARGO_PKG_VERSION")).to_owned(), + }) + } + + async fn handle_provider_data_request( + &mut self, + sender: Option, + request: Socks5Request, + interface_version: ProviderInterfaceVersion, + ) -> Result, Self::ServiceProviderError> { + // TODO: streamline this a bit more + let request_version = RequestVersion::new(interface_version, request.protocol_version); + + log::debug!( + "received request of version {:?} (interface) / {:?} (socks5)", + interface_version, + request.protocol_version + ); + + match request.content { + Socks5RequestContent::Connect(req) => { + if let Some(stats_collector) = &self.stats_collector { + stats_collector + .connected_services + .write() + .await + .insert(req.conn_id, req.remote_addr.clone()); + } + self.handle_proxy_connect(request_version, sender, req) + .await + } + Socks5RequestContent::Send(req) => { + if let Some(stats_collector) = &self.stats_collector { + if let Some(remote_addr) = stats_collector + .connected_services + .read() + .await + .get(&req.conn_id) + { + stats_collector + .request_stats_data + .write() + .await + .processed(remote_addr, req.data.len() as u32); + } + } + self.handle_proxy_send(req) + } + } + + Ok(None) + } +} + +impl NRServiceProviderBuilder { pub async fn new( websocket_address: String, open_proxy: bool, enable_statistics: bool, stats_provider_addr: Option, - ) -> ServiceProvider { + ) -> NRServiceProviderBuilder { let standard_hosts = allowed_hosts::fetch_standard_allowed_list().await; log::info!("Standard allowed hosts: {:?}", standard_hosts); @@ -66,7 +179,7 @@ impl ServiceProvider { ); let outbound_request_filter = OutboundRequestFilter::new(allowed_hosts, unknown_hosts); - ServiceProvider { + NRServiceProviderBuilder { websocket_address, outbound_request_filter, open_proxy, @@ -75,37 +188,158 @@ impl ServiceProvider { } } + /// Start all subsystems + pub async fn run_service_provider(self) -> Result<(), NetworkRequesterError> { + let websocket_stream = Self::connect_websocket(&self.websocket_address).await?; + + // split the websocket so that we could read and write from separate threads + let (websocket_writer, websocket_reader) = websocket_stream.split(); + + // channels responsible for managing messages that are to be sent to the mix network. The receiver is + // going to be used by `mixnet_response_listener` + let (mix_input_sender, mix_input_receiver) = tokio::sync::mpsc::channel::(1); + + // Used to notify tasks to shutdown. Not all tasks fully supports this (yet). + let shutdown = task::TaskManager::default(); + + // Channel for announcing client connection state by the controller. + // The `mixnet_response_listener` will use this to either report closed connection to the + // client or request lane queue lengths. + let (client_connection_tx, client_connection_rx) = mpsc::unbounded(); + + // Shared queue length data. Published by the `OutQueueController` in the client, and used + // primarily to throttle incoming connections + let shared_lane_queue_lengths = LaneQueueLengths::new(); + + // Controller for managing all active connections. + // We provide it with a ShutdownListener since it requires it, even though for the network + // requester shutdown signalling is not yet fully implemented. + let (mut active_connections_controller, controller_sender) = Controller::new( + client_connection_tx, + BroadcastActiveConnections::On, + shutdown.subscribe(), + ); + + tokio::spawn(async move { + active_connections_controller.run().await; + }); + + let stats_collector = if self.enable_statistics { + let stats_collector = + ServiceStatisticsCollector::new(self.stats_provider_addr, mix_input_sender.clone()) + .await + .expect("Service statistics collector could not be bootstrapped"); + let mut stats_sender = StatisticsSender::new(stats_collector.clone()); + + tokio::spawn(async move { + stats_sender.run().await; + }); + Some(stats_collector) + } else { + None + }; + + let stats_collector_clone = stats_collector.clone(); + // start the listener for mix messages + tokio::spawn(async move { + NRServiceProvider::mixnet_response_listener( + websocket_writer, + mix_input_receiver, + stats_collector_clone, + client_connection_rx, + ) + .await; + }); + + let service_provider = NRServiceProvider { + outbound_request_filter: self.outbound_request_filter, + open_proxy: self.open_proxy, + websocket_stream: websocket_reader, + controller_sender, + mix_input_sender, + shared_lane_queue_lengths, + stats_collector, + shutdown, + }; + + log::info!("All systems go. Press CTRL-C to stop the server."); + service_provider.run().await + } + + // Make the websocket connection so we can receive incoming Mixnet messages. + async fn connect_websocket(uri: &str) -> Result { + match websocket::Connection::new(uri).connect().await { + Ok(ws_stream) => { + log::info!("* connected to local websocket server at {}", uri); + Ok(ws_stream) + } + Err(err) => { + log::error!( + "Error: websocket connection attempt failed, is the Nym client running?" + ); + Err(err.into()) + } + } + } +} + +impl NRServiceProvider { + async fn run(mut self) -> Result<(), NetworkRequesterError> { + // TODO: incorporate graceful shutdowns + loop { + let Some(reconstructed) = self.read_websocket_message().await else { + log::error!("The websocket stream has finished!"); + return Err(NetworkRequesterError::ConnectionClosed); + }; + + let sender = reconstructed.sender_tag; + let request = match Socks5ProviderRequest::try_from_bytes(&reconstructed.message) { + Ok(req) => req, + Err(err) => { + // TODO: or should it even be further lowered to debug/trace? + log::warn!("Failed to deserialize received message: {err}"); + continue; + } + }; + + if let Err(err) = self.on_request(sender, request).await { + // TODO: again, should it be a warning? + // we should also probably log some information regarding the origin of the request + // so that it would be easier to debug it + log::warn!("failed to resolve the received request: {err}"); + } + } + } + /// Listens for any messages from `mix_reader` that should be written back to the mix network /// via the `websocket_writer`. async fn mixnet_response_listener( mut websocket_writer: SplitSink, - mut mix_reader: MixProxyReader<(Socks5Message, reply::ReturnAddress)>, + mut mix_input_reader: MixProxyReader, stats_collector: Option, mut client_connection_rx: ConnectionCommandReceiver, ) { loop { tokio::select! { - socks5_msg = mix_reader.recv() => { - if let Some((msg, return_address)) = socks5_msg { + socks5_msg = mix_input_reader.recv() => { + if let Some(msg) = socks5_msg { if let Some(stats_collector) = stats_collector.as_ref() { if let Some(remote_addr) = stats_collector .connected_services .read() .await - .get(&msg.conn_id()) + .get(&msg.connection_id) { stats_collector .response_stats_data .write() .await - .processed(remote_addr, msg.size() as u32); + .processed(remote_addr, msg.data_size() as u32); } } // make 'request' to native-websocket client - let conn_id = msg.conn_id(); - let response_message = return_address.send_back_to(msg.into_bytes(), conn_id); - + let response_message = msg.into_client_request(); let message = Message::Binary(response_message.serialize()); websocket_writer.send(message).await.unwrap(); } else { @@ -153,11 +387,8 @@ impl ServiceProvider { } } - async fn read_websocket_message( - websocket_reader: &mut SplitStream, - lane_queue_lengths: LaneQueueLengths, - ) -> Option { - while let Some(msg) = websocket_reader.next().await { + async fn read_websocket_message(&mut self) -> Option { + while let Some(msg) = self.websocket_stream.next().await { let data = match msg { Ok(msg) => msg.into_data(), Err(err) => { @@ -182,7 +413,7 @@ impl ServiceProvider { ServerResponse::Received(received) => received, ServerResponse::LaneQueueLength { lane, queue_length } => { Self::handle_lane_queue_length_response( - &lane_queue_lengths, + &self.shared_lane_queue_lengths, lane, queue_length, ); @@ -198,17 +429,19 @@ impl ServiceProvider { None } + #[allow(clippy::too_many_arguments)] async fn start_proxy( - conn_id: ConnectionId, + remote_version: RequestVersion, + connection_id: ConnectionId, remote_addr: String, - return_address: reply::ReturnAddress, + return_address: reply::MixnetAddress, controller_sender: ControllerSender, - mix_input_sender: MixProxySender<(Socks5Message, reply::ReturnAddress)>, + mix_input_sender: MixProxySender, lane_queue_lengths: LaneQueueLengths, shutdown: TaskClient, ) { let mut conn = match socks5::tcp::Connection::new( - conn_id, + connection_id, remote_addr.clone(), return_address.clone(), ) @@ -223,11 +456,15 @@ impl ServiceProvider { ); // inform the remote that the connection is closed before it even was established + let mixnet_message = MixnetMessage::new_network_data_response( + return_address, + remote_version, + connection_id, + NetworkData::new_closed_empty(connection_id), + ); + mix_input_sender - .send(( - Socks5Message::Response(Response::new(conn_id, Vec::new(), true)), - return_address, - )) + .send(mixnet_message) .await .expect("InputMessageReceiver has stopped receiving!"); @@ -238,7 +475,10 @@ impl ServiceProvider { // Connect implies it's a fresh connection - register it with our controller let (mix_sender, mix_receiver) = mpsc::unbounded(); controller_sender - .unbounded_send(ControllerCommand::Insert(conn_id, mix_sender)) + .unbounded_send(ControllerCommand::Insert { + connection_id, + connection_sender: mix_sender, + }) .unwrap(); let old_count = ACTIVE_PROXIES.fetch_add(1, Ordering::SeqCst); @@ -249,12 +489,18 @@ impl ServiceProvider { ); // run the proxy on the connection - conn.run_proxy(mix_receiver, mix_input_sender, lane_queue_lengths, shutdown) - .await; + conn.run_proxy( + remote_version, + mix_receiver, + mix_input_sender, + lane_queue_lengths, + shutdown, + ) + .await; // proxy is done - remove the access channel from the controller controller_sender - .unbounded_send(ControllerCommand::Remove(conn_id)) + .unbounded_send(ControllerCommand::Remove { connection_id }) .unwrap(); let old_count = ACTIVE_PROXIES.fetch_sub(1, Ordering::SeqCst); @@ -265,25 +511,17 @@ impl ServiceProvider { ); } - #[allow(clippy::too_many_arguments)] async fn handle_proxy_connect( &mut self, - controller_sender: &mut ControllerSender, - mix_input_sender: &MixProxySender<(Socks5Message, reply::ReturnAddress)>, - lane_queue_lengths: LaneQueueLengths, + remote_version: RequestVersion, sender_tag: Option, connect_req: Box, - shutdown: TaskClient, ) { - let return_address = match reply::ReturnAddress::new(connect_req.return_address, sender_tag) - { - Some(address) => address, - None => { - log::warn!( + let Some(return_address) = reply::MixnetAddress::new(connect_req.return_address, sender_tag) else { + log::warn!( "attempted to start connection with no way of returning data back to the sender" ); - return; - } + return; }; let remote_addr = connect_req.remote_addr; @@ -292,212 +530,41 @@ impl ServiceProvider { if !self.open_proxy && !self.outbound_request_filter.check(&remote_addr) { let log_msg = format!("Domain {remote_addr:?} failed filter check"); log::info!("{}", log_msg); - mix_input_sender - .send(( - Socks5Message::NetworkRequesterResponse(NetworkRequesterResponse::new( - conn_id, log_msg, - )), - return_address, - )) + let msg = MixnetMessage::new_connection_error( + return_address, + remote_version, + conn_id, + log_msg, + ); + self.mix_input_sender + .send(msg) .await .expect("InputMessageReceiver has stopped receiving!"); return; } - let controller_sender_clone = controller_sender.clone(); - let mix_input_sender_clone = mix_input_sender.clone(); + let controller_sender_clone = self.controller_sender.clone(); + let mix_input_sender_clone = self.mix_input_sender.clone(); + let lane_queue_lengths_clone = self.shared_lane_queue_lengths.clone(); + let shutdown = self.shutdown.subscribe(); // and start the proxy for this connection tokio::spawn(async move { Self::start_proxy( + remote_version, conn_id, remote_addr, return_address, controller_sender_clone, mix_input_sender_clone, - lane_queue_lengths, + lane_queue_lengths_clone, shutdown, ) .await }); } - fn handle_proxy_send( - controller_sender: &mut ControllerSender, - conn_id: ConnectionId, - data: Vec, - closed: bool, - ) { - controller_sender - .unbounded_send(ControllerCommand::Send(conn_id, data, closed)) - .unwrap() - } - - async fn handle_proxy_message( - &mut self, - message: ReconstructedMessage, - controller_sender: &mut ControllerSender, - mix_input_sender: &MixProxySender<(Socks5Message, reply::ReturnAddress)>, - lane_queue_lengths: LaneQueueLengths, - stats_collector: Option, - shutdown: TaskClient, - ) { - let deserialized_msg = match Socks5Message::try_from_bytes(&message.message) { - Ok(msg) => msg, - Err(err) => { - log::error!("Failed to deserialized received message! - {err}"); - return; - } - }; - match deserialized_msg { - Socks5Message::Request(deserialized_request) => match deserialized_request { - Request::Connect(req) => { - // TODO: stats might be invalid if connection fails to start - if let Some(stats_collector) = stats_collector { - stats_collector - .connected_services - .write() - .await - .insert(req.conn_id, req.remote_addr.clone()); - } - self.handle_proxy_connect( - controller_sender, - mix_input_sender, - lane_queue_lengths, - message.sender_tag, - req, - shutdown, - ) - .await - } - - Request::Send(conn_id, data, closed) => { - if let Some(stats_collector) = stats_collector { - if let Some(remote_addr) = stats_collector - .connected_services - .read() - .await - .get(&conn_id) - { - stats_collector - .request_stats_data - .write() - .await - .processed(remote_addr, data.len() as u32); - } - } - Self::handle_proxy_send(controller_sender, conn_id, data, closed) - } - }, - Socks5Message::Response(_) | Socks5Message::NetworkRequesterResponse(_) => {} - } - } - - /// Start all subsystems - pub async fn run(&mut self) -> Result<(), NetworkRequesterError> { - let websocket_stream = self.connect_websocket(&self.websocket_address).await?; - - // split the websocket so that we could read and write from separate threads - let (websocket_writer, mut websocket_reader) = websocket_stream.split(); - - // channels responsible for managing messages that are to be sent to the mix network. The receiver is - // going to be used by `mixnet_response_listener` - let (mix_input_sender, mix_input_receiver) = - tokio::sync::mpsc::channel::<(Socks5Message, reply::ReturnAddress)>(1); - - // Used to notify tasks to shutdown. Not all tasks fully supports this (yet). - let shutdown = task::TaskManager::default(); - - // Channel for announcing client connection state by the controller. - // The `mixnet_response_listener` will use this to either report closed connection to the - // client or request lane queue lengths. - let (client_connection_tx, client_connection_rx) = mpsc::unbounded(); - - // Shared queue length data. Published by the `OutQueueController` in the client, and used - // primarily to throttle incoming connections - let shared_lane_queue_lengths = LaneQueueLengths::new(); - - // Controller for managing all active connections. - // We provide it with a ShutdownListener since it requires it, even though for the network - // requester shutdown signalling is not yet fully implemented. - let (mut active_connections_controller, mut controller_sender) = Controller::new( - client_connection_tx, - BroadcastActiveConnections::On, - shutdown.subscribe(), - ); - - tokio::spawn(async move { - active_connections_controller.run().await; - }); - - let stats_collector = if self.enable_statistics { - let stats_collector = - ServiceStatisticsCollector::new(self.stats_provider_addr, mix_input_sender.clone()) - .await - .expect("Service statistics collector could not be bootstrapped"); - let mut stats_sender = StatisticsSender::new(stats_collector.clone()); - - tokio::spawn(async move { - stats_sender.run().await; - }); - Some(stats_collector) - } else { - None - }; - - let stats_collector_clone = stats_collector.clone(); - // start the listener for mix messages - tokio::spawn(async move { - Self::mixnet_response_listener( - websocket_writer, - mix_input_receiver, - stats_collector_clone, - client_connection_rx, - ) - .await; - }); - - log::info!("All systems go. Press CTRL-C to stop the server."); - // for each incoming message from the websocket... (which in 99.99% cases is going to be a mix message) - loop { - let Some(received) = Self::read_websocket_message( - &mut websocket_reader, - shared_lane_queue_lengths.clone() - ) - .await - else { - log::error!("The websocket stream has finished!"); - return Err(NetworkRequesterError::ConnectionClosed); - }; - - self.handle_proxy_message( - received, - &mut controller_sender, - &mix_input_sender, - shared_lane_queue_lengths.clone(), - stats_collector.clone(), - shutdown.subscribe(), - ) - .await; - } - } - - // Make the websocket connection so we can receive incoming Mixnet messages. - async fn connect_websocket( - &self, - uri: &str, - ) -> Result { - match websocket::Connection::new(uri).connect().await { - Ok(ws_stream) => { - log::info!("* connected to local websocket server at {}", uri); - Ok(ws_stream) - } - Err(err) => { - log::error!( - "Error: websocket connection attempt failed, is the Nym client running?" - ); - Err(err.into()) - } - } + fn handle_proxy_send(&mut self, req: SendRequest) { + self.controller_sender.unbounded_send(req.into()).unwrap() } } diff --git a/service-providers/network-requester/src/error.rs b/service-providers/network-requester/src/error.rs index 6e033305d0..a651d34659 100644 --- a/service-providers/network-requester/src/error.rs +++ b/service-providers/network-requester/src/error.rs @@ -1,4 +1,5 @@ use crate::websocket::WebsocketConnectionError; +use socks5_requests::Socks5RequestError; #[derive(thiserror::Error, Debug)] pub enum NetworkRequesterError { @@ -10,4 +11,10 @@ pub enum NetworkRequesterError { #[error("Websocket connection closed")] ConnectionClosed, + + #[error("encountered an error while trying to handle a provider request: {source}")] + ProviderRequestError { + #[from] + source: Socks5RequestError, + }, } diff --git a/service-providers/network-requester/src/main.rs b/service-providers/network-requester/src/main.rs index 8920a5342a..ad6f1fdc59 100644 --- a/service-providers/network-requester/src/main.rs +++ b/service-providers/network-requester/src/main.rs @@ -64,14 +64,14 @@ impl Run { ); log::info!("Starting socks5 service provider"); - let mut server = core::ServiceProvider::new( + let server = core::NRServiceProviderBuilder::new( websocket_address, self.open_proxy, self.enable_statistics, stats_provider_addr, ) .await; - server.run().await + server.run_service_provider().await } } diff --git a/service-providers/network-requester/src/reply.rs b/service-providers/network-requester/src/reply.rs index 20e139fe7f..2616f36a7f 100644 --- a/service-providers/network-requester/src/reply.rs +++ b/service-providers/network-requester/src/reply.rs @@ -1,37 +1,186 @@ +// Copyright 2022-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + use nymsphinx::addressing::clients::Recipient; use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use service_providers_common::interface::{ + ControlRequest, ControlResponse, ProviderInterfaceVersion, RequestVersion, +}; +use socks5_requests::{ + ConnectionId, NetworkData, Socks5ProviderRequest, Socks5ProviderResponse, Socks5Request, + Socks5RequestContent, Socks5Response, Socks5ResponseContent, +}; +use std::fmt::{Debug, Formatter}; use websocket_requests::requests::ClientRequest; +/// Generic data this service provider will send back to the mixnet via its connected native client. +/// It includes serialized socks5 proxy responses to its connected clients +/// as well as socks5 proxy requests to the stats collector. +pub(crate) struct MixnetMessage { + pub(crate) address: MixnetAddress, + pub(crate) data: Vec, + pub(crate) connection_id: ConnectionId, +} + +impl Debug for MixnetMessage { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{} bytes to {:?} on connection_id {}", + self.data.len(), + self.address, + self.connection_id + ) + } +} + +impl MixnetMessage { + pub(crate) fn new_provider_response>( + address: A, + connection_id: ConnectionId, + msg: Socks5ProviderResponse, + ) -> Self { + MixnetMessage { + address: address.into(), + data: msg.into_bytes(), + connection_id, + } + } + + pub(crate) fn new_provider_request>( + address: A, + connection_id: ConnectionId, + msg: Socks5ProviderRequest, + ) -> Self { + MixnetMessage { + address: address.into(), + data: msg.into_bytes(), + connection_id, + } + } + + pub(crate) fn new_network_data_request>( + address: A, + request_version: RequestVersion, + connection_id: ConnectionId, + content: Socks5RequestContent, + ) -> Self { + let msg = Socks5ProviderRequest::new_provider_data( + request_version.provider_interface, + Socks5Request::new(request_version.provider_protocol, content), + ); + + Self::new_provider_request(address, connection_id, msg) + } + + pub(crate) fn new_network_data_response( + address: MixnetAddress, + request_version: RequestVersion, + connection_id: ConnectionId, + content: NetworkData, + ) -> Self { + // TODO: simplify by providing better constructor for `PlaceholderResponse` + let res = Socks5Response::new( + request_version.provider_protocol, + Socks5ResponseContent::NetworkData(content), + ); + let msg = + Socks5ProviderResponse::new_provider_data(request_version.provider_interface, res); + + Self::new_provider_response(address, connection_id, msg) + } + + #[allow(dead_code)] + pub(crate) fn new_control_request>( + address: A, + request_version: ProviderInterfaceVersion, + content: ControlRequest, + ) -> Self { + let msg = Socks5ProviderRequest::new_control(request_version, content); + // TODO: not sure what to think about 0 connection_id here... + Self::new_provider_request(address, 0, msg) + } + + #[allow(dead_code)] + pub(crate) fn new_control_response>( + address: A, + response_version: ProviderInterfaceVersion, + content: ControlResponse, + ) -> Self { + let msg = Socks5ProviderResponse::new_control(response_version, content); + // TODO: not sure what to think about 0 connection_id here... + Self::new_provider_response(address, 0, msg) + } + + pub(crate) fn new_connection_error( + address: MixnetAddress, + request_version: RequestVersion, + connection_id: ConnectionId, + error_message: String, + ) -> Self { + // TODO: simplify by providing better constructor for `PlaceholderResponse` + let res = Socks5Response::new_connection_error( + request_version.provider_protocol, + connection_id, + error_message, + ); + let msg = + Socks5ProviderResponse::new_provider_data(request_version.provider_interface, res); + + Self::new_provider_response(address, connection_id, msg) + } + + // TODO: the naming is awful, but naming things is difficult... + pub(crate) fn new_network_data_response_content( + address: MixnetAddress, + request_version: RequestVersion, + connection_id: ConnectionId, + data: Vec, + closed_socket: bool, + ) -> Self { + let response_content = NetworkData::new(connection_id, data, closed_socket); + Self::new_network_data_response(address, request_version, connection_id, response_content) + } + + pub(crate) fn data_size(&self) -> usize { + self.data.len() + } + + pub(crate) fn into_client_request(self) -> ClientRequest { + self.address.send_back_to(self.data, self.connection_id) + } +} + /// A return address is a way to send a message back to the original sender. It can be either /// an explicitly known Recipient, or a surb AnonymousSenderTag. #[derive(Debug, Clone)] -pub enum ReturnAddress { +pub enum MixnetAddress { Known(Box), Anonymous(AnonymousSenderTag), } -impl ReturnAddress { +impl MixnetAddress { pub fn new( explicit_return_address: Option, implicit_tag: Option, ) -> Option { // if somehow we received both, always prefer the explicit address since it's way easier to use if let Some(recipient) = explicit_return_address { - return Some(ReturnAddress::Known(Box::new(recipient))); + return Some(MixnetAddress::Known(Box::new(recipient))); } if let Some(sender_tag) = implicit_tag { - return Some(ReturnAddress::Anonymous(sender_tag)); + return Some(MixnetAddress::Anonymous(sender_tag)); } None } pub(super) fn send_back_to(self, message: Vec, connection_id: u64) -> ClientRequest { match self { - ReturnAddress::Known(recipient) => ClientRequest::Send { + MixnetAddress::Known(recipient) => ClientRequest::Send { recipient: *recipient, message, connection_id: Some(connection_id), }, - ReturnAddress::Anonymous(sender_tag) => ClientRequest::Reply { + MixnetAddress::Anonymous(sender_tag) => ClientRequest::Reply { message, sender_tag, connection_id: Some(connection_id), @@ -40,14 +189,14 @@ impl ReturnAddress { } } -impl From for ReturnAddress { +impl From for MixnetAddress { fn from(recipient: Recipient) -> Self { - ReturnAddress::Known(Box::new(recipient)) + MixnetAddress::Known(Box::new(recipient)) } } -impl From for ReturnAddress { +impl From for MixnetAddress { fn from(sender_tag: AnonymousSenderTag) -> Self { - ReturnAddress::Anonymous(sender_tag) + MixnetAddress::Anonymous(sender_tag) } } diff --git a/service-providers/network-requester/src/socks5/tcp.rs b/service-providers/network-requester/src/socks5/tcp.rs index f22bb3ced4..e5ddd8a5c0 100644 --- a/service-providers/network-requester/src/socks5/tcp.rs +++ b/service-providers/network-requester/src/socks5/tcp.rs @@ -1,16 +1,17 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::reply; +use crate::reply::MixnetMessage; use client_connections::LaneQueueLengths; use proxy_helpers::connection_controller::ConnectionReceiver; use proxy_helpers::proxy_runner::{MixProxySender, ProxyRunner}; -use socks5_requests::{ConnectionId, Message as Socks5Message, RemoteAddress, Response}; +use service_providers_common::interface::RequestVersion; +use socks5_requests::{ConnectionId, RemoteAddress, Socks5Request}; use std::io; use task::TaskClient; use tokio::net::TcpStream; -use crate::reply; - /// An outbound TCP connection between the Socks5 service provider, which makes /// requests on behalf of users and returns the responses through /// the mixnet. @@ -19,14 +20,14 @@ pub(crate) struct Connection { id: ConnectionId, address: RemoteAddress, conn: Option, - return_address: reply::ReturnAddress, + return_address: reply::MixnetAddress, } impl Connection { pub(crate) async fn new( id: ConnectionId, address: RemoteAddress, - return_address: reply::ReturnAddress, + return_address: reply::MixnetAddress, ) -> io::Result { let conn = TcpStream::connect(&address).await?; @@ -40,8 +41,9 @@ impl Connection { pub(crate) async fn run_proxy( &mut self, + remote_version: RequestVersion, mix_receiver: ConnectionReceiver, - mix_sender: MixProxySender<(Socks5Message, reply::ReturnAddress)>, + mix_sender: MixProxySender, lane_queue_lengths: LaneQueueLengths, shutdown: TaskClient, ) { @@ -60,9 +62,12 @@ impl Connection { shutdown, ) .run(move |conn_id, read_data, socket_closed| { - ( - Socks5Message::Response(Response::new(conn_id, read_data, socket_closed)), + MixnetMessage::new_network_data_response_content( return_address.clone(), + remote_version.clone(), + conn_id, + read_data, + socket_closed, ) }) .await diff --git a/service-providers/network-requester/src/statistics/collector.rs b/service-providers/network-requester/src/statistics/collector.rs index 575986269e..05f14932d1 100644 --- a/service-providers/network-requester/src/statistics/collector.rs +++ b/service-providers/network-requester/src/statistics/collector.rs @@ -1,6 +1,9 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use super::error::StatsError; +use crate::core::new_legacy_request_version; +use crate::reply::MixnetMessage; use async_trait::async_trait; use log::*; use nymsphinx::addressing::clients::Recipient; @@ -8,7 +11,8 @@ use ordered_buffer::OrderedMessageSender; use proxy_helpers::proxy_runner::MixProxySender; use rand::RngCore; use serde::Deserialize; -use socks5_requests::{ConnectionId, Message as Socks5Message, RemoteAddress, Request}; +use service_providers_common::interface::RequestVersion; +use socks5_requests::{ConnectionId, RemoteAddress, Socks5Request, Socks5RequestContent}; use sqlx::types::chrono::{DateTime, Utc}; use statistics_common::api::{ build_statistics_request_bytes, DEFAULT_STATISTICS_SERVICE_ADDRESS, @@ -23,10 +27,6 @@ use std::sync::Arc; use std::time::Duration; use tokio::sync::RwLock; -use crate::reply; - -use super::error::StatsError; - const REMOTE_SOURCE_OF_STATS_PROVIDER_CONFIG: &str = "https://nymtech.net/.wellknown/network-requester/stats-provider.json"; @@ -73,18 +73,19 @@ impl OptionalStatsProviderConfig { } #[derive(Clone)] -pub struct ServiceStatisticsCollector { +pub(crate) struct ServiceStatisticsCollector { pub(crate) request_stats_data: Arc>, pub(crate) response_stats_data: Arc>, pub(crate) connected_services: Arc>>, stats_provider_addr: Recipient, - mix_input_sender: MixProxySender<(Socks5Message, reply::ReturnAddress)>, + mix_input_sender: MixProxySender, + request_version: RequestVersion, } impl ServiceStatisticsCollector { - pub async fn new( + pub(crate) async fn new( stats_provider_addr: Option, - mix_input_sender: MixProxySender<(Socks5Message, reply::ReturnAddress)>, + mix_input_sender: MixProxySender, ) -> Result { let client = reqwest::Client::builder() .timeout(Duration::from_secs(3)) @@ -110,6 +111,9 @@ impl ServiceStatisticsCollector { connected_services: Arc::new(RwLock::new(HashMap::new())), stats_provider_addr, mix_input_sender, + // for now always use legacy serialization since we'll never be sending control + // messages to the stats collector anyway and we can't be sure they're using the updated interfaces + request_version: new_legacy_request_version(), }) } } @@ -168,28 +172,37 @@ impl StatisticsCollector for ServiceStatisticsCollector { trace!("Connecting to statistics service"); let mut rng = rand::rngs::OsRng; let conn_id = rng.next_u64(); - let connect_req = Request::new_connect( + let connect_req = Socks5RequestContent::new_connect( conn_id, format!("{DEFAULT_STATISTICS_SERVICE_ADDRESS}:{DEFAULT_STATISTICS_SERVICE_PORT}"), Some(self.stats_provider_addr), ); + let mixnet_message = MixnetMessage::new_network_data_request( + self.stats_provider_addr, + self.request_version.clone(), + conn_id, + connect_req, + ); + self.mix_input_sender - .send(( - Socks5Message::Request(connect_req), - self.stats_provider_addr.into(), - )) + .send(mixnet_message) .await .expect("MixProxyReader has stopped receiving!"); trace!("Sending data to statistics service"); let mut message_sender = OrderedMessageSender::new(); let ordered_msg = message_sender.wrap_message(msg).into_bytes(); - let send_req = Request::new_send(conn_id, ordered_msg, true); + let send_req = Socks5RequestContent::new_send(conn_id, ordered_msg, true); + + let mixnet_message = MixnetMessage::new_network_data_request( + self.stats_provider_addr, + self.request_version.clone(), + conn_id, + send_req, + ); + self.mix_input_sender - .send(( - Socks5Message::Request(send_req), - self.stats_provider_addr.into(), - )) + .send(mixnet_message) .await .expect("MixProxyReader has stopped receiving!"); diff --git a/service-providers/network-requester/src/statistics/mod.rs b/service-providers/network-requester/src/statistics/mod.rs index 0e77a9333b..189015f2cd 100644 --- a/service-providers/network-requester/src/statistics/mod.rs +++ b/service-providers/network-requester/src/statistics/mod.rs @@ -4,4 +4,4 @@ mod collector; mod error; -pub use collector::ServiceStatisticsCollector; +pub(crate) use collector::ServiceStatisticsCollector; From 3bc7f281b4bd2d0d7fbfb314b7e0fa78d2c46e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Thu, 2 Feb 2023 13:55:58 +0200 Subject: [PATCH 295/591] Fix typo during merge back to develop (#2956) --- nym-api/src/support/cli/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-api/src/support/cli/mod.rs b/nym-api/src/support/cli/mod.rs index dde70aa12f..7e74b58e3c 100644 --- a/nym-api/src/support/cli/mod.rs +++ b/nym-api/src/support/cli/mod.rs @@ -122,7 +122,7 @@ pub(crate) fn build_config(args: CliArgs) -> Result { let config = override_config(config_from_file, args); - if already_initialized { + if !already_initialized { fs::create_dir_all(Config::default_config_directory(&id)) .expect("Could not create config directory"); fs::create_dir_all(Config::default_data_directory(&id)) From 25762900fa8e78199c9aa23c0f9deca8d6bd6e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 7 Feb 2023 11:45:40 +0100 Subject: [PATCH 296/591] Remove all the .DS_Store files and add to gitignore (#2974) --- .gitignore | 2 +- clients/.DS_Store | Bin 6148 -> 0 bytes .../vesting-contract/.DS_Store | Bin 6148 -> 0 bytes contracts/.DS_Store | Bin 6148 -> 0 bytes mixnode/.DS_Store | Bin 6148 -> 0 bytes nym-connect-android/.DS_Store | Bin 6148 -> 0 bytes nym-connect/.DS_Store | Bin 6148 -> 0 bytes nym-wallet/.DS_Store | Bin 8196 -> 0 bytes service-providers/.DS_Store | Bin 6148 -> 0 bytes tools/.DS_Store | Bin 6148 -> 0 bytes 10 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 clients/.DS_Store delete mode 100644 common/cosmwasm-smart-contracts/vesting-contract/.DS_Store delete mode 100644 contracts/.DS_Store delete mode 100644 mixnode/.DS_Store delete mode 100644 nym-connect-android/.DS_Store delete mode 100644 nym-connect/.DS_Store delete mode 100644 nym-wallet/.DS_Store delete mode 100644 service-providers/.DS_Store delete mode 100644 tools/.DS_Store diff --git a/.gitignore b/.gitignore index 86e0a60f45..2b0cb82a78 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,4 @@ envs/qwerty.env Cargo.lock nym-connect/Cargo.lock .parcel-cache -.DS_Store +**/.DS_Store diff --git a/clients/.DS_Store b/clients/.DS_Store deleted file mode 100644 index 31c7b1aa5dec9d390e033cf8aec647eeee744daa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%TB{E5S%Sl)yJhrE=c(SkT`G;RXK3(573uTL`b9-in!&@$MAieVAi&(#A!Jp zgwSrZ9>>`oJ7X)30m$TebqS0C^y!M70gD5s&(&Mj2`xjSIF15OIL8ttHmzuD_=^hY z+>JP6IWnwKpTG5OUM?4TxnP7Yk8AqHr!&@$X6qgC1uzl8ikyF7aR56!fGJ=K{D1=beWvwC9<4M5OaW71uYi6Z z61rj5y>v zkkGS)6N{6Ri-_fR#tK(CkOR$zX*k@T&@Z0jVH(RR910 diff --git a/common/cosmwasm-smart-contracts/vesting-contract/.DS_Store b/common/cosmwasm-smart-contracts/vesting-contract/.DS_Store deleted file mode 100644 index 5172429f264de2441865cb4700216d4256da9242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~J!%6%427R!7lt%jx}3%b$PET#pTHLgIFQEJ;E>dF^gR7ES*H$5cmnB-G%I%Z zD|S`@Z2$T80!#olbXV*=%*>dt@PRwdU#I)^a=X5>;#J@&VrHyNnC;iLL0pQvfVyTmjO&;ssLc!1UOG})p;=82 zR;?Ceh}WZ?+UmMqI#RP8R>OzYoz15hnq@nzF`-!xQ4j$Um=RcIKKc27r2jVm&svm< zfC&6E0=7P!4tu^-ovjbA=k?dB`g+i*aXG_}p8zI)6mRKa+;6_1_R^8c3Qa!(fk8n8 H{*=HsM+*^= diff --git a/contracts/.DS_Store b/contracts/.DS_Store deleted file mode 100644 index 9fd855f537321697398d76124a7492dda2fe67ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOHRWu6dcnCD%wTaAtXdDKqYPvS`Z*1So8u=f=We5P(OTj*>f1gVK@vcm}gti zxWEztdM|n&$9dz=ShiyTrZY{qfEIu{T`*c^@`=fJ@i|-YB@Lpnb(~=neVigkIv1@4 zs(>o++Z2$syJpwy7(>ji-&?+?nBanIdVq7T>2r*@wkIqvkRN2lSwAcKe(i zV-8qGm$4%<3$)28aD^=3JO-R5Is2^X2z%JYA&!Y{^3p2LtOvXX`<<~@*L?23YRxp7ONVyrU}CQT#E8Y#n3vxH;lv&jkEKI?p&3UdI;!zk4CCl5k9}O? zv2^I@F#hske9Ok)P>gMz^~W|GCUK~#DxeBf6{xw_mYn~)U*G?$Bz;o_RDpk`fQfc` zI~@+mpRIF)le0FapU}l5u5@TAO#E?dGjbHK(yj4ZEE!_rv2@51n*In_88lG^epG=s DgB7Ji diff --git a/mixnode/.DS_Store b/mixnode/.DS_Store deleted file mode 100644 index c7ae475cadc968fc94261bdf2b60440b9d3c8c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ5B>J5Pd^Z1ZYyyAo&CoMqdMIM4L`xNaVu+=)KY3hs>LRws(Ow0COyY!2+uilW{2ptJoePD;*<6ga@R!N5A0h zJG=s3f&Zp}e7g%cz%_>G^2`1GevkWUtJzPR92cKGmgrj>Tfh=IN9;YrA?i56IWgjQ z-*$Mf4lh6(J&f>>_fuPr-x3neri~6R8C6=3+*3LjIlSirZ@{&*aL2k!{|L9tmLhR@ zpAK&p17>J4M-Q#MZ>8(_&f|h>-a`$i#FAB4-W^7ja~QgDs|V#?od5O7_y0V} zKY0bb0#l`c3TlnoK9^+A*23cCtPNSNSj5CHGpH%7>~X9caujc}XyaHY4PtCDGsqsA P|0AGf@Re8KPZjt9YVhCG diff --git a/nym-connect/.DS_Store b/nym-connect/.DS_Store deleted file mode 100644 index 7bf1d0399970057c418eee2fecee6e6ad6b11b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Sr<=6g_E2@%;c7Zp8Tk2mFIkTU77?_5;*DEY&(wTCLmJi{B!CjQB0$LeEWt zFq!FAq~tLRws(Ow0COyY!2+uilW{2ptJoePD;*<6ga@R!N5A0h zJG=s3f&Zp}e7g%cz%_>G^2`1GevkWUtJzPR92cKGmgrj>Tfh=IN9;YrA?i56IWgjQ z-*$Mf4lh6(J&f>>_fuPr-x3neri~6R8C6=3+*3LjIlSirZ@{&*aL2k!{|L9tmLhR@ zpAK&p17>J4M-Q#MZ>8(_&f|h>-a`$i#FAB4-W^7ja~QgDs|V#?od5O7_y0V} zKY0bb0#l`c3TlnoK9^+A*23cCtPNSNSj5CHGpH%7>~X9caujc}XyaHY4PtCDGsqsA P|0AGf@Re8KPZjt9YVhCG diff --git a/nym-wallet/.DS_Store b/nym-wallet/.DS_Store deleted file mode 100644 index 23b76277ca0ef242dc50c8ba4547fc9680adee30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMTW%9E6g^JTs(}DSsziSfvw=op2Wgv%BJq&u0w6Dwq$J&OaW8C6fgx$0aM^#P=IT;q@4}xzOS{?6fgz;O9kZnkT45&01C)~l>;znSR4RS?-Gd8M7q%GA(^;R0Ik6LP<-+b|>2%Ofr+wDTlsaT?|Ioy%n3I!vjx^$2 zMw}MgIi;s(c!U!?!E<7pykU{&?nk@^hL~WEJhJ;xVJBw~^T_U7WYQLj`vIqzoV4(Mk|oYCTdcPS>tC~99KZ@U}3<@9h-j;4Mb z@msX&=}AkEBR8UwZ>Z4}S+U*v=ZLpW-U5Az5QCy^<3VKG#0!qpA-Z@nQd2WU4>cbDonKXpXyjL1+J3K z+jRbaow{VPngXW4A1dG)-LviyNxG_6kY$xmm|rnV61$a0rLZXc5a9jQABMb6Xeyje Uz?DZnVX}h&mB9*A;IAt16V1mdK>z>% diff --git a/service-providers/.DS_Store b/service-providers/.DS_Store deleted file mode 100644 index 9ffdb3cec473cb67fc585f9e425fa30504a8ea02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ5B>J5S<|@BGCjYN?!mZZeXHNQ0D@W5TS_GuGo;!`bHcP-h4pWWQ$Y?!HhJ1 zV|zZ{C#^q3#FNeAHPM)eMo>W(qeo=8ck0BQhd|aG4Yl-4muQzgiGJgdto@8?toN1P zXm|ZDw87{a<4bDqs%9~-nmN3MsvGFlhYGBtGHhpUT{ZO+yulTnAJmje573p?T+xEo zdsW{Nw_Ek79D8+1;Z|NBP-$@Og69Cg?p>MEr^v5ZIkd j06MadTmX7EU9YC= z(=!jIy9LvO3?u`|z%K*3KNJqd8rU3d>!7k0fH>i_32nVJYfcHQfz6Q~ig+r~Qzcpq z@pR6Yh^v9k(bFN(d`PVP)4YhS&ici|A=NQ;GLQ`HGoZaMWv1u<9ei{)a@uZy$w;5+rKEgTOVDjL_+pwQmC1n@!kkxO&Bzo^Z)8rU4Qiq2a)F)so} LNUCJu2n>7!vI;HG From eeba17a01f9d451ccafe8353b6005b266f960dc8 Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Thu, 2 Feb 2023 15:18:58 +0100 Subject: [PATCH 297/591] build(nc-android): prepare for apk release (#2943) * chore(nc-android): prepare for production build * refactor(nc-android): remove dead code * feat(nc-android): update native color theme * feat(nc-android): update native color theme * build(nc-android): fix rfd version issue * build(nc-android): fix dist dir no such file error * fix(nc-android): post rebase changes --- nym-connect-android/public/growth.html.back | 11 - nym-connect-android/public/log.html.back | 11 - nym-connect-android/src-tauri/Cargo.toml | 10 +- .../nym-connect-android/app/build.gradle.kts | 181 ++++++------ .../arm64-v8a/libnym_connect_android.so | 1 + .../armeabi-v7a/libnym_connect_android.so | 1 + .../jniLibs/x86/libnym_connect_android.so | 1 + .../app/src/main/res/values-night/themes.xml | 12 +- .../app/src/main/res/values/colors.xml | 9 +- .../app/src/main/res/values/strings.xml | 2 +- .../app/src/main/res/values/themes.xml | 8 +- nym-connect-android/src-tauri/src/error.rs | 5 - .../src/operations/growth/api_client.rs | 270 ----------------- .../src-tauri/src/operations/growth/assets.rs | 57 ---- .../src-tauri/src/operations/growth/mod.rs | 3 - .../src/operations/growth/test_and_earn.rs | 159 ---------- .../src-tauri/src/operations/mod.rs | 1 - nym-connect-android/src-tauri/src/state.rs | 2 +- .../Growth/TestAndEarnButtonArea.tsx | 84 ------ .../Growth/TestAndEarnCurrentDraw.stories.tsx | 94 ------ .../Growth/TestAndEarnCurrentDraw.tsx | 192 ------------- .../Growth/TestAndEarnDraws.stories.tsx | 19 -- .../components/Growth/TestAndEarnDraws.tsx | 196 ------------- .../TestAndEarnEnterWalletAddress.stories.tsx | 41 --- .../Growth/TestAndEarnEnterWalletAddress.tsx | 37 --- .../components/Growth/TestAndEarnError.tsx | 13 - .../Growth/TestAndEarnPopup.stories.tsx | 162 ----------- .../components/Growth/TestAndEarnPopup.tsx | 118 -------- .../components/Growth/TestAndEarnTakePart.tsx | 75 ----- .../Growth/TestAndEarnWinner.stories.tsx | 19 -- .../components/Growth/TestAndEarnWinner.tsx | 114 -------- .../Growth/TestAndEarnWinnerWalletAddress.tsx | 12 - .../Growth/content/TestAndEarn/Error.mdx | 17 -- .../content/TestAndEarn/Stage0_intro.mdx | 25 -- .../TestAndEarn/WinnerEntersWalletAddress.mdx | 9 - .../content/TestAndEarnNotAvaialble.mdx | 3 - .../Growth/content/assets/matrix.webp | Bin 1170192 -> 0 bytes .../Growth/content/assets/winner.webp | Bin 510504 -> 0 bytes .../src/components/Growth/content/en.yaml | 43 --- .../Growth/context/TestAndEarnContext.tsx | 272 ------------------ .../context/mocks/TestAndEarnContext.tsx | 262 ----------------- .../src/components/Growth/context/types.ts | 64 ----- nym-connect-android/src/growth.tsx.back | 23 -- nym-connect-android/src/log.tsx.back | 18 -- nym-connect-android/tsconfig.json | 4 +- nym-connect-android/webpack.common.js | 24 +- nym-connect-android/webpack.dev.js | 27 +- nym-connect-android/webpack.prod.js | 2 - yarn.lock | 75 ++++- 49 files changed, 215 insertions(+), 2573 deletions(-) delete mode 100644 nym-connect-android/public/growth.html.back delete mode 100644 nym-connect-android/public/log.html.back create mode 120000 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so create mode 120000 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so create mode 120000 nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86/libnym_connect_android.so delete mode 100644 nym-connect-android/src-tauri/src/operations/growth/api_client.rs delete mode 100644 nym-connect-android/src-tauri/src/operations/growth/assets.rs delete mode 100644 nym-connect-android/src-tauri/src/operations/growth/mod.rs delete mode 100644 nym-connect-android/src-tauri/src/operations/growth/test_and_earn.rs delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnButtonArea.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnCurrentDraw.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnDraws.stories.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnDraws.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnEnterWalletAddress.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnError.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnPopup.stories.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnPopup.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnTakePart.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnWinner.stories.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnWinner.tsx delete mode 100644 nym-connect-android/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx delete mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarn/Error.mdx delete mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx delete mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx delete mode 100644 nym-connect-android/src/components/Growth/content/TestAndEarnNotAvaialble.mdx delete mode 100644 nym-connect-android/src/components/Growth/content/assets/matrix.webp delete mode 100644 nym-connect-android/src/components/Growth/content/assets/winner.webp delete mode 100644 nym-connect-android/src/components/Growth/content/en.yaml delete mode 100644 nym-connect-android/src/components/Growth/context/TestAndEarnContext.tsx delete mode 100644 nym-connect-android/src/components/Growth/context/mocks/TestAndEarnContext.tsx delete mode 100644 nym-connect-android/src/components/Growth/context/types.ts delete mode 100644 nym-connect-android/src/growth.tsx.back delete mode 100644 nym-connect-android/src/log.tsx.back diff --git a/nym-connect-android/public/growth.html.back b/nym-connect-android/public/growth.html.back deleted file mode 100644 index 08672aaa3c..0000000000 --- a/nym-connect-android/public/growth.html.back +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Nym Connect - - -

    - - diff --git a/nym-connect-android/public/log.html.back b/nym-connect-android/public/log.html.back deleted file mode 100644 index 5ced2243f1..0000000000 --- a/nym-connect-android/public/log.html.back +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Nym Wallet Logs - - -
    - - diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect-android/src-tauri/Cargo.toml index 93e8c31750..e967c9729a 100644 --- a/nym-connect-android/src-tauri/Cargo.toml +++ b/nym-connect-android/src-tauri/Cargo.toml @@ -41,8 +41,8 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_repr = "0.1" tap = "1.0.1" -tauri = { git = "https://github.com/tauri-apps/tauri", branch = "next", features = ["clipboard-write-text", "native-tls-vendored", "notification-all", "shell-open", "system-tray", "window-close", "window-minimize", "window-start-dragging"] } -# tauri = { version = "2.0.0-alpha.0", features = ["clipboard-write-text", "native-tls-vendored", "notification-all", "shell-open", "system-tray", "window-close", "window-minimize", "window-start-dragging"] } +# TODO swithing to `rfd101` temporarily, untill https://github.com/tauri-apps/tauri/pull/6174 is merged +tauri = { git = "https://github.com/tauri-apps/tauri", branch = "rfd101", features = ["clipboard-write-text", "native-tls-vendored", "notification-all", "shell-open", "system-tray", "window-close", "window-minimize", "window-start-dragging"] } tendermint-rpc = "0.23.0" thiserror = "1.0" tokio = { version = "1.24.1", features = ["sync", "time"] } @@ -64,3 +64,9 @@ tempfile = "3.3.0" [features] default = ["custom-protocol"] custom-protocol = ["tauri/custom-protocol"] + +# [profile.dev] +# strip = true +# opt-level = "s" +# lto = true + diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts index a81c779421..56d94386ff 100644 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/build.gradle.kts @@ -1,111 +1,112 @@ plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") - id("rustPlugin") + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("rustPlugin") } android { - compileSdk = 33 - defaultConfig { - manifestPlaceholders["usesCleartextTraffic"] = "false" - applicationId = "net.nymtech.nym_connect_android" - minSdk = 24 - targetSdk = 33 - versionCode = 1 - versionName = "1.0" + compileSdk = 33 + defaultConfig { + manifestPlaceholders["usesCleartextTraffic"] = "false" + applicationId = "net.nymtech.nym_connect_android" + minSdk = 24 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + } + sourceSets.getByName("main") { + // Vulkan validation layers + val ndkHome = System.getenv("NDK_HOME") + jniLibs.srcDir("${ndkHome}/sources/third_party/vulkan/src/build-android/jniLibs") + } + buildTypes { + getByName("debug") { + manifestPlaceholders["usesCleartextTraffic"] = "true" + isDebuggable = true + isJniDebuggable = true + isMinifyEnabled = false + packagingOptions { + jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + + jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") + + jniLibs.keepDebugSymbols.add("*/x86/*.so") + + jniLibs.keepDebugSymbols.add("*/x86_64/*.so") + } } - sourceSets.getByName("main") { - // Vulkan validation layers - val ndkHome = System.getenv("NDK_HOME") - jniLibs.srcDir("${ndkHome}/sources/third_party/vulkan/src/build-android/jniLibs") + getByName("release") { + isMinifyEnabled = false + // proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") } - buildTypes { - getByName("debug") { - manifestPlaceholders["usesCleartextTraffic"] = "true" - isDebuggable = true - isJniDebuggable = true - isMinifyEnabled = false - packagingOptions { - jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + } + flavorDimensions.add("abi") + productFlavors { + create("universal") { + val abiList = findProperty("abiList") as? String - jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") - - jniLibs.keepDebugSymbols.add("*/x86/*.so") - - jniLibs.keepDebugSymbols.add("*/x86_64/*.so") - } - } - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") - } + dimension = "abi" + ndk { + abiFilters += abiList?.split(",")?.map { it.trim() } ?: listOf( + "arm64-v8a", "armeabi-v7a", "x86", "x86_64", + ) + } } - flavorDimensions.add("abi") - productFlavors { - create("universal") { - val abiList = findProperty("abiList") as? String - - dimension = "abi" - ndk { - abiFilters += abiList?.split(",")?.map { it.trim() } ?: listOf( "arm64-v8a", "armeabi-v7a", "x86", "x86_64", - ) - } - } - create("arm64") { - dimension = "abi" - ndk { - abiFilters += listOf("arm64-v8a") - } - } - - create("arm") { - dimension = "abi" - ndk { - abiFilters += listOf("armeabi-v7a") - } - } - - create("x86") { - dimension = "abi" - ndk { - abiFilters += listOf("x86") - } - } - - create("x86_64") { - dimension = "abi" - ndk { - abiFilters += listOf("x86_64") - } - } + create("arm64") { + dimension = "abi" + ndk { + abiFilters += listOf("arm64-v8a") + } } - assetPacks += mutableSetOf() - namespace = "net.nymtech.nym_connect_android" + create("arm") { + dimension = "abi" + ndk { + abiFilters += listOf("armeabi-v7a") + } + } + + create("x86") { + dimension = "abi" + ndk { + abiFilters += listOf("x86") + } + } + + create("x86_64") { + dimension = "abi" + ndk { + abiFilters += listOf("x86_64") + } + } + } + + assetPacks += mutableSetOf() + namespace = "net.nymtech.nym_connect_android" } rust { - rootDirRel = "../../../../" - targets = listOf("aarch64", "armv7", "i686", "x86_64") - arches = listOf("arm64", "arm", "x86", "x86_64") + rootDirRel = "../../../../" + targets = listOf("aarch64", "armv7", "i686", "x86_64") + arches = listOf("arm64", "arm", "x86", "x86_64") } dependencies { - implementation("androidx.webkit:webkit:1.5.0") - implementation("androidx.appcompat:appcompat:1.5.1") - implementation("com.google.android.material:material:1.7.0") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.4") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") + implementation("androidx.webkit:webkit:1.5.0") + implementation("androidx.appcompat:appcompat:1.5.1") + implementation("com.google.android.material:material:1.7.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.4") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") } afterEvaluate { - android.applicationVariants.all { - tasks["mergeUniversalReleaseJniLibFolders"].dependsOn(tasks["rustBuildRelease"]) - tasks["mergeUniversalDebugJniLibFolders"].dependsOn(tasks["rustBuildDebug"]) - productFlavors.filter{ it.name != "universal" }.forEach { _ -> - val archAndBuildType = name.capitalize() - tasks["merge${archAndBuildType}JniLibFolders"].dependsOn(tasks["rustBuild${archAndBuildType}"]) - } + android.applicationVariants.all { + tasks["mergeUniversalReleaseJniLibFolders"].dependsOn(tasks["rustBuildRelease"]) + tasks["mergeUniversalDebugJniLibFolders"].dependsOn(tasks["rustBuildDebug"]) + productFlavors.filter { it.name != "universal" }.forEach { _ -> + val archAndBuildType = name.capitalize() + tasks["merge${archAndBuildType}JniLibFolders"].dependsOn(tasks["rustBuild${archAndBuildType}"]) } + } } diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so new file mode 120000 index 0000000000..5963e98ea2 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so @@ -0,0 +1 @@ +/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/aarch64-linux-android/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so new file mode 120000 index 0000000000..28db5686bb --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so @@ -0,0 +1 @@ +/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/armv7-linux-androideabi/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86/libnym_connect_android.so new file mode 120000 index 0000000000..3041208a37 --- /dev/null +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/jniLibs/x86/libnym_connect_android.so @@ -0,0 +1 @@ +/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/i686-linux-android/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml index 4e5d6f7ccf..7178979168 100644 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values-night/themes.xml @@ -2,15 +2,15 @@ - + \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml index f8c6127d32..fccc70b8de 100644 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/colors.xml @@ -1,10 +1,9 @@ - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 + #212121 + #424242 + #4caf50 + #1b5e20 #FF000000 #FFFFFFFF \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml index 95988e4202..74cf5d6f34 100644 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - nym-connect-android + Nym Connect \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml index 8e37feb691..1de86a4c9a 100644 --- a/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml +++ b/nym-connect-android/src-tauri/gen/android/nym-connect-android/app/src/main/res/values/themes.xml @@ -2,12 +2,12 @@ \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml index 7178979168..7416b4c5cb 100644 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml +++ b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml @@ -12,5 +12,8 @@ ?attr/colorPrimaryVariant + @color/grey_900 + @mipmap/ic_launcher_round + @style/Theme.nym_connect_android \ No newline at end of file diff --git a/nym-connect-android/src/components/ConnectionStatus.tsx b/nym-connect-android/src/components/ConnectionStatus.tsx index 0a04f4993f..4ee49c5e14 100644 --- a/nym-connect-android/src/components/ConnectionStatus.tsx +++ b/nym-connect-android/src/components/ConnectionStatus.tsx @@ -38,6 +38,7 @@ const ConnectionStatusContent: FCWithChildren<{ justifyContent="center" sx={{ cursor: 'pointer' }} color="warning.main" + onClick={() => setShowGatewayWarn(true)} > {onClose && ( - - + + )} diff --git a/nym-connect-android/src/components/TooltipInfo.tsx b/nym-connect-android/src/components/TooltipInfo.tsx index 438d9f8da3..678b5337ed 100644 --- a/nym-connect-android/src/components/TooltipInfo.tsx +++ b/nym-connect-android/src/components/TooltipInfo.tsx @@ -3,7 +3,7 @@ import { Divider, Stack, Typography } from '@mui/material'; import { ServiceProvider } from 'src/types/directory'; export const ServiceProviderInfo = ({ serviceProvider }: { serviceProvider: ServiceProvider }) => ( - + Gateway {serviceProvider.gateway} @@ -15,7 +15,7 @@ export const ServiceProviderInfo = ({ serviceProvider }: { serviceProvider: Serv ); export const GatwayWarningInfo = () => ( - + Try disconnecting and connecting again ); From 22df65aad717e8e45279eb2d72ae7c5c4cd86f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Fri, 17 Feb 2023 14:44:16 +0100 Subject: [PATCH 385/591] pemstore: set version to 0.1.0 --- Cargo.lock | 2 +- Cargo.toml | 1 - common/pemstore/Cargo.toml | 2 +- mixnode/Cargo.toml | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 52e8dae2dc..364b734f12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3784,7 +3784,7 @@ dependencies = [ [[package]] name = "nym-pemstore" -version = "1.1.9" +version = "0.1.0" dependencies = [ "pem", ] diff --git a/Cargo.toml b/Cargo.toml index 071373f8e9..ab87c5f40d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -104,7 +104,6 @@ authors = ["Nym Technologies SA"] repository = "https://github.com/nymtech/nym" homepage = "https://nymtech.net" edition = "2021" -version = "1.1.9" license = "Apache-2" [workspace.dependencies] diff --git a/common/pemstore/Cargo.toml b/common/pemstore/Cargo.toml index b728cc595f..a5542ff097 100644 --- a/common/pemstore/Cargo.toml +++ b/common/pemstore/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "nym-pemstore" description = "Store private-public keypairs in PEM format" -version = { workspace = true } +version = "0.1.0" edition = { workspace = true } license = { workspace = true } authors = { workspace = true } diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index e4345a0c11..13f098a51c 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -49,7 +49,7 @@ mixnet-client = { path="../common/client-libs/mixnet-client" } mixnode-common = { path="../common/mixnode-common" } nonexhaustive-delayqueue = { path="../common/nonexhaustive-delayqueue" } nymsphinx = { path="../common/nymsphinx" } -nym-pemstore = { path="../common/pemstore" } +nym-pemstore = { path = "../common/pemstore", version = "0.1.0" } task = { path = "../common/task" } nym-types = { path = "../common/types" } topology = { path="../common/topology" } From a8e62bde268ba3d271cd612b321fa2f73e8725e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Fri, 17 Feb 2023 15:42:11 +0100 Subject: [PATCH 386/591] pemstore: more fields, revert back to pem 0.8 --- Cargo.toml | 1 + common/pemstore/Cargo.toml | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ab87c5f40d..98e1834ee9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,6 +103,7 @@ exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-co authors = ["Nym Technologies SA"] repository = "https://github.com/nymtech/nym" homepage = "https://nymtech.net" +documentation = "https://nymtech.net" edition = "2021" license = "Apache-2" diff --git a/common/pemstore/Cargo.toml b/common/pemstore/Cargo.toml index a5542ff097..8603c9bf08 100644 --- a/common/pemstore/Cargo.toml +++ b/common/pemstore/Cargo.toml @@ -3,8 +3,12 @@ name = "nym-pemstore" description = "Store private-public keypairs in PEM format" version = "0.1.0" edition = { workspace = true } -license = { workspace = true } authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } [dependencies] -pem = "1.1.1" +pem = "0.8" From 22ee87d87e16e9fe8a2f256e3e2f85d10acfdfe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Fri, 17 Feb 2023 15:56:09 +0100 Subject: [PATCH 387/591] Cargo.toml: SPDX format for license --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 98e1834ee9..16a0892b8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -105,7 +105,7 @@ repository = "https://github.com/nymtech/nym" homepage = "https://nymtech.net" documentation = "https://nymtech.net" edition = "2021" -license = "Apache-2" +license = "Apache-2.0" [workspace.dependencies] async-trait = "0.1.63" From bbb3287029eea76b1082ea6eae64ccd78f168901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 20 Feb 2023 13:00:34 +0100 Subject: [PATCH 388/591] Add client functionality into nym-network-requester (#2972) * network-requester: replace websocket with mixnet client * network-requester: mini tidy * network-requester: add info line about own address * network-requester: update to nym-crypto rename --- Cargo.lock | 8 + .../real_traffic_stream.rs | 2 - clients/socks5/src/socks/server.rs | 4 +- common/client-connections/src/lib.rs | 6 - .../src/connection_controller.rs | 28 +-- .../network-requester/Cargo.toml | 19 +- .../network-requester/src/cli/init.rs | 157 ++++++++++++ .../network-requester/src/cli/mod.rs | 106 ++++++++ .../network-requester/src/cli/run.rs | 157 ++++++++++++ .../network-requester/src/config/mod.rs | 128 ++++++++++ .../network-requester/src/config/template.rs | 99 ++++++++ .../network-requester/src/core.rs | 231 ++++++------------ .../network-requester/src/error.rs | 24 +- .../network-requester/src/main.rs | 104 +------- .../network-requester/src/reply.rs | 21 +- .../network-requester/src/websocket.rs | 34 --- 16 files changed, 781 insertions(+), 347 deletions(-) create mode 100644 service-providers/network-requester/src/cli/init.rs create mode 100644 service-providers/network-requester/src/cli/mod.rs create mode 100644 service-providers/network-requester/src/cli/run.rs create mode 100644 service-providers/network-requester/src/config/mod.rs create mode 100644 service-providers/network-requester/src/config/template.rs delete mode 100644 service-providers/network-requester/src/websocket.rs diff --git a/Cargo.lock b/Cargo.lock index 0dcda65a7a..c5801327f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3724,13 +3724,18 @@ dependencies = [ "build-information", "clap 4.1.4", "client-connections", + "client-core", "completions", + "config", "dirs", "futures", "ipnetwork 0.20.0", + "lazy_static", "log", "logging", "network-defaults", + "nym-crypto", + "nym-sdk", "nymsphinx", "ordered-buffer", "pretty_env_logger", @@ -3743,10 +3748,13 @@ dependencies = [ "socks5-requests", "sqlx 0.6.2", "statistics-common", + "tap", "task", "thiserror", "tokio", "tokio-tungstenite 0.17.2", + "url", + "version-checker", "websocket-requests", ] diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs index d601e9c24a..769233f926 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs @@ -342,7 +342,6 @@ where if let Poll::Ready(Some(id)) = Pin::new(&mut self.client_connection_rx).poll_next(cx) { match id { ConnectionCommand::Close(id) => self.on_close_connection(id), - ConnectionCommand::ActiveConnections(_) => panic!(), } } @@ -421,7 +420,6 @@ where if let Poll::Ready(Some(id)) = Pin::new(&mut self.client_connection_rx).poll_next(cx) { match id { ConnectionCommand::Close(id) => self.on_close_connection(id), - ConnectionCommand::ActiveConnections(_) => panic!(), } } diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index 2d4f01f8c5..3f872a5877 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -10,7 +10,7 @@ use client_core::client::{ }; use log::*; use nymsphinx::addressing::clients::Recipient; -use proxy_helpers::connection_controller::{BroadcastActiveConnections, Controller}; +use proxy_helpers::connection_controller::Controller; use std::net::SocketAddr; use tap::TapFallible; use task::TaskClient; @@ -69,7 +69,7 @@ impl SphinxSocksServer { // controller for managing all active connections let (mut active_streams_controller, controller_sender) = Controller::new( client_connection_tx, - BroadcastActiveConnections::Off, + //BroadcastActiveConnections::Off, self.shutdown.clone(), ); tokio::spawn(async move { diff --git a/common/client-connections/src/lib.rs b/common/client-connections/src/lib.rs index b10963da79..af13111526 100644 --- a/common/client-connections/src/lib.rs +++ b/common/client-connections/src/lib.rs @@ -25,12 +25,6 @@ pub enum ConnectionCommand { // Announce that at a connection was closed. E.g the `OutQueueControl` uses this to discard // transmission lanes. Close(ConnectionId), - - // In the network requester for example, we usually want to broadcast active connections - // regularly, so we know what connections we need to request lane queue lengths for from the - // client. - // In the socks5-client, this is not needed since have direct access to the lane queue lengths. - ActiveConnections(Vec), } // The `OutQueueControl` publishes the backlog per lane, primarily so that upstream can slow down diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index 98eb12e9a9..2804d4e370 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -7,12 +7,8 @@ use futures::StreamExt; use log::*; use ordered_buffer::{OrderedMessage, OrderedMessageBuffer, ReadContiguousData}; use socks5_requests::{ConnectionId, NetworkData, SendRequest}; -use std::{ - collections::{HashMap, HashSet}, - time::Duration, -}; +use std::collections::{HashMap, HashSet}; use task::TaskClient; -use tokio::time; /// A generic message produced after reading from a socket/connection. It includes data that was /// actually read alongside boolean indicating whether the connection got closed so that @@ -116,10 +112,6 @@ pub struct Controller { // Broadcast closed connections client_connection_tx: ConnectionCommandSender, - // The controller can broadcast active connections. This is useful in the network-requester - // where its used to query the client for lane queue lengths - broadcast_connections: BroadcastActiveConnections, - // TODO: this can potentially be abused to ddos and kill provider. Not sure at this point // how to handle it more gracefully @@ -133,7 +125,6 @@ pub struct Controller { impl Controller { pub fn new( client_connection_tx: ConnectionCommandSender, - broadcast_connections: BroadcastActiveConnections, shutdown: TaskClient, ) -> (Self, ControllerSender) { let (sender, receiver) = mpsc::unbounded(); @@ -143,7 +134,6 @@ impl Controller { receiver, recently_closed: HashSet::new(), client_connection_tx, - broadcast_connections, pending_messages: HashMap::new(), shutdown, }, @@ -194,15 +184,6 @@ impl Controller { } } - fn broadcast_active_connections(&mut self) { - // What about the recently closed ones? Hopefully we can ignore them ... - let conn_ids = self.active_connections.keys().copied().collect(); - - self.client_connection_tx - .unbounded_send(ConnectionCommand::ActiveConnections(conn_ids)) - .unwrap(); - } - fn send_to_connection(&mut self, conn_id: ConnectionId, payload: Vec, is_closed: bool) { if let Some(active_connection) = self.active_connections.get_mut(&conn_id) { if !payload.is_empty() { @@ -259,8 +240,6 @@ impl Controller { } pub async fn run(&mut self) { - let mut interval = time::interval(Duration::from_millis(500)); - loop { tokio::select! { command = self.receiver.next() => match command { @@ -276,11 +255,6 @@ impl Controller { break; } }, - _ = interval.tick() => { - if self.broadcast_connections == BroadcastActiveConnections::On { - self.broadcast_active_connections(); - } - }, } } self.shutdown.recv_timeout().await; diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index a28693c46f..88d0b8ad41 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -4,18 +4,19 @@ [package] name = "nym-network-requester" version = "1.1.9" -authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] -edition = "2021" +authors.workspace = true +edition.workspace = true rust-version = "1.65" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] async-trait = { version = "0.1.51" } -clap = {version = "4.0", features = ["derive"]} +clap = {version = "4.0", features = ["cargo", "derive"]} dirs = "4.0" futures = "0.3.24" ipnetwork = "0.20.0" +lazy_static = { workspace = true } log = { workspace = true } pretty_env_logger = "0.4.0" publicsuffix = "1.5" # Can't update this until bip updates to support newer idna version @@ -23,22 +24,28 @@ rand = "0.7.3" reqwest = { version = "0.11.11", features = ["json"] } serde = { version = "1.0", features = ["derive"] } sqlx = { version = "0.6.1", features = ["runtime-tokio-rustls", "chrono"]} +tap = { workspace = true } thiserror = "1.0" tokio = { version = "1.24.1", features = [ "net", "rt-multi-thread", "macros" ] } tokio-tungstenite = "0.17.2" - +url = { workspace = true } # internal build-information = { path = "../../common/build-information" } client-connections = { path = "../../common/client-connections" } +client-core = { path = "../../clients/client-core" } completions = { path = "../../common/completions" } -network-defaults = { path = "../../common/network-defaults" } -nymsphinx = { path = "../../common/nymsphinx" } +config = { path = "../../common/config" } +nym-crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} +network-defaults = { path = "../../common/network-defaults" } +nym-sdk = { path = "../../sdk/rust/nym-sdk" } +nymsphinx = { path = "../../common/nymsphinx" } ordered-buffer = {path = "../../common/socks5/ordered-buffer"} proxy-helpers = { path = "../../common/socks5/proxy-helpers" } service-providers-common = { path = "../common" } socks5-requests = { path = "../../common/socks5/requests" } statistics-common = { path = "../../common/statistics" } task = { path = "../../common/task" } +version-checker = { path = "../../common/version-checker" } websocket-requests = { path = "../../clients/native/websocket-requests" } diff --git a/service-providers/network-requester/src/cli/init.rs b/service-providers/network-requester/src/cli/init.rs new file mode 100644 index 0000000000..ee21450bec --- /dev/null +++ b/service-providers/network-requester/src/cli/init.rs @@ -0,0 +1,157 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::{ + cli::{override_config, OverrideConfig}, + config::Config, + error::NetworkRequesterError, +}; +use clap::Args; +use config::NymConfig; +use nym_crypto::asymmetric::identity; +use nymsphinx::addressing::clients::Recipient; +use serde::Serialize; +use std::fmt::Display; +use tap::TapFallible; + +#[derive(Args, Clone)] +pub(crate) struct Init { + /// Id of the nym-mixnet-client we want to create config for. + #[clap(long)] + id: String, + + /// Id of the gateway we are going to connect to. + #[clap(long)] + gateway: Option, + + /// Force register gateway. WARNING: this will overwrite any existing keys for the given id, + /// potentially causing loss of access. + #[clap(long)] + force_register_gateway: bool, + + /// Comma separated list of rest endpoints of the nyxd validators + #[clap(long, alias = "nymd_validators", value_delimiter = ',')] + nyxd_urls: Option>, + + /// Comma separated list of rest endpoints of the API validators + #[clap(long, alias = "api_validators", value_delimiter = ',')] + // the alias here is included for backwards compatibility (1.1.4 and before) + nym_apis: Option>, + + /// Set this client to work in a enabled credentials mode that would attempt to use gateway + /// with bandwidth credential requirement. + #[clap(long)] + enabled_credentials_mode: Option, + + /// Save a summary of the initialization to a json file + #[clap(long)] + output_json: bool, +} + +impl From for OverrideConfig { + fn from(init_config: Init) -> Self { + OverrideConfig { + nym_apis: init_config.nym_apis, + fastmode: false, + no_cover: false, + + nyxd_urls: init_config.nyxd_urls, + enabled_credentials_mode: init_config.enabled_credentials_mode, + } + } +} + +#[derive(Debug, Serialize)] +pub struct InitResults { + #[serde(flatten)] + client_core: client_core::init::InitResults, +} + +impl InitResults { + fn new(config: &Config, address: &Recipient) -> Self { + Self { + client_core: client_core::init::InitResults::new(config.get_base(), address), + } + } +} + +impl Display for InitResults { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.client_core) + } +} + +pub(crate) async fn execute(args: &Init) -> Result<(), NetworkRequesterError> { + println!("Initialising client..."); + + let id = &args.id; + + let already_init = Config::default_config_file_path(id).exists(); + if already_init { + println!("Client \"{id}\" was already initialised before"); + } + + // Usually you only register with the gateway on the first init, however you can force + // re-registering if wanted. + let user_wants_force_register = args.force_register_gateway; + if user_wants_force_register { + println!("Instructed to force registering gateway. This might overwrite keys!"); + } + + // If the client was already initialized, don't generate new keys and don't re-register with + // the gateway (because this would create a new shared key). + // Unless the user really wants to. + let register_gateway = !already_init || user_wants_force_register; + + // Attempt to use a user-provided gateway, if possible + let user_chosen_gateway_id = args.gateway; + + // Load and potentially override config + let mut config = override_config(Config::new(id), OverrideConfig::from(args.clone())); + + // Setup gateway by either registering a new one, or creating a new config from the selected + // one but with keys kept, or reusing the gateway configuration. + let gateway = client_core::init::setup_gateway_from_config::( + register_gateway, + user_chosen_gateway_id, + config.get_base(), + ) + .await + .map_err(|source| { + eprintln!("Failed to setup gateway\nError: {source}"); + NetworkRequesterError::FailedToSetupGateway { source } + })?; + + config.get_base_mut().set_gateway_endpoint(gateway); + + config.save_to_file(None).tap_err(|_| { + log::error!("Failed to save the config file"); + })?; + + print_saved_config(&config); + + let address = client_core::init::get_client_address_from_stored_keys(config.get_base())?; + let init_results = InitResults::new(&config, &address); + println!("{init_results}"); + + // Output summary to a json file, if specified + if args.output_json { + client_core::init::output_to_json(&init_results, "client_init_results.json"); + } + + println!("\nThe address of this client is: {address}\n"); + Ok(()) +} + +fn print_saved_config(config: &Config) { + let config_save_location = config.get_config_file_save_location(); + println!("Saved configuration file to {config_save_location:?}"); + println!("Using gateway: {}", config.get_base().get_gateway_id()); + log::debug!("Gateway id: {}", config.get_base().get_gateway_id()); + log::debug!("Gateway owner: {}", config.get_base().get_gateway_owner()); + log::debug!( + "Gateway listener: {}", + config.get_base().get_gateway_listener() + ); + println!("Client configuration completed.\n"); +} diff --git a/service-providers/network-requester/src/cli/mod.rs b/service-providers/network-requester/src/cli/mod.rs new file mode 100644 index 0000000000..37471c4fea --- /dev/null +++ b/service-providers/network-requester/src/cli/mod.rs @@ -0,0 +1,106 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use build_information::BinaryBuildInformation; +use clap::{CommandFactory, Parser, Subcommand}; +use completions::{fig_generate, ArgShell}; + +use crate::{ + config::{BaseConfig, Config}, + error::NetworkRequesterError, +}; + +mod init; +mod run; + +lazy_static::lazy_static! { + pub static ref PRETTY_BUILD_INFORMATION: String = + BinaryBuildInformation::new(env!("CARGO_PKG_VERSION")).pretty_print(); +} + +// Helper for passing LONG_VERSION to clap +fn pretty_build_info_static() -> &'static str { + &PRETTY_BUILD_INFORMATION +} + +#[derive(Parser)] +#[clap(author = "Nymtech", version, about, long_version = pretty_build_info_static())] +pub(crate) struct Cli { + /// Path pointing to an env file that configures the client. + #[clap(short, long)] + pub(crate) config_env_file: Option, + + #[clap(subcommand)] + command: Commands, +} + +#[allow(clippy::large_enum_variant)] +#[derive(Subcommand)] +pub(crate) enum Commands { + /// Initialize a network-requester. Do this first! + Init(init::Init), + + /// Run the network requester with the provided configuration and optionally override + /// parameters. + Run(run::Run), + + /// Generate shell completions + Completions(ArgShell), + + /// Generate Fig specification + GenerateFigSpec, +} + +// Configuration that can be overridden. +pub(crate) struct OverrideConfig { + nym_apis: Option>, + fastmode: bool, + no_cover: bool, + nyxd_urls: Option>, + enabled_credentials_mode: Option, +} + +pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { + config + .with_base(BaseConfig::with_high_default_traffic_volume, args.fastmode) + .with_base(BaseConfig::with_disabled_cover_traffic, args.no_cover) + .with_optional_custom_env_ext( + BaseConfig::with_custom_nym_apis, + args.nym_apis, + network_defaults::var_names::NYM_API, + config::parse_urls, + ) + .with_optional_custom_env_ext( + BaseConfig::with_custom_nyxd, + args.nyxd_urls, + network_defaults::var_names::NYXD, + config::parse_urls, + ) + .with_optional_ext( + BaseConfig::with_disabled_credentials, + args.enabled_credentials_mode.map(|b| !b), + ) +} + +pub(crate) async fn execute(args: Cli) -> Result<(), NetworkRequesterError> { + let bin_name = "nym-network-requester"; + + match &args.command { + Commands::Init(m) => init::execute(m).await?, + Commands::Run(m) => run::execute(m).await?, + Commands::Completions(s) => s.generate(&mut Cli::command(), bin_name), + Commands::GenerateFigSpec => fig_generate(&mut Cli::command(), bin_name), + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use clap::CommandFactory; + + #[test] + fn verify_cli() { + Cli::command().debug_assert(); + } +} diff --git a/service-providers/network-requester/src/cli/run.rs b/service-providers/network-requester/src/cli/run.rs new file mode 100644 index 0000000000..98678fd910 --- /dev/null +++ b/service-providers/network-requester/src/cli/run.rs @@ -0,0 +1,157 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::{ + cli::{override_config, OverrideConfig}, + config::Config, + error::NetworkRequesterError, +}; +use clap::Args; +use config::NymConfig; +use nymsphinx::addressing::clients::Recipient; + +const ENABLE_STATISTICS: &str = "enable-statistics"; + +#[allow(clippy::struct_excessive_bools)] +#[derive(Args, Clone)] +pub(crate) struct Run { + /// Id of the nym-mixnet-client we want to run. + #[clap(long)] + id: String, + + /// Specifies whether this network requester should run in 'open-proxy' mode + #[clap(long)] + open_proxy: bool, + + /// Enable service anonymized statistics that get sent to a statistics aggregator server + #[clap(long)] + enable_statistics: bool, + + /// Mixnet client address where a statistics aggregator is running. The default value is a Nym + /// aggregator client + #[clap(long)] + statistics_recipient: Option, + + /// Set this client to work in a enabled credentials mode that would attempt to use gateway + /// with bandwidth credential requirement. + #[clap(long)] + enabled_credentials_mode: Option, + + /// Mostly debug-related option to increase default traffic rate so that you would not need to + /// modify config post init + #[clap(long, hide = true)] + fastmode: bool, + + /// Disable loop cover traffic and the Poisson rate limiter (for debugging only) + #[clap(long, hide = true)] + no_cover: bool, +} + +impl From for OverrideConfig { + fn from(run_config: Run) -> Self { + OverrideConfig { + nym_apis: None, + fastmode: run_config.fastmode, + no_cover: run_config.no_cover, + nyxd_urls: None, + enabled_credentials_mode: run_config.enabled_credentials_mode, + } + } +} + +// this only checks compatibility between config the binary. It does not take into consideration +// network version. It might do so in the future. +fn version_check(cfg: &Config) -> bool { + let binary_version = env!("CARGO_PKG_VERSION"); + let config_version = cfg.get_base().get_version(); + if binary_version == config_version { + true + } else { + log::warn!( + "The native-client binary has different version than what is specified \ + in config file! {} and {}", + binary_version, + config_version + ); + if version_checker::is_minor_version_compatible(binary_version, config_version) { + log::info!( + "but they are still semver compatible. \ + However, consider running the `upgrade` command" + ); + true + } else { + log::error!( + "and they are semver incompatible! - \ + please run the `upgrade` command before attempting `run` again" + ); + false + } + } +} + +pub(crate) async fn execute(args: &Run) -> Result<(), NetworkRequesterError> { + if args.open_proxy { + println!( + "\n\nYOU HAVE STARTED IN 'OPEN PROXY' MODE. ANYONE WITH YOUR CLIENT ADDRESS \ + CAN MAKE REQUESTS FROM YOUR MACHINE. PLEASE QUIT IF YOU DON'T UNDERSTAND WHAT \ + YOU'RE DOING.\n\n" + ); + } + + if args.enable_statistics { + println!( + "\n\nTHE NETWORK REQUESTER STATISTICS ARE ENABLED. IT WILL COLLECT AND SEND \ + ANONYMIZED STATISTICS TO A CENTRAL SERVER. PLEASE QUIT IF YOU DON'T WANT \ + THIS TO HAPPEN AND START WITHOUT THE {ENABLE_STATISTICS} FLAG .\n\n" + ); + } + + let id = &args.id; + + let mut config = match Config::load_from_file(id) { + Ok(cfg) => cfg, + Err(err) => { + log::error!( + "Failed to load config for {}. \ + Are you sure you have run `init` before? (Error was: {err})", + id + ); + return Err(NetworkRequesterError::FailedToLoadConfig(id.to_string())); + } + }; + + let override_config_fields = OverrideConfig::from(args.clone()); + config = override_config(config, override_config_fields); + + if config.get_base_mut().set_empty_fields_to_defaults() { + log::warn!( + "Some of the core config options were left unset. \ + The default values are going to get used instead." + ); + } + + if !version_check(&config) { + log::error!("Failed the local version check"); + return Err(NetworkRequesterError::FailedLocalVersionCheck); + } + + // TODO: consider incorporating statistics_recipient, open_proxuy and enable_statistics in + // `Config`. + + let stats_provider_addr = args + .statistics_recipient + .as_ref() + .map(Recipient::try_from_base58_string) + .transpose() + .unwrap_or(None); + + log::info!("Starting socks5 service provider"); + let server = crate::core::NRServiceProviderBuilder::new( + config, + args.open_proxy, + args.enable_statistics, + stats_provider_addr, + ) + .await; + server.run_service_provider().await +} diff --git a/service-providers/network-requester/src/config/mod.rs b/service-providers/network-requester/src/config/mod.rs new file mode 100644 index 0000000000..1dfa767ba9 --- /dev/null +++ b/service-providers/network-requester/src/config/mod.rs @@ -0,0 +1,128 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::config::template::config_template; +use client_core::config::ClientCoreConfigTrait; +use config::{NymConfig, OptionalSet}; +use serde::{Deserialize, Serialize}; +use std::fmt::Debug; +use std::path::PathBuf; +use std::str::FromStr; + +pub use client_core::config::Config as BaseConfig; +pub use client_core::config::MISSING_VALUE; +pub use client_core::config::{DebugConfig, GatewayEndpointConfig}; + +mod template; + +#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Config { + #[serde(flatten)] + base: BaseConfig, +} + +impl NymConfig for Config { + fn template() -> &'static str { + config_template() + } + + // TODO: merge base dir with `HostStore`. + fn default_root_directory() -> PathBuf { + dirs::home_dir() + .expect("Failed to evaluate $HOME value") + .join(".nym") + .join("service-providers") + .join("network-requester") + } + + fn try_default_root_directory() -> Option { + dirs::home_dir().map(|path| path.join(".nym").join("clients")) + } + + fn root_directory(&self) -> PathBuf { + self.base.get_nym_root_directory() + } + + fn config_directory(&self) -> PathBuf { + self.root_directory() + .join(self.base.get_id()) + .join("config") + } + + fn data_directory(&self) -> PathBuf { + self.root_directory().join(self.base.get_id()).join("data") + } +} + +impl ClientCoreConfigTrait for Config { + fn get_gateway_endpoint(&self) -> &client_core::config::GatewayEndpointConfig { + self.base.get_gateway_endpoint() + } +} + +impl Config { + pub fn new>(id: S) -> Self { + Config { + base: BaseConfig::new(id), + } + } + + // getters + pub fn get_config_file_save_location(&self) -> PathBuf { + self.config_directory().join(Self::config_file_name()) + } + + pub fn get_base(&self) -> &BaseConfig { + &self.base + } + + pub fn get_base_mut(&mut self) -> &mut BaseConfig { + &mut self.base + } + + // poor man's 'builder' method + pub fn with_base(mut self, f: F, val: T) -> Self + where + F: Fn(BaseConfig, T) -> BaseConfig, + { + self.base = f(self.base, val); + self + } + + // helper methods to use `OptionalSet` trait. Those are defined due to very... ehm. 'specific' structure of this config + // (plz, lets refactor it) + pub fn with_optional_ext(mut self, f: F, val: Option) -> Self + where + F: Fn(BaseConfig, T) -> BaseConfig, + { + self.base = self.base.with_optional(f, val); + self + } + + #[allow(dead_code)] + pub fn with_optional_env_ext(mut self, f: F, val: Option, env_var: &str) -> Self + where + F: Fn(BaseConfig, T) -> BaseConfig, + T: FromStr, + ::Err: Debug, + { + self.base = self.base.with_optional_env(f, val, env_var); + self + } + + pub fn with_optional_custom_env_ext( + mut self, + f: F, + val: Option, + env_var: &str, + parser: G, + ) -> Self + where + F: Fn(BaseConfig, T) -> BaseConfig, + G: Fn(&str) -> T, + { + self.base = self.base.with_optional_custom_env(f, val, env_var, parser); + self + } +} diff --git a/service-providers/network-requester/src/config/template.rs b/service-providers/network-requester/src/config/template.rs new file mode 100644 index 0000000000..395b8d7049 --- /dev/null +++ b/service-providers/network-requester/src/config/template.rs @@ -0,0 +1,99 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub(crate) fn config_template() -> &'static str { + // While using normal toml marshalling would have been way simpler with less overhead, + // I think it's useful to have comments attached to the saved config file to explain behaviour of + // particular fields. + // Note: any changes to the template must be reflected in the appropriate structs. + r#" +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +##### main base client config options ##### + +[client] +# Version of the client for which this configuration was created. +version = '{{ client.version }}' + +# Human readable ID of this particular client. +id = '{{ client.id }}' + +# Indicates whether this client is running in a disabled credentials mode, thus attempting +# to claim bandwidth without presenting bandwidth credentials. +disabled_credentials_mode = {{ client.disabled_credentials_mode }} + +# Addresses to nyxd validators via which the client can communicate with the chain. +nyxd_urls = [{{#each client.nyxd_urls }} + '{{this}}', +{{/each}}] + +# Addresses to APIs running on validator from which the client gets the view of the network. +nym_api_urls = [{{#each client.nym_api_urls }} + '{{this}}', +{{/each}}] + +# Path to file containing private identity key. +private_identity_key_file = '{{ client.private_identity_key_file }}' + +# Path to file containing public identity key. +public_identity_key_file = '{{ client.public_identity_key_file }}' + +# Path to file containing private encryption key. +private_encryption_key_file = '{{ client.private_encryption_key_file }}' + +# Path to file containing public encryption key. +public_encryption_key_file = '{{ client.public_encryption_key_file }}' + +# Path to the database containing bandwidth credentials +database_path = '{{ client.database_path }}' + +# Path to the persistent store for received reply surbs, unused encryption keys and used sender tags. +reply_surb_database_path = '{{ client.reply_surb_database_path }}' + +##### additional client config options ##### + +# A gateway specific, optional, base58 stringified shared key used for +# communication with particular gateway. +gateway_shared_key_file = '{{ client.gateway_shared_key_file }}' + +# Path to file containing key used for encrypting and decrypting the content of an +# acknowledgement so that nobody besides the client knows which packet it refers to. +ack_key_file = '{{ client.ack_key_file }}' + +##### advanced configuration options ##### + +# Absolute path to the home Nym Clients directory. +nym_root_directory = '{{ client.nym_root_directory }}' + +[client.gateway_endpoint] +# ID of the gateway from which the client should be fetching messages. +gateway_id = '{{ client.gateway_endpoint.gateway_id }}' + +# Address of the gateway owner to which the client should send messages. +gateway_owner = '{{ client.gateway_endpoint.gateway_owner }}' + +# Address of the gateway listener to which all client requests should be sent. +gateway_listener = '{{ client.gateway_endpoint.gateway_listener }}' + + +##### logging configuration options ##### + +[logging] + +# TODO + + +##### debug configuration options ##### +# The following options should not be modified unless you know EXACTLY what you are doing +# as if set incorrectly, they may impact your anonymity. + +[debug] + +average_packet_delay = '{{ debug.average_packet_delay }}' +average_ack_delay = '{{ debug.average_ack_delay }}' +loop_cover_traffic_average_delay = '{{ debug.loop_cover_traffic_average_delay }}' +message_sending_average_delay = '{{ debug.message_sending_average_delay }}' + +"# +} diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index b7b16ec7e3..5c4b7ca040 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -3,27 +3,19 @@ use crate::allowed_hosts; use crate::allowed_hosts::OutboundRequestFilter; +use crate::config::Config; use crate::error::NetworkRequesterError; use crate::reply::MixnetMessage; use crate::statistics::ServiceStatisticsCollector; -use crate::websocket; -use crate::websocket::TSWebsocketStream; use crate::{reply, socks5}; use async_trait::async_trait; use build_information::BinaryBuildInformation; -use client_connections::{ - ConnectionCommand, ConnectionCommandReceiver, LaneQueueLengths, TransmissionLane, -}; +use client_connections::LaneQueueLengths; use futures::channel::mpsc; -use futures::stream::{SplitSink, SplitStream}; -use futures::{SinkExt, StreamExt}; use log::warn; use nymsphinx::addressing::clients::Recipient; use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx::receiver::ReconstructedMessage; -use proxy_helpers::connection_controller::{ - BroadcastActiveConnections, Controller, ControllerCommand, ControllerSender, -}; +use proxy_helpers::connection_controller::{Controller, ControllerCommand, ControllerSender}; use proxy_helpers::proxy_runner::{MixProxyReader, MixProxySender}; use service_providers_common::interface::{ BinaryInformation, ProviderInterfaceVersion, Request, RequestVersion, @@ -37,8 +29,6 @@ use statistics_common::collector::StatisticsSender; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; use task::{TaskClient, TaskManager}; -use tokio_tungstenite::tungstenite::protocol::Message; -use websocket_requests::{requests::ClientRequest, responses::ServerResponse}; // Since it's an atomic, it's safe to be kept static and shared across threads static ACTIVE_PROXIES: AtomicUsize = AtomicUsize::new(0); @@ -53,7 +43,7 @@ pub(crate) fn new_legacy_request_version() -> RequestVersion { // TODO: 'Builder' is not the most appropriate name here, but I needed // ... something ... pub struct NRServiceProviderBuilder { - websocket_address: String, + config: Config, outbound_request_filter: OutboundRequestFilter, open_proxy: bool, enable_statistics: bool, @@ -63,11 +53,11 @@ pub struct NRServiceProviderBuilder { struct NRServiceProvider { outbound_request_filter: OutboundRequestFilter, open_proxy: bool, + mixnet_client: nym_sdk::mixnet::MixnetClient, - websocket_stream: SplitStream, controller_sender: ControllerSender, mix_input_sender: MixProxySender, - shared_lane_queue_lengths: LaneQueueLengths, + //shared_lane_queue_lengths: LaneQueueLengths, stats_collector: Option, shutdown: TaskManager, } @@ -157,7 +147,7 @@ impl ServiceProvider for NRServiceProvider { impl NRServiceProviderBuilder { pub async fn new( - websocket_address: String, + config: Config, open_proxy: bool, enable_statistics: bool, stats_provider_addr: Option, @@ -180,7 +170,7 @@ impl NRServiceProviderBuilder { let outbound_request_filter = OutboundRequestFilter::new(allowed_hosts, unknown_hosts); NRServiceProviderBuilder { - websocket_address, + config, outbound_request_filter, open_proxy, enable_statistics, @@ -190,10 +180,8 @@ impl NRServiceProviderBuilder { /// Start all subsystems pub async fn run_service_provider(self) -> Result<(), NetworkRequesterError> { - let websocket_stream = Self::connect_websocket(&self.websocket_address).await?; - - // split the websocket so that we could read and write from separate threads - let (websocket_writer, websocket_reader) = websocket_stream.split(); + // Connect to the mixnet + let mixnet_client = create_mixnet_client(self.config.get_base()).await?; // channels responsible for managing messages that are to be sent to the mix network. The receiver is // going to be used by `mixnet_response_listener` @@ -202,21 +190,9 @@ impl NRServiceProviderBuilder { // Used to notify tasks to shutdown. Not all tasks fully supports this (yet). let shutdown = task::TaskManager::default(); - // Channel for announcing client connection state by the controller. - // The `mixnet_response_listener` will use this to either report closed connection to the - // client or request lane queue lengths. - let (client_connection_tx, client_connection_rx) = mpsc::unbounded(); - - // Shared queue length data. Published by the `OutQueueController` in the client, and used - // primarily to throttle incoming connections - let shared_lane_queue_lengths = LaneQueueLengths::new(); - // Controller for managing all active connections. - // We provide it with a ShutdownListener since it requires it, even though for the network - // requester shutdown signalling is not yet fully implemented. let (mut active_connections_controller, controller_sender) = Controller::new( - client_connection_tx, - BroadcastActiveConnections::On, + mixnet_client.connection_command_sender(), shutdown.subscribe(), ); @@ -240,13 +216,15 @@ impl NRServiceProviderBuilder { }; let stats_collector_clone = stats_collector.clone(); + let mixnet_client_sender = mixnet_client.sender(); + let self_address = *mixnet_client.nym_address(); + // start the listener for mix messages tokio::spawn(async move { NRServiceProvider::mixnet_response_listener( - websocket_writer, + mixnet_client_sender, mix_input_receiver, stats_collector_clone, - client_connection_rx, ) .await; }); @@ -254,70 +232,54 @@ impl NRServiceProviderBuilder { let service_provider = NRServiceProvider { outbound_request_filter: self.outbound_request_filter, open_proxy: self.open_proxy, - websocket_stream: websocket_reader, + mixnet_client, controller_sender, mix_input_sender, - shared_lane_queue_lengths, + //shared_lane_queue_lengths: mixnet_client.shared_lane_queue_lengths(), stats_collector, shutdown, }; + log::info!("The address of this client is: {}", self_address); log::info!("All systems go. Press CTRL-C to stop the server."); service_provider.run().await } - - // Make the websocket connection so we can receive incoming Mixnet messages. - async fn connect_websocket(uri: &str) -> Result { - match websocket::Connection::new(uri).connect().await { - Ok(ws_stream) => { - log::info!("* connected to local websocket server at {}", uri); - Ok(ws_stream) - } - Err(err) => { - log::error!( - "Error: websocket connection attempt failed, is the Nym client running?" - ); - Err(err.into()) - } - } - } } impl NRServiceProvider { async fn run(mut self) -> Result<(), NetworkRequesterError> { // TODO: incorporate graceful shutdowns - loop { - let Some(reconstructed) = self.read_websocket_message().await else { - log::error!("The websocket stream has finished!"); - return Err(NetworkRequesterError::ConnectionClosed); - }; + while let Some(reconstructed_messages) = self.mixnet_client.wait_for_messages().await { + for reconstructed in reconstructed_messages { + let sender = reconstructed.sender_tag; + let request = match Socks5ProviderRequest::try_from_bytes(&reconstructed.message) { + Ok(req) => req, + Err(err) => { + // TODO: or should it even be further lowered to debug/trace? + log::warn!("Failed to deserialize received message: {err}"); + continue; + } + }; - let sender = reconstructed.sender_tag; - let request = match Socks5ProviderRequest::try_from_bytes(&reconstructed.message) { - Ok(req) => req, - Err(err) => { - // TODO: or should it even be further lowered to debug/trace? - log::warn!("Failed to deserialize received message: {err}"); - continue; + if let Err(err) = self.on_request(sender, request).await { + // TODO: again, should it be a warning? + // we should also probably log some information regarding the origin of the request + // so that it would be easier to debug it + log::warn!("failed to resolve the received request: {err}"); } - }; - - if let Err(err) = self.on_request(sender, request).await { - // TODO: again, should it be a warning? - // we should also probably log some information regarding the origin of the request - // so that it would be easier to debug it - log::warn!("failed to resolve the received request: {err}"); } } + + log::error!("Network requester exited unexpectedly"); + Ok(()) } /// Listens for any messages from `mix_reader` that should be written back to the mix network /// via the `websocket_writer`. async fn mixnet_response_listener( - mut websocket_writer: SplitSink, + mut mixnet_client_sender: nym_sdk::mixnet::MixnetClientSender, mut mix_input_reader: MixProxyReader, stats_collector: Option, - mut client_connection_rx: ConnectionCommandReceiver, ) { loop { tokio::select! { @@ -338,97 +300,17 @@ impl NRServiceProvider { } } - // make 'request' to native-websocket client - let response_message = msg.into_client_request(); - let message = Message::Binary(response_message.serialize()); - websocket_writer.send(message).await.unwrap(); + let response_message = msg.into_input_message(); + mixnet_client_sender.send_input_message(response_message).await; } else { log::error!("Exiting: channel closed!"); break; } }, - Some(command) = client_connection_rx.next() => { - match command { - ConnectionCommand::Close(id) => { - let msg = ClientRequest::ClosedConnection(id); - let ws_msg = Message::Binary(msg.serialize()); - websocket_writer.send(ws_msg).await.unwrap(); - } - ConnectionCommand::ActiveConnections(ids) => { - // We can optimize this by sending a single request, but this is - // usually in the low single digits, max a few tens, so we leave that - // for a rainy day. - // Also that means fiddling with the currently manual - // serialize/deserialize we do with ClientRequests ... - for id in ids { - log::trace!("Requesting lane queue length for: {}", id); - let msg = ClientRequest::GetLaneQueueLength(id); - let ws_msg = Message::Binary(msg.serialize()); - websocket_writer.send(ws_msg).await.unwrap(); - } - } - } - }, } } } - fn handle_lane_queue_length_response( - lane_queue_lengths: &LaneQueueLengths, - lane: u64, - queue_length: usize, - ) { - log::trace!("Received LaneQueueLength lane: {lane}, queue_length: {queue_length}"); - if let Ok(mut lane_queue_lengths) = lane_queue_lengths.lock() { - let lane = TransmissionLane::ConnectionId(lane); - lane_queue_lengths.map.insert(lane, queue_length); - } else { - log::warn!("Unable to lock lane queue lengths, skipping updating received lane length") - } - } - - async fn read_websocket_message(&mut self) -> Option { - while let Some(msg) = self.websocket_stream.next().await { - let data = match msg { - Ok(msg) => msg.into_data(), - Err(err) => { - log::error!("Failed to read from the websocket: {err}"); - continue; - } - }; - - // try to recover the actual message from the mix network... - let deserialized_message = match ServerResponse::deserialize(&data) { - Ok(deserialized) => deserialized, - Err(err) => { - log::error!( - "Failed to deserialize received websocket message! - {}", - err - ); - continue; - } - }; - - let received = match deserialized_message { - ServerResponse::Received(received) => received, - ServerResponse::LaneQueueLength { lane, queue_length } => { - Self::handle_lane_queue_length_response( - &self.shared_lane_queue_lengths, - lane, - queue_length, - ); - continue; - } - ServerResponse::Error(err) => { - panic!("received error from native client! - {err}") - } - _ => unimplemented!("probably should never be reached?"), - }; - return Some(received); - } - None - } - #[allow(clippy::too_many_arguments)] async fn start_proxy( remote_version: RequestVersion, @@ -545,7 +427,7 @@ impl NRServiceProvider { let controller_sender_clone = self.controller_sender.clone(); let mix_input_sender_clone = self.mix_input_sender.clone(); - let lane_queue_lengths_clone = self.shared_lane_queue_lengths.clone(); + let lane_queue_lengths_clone = self.mixnet_client.shared_lane_queue_lengths(); let shutdown = self.shutdown.subscribe(); // and start the proxy for this connection @@ -568,3 +450,34 @@ impl NRServiceProvider { self.controller_sender.unbounded_send(req.into()).unwrap() } } + +// Helper function to create the mixnet client. +// This is NOT in the SDK since we don't want to expose any of the client-core config types. +// We could however consider moving it to a crate in common in the future. +async fn create_mixnet_client( + config: &client_core::config::Config, +) -> Result { + let nym_api_endpoints = config.get_nym_api_endpoints(); + let debug_config = config.get_debug_config().clone(); + + let mixnet_config = nym_sdk::mixnet::Config { + user_chosen_gateway: None, + nym_api_endpoints, + debug_config, + }; + + let storage_paths = nym_sdk::mixnet::StoragePaths::from(config); + + let mixnet_client = nym_sdk::mixnet::MixnetClientBuilder::new() + .config(mixnet_config) + .enable_storage(storage_paths) + .gateway_config(config.get_gateway_endpoint_config().clone()) + .build::() + .await + .map_err(|err| NetworkRequesterError::FailedToSetupMixnetClient { source: err })?; + + mixnet_client + .connect_to_mixnet() + .await + .map_err(|err| NetworkRequesterError::FailedToConnectToMixnet { source: err }) +} diff --git a/service-providers/network-requester/src/error.rs b/service-providers/network-requester/src/error.rs index a651d34659..251c19d4c9 100644 --- a/service-providers/network-requester/src/error.rs +++ b/service-providers/network-requester/src/error.rs @@ -1,4 +1,4 @@ -use crate::websocket::WebsocketConnectionError; +use client_core::error::ClientCoreError; use socks5_requests::Socks5RequestError; #[derive(thiserror::Error, Debug)] @@ -6,15 +6,27 @@ pub enum NetworkRequesterError { #[error("I/O error: {0}")] IoError(#[from] std::io::Error), - #[error("Websocket error")] - WebsocketConnectionError(#[from] WebsocketConnectionError), - - #[error("Websocket connection closed")] - ConnectionClosed, + #[error("client-core error: {0}")] + ClientCoreError(#[from] ClientCoreError), #[error("encountered an error while trying to handle a provider request: {source}")] ProviderRequestError { #[from] source: Socks5RequestError, }, + + #[error("failed to setup gateway: {source}")] + FailedToSetupGateway { source: ClientCoreError }, + + #[error("failed to load configuration file: {0}")] + FailedToLoadConfig(String), + + #[error("failed local version check, client and config mismatch")] + FailedLocalVersionCheck, + + #[error("failed to setup mixnet client: {source}")] + FailedToSetupMixnetClient { source: nym_sdk::Error }, + + #[error("failed to connect to mixnet: {source}")] + FailedToConnectToMixnet { source: nym_sdk::Error }, } diff --git a/service-providers/network-requester/src/main.rs b/service-providers/network-requester/src/main.rs index ad6f1fdc59..d1987048c1 100644 --- a/service-providers/network-requester/src/main.rs +++ b/service-providers/network-requester/src/main.rs @@ -1,114 +1,28 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use clap::CommandFactory; -use clap::Subcommand; -use clap::{Args, Parser}; -use completions::{fig_generate, ArgShell}; +use clap::{crate_name, crate_version, Parser}; use logging::setup_logging; +use network_defaults::setup_env; use error::NetworkRequesterError; -use nymsphinx::addressing::clients::Recipient; mod allowed_hosts; +mod cli; +mod config; mod core; mod error; mod reply; mod socks5; mod statistics; -mod websocket; - -const ENABLE_STATISTICS: &str = "enable-statistics"; - -#[derive(Args)] -struct Run { - /// Specifies whether this network requester should run in 'open-proxy' mode - #[clap(long)] - open_proxy: bool, - - /// Websocket port to bind to. - #[clap(long)] - websocket_port: Option, - - /// Enable service anonymized statistics that get sent to a statistics aggregator server - #[clap(long)] - enable_statistics: bool, - - /// Mixnet client address where a statistics aggregator is running. The default value is a Nym aggregator client - #[clap(long)] - statistics_recipient: Option, -} - -impl Run { - async fn execute(&self) -> Result<(), NetworkRequesterError> { - if self.open_proxy { - println!("\n\nYOU HAVE STARTED IN 'OPEN PROXY' MODE. ANYONE WITH YOUR CLIENT ADDRESS CAN MAKE REQUESTS FROM YOUR MACHINE. PLEASE QUIT IF YOU DON'T UNDERSTAND WHAT YOU'RE DOING.\n\n"); - } - - if self.enable_statistics { - println!("\n\nTHE NETWORK REQUESTER STATISTICS ARE ENABLED. IT WILL COLLECT AND SEND ANONYMIZED STATISTICS TO A CENTRAL SERVER. PLEASE QUIT IF YOU DON'T WANT THIS TO HAPPEN AND START WITHOUT THE {ENABLE_STATISTICS} FLAG .\n\n"); - } - - let stats_provider_addr = self - .statistics_recipient - .as_ref() - .map(Recipient::try_from_base58_string) - .transpose() - .unwrap_or(None); - - let websocket_address = format!( - "ws://localhost:{}", - self.websocket_port - .as_ref() - .unwrap_or(&network_defaults::DEFAULT_WEBSOCKET_LISTENING_PORT.to_string()) - ); - - log::info!("Starting socks5 service provider"); - let server = core::NRServiceProviderBuilder::new( - websocket_address, - self.open_proxy, - self.enable_statistics, - stats_provider_addr, - ) - .await; - server.run_service_provider().await - } -} - -#[derive(Subcommand)] -pub(crate) enum Commands { - /// Run network requester - Run(Run), - - /// Generate shell completions - Completions(ArgShell), - - /// Generate Fig specification - GenerateFigSpec, -} - -#[derive(Parser)] -#[clap(author = "Nymtech", version, about)] -struct Cli { - #[clap(subcommand)] - command: Commands, -} - -pub(crate) async fn execute(args: Cli) -> Result<(), NetworkRequesterError> { - let bin_name = "nym-network-requester"; - - match &args.command { - Commands::Run(r) => r.execute().await?, - Commands::Completions(s) => s.generate(&mut crate::Cli::command(), bin_name), - Commands::GenerateFigSpec => fig_generate(&mut crate::Cli::command(), bin_name), - } - Ok(()) -} #[tokio::main] async fn main() -> Result<(), NetworkRequesterError> { setup_logging(); - let args = Cli::parse(); + println!("{}", logging::banner(crate_name!(), crate_version!())); - execute(args).await + let args = cli::Cli::parse(); + setup_env(args.config_env_file.as_ref()); + + cli::execute(args).await } diff --git a/service-providers/network-requester/src/reply.rs b/service-providers/network-requester/src/reply.rs index 2616f36a7f..a135c9b2e8 100644 --- a/service-providers/network-requester/src/reply.rs +++ b/service-providers/network-requester/src/reply.rs @@ -1,6 +1,8 @@ // Copyright 2022-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use client_connections::TransmissionLane; +use nym_sdk::mixnet::InputMessage; use nymsphinx::addressing::clients::Recipient; use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; use service_providers_common::interface::{ @@ -11,7 +13,6 @@ use socks5_requests::{ Socks5RequestContent, Socks5Response, Socks5ResponseContent, }; use std::fmt::{Debug, Formatter}; -use websocket_requests::requests::ClientRequest; /// Generic data this service provider will send back to the mixnet via its connected native client. /// It includes serialized socks5 proxy responses to its connected clients @@ -146,7 +147,7 @@ impl MixnetMessage { self.data.len() } - pub(crate) fn into_client_request(self) -> ClientRequest { + pub(crate) fn into_input_message(self) -> InputMessage { self.address.send_back_to(self.data, self.connection_id) } } @@ -173,17 +174,17 @@ impl MixnetAddress { None } - pub(super) fn send_back_to(self, message: Vec, connection_id: u64) -> ClientRequest { + pub(super) fn send_back_to(self, message: Vec, connection_id: u64) -> InputMessage { match self { - MixnetAddress::Known(recipient) => ClientRequest::Send { + MixnetAddress::Known(recipient) => InputMessage::Regular { recipient: *recipient, - message, - connection_id: Some(connection_id), + data: message, + lane: TransmissionLane::ConnectionId(connection_id), }, - MixnetAddress::Anonymous(sender_tag) => ClientRequest::Reply { - message, - sender_tag, - connection_id: Some(connection_id), + MixnetAddress::Anonymous(sender_tag) => InputMessage::Reply { + recipient_tag: sender_tag, + data: message, + lane: TransmissionLane::ConnectionId(connection_id), }, } } diff --git a/service-providers/network-requester/src/websocket.rs b/service-providers/network-requester/src/websocket.rs deleted file mode 100644 index 421f6553a0..0000000000 --- a/service-providers/network-requester/src/websocket.rs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2020 - Nym Technologies SA -// SPDX-License-Identifier: Apache-2.0 - -use tokio::net::TcpStream; -use tokio_tungstenite::WebSocketStream; -use tokio_tungstenite::{connect_async, MaybeTlsStream}; - -#[allow(clippy::upper_case_acronyms)] -pub(crate) type TSWebsocketStream = WebSocketStream>; - -pub struct Connection { - uri: String, -} - -impl Connection { - pub fn new(uri: &str) -> Connection { - Connection { - uri: String::from(uri), - } - } - - pub async fn connect(&self) -> Result { - match connect_async(&self.uri).await { - Ok((ws_stream, _)) => Ok(ws_stream), - Err(e) => Err(WebsocketConnectionError::ConnectionNotEstablished(e)), - } - } -} - -#[derive(Debug, thiserror::Error)] -pub enum WebsocketConnectionError { - #[error("Connection not established")] - ConnectionNotEstablished(tokio_tungstenite::tungstenite::Error), -} From 49334c054058dec7403ac00593f45e5c84f33d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Walther?= Date: Mon, 20 Feb 2023 15:00:22 +0100 Subject: [PATCH 389/591] Github Actions: move some notifications to specific rooms --- .github/workflows/audit.yml | 2 +- .github/workflows/nightly_build.yml | 2 +- .github/workflows/nightly_build_release.yml | 2 +- .github/workflows/nightly_build_release2.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 212f1a0501..9e42b31964 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -48,7 +48,7 @@ jobs: NYM_PROJECT_NAME: "Daily security report" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}" - MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}" + MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_AUDIT }}" MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}" MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}" MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}" diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index af49b2c04c..bceae87b4f 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -167,7 +167,7 @@ jobs: GIT_BRANCH: "${GITHUB_REF##*/}" IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}" MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}" - MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}" + MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_NIGHTLY }}" MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}" MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}" MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}" diff --git a/.github/workflows/nightly_build_release.yml b/.github/workflows/nightly_build_release.yml index 0eece7c5f5..ea72a07e4e 100644 --- a/.github/workflows/nightly_build_release.yml +++ b/.github/workflows/nightly_build_release.yml @@ -182,7 +182,7 @@ jobs: GIT_BRANCH_NAME: "${{needs.get_release.outputs.output1}}" IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}" MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}" - MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}" + MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_NIGHTLY }}" MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}" MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}" MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}" diff --git a/.github/workflows/nightly_build_release2.yml b/.github/workflows/nightly_build_release2.yml index 402729cac1..ee85a1c978 100644 --- a/.github/workflows/nightly_build_release2.yml +++ b/.github/workflows/nightly_build_release2.yml @@ -182,7 +182,7 @@ jobs: GIT_BRANCH_NAME: "${{needs.get_release.outputs.output1}}" IS_SUCCESS: "${{ env.WORKFLOW_CONCLUSION == 'success' }}" MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}" - MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}" + MATRIX_ROOM: "${{ secrets.MATRIX_ROOM_NIGHTLY }}" MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}" MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}" MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}" From 9a43595e0431569f9f1791c816a3e916e6f8729d Mon Sep 17 00:00:00 2001 From: pierre Date: Mon, 20 Feb 2023 15:10:59 +0100 Subject: [PATCH 390/591] refactor(nc): fix lint errors --- nym-connect/src/pages/menu/settings/index.tsx | 4 ++-- nym-connect/src/routes/index.tsx | 2 +- nym-connect/src/utils/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nym-connect/src/pages/menu/settings/index.tsx b/nym-connect/src/pages/menu/settings/index.tsx index b5c3988136..edd1050272 100644 --- a/nym-connect/src/pages/menu/settings/index.tsx +++ b/nym-connect/src/pages/menu/settings/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Link as RouterLink } from 'react-router-dom'; import { Link, List, ListItem, ListItemButton, ListItemText, Stack } from '@mui/material'; import { AppVersion } from 'src/components/AppVersion'; -import { toggle_log_viewer } from 'src/utils'; +import { toggleLogViewer } from 'src/utils'; const menuSchema = [{ title: 'Select your gateway', path: 'gateway' }]; @@ -19,7 +19,7 @@ export const SettingsMenu = () => ( ))} - + Logs diff --git a/nym-connect/src/routes/index.tsx b/nym-connect/src/routes/index.tsx index 2c7e94236a..aaf09fac16 100644 --- a/nym-connect/src/routes/index.tsx +++ b/nym-connect/src/routes/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import { Routes, Route } from 'react-router-dom'; import { ConnectionPage } from 'src/pages/connection'; import { Menu } from 'src/pages/menu'; diff --git a/nym-connect/src/utils/index.ts b/nym-connect/src/utils/index.ts index 1665f1207f..fefef166d7 100644 --- a/nym-connect/src/utils/index.ts +++ b/nym-connect/src/utils/index.ts @@ -19,6 +19,6 @@ export const useTauriEvents = (event: EventName, handler: EventCallback) = }, []); }; -export const toggle_log_viewer = async () => { +export const toggleLogViewer = async () => { await invoke('help_log_toggle_window'); }; From ec009185246dba93c4c60624676a20c6711be5f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 20 Feb 2023 15:44:51 +0100 Subject: [PATCH 391/591] Update crate metadata for nym-crypto (#3059) * dkg: move crate and un-nest * all: update paths to common/dkg * crypto: Cargo.toml metadata --- Cargo.lock | 6 ++++-- Cargo.toml | 2 +- .../contracts-common/Cargo.toml | 2 +- common/crypto/Cargo.toml | 11 ++++++++--- common/{crypto => }/dkg/Cargo.toml | 2 +- common/{crypto => }/dkg/benches/benchmarks.rs | 0 common/{crypto => }/dkg/src/bte/encryption.rs | 0 common/{crypto => }/dkg/src/bte/keys.rs | 0 common/{crypto => }/dkg/src/bte/mod.rs | 0 common/{crypto => }/dkg/src/bte/proof_chunking.rs | 0 common/{crypto => }/dkg/src/bte/proof_discrete_log.rs | 0 common/{crypto => }/dkg/src/bte/proof_sharing.rs | 0 common/{crypto => }/dkg/src/dealing.rs | 0 common/{crypto => }/dkg/src/error.rs | 0 common/{crypto => }/dkg/src/interpolation/mod.rs | 0 .../{crypto => }/dkg/src/interpolation/polynomial.rs | 0 common/{crypto => }/dkg/src/lib.rs | 0 common/{crypto => }/dkg/src/share.rs | 0 common/{crypto => }/dkg/src/todos.md | 0 common/{crypto => }/dkg/src/utils.rs | 0 common/{crypto => }/dkg/tests/integration.rs | 0 common/nymcoconut/Cargo.toml | 2 +- nym-api/Cargo.toml | 2 +- 23 files changed, 17 insertions(+), 10 deletions(-) rename common/{crypto => }/dkg/Cargo.toml (96%) rename common/{crypto => }/dkg/benches/benchmarks.rs (100%) rename common/{crypto => }/dkg/src/bte/encryption.rs (100%) rename common/{crypto => }/dkg/src/bte/keys.rs (100%) rename common/{crypto => }/dkg/src/bte/mod.rs (100%) rename common/{crypto => }/dkg/src/bte/proof_chunking.rs (100%) rename common/{crypto => }/dkg/src/bte/proof_discrete_log.rs (100%) rename common/{crypto => }/dkg/src/bte/proof_sharing.rs (100%) rename common/{crypto => }/dkg/src/dealing.rs (100%) rename common/{crypto => }/dkg/src/error.rs (100%) rename common/{crypto => }/dkg/src/interpolation/mod.rs (100%) rename common/{crypto => }/dkg/src/interpolation/polynomial.rs (100%) rename common/{crypto => }/dkg/src/lib.rs (100%) rename common/{crypto => }/dkg/src/share.rs (100%) rename common/{crypto => }/dkg/src/todos.md (100%) rename common/{crypto => }/dkg/src/utils.rs (100%) rename common/{crypto => }/dkg/tests/integration.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index a79f8babdd..c5801327f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4323,11 +4323,13 @@ checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" [[package]] name = "pem" -version = "1.1.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb" dependencies = [ "base64 0.13.1", + "once_cell", + "regex", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 16a0892b8e..d126c7200e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,7 +42,7 @@ members = [ "common/credential-storage", "common/credentials", "common/crypto", - "common/crypto/dkg", + "common/dkg", "common/execute", "common/inclusion-probability", "common/ledger", diff --git a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml index 770980330a..946f0cce90 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml +++ b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" [dependencies] bs58 = "0.4.0" cosmwasm-std = "1.0.0" -dkg = { path = "../../../common/crypto/dkg", optional = true } +dkg = { path = "../../../common/dkg", optional = true } schemars = "0.8" serde = { version = "1.0", features = ["derive"] } thiserror = "1" diff --git a/common/crypto/Cargo.toml b/common/crypto/Cargo.toml index 3ae7f0c2ac..0821a3bdd4 100644 --- a/common/crypto/Cargo.toml +++ b/common/crypto/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-crypto" version = "0.1.0" -authors = ["Jedrzej Stuczynski Date: Mon, 20 Feb 2023 16:28:08 +0100 Subject: [PATCH 392/591] Rename to crate name to nym-sphinx (#3060) * nymsphinx: rename to nym- prefix in Cargo.toml files * regex use nymsphinx to use nym_sphinx * all: updated explict crate name in a few places --- Cargo.lock | 304 +++++++++--------- clients/client-core/Cargo.toml | 2 +- .../client-core/src/client/base_client/mod.rs | 8 +- .../src/client/cover_traffic_stream.rs | 10 +- .../src/client/inbound_messages.rs | 4 +- clients/client-core/src/client/key_manager.rs | 2 +- clients/client-core/src/client/mix_traffic.rs | 2 +- .../acknowledgement_listener.rs | 2 +- .../action_controller.rs | 4 +- .../input_message_listener.rs | 4 +- .../acknowledgement_control/mod.rs | 6 +- .../retransmission_request_listener.rs | 6 +- .../sent_notification_listener.rs | 2 +- .../real_messages_control/message_handler.rs | 18 +- .../src/client/real_messages_control/mod.rs | 6 +- .../real_traffic_stream.rs | 16 +- .../client-core/src/client/received_buffer.rs | 12 +- .../client/replies/reply_controller/mod.rs | 8 +- .../replies/reply_controller/requests.rs | 6 +- .../reply_storage/backend/fs_backend/mod.rs | 2 +- .../backend/fs_backend/models.rs | 10 +- .../replies/reply_storage/key_storage.rs | 4 +- .../replies/reply_storage/surb_storage.rs | 4 +- .../replies/reply_storage/tag_storage.rs | 4 +- .../src/client/topology_control.rs | 4 +- .../src/client/transmission_buffer.rs | 2 +- clients/client-core/src/config/mod.rs | 2 +- clients/client-core/src/init/mod.rs | 2 +- clients/native/Cargo.toml | 2 +- .../native/examples/websocket_binarysend.rs | 2 +- clients/native/src/client/mod.rs | 6 +- clients/native/src/commands/init.rs | 2 +- clients/native/src/websocket/handler.rs | 6 +- clients/native/websocket-requests/Cargo.toml | 2 +- .../native/websocket-requests/src/requests.rs | 4 +- .../websocket-requests/src/responses.rs | 6 +- clients/native/websocket-requests/src/text.rs | 4 +- clients/socks5/Cargo.toml | 2 +- clients/socks5/src/client/config/mod.rs | 2 +- clients/socks5/src/client/mod.rs | 2 +- clients/socks5/src/commands/init.rs | 2 +- clients/socks5/src/commands/run.rs | 2 +- clients/socks5/src/socks/client.rs | 2 +- clients/socks5/src/socks/mixnet_responses.rs | 2 +- clients/socks5/src/socks/server.rs | 2 +- clients/webassembly/Cargo.toml | 2 +- clients/webassembly/src/client/mod.rs | 4 +- clients/webassembly/src/validation.rs | 2 +- common/client-libs/gateway-client/Cargo.toml | 2 +- .../client-libs/gateway-client/src/client.rs | 2 +- .../gateway-client/src/packet_router.rs | 4 +- common/client-libs/mixnet-client/Cargo.toml | 4 +- .../client-libs/mixnet-client/src/client.rs | 8 +- .../mixnet-client/src/forwarder.rs | 2 +- common/crypto/Cargo.toml | 2 +- .../crypto/src/asymmetric/encryption/mod.rs | 34 +- common/crypto/src/asymmetric/identity/mod.rs | 2 +- common/mixnode-common/Cargo.toml | 12 +- .../src/packet_processor/error.rs | 6 +- .../src/packet_processor/processor.rs | 14 +- common/nymsphinx/Cargo.toml | 20 +- common/nymsphinx/acknowledgements/Cargo.toml | 8 +- .../acknowledgements/src/identifier.rs | 2 +- common/nymsphinx/acknowledgements/src/key.rs | 2 +- .../acknowledgements/src/surb_ack.rs | 14 +- common/nymsphinx/addressing/Cargo.toml | 4 +- common/nymsphinx/addressing/src/clients.rs | 2 +- common/nymsphinx/addressing/src/nodes.rs | 2 +- common/nymsphinx/anonymous-replies/Cargo.toml | 8 +- .../anonymous-replies/src/encryption_key.rs | 2 +- .../anonymous-replies/src/reply_surb.rs | 12 +- .../anonymous-replies/src/requests.rs | 2 +- common/nymsphinx/chunking/Cargo.toml | 8 +- common/nymsphinx/chunking/src/fragment.rs | 4 +- common/nymsphinx/chunking/src/lib.rs | 4 +- common/nymsphinx/chunking/src/set.rs | 2 +- common/nymsphinx/cover/Cargo.toml | 14 +- common/nymsphinx/cover/src/lib.rs | 20 +- common/nymsphinx/forwarding/Cargo.toml | 8 +- common/nymsphinx/forwarding/src/packet.rs | 6 +- common/nymsphinx/framing/Cargo.toml | 6 +- common/nymsphinx/framing/src/codec.rs | 16 +- common/nymsphinx/framing/src/packet.rs | 8 +- common/nymsphinx/params/Cargo.toml | 4 +- common/nymsphinx/params/src/packet_sizes.rs | 4 +- common/nymsphinx/src/lib.rs | 18 +- common/nymsphinx/src/message.rs | 10 +- common/nymsphinx/src/preparer/mod.rs | 22 +- common/nymsphinx/src/preparer/payload.rs | 8 +- common/nymsphinx/src/receiver.rs | 12 +- common/nymsphinx/types/Cargo.toml | 2 +- common/socks5/requests/Cargo.toml | 2 +- common/socks5/requests/src/request.rs | 2 +- common/topology/Cargo.toml | 4 +- common/topology/src/gateway.rs | 4 +- common/topology/src/lib.rs | 4 +- common/topology/src/mix.rs | 4 +- gateway/Cargo.toml | 2 +- gateway/gateway-requests/Cargo.toml | 2 +- .../src/authentication/encrypted_address.rs | 4 +- gateway/gateway-requests/src/iv.rs | 2 +- gateway/gateway-requests/src/lib.rs | 2 +- .../src/registration/handshake/shared_key.rs | 2 +- .../src/registration/handshake/state.rs | 2 +- gateway/gateway-requests/src/types.rs | 10 +- .../node/client_handling/active_clients.rs | 2 +- .../connection_handler/authenticated.rs | 2 +- .../websocket/connection_handler/fresh.rs | 2 +- .../websocket/connection_handler/mod.rs | 2 +- .../receiver/connection_handler.rs | 8 +- .../receiver/packet_processing.rs | 2 +- gateway/src/node/storage/mod.rs | 2 +- mixnode/Cargo.toml | 6 +- .../node/listener/connection_handler/mod.rs | 8 +- .../connection_handler/packet_processing.rs | 2 +- mixnode/src/node/packet_delayforwarder.rs | 12 +- nym-api/Cargo.toml | 2 +- nym-api/src/network_monitor/chunker.rs | 6 +- .../src/network_monitor/monitor/preparer.rs | 4 +- .../src/network_monitor/monitor/processor.rs | 2 +- nym-api/src/network_monitor/monitor/sender.rs | 2 +- sdk/rust/nym-sdk/Cargo.toml | 2 +- sdk/rust/nym-sdk/src/mixnet.rs | 2 +- sdk/rust/nym-sdk/src/mixnet/client.rs | 2 +- sdk/rust/nym-sdk/src/mixnet/keys.rs | 2 +- service-providers/common/Cargo.toml | 2 +- service-providers/common/src/lib.rs | 2 +- .../network-requester/Cargo.toml | 2 +- .../network-requester/src/cli/init.rs | 2 +- .../network-requester/src/cli/run.rs | 2 +- .../network-requester/src/core.rs | 4 +- .../network-requester/src/reply.rs | 4 +- .../src/statistics/collector.rs | 2 +- 133 files changed, 499 insertions(+), 499 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c5801327f0..2d9a6d9980 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -709,7 +709,7 @@ dependencies = [ "nonexhaustive-delayqueue", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", "rand 0.7.3", "serde", "serde_json", @@ -2128,7 +2128,7 @@ dependencies = [ "network-defaults", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", "rand 0.7.3", "serde", "task", @@ -2156,7 +2156,7 @@ dependencies = [ "log", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", "rand 0.7.3", "serde", "serde_json", @@ -3172,7 +3172,7 @@ version = "0.1.0" dependencies = [ "futures", "log", - "nymsphinx", + "nym-sphinx", "task", "tokio", "tokio-util", @@ -3188,12 +3188,12 @@ dependencies = [ "log", "network-defaults", "nym-crypto", - "nymsphinx-acknowledgements", - "nymsphinx-addressing", - "nymsphinx-forwarding", - "nymsphinx-framing", - "nymsphinx-params", - "nymsphinx-types", + "nym-sphinx-acknowledgements", + "nym-sphinx-addressing", + "nym-sphinx-forwarding", + "nym-sphinx-framing", + "nym-sphinx-params", + "nym-sphinx-types", "rand 0.8.5", "serde", "task", @@ -3405,9 +3405,9 @@ dependencies = [ "nym-crypto", "nym-mixnet-contract-common", "nym-pemstore", + "nym-sphinx", "nym-vesting-contract-common", "nymcoconut", - "nymsphinx", "okapi", "pin-project", "pretty_env_logger", @@ -3545,7 +3545,7 @@ dependencies = [ "network-defaults", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", "pretty_env_logger", "rand 0.7.3", "serde", @@ -3590,7 +3590,7 @@ dependencies = [ "hkdf 0.12.3", "hmac 0.12.1", "nym-pemstore", - "nymsphinx-types", + "nym-sphinx-types", "rand 0.7.3", "rand_chacha 0.2.2", "serde", @@ -3631,8 +3631,8 @@ dependencies = [ "nym-api-requests", "nym-crypto", "nym-pemstore", + "nym-sphinx", "nym-types", - "nymsphinx", "once_cell", "pretty_env_logger", "rand 0.7.3", @@ -3696,10 +3696,10 @@ dependencies = [ "nonexhaustive-delayqueue", "nym-crypto", "nym-pemstore", + "nym-sphinx", + "nym-sphinx-params", + "nym-sphinx-types", "nym-types", - "nymsphinx", - "nymsphinx-params", - "nymsphinx-types", "pretty_env_logger", "rand 0.7.3", "rocket", @@ -3736,7 +3736,7 @@ dependencies = [ "network-defaults", "nym-crypto", "nym-sdk", - "nymsphinx", + "nym-sphinx", "ordered-buffer", "pretty_env_logger", "proxy-helpers", @@ -3810,7 +3810,7 @@ dependencies = [ "logging", "network-defaults", "nym-crypto", - "nymsphinx", + "nym-sphinx", "pretty_env_logger", "rand 0.7.3", "tap", @@ -3846,7 +3846,7 @@ dependencies = [ "network-defaults", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", "ordered-buffer", "pin-project", "pretty_env_logger", @@ -3866,6 +3866,133 @@ dependencies = [ "version-checker", ] +[[package]] +name = "nym-sphinx" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-mixnet-contract-common", + "nym-sphinx-acknowledgements", + "nym-sphinx-addressing", + "nym-sphinx-anonymous-replies", + "nym-sphinx-chunking", + "nym-sphinx-cover", + "nym-sphinx-forwarding", + "nym-sphinx-framing", + "nym-sphinx-params", + "nym-sphinx-types", + "rand 0.7.3", + "rand_distr", + "thiserror", + "tokio", + "topology", +] + +[[package]] +name = "nym-sphinx-acknowledgements" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-pemstore", + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", + "rand 0.7.3", + "thiserror", + "topology", +] + +[[package]] +name = "nym-sphinx-addressing" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-sphinx-types", + "rand 0.7.3", + "serde", + "thiserror", +] + +[[package]] +name = "nym-sphinx-anonymous-replies" +version = "0.1.0" +dependencies = [ + "bs58", + "nym-crypto", + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", + "rand 0.7.3", + "serde", + "thiserror", + "topology", + "wasm-bindgen", +] + +[[package]] +name = "nym-sphinx-chunking" +version = "0.1.0" +dependencies = [ + "log", + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", + "rand 0.7.3", + "thiserror", +] + +[[package]] +name = "nym-sphinx-cover" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-sphinx-acknowledgements", + "nym-sphinx-addressing", + "nym-sphinx-chunking", + "nym-sphinx-forwarding", + "nym-sphinx-params", + "nym-sphinx-types", + "rand 0.7.3", + "thiserror", + "topology", +] + +[[package]] +name = "nym-sphinx-forwarding" +version = "0.1.0" +dependencies = [ + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", +] + +[[package]] +name = "nym-sphinx-framing" +version = "0.1.0" +dependencies = [ + "bytes", + "nym-sphinx-params", + "nym-sphinx-types", + "thiserror", + "tokio-util", +] + +[[package]] +name = "nym-sphinx-params" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-sphinx-types", + "thiserror", +] + +[[package]] +name = "nym-sphinx-types" +version = "0.1.0" +dependencies = [ + "sphinx", +] + [[package]] name = "nym-types" version = "1.0.0" @@ -3962,133 +4089,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "nymsphinx" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-mixnet-contract-common", - "nymsphinx-acknowledgements", - "nymsphinx-addressing", - "nymsphinx-anonymous-replies", - "nymsphinx-chunking", - "nymsphinx-cover", - "nymsphinx-forwarding", - "nymsphinx-framing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "rand_distr", - "thiserror", - "tokio", - "topology", -] - -[[package]] -name = "nymsphinx-acknowledgements" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-pemstore", - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "thiserror", - "topology", -] - -[[package]] -name = "nymsphinx-addressing" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nymsphinx-types", - "rand 0.7.3", - "serde", - "thiserror", -] - -[[package]] -name = "nymsphinx-anonymous-replies" -version = "0.1.0" -dependencies = [ - "bs58", - "nym-crypto", - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "serde", - "thiserror", - "topology", - "wasm-bindgen", -] - -[[package]] -name = "nymsphinx-chunking" -version = "0.1.0" -dependencies = [ - "log", - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "thiserror", -] - -[[package]] -name = "nymsphinx-cover" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nymsphinx-acknowledgements", - "nymsphinx-addressing", - "nymsphinx-chunking", - "nymsphinx-forwarding", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "thiserror", - "topology", -] - -[[package]] -name = "nymsphinx-forwarding" -version = "0.1.0" -dependencies = [ - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", -] - -[[package]] -name = "nymsphinx-framing" -version = "0.1.0" -dependencies = [ - "bytes", - "nymsphinx-params", - "nymsphinx-types", - "thiserror", - "tokio-util", -] - -[[package]] -name = "nymsphinx-params" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nymsphinx-types", - "thiserror", -] - -[[package]] -name = "nymsphinx-types" -version = "0.1.0" -dependencies = [ - "sphinx", -] - [[package]] name = "okapi" version = "0.7.0-rc.1" @@ -5526,7 +5526,7 @@ dependencies = [ "build-information", "log", "nym-sdk", - "nymsphinx-anonymous-replies", + "nym-sphinx-anonymous-replies", "serde", "serde_json", "thiserror", @@ -5713,7 +5713,7 @@ dependencies = [ name = "socks5-requests" version = "0.1.0" dependencies = [ - "nymsphinx-addressing", + "nym-sphinx-addressing", "serde", "serde_json", "service-providers-common", @@ -6541,8 +6541,8 @@ dependencies = [ "log", "nym-crypto", "nym-mixnet-contract-common", - "nymsphinx-addressing", - "nymsphinx-types", + "nym-sphinx-addressing", + "nym-sphinx-types", "rand 0.7.3", "thiserror", "version-checker", @@ -7184,7 +7184,7 @@ dependencies = [ name = "websocket-requests" version = "0.1.0" dependencies = [ - "nymsphinx", + "nym-sphinx", "serde", "serde_json", ] diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index d168b659ac..0f4b688584 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -31,7 +31,7 @@ gateway-client = { path = "../../common/client-libs/gateway-client" } #gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm", "coconut"] } gateway-requests = { path = "../../gateway/gateway-requests" } nonexhaustive-delayqueue = { path = "../../common/nonexhaustive-delayqueue" } -nymsphinx = { path = "../../common/nymsphinx" } +nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", default-features = false } diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index ba9e4e8d66..b4f9ffeea9 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -32,10 +32,10 @@ use gateway_client::{ }; use log::{debug, info}; use nym_crypto::asymmetric::{encryption, identity}; -use nymsphinx::acknowledgements::AckKey; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::addressing::nodes::NodeIdentity; -use nymsphinx::receiver::ReconstructedMessage; +use nym_sphinx::acknowledgements::AckKey; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::nodes::NodeIdentity; +use nym_sphinx::receiver::ReconstructedMessage; use std::sync::Arc; use std::time::Duration; use tap::TapFallible; diff --git a/clients/client-core/src/client/cover_traffic_stream.rs b/clients/client-core/src/client/cover_traffic_stream.rs index 68fe05abd3..e6cef250e5 100644 --- a/clients/client-core/src/client/cover_traffic_stream.rs +++ b/clients/client-core/src/client/cover_traffic_stream.rs @@ -7,11 +7,11 @@ use crate::spawn_future; use futures::task::{Context, Poll}; use futures::{Future, Stream, StreamExt}; use log::*; -use nymsphinx::acknowledgements::AckKey; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::cover::generate_loop_cover_packet; -use nymsphinx::params::PacketSize; -use nymsphinx::utils::sample_poisson_duration; +use nym_sphinx::acknowledgements::AckKey; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::cover::generate_loop_cover_packet; +use nym_sphinx::params::PacketSize; +use nym_sphinx::utils::sample_poisson_duration; use rand::{rngs::OsRng, CryptoRng, Rng}; use std::pin::Pin; use std::sync::Arc; diff --git a/clients/client-core/src/client/inbound_messages.rs b/clients/client-core/src/client/inbound_messages.rs index e0d3eec05a..ff2293936e 100644 --- a/clients/client-core/src/client/inbound_messages.rs +++ b/clients/client-core/src/client/inbound_messages.rs @@ -1,6 +1,6 @@ use client_connections::TransmissionLane; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; pub type InputMessageSender = tokio::sync::mpsc::Sender; pub type InputMessageReceiver = tokio::sync::mpsc::Receiver; diff --git a/clients/client-core/src/client/key_manager.rs b/clients/client-core/src/client/key_manager.rs index daf71f4679..4f0f29eb8b 100644 --- a/clients/client-core/src/client/key_manager.rs +++ b/clients/client-core/src/client/key_manager.rs @@ -5,7 +5,7 @@ use crate::config::persistence::key_pathfinder::ClientKeyPathfinder; use gateway_requests::registration::handshake::SharedKeys; use log::*; use nym_crypto::asymmetric::{encryption, identity}; -use nymsphinx::acknowledgements::AckKey; +use nym_sphinx::acknowledgements::AckKey; use rand::{CryptoRng, RngCore}; use std::io; use std::sync::Arc; diff --git a/clients/client-core/src/client/mix_traffic.rs b/clients/client-core/src/client/mix_traffic.rs index 05d44824e7..afade091f9 100644 --- a/clients/client-core/src/client/mix_traffic.rs +++ b/clients/client-core/src/client/mix_traffic.rs @@ -6,7 +6,7 @@ use crate::spawn_future; use gateway_client::wasm_mockups::CosmWasmClient; use gateway_client::GatewayClient; use log::*; -use nymsphinx::forwarding::packet::MixPacket; +use nym_sphinx::forwarding::packet::MixPacket; #[cfg(not(target_arch = "wasm32"))] use validator_client::nyxd::CosmWasmClient; diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs index 8febbfa85d..ab1603e09c 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs @@ -5,7 +5,7 @@ use super::action_controller::{AckActionSender, Action}; use futures::StreamExt; use gateway_client::AcknowledgementReceiver; use log::*; -use nymsphinx::{ +use nym_sphinx::{ acknowledgements::{identifier::recover_identifier, AckKey}, chunking::fragment::{FragmentIdentifier, COVER_FRAG_ID}, }; diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs index fe79e24183..f2656e060d 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs @@ -7,8 +7,8 @@ use futures::channel::mpsc; use futures::StreamExt; use log::*; use nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue, QueueKey}; -use nymsphinx::chunking::fragment::FragmentIdentifier; -use nymsphinx::Delay as SphinxDelay; +use nym_sphinx::chunking::fragment::FragmentIdentifier; +use nym_sphinx::Delay as SphinxDelay; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs index f492de1aae..c537755da7 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs @@ -6,8 +6,8 @@ use crate::client::real_messages_control::message_handler::MessageHandler; use crate::client::replies::reply_controller::ReplyControllerSender; use client_connections::TransmissionLane; use log::*; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use rand::{CryptoRng, Rng}; /// Module responsible for dealing with the received messages: splitting them, creating acknowledgements, diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs index befc24b86a..eaaacc8b74 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs @@ -15,9 +15,9 @@ use action_controller::AckActionReceiver; use futures::channel::mpsc; use gateway_client::AcknowledgementReceiver; use log::*; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx::params::PacketSize; -use nymsphinx::{ +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::params::PacketSize; +use nym_sphinx::{ acknowledgements::AckKey, addressing::clients::Recipient, chunking::fragment::{Fragment, FragmentIdentifier}, diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs index d8fb2b0a8d..eb05a29b47 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs @@ -12,9 +12,9 @@ use crate::client::replies::reply_controller::ReplyControllerSender; use client_connections::TransmissionLane; use futures::StreamExt; use log::*; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::chunking::fragment::Fragment; -use nymsphinx::preparer::PreparedFragment; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::chunking::fragment::Fragment; +use nym_sphinx::preparer::PreparedFragment; use rand::{CryptoRng, Rng}; use std::sync::{Arc, Weak}; diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs index a931ce4962..3e827b6b4f 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs @@ -5,7 +5,7 @@ use super::action_controller::{AckActionSender, Action}; use super::SentPacketNotificationReceiver; use futures::StreamExt; use log::*; -use nymsphinx::chunking::fragment::{FragmentIdentifier, COVER_FRAG_ID}; +use nym_sphinx::chunking::fragment::{FragmentIdentifier, COVER_FRAG_ID}; /// Module responsible for starting up retransmission timers. /// It is required because when we send our packet to the `real traffic stream` controlled diff --git a/clients/client-core/src/client/real_messages_control/message_handler.rs b/clients/client-core/src/client/real_messages_control/message_handler.rs index d6fcaab0c0..473e9d8985 100644 --- a/clients/client-core/src/client/real_messages_control/message_handler.rs +++ b/clients/client-core/src/client/real_messages_control/message_handler.rs @@ -10,15 +10,15 @@ use crate::client::replies::reply_storage::{ReceivedReplySurbsMap, SentReplyKeys use crate::client::topology_control::{TopologyAccessor, TopologyReadPermit}; use client_connections::TransmissionLane; use log::{debug, error, info, trace, warn}; -use nymsphinx::acknowledgements::AckKey; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::{AnonymousSenderTag, RepliableMessage, ReplyMessage}; -use nymsphinx::anonymous_replies::{ReplySurb, SurbEncryptionKey}; -use nymsphinx::chunking::fragment::{Fragment, FragmentIdentifier}; -use nymsphinx::message::NymMessage; -use nymsphinx::params::{PacketSize, DEFAULT_NUM_MIX_HOPS}; -use nymsphinx::preparer::{MessagePreparer, PreparedFragment}; -use nymsphinx::Delay; +use nym_sphinx::acknowledgements::AckKey; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::{AnonymousSenderTag, RepliableMessage, ReplyMessage}; +use nym_sphinx::anonymous_replies::{ReplySurb, SurbEncryptionKey}; +use nym_sphinx::chunking::fragment::{Fragment, FragmentIdentifier}; +use nym_sphinx::message::NymMessage; +use nym_sphinx::params::{PacketSize, DEFAULT_NUM_MIX_HOPS}; +use nym_sphinx::preparer::{MessagePreparer, PreparedFragment}; +use nym_sphinx::Delay; use rand::{CryptoRng, Rng}; use std::collections::HashMap; use std::sync::Arc; diff --git a/clients/client-core/src/client/real_messages_control/mod.rs b/clients/client-core/src/client/real_messages_control/mod.rs index 9a1372f6ba..158138b525 100644 --- a/clients/client-core/src/client/real_messages_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/mod.rs @@ -25,9 +25,9 @@ use client_connections::{ConnectionCommandReceiver, LaneQueueLengths}; use futures::channel::mpsc; use gateway_client::AcknowledgementReceiver; use log::*; -use nymsphinx::acknowledgements::AckKey; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::params::PacketSize; +use nym_sphinx::acknowledgements::AckKey; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::params::PacketSize; use rand::{rngs::OsRng, CryptoRng, Rng}; use std::sync::Arc; use std::time::Duration; diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs index 769233f926..333d5f0fbc 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs @@ -12,14 +12,14 @@ use client_connections::{ use futures::task::{Context, Poll}; use futures::{Future, Stream, StreamExt}; use log::*; -use nymsphinx::acknowledgements::AckKey; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::chunking::fragment::FragmentIdentifier; -use nymsphinx::cover::generate_loop_cover_packet; -use nymsphinx::forwarding::packet::MixPacket; -use nymsphinx::params::PacketSize; -use nymsphinx::preparer::PreparedFragment; -use nymsphinx::utils::sample_poisson_duration; +use nym_sphinx::acknowledgements::AckKey; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::chunking::fragment::FragmentIdentifier; +use nym_sphinx::cover::generate_loop_cover_packet; +use nym_sphinx::forwarding::packet::MixPacket; +use nym_sphinx::params::PacketSize; +use nym_sphinx::preparer::PreparedFragment; +use nym_sphinx::utils::sample_poisson_duration; use rand::{CryptoRng, Rng}; use std::pin::Pin; use std::sync::Arc; diff --git a/clients/client-core/src/client/received_buffer.rs b/clients/client-core/src/client/received_buffer.rs index e80540c386..4ff19d1552 100644 --- a/clients/client-core/src/client/received_buffer.rs +++ b/clients/client-core/src/client/received_buffer.rs @@ -11,13 +11,13 @@ use gateway_client::MixnetMessageReceiver; use log::*; use nym_crypto::asymmetric::encryption; use nym_crypto::Digest; -use nymsphinx::anonymous_replies::requests::{ +use nym_sphinx::anonymous_replies::requests::{ RepliableMessage, RepliableMessageContent, ReplyMessage, ReplyMessageContent, }; -use nymsphinx::anonymous_replies::{encryption_key::EncryptionKeyDigest, SurbEncryptionKey}; -use nymsphinx::message::{NymMessage, PlainMessage}; -use nymsphinx::params::ReplySurbKeyDigestAlgorithm; -use nymsphinx::receiver::{MessageReceiver, MessageRecoveryError, ReconstructedMessage}; +use nym_sphinx::anonymous_replies::{encryption_key::EncryptionKeyDigest, SurbEncryptionKey}; +use nym_sphinx::message::{NymMessage, PlainMessage}; +use nym_sphinx::params::ReplySurbKeyDigestAlgorithm; +use nym_sphinx::receiver::{MessageReceiver, MessageRecoveryError, ReconstructedMessage}; use std::collections::HashSet; use std::sync::Arc; @@ -47,7 +47,7 @@ struct ReceivedMessagesBufferInner { impl ReceivedMessagesBufferInner { fn recover_from_fragment(&mut self, fragment_data: &[u8]) -> Option { - if nymsphinx::cover::is_cover(fragment_data) { + if nym_sphinx::cover::is_cover(fragment_data) { trace!("The message was a loop cover message! Skipping it"); return None; } diff --git a/clients/client-core/src/client/replies/reply_controller/mod.rs b/clients/client-core/src/client/replies/reply_controller/mod.rs index e04ade2412..429f07dbf3 100644 --- a/clients/client-core/src/client/replies/reply_controller/mod.rs +++ b/clients/client-core/src/client/replies/reply_controller/mod.rs @@ -8,10 +8,10 @@ use client_connections::{ConnectionId, TransmissionLane}; use futures::channel::oneshot; use futures::StreamExt; use log::{debug, error, info, trace, warn}; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx::anonymous_replies::ReplySurb; -use nymsphinx::chunking::fragment::{Fragment, FragmentIdentifier}; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::anonymous_replies::ReplySurb; +use nym_sphinx::chunking::fragment::{Fragment, FragmentIdentifier}; use rand::{CryptoRng, Rng}; use std::cmp::{max, min}; use std::collections::btree_map::Entry; diff --git a/clients/client-core/src/client/replies/reply_controller/requests.rs b/clients/client-core/src/client/replies/reply_controller/requests.rs index 6b910ebde2..b4322c1e54 100644 --- a/clients/client-core/src/client/replies/reply_controller/requests.rs +++ b/clients/client-core/src/client/replies/reply_controller/requests.rs @@ -5,9 +5,9 @@ use crate::client::real_messages_control::acknowledgement_control::PendingAcknow use client_connections::{ConnectionId, TransmissionLane}; use futures::channel::{mpsc, oneshot}; use log::error; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx::anonymous_replies::ReplySurb; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::anonymous_replies::ReplySurb; use std::sync::Weak; pub(crate) fn new_control_channels() -> (ReplyControllerSender, ReplyControllerReceiver) { diff --git a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs index 070344a21c..fd8a618542 100644 --- a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs +++ b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs @@ -12,7 +12,7 @@ use crate::client::replies::reply_storage::{ }; use async_trait::async_trait; use log::{error, info, warn}; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use std::fs; use std::path::{Path, PathBuf}; use time::OffsetDateTime; diff --git a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/models.rs b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/models.rs index db039adb82..c7b5196654 100644 --- a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/models.rs +++ b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/models.rs @@ -5,11 +5,11 @@ use crate::client::replies::reply_storage::backend::fs_backend::error::StorageEr use crate::client::replies::reply_storage::key_storage::UsedReplyKey; use nym_crypto::generic_array::typenum::Unsigned; use nym_crypto::Digest; -use nymsphinx::addressing::clients::{Recipient, RecipientBytes}; -use nymsphinx::anonymous_replies::encryption_key::EncryptionKeyDigest; -use nymsphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE}; -use nymsphinx::anonymous_replies::{ReplySurb, SurbEncryptionKey, SurbEncryptionKeySize}; -use nymsphinx::params::ReplySurbKeyDigestAlgorithm; +use nym_sphinx::addressing::clients::{Recipient, RecipientBytes}; +use nym_sphinx::anonymous_replies::encryption_key::EncryptionKeyDigest; +use nym_sphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE}; +use nym_sphinx::anonymous_replies::{ReplySurb, SurbEncryptionKey, SurbEncryptionKeySize}; +use nym_sphinx::params::ReplySurbKeyDigestAlgorithm; #[derive(Debug, Clone)] pub(crate) struct StoredSenderTag { diff --git a/clients/client-core/src/client/replies/reply_storage/key_storage.rs b/clients/client-core/src/client/replies/reply_storage/key_storage.rs index 9c68f40e06..310a44e0eb 100644 --- a/clients/client-core/src/client/replies/reply_storage/key_storage.rs +++ b/clients/client-core/src/client/replies/reply_storage/key_storage.rs @@ -3,8 +3,8 @@ use dashmap::iter::Iter; use dashmap::DashMap; -use nymsphinx::anonymous_replies::encryption_key::EncryptionKeyDigest; -use nymsphinx::anonymous_replies::SurbEncryptionKey; +use nym_sphinx::anonymous_replies::encryption_key::EncryptionKeyDigest; +use nym_sphinx::anonymous_replies::SurbEncryptionKey; use std::ops::Deref; use std::sync::Arc; use time::OffsetDateTime; diff --git a/clients/client-core/src/client/replies/reply_storage/surb_storage.rs b/clients/client-core/src/client/replies/reply_storage/surb_storage.rs index ed2fd8d846..cb88e30a90 100644 --- a/clients/client-core/src/client/replies/reply_storage/surb_storage.rs +++ b/clients/client-core/src/client/replies/reply_storage/surb_storage.rs @@ -4,8 +4,8 @@ use dashmap::iter::Iter; use dashmap::DashMap; use log::trace; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx::anonymous_replies::ReplySurb; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::anonymous_replies::ReplySurb; use std::collections::VecDeque; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; diff --git a/clients/client-core/src/client/replies/reply_storage/tag_storage.rs b/clients/client-core/src/client/replies/reply_storage/tag_storage.rs index c91d2b003e..892018b6fc 100644 --- a/clients/client-core/src/client/replies/reply_storage/tag_storage.rs +++ b/clients/client-core/src/client/replies/reply_storage/tag_storage.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use dashmap::DashMap; -use nymsphinx::addressing::clients::{Recipient, RecipientBytes}; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::addressing::clients::{Recipient, RecipientBytes}; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use std::sync::Arc; #[cfg(all(not(target_arch = "wasm32"), feature = "fs-surb-storage"))] diff --git a/clients/client-core/src/client/topology_control.rs b/clients/client-core/src/client/topology_control.rs index fd5b27860d..0f0c13ad1c 100644 --- a/clients/client-core/src/client/topology_control.rs +++ b/clients/client-core/src/client/topology_control.rs @@ -4,8 +4,8 @@ use crate::spawn_future; use futures::StreamExt; use log::*; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::params::DEFAULT_NUM_MIX_HOPS; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::params::DEFAULT_NUM_MIX_HOPS; use rand::seq::SliceRandom; use rand::thread_rng; use std::ops::Deref; diff --git a/clients/client-core/src/client/transmission_buffer.rs b/clients/client-core/src/client/transmission_buffer.rs index 1420ce0a7b..a8a26d1dd9 100644 --- a/clients/client-core/src/client/transmission_buffer.rs +++ b/clients/client-core/src/client/transmission_buffer.rs @@ -4,7 +4,7 @@ use crate::client::helpers::{get_time_now, Instant}; use crate::client::real_messages_control::real_traffic_stream::RealMessage; use client_connections::TransmissionLane; -use nymsphinx::chunking::fragment::Fragment; +use nym_sphinx::chunking::fragment::Fragment; use rand::{seq::SliceRandom, Rng}; use std::{ collections::{HashMap, HashSet, VecDeque}, diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index 04f6f5b90c..4c5c458e8c 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -3,7 +3,7 @@ use config::defaults::NymNetworkDetails; use config::{NymConfig, OptionalSet, DB_FILE_NAME}; -use nymsphinx::params::PacketSize; +use nym_sphinx::params::PacketSize; use serde::{Deserialize, Serialize}; use std::marker::PhantomData; use std::path::PathBuf; diff --git a/clients/client-core/src/init/mod.rs b/clients/client-core/src/init/mod.rs index 27e25d4972..667c5e0fa5 100644 --- a/clients/client-core/src/init/mod.rs +++ b/clients/client-core/src/init/mod.rs @@ -5,7 +5,7 @@ use std::fmt::Display; -use nymsphinx::addressing::{clients::Recipient, nodes::NodeIdentity}; +use nym_sphinx::addressing::{clients::Recipient, nodes::NodeIdentity}; use rand::rngs::OsRng; use serde::Serialize; use tap::TapFallible; diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index ed7227bf02..fbdd630764 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -47,7 +47,7 @@ logging = { path = "../../common/logging"} gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } network-defaults = { path = "../../common/network-defaults" } -nymsphinx = { path = "../../common/nymsphinx" } +nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } task = { path = "../../common/task" } topology = { path = "../../common/topology" } diff --git a/clients/native/examples/websocket_binarysend.rs b/clients/native/examples/websocket_binarysend.rs index 64791abbc6..2b7fec32d0 100644 --- a/clients/native/examples/websocket_binarysend.rs +++ b/clients/native/examples/websocket_binarysend.rs @@ -1,5 +1,5 @@ use futures::{SinkExt, StreamExt}; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use tokio::net::TcpStream; use tokio_tungstenite::{ connect_async, tungstenite::protocol::Message, MaybeTlsStream, WebSocketStream, diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index ad8d166024..a16fbde944 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -18,14 +18,14 @@ use client_core::config::persistence::key_pathfinder::ClientKeyPathfinder; use futures::channel::mpsc; use gateway_client::bandwidth::BandwidthController; use log::*; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use task::TaskManager; use tokio::sync::watch::error::SendError; use validator_client::nyxd::QueryNyxdClient; pub use client_core::client::key_manager::KeyManager; -pub use nymsphinx::addressing::clients::Recipient; -pub use nymsphinx::receiver::ReconstructedMessage; +pub use nym_sphinx::addressing::clients::Recipient; +pub use nym_sphinx::receiver::ReconstructedMessage; pub mod config; pub struct SocketClient { diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index 8d6a0b5229..68b9312576 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -9,7 +9,7 @@ use crate::{ use clap::Args; use config::NymConfig; use nym_crypto::asymmetric::identity; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; use std::fmt::Display; use std::net::IpAddr; diff --git a/clients/native/src/websocket/handler.rs b/clients/native/src/websocket/handler.rs index fcc786d76e..fff50b77b9 100644 --- a/clients/native/src/websocket/handler.rs +++ b/clients/native/src/websocket/handler.rs @@ -14,9 +14,9 @@ use client_core::client::{ use futures::channel::mpsc; use futures::{SinkExt, StreamExt}; use log::*; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx::receiver::ReconstructedMessage; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::receiver::ReconstructedMessage; use std::time::Duration; use tokio::net::TcpStream; use tokio::time::Instant; diff --git a/clients/native/websocket-requests/Cargo.toml b/clients/native/websocket-requests/Cargo.toml index a2689476bc..0f0921f636 100644 --- a/clients/native/websocket-requests/Cargo.toml +++ b/clients/native/websocket-requests/Cargo.toml @@ -10,4 +10,4 @@ edition = "2021" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -nymsphinx = { path = "../../../common/nymsphinx" } +nym-sphinx = { path = "../../../common/nymsphinx" } diff --git a/clients/native/websocket-requests/src/requests.rs b/clients/native/websocket-requests/src/requests.rs index 637db0daba..1e72ea8cfe 100644 --- a/clients/native/websocket-requests/src/requests.rs +++ b/clients/native/websocket-requests/src/requests.rs @@ -6,8 +6,8 @@ use crate::error::{self, ErrorKind}; use crate::text::ClientRequestText; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE}; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE}; use std::convert::{TryFrom, TryInto}; use std::mem::size_of; diff --git a/clients/native/websocket-requests/src/responses.rs b/clients/native/websocket-requests/src/responses.rs index 8b4e60963a..bf087d04f3 100644 --- a/clients/native/websocket-requests/src/responses.rs +++ b/clients/native/websocket-requests/src/responses.rs @@ -6,9 +6,9 @@ use crate::error::{self, ErrorKind}; use crate::text::ServerResponseText; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE}; -use nymsphinx::receiver::ReconstructedMessage; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::{AnonymousSenderTag, SENDER_TAG_SIZE}; +use nym_sphinx::receiver::ReconstructedMessage; use std::convert::TryInto; use std::mem::size_of; diff --git a/clients/native/websocket-requests/src/text.rs b/clients/native/websocket-requests/src/text.rs index 68091dbecf..944a3855fa 100644 --- a/clients/native/websocket-requests/src/text.rs +++ b/clients/native/websocket-requests/src/text.rs @@ -4,8 +4,8 @@ use crate::error::ErrorKind; use crate::requests::ClientRequest; use crate::responses::ServerResponse; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use serde::{Deserialize, Serialize}; use std::convert::{TryFrom, TryInto}; diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 397bba0f8f..976871cce5 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -41,7 +41,7 @@ logging = { path = "../../common/logging"} gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } network-defaults = { path = "../../common/network-defaults" } -nymsphinx = { path = "../../common/nymsphinx" } +nym-sphinx = { path = "../../common/nymsphinx" } ordered-buffer = { path = "../../common/socks5/ordered-buffer" } nym-pemstore = { path = "../../common/pemstore" } proxy-helpers = { path = "../../common/socks5/proxy-helpers" } diff --git a/clients/socks5/src/client/config/mod.rs b/clients/socks5/src/client/config/mod.rs index a47de5de99..79ad8e1f54 100644 --- a/clients/socks5/src/client/config/mod.rs +++ b/clients/socks5/src/client/config/mod.rs @@ -7,7 +7,7 @@ pub use client_core::config::MISSING_VALUE; use client_core::config::{ClientCoreConfigTrait, DebugConfig}; use config::defaults::DEFAULT_SOCKS5_LISTENING_PORT; use config::{NymConfig, OptionalSet}; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use serde::{Deserialize, Serialize}; use service_providers_common::interface::ProviderInterfaceVersion; use socks5_requests::Socks5ProtocolVersion; diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index b2f463a75f..3354bab401 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -21,7 +21,7 @@ use futures::StreamExt; #[cfg(not(feature = "mobile"))] use gateway_client::bandwidth::BandwidthController; use log::*; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use std::error::Error; use task::{TaskClient, TaskManager}; use validator_client::nyxd::QueryNyxdClient; diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index c2c4747c89..8cb67c278e 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -9,7 +9,7 @@ use crate::{ use clap::Args; use config::NymConfig; use nym_crypto::asymmetric::identity; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; use std::fmt::Display; use tap::TapFallible; diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index ddf4ffcf62..231965732e 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -11,7 +11,7 @@ use clap::Args; use config::NymConfig; use log::*; use nym_crypto::asymmetric::identity; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use version_checker::is_minor_version_compatible; #[derive(Args, Clone)] diff --git a/clients/socks5/src/socks/client.rs b/clients/socks5/src/socks/client.rs index d7a8e26b3e..75f5fada7c 100644 --- a/clients/socks5/src/socks/client.rs +++ b/clients/socks5/src/socks/client.rs @@ -9,7 +9,7 @@ use client_core::client::inbound_messages::{InputMessage, InputMessageSender}; use futures::channel::mpsc; use futures::task::{Context, Poll}; use log::*; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use pin_project::pin_project; use proxy_helpers::connection_controller::{ ConnectionReceiver, ControllerCommand, ControllerSender, diff --git a/clients/socks5/src/socks/mixnet_responses.rs b/clients/socks5/src/socks/mixnet_responses.rs index 8f1348f795..2c46bc3f6f 100644 --- a/clients/socks5/src/socks/mixnet_responses.rs +++ b/clients/socks5/src/socks/mixnet_responses.rs @@ -4,7 +4,7 @@ use log::*; use client_core::client::received_buffer::ReconstructedMessagesReceiver; use client_core::client::received_buffer::{ReceivedBufferMessage, ReceivedBufferRequestSender}; -use nymsphinx::receiver::ReconstructedMessage; +use nym_sphinx::receiver::ReconstructedMessage; use proxy_helpers::connection_controller::ControllerSender; use service_providers_common::interface::{ControlResponse, ResponseContent}; use socks5_requests::{Socks5ProviderResponse, Socks5Response, Socks5ResponseContent}; diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index 3f872a5877..5b376b1110 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -9,7 +9,7 @@ use client_core::client::{ inbound_messages::InputMessageSender, received_buffer::ReceivedBufferRequestSender, }; use log::*; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use proxy_helpers::connection_controller::Controller; use std::net::SocketAddr; use tap::TapFallible; diff --git a/clients/webassembly/Cargo.toml b/clients/webassembly/Cargo.toml index 852ee3bebc..cb15659b49 100644 --- a/clients/webassembly/Cargo.toml +++ b/clients/webassembly/Cargo.toml @@ -35,7 +35,7 @@ client-connections = { path = "../../common/client-connections" } coconut-interface = { path = "../../common/coconut-interface" } credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } -nymsphinx = { path = "../../common/nymsphinx" } +nym-sphinx = { path = "../../common/nymsphinx" } topology = { path = "../../common/topology" } gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm"] } validator-client = { path = "../../common/client-libs/validator-client", default-features = false } diff --git a/clients/webassembly/src/client/mod.rs b/clients/webassembly/src/client/mod.rs index 306c2d85ed..269dfee52d 100644 --- a/clients/webassembly/src/client/mod.rs +++ b/clients/webassembly/src/client/mod.rs @@ -13,8 +13,8 @@ use client_core::client::{inbound_messages::InputMessage, key_manager::KeyManage use gateway_client::bandwidth::BandwidthController; use gateway_client::wasm_mockups::SigningNyxdClient; use js_sys::Promise; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use rand::rngs::OsRng; use std::sync::Arc; use task::TaskManager; diff --git a/clients/webassembly/src/validation.rs b/clients/webassembly/src/validation.rs index c0273f8b61..830a3d789a 100644 --- a/clients/webassembly/src/validation.rs +++ b/clients/webassembly/src/validation.rs @@ -1,4 +1,4 @@ -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use wasm_bindgen::prelude::*; #[wasm_bindgen] diff --git a/common/client-libs/gateway-client/Cargo.toml b/common/client-libs/gateway-client/Cargo.toml index dca0679f07..2be6ef78e1 100644 --- a/common/client-libs/gateway-client/Cargo.toml +++ b/common/client-libs/gateway-client/Cargo.toml @@ -23,7 +23,7 @@ credentials = { path = "../../credentials" } nym-crypto = { path = "../../crypto" } gateway-requests = { path = "../../../gateway/gateway-requests" } network-defaults = { path = "../../network-defaults" } -nymsphinx = { path = "../../nymsphinx" } +nym-sphinx = { path = "../../nymsphinx" } nym-pemstore = { path = "../../pemstore" } validator-client = { path = "../validator-client" } task = { path = "../../task" } diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index b89111256e..50253a706e 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -18,7 +18,7 @@ use gateway_requests::{BinaryRequest, ClientControlRequest, ServerResponse, PROT use log::*; use network_defaults::{REMAINING_BANDWIDTH_THRESHOLD, TOKENS_TO_BURN}; use nym_crypto::asymmetric::identity; -use nymsphinx::forwarding::packet::MixPacket; +use nym_sphinx::forwarding::packet::MixPacket; use rand::rngs::OsRng; use std::convert::TryFrom; use std::sync::Arc; diff --git a/common/client-libs/gateway-client/src/packet_router.rs b/common/client-libs/gateway-client/src/packet_router.rs index daeac0e548..10877b29f7 100644 --- a/common/client-libs/gateway-client/src/packet_router.rs +++ b/common/client-libs/gateway-client/src/packet_router.rs @@ -7,8 +7,8 @@ use crate::error::GatewayClientError; use futures::channel::mpsc; use log::*; -use nymsphinx::addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; -use nymsphinx::params::packet_sizes::PacketSize; +use nym_sphinx::addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; +use nym_sphinx::params::packet_sizes::PacketSize; use task::TaskClient; pub type MixnetMessageSender = mpsc::UnboundedSender>>; diff --git a/common/client-libs/mixnet-client/Cargo.toml b/common/client-libs/mixnet-client/Cargo.toml index c64da7db48..03a40ec356 100644 --- a/common/client-libs/mixnet-client/Cargo.toml +++ b/common/client-libs/mixnet-client/Cargo.toml @@ -13,5 +13,5 @@ tokio = { version = "1.24.1", features = ["time", "net", "rt"] } tokio-util = { version = "0.7.4", features = ["codec"] } # internal -nymsphinx = { path = "../../nymsphinx" } -task = { path = "../../task" } \ No newline at end of file +nym-sphinx = { path = "../../nymsphinx" } +task = { path = "../../task" } diff --git a/common/client-libs/mixnet-client/src/client.rs b/common/client-libs/mixnet-client/src/client.rs index f3a04f1099..62e37bca90 100644 --- a/common/client-libs/mixnet-client/src/client.rs +++ b/common/client-libs/mixnet-client/src/client.rs @@ -4,10 +4,10 @@ use futures::channel::mpsc; use futures::StreamExt; use log::*; -use nymsphinx::framing::codec::SphinxCodec; -use nymsphinx::framing::packet::FramedSphinxPacket; -use nymsphinx::params::PacketMode; -use nymsphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; +use nym_sphinx::framing::codec::SphinxCodec; +use nym_sphinx::framing::packet::FramedSphinxPacket; +use nym_sphinx::params::PacketMode; +use nym_sphinx::{addressing::nodes::NymNodeRoutingAddress, SphinxPacket}; use std::collections::HashMap; use std::io; use std::net::SocketAddr; diff --git a/common/client-libs/mixnet-client/src/forwarder.rs b/common/client-libs/mixnet-client/src/forwarder.rs index 43384ba759..974ee1947b 100644 --- a/common/client-libs/mixnet-client/src/forwarder.rs +++ b/common/client-libs/mixnet-client/src/forwarder.rs @@ -5,7 +5,7 @@ use crate::client::{Client, Config, SendWithoutResponse}; use futures::channel::mpsc; use futures::StreamExt; use log::*; -use nymsphinx::forwarding::packet::MixPacket; +use nym_sphinx::forwarding::packet::MixPacket; use std::time::Duration; pub type MixForwardingSender = mpsc::UnboundedSender; diff --git a/common/crypto/Cargo.toml b/common/crypto/Cargo.toml index 0821a3bdd4..b962a26f29 100644 --- a/common/crypto/Cargo.toml +++ b/common/crypto/Cargo.toml @@ -30,7 +30,7 @@ subtle-encoding = { version = "0.5", features = ["bech32-preview"]} thiserror = "1.0.37" # internal -nymsphinx-types = { path = "../nymsphinx/types" } +nym-sphinx-types = { path = "../nymsphinx/types" } nym-pemstore = { path = "../../common/pemstore", version = "0.1.0" } [dev-dependencies] diff --git a/common/crypto/src/asymmetric/encryption/mod.rs b/common/crypto/src/asymmetric/encryption/mod.rs index 6f45a74270..e81bea6e85 100644 --- a/common/crypto/src/asymmetric/encryption/mod.rs +++ b/common/crypto/src/asymmetric/encryption/mod.rs @@ -256,38 +256,38 @@ impl PemStorableKey for PrivateKey { } // compatibility with sphinx keys: -impl From for nymsphinx_types::PublicKey { +impl From for nym_sphinx_types::PublicKey { fn from(key: PublicKey) -> Self { - nymsphinx_types::PublicKey::from(key.to_bytes()) + nym_sphinx_types::PublicKey::from(key.to_bytes()) } } -impl<'a> From<&'a PublicKey> for nymsphinx_types::PublicKey { +impl<'a> From<&'a PublicKey> for nym_sphinx_types::PublicKey { fn from(key: &'a PublicKey) -> Self { - nymsphinx_types::PublicKey::from((*key).to_bytes()) + nym_sphinx_types::PublicKey::from((*key).to_bytes()) } } -impl From for PublicKey { - fn from(pub_key: nymsphinx_types::PublicKey) -> Self { +impl From for PublicKey { + fn from(pub_key: nym_sphinx_types::PublicKey) -> Self { Self(x25519_dalek::PublicKey::from(*pub_key.as_bytes())) } } -impl From for nymsphinx_types::PrivateKey { +impl From for nym_sphinx_types::PrivateKey { fn from(key: PrivateKey) -> Self { - nymsphinx_types::PrivateKey::from(key.to_bytes()) + nym_sphinx_types::PrivateKey::from(key.to_bytes()) } } -impl<'a> From<&'a PrivateKey> for nymsphinx_types::PrivateKey { +impl<'a> From<&'a PrivateKey> for nym_sphinx_types::PrivateKey { fn from(key: &'a PrivateKey) -> Self { - nymsphinx_types::PrivateKey::from(key.to_bytes()) + nym_sphinx_types::PrivateKey::from(key.to_bytes()) } } -impl From for PrivateKey { - fn from(private_key: nymsphinx_types::PrivateKey) -> Self { +impl From for PrivateKey { + fn from(private_key: nym_sphinx_types::PrivateKey) -> Self { let private_key_bytes = private_key.to_bytes(); assert_eq!(private_key_bytes.len(), PRIVATE_KEY_SIZE); Self::from_bytes(&private_key_bytes).unwrap() @@ -312,10 +312,10 @@ mod sphinx_key_conversion { let private_bytes = private.to_bytes(); let public_bytes = public.to_bytes(); - let sphinx_private: nymsphinx_types::PrivateKey = private.into(); + let sphinx_private: nym_sphinx_types::PrivateKey = private.into(); let recovered_private = PrivateKey::from(sphinx_private); - let sphinx_public: nymsphinx_types::PublicKey = public.into(); + let sphinx_public: nym_sphinx_types::PublicKey = public.into(); let recovered_public = PublicKey::from(sphinx_public); assert_eq!(private_bytes, recovered_private.to_bytes()); assert_eq!(public_bytes, recovered_public.to_bytes()); @@ -325,16 +325,16 @@ mod sphinx_key_conversion { #[test] fn works_for_backward_conversion() { for _ in 0..NUM_ITERATIONS { - let (sphinx_private, sphinx_public) = nymsphinx_types::crypto::keygen(); + let (sphinx_private, sphinx_public) = nym_sphinx_types::crypto::keygen(); let private_bytes = sphinx_private.to_bytes(); let public_bytes = sphinx_public.as_bytes(); let private: PrivateKey = sphinx_private.into(); - let recovered_sphinx_private: nymsphinx_types::PrivateKey = private.into(); + let recovered_sphinx_private: nym_sphinx_types::PrivateKey = private.into(); let public: PublicKey = sphinx_public.into(); - let recovered_sphinx_public: nymsphinx_types::PublicKey = public.into(); + let recovered_sphinx_public: nym_sphinx_types::PublicKey = public.into(); assert_eq!(private_bytes, recovered_sphinx_private.to_bytes()); assert_eq!(public_bytes, recovered_sphinx_public.as_bytes()); } diff --git a/common/crypto/src/asymmetric/identity/mod.rs b/common/crypto/src/asymmetric/identity/mod.rs index c72f028607..7a3fed7948 100644 --- a/common/crypto/src/asymmetric/identity/mod.rs +++ b/common/crypto/src/asymmetric/identity/mod.rs @@ -5,7 +5,7 @@ pub use ed25519_dalek::ed25519::signature::Signature as SignatureTrait; pub use ed25519_dalek::SignatureError; pub use ed25519_dalek::{Verifier, PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, SIGNATURE_LENGTH}; use nym_pemstore::traits::{PemStorableKey, PemStorableKeyPair}; -use nymsphinx_types::{DestinationAddressBytes, DESTINATION_ADDRESS_LENGTH}; +use nym_sphinx_types::{DestinationAddressBytes, DESTINATION_ADDRESS_LENGTH}; use std::fmt::{self, Display, Formatter}; use std::str::FromStr; use thiserror::Error; diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml index 904d457c8e..978379c1e5 100644 --- a/common/mixnode-common/Cargo.toml +++ b/common/mixnode-common/Cargo.toml @@ -20,12 +20,12 @@ thiserror = "1.0.37" nym-crypto = { path = "../crypto" } network-defaults = { path = "../network-defaults" } -nymsphinx-acknowledgements = { path = "../nymsphinx/acknowledgements" } -nymsphinx-addressing = { path = "../nymsphinx/addressing" } -nymsphinx-forwarding = { path = "../nymsphinx/forwarding" } -nymsphinx-framing = { path = "../nymsphinx/framing" } -nymsphinx-params = { path = "../nymsphinx/params" } -nymsphinx-types = { path = "../nymsphinx/types" } +nym-sphinx-acknowledgements = { path = "../nymsphinx/acknowledgements" } +nym-sphinx-addressing = { path = "../nymsphinx/addressing" } +nym-sphinx-forwarding = { path = "../nymsphinx/forwarding" } +nym-sphinx-framing = { path = "../nymsphinx/framing" } +nym-sphinx-params = { path = "../nymsphinx/params" } +nym-sphinx-types = { path = "../nymsphinx/types" } task = { path = "../task" } validator-client = { path = "../client-libs/validator-client", features = ["nyxd-client"]} version-checker = { path = "../version-checker" } diff --git a/common/mixnode-common/src/packet_processor/error.rs b/common/mixnode-common/src/packet_processor/error.rs index 084ce708a8..99d3a2d2f2 100644 --- a/common/mixnode-common/src/packet_processor/error.rs +++ b/common/mixnode-common/src/packet_processor/error.rs @@ -1,9 +1,9 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use nymsphinx_acknowledgements::surb_ack::SurbAckRecoveryError; -use nymsphinx_addressing::nodes::NymNodeRoutingAddressError; -use nymsphinx_types::Error as SphinxError; +use nym_sphinx_acknowledgements::surb_ack::SurbAckRecoveryError; +use nym_sphinx_addressing::nodes::NymNodeRoutingAddressError; +use nym_sphinx_types::Error as SphinxError; use thiserror::Error; #[derive(Error, Debug)] diff --git a/common/mixnode-common/src/packet_processor/processor.rs b/common/mixnode-common/src/packet_processor/processor.rs index 84e543d8bd..7d041fce3b 100644 --- a/common/mixnode-common/src/packet_processor/processor.rs +++ b/common/mixnode-common/src/packet_processor/processor.rs @@ -3,12 +3,12 @@ use crate::packet_processor::error::MixProcessingError; use log::*; -use nymsphinx_acknowledgements::surb_ack::SurbAck; -use nymsphinx_addressing::nodes::NymNodeRoutingAddress; -use nymsphinx_forwarding::packet::MixPacket; -use nymsphinx_framing::packet::FramedSphinxPacket; -use nymsphinx_params::{PacketMode, PacketSize}; -use nymsphinx_types::{ +use nym_sphinx_acknowledgements::surb_ack::SurbAck; +use nym_sphinx_addressing::nodes::NymNodeRoutingAddress; +use nym_sphinx_forwarding::packet::MixPacket; +use nym_sphinx_framing::packet::FramedSphinxPacket; +use nym_sphinx_params::{PacketMode, PacketSize}; +use nym_sphinx_types::{ Delay as SphinxDelay, DestinationAddressBytes, NodeAddressBytes, Payload, PrivateKey, ProcessedPacket, SphinxPacket, }; @@ -192,7 +192,7 @@ impl SphinxPacketProcessor { #[cfg(test)] mod tests { use super::*; - use nymsphinx_types::crypto::keygen; + use nym_sphinx_types::crypto::keygen; fn fixture() -> SphinxPacketProcessor { let local_keys = keygen(); diff --git a/common/nymsphinx/Cargo.toml b/common/nymsphinx/Cargo.toml index c2e555d19d..33246054e3 100644 --- a/common/nymsphinx/Cargo.toml +++ b/common/nymsphinx/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx" +name = "nym-sphinx" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -11,14 +11,14 @@ rand = { version = "0.7.3", features = ["wasm-bindgen"] } rand_distr = "0.3" thiserror = "1.0.37" -nymsphinx-acknowledgements = { path = "acknowledgements" } -nymsphinx-addressing = { path = "addressing" } -nymsphinx-anonymous-replies = { path = "anonymous-replies" } -nymsphinx-chunking = { path = "chunking" } -nymsphinx-cover = { path = "cover" } -nymsphinx-forwarding = { path = "forwarding" } -nymsphinx-params = { path = "params" } -nymsphinx-types = { path = "types" } +nym-sphinx-acknowledgements = { path = "acknowledgements" } +nym-sphinx-addressing = { path = "addressing" } +nym-sphinx-anonymous-replies = { path = "anonymous-replies" } +nym-sphinx-chunking = { path = "chunking" } +nym-sphinx-cover = { path = "cover" } +nym-sphinx-forwarding = { path = "forwarding" } +nym-sphinx-params = { path = "params" } +nym-sphinx-types = { path = "types" } # those dependencies are due to intriducing preparer and receiver. Perpaphs that indicates they should be moved # to separate crate? @@ -30,7 +30,7 @@ nym-mixnet-contract-common = { path = "../cosmwasm-smart-contracts/mixnet-contra # do not include this when compiling into wasm as it somehow when combined together with reqwest, it will require # net2 via tokio-util -> tokio -> mio -> net2 -[target."cfg(not(target_arch = \"wasm32\"))".dependencies.nymsphinx-framing] +[target."cfg(not(target_arch = \"wasm32\"))".dependencies.nym-sphinx-framing] path = "framing" [target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio] diff --git a/common/nymsphinx/acknowledgements/Cargo.toml b/common/nymsphinx/acknowledgements/Cargo.toml index d9e1b29e7f..3e1abf760c 100644 --- a/common/nymsphinx/acknowledgements/Cargo.toml +++ b/common/nymsphinx/acknowledgements/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-acknowledgements" +name = "nym-sphinx-acknowledgements" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -11,9 +11,9 @@ rand = { version = "0.7.3", features = ["wasm-bindgen"] } thiserror = "1.0.37" nym-crypto = { path = "../../crypto", features = ["symmetric", "rand"] } -nymsphinx-addressing = { path = "../addressing" } -nymsphinx-params = { path = "../params" } -nymsphinx-types = { path = "../types" } +nym-sphinx-addressing = { path = "../addressing" } +nym-sphinx-params = { path = "../params" } +nym-sphinx-types = { path = "../types" } nym-pemstore = { path = "../../pemstore" } topology = { path = "../../topology" } diff --git a/common/nymsphinx/acknowledgements/src/identifier.rs b/common/nymsphinx/acknowledgements/src/identifier.rs index 7a8282b109..9f6ffb49be 100644 --- a/common/nymsphinx/acknowledgements/src/identifier.rs +++ b/common/nymsphinx/acknowledgements/src/identifier.rs @@ -3,7 +3,7 @@ use crate::AckKey; use nym_crypto::symmetric::stream_cipher::{self, encrypt, iv_from_slice, random_iv, IvSizeUser}; -use nymsphinx_params::{ +use nym_sphinx_params::{ packet_sizes::PacketSize, AckEncryptionAlgorithm, SerializedFragmentIdentifier, FRAG_ID_LEN, }; use rand::{CryptoRng, RngCore}; diff --git a/common/nymsphinx/acknowledgements/src/key.rs b/common/nymsphinx/acknowledgements/src/key.rs index bfe8b36a2b..e43a4cf6e5 100644 --- a/common/nymsphinx/acknowledgements/src/key.rs +++ b/common/nymsphinx/acknowledgements/src/key.rs @@ -3,7 +3,7 @@ use nym_crypto::symmetric::stream_cipher::{generate_key, CipherKey, KeySizeUser}; use nym_pemstore::traits::PemStorableKey; -use nymsphinx_params::AckEncryptionAlgorithm; +use nym_sphinx_params::AckEncryptionAlgorithm; use rand::{CryptoRng, RngCore}; use std::fmt::{self, Display, Formatter}; diff --git a/common/nymsphinx/acknowledgements/src/surb_ack.rs b/common/nymsphinx/acknowledgements/src/surb_ack.rs index 912ed4bc32..8526fc109f 100644 --- a/common/nymsphinx/acknowledgements/src/surb_ack.rs +++ b/common/nymsphinx/acknowledgements/src/surb_ack.rs @@ -3,15 +3,15 @@ use crate::identifier::prepare_identifier; use crate::AckKey; -use nymsphinx_addressing::clients::Recipient; -use nymsphinx_addressing::nodes::{ +use nym_sphinx_addressing::clients::Recipient; +use nym_sphinx_addressing::nodes::{ NymNodeRoutingAddress, NymNodeRoutingAddressError, MAX_NODE_ADDRESS_UNPADDED_LEN, }; -use nymsphinx_params::packet_sizes::PacketSize; -use nymsphinx_params::DEFAULT_NUM_MIX_HOPS; -use nymsphinx_types::builder::SphinxPacketBuilder; -use nymsphinx_types::Error as SphinxError; -use nymsphinx_types::{ +use nym_sphinx_params::packet_sizes::PacketSize; +use nym_sphinx_params::DEFAULT_NUM_MIX_HOPS; +use nym_sphinx_types::builder::SphinxPacketBuilder; +use nym_sphinx_types::Error as SphinxError; +use nym_sphinx_types::{ delays::{self, Delay}, SphinxPacket, }; diff --git a/common/nymsphinx/addressing/Cargo.toml b/common/nymsphinx/addressing/Cargo.toml index d62f86345c..dc38bc1f8a 100644 --- a/common/nymsphinx/addressing/Cargo.toml +++ b/common/nymsphinx/addressing/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-addressing" +name = "nym-sphinx-addressing" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -8,7 +8,7 @@ edition = "2021" [dependencies] nym-crypto = { path = "../../crypto", features = ["asymmetric"] } # all addresses are expressed in terms on their crypto keys -nymsphinx-types = { path = "../types" } # we need to be able to refer to some types defined inside sphinx crate +nym-sphinx-types = { path = "../types" } # we need to be able to refer to some types defined inside sphinx crate serde = "1.0" # implementing serialization/deserialization for some types, like `Recipient` thiserror = "1.0.37" diff --git a/common/nymsphinx/addressing/src/clients.rs b/common/nymsphinx/addressing/src/clients.rs index 929906dac9..a37f15a5fa 100644 --- a/common/nymsphinx/addressing/src/clients.rs +++ b/common/nymsphinx/addressing/src/clients.rs @@ -6,7 +6,7 @@ use crate::nodes::{NodeIdentity, NODE_IDENTITY_SIZE}; use nym_crypto::asymmetric::{encryption, identity}; -use nymsphinx_types::Destination; +use nym_sphinx_types::Destination; use serde::de::{Error as SerdeError, Unexpected, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt::{self, Formatter}; diff --git a/common/nymsphinx/addressing/src/nodes.rs b/common/nymsphinx/addressing/src/nodes.rs index 7514341113..d1ed9d1790 100644 --- a/common/nymsphinx/addressing/src/nodes.rs +++ b/common/nymsphinx/addressing/src/nodes.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use nym_crypto::asymmetric::identity; -use nymsphinx_types::{NodeAddressBytes, NODE_ADDRESS_LENGTH}; +use nym_sphinx_types::{NodeAddressBytes, NODE_ADDRESS_LENGTH}; use std::convert::{TryFrom, TryInto}; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use thiserror::Error; diff --git a/common/nymsphinx/anonymous-replies/Cargo.toml b/common/nymsphinx/anonymous-replies/Cargo.toml index d1fc4fd3f8..25269fdbd6 100644 --- a/common/nymsphinx/anonymous-replies/Cargo.toml +++ b/common/nymsphinx/anonymous-replies/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-anonymous-replies" +name = "nym-sphinx-anonymous-replies" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -13,9 +13,9 @@ serde = "1.0" thiserror = "1" nym-crypto = { path = "../../crypto", features = ["symmetric", "rand"] } -nymsphinx-addressing = { path = "../addressing" } -nymsphinx-params = { path = "../params" } -nymsphinx-types = { path = "../types" } +nym-sphinx-addressing = { path = "../addressing" } +nym-sphinx-params = { path = "../params" } +nym-sphinx-types = { path = "../types" } topology = { path = "../../topology" } [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-bindgen] diff --git a/common/nymsphinx/anonymous-replies/src/encryption_key.rs b/common/nymsphinx/anonymous-replies/src/encryption_key.rs index 63533260a2..87d847902b 100644 --- a/common/nymsphinx/anonymous-replies/src/encryption_key.rs +++ b/common/nymsphinx/anonymous-replies/src/encryption_key.rs @@ -7,7 +7,7 @@ use nym_crypto::{ symmetric::stream_cipher::{generate_key, CipherKey, KeySizeUser}, OutputSizeUser, }; -use nymsphinx_params::{ReplySurbEncryptionAlgorithm, ReplySurbKeyDigestAlgorithm}; +use nym_sphinx_params::{ReplySurbEncryptionAlgorithm, ReplySurbKeyDigestAlgorithm}; use rand::{CryptoRng, RngCore}; use std::fmt::{self, Display, Formatter}; diff --git a/common/nymsphinx/anonymous-replies/src/reply_surb.rs b/common/nymsphinx/anonymous-replies/src/reply_surb.rs index 0e50d847f9..049e3569e7 100644 --- a/common/nymsphinx/anonymous-replies/src/reply_surb.rs +++ b/common/nymsphinx/anonymous-replies/src/reply_surb.rs @@ -3,11 +3,11 @@ use crate::encryption_key::{SurbEncryptionKey, SurbEncryptionKeyError, SurbEncryptionKeySize}; use nym_crypto::{generic_array::typenum::Unsigned, Digest}; -use nymsphinx_addressing::clients::Recipient; -use nymsphinx_addressing::nodes::{NymNodeRoutingAddress, MAX_NODE_ADDRESS_UNPADDED_LEN}; -use nymsphinx_params::packet_sizes::PacketSize; -use nymsphinx_params::{ReplySurbKeyDigestAlgorithm, DEFAULT_NUM_MIX_HOPS}; -use nymsphinx_types::{delays, Error as SphinxError, SURBMaterial, SphinxPacket, SURB}; +use nym_sphinx_addressing::clients::Recipient; +use nym_sphinx_addressing::nodes::{NymNodeRoutingAddress, MAX_NODE_ADDRESS_UNPADDED_LEN}; +use nym_sphinx_params::packet_sizes::PacketSize; +use nym_sphinx_params::{ReplySurbKeyDigestAlgorithm, DEFAULT_NUM_MIX_HOPS}; +use nym_sphinx_types::{delays, Error as SphinxError, SURBMaterial, SphinxPacket, SURB}; use rand::{CryptoRng, RngCore}; use serde::de::{Error as SerdeError, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -111,7 +111,7 @@ impl ReplySurb { /// Returns the expected number of bytes the [`ReplySURB`] will take after serialization. /// Useful for deserialization from a bytes stream. pub fn serialized_len(mix_hops: u8) -> usize { - use nymsphinx_types::{HEADER_SIZE, NODE_ADDRESS_LENGTH, PAYLOAD_KEY_SIZE}; + use nym_sphinx_types::{HEADER_SIZE, NODE_ADDRESS_LENGTH, PAYLOAD_KEY_SIZE}; // the SURB itself consists of SURB_header, first hop address and set of payload keys // (note extra 1 for the gateway) diff --git a/common/nymsphinx/anonymous-replies/src/requests.rs b/common/nymsphinx/anonymous-replies/src/requests.rs index 686f65aa79..a812474632 100644 --- a/common/nymsphinx/anonymous-replies/src/requests.rs +++ b/common/nymsphinx/anonymous-replies/src/requests.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ReplySurb, ReplySurbError}; -use nymsphinx_addressing::clients::{Recipient, RecipientFormattingError}; +use nym_sphinx_addressing::clients::{Recipient, RecipientFormattingError}; use rand::{CryptoRng, RngCore}; use std::fmt::{Display, Formatter}; use std::mem; diff --git a/common/nymsphinx/chunking/Cargo.toml b/common/nymsphinx/chunking/Cargo.toml index 42b0bfdf7d..580ffd9097 100644 --- a/common/nymsphinx/chunking/Cargo.toml +++ b/common/nymsphinx/chunking/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-chunking" +name = "nym-sphinx-chunking" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -11,6 +11,6 @@ log = { workspace = true } rand = { version = "0.7.3", features = ["wasm-bindgen"] } thiserror = "1.0.37" -nymsphinx-addressing = { path = "../addressing" } -nymsphinx-params = { path = "../params" } -nymsphinx-types = { path = "../types" } +nym-sphinx-addressing = { path = "../addressing" } +nym-sphinx-params = { path = "../params" } +nym-sphinx-types = { path = "../types" } diff --git a/common/nymsphinx/chunking/src/fragment.rs b/common/nymsphinx/chunking/src/fragment.rs index 8d909982eb..7cc2d2c0e7 100644 --- a/common/nymsphinx/chunking/src/fragment.rs +++ b/common/nymsphinx/chunking/src/fragment.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::ChunkingError; -use nymsphinx_params::{SerializedFragmentIdentifier, FRAG_ID_LEN}; +use nym_sphinx_params::{SerializedFragmentIdentifier, FRAG_ID_LEN}; use std::convert::TryInto; use std::fmt::{self, Debug, Formatter}; @@ -461,7 +461,7 @@ impl FragmentHeader { #[cfg(test)] mod fragment_tests { use super::*; - use nymsphinx_params::packet_sizes::PacketSize; + use nym_sphinx_params::packet_sizes::PacketSize; use rand::{thread_rng, RngCore}; fn max_plaintext_size() -> usize { diff --git a/common/nymsphinx/chunking/src/lib.rs b/common/nymsphinx/chunking/src/lib.rs index 60316edb15..673181f773 100644 --- a/common/nymsphinx/chunking/src/lib.rs +++ b/common/nymsphinx/chunking/src/lib.rs @@ -137,8 +137,8 @@ pub fn number_of_required_fragments( mod tests { use super::*; use crate::set::{max_one_way_linked_set_payload_length, two_way_linked_set_payload_length}; - use nymsphinx_addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; - use nymsphinx_params::packet_sizes::PacketSize; + use nym_sphinx_addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; + use nym_sphinx_params::packet_sizes::PacketSize; #[test] fn calculating_number_of_required_fragments() { diff --git a/common/nymsphinx/chunking/src/set.rs b/common/nymsphinx/chunking/src/set.rs index 47e6b947c6..82af761b73 100644 --- a/common/nymsphinx/chunking/src/set.rs +++ b/common/nymsphinx/chunking/src/set.rs @@ -297,7 +297,7 @@ pub fn split_into_sets( #[cfg(test)] mod tests { use super::*; - use nymsphinx_params::packet_sizes::PacketSize; + use nym_sphinx_params::packet_sizes::PacketSize; fn max_plaintext_size() -> usize { PacketSize::default().plaintext_size() - PacketSize::AckPacket.size() diff --git a/common/nymsphinx/cover/Cargo.toml b/common/nymsphinx/cover/Cargo.toml index 88daa7e879..3677b8f8e3 100644 --- a/common/nymsphinx/cover/Cargo.toml +++ b/common/nymsphinx/cover/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-cover" +name = "nym-sphinx-cover" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -11,10 +11,10 @@ rand = { version = "0.7.3", features = ["wasm-bindgen"] } thiserror = "1.0.37" nym-crypto = { path = "../../crypto" } -nymsphinx-acknowledgements = { path = "../acknowledgements" } -nymsphinx-addressing = { path = "../addressing" } -nymsphinx-chunking = { path = "../chunking" } -nymsphinx-params = { path = "../params" } -nymsphinx-forwarding = { path = "../forwarding" } -nymsphinx-types = { path = "../types" } +nym-sphinx-acknowledgements = { path = "../acknowledgements" } +nym-sphinx-addressing = { path = "../addressing" } +nym-sphinx-chunking = { path = "../chunking" } +nym-sphinx-params = { path = "../params" } +nym-sphinx-forwarding = { path = "../forwarding" } +nym-sphinx-types = { path = "../types" } topology = { path = "../../topology" } diff --git a/common/nymsphinx/cover/src/lib.rs b/common/nymsphinx/cover/src/lib.rs index 746521ee71..8a046b38a9 100644 --- a/common/nymsphinx/cover/src/lib.rs +++ b/common/nymsphinx/cover/src/lib.rs @@ -3,18 +3,18 @@ use nym_crypto::shared_key::new_ephemeral_shared_key; use nym_crypto::symmetric::stream_cipher; -use nymsphinx_acknowledgements::surb_ack::SurbAck; -use nymsphinx_acknowledgements::AckKey; -use nymsphinx_addressing::clients::Recipient; -use nymsphinx_addressing::nodes::NymNodeRoutingAddress; -use nymsphinx_chunking::fragment::COVER_FRAG_ID; -use nymsphinx_forwarding::packet::MixPacket; -use nymsphinx_params::packet_sizes::PacketSize; -use nymsphinx_params::{ +use nym_sphinx_acknowledgements::surb_ack::SurbAck; +use nym_sphinx_acknowledgements::AckKey; +use nym_sphinx_addressing::clients::Recipient; +use nym_sphinx_addressing::nodes::NymNodeRoutingAddress; +use nym_sphinx_chunking::fragment::COVER_FRAG_ID; +use nym_sphinx_forwarding::packet::MixPacket; +use nym_sphinx_params::packet_sizes::PacketSize; +use nym_sphinx_params::{ PacketEncryptionAlgorithm, PacketHkdfAlgorithm, PacketMode, DEFAULT_NUM_MIX_HOPS, }; -use nymsphinx_types::builder::SphinxPacketBuilder; -use nymsphinx_types::{delays, Error as SphinxError}; +use nym_sphinx_types::builder::SphinxPacketBuilder; +use nym_sphinx_types::{delays, Error as SphinxError}; use rand::{CryptoRng, RngCore}; use std::convert::TryFrom; use std::time; diff --git a/common/nymsphinx/forwarding/Cargo.toml b/common/nymsphinx/forwarding/Cargo.toml index 6b29d9f9e5..9eb8959a23 100644 --- a/common/nymsphinx/forwarding/Cargo.toml +++ b/common/nymsphinx/forwarding/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-forwarding" +name = "nym-sphinx-forwarding" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -7,6 +7,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -nymsphinx-addressing = { path = "../addressing" } -nymsphinx-params = { path = "../params" } -nymsphinx-types = { path = "../types" } +nym-sphinx-addressing = { path = "../addressing" } +nym-sphinx-params = { path = "../params" } +nym-sphinx-types = { path = "../types" } diff --git a/common/nymsphinx/forwarding/src/packet.rs b/common/nymsphinx/forwarding/src/packet.rs index 8c22b43f5c..024b80b005 100644 --- a/common/nymsphinx/forwarding/src/packet.rs +++ b/common/nymsphinx/forwarding/src/packet.rs @@ -1,9 +1,9 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use nymsphinx_addressing::nodes::{NymNodeRoutingAddress, NymNodeRoutingAddressError}; -use nymsphinx_params::{PacketMode, PacketSize}; -use nymsphinx_types::SphinxPacket; +use nym_sphinx_addressing::nodes::{NymNodeRoutingAddress, NymNodeRoutingAddressError}; +use nym_sphinx_params::{PacketMode, PacketSize}; +use nym_sphinx_types::SphinxPacket; use std::convert::TryFrom; use std::fmt::{self, Debug, Display, Formatter}; diff --git a/common/nymsphinx/framing/Cargo.toml b/common/nymsphinx/framing/Cargo.toml index 6652d8faf8..9060d3ef1c 100644 --- a/common/nymsphinx/framing/Cargo.toml +++ b/common/nymsphinx/framing/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-framing" +name = "nym-sphinx-framing" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -11,5 +11,5 @@ bytes = "1.0" tokio-util = { version = "0.7.4", features = ["codec"] } thiserror = "1.0.37" -nymsphinx-types = { path = "../types" } -nymsphinx-params = { path = "../params" } +nym-sphinx-types = { path = "../types" } +nym-sphinx-params = { path = "../params" } diff --git a/common/nymsphinx/framing/src/codec.rs b/common/nymsphinx/framing/src/codec.rs index f3986d2ece..1f427dc0d1 100644 --- a/common/nymsphinx/framing/src/codec.rs +++ b/common/nymsphinx/framing/src/codec.rs @@ -3,10 +3,10 @@ use crate::packet::{FramedSphinxPacket, Header}; use bytes::{Buf, BufMut, BytesMut}; -use nymsphinx_params::packet_modes::InvalidPacketMode; -use nymsphinx_params::packet_sizes::{InvalidPacketSize, PacketSize}; -use nymsphinx_types::Error as SphinxError; -use nymsphinx_types::SphinxPacket; +use nym_sphinx_params::packet_modes::InvalidPacketMode; +use nym_sphinx_params::packet_sizes::{InvalidPacketSize, PacketSize}; +use nym_sphinx_types::Error as SphinxError; +use nym_sphinx_types::SphinxPacket; use std::io; use thiserror::Error; use tokio_util::codec::{Decoder, Encoder}; @@ -128,8 +128,8 @@ impl Decoder for SphinxCodec { #[cfg(test)] mod packet_encoding { use super::*; - use nymsphinx_types::builder::SphinxPacketBuilder; - use nymsphinx_types::{ + use nym_sphinx_types::builder::SphinxPacketBuilder; + use nym_sphinx_types::{ crypto, Delay as SphinxDelay, Destination, DestinationAddressBytes, Node, NodeAddressBytes, DESTINATION_ADDRESS_LENGTH, IDENTIFIER_LENGTH, NODE_ADDRESS_LENGTH, }; @@ -189,8 +189,8 @@ mod packet_encoding { #[cfg(test)] mod decode_will_allocate_enough_bytes_for_next_call { use super::*; - use nymsphinx_params::packet_version::PacketVersion; - use nymsphinx_params::PacketMode; + use nym_sphinx_params::packet_version::PacketVersion; + use nym_sphinx_params::PacketMode; #[test] fn for_empty_bytes() { diff --git a/common/nymsphinx/framing/src/packet.rs b/common/nymsphinx/framing/src/packet.rs index 997f2e6c35..e001083d31 100644 --- a/common/nymsphinx/framing/src/packet.rs +++ b/common/nymsphinx/framing/src/packet.rs @@ -3,10 +3,10 @@ use crate::codec::SphinxCodecError; use bytes::{BufMut, BytesMut}; -use nymsphinx_params::packet_sizes::PacketSize; -use nymsphinx_params::packet_version::PacketVersion; -use nymsphinx_params::PacketMode; -use nymsphinx_types::SphinxPacket; +use nym_sphinx_params::packet_sizes::PacketSize; +use nym_sphinx_params::packet_version::PacketVersion; +use nym_sphinx_params::PacketMode; +use nym_sphinx_types::SphinxPacket; use std::convert::TryFrom; pub struct FramedSphinxPacket { diff --git a/common/nymsphinx/params/Cargo.toml b/common/nymsphinx/params/Cargo.toml index 4956991730..bb63c0c94f 100644 --- a/common/nymsphinx/params/Cargo.toml +++ b/common/nymsphinx/params/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-params" +name = "nym-sphinx-params" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -10,4 +10,4 @@ edition = "2021" thiserror = "1.0.37" nym-crypto = { path = "../../crypto", features = ["hashing", "symmetric"] } -nymsphinx-types = { path = "../types" } +nym-sphinx-types = { path = "../types" } diff --git a/common/nymsphinx/params/src/packet_sizes.rs b/common/nymsphinx/params/src/packet_sizes.rs index 63cdc1eaa2..5b1bdb6bae 100644 --- a/common/nymsphinx/params/src/packet_sizes.rs +++ b/common/nymsphinx/params/src/packet_sizes.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use crate::FRAG_ID_LEN; -use nymsphinx_types::header::HEADER_SIZE; -use nymsphinx_types::PAYLOAD_OVERHEAD_SIZE; +use nym_sphinx_types::header::HEADER_SIZE; +use nym_sphinx_types::PAYLOAD_OVERHEAD_SIZE; use std::convert::TryFrom; use std::str::FromStr; use thiserror::Error; diff --git a/common/nymsphinx/src/lib.rs b/common/nymsphinx/src/lib.rs index bbc69c2682..a9e2d376e4 100644 --- a/common/nymsphinx/src/lib.rs +++ b/common/nymsphinx/src/lib.rs @@ -7,16 +7,16 @@ pub mod receiver; pub mod utils; // re-export sub-crates -pub use nymsphinx_acknowledgements as acknowledgements; -pub use nymsphinx_addressing as addressing; -pub use nymsphinx_anonymous_replies as anonymous_replies; -pub use nymsphinx_chunking as chunking; -pub use nymsphinx_cover as cover; -pub use nymsphinx_forwarding as forwarding; +pub use nym_sphinx_acknowledgements as acknowledgements; +pub use nym_sphinx_addressing as addressing; +pub use nym_sphinx_anonymous_replies as anonymous_replies; +pub use nym_sphinx_chunking as chunking; +pub use nym_sphinx_cover as cover; +pub use nym_sphinx_forwarding as forwarding; #[cfg(not(target_arch = "wasm32"))] -pub use nymsphinx_framing as framing; -pub use nymsphinx_params as params; -pub use nymsphinx_types::*; +pub use nym_sphinx_framing as framing; +pub use nym_sphinx_params as params; +pub use nym_sphinx_types::*; // TEMP UNTIL FURTHER REFACTORING pub use preparer::payload::NymsphinxPayloadBuilder; diff --git a/common/nymsphinx/src/message.rs b/common/nymsphinx/src/message.rs index 86cfecea59..7182e5e254 100644 --- a/common/nymsphinx/src/message.rs +++ b/common/nymsphinx/src/message.rs @@ -4,14 +4,14 @@ use crate::chunking; use nym_crypto::asymmetric::encryption; use nym_crypto::Digest; -use nymsphinx_addressing::clients::Recipient; -use nymsphinx_addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; -use nymsphinx_anonymous_replies::requests::{ +use nym_sphinx_addressing::clients::Recipient; +use nym_sphinx_addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; +use nym_sphinx_anonymous_replies::requests::{ InvalidReplyRequestError, RepliableMessage, RepliableMessageContent, ReplyMessage, ReplyMessageContent, }; -use nymsphinx_chunking::fragment::Fragment; -use nymsphinx_params::{PacketSize, ReplySurbKeyDigestAlgorithm}; +use nym_sphinx_chunking::fragment::Fragment; +use nym_sphinx_params::{PacketSize, ReplySurbKeyDigestAlgorithm}; use rand::Rng; use std::fmt::{Display, Formatter}; use thiserror::Error; diff --git a/common/nymsphinx/src/preparer/mod.rs b/common/nymsphinx/src/preparer/mod.rs index 19f68e30bc..cc4c4bb026 100644 --- a/common/nymsphinx/src/preparer/mod.rs +++ b/common/nymsphinx/src/preparer/mod.rs @@ -3,17 +3,17 @@ use crate::message::NymMessage; use crate::NymsphinxPayloadBuilder; -use nymsphinx_acknowledgements::surb_ack::SurbAck; -use nymsphinx_acknowledgements::AckKey; -use nymsphinx_addressing::clients::Recipient; -use nymsphinx_addressing::nodes::NymNodeRoutingAddress; -use nymsphinx_anonymous_replies::reply_surb::ReplySurb; -use nymsphinx_chunking::fragment::{Fragment, FragmentIdentifier}; -use nymsphinx_forwarding::packet::MixPacket; -use nymsphinx_params::packet_sizes::PacketSize; -use nymsphinx_params::DEFAULT_NUM_MIX_HOPS; -use nymsphinx_types::builder::SphinxPacketBuilder; -use nymsphinx_types::{delays, Delay}; +use nym_sphinx_acknowledgements::surb_ack::SurbAck; +use nym_sphinx_acknowledgements::AckKey; +use nym_sphinx_addressing::clients::Recipient; +use nym_sphinx_addressing::nodes::NymNodeRoutingAddress; +use nym_sphinx_anonymous_replies::reply_surb::ReplySurb; +use nym_sphinx_chunking::fragment::{Fragment, FragmentIdentifier}; +use nym_sphinx_forwarding::packet::MixPacket; +use nym_sphinx_params::packet_sizes::PacketSize; +use nym_sphinx_params::DEFAULT_NUM_MIX_HOPS; +use nym_sphinx_types::builder::SphinxPacketBuilder; +use nym_sphinx_types::{delays, Delay}; use rand::{CryptoRng, Rng}; use std::convert::TryFrom; use std::time::Duration; diff --git a/common/nymsphinx/src/preparer/payload.rs b/common/nymsphinx/src/preparer/payload.rs index 41eb2b4c4c..60786d3f11 100644 --- a/common/nymsphinx/src/preparer/payload.rs +++ b/common/nymsphinx/src/preparer/payload.rs @@ -6,10 +6,10 @@ use nym_crypto::asymmetric::encryption; use nym_crypto::shared_key::new_ephemeral_shared_key; use nym_crypto::symmetric::stream_cipher; use nym_crypto::symmetric::stream_cipher::CipherKey; -use nymsphinx_acknowledgements::surb_ack::SurbAck; -use nymsphinx_anonymous_replies::SurbEncryptionKey; -use nymsphinx_chunking::fragment::Fragment; -use nymsphinx_params::{ +use nym_sphinx_acknowledgements::surb_ack::SurbAck; +use nym_sphinx_anonymous_replies::SurbEncryptionKey; +use nym_sphinx_chunking::fragment::Fragment; +use nym_sphinx_params::{ PacketEncryptionAlgorithm, PacketHkdfAlgorithm, ReplySurbEncryptionAlgorithm, }; use rand::{CryptoRng, RngCore}; diff --git a/common/nymsphinx/src/receiver.rs b/common/nymsphinx/src/receiver.rs index 6656a23c31..5651f98216 100644 --- a/common/nymsphinx/src/receiver.rs +++ b/common/nymsphinx/src/receiver.rs @@ -7,12 +7,12 @@ use nym_crypto::asymmetric::encryption; use nym_crypto::shared_key::recompute_shared_key; use nym_crypto::symmetric::stream_cipher; use nym_crypto::symmetric::stream_cipher::CipherKey; -use nymsphinx_anonymous_replies::requests::AnonymousSenderTag; -use nymsphinx_anonymous_replies::SurbEncryptionKey; -use nymsphinx_chunking::fragment::Fragment; -use nymsphinx_chunking::reconstruction::MessageReconstructor; -use nymsphinx_chunking::ChunkingError; -use nymsphinx_params::{ +use nym_sphinx_anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx_anonymous_replies::SurbEncryptionKey; +use nym_sphinx_chunking::fragment::Fragment; +use nym_sphinx_chunking::reconstruction::MessageReconstructor; +use nym_sphinx_chunking::ChunkingError; +use nym_sphinx_params::{ PacketEncryptionAlgorithm, PacketHkdfAlgorithm, ReplySurbEncryptionAlgorithm, DEFAULT_NUM_MIX_HOPS, }; diff --git a/common/nymsphinx/types/Cargo.toml b/common/nymsphinx/types/Cargo.toml index 353de2b1b2..a51281c5de 100644 --- a/common/nymsphinx/types/Cargo.toml +++ b/common/nymsphinx/types/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nymsphinx-types" +name = "nym-sphinx-types" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" diff --git a/common/socks5/requests/Cargo.toml b/common/socks5/requests/Cargo.toml index f8bb8336ca..f879221078 100644 --- a/common/socks5/requests/Cargo.toml +++ b/common/socks5/requests/Cargo.toml @@ -11,5 +11,5 @@ thiserror = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } -nymsphinx-addressing = { path = "../../../common/nymsphinx/addressing" } +nym-sphinx-addressing = { path = "../../../common/nymsphinx/addressing" } service-providers-common = { path = "../../../service-providers/common" } diff --git a/common/socks5/requests/src/request.rs b/common/socks5/requests/src/request.rs index 39857c2a26..867cbfa786 100644 --- a/common/socks5/requests/src/request.rs +++ b/common/socks5/requests/src/request.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{Socks5ProtocolVersion, Socks5RequestError, Socks5Response}; -use nymsphinx_addressing::clients::{Recipient, RecipientFormattingError}; +use nym_sphinx_addressing::clients::{Recipient, RecipientFormattingError}; use service_providers_common::interface::{Serializable, ServiceProviderRequest}; use std::convert::TryFrom; use thiserror::Error; diff --git a/common/topology/Cargo.toml b/common/topology/Cargo.toml index c0147bb03f..9d0eba1d5c 100644 --- a/common/topology/Cargo.toml +++ b/common/topology/Cargo.toml @@ -15,6 +15,6 @@ thiserror = "1.0.37" ## internal nym-crypto = { path = "../crypto" } nym-mixnet-contract-common = { path = "../cosmwasm-smart-contracts/mixnet-contract" } -nymsphinx-addressing = { path = "../nymsphinx/addressing" } -nymsphinx-types = { path = "../nymsphinx/types" } +nym-sphinx-addressing = { path = "../nymsphinx/addressing" } +nym-sphinx-types = { path = "../nymsphinx/types" } version-checker = { path = "../version-checker" } diff --git a/common/topology/src/gateway.rs b/common/topology/src/gateway.rs index 40b217b714..8a2a424925 100644 --- a/common/topology/src/gateway.rs +++ b/common/topology/src/gateway.rs @@ -4,8 +4,8 @@ use crate::{filter, NetworkAddress}; use nym_crypto::asymmetric::{encryption, identity}; use nym_mixnet_contract_common::GatewayBond; -use nymsphinx_addressing::nodes::{NodeIdentity, NymNodeRoutingAddress}; -use nymsphinx_types::Node as SphinxNode; +use nym_sphinx_addressing::nodes::{NodeIdentity, NymNodeRoutingAddress}; +use nym_sphinx_types::Node as SphinxNode; use std::convert::{TryFrom, TryInto}; use std::fmt; use std::io; diff --git a/common/topology/src/lib.rs b/common/topology/src/lib.rs index 7bd511e72b..54e41199e0 100644 --- a/common/topology/src/lib.rs +++ b/common/topology/src/lib.rs @@ -5,8 +5,8 @@ use crate::filter::VersionFilterable; use log::warn; use nym_mixnet_contract_common::mixnode::MixNodeDetails; use nym_mixnet_contract_common::GatewayBond; -use nymsphinx_addressing::nodes::NodeIdentity; -use nymsphinx_types::Node as SphinxNode; +use nym_sphinx_addressing::nodes::NodeIdentity; +use nym_sphinx_types::Node as SphinxNode; use rand::Rng; use std::collections::HashMap; use std::convert::TryInto; diff --git a/common/topology/src/mix.rs b/common/topology/src/mix.rs index f8756f4e55..c03e9d9978 100644 --- a/common/topology/src/mix.rs +++ b/common/topology/src/mix.rs @@ -4,8 +4,8 @@ use crate::{filter, NetworkAddress}; use nym_crypto::asymmetric::{encryption, identity}; use nym_mixnet_contract_common::{Layer, MixId, MixNodeBond}; -use nymsphinx_addressing::nodes::NymNodeRoutingAddress; -use nymsphinx_types::Node as SphinxNode; +use nym_sphinx_addressing::nodes::NymNodeRoutingAddress; +use nym_sphinx_types::Node as SphinxNode; use std::convert::{TryFrom, TryInto}; use std::io; use std::net::SocketAddr; diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 66d94cd1e8..28ed60d52c 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -63,7 +63,7 @@ gateway-requests = { path = "gateway-requests" } mixnet-client = { path = "../common/client-libs/mixnet-client" } mixnode-common = { path = "../common/mixnode-common" } network-defaults = { path = "../common/network-defaults" } -nymsphinx = { path = "../common/nymsphinx" } +nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } statistics-common = { path = "../common/statistics" } nym-api-requests = { path = "../nym-api/nym-api-requests" } diff --git a/gateway/gateway-requests/Cargo.toml b/gateway/gateway-requests/Cargo.toml index 0b2377c016..714f7f446d 100644 --- a/gateway/gateway-requests/Cargo.toml +++ b/gateway/gateway-requests/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" bs58 = "0.4.0" futures = "0.3.15" log = { workspace = true } -nymsphinx = { path = "../../common/nymsphinx" } +nym-sphinx = { path = "../../common/nymsphinx" } rand = { version = "0.7.3", features = ["wasm-bindgen"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/gateway/gateway-requests/src/authentication/encrypted_address.rs b/gateway/gateway-requests/src/authentication/encrypted_address.rs index c7015fe77d..2d94520ac1 100644 --- a/gateway/gateway-requests/src/authentication/encrypted_address.rs +++ b/gateway/gateway-requests/src/authentication/encrypted_address.rs @@ -4,8 +4,8 @@ use crate::iv::IV; use crate::registration::handshake::shared_key::SharedKeys; use nym_crypto::symmetric::stream_cipher; -use nymsphinx::params::GatewayEncryptionAlgorithm; -use nymsphinx::{DestinationAddressBytes, DESTINATION_ADDRESS_LENGTH}; +use nym_sphinx::params::GatewayEncryptionAlgorithm; +use nym_sphinx::{DestinationAddressBytes, DESTINATION_ADDRESS_LENGTH}; use thiserror::Error; pub const ENCRYPTED_ADDRESS_SIZE: usize = DESTINATION_ADDRESS_LENGTH; diff --git a/gateway/gateway-requests/src/iv.rs b/gateway/gateway-requests/src/iv.rs index 2240a393c9..d7ab8d1c19 100644 --- a/gateway/gateway-requests/src/iv.rs +++ b/gateway/gateway-requests/src/iv.rs @@ -3,7 +3,7 @@ use nym_crypto::generic_array::{typenum::Unsigned, GenericArray}; use nym_crypto::symmetric::stream_cipher::{random_iv, IvSizeUser, IV as CryptoIV}; -use nymsphinx::params::GatewayEncryptionAlgorithm; +use nym_sphinx::params::GatewayEncryptionAlgorithm; use rand::{CryptoRng, RngCore}; use thiserror::Error; diff --git a/gateway/gateway-requests/src/lib.rs b/gateway/gateway-requests/src/lib.rs index 345da1bbeb..a2404d6c4b 100644 --- a/gateway/gateway-requests/src/lib.rs +++ b/gateway/gateway-requests/src/lib.rs @@ -4,7 +4,7 @@ pub use nym_crypto::generic_array; use nym_crypto::hmac::HmacOutput; use nym_crypto::OutputSizeUser; -use nymsphinx::params::GatewayIntegrityHmacAlgorithm; +use nym_sphinx::params::GatewayIntegrityHmacAlgorithm; pub use types::*; pub mod authentication; diff --git a/gateway/gateway-requests/src/registration/handshake/shared_key.rs b/gateway/gateway-requests/src/registration/handshake/shared_key.rs index cea60afb1d..2f56c0ac97 100644 --- a/gateway/gateway-requests/src/registration/handshake/shared_key.rs +++ b/gateway/gateway-requests/src/registration/handshake/shared_key.rs @@ -9,7 +9,7 @@ use nym_crypto::generic_array::{ use nym_crypto::hmac::{compute_keyed_hmac, recompute_keyed_hmac_and_verify_tag}; use nym_crypto::symmetric::stream_cipher::{self, CipherKey, KeySizeUser, IV}; use nym_pemstore::traits::PemStorableKey; -use nymsphinx::params::{GatewayEncryptionAlgorithm, GatewayIntegrityHmacAlgorithm}; +use nym_sphinx::params::{GatewayEncryptionAlgorithm, GatewayIntegrityHmacAlgorithm}; use thiserror::Error; // shared key is as long as the encryption key and the MAC key combined. diff --git a/gateway/gateway-requests/src/registration/handshake/state.rs b/gateway/gateway-requests/src/registration/handshake/state.rs index c85c0fd3c5..97f88c570a 100644 --- a/gateway/gateway-requests/src/registration/handshake/state.rs +++ b/gateway/gateway-requests/src/registration/handshake/state.rs @@ -13,7 +13,7 @@ use nym_crypto::{ hkdf, symmetric::stream_cipher, }; -use nymsphinx::params::{GatewayEncryptionAlgorithm, GatewaySharedKeyHkdfAlgorithm}; +use nym_sphinx::params::{GatewayEncryptionAlgorithm, GatewaySharedKeyHkdfAlgorithm}; use rand::{CryptoRng, RngCore}; use std::convert::{TryFrom, TryInto}; use tungstenite::Message as WsMessage; diff --git a/gateway/gateway-requests/src/types.rs b/gateway/gateway-requests/src/types.rs index 00631e1f49..4f2e2735d0 100644 --- a/gateway/gateway-requests/src/types.rs +++ b/gateway/gateway-requests/src/types.rs @@ -9,11 +9,11 @@ use coconut_interface::Credential; use nym_crypto::generic_array::typenum::Unsigned; use nym_crypto::hmac::recompute_keyed_hmac_and_verify_tag; use nym_crypto::symmetric::stream_cipher; -use nymsphinx::addressing::nodes::NymNodeRoutingAddressError; -use nymsphinx::forwarding::packet::{MixPacket, MixPacketFormattingError}; -use nymsphinx::params::packet_sizes::PacketSize; -use nymsphinx::params::{GatewayEncryptionAlgorithm, GatewayIntegrityHmacAlgorithm}; -use nymsphinx::DestinationAddressBytes; +use nym_sphinx::addressing::nodes::NymNodeRoutingAddressError; +use nym_sphinx::forwarding::packet::{MixPacket, MixPacketFormattingError}; +use nym_sphinx::params::packet_sizes::PacketSize; +use nym_sphinx::params::{GatewayEncryptionAlgorithm, GatewayIntegrityHmacAlgorithm}; +use nym_sphinx::DestinationAddressBytes; use serde::{Deserialize, Serialize}; use std::{ convert::{TryFrom, TryInto}, diff --git a/gateway/src/node/client_handling/active_clients.rs b/gateway/src/node/client_handling/active_clients.rs index 7eeefd2a65..d2de2cc5b5 100644 --- a/gateway/src/node/client_handling/active_clients.rs +++ b/gateway/src/node/client_handling/active_clients.rs @@ -3,7 +3,7 @@ use crate::node::client_handling::websocket::message_receiver::MixMessageSender; use dashmap::DashMap; -use nymsphinx::DestinationAddressBytes; +use nym_sphinx::DestinationAddressBytes; use std::sync::Arc; #[derive(Clone)] diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index a86e89073a..a5a69e9980 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -10,7 +10,7 @@ use gateway_requests::iv::IVConversionError; use gateway_requests::types::{BinaryRequest, ServerResponse}; use gateway_requests::{ClientControlRequest, GatewayRequestsError}; use log::*; -use nymsphinx::forwarding::packet::MixPacket; +use nym_sphinx::forwarding::packet::MixPacket; use rand::{CryptoRng, Rng}; use std::convert::TryFrom; use std::process; diff --git a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs index 96aa1bdcf3..9347f72cf5 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs @@ -20,7 +20,7 @@ use gateway_requests::{BinaryResponse, PROTOCOL_VERSION}; use log::*; use mixnet_client::forwarder::MixForwardingSender; use nym_crypto::asymmetric::identity; -use nymsphinx::DestinationAddressBytes; +use nym_sphinx::DestinationAddressBytes; use rand::{CryptoRng, Rng}; use std::convert::TryFrom; use std::sync::Arc; diff --git a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs index 7c42fee2b2..b11a8f21eb 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs @@ -5,7 +5,7 @@ use crate::node::storage::Storage; use gateway_requests::registration::handshake::SharedKeys; use gateway_requests::ServerResponse; use log::{trace, warn}; -use nymsphinx::DestinationAddressBytes; +use nym_sphinx::DestinationAddressBytes; use rand::{CryptoRng, Rng}; use task::TaskClient; use tokio::io::{AsyncRead, AsyncWrite}; diff --git a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs index 34d9808040..14c9725adc 100644 --- a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs +++ b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs @@ -10,10 +10,10 @@ use futures::StreamExt; use log::*; use mixnet_client::forwarder::MixForwardingSender; use mixnode_common::packet_processor::processor::ProcessedFinalHop; -use nymsphinx::forwarding::packet::MixPacket; -use nymsphinx::framing::codec::SphinxCodec; -use nymsphinx::framing::packet::FramedSphinxPacket; -use nymsphinx::DestinationAddressBytes; +use nym_sphinx::forwarding::packet::MixPacket; +use nym_sphinx::framing::codec::SphinxCodec; +use nym_sphinx::framing::packet::FramedSphinxPacket; +use nym_sphinx::DestinationAddressBytes; use std::collections::HashMap; use std::net::SocketAddr; use task::TaskClient; diff --git a/gateway/src/node/mixnet_handling/receiver/packet_processing.rs b/gateway/src/node/mixnet_handling/receiver/packet_processing.rs index 608627f91f..e82014818f 100644 --- a/gateway/src/node/mixnet_handling/receiver/packet_processing.rs +++ b/gateway/src/node/mixnet_handling/receiver/packet_processing.rs @@ -5,7 +5,7 @@ use mixnode_common::packet_processor::error::MixProcessingError; pub use mixnode_common::packet_processor::processor::MixProcessingResult; use mixnode_common::packet_processor::processor::{ProcessedFinalHop, SphinxPacketProcessor}; use nym_crypto::asymmetric::encryption; -use nymsphinx::framing::packet::FramedSphinxPacket; +use nym_sphinx::framing::packet::FramedSphinxPacket; use thiserror::Error; #[derive(Error, Debug)] diff --git a/gateway/src/node/storage/mod.rs b/gateway/src/node/storage/mod.rs index cbb7c27f90..94e5b0c5dc 100644 --- a/gateway/src/node/storage/mod.rs +++ b/gateway/src/node/storage/mod.rs @@ -9,7 +9,7 @@ use crate::node::storage::shared_keys::SharedKeysManager; use async_trait::async_trait; use gateway_requests::registration::handshake::SharedKeys; use log::{debug, error}; -use nymsphinx::DestinationAddressBytes; +use nym_sphinx::DestinationAddressBytes; use sqlx::ConnectOptions; use std::path::Path; diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 13f098a51c..51ecfaffce 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -48,7 +48,7 @@ logging = { path="../common/logging" } mixnet-client = { path="../common/client-libs/mixnet-client" } mixnode-common = { path="../common/mixnode-common" } nonexhaustive-delayqueue = { path="../common/nonexhaustive-delayqueue" } -nymsphinx = { path="../common/nymsphinx" } +nym-sphinx = { path="../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore", version = "0.1.0" } task = { path = "../common/task" } nym-types = { path = "../common/types" } @@ -59,5 +59,5 @@ version-checker = { path="../common/version-checker" } [dev-dependencies] tokio = { version="1.21.2", features = ["rt-multi-thread", "net", "signal", "test-util"] } -nymsphinx-types = { path = "../common/nymsphinx/types" } -nymsphinx-params = { path = "../common/nymsphinx/params" } +nym-sphinx-types = { path = "../common/nymsphinx/types" } +nym-sphinx-params = { path = "../common/nymsphinx/params" } diff --git a/mixnode/src/node/listener/connection_handler/mod.rs b/mixnode/src/node/listener/connection_handler/mod.rs index d09a78db2b..af72f29620 100644 --- a/mixnode/src/node/listener/connection_handler/mod.rs +++ b/mixnode/src/node/listener/connection_handler/mod.rs @@ -8,10 +8,10 @@ use crate::node::packet_delayforwarder::PacketDelayForwardSender; use crate::node::TaskClient; use futures::StreamExt; use log::{error, info}; -use nymsphinx::forwarding::packet::MixPacket; -use nymsphinx::framing::codec::SphinxCodec; -use nymsphinx::framing::packet::FramedSphinxPacket; -use nymsphinx::Delay as SphinxDelay; +use nym_sphinx::forwarding::packet::MixPacket; +use nym_sphinx::framing::codec::SphinxCodec; +use nym_sphinx::framing::packet::FramedSphinxPacket; +use nym_sphinx::Delay as SphinxDelay; use std::net::SocketAddr; use tokio::net::TcpStream; use tokio::time::Instant; diff --git a/mixnode/src/node/listener/connection_handler/packet_processing.rs b/mixnode/src/node/listener/connection_handler/packet_processing.rs index d2794eeebb..06580031a9 100644 --- a/mixnode/src/node/listener/connection_handler/packet_processing.rs +++ b/mixnode/src/node/listener/connection_handler/packet_processing.rs @@ -6,7 +6,7 @@ use mixnode_common::packet_processor::error::MixProcessingError; pub use mixnode_common::packet_processor::processor::MixProcessingResult; use mixnode_common::packet_processor::processor::SphinxPacketProcessor; use nym_crypto::asymmetric::encryption; -use nymsphinx::framing::packet::FramedSphinxPacket; +use nym_sphinx::framing::packet::FramedSphinxPacket; // PacketProcessor contains all data required to correctly unwrap and forward sphinx packets #[derive(Clone)] diff --git a/mixnode/src/node/packet_delayforwarder.rs b/mixnode/src/node/packet_delayforwarder.rs index da098bcdf9..c4958f8708 100644 --- a/mixnode/src/node/packet_delayforwarder.rs +++ b/mixnode/src/node/packet_delayforwarder.rs @@ -5,7 +5,7 @@ use crate::node::node_statistics::UpdateSender; use futures::channel::mpsc; use futures::StreamExt; use nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue}; -use nymsphinx::forwarding::packet::MixPacket; +use nym_sphinx::forwarding::packet::MixPacket; use std::io; use tokio::time::Instant; @@ -136,11 +136,11 @@ mod tests { use task::TaskManager; - use nymsphinx::addressing::nodes::NymNodeRoutingAddress; - use nymsphinx_params::packet_sizes::PacketSize; - use nymsphinx_params::PacketMode; - use nymsphinx_types::builder::SphinxPacketBuilder; - use nymsphinx_types::{ + use nym_sphinx::addressing::nodes::NymNodeRoutingAddress; + use nym_sphinx_params::packet_sizes::PacketSize; + use nym_sphinx_params::PacketMode; + use nym_sphinx_types::builder::SphinxPacketBuilder; + use nym_sphinx_types::{ crypto, Delay as SphinxDelay, Destination, DestinationAddressBytes, Node, NodeAddressBytes, SphinxPacket, DESTINATION_ADDRESS_LENGTH, IDENTIFIER_LENGTH, NODE_ADDRESS_LENGTH, }; diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 9b34e00e01..feccd7bd42 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -85,7 +85,7 @@ nym-vesting-contract-common = { path = "../common/cosmwasm-smart-contracts/vesti nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common", features = ["dkg"] } multisig-contract-common = { path = "../common/cosmwasm-smart-contracts/multisig-contract" } nymcoconut = { path = "../common/nymcoconut" } -nymsphinx = { path = "../common/nymsphinx" } +nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } task = { path = "../common/task" } topology = { path = "../common/topology" } diff --git a/nym-api/src/network_monitor/chunker.rs b/nym-api/src/network_monitor/chunker.rs index 0caaba0811..02d5ba796b 100644 --- a/nym-api/src/network_monitor/chunker.rs +++ b/nym-api/src/network_monitor/chunker.rs @@ -1,9 +1,9 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use nymsphinx::forwarding::packet::MixPacket; -use nymsphinx::message::NymMessage; -use nymsphinx::{ +use nym_sphinx::forwarding::packet::MixPacket; +use nym_sphinx::message::NymMessage; +use nym_sphinx::{ acknowledgements::AckKey, addressing::clients::Recipient, preparer::MessagePreparer, }; use rand_07::rngs::OsRng; diff --git a/nym-api/src/network_monitor/monitor/preparer.rs b/nym-api/src/network_monitor/monitor/preparer.rs index 7393b5c303..81bd295a19 100644 --- a/nym-api/src/network_monitor/monitor/preparer.rs +++ b/nym-api/src/network_monitor/monitor/preparer.rs @@ -9,8 +9,8 @@ use crate::nym_contract_cache::cache::NymContractCache; use log::info; use nym_crypto::asymmetric::{encryption, identity}; use nym_mixnet_contract_common::{Addr, GatewayBond, Layer, MixId, MixNodeBond}; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::forwarding::packet::MixPacket; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::forwarding::packet::MixPacket; use rand::seq::SliceRandom; use rand::{thread_rng, Rng}; use std::collections::{HashMap, HashSet}; diff --git a/nym-api/src/network_monitor/monitor/processor.rs b/nym-api/src/network_monitor/monitor/processor.rs index 81a1ff1fcb..3ae082a143 100644 --- a/nym-api/src/network_monitor/monitor/processor.rs +++ b/nym-api/src/network_monitor/monitor/processor.rs @@ -9,7 +9,7 @@ use futures::lock::{Mutex, MutexGuard}; use futures::{SinkExt, StreamExt}; use log::warn; use nym_crypto::asymmetric::encryption; -use nymsphinx::receiver::{MessageReceiver, MessageRecoveryError}; +use nym_sphinx::receiver::{MessageReceiver, MessageRecoveryError}; use std::mem; use std::sync::Arc; use thiserror::Error; diff --git a/nym-api/src/network_monitor/monitor/sender.rs b/nym-api/src/network_monitor/monitor/sender.rs index 4cf6fc33ce..432dd122e0 100644 --- a/nym-api/src/network_monitor/monitor/sender.rs +++ b/nym-api/src/network_monitor/monitor/sender.rs @@ -16,7 +16,7 @@ use gateway_client::error::GatewayClientError; use gateway_client::{AcknowledgementReceiver, GatewayClient, MixnetMessageReceiver}; use log::{debug, info, trace, warn}; use nym_crypto::asymmetric::identity::{self, PUBLIC_KEY_LENGTH}; -use nymsphinx::forwarding::packet::MixPacket; +use nym_sphinx::forwarding::packet::MixPacket; use pin_project::pin_project; use std::mem; use std::num::NonZeroUsize; diff --git a/sdk/rust/nym-sdk/Cargo.toml b/sdk/rust/nym-sdk/Cargo.toml index 791828de4a..2fe416a829 100644 --- a/sdk/rust/nym-sdk/Cargo.toml +++ b/sdk/rust/nym-sdk/Cargo.toml @@ -12,7 +12,7 @@ nym-crypto = { path = "../../../common/crypto" } gateway-client = { path = "../../../common/client-libs/gateway-client" } gateway-requests = { path = "../../../gateway/gateway-requests" } network-defaults = { path = "../../../common/network-defaults" } -nymsphinx = { path = "../../../common/nymsphinx" } +nym-sphinx = { path = "../../../common/nymsphinx" } task = { path = "../../../common/task" } validator-client = { path = "../../../common/client-libs/validator-client", features = ["nyxd-client"] } diff --git a/sdk/rust/nym-sdk/src/mixnet.rs b/sdk/rust/nym-sdk/src/mixnet.rs index e79e75677a..5dafb6e94d 100644 --- a/sdk/rust/nym-sdk/src/mixnet.rs +++ b/sdk/rust/nym-sdk/src/mixnet.rs @@ -48,7 +48,7 @@ pub use client_core::{ }; pub use config::Config; pub use keys::{Keys, KeysArc}; -pub use nymsphinx::{ +pub use nym_sphinx::{ addressing::clients::{ClientIdentity, Recipient}, receiver::ReconstructedMessage, }; diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 0b7c633ebc..fc5b216c64 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -14,7 +14,7 @@ use client_core::{ config::{persistence::key_pathfinder::ClientKeyPathfinder, GatewayEndpointConfig}, }; use nym_crypto::asymmetric::identity; -use nymsphinx::{ +use nym_sphinx::{ addressing::clients::{ClientIdentity, Recipient}, receiver::ReconstructedMessage, }; diff --git a/sdk/rust/nym-sdk/src/mixnet/keys.rs b/sdk/rust/nym-sdk/src/mixnet/keys.rs index 74593410eb..350c673f73 100644 --- a/sdk/rust/nym-sdk/src/mixnet/keys.rs +++ b/sdk/rust/nym-sdk/src/mixnet/keys.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use client_core::client::key_manager::KeyManager; use gateway_requests::registration::handshake::SharedKeys; use nym_crypto::asymmetric::{encryption, identity}; -use nymsphinx::acknowledgements::AckKey; +use nym_sphinx::acknowledgements::AckKey; /// The set of keys used by the client. Identity, encryption and ack keys are generated at creating /// unless specified to loaded from storage or somehow explictly specified. The gateway shared key diff --git a/service-providers/common/Cargo.toml b/service-providers/common/Cargo.toml index e6787d2ee6..94c3bcc814 100644 --- a/service-providers/common/Cargo.toml +++ b/service-providers/common/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] build-information = { path = "../../common/build-information", features = ["serde"] } -nymsphinx-anonymous-replies = { path = "../../common/nymsphinx/anonymous-replies" } +nym-sphinx-anonymous-replies = { path = "../../common/nymsphinx/anonymous-replies" } async-trait = { workspace = true } log = { workspace = true } diff --git a/service-providers/common/src/lib.rs b/service-providers/common/src/lib.rs index 8331ea4775..5e1bba8943 100644 --- a/service-providers/common/src/lib.rs +++ b/service-providers/common/src/lib.rs @@ -6,7 +6,7 @@ use crate::interface::{ Request, RequestContent, Response, ResponseContent, ServiceProviderRequest, SupportedVersions, }; use async_trait::async_trait; -use nymsphinx_anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx_anonymous_replies::requests::AnonymousSenderTag; pub mod interface; diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 88d0b8ad41..ac47ca41d0 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -40,7 +40,7 @@ nym-crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} network-defaults = { path = "../../common/network-defaults" } nym-sdk = { path = "../../sdk/rust/nym-sdk" } -nymsphinx = { path = "../../common/nymsphinx" } +nym-sphinx = { path = "../../common/nymsphinx" } ordered-buffer = {path = "../../common/socks5/ordered-buffer"} proxy-helpers = { path = "../../common/socks5/proxy-helpers" } service-providers-common = { path = "../common" } diff --git a/service-providers/network-requester/src/cli/init.rs b/service-providers/network-requester/src/cli/init.rs index ee21450bec..fba12a7d1f 100644 --- a/service-providers/network-requester/src/cli/init.rs +++ b/service-providers/network-requester/src/cli/init.rs @@ -9,7 +9,7 @@ use crate::{ use clap::Args; use config::NymConfig; use nym_crypto::asymmetric::identity; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; use std::fmt::Display; use tap::TapFallible; diff --git a/service-providers/network-requester/src/cli/run.rs b/service-providers/network-requester/src/cli/run.rs index 98678fd910..0970c79975 100644 --- a/service-providers/network-requester/src/cli/run.rs +++ b/service-providers/network-requester/src/cli/run.rs @@ -8,7 +8,7 @@ use crate::{ }; use clap::Args; use config::NymConfig; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; const ENABLE_STATISTICS: &str = "enable-statistics"; diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index 5c4b7ca040..6dc0a7da00 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -13,8 +13,8 @@ use build_information::BinaryBuildInformation; use client_connections::LaneQueueLengths; use futures::channel::mpsc; use log::warn; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use proxy_helpers::connection_controller::{Controller, ControllerCommand, ControllerSender}; use proxy_helpers::proxy_runner::{MixProxyReader, MixProxySender}; use service_providers_common::interface::{ diff --git a/service-providers/network-requester/src/reply.rs b/service-providers/network-requester/src/reply.rs index a135c9b2e8..947951f06b 100644 --- a/service-providers/network-requester/src/reply.rs +++ b/service-providers/network-requester/src/reply.rs @@ -3,8 +3,8 @@ use client_connections::TransmissionLane; use nym_sdk::mixnet::InputMessage; -use nymsphinx::addressing::clients::Recipient; -use nymsphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_sphinx::addressing::clients::Recipient; +use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use service_providers_common::interface::{ ControlRequest, ControlResponse, ProviderInterfaceVersion, RequestVersion, }; diff --git a/service-providers/network-requester/src/statistics/collector.rs b/service-providers/network-requester/src/statistics/collector.rs index 05f14932d1..989ddc5e46 100644 --- a/service-providers/network-requester/src/statistics/collector.rs +++ b/service-providers/network-requester/src/statistics/collector.rs @@ -6,7 +6,7 @@ use crate::core::new_legacy_request_version; use crate::reply::MixnetMessage; use async_trait::async_trait; use log::*; -use nymsphinx::addressing::clients::Recipient; +use nym_sphinx::addressing::clients::Recipient; use ordered_buffer::OrderedMessageSender; use proxy_helpers::proxy_runner::MixProxySender; use rand::RngCore; From fede9cc194058596a1fe91af546260b583a39ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 20 Feb 2023 17:05:08 +0100 Subject: [PATCH 393/591] Add nym prefix to topology and version checker crates (#3061) * Rename crate to nym-topology * Rename crate to nym-version-checker * Remove unused topology * rustfmt --- Cargo.lock | 76 +++++++++---------- clients/client-core/Cargo.toml | 2 +- .../real_messages_control/message_handler.rs | 2 +- .../src/client/topology_control.rs | 2 +- clients/client-core/src/config/mod.rs | 4 +- clients/client-core/src/error.rs | 2 +- clients/client-core/src/init/helpers.rs | 2 +- clients/native/Cargo.toml | 4 +- clients/native/src/commands/run.rs | 2 +- clients/native/src/commands/upgrade.rs | 2 +- clients/socks5/Cargo.toml | 4 +- clients/socks5/src/commands/run.rs | 2 +- clients/socks5/src/commands/upgrade.rs | 2 +- clients/webassembly/Cargo.toml | 1 - common/mixnode-common/Cargo.toml | 2 +- common/mixnode-common/src/verloc/mod.rs | 9 ++- common/nymsphinx/Cargo.toml | 2 +- common/nymsphinx/acknowledgements/Cargo.toml | 2 +- .../acknowledgements/src/surb_ack.rs | 2 +- common/nymsphinx/anonymous-replies/Cargo.toml | 2 +- .../anonymous-replies/src/reply_surb.rs | 2 +- common/nymsphinx/cover/Cargo.toml | 2 +- common/nymsphinx/cover/src/lib.rs | 2 +- common/nymsphinx/src/preparer/mod.rs | 2 +- common/nymsphinx/src/receiver.rs | 2 +- common/topology/Cargo.toml | 4 +- common/topology/src/filter.rs | 2 +- common/version-checker/Cargo.toml | 2 +- gateway/Cargo.toml | 2 +- gateway/src/commands/mod.rs | 2 +- gateway/src/commands/upgrade.rs | 2 +- mixnode/Cargo.toml | 4 +- mixnode/src/commands/mod.rs | 2 +- mixnode/src/commands/upgrade.rs | 2 +- mixnode/src/node/mod.rs | 2 +- nym-api/Cargo.toml | 4 +- nym-api/src/network_monitor/chunker.rs | 2 +- .../src/network_monitor/monitor/preparer.rs | 2 +- nym-api/src/network_monitor/test_packet.rs | 2 +- nym-api/src/network_monitor/test_route/mod.rs | 2 +- nym-connect-android/src-tauri/Cargo.toml | 1 - nym-connect/src-tauri/Cargo.toml | 1 - .../network-requester/Cargo.toml | 2 +- .../network-requester/src/cli/run.rs | 2 +- 44 files changed, 89 insertions(+), 89 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d9a6d9980..d2cec6d7fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -710,6 +710,7 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-topology", "rand 0.7.3", "serde", "serde_json", @@ -721,7 +722,6 @@ dependencies = [ "time 0.3.17", "tokio", "tokio-stream", - "topology", "url", "validator-client", "wasm-bindgen", @@ -3194,6 +3194,7 @@ dependencies = [ "nym-sphinx-framing", "nym-sphinx-params", "nym-sphinx-types", + "nym-version-checker", "rand 0.8.5", "serde", "task", @@ -3202,7 +3203,6 @@ dependencies = [ "tokio-util", "url", "validator-client", - "version-checker", ] [[package]] @@ -3406,6 +3406,8 @@ dependencies = [ "nym-mixnet-contract-common", "nym-pemstore", "nym-sphinx", + "nym-topology", + "nym-version-checker", "nym-vesting-contract-common", "nymcoconut", "okapi", @@ -3427,11 +3429,9 @@ dependencies = [ "time 0.3.17", "tokio", "tokio-stream", - "topology", "ts-rs", "url", "validator-client", - "version-checker", ] [[package]] @@ -3546,6 +3546,8 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-topology", + "nym-version-checker", "pretty_env_logger", "rand 0.7.3", "serde", @@ -3555,10 +3557,8 @@ dependencies = [ "thiserror", "tokio", "tokio-tungstenite 0.14.0", - "topology", "url", "validator-client", - "version-checker", "websocket-requests", ] @@ -3633,6 +3633,7 @@ dependencies = [ "nym-pemstore", "nym-sphinx", "nym-types", + "nym-version-checker", "once_cell", "pretty_env_logger", "rand 0.7.3", @@ -3649,7 +3650,6 @@ dependencies = [ "tokio-util", "url", "validator-client", - "version-checker", ] [[package]] @@ -3699,7 +3699,9 @@ dependencies = [ "nym-sphinx", "nym-sphinx-params", "nym-sphinx-types", + "nym-topology", "nym-types", + "nym-version-checker", "pretty_env_logger", "rand 0.7.3", "rocket", @@ -3710,10 +3712,8 @@ dependencies = [ "tokio", "tokio-util", "toml", - "topology", "url", "validator-client", - "version-checker", ] [[package]] @@ -3737,6 +3737,7 @@ dependencies = [ "nym-crypto", "nym-sdk", "nym-sphinx", + "nym-version-checker", "ordered-buffer", "pretty_env_logger", "proxy-helpers", @@ -3754,7 +3755,6 @@ dependencies = [ "tokio", "tokio-tungstenite 0.17.2", "url", - "version-checker", "websocket-requests", ] @@ -3847,6 +3847,8 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-topology", + "nym-version-checker", "ordered-buffer", "pin-project", "pretty_env_logger", @@ -3860,10 +3862,8 @@ dependencies = [ "task", "thiserror", "tokio", - "topology", "url", "validator-client", - "version-checker", ] [[package]] @@ -3881,11 +3881,11 @@ dependencies = [ "nym-sphinx-framing", "nym-sphinx-params", "nym-sphinx-types", + "nym-topology", "rand 0.7.3", "rand_distr", "thiserror", "tokio", - "topology", ] [[package]] @@ -3897,9 +3897,9 @@ dependencies = [ "nym-sphinx-addressing", "nym-sphinx-params", "nym-sphinx-types", + "nym-topology", "rand 0.7.3", "thiserror", - "topology", ] [[package]] @@ -3922,10 +3922,10 @@ dependencies = [ "nym-sphinx-addressing", "nym-sphinx-params", "nym-sphinx-types", + "nym-topology", "rand 0.7.3", "serde", "thiserror", - "topology", "wasm-bindgen", ] @@ -3952,9 +3952,9 @@ dependencies = [ "nym-sphinx-forwarding", "nym-sphinx-params", "nym-sphinx-types", + "nym-topology", "rand 0.7.3", "thiserror", - "topology", ] [[package]] @@ -3993,6 +3993,21 @@ dependencies = [ "sphinx", ] +[[package]] +name = "nym-topology" +version = "0.1.0" +dependencies = [ + "bs58", + "log", + "nym-crypto", + "nym-mixnet-contract-common", + "nym-sphinx-addressing", + "nym-sphinx-types", + "nym-version-checker", + "rand 0.7.3", + "thiserror", +] + [[package]] name = "nym-types" version = "1.0.0" @@ -4019,6 +4034,13 @@ dependencies = [ "validator-client", ] +[[package]] +name = "nym-version-checker" +version = "0.1.0" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "nym-vesting-contract" version = "1.1.3" @@ -6533,21 +6555,6 @@ dependencies = [ "tracing-futures", ] -[[package]] -name = "topology" -version = "0.1.0" -dependencies = [ - "bs58", - "log", - "nym-crypto", - "nym-mixnet-contract-common", - "nym-sphinx-addressing", - "nym-sphinx-types", - "rand 0.7.3", - "thiserror", - "version-checker", -] - [[package]] name = "tower" version = "0.4.13" @@ -6988,13 +6995,6 @@ dependencies = [ "time 0.3.17", ] -[[package]] -name = "version-checker" -version = "0.1.0" -dependencies = [ - "semver 0.11.0", -] - [[package]] name = "version_check" version = "0.9.4" diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index 0f4b688584..8c6ebb514d 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -33,7 +33,7 @@ gateway-requests = { path = "../../gateway/gateway-requests" } nonexhaustive-delayqueue = { path = "../../common/nonexhaustive-delayqueue" } nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } -topology = { path = "../../common/topology" } +nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", default-features = false } task = { path = "../../common/task" } diff --git a/clients/client-core/src/client/real_messages_control/message_handler.rs b/clients/client-core/src/client/real_messages_control/message_handler.rs index 473e9d8985..29f9a39fad 100644 --- a/clients/client-core/src/client/real_messages_control/message_handler.rs +++ b/clients/client-core/src/client/real_messages_control/message_handler.rs @@ -19,12 +19,12 @@ use nym_sphinx::message::NymMessage; use nym_sphinx::params::{PacketSize, DEFAULT_NUM_MIX_HOPS}; use nym_sphinx::preparer::{MessagePreparer, PreparedFragment}; use nym_sphinx::Delay; +use nym_topology::{NymTopology, NymTopologyError}; use rand::{CryptoRng, Rng}; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; use thiserror::Error; -use topology::{NymTopology, NymTopologyError}; // TODO: move that error elsewhere since it seems to be contaminating different files #[derive(Debug, Clone, Error)] diff --git a/clients/client-core/src/client/topology_control.rs b/clients/client-core/src/client/topology_control.rs index 0f0c13ad1c..e10aafbf29 100644 --- a/clients/client-core/src/client/topology_control.rs +++ b/clients/client-core/src/client/topology_control.rs @@ -6,13 +6,13 @@ use futures::StreamExt; use log::*; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::params::DEFAULT_NUM_MIX_HOPS; +use nym_topology::{nym_topology_from_detailed, NymTopology, NymTopologyError}; use rand::seq::SliceRandom; use rand::thread_rng; use std::ops::Deref; use std::sync::Arc; use std::time::Duration; use tokio::sync::{RwLock, RwLockReadGuard}; -use topology::{nym_topology_from_detailed, NymTopology, NymTopologyError}; use url::Url; // I'm extremely curious why compiler NEVER complained about lack of Debug here before diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index 4c5c458e8c..ad573c463b 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -435,8 +435,8 @@ impl GatewayEndpointConfig { } } -impl From for GatewayEndpointConfig { - fn from(node: topology::gateway::Node) -> GatewayEndpointConfig { +impl From for GatewayEndpointConfig { + fn from(node: nym_topology::gateway::Node) -> GatewayEndpointConfig { let gateway_listener = node.clients_address(); GatewayEndpointConfig { gateway_id: node.identity_key.to_base58_string(), diff --git a/clients/client-core/src/error.rs b/clients/client-core/src/error.rs index b5f176e818..0436187ed8 100644 --- a/clients/client-core/src/error.rs +++ b/clients/client-core/src/error.rs @@ -3,7 +3,7 @@ use gateway_client::error::GatewayClientError; use nym_crypto::asymmetric::identity::Ed25519RecoveryError; -use topology::NymTopologyError; +use nym_topology::NymTopologyError; use validator_client::ValidatorClientError; #[derive(thiserror::Error, Debug)] diff --git a/clients/client-core/src/init/helpers.rs b/clients/client-core/src/init/helpers.rs index 2ad70c4d98..f1062c6b35 100644 --- a/clients/client-core/src/init/helpers.rs +++ b/clients/client-core/src/init/helpers.rs @@ -12,10 +12,10 @@ use gateway_client::wasm_mockups::SigningNyxdClient; use gateway_client::GatewayClient; use gateway_requests::registration::handshake::SharedKeys; use nym_crypto::asymmetric::identity; +use nym_topology::{filter::VersionFilterable, gateway}; use rand::{seq::SliceRandom, thread_rng}; use std::{sync::Arc, time::Duration}; use tap::TapFallible; -use topology::{filter::VersionFilterable, gateway}; use url::Url; #[cfg(not(target_arch = "wasm32"))] use validator_client::nyxd::SigningNyxdClient; diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index fbdd630764..562ff9e469 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -50,9 +50,9 @@ network-defaults = { path = "../../common/network-defaults" } nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } task = { path = "../../common/task" } -topology = { path = "../../common/topology" } +nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } -version-checker = { path = "../../common/version-checker" } +nym-version-checker = { path = "../../common/version-checker" } websocket-requests = { path = "websocket-requests" } [dev-dependencies] diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index f6c377a8ba..39d98516c1 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -14,7 +14,7 @@ use clap::Args; use config::NymConfig; use log::*; use nym_crypto::asymmetric::identity; -use version_checker::is_minor_version_compatible; +use nym_version_checker::is_minor_version_compatible; #[derive(Args, Clone)] pub(crate) struct Run { diff --git a/clients/native/src/commands/upgrade.rs b/clients/native/src/commands/upgrade.rs index a440054aea..2e67e6e62b 100644 --- a/clients/native/src/commands/upgrade.rs +++ b/clients/native/src/commands/upgrade.rs @@ -4,7 +4,7 @@ use crate::client::config::{Config, MISSING_VALUE}; use config::NymConfig; -use version_checker::Version; +use nym_version_checker::Version; use clap::Args; use std::fmt::Display; diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 976871cce5..2cd17e6a4f 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -48,9 +48,9 @@ proxy-helpers = { path = "../../common/socks5/proxy-helpers" } service-providers-common = { path = "../../service-providers/common" } socks5-requests = { path = "../../common/socks5/requests" } task = { path = "../../common/task" } -topology = { path = "../../common/topology" } +nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } -version-checker = { path = "../../common/version-checker" } +nym-version-checker = { path = "../../common/version-checker" } [features] default = ["credential-storage"] diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 231965732e..95fbcc0970 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -12,7 +12,7 @@ use config::NymConfig; use log::*; use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; -use version_checker::is_minor_version_compatible; +use nym_version_checker::is_minor_version_compatible; #[derive(Args, Clone)] pub(crate) struct Run { diff --git a/clients/socks5/src/commands/upgrade.rs b/clients/socks5/src/commands/upgrade.rs index 121f045905..151d21059e 100644 --- a/clients/socks5/src/commands/upgrade.rs +++ b/clients/socks5/src/commands/upgrade.rs @@ -4,7 +4,7 @@ use crate::client::config::{Config, MISSING_VALUE}; use config::NymConfig; -use version_checker::Version; +use nym_version_checker::Version; use clap::Args; use std::{fmt::Display, process}; diff --git a/clients/webassembly/Cargo.toml b/clients/webassembly/Cargo.toml index cb15659b49..2510a41f4a 100644 --- a/clients/webassembly/Cargo.toml +++ b/clients/webassembly/Cargo.toml @@ -36,7 +36,6 @@ coconut-interface = { path = "../../common/coconut-interface" } credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } nym-sphinx = { path = "../../common/nymsphinx" } -topology = { path = "../../common/topology" } gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm"] } validator-client = { path = "../../common/client-libs/validator-client", default-features = false } wasm-utils = { path = "../../common/wasm-utils" } diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml index 978379c1e5..5156013848 100644 --- a/common/mixnode-common/Cargo.toml +++ b/common/mixnode-common/Cargo.toml @@ -28,4 +28,4 @@ nym-sphinx-params = { path = "../nymsphinx/params" } nym-sphinx-types = { path = "../nymsphinx/types" } task = { path = "../task" } validator-client = { path = "../client-libs/validator-client", features = ["nyxd-client"]} -version-checker = { path = "../version-checker" } +nym-version-checker = { path = "../version-checker" } diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index 384a0abfda..53be86c791 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -8,6 +8,7 @@ use futures::StreamExt; use log::*; use network_defaults::mainnet::NYM_API; use nym_crypto::asymmetric::identity; +use nym_version_checker::parse_version; use rand::seq::SliceRandom; use rand::thread_rng; use std::net::SocketAddr; @@ -18,7 +19,6 @@ use task::TaskClient; use tokio::task::JoinHandle; use tokio::time::sleep; use url::Url; -use version_checker::parse_version; pub use crate::verloc::measurement::{AtomicVerlocResult, Verloc, VerlocResult}; @@ -44,7 +44,7 @@ const DEFAULT_RETRY_TIMEOUT: Duration = Duration::from_secs(60 * 30); #[derive(Clone, Debug)] pub struct Config { /// Minimum semver version of a node (gateway or mixnode) that is capable of replying to echo packets. - minimum_compatible_node_version: version_checker::Version, + minimum_compatible_node_version: nym_version_checker::Version, /// Socket address of this node on which it will be listening for the measurement packets. listening_address: SocketAddr, @@ -89,7 +89,10 @@ impl ConfigBuilder { Self::default() } - pub fn minimum_compatible_node_version(mut self, version: version_checker::Version) -> Self { + pub fn minimum_compatible_node_version( + mut self, + version: nym_version_checker::Version, + ) -> Self { self.0.minimum_compatible_node_version = version; self } diff --git a/common/nymsphinx/Cargo.toml b/common/nymsphinx/Cargo.toml index 33246054e3..f356fe5e08 100644 --- a/common/nymsphinx/Cargo.toml +++ b/common/nymsphinx/Cargo.toml @@ -23,7 +23,7 @@ nym-sphinx-types = { path = "types" } # those dependencies are due to intriducing preparer and receiver. Perpaphs that indicates they should be moved # to separate crate? nym-crypto = { path = "../crypto" } -topology = { path = "../topology" } +nym-topology = { path = "../topology" } [dev-dependencies] nym-mixnet-contract-common = { path = "../cosmwasm-smart-contracts/mixnet-contract" } diff --git a/common/nymsphinx/acknowledgements/Cargo.toml b/common/nymsphinx/acknowledgements/Cargo.toml index 3e1abf760c..18264253e1 100644 --- a/common/nymsphinx/acknowledgements/Cargo.toml +++ b/common/nymsphinx/acknowledgements/Cargo.toml @@ -15,6 +15,6 @@ nym-sphinx-addressing = { path = "../addressing" } nym-sphinx-params = { path = "../params" } nym-sphinx-types = { path = "../types" } nym-pemstore = { path = "../../pemstore" } -topology = { path = "../../topology" } +nym-topology = { path = "../../topology" } diff --git a/common/nymsphinx/acknowledgements/src/surb_ack.rs b/common/nymsphinx/acknowledgements/src/surb_ack.rs index 8526fc109f..5df36e1f0b 100644 --- a/common/nymsphinx/acknowledgements/src/surb_ack.rs +++ b/common/nymsphinx/acknowledgements/src/surb_ack.rs @@ -15,11 +15,11 @@ use nym_sphinx_types::{ delays::{self, Delay}, SphinxPacket, }; +use nym_topology::{NymTopology, NymTopologyError}; use rand::{CryptoRng, RngCore}; use std::convert::TryFrom; use std::time; use thiserror::Error; -use topology::{NymTopology, NymTopologyError}; pub struct SurbAck { surb_ack_packet: SphinxPacket, diff --git a/common/nymsphinx/anonymous-replies/Cargo.toml b/common/nymsphinx/anonymous-replies/Cargo.toml index 25269fdbd6..8d706108ed 100644 --- a/common/nymsphinx/anonymous-replies/Cargo.toml +++ b/common/nymsphinx/anonymous-replies/Cargo.toml @@ -16,7 +16,7 @@ nym-crypto = { path = "../../crypto", features = ["symmetric", "rand"] } nym-sphinx-addressing = { path = "../addressing" } nym-sphinx-params = { path = "../params" } nym-sphinx-types = { path = "../types" } -topology = { path = "../../topology" } +nym-topology = { path = "../../topology" } [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-bindgen] version = "0.2.83" diff --git a/common/nymsphinx/anonymous-replies/src/reply_surb.rs b/common/nymsphinx/anonymous-replies/src/reply_surb.rs index 049e3569e7..4f00cdc164 100644 --- a/common/nymsphinx/anonymous-replies/src/reply_surb.rs +++ b/common/nymsphinx/anonymous-replies/src/reply_surb.rs @@ -8,6 +8,7 @@ use nym_sphinx_addressing::nodes::{NymNodeRoutingAddress, MAX_NODE_ADDRESS_UNPAD use nym_sphinx_params::packet_sizes::PacketSize; use nym_sphinx_params::{ReplySurbKeyDigestAlgorithm, DEFAULT_NUM_MIX_HOPS}; use nym_sphinx_types::{delays, Error as SphinxError, SURBMaterial, SphinxPacket, SURB}; +use nym_topology::{NymTopology, NymTopologyError}; use rand::{CryptoRng, RngCore}; use serde::de::{Error as SerdeError, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -15,7 +16,6 @@ use std::convert::TryFrom; use std::fmt::{self, Formatter}; use std::time; use thiserror::Error; -use topology::{NymTopology, NymTopologyError}; #[derive(Debug, Error)] pub enum ReplySurbError { diff --git a/common/nymsphinx/cover/Cargo.toml b/common/nymsphinx/cover/Cargo.toml index 3677b8f8e3..ab3bd14213 100644 --- a/common/nymsphinx/cover/Cargo.toml +++ b/common/nymsphinx/cover/Cargo.toml @@ -17,4 +17,4 @@ nym-sphinx-chunking = { path = "../chunking" } nym-sphinx-params = { path = "../params" } nym-sphinx-forwarding = { path = "../forwarding" } nym-sphinx-types = { path = "../types" } -topology = { path = "../../topology" } +nym-topology = { path = "../../topology" } diff --git a/common/nymsphinx/cover/src/lib.rs b/common/nymsphinx/cover/src/lib.rs index 8a046b38a9..19e6e96e09 100644 --- a/common/nymsphinx/cover/src/lib.rs +++ b/common/nymsphinx/cover/src/lib.rs @@ -15,11 +15,11 @@ use nym_sphinx_params::{ }; use nym_sphinx_types::builder::SphinxPacketBuilder; use nym_sphinx_types::{delays, Error as SphinxError}; +use nym_topology::{NymTopology, NymTopologyError}; use rand::{CryptoRng, RngCore}; use std::convert::TryFrom; use std::time; use thiserror::Error; -use topology::{NymTopology, NymTopologyError}; pub const LOOP_COVER_MESSAGE_PAYLOAD: &[u8] = b"The cake is a lie!"; diff --git a/common/nymsphinx/src/preparer/mod.rs b/common/nymsphinx/src/preparer/mod.rs index cc4c4bb026..d7445275ca 100644 --- a/common/nymsphinx/src/preparer/mod.rs +++ b/common/nymsphinx/src/preparer/mod.rs @@ -14,10 +14,10 @@ use nym_sphinx_params::packet_sizes::PacketSize; use nym_sphinx_params::DEFAULT_NUM_MIX_HOPS; use nym_sphinx_types::builder::SphinxPacketBuilder; use nym_sphinx_types::{delays, Delay}; +use nym_topology::{NymTopology, NymTopologyError}; use rand::{CryptoRng, Rng}; use std::convert::TryFrom; use std::time::Duration; -use topology::{NymTopology, NymTopologyError}; pub(crate) mod payload; diff --git a/common/nymsphinx/src/receiver.rs b/common/nymsphinx/src/receiver.rs index 5651f98216..93e370d55e 100644 --- a/common/nymsphinx/src/receiver.rs +++ b/common/nymsphinx/src/receiver.rs @@ -186,8 +186,8 @@ mod message_receiver { use super::*; use nym_crypto::asymmetric::identity; use nym_mixnet_contract_common::Layer; + use nym_topology::{gateway, mix, NymTopology}; use std::collections::HashMap; - use topology::{gateway, mix, NymTopology}; // TODO: is it somehow maybe possible to move it to `topology` and have if conditionally // available to other modules? diff --git a/common/topology/Cargo.toml b/common/topology/Cargo.toml index 9d0eba1d5c..164a47925c 100644 --- a/common/topology/Cargo.toml +++ b/common/topology/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "topology" +name = "nym-topology" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" @@ -17,4 +17,4 @@ nym-crypto = { path = "../crypto" } nym-mixnet-contract-common = { path = "../cosmwasm-smart-contracts/mixnet-contract" } nym-sphinx-addressing = { path = "../nymsphinx/addressing" } nym-sphinx-types = { path = "../nymsphinx/types" } -version-checker = { path = "../version-checker" } +nym-version-checker = { path = "../version-checker" } diff --git a/common/topology/src/filter.rs b/common/topology/src/filter.rs index 6c1a3c2fe1..fdbbc9b119 100644 --- a/common/topology/src/filter.rs +++ b/common/topology/src/filter.rs @@ -20,7 +20,7 @@ where fn filter_by_version(&self, expected_version: &str) -> Self { self.iter() .filter(|node| { - version_checker::is_minor_version_compatible(&node.version(), expected_version) + nym_version_checker::is_minor_version_compatible(&node.version(), expected_version) }) .cloned() .collect() diff --git a/common/version-checker/Cargo.toml b/common/version-checker/Cargo.toml index 9bc3c16ccf..df15f395df 100644 --- a/common/version-checker/Cargo.toml +++ b/common/version-checker/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "version-checker" +name = "nym-version-checker" version = "0.1.0" authors = ["Dave Hrycyszyn "] edition = "2021" diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 28ed60d52c..27f8bd2edf 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -71,7 +71,7 @@ task = { path = "../common/task" } validator-client = { path = "../common/client-libs/validator-client", features = [ "nyxd-client", ] } -version-checker = { path = "../common/version-checker" } +nym-version-checker = { path = "../common/version-checker" } nym-types = { path = "../common/types" } serde_json = "1" atty = "0.2" diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index d7cfcd4b9f..17b38a5967 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -155,7 +155,7 @@ pub(crate) fn ensure_config_version_compatibility(cfg: &Config) -> Result<(), Ga if binary_version == config_version { Ok(()) - } else if version_checker::is_minor_version_compatible(binary_version, config_version) { + } else if nym_version_checker::is_minor_version_compatible(binary_version, config_version) { log::warn!( "The gateway binary has different version than what is specified in config file! {binary_version} and {config_version}. \ But, they are still semver compatible. However, consider running the `upgrade` command."); diff --git a/gateway/src/commands/upgrade.rs b/gateway/src/commands/upgrade.rs index b3eefd9ed2..abab75caa7 100644 --- a/gateway/src/commands/upgrade.rs +++ b/gateway/src/commands/upgrade.rs @@ -4,9 +4,9 @@ use crate::config::{Config, MISSING_VALUE}; use clap::Args; use config::NymConfig; +use nym_version_checker::Version; use std::fmt::Display; use std::process; -use version_checker::Version; #[derive(Args, Clone)] pub struct Upgrade { diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 51ecfaffce..21c2534fc1 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -52,9 +52,9 @@ nym-sphinx = { path="../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore", version = "0.1.0" } task = { path = "../common/task" } nym-types = { path = "../common/types" } -topology = { path="../common/topology" } +nym-topology = { path="../common/topology" } validator-client = { path="../common/client-libs/validator-client" } -version-checker = { path="../common/version-checker" } +nym-version-checker = { path="../common/version-checker" } [dev-dependencies] tokio = { version="1.21.2", features = ["rt-multi-thread", "net", "signal", "test-util"] } diff --git a/mixnode/src/commands/mod.rs b/mixnode/src/commands/mod.rs index 49d70a7f44..e2c0f39aed 100644 --- a/mixnode/src/commands/mod.rs +++ b/mixnode/src/commands/mod.rs @@ -141,7 +141,7 @@ pub(crate) fn version_check(cfg: &Config) -> bool { true } else { warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version); - if version_checker::is_minor_version_compatible(binary_version, config_version) { + if nym_version_checker::is_minor_version_compatible(binary_version, config_version) { info!("but they are still semver compatible. However, consider running the `upgrade` command"); true } else { diff --git a/mixnode/src/commands/upgrade.rs b/mixnode/src/commands/upgrade.rs index 46c8192312..bef202b651 100644 --- a/mixnode/src/commands/upgrade.rs +++ b/mixnode/src/commands/upgrade.rs @@ -4,9 +4,9 @@ use crate::config::{missing_string_value, Config}; use clap::Args; use config::NymConfig; +use nym_version_checker::Version; use std::fmt::Display; use std::process; -use version_checker::Version; #[derive(Args)] pub(crate) struct Upgrade { diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index 4504029bd9..6624e74a56 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -23,13 +23,13 @@ use config::NymConfig; use log::{error, info, warn}; use mixnode_common::verloc::{self, AtomicVerlocResult, VerlocMeasurer}; use nym_crypto::asymmetric::{encryption, identity}; +use nym_version_checker::parse_version; use rand::seq::SliceRandom; use rand::thread_rng; use std::net::SocketAddr; use std::process; use std::sync::Arc; use task::{TaskClient, TaskManager}; -use version_checker::parse_version; mod http; mod listener; diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index feccd7bd42..a9801a7bc1 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -88,12 +88,12 @@ nymcoconut = { path = "../common/nymcoconut" } nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } task = { path = "../common/task" } -topology = { path = "../common/topology" } +nym-topology = { path = "../common/topology" } nym-api-requests = { path = "nym-api-requests" } validator-client = { path = "../common/client-libs/validator-client", features = [ "nyxd-client", ] } -version-checker = { path = "../common/version-checker" } +nym-version-checker = { path = "../common/version-checker" } [features] no-reward = [] diff --git a/nym-api/src/network_monitor/chunker.rs b/nym-api/src/network_monitor/chunker.rs index 02d5ba796b..2ac9fa04a0 100644 --- a/nym-api/src/network_monitor/chunker.rs +++ b/nym-api/src/network_monitor/chunker.rs @@ -6,9 +6,9 @@ use nym_sphinx::message::NymMessage; use nym_sphinx::{ acknowledgements::AckKey, addressing::clients::Recipient, preparer::MessagePreparer, }; +use nym_topology::NymTopology; use rand_07::rngs::OsRng; use std::time::Duration; -use topology::NymTopology; const DEFAULT_AVERAGE_PACKET_DELAY: Duration = Duration::from_millis(200); const DEFAULT_AVERAGE_ACK_DELAY: Duration = Duration::from_millis(200); diff --git a/nym-api/src/network_monitor/monitor/preparer.rs b/nym-api/src/network_monitor/monitor/preparer.rs index 81bd295a19..a0df027e9a 100644 --- a/nym-api/src/network_monitor/monitor/preparer.rs +++ b/nym-api/src/network_monitor/monitor/preparer.rs @@ -11,13 +11,13 @@ use nym_crypto::asymmetric::{encryption, identity}; use nym_mixnet_contract_common::{Addr, GatewayBond, Layer, MixId, MixNodeBond}; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::forwarding::packet::MixPacket; +use nym_topology::{gateway, mix, NymTopology}; use rand::seq::SliceRandom; use rand::{thread_rng, Rng}; use std::collections::{HashMap, HashSet}; use std::convert::TryInto; use std::fmt::{self, Display, Formatter}; use std::time::Duration; -use topology::{gateway, mix, NymTopology}; // declared type aliases for easier code reasoning type Version = String; diff --git a/nym-api/src/network_monitor/test_packet.rs b/nym-api/src/network_monitor/test_packet.rs index 687eb0cf93..0a38e642b7 100644 --- a/nym-api/src/network_monitor/test_packet.rs +++ b/nym-api/src/network_monitor/test_packet.rs @@ -5,13 +5,13 @@ use crate::network_monitor::monitor::preparer::TestedNode; use nym_crypto::asymmetric::identity; use nym_crypto::asymmetric::identity::Ed25519RecoveryError; use nym_mixnet_contract_common::MixId; +use nym_topology::{gateway, mix}; use std::convert::TryInto; use std::fmt::{self, Display, Formatter}; use std::hash::{Hash, Hasher}; use std::mem; use std::str::Utf8Error; use thiserror::Error; -use topology::{gateway, mix}; const MIXNODE_TYPE: u8 = 0; const GATEWAY_TYPE: u8 = 1; diff --git a/nym-api/src/network_monitor/test_route/mod.rs b/nym-api/src/network_monitor/test_route/mod.rs index 5f32610a03..c4b98ac5a0 100644 --- a/nym-api/src/network_monitor/test_route/mod.rs +++ b/nym-api/src/network_monitor/test_route/mod.rs @@ -4,8 +4,8 @@ use crate::network_monitor::test_packet::{NodeType, TestPacket}; use crate::network_monitor::ROUTE_TESTING_TEST_NONCE; use nym_crypto::asymmetric::identity; +use nym_topology::{gateway, mix, NymTopology}; use std::fmt::{Debug, Formatter}; -use topology::{gateway, mix, NymTopology}; #[derive(Clone)] pub(crate) struct TestRoute { diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect-android/src-tauri/Cargo.toml index c175940b5e..63cfe55553 100644 --- a/nym-connect-android/src-tauri/Cargo.toml +++ b/nym-connect-android/src-tauri/Cargo.toml @@ -54,7 +54,6 @@ nym-crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} nym-socks5-client = { path = "../../clients/socks5", features = ["mobile"], default-features = false } task = { path = "../../common/task" } -topology = { path = "../../common/topology" } [dev-dependencies] ts-rs = "6.1.2" diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/src-tauri/Cargo.toml index 11dd7db775..a5ceea91db 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/src-tauri/Cargo.toml @@ -52,7 +52,6 @@ nym-crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} nym-socks5-client = { path = "../../clients/socks5" } task = { path = "../../common/task" } -topology = { path = "../../common/topology" } [dev-dependencies] ts-rs = "6.1.2" diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index ac47ca41d0..873b39521b 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -47,5 +47,5 @@ service-providers-common = { path = "../common" } socks5-requests = { path = "../../common/socks5/requests" } statistics-common = { path = "../../common/statistics" } task = { path = "../../common/task" } -version-checker = { path = "../../common/version-checker" } +nym-version-checker = { path = "../../common/version-checker" } websocket-requests = { path = "../../clients/native/websocket-requests" } diff --git a/service-providers/network-requester/src/cli/run.rs b/service-providers/network-requester/src/cli/run.rs index 0970c79975..7dd5fef982 100644 --- a/service-providers/network-requester/src/cli/run.rs +++ b/service-providers/network-requester/src/cli/run.rs @@ -73,7 +73,7 @@ fn version_check(cfg: &Config) -> bool { binary_version, config_version ); - if version_checker::is_minor_version_compatible(binary_version, config_version) { + if nym_version_checker::is_minor_version_compatible(binary_version, config_version) { log::info!( "but they are still semver compatible. \ However, consider running the `upgrade` command" From ce79d5a3bc4c7dccf694671322bb26e465eee0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 20 Feb 2023 19:58:25 +0100 Subject: [PATCH 394/591] Update crate metadata in nym-version-checker and nym-topology (#3062) * nym-sphinx: update crate metadata * Update crate metadata for nym-version-checker and nym-topology --- common/nymsphinx/Cargo.toml | 11 ++++++++--- common/nymsphinx/acknowledgements/Cargo.toml | 9 +++++++-- common/nymsphinx/addressing/Cargo.toml | 9 +++++++-- common/nymsphinx/anonymous-replies/Cargo.toml | 9 +++++++-- common/nymsphinx/chunking/Cargo.toml | 9 +++++++-- common/nymsphinx/cover/Cargo.toml | 9 +++++++-- common/nymsphinx/forwarding/Cargo.toml | 9 +++++++-- common/nymsphinx/framing/Cargo.toml | 9 +++++++-- common/nymsphinx/params/Cargo.toml | 9 +++++++-- common/nymsphinx/types/Cargo.toml | 9 +++++++-- common/topology/Cargo.toml | 9 +++++++-- common/version-checker/Cargo.toml | 9 +++++++-- 12 files changed, 85 insertions(+), 25 deletions(-) diff --git a/common/nymsphinx/Cargo.toml b/common/nymsphinx/Cargo.toml index f356fe5e08..bb738f75d6 100644 --- a/common/nymsphinx/Cargo.toml +++ b/common/nymsphinx/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -22,7 +27,7 @@ nym-sphinx-types = { path = "types" } # those dependencies are due to intriducing preparer and receiver. Perpaphs that indicates they should be moved # to separate crate? -nym-crypto = { path = "../crypto" } +nym-crypto = { path = "../crypto", version = "0.1.0" } nym-topology = { path = "../topology" } [dev-dependencies] diff --git a/common/nymsphinx/acknowledgements/Cargo.toml b/common/nymsphinx/acknowledgements/Cargo.toml index 18264253e1..50d41e7bd9 100644 --- a/common/nymsphinx/acknowledgements/Cargo.toml +++ b/common/nymsphinx/acknowledgements/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-acknowledgements" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/addressing/Cargo.toml b/common/nymsphinx/addressing/Cargo.toml index dc38bc1f8a..6b2aae04d4 100644 --- a/common/nymsphinx/addressing/Cargo.toml +++ b/common/nymsphinx/addressing/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-addressing" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/anonymous-replies/Cargo.toml b/common/nymsphinx/anonymous-replies/Cargo.toml index 8d706108ed..c9068d859d 100644 --- a/common/nymsphinx/anonymous-replies/Cargo.toml +++ b/common/nymsphinx/anonymous-replies/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-anonymous-replies" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/chunking/Cargo.toml b/common/nymsphinx/chunking/Cargo.toml index 580ffd9097..2e26f1626f 100644 --- a/common/nymsphinx/chunking/Cargo.toml +++ b/common/nymsphinx/chunking/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-chunking" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/cover/Cargo.toml b/common/nymsphinx/cover/Cargo.toml index ab3bd14213..1e32ff500e 100644 --- a/common/nymsphinx/cover/Cargo.toml +++ b/common/nymsphinx/cover/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-cover" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/forwarding/Cargo.toml b/common/nymsphinx/forwarding/Cargo.toml index 9eb8959a23..bd1a6a830b 100644 --- a/common/nymsphinx/forwarding/Cargo.toml +++ b/common/nymsphinx/forwarding/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-forwarding" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/framing/Cargo.toml b/common/nymsphinx/framing/Cargo.toml index 9060d3ef1c..90a8e94e5a 100644 --- a/common/nymsphinx/framing/Cargo.toml +++ b/common/nymsphinx/framing/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-framing" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/params/Cargo.toml b/common/nymsphinx/params/Cargo.toml index bb63c0c94f..319a55513d 100644 --- a/common/nymsphinx/params/Cargo.toml +++ b/common/nymsphinx/params/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-params" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/types/Cargo.toml b/common/nymsphinx/types/Cargo.toml index a51281c5de..2461691c1a 100644 --- a/common/nymsphinx/types/Cargo.toml +++ b/common/nymsphinx/types/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-sphinx-types" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/topology/Cargo.toml b/common/topology/Cargo.toml index 164a47925c..91217b8101 100644 --- a/common/topology/Cargo.toml +++ b/common/topology/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-topology" version = "0.1.0" -authors = ["Jedrzej Stuczynski "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/version-checker/Cargo.toml b/common/version-checker/Cargo.toml index df15f395df..bc626fd8c8 100644 --- a/common/version-checker/Cargo.toml +++ b/common/version-checker/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "nym-version-checker" version = "0.1.0" -authors = ["Dave Hrycyszyn "] -edition = "2021" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 46e2c74a98baba5f158178e4991b79b6575fe073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 20 Feb 2023 21:55:29 +0100 Subject: [PATCH 395/591] Rename crate to nym-task (#3064) * Rename to nym-task * Update imports to use nym_task * Update to nym_task in explicit module prefix * Touchups and rustfmt * rustfmt * crate metadata * fix nym-connect-android --- Cargo.lock | 50 +-- clients/client-core/Cargo.toml | 2 +- .../client-core/src/client/base_client/mod.rs | 2 +- .../src/client/cover_traffic_stream.rs | 2 +- clients/client-core/src/client/mix_traffic.rs | 2 +- .../acknowledgement_listener.rs | 2 +- .../action_controller.rs | 4 +- .../input_message_listener.rs | 2 +- .../acknowledgement_control/mod.rs | 2 +- .../retransmission_request_listener.rs | 2 +- .../sent_notification_listener.rs | 2 +- .../src/client/real_messages_control/mod.rs | 2 +- .../real_traffic_stream.rs | 4 +- .../client-core/src/client/received_buffer.rs | 6 +- .../client/replies/reply_controller/mod.rs | 2 +- .../src/client/replies/reply_storage/mod.rs | 2 +- .../src/client/topology_control.rs | 2 +- clients/native/Cargo.toml | 2 +- clients/native/src/client/mod.rs | 4 +- clients/native/src/websocket/handler.rs | 4 +- clients/native/src/websocket/listener.rs | 8 +- clients/socks5/Cargo.toml | 2 +- clients/socks5/src/client/mod.rs | 6 +- clients/socks5/src/socks/client.rs | 2 +- clients/socks5/src/socks/mixnet_responses.rs | 2 +- clients/socks5/src/socks/server.rs | 2 +- clients/webassembly/Cargo.toml | 2 +- clients/webassembly/src/client/mod.rs | 2 +- common/client-libs/gateway-client/Cargo.toml | 2 +- .../client-libs/gateway-client/src/client.rs | 2 +- .../gateway-client/src/packet_router.rs | 2 +- .../gateway-client/src/socket_state.rs | 2 +- common/client-libs/mixnet-client/Cargo.toml | 2 +- .../mixnet-client/src/forwarder.rs | 4 +- common/mixnode-common/Cargo.toml | 2 +- common/mixnode-common/src/verloc/listener.rs | 2 +- common/mixnode-common/src/verloc/mod.rs | 2 +- common/mixnode-common/src/verloc/sender.rs | 2 +- common/socks5/proxy-helpers/Cargo.toml | 2 +- .../src/connection_controller.rs | 2 +- .../proxy-helpers/src/proxy_runner/inbound.rs | 2 +- .../proxy-helpers/src/proxy_runner/mod.rs | 2 +- .../src/proxy_runner/outbound.rs | 2 +- common/task/Cargo.toml | 12 +- explorer-api/Cargo.toml | 2 +- .../src/country_statistics/distribution.rs | 2 +- .../src/country_statistics/geolocate.rs | 2 +- explorer-api/src/main.rs | 2 +- explorer-api/src/tasks.rs | 2 +- gateway/Cargo.toml | 2 +- .../connection_handler/authenticated.rs | 2 +- .../websocket/connection_handler/fresh.rs | 2 +- .../websocket/connection_handler/mod.rs | 2 +- .../client_handling/websocket/listener.rs | 4 +- .../receiver/connection_handler.rs | 2 +- .../node/mixnet_handling/receiver/listener.rs | 2 +- gateway/src/node/mod.rs | 2 +- mixnode/Cargo.toml | 2 +- mixnode/src/node/mod.rs | 2 +- mixnode/src/node/node_statistics.rs | 2 +- mixnode/src/node/packet_delayforwarder.rs | 2 +- nym-api/Cargo.toml | 2 +- .../circulating_supply_api/cache/refresher.rs | 2 +- nym-api/src/circulating_supply_api/mod.rs | 2 +- nym-api/src/coconut/dkg/controller.rs | 2 +- nym-api/src/epoch_operations/mod.rs | 2 +- nym-api/src/main.rs | 2 +- nym-api/src/network_monitor/mod.rs | 2 +- .../monitor/gateways_pinger.rs | 2 +- nym-api/src/network_monitor/monitor/mod.rs | 2 +- .../src/network_monitor/monitor/receiver.rs | 2 +- nym-api/src/network_monitor/monitor/sender.rs | 4 +- .../src/node_status_api/cache/refresher.rs | 2 +- nym-api/src/node_status_api/mod.rs | 2 +- nym-api/src/node_status_api/uptime_updater.rs | 2 +- .../src/nym_contract_cache/cache/refresher.rs | 2 +- nym-api/src/nym_contract_cache/mod.rs | 2 +- nym-connect-android/src-tauri/Cargo.lock | 349 +++++++++--------- nym-connect-android/src-tauri/Cargo.toml | 2 +- nym-connect-android/src-tauri/src/events.rs | 2 +- nym-connect-android/src-tauri/src/state.rs | 4 +- nym-connect-android/src-tauri/src/tasks.rs | 6 +- nym-connect/src-tauri/Cargo.toml | 2 +- nym-connect/src-tauri/src/events.rs | 2 +- nym-connect/src-tauri/src/state.rs | 6 +- nym-connect/src-tauri/src/tasks.rs | 6 +- sdk/rust/nym-sdk/Cargo.toml | 2 +- sdk/rust/nym-sdk/src/mixnet/client.rs | 2 +- .../network-requester/Cargo.toml | 2 +- .../network-requester/src/core.rs | 4 +- .../network-requester/src/socks5/tcp.rs | 2 +- 91 files changed, 319 insertions(+), 312 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d2cec6d7fd..025fcd5e88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -710,13 +710,13 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-task", "nym-topology", "rand 0.7.3", "serde", "serde_json", "sqlx 0.6.2", "tap", - "task", "tempfile", "thiserror", "time 0.3.17", @@ -1861,6 +1861,7 @@ dependencies = [ "network-defaults", "nym-contracts-common", "nym-mixnet-contract-common", + "nym-task", "okapi", "pretty_env_logger", "rand 0.8.5", @@ -1873,7 +1874,6 @@ dependencies = [ "schemars", "serde", "serde_json", - "task", "thiserror", "tokio", "validator-client", @@ -2129,9 +2129,9 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-task", "rand 0.7.3", "serde", - "task", "thiserror", "tokio", "tokio-stream", @@ -3173,7 +3173,7 @@ dependencies = [ "futures", "log", "nym-sphinx", - "task", + "nym-task", "tokio", "tokio-util", ] @@ -3194,10 +3194,10 @@ dependencies = [ "nym-sphinx-framing", "nym-sphinx-params", "nym-sphinx-types", + "nym-task", "nym-version-checker", "rand 0.8.5", "serde", - "task", "thiserror", "tokio", "tokio-util", @@ -3406,6 +3406,7 @@ dependencies = [ "nym-mixnet-contract-common", "nym-pemstore", "nym-sphinx", + "nym-task", "nym-topology", "nym-version-checker", "nym-vesting-contract-common", @@ -3424,7 +3425,6 @@ dependencies = [ "serde_json", "sqlx 0.6.2", "tap", - "task", "thiserror", "time 0.3.17", "tokio", @@ -3546,6 +3546,7 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-task", "nym-topology", "nym-version-checker", "pretty_env_logger", @@ -3553,7 +3554,6 @@ dependencies = [ "serde", "serde_json", "tap", - "task", "thiserror", "tokio", "tokio-tungstenite 0.14.0", @@ -3632,6 +3632,7 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-task", "nym-types", "nym-version-checker", "once_cell", @@ -3642,7 +3643,6 @@ dependencies = [ "sqlx 0.5.13", "statistics-common", "subtle-encoding", - "task", "thiserror", "tokio", "tokio-stream", @@ -3699,6 +3699,7 @@ dependencies = [ "nym-sphinx", "nym-sphinx-params", "nym-sphinx-types", + "nym-task", "nym-topology", "nym-types", "nym-version-checker", @@ -3708,7 +3709,6 @@ dependencies = [ "serde", "serde_json", "sysinfo", - "task", "tokio", "tokio-util", "toml", @@ -3737,6 +3737,7 @@ dependencies = [ "nym-crypto", "nym-sdk", "nym-sphinx", + "nym-task", "nym-version-checker", "ordered-buffer", "pretty_env_logger", @@ -3750,7 +3751,6 @@ dependencies = [ "sqlx 0.6.2", "statistics-common", "tap", - "task", "thiserror", "tokio", "tokio-tungstenite 0.17.2", @@ -3811,10 +3811,10 @@ dependencies = [ "network-defaults", "nym-crypto", "nym-sphinx", + "nym-task", "pretty_env_logger", "rand 0.7.3", "tap", - "task", "thiserror", "tokio", "toml", @@ -3847,6 +3847,7 @@ dependencies = [ "nym-crypto", "nym-pemstore", "nym-sphinx", + "nym-task", "nym-topology", "nym-version-checker", "ordered-buffer", @@ -3859,7 +3860,6 @@ dependencies = [ "service-providers-common", "socks5-requests", "tap", - "task", "thiserror", "tokio", "url", @@ -3993,6 +3993,18 @@ dependencies = [ "sphinx", ] +[[package]] +name = "nym-task" +version = "0.1.0" +dependencies = [ + "futures", + "log", + "thiserror", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", +] + [[package]] name = "nym-topology" version = "0.1.0" @@ -4640,9 +4652,9 @@ dependencies = [ "client-connections", "futures", "log", + "nym-task", "ordered-buffer", "socks5-requests", - "task", "tokio", "tokio-test", "tokio-util", @@ -6151,18 +6163,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "task" -version = "0.1.0" -dependencies = [ - "futures", - "log", - "thiserror", - "tokio", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "tempfile" version = "3.3.0" diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index 8c6ebb514d..b1cbb77c2a 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -35,7 +35,7 @@ nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", default-features = false } -task = { path = "../../common/task" } +nym-task = { path = "../../common/task" } [target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio-stream] version = "0.1.11" diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index b4f9ffeea9..52b45a4e17 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -36,10 +36,10 @@ use nym_sphinx::acknowledgements::AckKey; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::addressing::nodes::NodeIdentity; use nym_sphinx::receiver::ReconstructedMessage; +use nym_task::{TaskClient, TaskManager}; use std::sync::Arc; use std::time::Duration; use tap::TapFallible; -use task::{TaskClient, TaskManager}; use url::Url; #[cfg(not(target_arch = "wasm32"))] use validator_client::nyxd::CosmWasmClient; diff --git a/clients/client-core/src/client/cover_traffic_stream.rs b/clients/client-core/src/client/cover_traffic_stream.rs index e6cef250e5..eeb0652bf5 100644 --- a/clients/client-core/src/client/cover_traffic_stream.rs +++ b/clients/client-core/src/client/cover_traffic_stream.rs @@ -213,7 +213,7 @@ impl LoopCoverTrafficStream { tokio::task::yield_now().await; } - pub fn start_with_shutdown(mut self, mut shutdown: task::TaskClient) { + pub fn start_with_shutdown(mut self, mut shutdown: nym_task::TaskClient) { // we should set initial delay only when we actually start the stream let sampled = sample_poisson_duration(&mut self.rng, self.average_cover_message_sending_delay); diff --git a/clients/client-core/src/client/mix_traffic.rs b/clients/client-core/src/client/mix_traffic.rs index afade091f9..e4b5024d62 100644 --- a/clients/client-core/src/client/mix_traffic.rs +++ b/clients/client-core/src/client/mix_traffic.rs @@ -76,7 +76,7 @@ where } } - pub fn start_with_shutdown(mut self, mut shutdown: task::TaskClient) { + pub fn start_with_shutdown(mut self, mut shutdown: nym_task::TaskClient) { spawn_future(async move { debug!("Started MixTrafficController with graceful shutdown support"); diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs index ab1603e09c..2be5f58f41 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/acknowledgement_listener.rs @@ -65,7 +65,7 @@ impl AcknowledgementListener { } } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started AcknowledgementListener with graceful shutdown support"); while !shutdown.is_shutdown() { diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs index f2656e060d..a812c90b92 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs @@ -216,7 +216,7 @@ impl ActionController { fn handle_expired_ack_timer( &mut self, expired_ack: Expired, - task_client: &mut task::TaskClient, + task_client: &mut nym_task::TaskClient, ) { // I'm honestly not sure how to handle it, because getting it means other things in our // system are already misbehaving. If we ever see this panic, then I guess we should worry @@ -260,7 +260,7 @@ impl ActionController { } } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started ActionController with graceful shutdown support"); while !shutdown.is_shutdown() { diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs index c537755da7..85d73fa304 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs @@ -109,7 +109,7 @@ where }; } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started InputMessageListener with graceful shutdown support"); while !shutdown.is_shutdown() { diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs index eaaacc8b74..ba8a5b9c54 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/mod.rs @@ -249,7 +249,7 @@ where } } - pub(super) fn start_with_shutdown(self, shutdown: task::TaskClient) { + pub(super) fn start_with_shutdown(self, shutdown: nym_task::TaskClient) { let mut acknowledgement_listener = self.acknowledgement_listener; let mut input_message_listener = self.input_message_listener; let mut retransmission_request_listener = self.retransmission_request_listener; diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs index eb05a29b47..45072dc2f3 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs @@ -137,7 +137,7 @@ where .await } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started RetransmissionRequestListener with graceful shutdown support"); while !shutdown.is_shutdown() { diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs index 3e827b6b4f..4d2445f162 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/sent_notification_listener.rs @@ -37,7 +37,7 @@ impl SentNotificationListener { .unwrap(); } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started SentNotificationListener with graceful shutdown support"); while !shutdown.is_shutdown() { diff --git a/clients/client-core/src/client/real_messages_control/mod.rs b/clients/client-core/src/client/real_messages_control/mod.rs index 158138b525..bb40312aa9 100644 --- a/clients/client-core/src/client/real_messages_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/mod.rs @@ -270,7 +270,7 @@ impl RealMessagesController { } } - pub fn start_with_shutdown(self, shutdown: task::TaskClient) { + pub fn start_with_shutdown(self, shutdown: nym_task::TaskClient) { let mut out_queue_control = self.out_queue_control; let ack_control = self.ack_control; let mut reply_control = self.reply_control; diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs index 333d5f0fbc..650a77870a 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs @@ -460,7 +460,7 @@ where } #[cfg(not(target_arch = "wasm32"))] - fn log_status(&self, shutdown: &mut task::TaskClient) { + fn log_status(&self, shutdown: &mut nym_task::TaskClient) { use crate::error::ClientCoreStatusMessage; let packets = self.transmission_buffer.total_size(); @@ -501,7 +501,7 @@ where } } - pub(super) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + pub(super) async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started OutQueueControl with graceful shutdown support"); #[cfg(not(target_arch = "wasm32"))] diff --git a/clients/client-core/src/client/received_buffer.rs b/clients/client-core/src/client/received_buffer.rs index 4ff19d1552..7d7ffdb021 100644 --- a/clients/client-core/src/client/received_buffer.rs +++ b/clients/client-core/src/client/received_buffer.rs @@ -399,7 +399,7 @@ impl RequestReceiver { } } - async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started RequestReceiver with graceful shutdown support"); while !shutdown.is_shutdown() { tokio::select! { @@ -438,7 +438,7 @@ impl FragmentedMessageReceiver { } } - async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started FragmentedMessageReceiver with graceful shutdown support"); while !shutdown.is_shutdown() { tokio::select! { @@ -488,7 +488,7 @@ impl ReceivedMessagesBufferController { } } - pub fn start_with_shutdown(self, shutdown: task::TaskClient) { + pub fn start_with_shutdown(self, shutdown: nym_task::TaskClient) { let mut fragmented_message_receiver = self.fragmented_message_receiver; let mut request_receiver = self.request_receiver; diff --git a/clients/client-core/src/client/replies/reply_controller/mod.rs b/clients/client-core/src/client/replies/reply_controller/mod.rs index 429f07dbf3..7df94c08c7 100644 --- a/clients/client-core/src/client/replies/reply_controller/mod.rs +++ b/clients/client-core/src/client/replies/reply_controller/mod.rs @@ -835,7 +835,7 @@ where // todo!() // } - pub(crate) async fn run_with_shutdown(&mut self, mut shutdown: task::TaskClient) { + pub(crate) async fn run_with_shutdown(&mut self, mut shutdown: nym_task::TaskClient) { debug!("Started ReplyController with graceful shutdown support"); let polling_rate = Duration::from_secs(5); diff --git a/clients/client-core/src/client/replies/reply_storage/mod.rs b/clients/client-core/src/client/replies/reply_storage/mod.rs index c74ad2bb6b..5b8c7b9dee 100644 --- a/clients/client-core/src/client/replies/reply_storage/mod.rs +++ b/clients/client-core/src/client/replies/reply_storage/mod.rs @@ -37,7 +37,7 @@ where pub async fn flush_on_shutdown( mut self, mem_state: CombinedReplyStorage, - mut shutdown: task::TaskClient, + mut shutdown: nym_task::TaskClient, ) { use log::{debug, error, info, warn}; diff --git a/clients/client-core/src/client/topology_control.rs b/clients/client-core/src/client/topology_control.rs index e10aafbf29..e94340f074 100644 --- a/clients/client-core/src/client/topology_control.rs +++ b/clients/client-core/src/client/topology_control.rs @@ -306,7 +306,7 @@ impl TopologyRefresher { self.topology_accessor.ensure_is_routable().await } - pub fn start_with_shutdown(mut self, mut shutdown: task::TaskClient) { + pub fn start_with_shutdown(mut self, mut shutdown: nym_task::TaskClient) { spawn_future(async move { debug!("Started TopologyRefresher with graceful shutdown support"); diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 562ff9e469..c101e4bcf8 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -49,7 +49,7 @@ gateway-requests = { path = "../../gateway/gateway-requests" } network-defaults = { path = "../../common/network-defaults" } nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } -task = { path = "../../common/task" } +nym-task = { path = "../../common/task" } nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } nym-version-checker = { path = "../../common/version-checker" } diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index a16fbde944..ddd6ea0ce2 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -19,7 +19,7 @@ use futures::channel::mpsc; use gateway_client::bandwidth::BandwidthController; use log::*; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; -use task::TaskManager; +use nym_task::TaskManager; use tokio::sync::watch::error::SendError; use validator_client::nyxd::QueryNyxdClient; @@ -85,7 +85,7 @@ impl SocketClient { client_output: ClientOutput, client_state: ClientState, self_address: &Recipient, - shutdown: task::TaskClient, + shutdown: nym_task::TaskClient, ) { info!("Starting websocket listener..."); diff --git a/clients/native/src/websocket/handler.rs b/clients/native/src/websocket/handler.rs index fff50b77b9..753d2c4386 100644 --- a/clients/native/src/websocket/handler.rs +++ b/clients/native/src/websocket/handler.rs @@ -357,7 +357,7 @@ impl Handler { async fn listen_for_requests( &mut self, mut msg_receiver: ReconstructedMessagesReceiver, - mut task_client: task::TaskClient, + mut task_client: nym_task::TaskClient, ) { while !task_client.is_shutdown() { tokio::select! { @@ -410,7 +410,7 @@ impl Handler { pub(crate) async fn handle_connection( mut self, socket: TcpStream, - mut task_client: task::TaskClient, + mut task_client: nym_task::TaskClient, ) { // We don't want a crash in the connection handler to trigger a shutdown of the whole // process. diff --git a/clients/native/src/websocket/listener.rs b/clients/native/src/websocket/listener.rs index 534fd2dafc..712389145a 100644 --- a/clients/native/src/websocket/listener.rs +++ b/clients/native/src/websocket/listener.rs @@ -32,7 +32,11 @@ impl Listener { } } - pub(crate) async fn run(&mut self, handler: HandlerBuilder, mut task_client: task::TaskClient) { + pub(crate) async fn run( + &mut self, + handler: HandlerBuilder, + mut task_client: nym_task::TaskClient, + ) { let tcp_listener = match tokio::net::TcpListener::bind(self.address).await { Ok(listener) => listener, Err(err) => { @@ -103,7 +107,7 @@ impl Listener { pub(crate) fn start( mut self, handler: HandlerBuilder, - shutdown: task::TaskClient, + shutdown: nym_task::TaskClient, ) -> JoinHandle<()> { info!("Running websocket on {:?}", self.address.to_string()); diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 2cd17e6a4f..51e33b97ce 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -47,7 +47,7 @@ nym-pemstore = { path = "../../common/pemstore" } proxy-helpers = { path = "../../common/socks5/proxy-helpers" } service-providers-common = { path = "../../service-providers/common" } socks5-requests = { path = "../../common/socks5/requests" } -task = { path = "../../common/task" } +nym-task = { path = "../../common/task" } nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } nym-version-checker = { path = "../../common/version-checker" } diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index 3354bab401..ae50726184 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -22,8 +22,8 @@ use futures::StreamExt; use gateway_client::bandwidth::BandwidthController; use log::*; use nym_sphinx::addressing::clients::Recipient; +use nym_task::{TaskClient, TaskManager}; use std::error::Error; -use task::{TaskClient, TaskManager}; use validator_client::nyxd::QueryNyxdClient; pub mod config; @@ -142,7 +142,7 @@ impl NymClient { ), shutdown.clone(), ); - task::spawn_with_report_error( + nym_task::spawn_with_report_error( async move { sphinx_socks .serve( @@ -169,7 +169,7 @@ impl NymClient { pub async fn run_and_listen( self, mut receiver: Socks5ControlMessageReceiver, - sender: task::StatusSender, + sender: nym_task::StatusSender, ) -> Result<(), Box> { // Start the main task let mut shutdown = self.start().await?; diff --git a/clients/socks5/src/socks/client.rs b/clients/socks5/src/socks/client.rs index 75f5fada7c..15dc64a513 100644 --- a/clients/socks5/src/socks/client.rs +++ b/clients/socks5/src/socks/client.rs @@ -10,6 +10,7 @@ use futures::channel::mpsc; use futures::task::{Context, Poll}; use log::*; use nym_sphinx::addressing::clients::Recipient; +use nym_task::TaskClient; use pin_project::pin_project; use proxy_helpers::connection_controller::{ ConnectionReceiver, ControllerCommand, ControllerSender, @@ -23,7 +24,6 @@ use socks5_requests::{ use std::io; use std::net::SocketAddr; use std::pin::Pin; -use task::TaskClient; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, ReadBuf}; use tokio::{self, net::TcpStream}; diff --git a/clients/socks5/src/socks/mixnet_responses.rs b/clients/socks5/src/socks/mixnet_responses.rs index 2c46bc3f6f..e905cd2d84 100644 --- a/clients/socks5/src/socks/mixnet_responses.rs +++ b/clients/socks5/src/socks/mixnet_responses.rs @@ -5,10 +5,10 @@ use log::*; use client_core::client::received_buffer::ReconstructedMessagesReceiver; use client_core::client::received_buffer::{ReceivedBufferMessage, ReceivedBufferRequestSender}; use nym_sphinx::receiver::ReconstructedMessage; +use nym_task::TaskClient; use proxy_helpers::connection_controller::ControllerSender; use service_providers_common::interface::{ControlResponse, ResponseContent}; use socks5_requests::{Socks5ProviderResponse, Socks5Response, Socks5ResponseContent}; -use task::TaskClient; use crate::error::Socks5ClientError; diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index 5b376b1110..23ace2e198 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -10,10 +10,10 @@ use client_core::client::{ }; use log::*; use nym_sphinx::addressing::clients::Recipient; +use nym_task::TaskClient; use proxy_helpers::connection_controller::Controller; use std::net::SocketAddr; use tap::TapFallible; -use task::TaskClient; use tokio::net::TcpListener; /// A Socks5 server that listens for connections. diff --git a/clients/webassembly/Cargo.toml b/clients/webassembly/Cargo.toml index 2510a41f4a..430dc7a7d3 100644 --- a/clients/webassembly/Cargo.toml +++ b/clients/webassembly/Cargo.toml @@ -39,7 +39,7 @@ nym-sphinx = { path = "../../common/nymsphinx" } gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm"] } validator-client = { path = "../../common/client-libs/validator-client", default-features = false } wasm-utils = { path = "../../common/wasm-utils" } -task = { path = "../../common/task" } +nym-task = { path = "../../common/task" } # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires # all the `std::fmt` and `std::panicking` infrastructure, so isn't great for diff --git a/clients/webassembly/src/client/mod.rs b/clients/webassembly/src/client/mod.rs index 269dfee52d..34ec4a9396 100644 --- a/clients/webassembly/src/client/mod.rs +++ b/clients/webassembly/src/client/mod.rs @@ -15,9 +15,9 @@ use gateway_client::wasm_mockups::SigningNyxdClient; use js_sys::Promise; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::TaskManager; use rand::rngs::OsRng; use std::sync::Arc; -use task::TaskManager; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise; use wasm_utils::{console_error, console_log}; diff --git a/common/client-libs/gateway-client/Cargo.toml b/common/client-libs/gateway-client/Cargo.toml index 2be6ef78e1..1924f94dba 100644 --- a/common/client-libs/gateway-client/Cargo.toml +++ b/common/client-libs/gateway-client/Cargo.toml @@ -26,7 +26,7 @@ network-defaults = { path = "../../network-defaults" } nym-sphinx = { path = "../../nymsphinx" } nym-pemstore = { path = "../../pemstore" } validator-client = { path = "../validator-client" } -task = { path = "../../task" } +nym-task = { path = "../../task" } serde = { version = "1.0", features = ["derive"]} mobile-storage = { path = "../../mobile-storage" } diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index 50253a706e..aa16a0667e 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -19,11 +19,11 @@ use log::*; use network_defaults::{REMAINING_BANDWIDTH_THRESHOLD, TOKENS_TO_BURN}; use nym_crypto::asymmetric::identity; use nym_sphinx::forwarding::packet::MixPacket; +use nym_task::TaskClient; use rand::rngs::OsRng; use std::convert::TryFrom; use std::sync::Arc; use std::time::Duration; -use task::TaskClient; use tungstenite::protocol::Message; #[cfg(not(target_arch = "wasm32"))] diff --git a/common/client-libs/gateway-client/src/packet_router.rs b/common/client-libs/gateway-client/src/packet_router.rs index 10877b29f7..c758abcc19 100644 --- a/common/client-libs/gateway-client/src/packet_router.rs +++ b/common/client-libs/gateway-client/src/packet_router.rs @@ -9,7 +9,7 @@ use futures::channel::mpsc; use log::*; use nym_sphinx::addressing::nodes::MAX_NODE_ADDRESS_UNPADDED_LEN; use nym_sphinx::params::packet_sizes::PacketSize; -use task::TaskClient; +use nym_task::TaskClient; pub type MixnetMessageSender = mpsc::UnboundedSender>>; pub type MixnetMessageReceiver = mpsc::UnboundedReceiver>>; diff --git a/common/client-libs/gateway-client/src/socket_state.rs b/common/client-libs/gateway-client/src/socket_state.rs index 2bedf1e8ed..007a1b1313 100644 --- a/common/client-libs/gateway-client/src/socket_state.rs +++ b/common/client-libs/gateway-client/src/socket_state.rs @@ -9,8 +9,8 @@ use futures::stream::{SplitSink, SplitStream}; use futures::{SinkExt, StreamExt}; use gateway_requests::registration::handshake::SharedKeys; use log::*; +use nym_task::TaskClient; use std::sync::Arc; -use task::TaskClient; use tungstenite::Message; #[cfg(not(target_arch = "wasm32"))] diff --git a/common/client-libs/mixnet-client/Cargo.toml b/common/client-libs/mixnet-client/Cargo.toml index 03a40ec356..f9763d626a 100644 --- a/common/client-libs/mixnet-client/Cargo.toml +++ b/common/client-libs/mixnet-client/Cargo.toml @@ -14,4 +14,4 @@ tokio-util = { version = "0.7.4", features = ["codec"] } # internal nym-sphinx = { path = "../../nymsphinx" } -task = { path = "../../task" } +nym-task = { path = "../../task" } diff --git a/common/client-libs/mixnet-client/src/forwarder.rs b/common/client-libs/mixnet-client/src/forwarder.rs index 974ee1947b..cefae1fc30 100644 --- a/common/client-libs/mixnet-client/src/forwarder.rs +++ b/common/client-libs/mixnet-client/src/forwarder.rs @@ -16,7 +16,7 @@ type MixForwardingReceiver = mpsc::UnboundedReceiver; pub struct PacketForwarder { mixnet_client: Client, packet_receiver: MixForwardingReceiver, - shutdown: task::TaskClient, + shutdown: nym_task::TaskClient, } impl PacketForwarder { @@ -26,7 +26,7 @@ impl PacketForwarder { initial_connection_timeout: Duration, maximum_connection_buffer_size: usize, use_legacy_version: bool, - shutdown: task::TaskClient, + shutdown: nym_task::TaskClient, ) -> (PacketForwarder, MixForwardingSender) { let client_config = Config::new( initial_reconnection_backoff, diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml index 5156013848..e6bfbc764a 100644 --- a/common/mixnode-common/Cargo.toml +++ b/common/mixnode-common/Cargo.toml @@ -26,6 +26,6 @@ nym-sphinx-forwarding = { path = "../nymsphinx/forwarding" } nym-sphinx-framing = { path = "../nymsphinx/framing" } nym-sphinx-params = { path = "../nymsphinx/params" } nym-sphinx-types = { path = "../nymsphinx/types" } -task = { path = "../task" } +nym-task = { path = "../task" } validator-client = { path = "../client-libs/validator-client", features = ["nyxd-client"]} nym-version-checker = { path = "../version-checker" } diff --git a/common/mixnode-common/src/verloc/listener.rs b/common/mixnode-common/src/verloc/listener.rs index 4324a0712c..a41e4edc8f 100644 --- a/common/mixnode-common/src/verloc/listener.rs +++ b/common/mixnode-common/src/verloc/listener.rs @@ -7,11 +7,11 @@ use bytes::{BufMut, BytesMut}; use futures::StreamExt; use log::*; use nym_crypto::asymmetric::identity; +use nym_task::TaskClient; use std::fmt::{Display, Formatter}; use std::net::SocketAddr; use std::sync::Arc; use std::{fmt, io, process}; -use task::TaskClient; use tokio::io::AsyncWriteExt; use tokio::net::{TcpListener, TcpStream}; use tokio_util::codec::{Decoder, Encoder, Framed}; diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index 53be86c791..48fe45c5b1 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -8,6 +8,7 @@ use futures::StreamExt; use log::*; use network_defaults::mainnet::NYM_API; use nym_crypto::asymmetric::identity; +use nym_task::TaskClient; use nym_version_checker::parse_version; use rand::seq::SliceRandom; use rand::thread_rng; @@ -15,7 +16,6 @@ use std::net::SocketAddr; use std::net::ToSocketAddrs; use std::sync::Arc; use std::time::Duration; -use task::TaskClient; use tokio::task::JoinHandle; use tokio::time::sleep; use url::Url; diff --git a/common/mixnode-common/src/verloc/sender.rs b/common/mixnode-common/src/verloc/sender.rs index 91bb596bab..665acc3145 100644 --- a/common/mixnode-common/src/verloc/sender.rs +++ b/common/mixnode-common/src/verloc/sender.rs @@ -6,12 +6,12 @@ use crate::verloc::measurement::Measurement; use crate::verloc::packet::{EchoPacket, ReplyPacket}; use log::*; use nym_crypto::asymmetric::identity; +use nym_task::TaskClient; use rand::{thread_rng, Rng}; use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; use std::{fmt, io}; -use task::TaskClient; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpStream; use tokio::time::sleep; diff --git a/common/socks5/proxy-helpers/Cargo.toml b/common/socks5/proxy-helpers/Cargo.toml index cfe89a0f12..8e7c44d1a6 100644 --- a/common/socks5/proxy-helpers/Cargo.toml +++ b/common/socks5/proxy-helpers/Cargo.toml @@ -19,7 +19,7 @@ log = { workspace = true } client-connections = { path = "../../client-connections" } ordered-buffer = { path = "../ordered-buffer" } socks5-requests = { path = "../requests" } -task = { path = "../../task" } +nym-task = { path = "../../task" } [dev-dependencies] tokio-test = "0.4.2" diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index 2804d4e370..79e06025c5 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -5,10 +5,10 @@ use client_connections::{ConnectionCommand, ConnectionCommandSender}; use futures::channel::mpsc; use futures::StreamExt; use log::*; +use nym_task::TaskClient; use ordered_buffer::{OrderedMessage, OrderedMessageBuffer, ReadContiguousData}; use socks5_requests::{ConnectionId, NetworkData, SendRequest}; use std::collections::{HashMap, HashSet}; -use task::TaskClient; /// A generic message produced after reading from a socket/connection. It includes data that was /// actually read alongside boolean indicating whether the connection got closed so that diff --git a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs index c00e2ae8e5..520843167c 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs @@ -10,12 +10,12 @@ use client_connections::TransmissionLane; use futures::FutureExt; use futures::StreamExt; use log::*; +use nym_task::TaskClient; use ordered_buffer::OrderedMessageSender; use socks5_requests::ConnectionId; use std::fmt::Debug; use std::time::Duration; use std::{io, sync::Arc}; -use task::TaskClient; use tokio::select; use tokio::{net::tcp::OwnedReadHalf, sync::Notify, time::sleep}; diff --git a/common/socks5/proxy-helpers/src/proxy_runner/mod.rs b/common/socks5/proxy-helpers/src/proxy_runner/mod.rs index a87ada287e..3304cba8d2 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/mod.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/mod.rs @@ -3,10 +3,10 @@ use crate::connection_controller::ConnectionReceiver; use client_connections::LaneQueueLengths; +use nym_task::TaskClient; use socks5_requests::ConnectionId; use std::fmt::Debug; use std::{sync::Arc, time::Duration}; -use task::TaskClient; use tokio::{net::TcpStream, sync::Notify}; mod inbound; diff --git a/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs b/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs index 826fb9b769..f97b1b4056 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/outbound.rs @@ -6,9 +6,9 @@ use crate::connection_controller::{ConnectionMessage, ConnectionReceiver}; use futures::FutureExt; use futures::StreamExt; use log::*; +use nym_task::TaskClient; use socks5_requests::ConnectionId; use std::{sync::Arc, time::Duration}; -use task::TaskClient; use tokio::io::AsyncWriteExt; use tokio::select; use tokio::{net::tcp::OwnedWriteHalf, sync::Notify, time::sleep, time::Instant}; diff --git a/common/task/Cargo.toml b/common/task/Cargo.toml index ab822e9341..7e94b5442b 100644 --- a/common/task/Cargo.toml +++ b/common/task/Cargo.toml @@ -1,9 +1,11 @@ [package] -name = "task" +name = "nym-task" version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +description = "Task handling" +edition.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true [dependencies] futures = "0.3" @@ -13,7 +15,7 @@ tokio = { version = "1.24.1", features = ["macros", "sync"] } [target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio] version = "1.24.1" -features = ["signal", "time"] +features = ["signal", "time", "rt"] [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-bindgen-futures] version = "0.4" diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index 5ec59612f0..94dc7a4ec2 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -33,5 +33,5 @@ nym-mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common" } network-defaults = { path = "../common/network-defaults" } logging = { path = "../common/logging"} -task = { path = "../common/task" } +nym-task = { path = "../common/task" } validator-client = { path = "../common/client-libs/validator-client", features=["nyxd-client"] } diff --git a/explorer-api/src/country_statistics/distribution.rs b/explorer-api/src/country_statistics/distribution.rs index 93d12067b6..f834b831c7 100644 --- a/explorer-api/src/country_statistics/distribution.rs +++ b/explorer-api/src/country_statistics/distribution.rs @@ -1,5 +1,5 @@ use log::info; -use task::TaskClient; +use nym_task::TaskClient; use crate::country_statistics::country_nodes_distribution::CountryNodesDistribution; use crate::COUNTRY_DATA_REFRESH_INTERVAL; diff --git a/explorer-api/src/country_statistics/geolocate.rs b/explorer-api/src/country_statistics/geolocate.rs index 0ae79985c7..8158c6e65e 100644 --- a/explorer-api/src/country_statistics/geolocate.rs +++ b/explorer-api/src/country_statistics/geolocate.rs @@ -4,7 +4,7 @@ use crate::mix_nodes::location::Location; use crate::state::ExplorerApiStateContext; use log::{info, warn}; -use task::TaskClient; +use nym_task::TaskClient; pub(crate) struct GeoLocateTask { state: ExplorerApiStateContext, diff --git a/explorer-api/src/main.rs b/explorer-api/src/main.rs index 8bf96be15f..208eaae3b9 100644 --- a/explorer-api/src/main.rs +++ b/explorer-api/src/main.rs @@ -8,7 +8,7 @@ use dotenv::dotenv; use log::info; use logging::setup_logging; use network_defaults::setup_env; -use task::TaskManager; +use nym_task::TaskManager; pub(crate) mod cache; mod client; diff --git a/explorer-api/src/tasks.rs b/explorer-api/src/tasks.rs index 264240abf2..0602a2af69 100644 --- a/explorer-api/src/tasks.rs +++ b/explorer-api/src/tasks.rs @@ -4,7 +4,7 @@ use std::future::Future; use nym_mixnet_contract_common::GatewayBond; -use task::TaskClient; +use nym_task::TaskClient; use validator_client::models::MixNodeBondAnnotated; use validator_client::nyxd::error::NyxdError; use validator_client::nyxd::{Paging, QueryNyxdClient, ValidatorResponse}; diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 27f8bd2edf..2db8b0fd1f 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -67,7 +67,7 @@ nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } statistics-common = { path = "../common/statistics" } nym-api-requests = { path = "../nym-api/nym-api-requests" } -task = { path = "../common/task" } +nym-task = { path = "../common/task" } validator-client = { path = "../common/client-libs/validator-client", features = [ "nyxd-client", ] } diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index a5a69e9980..8088f93b14 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -21,7 +21,7 @@ use tokio_tungstenite::tungstenite::protocol::Message; use crate::node::client_handling::bandwidth::Bandwidth; use crate::node::client_handling::FREE_TESTNET_BANDWIDTH_VALUE; use gateway_requests::iv::IV; -use task::TaskClient; +use nym_task::TaskClient; #[derive(Debug, Error)] pub(crate) enum RequestHandlingError { diff --git a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs index 9347f72cf5..ebd90206bc 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs @@ -643,7 +643,7 @@ where None } - pub(crate) async fn start_handling(self, shutdown: task::TaskClient) + pub(crate) async fn start_handling(self, shutdown: nym_task::TaskClient) where S: AsyncRead + AsyncWrite + Unpin + Send, { diff --git a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs index b11a8f21eb..bdd3efa72d 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/mod.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/mod.rs @@ -6,8 +6,8 @@ use gateway_requests::registration::handshake::SharedKeys; use gateway_requests::ServerResponse; use log::{trace, warn}; use nym_sphinx::DestinationAddressBytes; +use nym_task::TaskClient; use rand::{CryptoRng, Rng}; -use task::TaskClient; use tokio::io::{AsyncRead, AsyncWrite}; use tokio_tungstenite::WebSocketStream; diff --git a/gateway/src/node/client_handling/websocket/listener.rs b/gateway/src/node/client_handling/websocket/listener.rs index 1cf3e68072..02882cebc0 100644 --- a/gateway/src/node/client_handling/websocket/listener.rs +++ b/gateway/src/node/client_handling/websocket/listener.rs @@ -43,7 +43,7 @@ impl Listener { outbound_mix_sender: MixForwardingSender, storage: St, active_clients_store: ActiveClientsStore, - mut shutdown: task::TaskClient, + mut shutdown: nym_task::TaskClient, ) where St: Storage + Clone + 'static, { @@ -94,7 +94,7 @@ impl Listener { outbound_mix_sender: MixForwardingSender, storage: St, active_clients_store: ActiveClientsStore, - shutdown: task::TaskClient, + shutdown: nym_task::TaskClient, ) -> JoinHandle<()> where St: Storage + Clone + 'static, diff --git a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs index 14c9725adc..bd566f5c2f 100644 --- a/gateway/src/node/mixnet_handling/receiver/connection_handler.rs +++ b/gateway/src/node/mixnet_handling/receiver/connection_handler.rs @@ -14,9 +14,9 @@ use nym_sphinx::forwarding::packet::MixPacket; use nym_sphinx::framing::codec::SphinxCodec; use nym_sphinx::framing::packet::FramedSphinxPacket; use nym_sphinx::DestinationAddressBytes; +use nym_task::TaskClient; use std::collections::HashMap; use std::net::SocketAddr; -use task::TaskClient; use tokio::net::TcpStream; use tokio_util::codec::Framed; diff --git a/gateway/src/node/mixnet_handling/receiver/listener.rs b/gateway/src/node/mixnet_handling/receiver/listener.rs index 88bca3e2c8..38fd8ef43b 100644 --- a/gateway/src/node/mixnet_handling/receiver/listener.rs +++ b/gateway/src/node/mixnet_handling/receiver/listener.rs @@ -4,9 +4,9 @@ use crate::node::mixnet_handling::receiver::connection_handler::ConnectionHandler; use crate::node::storage::Storage; use log::*; +use nym_task::TaskClient; use std::net::SocketAddr; use std::process; -use task::TaskClient; use tokio::task::JoinHandle; pub(crate) struct Listener { diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index 6a3300affd..3fa11671d4 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -18,6 +18,7 @@ use log::*; use mixnet_client::forwarder::{MixForwardingSender, PacketForwarder}; use network_defaults::NymNetworkDetails; use nym_crypto::asymmetric::{encryption, identity}; +use nym_task::{TaskClient, TaskManager}; use rand::seq::SliceRandom; use rand::thread_rng; use statistics_common::collector::StatisticsSender; @@ -25,7 +26,6 @@ use std::error::Error; use std::net::SocketAddr; use std::process; use std::sync::Arc; -use task::{TaskClient, TaskManager}; use validator_client::Client; pub(crate) mod client_handling; diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 21c2534fc1..fd57ab1775 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -50,7 +50,7 @@ mixnode-common = { path="../common/mixnode-common" } nonexhaustive-delayqueue = { path="../common/nonexhaustive-delayqueue" } nym-sphinx = { path="../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore", version = "0.1.0" } -task = { path = "../common/task" } +nym-task = { path = "../common/task" } nym-types = { path = "../common/types" } nym-topology = { path="../common/topology" } validator-client = { path="../common/client-libs/validator-client" } diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index 6624e74a56..5bc0c73d35 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -23,13 +23,13 @@ use config::NymConfig; use log::{error, info, warn}; use mixnode_common::verloc::{self, AtomicVerlocResult, VerlocMeasurer}; use nym_crypto::asymmetric::{encryption, identity}; +use nym_task::{TaskClient, TaskManager}; use nym_version_checker::parse_version; use rand::seq::SliceRandom; use rand::thread_rng; use std::net::SocketAddr; use std::process; use std::sync::Arc; -use task::{TaskClient, TaskManager}; mod http; mod listener; diff --git a/mixnode/src/node/node_statistics.rs b/mixnode/src/node/node_statistics.rs index 2fa8c39b8e..2187d77a91 100644 --- a/mixnode/src/node/node_statistics.rs +++ b/mixnode/src/node/node_statistics.rs @@ -503,7 +503,7 @@ impl Controller { #[cfg(test)] mod tests { use super::*; - use task::TaskManager; + use nym_task::TaskManager; #[tokio::test] async fn node_stats_reported_are_received() { diff --git a/mixnode/src/node/packet_delayforwarder.rs b/mixnode/src/node/packet_delayforwarder.rs index c4958f8708..557440301f 100644 --- a/mixnode/src/node/packet_delayforwarder.rs +++ b/mixnode/src/node/packet_delayforwarder.rs @@ -134,7 +134,7 @@ mod tests { use std::sync::{Arc, Mutex}; use std::time::Duration; - use task::TaskManager; + use nym_task::TaskManager; use nym_sphinx::addressing::nodes::NymNodeRoutingAddress; use nym_sphinx_params::packet_sizes::PacketSize; diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index a9801a7bc1..2a9f60630f 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -87,7 +87,7 @@ multisig-contract-common = { path = "../common/cosmwasm-smart-contracts/multisig nymcoconut = { path = "../common/nymcoconut" } nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } -task = { path = "../common/task" } +nym-task = { path = "../common/task" } nym-topology = { path = "../common/topology" } nym-api-requests = { path = "nym-api-requests" } validator-client = { path = "../common/client-libs/validator-client", features = [ diff --git a/nym-api/src/circulating_supply_api/cache/refresher.rs b/nym-api/src/circulating_supply_api/cache/refresher.rs index 75f6e5cdc2..c28859eb15 100644 --- a/nym-api/src/circulating_supply_api/cache/refresher.rs +++ b/nym-api/src/circulating_supply_api/cache/refresher.rs @@ -5,10 +5,10 @@ use super::CirculatingSupplyCache; use crate::circulating_supply_api::cache::CirculatingSupplyCacheError; use crate::support::nyxd::Client; use nym_contracts_common::truncate_decimal; +use nym_task::TaskClient; use std::collections::HashSet; use std::sync::atomic::Ordering; use std::time::Duration; -use task::TaskClient; use tokio::time; use validator_client::nyxd::Coin; diff --git a/nym-api/src/circulating_supply_api/mod.rs b/nym-api/src/circulating_supply_api/mod.rs index 900d38380b..39dfe28edc 100644 --- a/nym-api/src/circulating_supply_api/mod.rs +++ b/nym-api/src/circulating_supply_api/mod.rs @@ -1,10 +1,10 @@ // Copyright 2022-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use nym_task::TaskManager; use okapi::openapi3::OpenApi; use rocket::Route; use rocket_okapi::{openapi_get_routes_spec, settings::OpenApiSettings}; -use task::TaskManager; use crate::support::{config::Config, nyxd}; diff --git a/nym-api/src/coconut/dkg/controller.rs b/nym-api/src/coconut/dkg/controller.rs index 26f693e73b..6ae32cfad5 100644 --- a/nym-api/src/coconut/dkg/controller.rs +++ b/nym-api/src/coconut/dkg/controller.rs @@ -16,11 +16,11 @@ use crate::support::config::Config; use anyhow::Result; use coconut_dkg_common::types::EpochState; use dkg::bte::keys::KeyPair as DkgKeyPair; +use nym_task::{TaskClient, TaskManager}; use rand::rngs::OsRng; use rand::RngCore; use std::path::PathBuf; use std::time::{Duration, SystemTime}; -use task::{TaskClient, TaskManager}; use tokio::time::interval; pub(crate) fn init_keypair(config: &Config) -> Result<()> { diff --git a/nym-api/src/epoch_operations/mod.rs b/nym-api/src/epoch_operations/mod.rs index f4e13d691f..ab8194f17e 100644 --- a/nym-api/src/epoch_operations/mod.rs +++ b/nym-api/src/epoch_operations/mod.rs @@ -24,12 +24,12 @@ use nym_mixnet_contract_common::{ reward_params::Performance, CurrentIntervalResponse, ExecuteMsg, Interval, MixId, }; use nym_mixnet_contract_common::{IdentityKey, Layer, LayerAssignment, MixNodeDetails}; +use nym_task::{TaskClient, TaskManager}; use rand::prelude::SliceRandom; use rand::rngs::OsRng; use std::collections::HashMap; use std::collections::HashSet; use std::time::Duration; -use task::{TaskClient, TaskManager}; use tokio::time::sleep; pub(crate) mod error; diff --git a/nym-api/src/main.rs b/nym-api/src/main.rs index 4258fe53c1..7711db94ca 100644 --- a/nym-api/src/main.rs +++ b/nym-api/src/main.rs @@ -21,10 +21,10 @@ use log::info; use logging::setup_logging; use node_status_api::NodeStatusCache; use nym_contract_cache::cache::NymContractCache; +use nym_task::TaskManager; use rand::rngs::OsRng; use std::error::Error; use support::{http, nyxd}; -use task::TaskManager; mod circulating_supply_api; mod coconut; diff --git a/nym-api/src/network_monitor/mod.rs b/nym-api/src/network_monitor/mod.rs index 49ceca5768..4e32c61f7b 100644 --- a/nym-api/src/network_monitor/mod.rs +++ b/nym-api/src/network_monitor/mod.rs @@ -20,8 +20,8 @@ use credential_storage::PersistentStorage; use futures::channel::mpsc; use gateway_client::bandwidth::BandwidthController; use nym_crypto::asymmetric::{encryption, identity}; +use nym_task::TaskManager; use std::sync::Arc; -use task::TaskManager; use validator_client::nyxd::SigningNyxdClient; pub(crate) mod chunker; diff --git a/nym-api/src/network_monitor/monitor/gateways_pinger.rs b/nym-api/src/network_monitor/monitor/gateways_pinger.rs index e3ad14a77b..4d0a0e7f0e 100644 --- a/nym-api/src/network_monitor/monitor/gateways_pinger.rs +++ b/nym-api/src/network_monitor/monitor/gateways_pinger.rs @@ -6,8 +6,8 @@ use crate::network_monitor::monitor::receiver::{GatewayClientUpdate, GatewayClie use log::{debug, info, trace, warn}; use nym_crypto::asymmetric::identity; use nym_crypto::asymmetric::identity::PUBLIC_KEY_LENGTH; +use nym_task::TaskClient; use std::time::Duration; -use task::TaskClient; use tokio::time::{sleep, Instant}; // TODO: should it perhaps be moved to config along other timeout values? diff --git a/nym-api/src/network_monitor/monitor/mod.rs b/nym-api/src/network_monitor/monitor/mod.rs index d3cb775f26..5fa7ef0793 100644 --- a/nym-api/src/network_monitor/monitor/mod.rs +++ b/nym-api/src/network_monitor/monitor/mod.rs @@ -10,9 +10,9 @@ use crate::network_monitor::test_route::TestRoute; use crate::storage::NymApiStorage; use crate::support::config::Config; use log::{debug, error, info}; +use nym_task::TaskClient; use std::collections::{HashMap, HashSet}; use std::process; -use task::TaskClient; use tokio::time::{sleep, Duration, Instant}; pub(crate) mod gateway_clients_cache; diff --git a/nym-api/src/network_monitor/monitor/receiver.rs b/nym-api/src/network_monitor/monitor/receiver.rs index f9b45f402e..fd7d441b30 100644 --- a/nym-api/src/network_monitor/monitor/receiver.rs +++ b/nym-api/src/network_monitor/monitor/receiver.rs @@ -7,7 +7,7 @@ use futures::channel::mpsc; use futures::StreamExt; use gateway_client::{AcknowledgementReceiver, MixnetMessageReceiver}; use nym_crypto::asymmetric::identity; -use task::TaskClient; +use nym_task::TaskClient; pub(crate) type GatewayClientUpdateSender = mpsc::UnboundedSender; pub(crate) type GatewayClientUpdateReceiver = mpsc::UnboundedReceiver; diff --git a/nym-api/src/network_monitor/monitor/sender.rs b/nym-api/src/network_monitor/monitor/sender.rs index 432dd122e0..6911cd0dbb 100644 --- a/nym-api/src/network_monitor/monitor/sender.rs +++ b/nym-api/src/network_monitor/monitor/sender.rs @@ -17,6 +17,7 @@ use gateway_client::{AcknowledgementReceiver, GatewayClient, MixnetMessageReceiv use log::{debug, info, trace, warn}; use nym_crypto::asymmetric::identity::{self, PUBLIC_KEY_LENGTH}; use nym_sphinx::forwarding::packet::MixPacket; +use nym_task::TaskClient; use pin_project::pin_project; use std::mem; use std::num::NonZeroUsize; @@ -24,7 +25,6 @@ use std::pin::Pin; use std::sync::Arc; use std::task::Poll; use std::time::Duration; -use task::TaskClient; use gateway_client::bandwidth::BandwidthController; use validator_client::nyxd::SigningNyxdClient; @@ -194,7 +194,7 @@ impl PacketSender { ack_sender, fresh_gateway_client_data.gateway_response_timeout, Some(fresh_gateway_client_data.bandwidth_controller.clone()), - task::TaskClient::dummy(), + nym_task::TaskClient::dummy(), ); gateway_client diff --git a/nym-api/src/node_status_api/cache/refresher.rs b/nym-api/src/node_status_api/cache/refresher.rs index 704aaca203..146e75ebfb 100644 --- a/nym-api/src/node_status_api/cache/refresher.rs +++ b/nym-api/src/node_status_api/cache/refresher.rs @@ -12,8 +12,8 @@ use crate::{ storage::NymApiStorage, support::caching::CacheNotification, }; +use nym_task::TaskClient; use std::time::Duration; -use task::TaskClient; use tokio::sync::watch; use tokio::time; diff --git a/nym-api/src/node_status_api/mod.rs b/nym-api/src/node_status_api/mod.rs index 8b403ad4c8..c8b3718fa6 100644 --- a/nym-api/src/node_status_api/mod.rs +++ b/nym-api/src/node_status_api/mod.rs @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 pub(crate) use cache::NodeStatusCache; +use nym_task::TaskManager; use okapi::openapi3::OpenApi; use rocket::Route; use rocket_okapi::{openapi_get_routes_spec, settings::OpenApiSettings}; use std::time::Duration; -use task::TaskManager; use crate::{ nym_contract_cache::cache::NymContractCache, diff --git a/nym-api/src/node_status_api/uptime_updater.rs b/nym-api/src/node_status_api/uptime_updater.rs index e17dc9354a..78d4116e11 100644 --- a/nym-api/src/node_status_api/uptime_updater.rs +++ b/nym-api/src/node_status_api/uptime_updater.rs @@ -7,8 +7,8 @@ use crate::node_status_api::models::{ use crate::node_status_api::ONE_DAY; use crate::storage::NymApiStorage; use log::error; +use nym_task::{TaskClient, TaskManager}; use std::time::Duration; -use task::{TaskClient, TaskManager}; use time::{OffsetDateTime, PrimitiveDateTime, Time}; use tokio::time::{interval, sleep}; diff --git a/nym-api/src/nym_contract_cache/cache/refresher.rs b/nym-api/src/nym_contract_cache/cache/refresher.rs index 8f1bd1df4a..4f3241a7aa 100644 --- a/nym-api/src/nym_contract_cache/cache/refresher.rs +++ b/nym-api/src/nym_contract_cache/cache/refresher.rs @@ -3,8 +3,8 @@ use crate::nyxd::Client; use crate::support::caching::CacheNotification; use anyhow::Result; use nym_mixnet_contract_common::{MixId, MixNodeDetails, RewardedSetNodeStatus}; +use nym_task::TaskClient; use std::{collections::HashMap, sync::atomic::Ordering, time::Duration}; -use task::TaskClient; use tokio::sync::watch; use tokio::time; diff --git a/nym-api/src/nym_contract_cache/mod.rs b/nym-api/src/nym_contract_cache/mod.rs index 242cb8ae7a..e3f4ef267c 100644 --- a/nym-api/src/nym_contract_cache/mod.rs +++ b/nym-api/src/nym_contract_cache/mod.rs @@ -4,11 +4,11 @@ use crate::nym_contract_cache::cache::NymContractCache; use crate::support::config::Config; use crate::support::{self, nyxd}; +use nym_task::TaskManager; use okapi::openapi3::OpenApi; use rocket::Route; use rocket_okapi::openapi_get_routes_spec; use rocket_okapi::settings::OpenApiSettings; -use task::TaskManager; use self::cache::refresher::NymContractCacheRefresher; diff --git a/nym-connect-android/src-tauri/Cargo.lock b/nym-connect-android/src-tauri/Cargo.lock index 1d419591d2..36202e1a32 100644 --- a/nym-connect-android/src-tauri/Cargo.lock +++ b/nym-connect-android/src-tauri/Cargo.lock @@ -644,18 +644,18 @@ dependencies = [ "nonexhaustive-delayqueue", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", + "nym-task", + "nym-topology", "rand 0.7.3", "serde", "serde_json", "sqlx 0.6.2", "tap", - "task", "thiserror", "time 0.3.18", "tokio", "tokio-stream", - "topology", "url", "validator-client", "wasm-bindgen", @@ -1977,10 +1977,10 @@ dependencies = [ "network-defaults", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", + "nym-task", "rand 0.7.3", "serde", - "task", "thiserror", "tokio", "tokio-stream", @@ -2005,7 +2005,7 @@ dependencies = [ "log", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", "rand 0.7.3", "serde", "serde_json", @@ -3562,6 +3562,7 @@ dependencies = [ "nym-contracts-common", "nym-crypto", "nym-socks5-client", + "nym-task", "pretty_env_logger", "rand 0.8.5", "reqwest", @@ -3570,14 +3571,12 @@ dependencies = [ "serde_json", "serde_repr", "tap", - "task", "tauri", "tauri-build", "tempfile", "tendermint-rpc", "thiserror", "tokio", - "topology", "ts-rs", "url", "yaml-rust", @@ -3609,7 +3608,7 @@ dependencies = [ "hkdf 0.12.3", "hmac 0.12.1", "nym-pemstore", - "nymsphinx-types", + "nym-sphinx-types", "rand 0.7.3", "subtle-encoding", "thiserror", @@ -3663,7 +3662,10 @@ dependencies = [ "network-defaults", "nym-crypto", "nym-pemstore", - "nymsphinx", + "nym-sphinx", + "nym-task", + "nym-topology", + "nym-version-checker", "ordered-buffer", "pin-project", "pretty_env_logger", @@ -3674,13 +3676,169 @@ dependencies = [ "service-providers-common", "socks5-requests", "tap", - "task", "thiserror", "tokio", - "topology", "url", "validator-client", - "version-checker", +] + +[[package]] +name = "nym-sphinx" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-sphinx-acknowledgements", + "nym-sphinx-addressing", + "nym-sphinx-anonymous-replies", + "nym-sphinx-chunking", + "nym-sphinx-cover", + "nym-sphinx-forwarding", + "nym-sphinx-framing", + "nym-sphinx-params", + "nym-sphinx-types", + "nym-topology", + "rand 0.7.3", + "rand_distr", + "thiserror", + "tokio", +] + +[[package]] +name = "nym-sphinx-acknowledgements" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-pemstore", + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", + "nym-topology", + "rand 0.7.3", + "thiserror", +] + +[[package]] +name = "nym-sphinx-addressing" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-sphinx-types", + "serde", + "thiserror", +] + +[[package]] +name = "nym-sphinx-anonymous-replies" +version = "0.1.0" +dependencies = [ + "bs58", + "nym-crypto", + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", + "nym-topology", + "rand 0.7.3", + "serde", + "thiserror", + "wasm-bindgen", +] + +[[package]] +name = "nym-sphinx-chunking" +version = "0.1.0" +dependencies = [ + "log", + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", + "rand 0.7.3", + "thiserror", +] + +[[package]] +name = "nym-sphinx-cover" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-sphinx-acknowledgements", + "nym-sphinx-addressing", + "nym-sphinx-chunking", + "nym-sphinx-forwarding", + "nym-sphinx-params", + "nym-sphinx-types", + "nym-topology", + "rand 0.7.3", + "thiserror", +] + +[[package]] +name = "nym-sphinx-forwarding" +version = "0.1.0" +dependencies = [ + "nym-sphinx-addressing", + "nym-sphinx-params", + "nym-sphinx-types", +] + +[[package]] +name = "nym-sphinx-framing" +version = "0.1.0" +dependencies = [ + "bytes", + "nym-sphinx-params", + "nym-sphinx-types", + "thiserror", + "tokio-util", +] + +[[package]] +name = "nym-sphinx-params" +version = "0.1.0" +dependencies = [ + "nym-crypto", + "nym-sphinx-types", + "thiserror", +] + +[[package]] +name = "nym-sphinx-types" +version = "0.1.0" +dependencies = [ + "sphinx", +] + +[[package]] +name = "nym-task" +version = "0.1.0" +dependencies = [ + "futures", + "log", + "thiserror", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "nym-topology" +version = "0.1.0" +dependencies = [ + "bs58", + "log", + "nym-crypto", + "nym-mixnet-contract-common", + "nym-sphinx-addressing", + "nym-sphinx-types", + "nym-version-checker", + "rand 0.7.3", + "thiserror", +] + +[[package]] +name = "nym-version-checker" +version = "0.1.0" +dependencies = [ + "semver 0.11.0", ] [[package]] @@ -3729,131 +3887,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "nymsphinx" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nymsphinx-acknowledgements", - "nymsphinx-addressing", - "nymsphinx-anonymous-replies", - "nymsphinx-chunking", - "nymsphinx-cover", - "nymsphinx-forwarding", - "nymsphinx-framing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "rand_distr", - "thiserror", - "tokio", - "topology", -] - -[[package]] -name = "nymsphinx-acknowledgements" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nym-pemstore", - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "thiserror", - "topology", -] - -[[package]] -name = "nymsphinx-addressing" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nymsphinx-types", - "serde", - "thiserror", -] - -[[package]] -name = "nymsphinx-anonymous-replies" -version = "0.1.0" -dependencies = [ - "bs58", - "nym-crypto", - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "serde", - "thiserror", - "topology", - "wasm-bindgen", -] - -[[package]] -name = "nymsphinx-chunking" -version = "0.1.0" -dependencies = [ - "log", - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "thiserror", -] - -[[package]] -name = "nymsphinx-cover" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nymsphinx-acknowledgements", - "nymsphinx-addressing", - "nymsphinx-chunking", - "nymsphinx-forwarding", - "nymsphinx-params", - "nymsphinx-types", - "rand 0.7.3", - "thiserror", - "topology", -] - -[[package]] -name = "nymsphinx-forwarding" -version = "0.1.0" -dependencies = [ - "nymsphinx-addressing", - "nymsphinx-params", - "nymsphinx-types", -] - -[[package]] -name = "nymsphinx-framing" -version = "0.1.0" -dependencies = [ - "bytes", - "nymsphinx-params", - "nymsphinx-types", - "thiserror", - "tokio-util", -] - -[[package]] -name = "nymsphinx-params" -version = "0.1.0" -dependencies = [ - "nym-crypto", - "nymsphinx-types", - "thiserror", -] - -[[package]] -name = "nymsphinx-types" -version = "0.1.0" -dependencies = [ - "sphinx", -] - [[package]] name = "objc" version = "0.2.7" @@ -4482,9 +4515,9 @@ dependencies = [ "client-connections", "futures", "log", + "nym-task", "ordered-buffer", "socks5-requests", - "task", "tokio", "tokio-util", ] @@ -5331,7 +5364,7 @@ dependencies = [ "async-trait", "build-information", "log", - "nymsphinx-anonymous-replies", + "nym-sphinx-anonymous-replies", "serde", "serde_json", "thiserror", @@ -5479,7 +5512,7 @@ dependencies = [ name = "socks5-requests" version = "0.1.0" dependencies = [ - "nymsphinx-addressing", + "nym-sphinx-addressing", "serde", "serde_json", "service-providers-common", @@ -5981,18 +6014,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "task" -version = "0.1.0" -dependencies = [ - "futures", - "log", - "thiserror", - "tokio", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "tauri" version = "2.0.0-alpha.3" @@ -6527,21 +6548,6 @@ dependencies = [ "toml_datetime", ] -[[package]] -name = "topology" -version = "0.1.0" -dependencies = [ - "bs58", - "log", - "nym-crypto", - "nym-mixnet-contract-common", - "nymsphinx-addressing", - "nymsphinx-types", - "rand 0.7.3", - "thiserror", - "version-checker", -] - [[package]] name = "tower-service" version = "0.3.2" @@ -6867,13 +6873,6 @@ dependencies = [ "time 0.3.18", ] -[[package]] -name = "version-checker" -version = "0.1.0" -dependencies = [ - "semver 0.11.0", -] - [[package]] name = "version-compare" version = "0.1.1" diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect-android/src-tauri/Cargo.toml index 63cfe55553..2971937987 100644 --- a/nym-connect-android/src-tauri/Cargo.toml +++ b/nym-connect-android/src-tauri/Cargo.toml @@ -53,7 +53,7 @@ config-common = { path = "../../common/config", package = "config" } nym-crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} nym-socks5-client = { path = "../../clients/socks5", features = ["mobile"], default-features = false } -task = { path = "../../common/task" } +nym-task = { path = "../../common/task" } [dev-dependencies] ts-rs = "6.1.2" diff --git a/nym-connect-android/src-tauri/src/events.rs b/nym-connect-android/src-tauri/src/events.rs index 13e1ca800d..cf277a90f9 100644 --- a/nym-connect-android/src-tauri/src/events.rs +++ b/nym-connect-android/src-tauri/src/events.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use client_core::error::ClientCoreStatusMessage; -use task::manager::TaskStatus; +use nym_task::manager::TaskStatus; use tauri::async_runtime::RwLock; use crate::{ diff --git a/nym-connect-android/src-tauri/src/state.rs b/nym-connect-android/src-tauri/src/state.rs index 0af63ce1e0..e3cff0a105 100644 --- a/nym-connect-android/src-tauri/src/state.rs +++ b/nym-connect-android/src-tauri/src/state.rs @@ -171,7 +171,7 @@ impl State { pub async fn start_connecting( &mut self, window: &tauri::Window, - ) -> Result<(task::StatusReceiver, ExitStatusReceiver)> { + ) -> Result<(nym_task::StatusReceiver, ExitStatusReceiver)> { self.set_state(ConnectionStatusKind::Connecting, window); let res = self.init_config().await; @@ -214,7 +214,7 @@ impl State { &mut self, config: Config, keys: KeyManager, - ) -> Result<(task::StatusReceiver, ExitStatusReceiver)> { + ) -> Result<(nym_task::StatusReceiver, ExitStatusReceiver)> { let id = self.get_config_id()?; let (control_tx, msg_rx, exit_status_rx, used_gateway) = tasks::start_nym_socks5_client(&id, config, keys)?; diff --git a/nym-connect-android/src-tauri/src/tasks.rs b/nym-connect-android/src-tauri/src/tasks.rs index eb6f691825..58f7d8469f 100644 --- a/nym-connect-android/src-tauri/src/tasks.rs +++ b/nym-connect-android/src-tauri/src/tasks.rs @@ -4,9 +4,9 @@ use client_core::{ error::ClientCoreStatusMessage, }; use futures::{channel::mpsc, StreamExt}; +use nym_task::manager::TaskStatus; use std::sync::Arc; use tap::TapFallible; -use task::manager::TaskStatus; use tokio::sync::RwLock; use config_common::NymConfig; @@ -40,7 +40,7 @@ pub fn start_nym_socks5_client( keys: KeyManager, ) -> Result<( Socks5ControlMessageSender, - task::StatusReceiver, + nym_task::StatusReceiver, ExitStatusReceiver, GatewayEndpointConfig, )> { @@ -138,7 +138,7 @@ pub fn start_connection_check(state: Arc>, window: tauri::Window>, window: tauri::Window, - mut msg_receiver: task::StatusReceiver, + mut msg_receiver: nym_task::StatusReceiver, ) { log::info!("Starting status listener"); diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/src-tauri/Cargo.toml index a5ceea91db..887360b22f 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/src-tauri/Cargo.toml @@ -51,7 +51,7 @@ config-common = { path = "../../common/config", package = "config" } nym-crypto = { path = "../../common/crypto" } logging = { path = "../../common/logging"} nym-socks5-client = { path = "../../clients/socks5" } -task = { path = "../../common/task" } +nym-task = { path = "../../common/task" } [dev-dependencies] ts-rs = "6.1.2" diff --git a/nym-connect/src-tauri/src/events.rs b/nym-connect/src-tauri/src/events.rs index 13e1ca800d..cf277a90f9 100644 --- a/nym-connect/src-tauri/src/events.rs +++ b/nym-connect/src-tauri/src/events.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use client_core::error::ClientCoreStatusMessage; -use task::manager::TaskStatus; +use nym_task::manager::TaskStatus; use tauri::async_runtime::RwLock; use crate::{ diff --git a/nym-connect/src-tauri/src/state.rs b/nym-connect/src-tauri/src/state.rs index 949adfe8dc..2262ca316b 100644 --- a/nym-connect/src-tauri/src/state.rs +++ b/nym-connect/src-tauri/src/state.rs @@ -164,7 +164,7 @@ impl State { pub async fn start_connecting( &mut self, window: &tauri::Window, - ) -> Result<(task::StatusReceiver, ExitStatusReceiver)> { + ) -> Result<(nym_task::StatusReceiver, ExitStatusReceiver)> { self.set_state(ConnectionStatusKind::Connecting, window); // Setup configuration by writing to file @@ -199,7 +199,9 @@ impl State { } /// Spawn a new thread running the SOCKS5 client - fn start_nym_socks5_client(&mut self) -> Result<(task::StatusReceiver, ExitStatusReceiver)> { + fn start_nym_socks5_client( + &mut self, + ) -> Result<(nym_task::StatusReceiver, ExitStatusReceiver)> { let id = self.get_config_id()?; let (control_tx, msg_rx, exit_status_rx, used_gateway) = tasks::start_nym_socks5_client(&id)?; diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index 1cf53b55d3..389ce7a733 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -3,9 +3,9 @@ use client_core::{ error::ClientCoreStatusMessage, }; use futures::{channel::mpsc, StreamExt}; +use nym_task::manager::TaskStatus; use std::sync::Arc; use tap::TapFallible; -use task::manager::TaskStatus; use tokio::sync::RwLock; use config_common::NymConfig; @@ -36,7 +36,7 @@ pub fn start_nym_socks5_client( id: &str, ) -> Result<( Socks5ControlMessageSender, - task::StatusReceiver, + nym_task::StatusReceiver, ExitStatusReceiver, GatewayEndpointConfig, )> { @@ -136,7 +136,7 @@ pub fn start_connection_check(state: Arc>, window: tauri::Window>, window: tauri::Window, - mut msg_receiver: task::StatusReceiver, + mut msg_receiver: nym_task::StatusReceiver, ) { log::info!("Starting status listener"); diff --git a/sdk/rust/nym-sdk/Cargo.toml b/sdk/rust/nym-sdk/Cargo.toml index 2fe416a829..67bad0b816 100644 --- a/sdk/rust/nym-sdk/Cargo.toml +++ b/sdk/rust/nym-sdk/Cargo.toml @@ -13,7 +13,7 @@ gateway-client = { path = "../../../common/client-libs/gateway-client" } gateway-requests = { path = "../../../gateway/gateway-requests" } network-defaults = { path = "../../../common/network-defaults" } nym-sphinx = { path = "../../../common/nymsphinx" } -task = { path = "../../../common/task" } +nym-task = { path = "../../../common/task" } validator-client = { path = "../../../common/client-libs/validator-client", features = ["nyxd-client"] } futures = "0.3" diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index fc5b216c64..11b5113d43 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -18,7 +18,7 @@ use nym_sphinx::{ addressing::clients::{ClientIdentity, Recipient}, receiver::ReconstructedMessage, }; -use task::TaskManager; +use nym_task::TaskManager; use futures::StreamExt; use validator_client::nyxd::SigningNyxdClient; diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 873b39521b..42b8a7a6f9 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -46,6 +46,6 @@ proxy-helpers = { path = "../../common/socks5/proxy-helpers" } service-providers-common = { path = "../common" } socks5-requests = { path = "../../common/socks5/requests" } statistics-common = { path = "../../common/statistics" } -task = { path = "../../common/task" } +nym-task = { path = "../../common/task" } nym-version-checker = { path = "../../common/version-checker" } websocket-requests = { path = "../../clients/native/websocket-requests" } diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index 6dc0a7da00..da0e8821f6 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -15,6 +15,7 @@ use futures::channel::mpsc; use log::warn; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::{TaskClient, TaskManager}; use proxy_helpers::connection_controller::{Controller, ControllerCommand, ControllerSender}; use proxy_helpers::proxy_runner::{MixProxyReader, MixProxySender}; use service_providers_common::interface::{ @@ -28,7 +29,6 @@ use socks5_requests::{ use statistics_common::collector::StatisticsSender; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; -use task::{TaskClient, TaskManager}; // Since it's an atomic, it's safe to be kept static and shared across threads static ACTIVE_PROXIES: AtomicUsize = AtomicUsize::new(0); @@ -188,7 +188,7 @@ impl NRServiceProviderBuilder { let (mix_input_sender, mix_input_receiver) = tokio::sync::mpsc::channel::(1); // Used to notify tasks to shutdown. Not all tasks fully supports this (yet). - let shutdown = task::TaskManager::default(); + let shutdown = nym_task::TaskManager::default(); // Controller for managing all active connections. let (mut active_connections_controller, controller_sender) = Controller::new( diff --git a/service-providers/network-requester/src/socks5/tcp.rs b/service-providers/network-requester/src/socks5/tcp.rs index e5ddd8a5c0..45f173c1c7 100644 --- a/service-providers/network-requester/src/socks5/tcp.rs +++ b/service-providers/network-requester/src/socks5/tcp.rs @@ -4,12 +4,12 @@ use crate::reply; use crate::reply::MixnetMessage; use client_connections::LaneQueueLengths; +use nym_task::TaskClient; use proxy_helpers::connection_controller::ConnectionReceiver; use proxy_helpers::proxy_runner::{MixProxySender, ProxyRunner}; use service_providers_common::interface::RequestVersion; use socks5_requests::{ConnectionId, RemoteAddress, Socks5Request}; use std::io; -use task::TaskClient; use tokio::net::TcpStream; /// An outbound TCP connection between the Socks5 service provider, which makes From 448b2353abd82cbebf87906c7d6766c23189c432 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 17:54:41 -0500 Subject: [PATCH 396/591] feat: add workflow for updating versions and changelog --- .github/workflows/tag-and-release.yml | 2 +- .../update-versions-and-changelog.yaml | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/update-versions-and-changelog.yaml diff --git a/.github/workflows/tag-and-release.yml b/.github/workflows/tag-and-release.yml index 16e40ad904..8b01947327 100644 --- a/.github/workflows/tag-and-release.yml +++ b/.github/workflows/tag-and-release.yml @@ -1,4 +1,4 @@ -name: Tag and release components +name: tag-and-release on: workflow_dispatch: diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml new file mode 100644 index 0000000000..143b088d83 --- /dev/null +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -0,0 +1,49 @@ +name: update-versions-and-changelog + +on: + workflow_dispatch: + inputs: + release_version: + description: "Release version, usually the milestone title" + required: true + type: string + +env: + CI_BOT_AUTHOR: "Nym bot" + CI_BOT_EMAIL: "nym-bot@users.noreply.github.com" + +jobs: + update-versions: + runs-on: ["self-hosted", "custom-runner-linux"] + steps: + - name: checkout-source + uses: actions/checkout@v3 + with: + ref: "release/${{ release_version }}" + + - name: checkout-ci-tools-repo + uses: actions/checkout@v3 + with: + repository: "nymtech/ci-tools" + ref: "master" + path: "ci-tools" + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: install-version-bumper + run: "cargo install --release" + working-directory: "ci-tools/version-bumper" + + - name: run-version-bumper + run: "version-bumper bump binaries" + + - name: push-changes-to-branch + run: | + git config --global user.name "${{ CI_BOT_AUTHOR }}" + git config --global user.email "${{ CI_BOT_EMAIL }}" + git checkout -b release/${{ release_version }}-preparation + git commit -am "chore: version bump in preparation for release" + git push -u origin release/${{ release_version }}-preparation From cde247df46734452c266cab7ff235f19a779a7b9 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 17:59:06 -0500 Subject: [PATCH 397/591] fix: added inputs prefix to variable in GH workflow --- .github/workflows/update-versions-and-changelog.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index 143b088d83..5b53babba8 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -19,7 +19,7 @@ jobs: - name: checkout-source uses: actions/checkout@v3 with: - ref: "release/${{ release_version }}" + ref: "release/${{ inputs.release_version }}" - name: checkout-ci-tools-repo uses: actions/checkout@v3 @@ -44,6 +44,6 @@ jobs: run: | git config --global user.name "${{ CI_BOT_AUTHOR }}" git config --global user.email "${{ CI_BOT_EMAIL }}" - git checkout -b release/${{ release_version }}-preparation + git checkout -b release/${{ inputs.release_version }}-preparation git commit -am "chore: version bump in preparation for release" - git push -u origin release/${{ release_version }}-preparation + git push -u origin release/${{ inputs.release_version }}-preparation From 013088161682906944d738a197e8d4a584c30bb5 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 17:59:48 -0500 Subject: [PATCH 398/591] fix: added env prefix to variables in GH workflow --- .github/workflows/update-versions-and-changelog.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index 5b53babba8..e1af3a544f 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -42,8 +42,8 @@ jobs: - name: push-changes-to-branch run: | - git config --global user.name "${{ CI_BOT_AUTHOR }}" - git config --global user.email "${{ CI_BOT_EMAIL }}" + git config --global user.name "${{ env.CI_BOT_AUTHOR }}" + git config --global user.email "${{ env.CI_BOT_EMAIL }}" git checkout -b release/${{ inputs.release_version }}-preparation git commit -am "chore: version bump in preparation for release" git push -u origin release/${{ inputs.release_version }}-preparation From ca7ee04e4745c201c48166f0847c733916a38eb1 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:14:10 -0500 Subject: [PATCH 399/591] fix: added access token to access private repos --- .github/workflows/update-versions-and-changelog.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index e1af3a544f..e6bf6c599f 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -27,6 +27,7 @@ jobs: repository: "nymtech/ci-tools" ref: "master" path: "ci-tools" + token: "${{ secret.ACCESS_TOKEN_PRIVATE_REPOS }}" - name: Install Rust stable uses: actions-rs/toolchain@v1 From dd08621329a187251d0824bb10b5244a5b00382f Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:15:09 -0500 Subject: [PATCH 400/591] fix: secret -> secrets --- .github/workflows/update-versions-and-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index e6bf6c599f..61c0e50874 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -27,7 +27,7 @@ jobs: repository: "nymtech/ci-tools" ref: "master" path: "ci-tools" - token: "${{ secret.ACCESS_TOKEN_PRIVATE_REPOS }}" + token: "${{ secrets.ACCESS_TOKEN_PRIVATE_REPOS }}" - name: Install Rust stable uses: actions-rs/toolchain@v1 From 36cf36aaaebca9b5b722a920eae6b82d83fdbe1d Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:16:44 -0500 Subject: [PATCH 401/591] fix: remove --release flag from cargo install --- .github/workflows/update-versions-and-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index 61c0e50874..504de7df4a 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -35,7 +35,7 @@ jobs: toolchain: stable - name: install-version-bumper - run: "cargo install --release" + run: "cargo install" working-directory: "ci-tools/version-bumper" - name: run-version-bumper From 31389dd886c81aeac9bb21c3f15d730fb958a06a Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:19:04 -0500 Subject: [PATCH 402/591] fix: update working directories --- .github/workflows/update-versions-and-changelog.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index 504de7df4a..b335e9d1f4 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -20,6 +20,7 @@ jobs: uses: actions/checkout@v3 with: ref: "release/${{ inputs.release_version }}" + path: "nym" - name: checkout-ci-tools-repo uses: actions/checkout@v3 @@ -40,6 +41,7 @@ jobs: - name: run-version-bumper run: "version-bumper bump binaries" + working-directory: "nym" - name: push-changes-to-branch run: | @@ -48,3 +50,4 @@ jobs: git checkout -b release/${{ inputs.release_version }}-preparation git commit -am "chore: version bump in preparation for release" git push -u origin release/${{ inputs.release_version }}-preparation + working-directory: "nym" From 1417eeeddbffb711630a85f2cad9cb56ffd04ed4 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:20:14 -0500 Subject: [PATCH 403/591] fix: change from custom runner to ubuntu-22.04 --- .github/workflows/update-versions-and-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index b335e9d1f4..ee0c920d77 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -14,7 +14,7 @@ env: jobs: update-versions: - runs-on: ["self-hosted", "custom-runner-linux"] + runs-on: ubuntu-22.04 steps: - name: checkout-source uses: actions/checkout@v3 From b98bf46675a287783642c07a5ca1a4f52ac6a183 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:21:27 -0500 Subject: [PATCH 404/591] fix: cargo install --- .github/workflows/update-versions-and-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index ee0c920d77..e42b59894f 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -36,7 +36,7 @@ jobs: toolchain: stable - name: install-version-bumper - run: "cargo install" + run: "cargo install --path ." working-directory: "ci-tools/version-bumper" - name: run-version-bumper From 57822e3c0d73b3717c94d1b3fa356be8061a1a62 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:25:36 -0500 Subject: [PATCH 405/591] fix: version-bumper --- .github/workflows/update-versions-and-changelog.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index e42b59894f..9b60378492 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -40,8 +40,7 @@ jobs: working-directory: "ci-tools/version-bumper" - name: run-version-bumper - run: "version-bumper bump binaries" - working-directory: "nym" + run: "version-bumper bump binaries --nym-repo-directory nym" - name: push-changes-to-branch run: | From b980bfcab8b19315e4cf7779599bffb3501c6fee Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 20 Feb 2023 18:35:17 -0500 Subject: [PATCH 406/591] feat: add changelog updater to the update-version-and-changelog GH workflow --- .../update-versions-and-changelog.yaml | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/.github/workflows/update-versions-and-changelog.yaml b/.github/workflows/update-versions-and-changelog.yaml index 9b60378492..8d98393108 100644 --- a/.github/workflows/update-versions-and-changelog.yaml +++ b/.github/workflows/update-versions-and-changelog.yaml @@ -7,6 +7,10 @@ on: description: "Release version, usually the milestone title" required: true type: string + milestone_id: + description: "Milestone ID, check the URL when you're on the specific milestone page" + required: true + type: string env: CI_BOT_AUTHOR: "Nym bot" @@ -50,3 +54,42 @@ jobs: git commit -am "chore: version bump in preparation for release" git push -u origin release/${{ inputs.release_version }}-preparation working-directory: "nym" + + update-changelog: + runs-on: ubuntu-22.04 + needs: [update-versions] + steps: + - name: checkout-source + uses: actions/checkout@v3 + with: + ref: "release/${{ inputs.release_version }}" + path: "nym" + + - name: checkout-ci-tools-repo + uses: actions/checkout@v3 + with: + repository: "nymtech/ci-tools" + ref: "master" + path: "ci-tools" + token: "${{ secrets.ACCESS_TOKEN_PRIVATE_REPOS }}" + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: install-changelog-updater + run: "cargo install --path ." + working-directory: "ci-tools/changelog-updater" + + - name: run-changelog-updater + run: "changelog-updater mix ${{ inputs.milestone_id }} release/${{ inputs.release_version }}" + + - name: push-changes-to-branch + run: | + git config --global user.name "${{ env.CI_BOT_AUTHOR }}" + git config --global user.email "${{ env.CI_BOT_EMAIL }}" + git checkout release/${{ inputs.release_version }}-preparation + git commit -am "chore: update changelog preparation for release" + git push + working-directory: "nym" From caff2077ae5cac244c691eaf9d4199e45a9bf656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Walther?= Date: Tue, 21 Feb 2023 11:23:10 +0100 Subject: [PATCH 407/591] Github Actions: fix notification display issue --- .../notifications/send_message_to_matrix.js | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/.github/workflows/support-files/notifications/send_message_to_matrix.js b/.github/workflows/support-files/notifications/send_message_to_matrix.js index 6b21b56184..aabd1d57aa 100644 --- a/.github/workflows/support-files/notifications/send_message_to_matrix.js +++ b/.github/workflows/support-files/notifications/send_message_to_matrix.js @@ -6,12 +6,6 @@ const { LocalStorageCryptoStore, } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'); -const vfile = require('to-vfile'); -const unified = require('unified'); -const remarkParse = require('remark-parse'); -const remarkHtml = require('remark-html'); -const emoji = require('remark-emoji'); - // hide all matrix client output console.error = (error) => console.log('❌ error: ', error); process.stderr.write = () => {}; @@ -59,18 +53,8 @@ function createClient(context, room, message) { return client; } -async function markdownToHtml(messageAsMarkdown) { - const file = await unified() - .use(emoji) - .use(remarkParse) - .use(remarkHtml) - .process(await vfile({ path: 'test.md', contents: messageAsMarkdown})); - return String(file); -} - async function sendMatrixMessage(contextArg, messageAsMarkdown, roomId) { - const messageAsHtml = await markdownToHtml(messageAsMarkdown); - const client = createClient(contextArg, roomId, messageAsHtml); + const client = createClient(contextArg, roomId, messageAsMarkdown); await client.initCrypto(); await client.startClient({ initialSyncLimit: 1 }); } From b1121dabb90820612ab7a800d353a470230eb395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 21 Feb 2023 11:30:23 +0100 Subject: [PATCH 408/591] Merge 4 tiny crates into nym-bin-common (#3065) * Rename to bin-common * Merge into new crate * Merge 3 crates into bin-common * WIP * Move build.rs to the correct place * regex nym_bin_common * regex nym_bin_common::build_information * regex nym_version_checker * Update some explicit mod paths * Makefile: add nym-connect-android * Additional fixes * rustfmt * Update crate metadata * Move completions crate into nym-bin-common * Makefile: add examples * Fix examples * rustfmt --- Cargo.lock | 92 ++++++------------- Cargo.toml | 4 +- Makefile | 36 ++++++-- clients/credential/Cargo.toml | 3 +- clients/credential/src/commands.rs | 2 +- clients/credential/src/main.rs | 4 +- clients/native/Cargo.toml | 5 +- clients/native/src/commands/mod.rs | 4 +- clients/native/src/commands/run.rs | 2 +- clients/native/src/commands/upgrade.rs | 2 +- clients/native/src/main.rs | 4 +- clients/socks5/Cargo.toml | 5 +- clients/socks5/src/commands/mod.rs | 4 +- clients/socks5/src/commands/run.rs | 2 +- clients/socks5/src/commands/upgrade.rs | 2 +- clients/socks5/src/main.rs | 4 +- .../.gitignore | 0 common/bin-common/Cargo.toml | 23 +++++ .../build.rs | 0 .../src/build_information/mod.rs} | 0 .../src/completions/mod.rs} | 0 common/bin-common/src/lib.rs | 7 ++ .../lib.rs => bin-common/src/logging/mod.rs} | 0 .../src/version_checker/mod.rs} | 0 common/build-information/Cargo.toml | 15 --- common/completions/Cargo.toml | 11 --- common/logging/Cargo.toml | 10 -- common/mixnode-common/Cargo.toml | 2 +- common/mixnode-common/src/verloc/mod.rs | 9 +- common/topology/Cargo.toml | 2 +- common/topology/src/filter.rs | 3 +- common/version-checker/Cargo.toml | 15 --- explorer-api/Cargo.toml | 2 +- explorer-api/src/main.rs | 2 +- gateway/Cargo.toml | 5 +- gateway/src/commands/mod.rs | 5 +- gateway/src/commands/upgrade.rs | 2 +- gateway/src/main.rs | 6 +- mixnode/Cargo.toml | 5 +- mixnode/src/commands/mod.rs | 5 +- mixnode/src/commands/upgrade.rs | 2 +- mixnode/src/main.rs | 6 +- mixnode/src/node/mod.rs | 2 +- nym-api/Cargo.toml | 4 +- nym-api/src/main.rs | 2 +- nym-api/src/support/cli/mod.rs | 2 +- nym-connect-android/src-tauri/Cargo.lock | 57 ++++-------- nym-connect-android/src-tauri/Cargo.toml | 2 +- nym-connect/src-tauri/Cargo.toml | 2 +- nym-wallet/Cargo.lock | 85 ++++++++++++++--- nym-wallet/nym-wallet-recovery-cli/Cargo.toml | 2 +- .../nym-wallet-recovery-cli/src/main.rs | 2 +- sdk/rust/nym-sdk/Cargo.toml | 2 +- sdk/rust/nym-sdk/examples/builder.rs | 2 +- .../nym-sdk/examples/builder_with_storage.rs | 2 +- .../manually_handle_keys_and_config.rs | 2 +- sdk/rust/nym-sdk/examples/simple.rs | 2 +- service-providers/common/Cargo.toml | 2 +- .../common/src/interface/control.rs | 2 +- .../network-requester/Cargo.toml | 5 +- .../network-requester/src/cli/mod.rs | 4 +- .../network-requester/src/cli/run.rs | 3 +- .../network-requester/src/core.rs | 2 +- .../network-requester/src/main.rs | 4 +- .../network-statistics/Cargo.toml | 2 +- .../network-statistics/src/main.rs | 2 +- tools/nym-cli/Cargo.toml | 2 +- tools/nym-cli/src/main.rs | 2 +- 68 files changed, 250 insertions(+), 262 deletions(-) rename common/{version-checker => bin-common}/.gitignore (100%) create mode 100644 common/bin-common/Cargo.toml rename common/{build-information => bin-common}/build.rs (100%) rename common/{build-information/src/lib.rs => bin-common/src/build_information/mod.rs} (100%) rename common/{completions/src/lib.rs => bin-common/src/completions/mod.rs} (100%) create mode 100644 common/bin-common/src/lib.rs rename common/{logging/src/lib.rs => bin-common/src/logging/mod.rs} (100%) rename common/{version-checker/src/lib.rs => bin-common/src/version_checker/mod.rs} (100%) delete mode 100644 common/build-information/Cargo.toml delete mode 100644 common/completions/Cargo.toml delete mode 100644 common/logging/Cargo.toml delete mode 100644 common/version-checker/Cargo.toml diff --git a/Cargo.lock b/Cargo.lock index 025fcd5e88..549e8ecbca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -445,14 +445,6 @@ dependencies = [ "serde", ] -[[package]] -name = "build-information" -version = "0.1.0" -dependencies = [ - "serde", - "vergen 7.5.1", -] - [[package]] name = "bumpalo" version = "3.12.0" @@ -805,15 +797,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "completions" -version = "0.1.0" -dependencies = [ - "clap 4.1.4", - "clap_complete", - "clap_complete_fig", -] - [[package]] name = "config" version = "0.1.0" @@ -1035,13 +1018,12 @@ dependencies = [ "bip39", "clap 4.1.4", "coconut-interface", - "completions", "config", "credential-storage", "credentials", "log", - "logging", "network-defaults", + "nym-bin-common", "nym-crypto", "nym-pemstore", "rand 0.7.3", @@ -1856,9 +1838,9 @@ dependencies = [ "isocountry", "itertools", "log", - "logging", "maxminddb", "network-defaults", + "nym-bin-common", "nym-contracts-common", "nym-mixnet-contract-common", "nym-task", @@ -3056,14 +3038,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "logging" -version = "0.1.0" -dependencies = [ - "log", - "pretty_env_logger", -] - [[package]] name = "loom" version = "0.5.6" @@ -3187,6 +3161,7 @@ dependencies = [ "humantime-serde", "log", "network-defaults", + "nym-bin-common", "nym-crypto", "nym-sphinx-acknowledgements", "nym-sphinx-addressing", @@ -3195,7 +3170,6 @@ dependencies = [ "nym-sphinx-params", "nym-sphinx-types", "nym-task", - "nym-version-checker", "rand 0.8.5", "serde", "thiserror", @@ -3374,7 +3348,6 @@ dependencies = [ "async-trait", "bip39", "bs58", - "build-information", "cfg-if", "clap 4.1.4", "coconut-bandwidth-contract-common", @@ -3398,9 +3371,9 @@ dependencies = [ "inclusion-probability", "lazy_static", "log", - "logging", "multisig-contract-common", "nym-api-requests", + "nym-bin-common", "nym-contracts-common", "nym-crypto", "nym-mixnet-contract-common", @@ -3408,7 +3381,6 @@ dependencies = [ "nym-sphinx", "nym-task", "nym-topology", - "nym-version-checker", "nym-vesting-contract-common", "nymcoconut", "okapi", @@ -3449,6 +3421,20 @@ dependencies = [ "ts-rs", ] +[[package]] +name = "nym-bin-common" +version = "0.1.0" +dependencies = [ + "clap 4.1.4", + "clap_complete", + "clap_complete_fig", + "log", + "pretty_env_logger", + "semver 0.11.0", + "serde", + "vergen 7.5.1", +] + [[package]] name = "nym-bity-integration" version = "0.1.0" @@ -3477,8 +3463,8 @@ dependencies = [ "clap_complete_fig", "dotenv", "log", - "logging", "network-defaults", + "nym-bin-common", "nym-cli-commands", "pretty_env_logger", "serde", @@ -3526,12 +3512,10 @@ dependencies = [ name = "nym-client" version = "1.1.9" dependencies = [ - "build-information", "clap 4.1.4", "client-connections", "client-core", "coconut-interface", - "completions", "config", "credential-storage", "credentials", @@ -3541,14 +3525,13 @@ dependencies = [ "gateway-requests", "lazy_static", "log", - "logging", "network-defaults", + "nym-bin-common", "nym-crypto", "nym-pemstore", "nym-sphinx", "nym-task", "nym-topology", - "nym-version-checker", "pretty_env_logger", "rand 0.7.3", "serde", @@ -3609,11 +3592,9 @@ dependencies = [ "atty", "bip39", "bs58", - "build-information", "clap 4.1.4", "coconut-interface", "colored", - "completions", "config", "credentials", "dashmap 4.0.2", @@ -3624,17 +3605,16 @@ dependencies = [ "humantime-serde", "lazy_static", "log", - "logging", "mixnet-client", "mixnode-common", "network-defaults", "nym-api-requests", + "nym-bin-common", "nym-crypto", "nym-pemstore", "nym-sphinx", "nym-task", "nym-types", - "nym-version-checker", "once_cell", "pretty_env_logger", "rand 0.7.3", @@ -3678,10 +3658,8 @@ dependencies = [ "anyhow", "atty", "bs58", - "build-information", "clap 4.1.4", "colored", - "completions", "config", "cupid", "dirs", @@ -3690,10 +3668,10 @@ dependencies = [ "humantime-serde", "lazy_static", "log", - "logging", "mixnet-client", "mixnode-common", "nonexhaustive-delayqueue", + "nym-bin-common", "nym-crypto", "nym-pemstore", "nym-sphinx", @@ -3702,7 +3680,6 @@ dependencies = [ "nym-task", "nym-topology", "nym-types", - "nym-version-checker", "pretty_env_logger", "rand 0.7.3", "rocket", @@ -3721,24 +3698,21 @@ name = "nym-network-requester" version = "1.1.9" dependencies = [ "async-trait", - "build-information", "clap 4.1.4", "client-connections", "client-core", - "completions", "config", "dirs", "futures", "ipnetwork 0.20.0", "lazy_static", "log", - "logging", "network-defaults", + "nym-bin-common", "nym-crypto", "nym-sdk", "nym-sphinx", "nym-task", - "nym-version-checker", "ordered-buffer", "pretty_env_logger", "proxy-helpers", @@ -3764,7 +3738,7 @@ version = "1.1.9" dependencies = [ "dirs", "log", - "logging", + "nym-bin-common", "pretty_env_logger", "rocket", "serde", @@ -3807,8 +3781,8 @@ dependencies = [ "gateway-client", "gateway-requests", "log", - "logging", "network-defaults", + "nym-bin-common", "nym-crypto", "nym-sphinx", "nym-task", @@ -3826,12 +3800,10 @@ dependencies = [ name = "nym-socks5-client" version = "1.1.9" dependencies = [ - "build-information", "clap 4.1.4", "client-connections", "client-core", "coconut-interface", - "completions", "config", "credential-storage", "credentials", @@ -3841,15 +3813,14 @@ dependencies = [ "gateway-requests", "lazy_static", "log", - "logging", "mobile-storage", "network-defaults", + "nym-bin-common", "nym-crypto", "nym-pemstore", "nym-sphinx", "nym-task", "nym-topology", - "nym-version-checker", "ordered-buffer", "pin-project", "pretty_env_logger", @@ -4011,11 +3982,11 @@ version = "0.1.0" dependencies = [ "bs58", "log", + "nym-bin-common", "nym-crypto", "nym-mixnet-contract-common", "nym-sphinx-addressing", "nym-sphinx-types", - "nym-version-checker", "rand 0.7.3", "thiserror", ] @@ -4046,13 +4017,6 @@ dependencies = [ "validator-client", ] -[[package]] -name = "nym-version-checker" -version = "0.1.0" -dependencies = [ - "semver 0.11.0", -] - [[package]] name = "nym-vesting-contract" version = "1.1.3" @@ -5557,8 +5521,8 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "build-information", "log", + "nym-bin-common", "nym-sdk", "nym-sphinx-anonymous-replies", "serde", diff --git a/Cargo.toml b/Cargo.toml index d126c7200e..4e562f6179 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ members = [ "clients/native/websocket-requests", "clients/socks5", "common/bandwidth-claim-contract", + "common/bin-common", "common/client-libs/gateway-client", "common/client-libs/mixnet-client", "common/client-libs/validator-client", @@ -30,7 +31,6 @@ members = [ "common/coconut-interface", "common/commands", "common/config", - "common/build-information", "common/cosmwasm-smart-contracts/coconut-bandwidth-contract", "common/cosmwasm-smart-contracts/coconut-dkg", "common/cosmwasm-smart-contracts/contracts-common", @@ -46,7 +46,6 @@ members = [ "common/execute", "common/inclusion-probability", "common/ledger", - "common/logging", "common/mixnode-common", "common/network-defaults", "common/nonexhaustive-delayqueue", @@ -69,7 +68,6 @@ members = [ "common/topology", "common/types", "common/wasm-utils", - "common/completions", "explorer-api", "gateway", "gateway/gateway-requests", diff --git a/Makefile b/Makefile index a19b0334f0..3f4c1725d2 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,12 @@ test: clippy-all cargo-test wasm fmt test-all: test cargo-test-expensive no-clippy: build cargo-test wasm fmt happy: fmt clippy-happy test -clippy-all: clippy-main clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-wasm-client -clippy-happy: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect -cargo-test: test-main test-contracts test-wallet test-connect +clippy-all: clippy-main clippy-main-examples clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-connect-android clippy-all-wasm-client +clippy-happy: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect clippy-happy-connect-android +cargo-test: test-main test-contracts test-wallet test-connect test-connect-android cargo-test-expensive: test-main-expensive test-contracts-expensive test-wallet-expensive test-connect-expensive -build: build-contracts build-wallet build-main build-connect build-wasm-client -fmt: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-wasm-client +build: build-contracts build-wallet build-main build-main-examples build-connect build-connect-android build-wasm-client +fmt: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-connect-android fmt-wasm-client clippy-happy-main: cargo clippy @@ -21,9 +21,15 @@ clippy-happy-wallet: clippy-happy-connect: cargo clippy --manifest-path nym-connect/Cargo.toml +clippy-happy-connect-android: + cargo clippy --manifest-path nym-connect-android/src-tauri/Cargo.toml + clippy-main: cargo clippy --workspace -- -D warnings +clippy-main-examples: + cargo clippy --workspace --examples -- -D warnings + clippy-wasm: cargo clippy --manifest-path clients/webassembly/Cargo.toml --target wasm32-unknown-unknown --workspace -- -D warnings @@ -37,6 +43,9 @@ clippy-all-wallet: clippy-all-connect: cargo clippy --workspace --manifest-path nym-connect/Cargo.toml --all-features -- -D warnings +clippy-all-connect-android: + cargo clippy --workspace --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-features -- -D warnings + clippy-all-wasm-client: cargo clippy --workspace --manifest-path clients/webassembly/Cargo.toml --all-features --target wasm32-unknown-unknown -- -D warnings @@ -64,9 +73,18 @@ test-connect: test-connect-expensive: cargo test --manifest-path nym-connect/Cargo.toml --all-features -- --ignored +test-connect-android: + cargo test --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-features + +test-connect-android-expensive: + cargo test --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-features -- --ignored + build-main: cargo build --workspace +build-main-examples: + cargo build --workspace --examples + build-contracts: cargo build --manifest-path contracts/Cargo.toml --workspace @@ -76,6 +94,9 @@ build-wallet: build-connect: cargo build --manifest-path nym-connect/Cargo.toml --workspace +build-connect-android: + cargo build --manifest-path nym-connect-android/src-tauri/Cargo.toml --workspace + build-explorer-api: cargo build --manifest-path explorer-api/Cargo.toml --workspace @@ -97,6 +118,9 @@ fmt-wallet: fmt-connect: cargo fmt --manifest-path nym-connect/Cargo.toml --all +fmt-connect-android: + cargo fmt --manifest-path nym-connect-android/src-tauri/Cargo.toml --all + fmt-wasm-client: cargo fmt --manifest-path clients/webassembly/Cargo.toml --all @@ -111,4 +135,4 @@ generate-typescript: yarn types:lint:fix run-validator-tests: - cd nym-api/tests/functional_test && yarn test:qa \ No newline at end of file + cd nym-api/tests/functional_test && yarn test:qa diff --git a/clients/credential/Cargo.toml b/clients/credential/Cargo.toml index a693c20d5a..91bfd5de60 100644 --- a/clients/credential/Cargo.toml +++ b/clients/credential/Cargo.toml @@ -17,11 +17,10 @@ tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal", "m coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } -completions = { path = "../../common/completions" } credentials = { path = "../../common/credentials" } credential-storage = { path = "../../common/credential-storage" } nym-crypto = { path = "../../common/crypto", features = ["rand", "asymmetric", "symmetric", "aes", "hashing"] } -logging = { path = "../../common/logging"} +nym-bin-common = { path = "../../common/bin-common"} network-defaults = { path = "../../common/network-defaults" } nym-pemstore = { path = "../../common/pemstore" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } diff --git a/clients/credential/src/commands.rs b/clients/credential/src/commands.rs index 7cd3831e3a..9351384216 100644 --- a/clients/credential/src/commands.rs +++ b/clients/credential/src/commands.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use clap::{ArgGroup, Args, Subcommand}; -use completions::ArgShell; use log::*; +use nym_bin_common::completions::ArgShell; use rand::rngs::OsRng; use std::str::FromStr; diff --git a/clients/credential/src/main.rs b/clients/credential/src/main.rs index 0a9107e076..caa9a480c8 100644 --- a/clients/credential/src/main.rs +++ b/clients/credential/src/main.rs @@ -8,16 +8,16 @@ mod recovery_storage; mod state; use commands::*; -use completions::fig_generate; use config::{DATA_DIR, DB_FILE_NAME}; use error::Result; use log::*; use network_defaults::{setup_env, NymNetworkDetails}; +use nym_bin_common::completions::fig_generate; use std::process::exit; use std::time::{Duration, SystemTime}; use clap::{CommandFactory, Parser}; -use logging::setup_logging; +use nym_bin_common::logging::setup_logging; use validator_client::nyxd::traits::DkgQueryClient; use validator_client::nyxd::CosmWasmClient; use validator_client::Config; diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index c101e4bcf8..104da1e222 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -34,16 +34,14 @@ tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal"] } tokio-tungstenite = "0.14" # websocket ## internal -build-information = { path = "../../common/build-information" } +nym-bin-common = { path = "../../common/bin-common" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } client-connections = { path = "../../common/client-connections" } coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } -completions = { path = "../../common/completions" } credential-storage = { path = "../../common/credential-storage" } credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } -logging = { path = "../../common/logging"} gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } network-defaults = { path = "../../common/network-defaults" } @@ -52,7 +50,6 @@ nym-pemstore = { path = "../../common/pemstore" } nym-task = { path = "../../common/task" } nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } -nym-version-checker = { path = "../../common/version-checker" } websocket-requests = { path = "websocket-requests" } [dev-dependencies] diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index 5e651a5f0b..1bedb2cfba 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::client::config::{BaseConfig, Config}; -use build_information::BinaryBuildInformation; use clap::CommandFactory; use clap::{Parser, Subcommand}; -use completions::{fig_generate, ArgShell}; use config::OptionalSet; use lazy_static::lazy_static; +use nym_bin_common::build_information::BinaryBuildInformation; +use nym_bin_common::completions::{fig_generate, ArgShell}; use std::error::Error; use std::net::IpAddr; diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index 39d98516c1..0c001fc892 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -13,8 +13,8 @@ use crate::{ use clap::Args; use config::NymConfig; use log::*; +use nym_bin_common::version_checker::is_minor_version_compatible; use nym_crypto::asymmetric::identity; -use nym_version_checker::is_minor_version_compatible; #[derive(Args, Clone)] pub(crate) struct Run { diff --git a/clients/native/src/commands/upgrade.rs b/clients/native/src/commands/upgrade.rs index 2e67e6e62b..a959c2d701 100644 --- a/clients/native/src/commands/upgrade.rs +++ b/clients/native/src/commands/upgrade.rs @@ -4,7 +4,7 @@ use crate::client::config::{Config, MISSING_VALUE}; use config::NymConfig; -use nym_version_checker::Version; +use nym_bin_common::version_checker::Version; use clap::Args; use std::fmt::Display; diff --git a/clients/native/src/main.rs b/clients/native/src/main.rs index f8fd2df71b..8e476419d4 100644 --- a/clients/native/src/main.rs +++ b/clients/native/src/main.rs @@ -4,8 +4,8 @@ use std::error::Error; use clap::{crate_name, crate_version, Parser}; -use logging::setup_logging; use network_defaults::setup_env; +use nym_bin_common::logging::{banner, setup_logging}; pub mod client; pub mod commands; @@ -15,7 +15,7 @@ pub mod websocket; #[tokio::main] async fn main() -> Result<(), Box> { setup_logging(); - println!("{}", logging::banner(crate_name!(), crate_version!())); + println!("{}", banner(crate_name!(), crate_version!())); let args = commands::Cli::parse(); setup_env(args.config_env_file.as_ref()); diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 51e33b97ce..ab59a1dc76 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -27,17 +27,15 @@ tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal"] } url = "2.2" # internal -build-information = { path = "../../common/build-information" } +nym-bin-common = { path = "../../common/bin-common" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } client-connections = { path = "../../common/client-connections" } coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } -completions = { path = "../../common/completions" } credential-storage = { path = "../../common/credential-storage", optional = true } mobile-storage = { path = "../../common/mobile-storage", optional = true } credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } -logging = { path = "../../common/logging"} gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } network-defaults = { path = "../../common/network-defaults" } @@ -50,7 +48,6 @@ socks5-requests = { path = "../../common/socks5/requests" } nym-task = { path = "../../common/task" } nym-topology = { path = "../../common/topology" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } -nym-version-checker = { path = "../../common/version-checker" } [features] default = ["credential-storage"] diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index 8f459c25c8..12c0cee7c0 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::client::config::{BaseConfig, Config}; -use build_information::BinaryBuildInformation; use clap::CommandFactory; use clap::{Parser, Subcommand}; -use completions::{fig_generate, ArgShell}; use config::OptionalSet; use lazy_static::lazy_static; +use nym_bin_common::build_information::BinaryBuildInformation; +use nym_bin_common::completions::{fig_generate, ArgShell}; use std::error::Error; pub mod init; diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 95fbcc0970..d31388547c 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -10,9 +10,9 @@ use crate::{ use clap::Args; use config::NymConfig; use log::*; +use nym_bin_common::version_checker::is_minor_version_compatible; use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; -use nym_version_checker::is_minor_version_compatible; #[derive(Args, Clone)] pub(crate) struct Run { diff --git a/clients/socks5/src/commands/upgrade.rs b/clients/socks5/src/commands/upgrade.rs index 151d21059e..25f5802102 100644 --- a/clients/socks5/src/commands/upgrade.rs +++ b/clients/socks5/src/commands/upgrade.rs @@ -4,7 +4,7 @@ use crate::client::config::{Config, MISSING_VALUE}; use config::NymConfig; -use nym_version_checker::Version; +use nym_bin_common::version_checker::Version; use clap::Args; use std::{fmt::Display, process}; diff --git a/clients/socks5/src/main.rs b/clients/socks5/src/main.rs index 9c8fcdb87a..e9a5811b3d 100644 --- a/clients/socks5/src/main.rs +++ b/clients/socks5/src/main.rs @@ -4,8 +4,8 @@ use std::error::Error; use clap::{crate_name, crate_version, Parser}; -use logging::setup_logging; use network_defaults::setup_env; +use nym_bin_common::logging::{banner, setup_logging}; pub mod client; mod commands; @@ -15,7 +15,7 @@ pub mod socks; #[tokio::main] async fn main() -> Result<(), Box> { setup_logging(); - println!("{}", logging::banner(crate_name!(), crate_version!())); + println!("{}", banner(crate_name!(), crate_version!())); let args = commands::Cli::parse(); setup_env(args.config_env_file.as_ref()); diff --git a/common/version-checker/.gitignore b/common/bin-common/.gitignore similarity index 100% rename from common/version-checker/.gitignore rename to common/bin-common/.gitignore diff --git a/common/bin-common/Cargo.toml b/common/bin-common/Cargo.toml new file mode 100644 index 0000000000..531709ab48 --- /dev/null +++ b/common/bin-common/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "nym-bin-common" +version = "0.1.0" +description = "Common code for nym binaries" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } + +[dependencies] +clap = { version = "4.0", features = ["derive"] } +clap_complete = "4.0" +clap_complete_fig = "4.0" +log = { workspace = true } +pretty_env_logger = "0.4.0" +semver = "0.11" +serde = { workspace = true, features = ["derive"], optional = true } + +[build-dependencies] +vergen = { version = "7", default-features = false, features = ["build", "git", "rustc", "cargo"] } + +[features] +default = [] diff --git a/common/build-information/build.rs b/common/bin-common/build.rs similarity index 100% rename from common/build-information/build.rs rename to common/bin-common/build.rs diff --git a/common/build-information/src/lib.rs b/common/bin-common/src/build_information/mod.rs similarity index 100% rename from common/build-information/src/lib.rs rename to common/bin-common/src/build_information/mod.rs diff --git a/common/completions/src/lib.rs b/common/bin-common/src/completions/mod.rs similarity index 100% rename from common/completions/src/lib.rs rename to common/bin-common/src/completions/mod.rs diff --git a/common/bin-common/src/lib.rs b/common/bin-common/src/lib.rs new file mode 100644 index 0000000000..eed7b4f998 --- /dev/null +++ b/common/bin-common/src/lib.rs @@ -0,0 +1,7 @@ +// Copyright 2021 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub mod build_information; +pub mod completions; +pub mod logging; +pub mod version_checker; diff --git a/common/logging/src/lib.rs b/common/bin-common/src/logging/mod.rs similarity index 100% rename from common/logging/src/lib.rs rename to common/bin-common/src/logging/mod.rs diff --git a/common/version-checker/src/lib.rs b/common/bin-common/src/version_checker/mod.rs similarity index 100% rename from common/version-checker/src/lib.rs rename to common/bin-common/src/version_checker/mod.rs diff --git a/common/build-information/Cargo.toml b/common/build-information/Cargo.toml deleted file mode 100644 index e76a5002c9..0000000000 --- a/common/build-information/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "build-information" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = { workspace = true, features = ["derive"], optional = true } - -[build-dependencies] -vergen = { version = "7", default-features = false, features = ["build", "git", "rustc", "cargo"] } - -[features] -default = [] \ No newline at end of file diff --git a/common/completions/Cargo.toml b/common/completions/Cargo.toml deleted file mode 100644 index 53a5fa1eed..0000000000 --- a/common/completions/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "completions" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -clap = { version = "4.0", features = ["derive"] } -clap_complete = "4.0" -clap_complete_fig = "4.0" \ No newline at end of file diff --git a/common/logging/Cargo.toml b/common/logging/Cargo.toml deleted file mode 100644 index 491caa6b74..0000000000 --- a/common/logging/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "logging" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -log = { workspace = true } -pretty_env_logger = "0.4.0" diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml index e6bfbc764a..d443e28a17 100644 --- a/common/mixnode-common/Cargo.toml +++ b/common/mixnode-common/Cargo.toml @@ -28,4 +28,4 @@ nym-sphinx-params = { path = "../nymsphinx/params" } nym-sphinx-types = { path = "../nymsphinx/types" } nym-task = { path = "../task" } validator-client = { path = "../client-libs/validator-client", features = ["nyxd-client"]} -nym-version-checker = { path = "../version-checker" } +nym-bin-common = { path = "../bin-common" } diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index 48fe45c5b1..0831606ef1 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -7,9 +7,9 @@ use futures::stream::FuturesUnordered; use futures::StreamExt; use log::*; use network_defaults::mainnet::NYM_API; +use nym_bin_common::version_checker::{self, parse_version}; use nym_crypto::asymmetric::identity; use nym_task::TaskClient; -use nym_version_checker::parse_version; use rand::seq::SliceRandom; use rand::thread_rng; use std::net::SocketAddr; @@ -44,7 +44,7 @@ const DEFAULT_RETRY_TIMEOUT: Duration = Duration::from_secs(60 * 30); #[derive(Clone, Debug)] pub struct Config { /// Minimum semver version of a node (gateway or mixnode) that is capable of replying to echo packets. - minimum_compatible_node_version: nym_version_checker::Version, + minimum_compatible_node_version: version_checker::Version, /// Socket address of this node on which it will be listening for the measurement packets. listening_address: SocketAddr, @@ -89,10 +89,7 @@ impl ConfigBuilder { Self::default() } - pub fn minimum_compatible_node_version( - mut self, - version: nym_version_checker::Version, - ) -> Self { + pub fn minimum_compatible_node_version(mut self, version: version_checker::Version) -> Self { self.0.minimum_compatible_node_version = version; self } diff --git a/common/topology/Cargo.toml b/common/topology/Cargo.toml index 91217b8101..70c8e2db9a 100644 --- a/common/topology/Cargo.toml +++ b/common/topology/Cargo.toml @@ -22,4 +22,4 @@ nym-crypto = { path = "../crypto" } nym-mixnet-contract-common = { path = "../cosmwasm-smart-contracts/mixnet-contract" } nym-sphinx-addressing = { path = "../nymsphinx/addressing" } nym-sphinx-types = { path = "../nymsphinx/types" } -nym-version-checker = { path = "../version-checker" } +nym-bin-common = { path = "../bin-common" } diff --git a/common/topology/src/filter.rs b/common/topology/src/filter.rs index fdbbc9b119..4d8d977d9e 100644 --- a/common/topology/src/filter.rs +++ b/common/topology/src/filter.rs @@ -1,6 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use nym_bin_common::version_checker; use std::collections::HashMap; use std::hash::Hash; @@ -20,7 +21,7 @@ where fn filter_by_version(&self, expected_version: &str) -> Self { self.iter() .filter(|node| { - nym_version_checker::is_minor_version_compatible(&node.version(), expected_version) + version_checker::is_minor_version_compatible(&node.version(), expected_version) }) .cloned() .collect() diff --git a/common/version-checker/Cargo.toml b/common/version-checker/Cargo.toml deleted file mode 100644 index bc626fd8c8..0000000000 --- a/common/version-checker/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "nym-version-checker" -version = "0.1.0" -edition = { workspace = true } -authors = { workspace = true } -license = { workspace = true } -repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -semver = "0.11" diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index 94dc7a4ec2..e5f5aaa2ac 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -32,6 +32,6 @@ rand_pcg = "0.3.1" nym-mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet-contract" } nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common" } network-defaults = { path = "../common/network-defaults" } -logging = { path = "../common/logging"} +nym-bin-common = { path = "../common/bin-common"} nym-task = { path = "../common/task" } validator-client = { path = "../common/client-libs/validator-client", features=["nyxd-client"] } diff --git a/explorer-api/src/main.rs b/explorer-api/src/main.rs index 208eaae3b9..4fa35f2dbe 100644 --- a/explorer-api/src/main.rs +++ b/explorer-api/src/main.rs @@ -6,8 +6,8 @@ extern crate rocket_okapi; use clap::Parser; use dotenv::dotenv; use log::info; -use logging::setup_logging; use network_defaults::setup_env; +use nym_bin_common::logging::setup_logging; use nym_task::TaskManager; pub(crate) mod cache; diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 2db8b0fd1f..c40f5e042b 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -52,13 +52,11 @@ tokio-util = { version = "0.7.4", features = ["codec"] } url = { version = "2.2", features = ["serde"] } # internal -build-information = { path = "../common/build-information" } coconut-interface = { path = "../common/coconut-interface" } credentials = { path = "../common/credentials" } config = { path = "../common/config" } nym-crypto = { path = "../common/crypto" } -completions = { path = "../common/completions" } -logging = { path = "../common/logging" } +nym-bin-common = { path = "../common/bin-common" } gateway-requests = { path = "gateway-requests" } mixnet-client = { path = "../common/client-libs/mixnet-client" } mixnode-common = { path = "../common/mixnode-common" } @@ -71,7 +69,6 @@ nym-task = { path = "../common/task" } validator-client = { path = "../common/client-libs/validator-client", features = [ "nyxd-client", ] } -nym-version-checker = { path = "../common/version-checker" } nym-types = { path = "../common/types" } serde_json = "1" atty = "0.2" diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index 17b38a5967..ccc47dfe86 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -5,10 +5,11 @@ use crate::error::GatewayError; use crate::{config::Config, Cli}; use clap::CommandFactory; use clap::Subcommand; -use completions::{fig_generate, ArgShell}; use config::OptionalSet; use network_defaults::var_names::NYXD; use network_defaults::var_names::{BECH32_PREFIX, NYM_API, STATISTICS_SERVICE_DOMAIN_ADDRESS}; +use nym_bin_common::completions::{fig_generate, ArgShell}; +use nym_bin_common::version_checker; use std::error::Error; use std::net::IpAddr; use std::path::PathBuf; @@ -155,7 +156,7 @@ pub(crate) fn ensure_config_version_compatibility(cfg: &Config) -> Result<(), Ga if binary_version == config_version { Ok(()) - } else if nym_version_checker::is_minor_version_compatible(binary_version, config_version) { + } else if version_checker::is_minor_version_compatible(binary_version, config_version) { log::warn!( "The gateway binary has different version than what is specified in config file! {binary_version} and {config_version}. \ But, they are still semver compatible. However, consider running the `upgrade` command."); diff --git a/gateway/src/commands/upgrade.rs b/gateway/src/commands/upgrade.rs index abab75caa7..a77fe9ee07 100644 --- a/gateway/src/commands/upgrade.rs +++ b/gateway/src/commands/upgrade.rs @@ -4,7 +4,7 @@ use crate::config::{Config, MISSING_VALUE}; use clap::Args; use config::NymConfig; -use nym_version_checker::Version; +use nym_bin_common::version_checker::Version; use std::fmt::Display; use std::process; diff --git a/gateway/src/main.rs b/gateway/src/main.rs index bb7740fb72..a76214a3f3 100644 --- a/gateway/src/main.rs +++ b/gateway/src/main.rs @@ -1,13 +1,13 @@ // Copyright 2020 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use build_information::BinaryBuildInformation; use clap::{crate_name, crate_version, Parser, ValueEnum}; use colored::Colorize; use lazy_static::lazy_static; use log::error; -use logging::setup_logging; use network_defaults::setup_env; +use nym_bin_common::logging::setup_logging; +use nym_bin_common::{build_information::BinaryBuildInformation, logging::banner}; use std::error::Error; mod commands; @@ -66,7 +66,7 @@ impl Cli { async fn main() -> Result<(), Box> { setup_logging(); if atty::is(atty::Stream::Stdout) { - println!("{}", logging::banner(crate_name!(), crate_version!())); + println!("{}", banner(crate_name!(), crate_version!())); } let args = Cli::parse(); diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index fd57ab1775..f813412ff1 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -40,11 +40,8 @@ url = { version = "2.2", features = ["serde"] } atty = "0.2" ## internal -build-information = { path = "../common/build-information" } config = { path="../common/config" } nym-crypto = { path="../common/crypto" } -completions = { path="../common/completions" } -logging = { path="../common/logging" } mixnet-client = { path="../common/client-libs/mixnet-client" } mixnode-common = { path="../common/mixnode-common" } nonexhaustive-delayqueue = { path="../common/nonexhaustive-delayqueue" } @@ -54,7 +51,7 @@ nym-task = { path = "../common/task" } nym-types = { path = "../common/types" } nym-topology = { path="../common/topology" } validator-client = { path="../common/client-libs/validator-client" } -nym-version-checker = { path="../common/version-checker" } +nym-bin-common = { path="../common/bin-common" } [dev-dependencies] tokio = { version="1.21.2", features = ["rt-multi-thread", "net", "signal", "test-util"] } diff --git a/mixnode/src/commands/mod.rs b/mixnode/src/commands/mod.rs index e2c0f39aed..a3796080d6 100644 --- a/mixnode/src/commands/mod.rs +++ b/mixnode/src/commands/mod.rs @@ -5,9 +5,10 @@ use crate::{config::Config, Cli}; use clap::CommandFactory; use clap::Subcommand; use colored::Colorize; -use completions::{fig_generate, ArgShell}; use config::defaults::var_names::{BECH32_PREFIX, NYM_API}; use config::OptionalSet; +use nym_bin_common::completions::{fig_generate, ArgShell}; +use nym_bin_common::version_checker; use nym_crypto::bech32_address_validation; use std::net::IpAddr; use std::process; @@ -141,7 +142,7 @@ pub(crate) fn version_check(cfg: &Config) -> bool { true } else { warn!("The mixnode binary has different version than what is specified in config file! {} and {}", binary_version, config_version); - if nym_version_checker::is_minor_version_compatible(binary_version, config_version) { + if version_checker::is_minor_version_compatible(binary_version, config_version) { info!("but they are still semver compatible. However, consider running the `upgrade` command"); true } else { diff --git a/mixnode/src/commands/upgrade.rs b/mixnode/src/commands/upgrade.rs index bef202b651..b69b418181 100644 --- a/mixnode/src/commands/upgrade.rs +++ b/mixnode/src/commands/upgrade.rs @@ -4,7 +4,7 @@ use crate::config::{missing_string_value, Config}; use clap::Args; use config::NymConfig; -use nym_version_checker::Version; +use nym_bin_common::version_checker::Version; use std::fmt::Display; use std::process; diff --git a/mixnode/src/main.rs b/mixnode/src/main.rs index adb9556530..d5bf1ed947 100644 --- a/mixnode/src/main.rs +++ b/mixnode/src/main.rs @@ -5,10 +5,10 @@ extern crate rocket; use ::config::defaults::setup_env; -use build_information::BinaryBuildInformation; use clap::{crate_name, crate_version, Parser, ValueEnum}; use lazy_static::lazy_static; -use logging::setup_logging; +use nym_bin_common::logging::setup_logging; +use nym_bin_common::{build_information::BinaryBuildInformation, logging::banner}; mod commands; mod config; @@ -64,7 +64,7 @@ impl Cli { async fn main() { setup_logging(); if atty::is(atty::Stream::Stdout) { - println!("{}", logging::banner(crate_name!(), crate_version!())); + println!("{}", banner(crate_name!(), crate_version!())); } let args = Cli::parse(); diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index 5bc0c73d35..b2443aff71 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -22,9 +22,9 @@ use colored::Colorize; use config::NymConfig; use log::{error, info, warn}; use mixnode_common::verloc::{self, AtomicVerlocResult, VerlocMeasurer}; +use nym_bin_common::version_checker::parse_version; use nym_crypto::asymmetric::{encryption, identity}; use nym_task::{TaskClient, TaskManager}; -use nym_version_checker::parse_version; use rand::seq::SliceRandom; use rand::thread_rng; use std::net::SocketAddr; diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 2a9f60630f..ea2a6b4776 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -65,7 +65,6 @@ rocket_okapi = { version = "0.8.0-rc.2", features = ["swagger"] } schemars = { version = "0.8", features = ["preserve_order"] } ## internal -build-information = { path = "../common/build-information" } coconut-bandwidth-contract-common = { path = "../common/cosmwasm-smart-contracts/coconut-bandwidth-contract" } coconut-dkg-common = { path = "../common/cosmwasm-smart-contracts/coconut-dkg" } coconut-interface = { path = "../common/coconut-interface" } @@ -74,7 +73,6 @@ cosmwasm-std = "1.0.0" credential-storage = { path = "../common/credential-storage" } credentials = { path = "../common/credentials" } nym-crypto = { path = "../common/crypto" } -logging = { path = "../common/logging"} cw3 = { version = "0.13.4" } cw4 = { version = "0.13.4" } dkg = { path = "../common/dkg" } @@ -93,7 +91,7 @@ nym-api-requests = { path = "nym-api-requests" } validator-client = { path = "../common/client-libs/validator-client", features = [ "nyxd-client", ] } -nym-version-checker = { path = "../common/version-checker" } +nym-bin-common = { path = "../common/bin-common" } [features] no-reward = [] diff --git a/nym-api/src/main.rs b/nym-api/src/main.rs index 7711db94ca..c950e25032 100644 --- a/nym-api/src/main.rs +++ b/nym-api/src/main.rs @@ -18,8 +18,8 @@ use clap::Parser; use coconut::dkg::controller::DkgController; use config::NymConfig; use log::info; -use logging::setup_logging; use node_status_api::NodeStatusCache; +use nym_bin_common::logging::setup_logging; use nym_contract_cache::cache::NymContractCache; use nym_task::TaskManager; use rand::rngs::OsRng; diff --git a/nym-api/src/support/cli/mod.rs b/nym-api/src/support/cli/mod.rs index 292c7e9047..3bc86cdb50 100644 --- a/nym-api/src/support/cli/mod.rs +++ b/nym-api/src/support/cli/mod.rs @@ -4,10 +4,10 @@ use super::config::Config; use ::config::defaults::var_names::{MIXNET_CONTRACT_ADDRESS, VESTING_CONTRACT_ADDRESS}; use anyhow::Result; -use build_information::BinaryBuildInformation; use clap::Parser; use config::{NymConfig, OptionalSet}; use lazy_static::lazy_static; +use nym_bin_common::build_information::BinaryBuildInformation; use std::fs; use validator_client::nyxd; diff --git a/nym-connect-android/src-tauri/Cargo.lock b/nym-connect-android/src-tauri/Cargo.lock index 36202e1a32..02aa333473 100644 --- a/nym-connect-android/src-tauri/Cargo.lock +++ b/nym-connect-android/src-tauri/Cargo.lock @@ -405,14 +405,6 @@ dependencies = [ "serde", ] -[[package]] -name = "build-information" -version = "0.1.0" -dependencies = [ - "serde", - "vergen 7.5.1", -] - [[package]] name = "bumpalo" version = "3.12.0" @@ -785,15 +777,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "completions" -version = "0.1.0" -dependencies = [ - "clap", - "clap_complete", - "clap_complete_fig", -] - [[package]] name = "config" version = "0.1.0" @@ -3175,14 +3158,6 @@ dependencies = [ "serde", ] -[[package]] -name = "logging" -version = "0.1.0" -dependencies = [ - "log", - "pretty_env_logger", -] - [[package]] name = "loom" version = "0.5.6" @@ -3541,6 +3516,20 @@ dependencies = [ "serde", ] +[[package]] +name = "nym-bin-common" +version = "0.1.0" +dependencies = [ + "clap", + "clap_complete", + "clap_complete_fig", + "log", + "pretty_env_logger", + "semver 0.11.0", + "serde", + "vergen 7.5.1", +] + [[package]] name = "nym-connect-android" version = "1.1.9" @@ -3557,8 +3546,8 @@ dependencies = [ "futures", "itertools", "log", - "logging", "nym-api-requests", + "nym-bin-common", "nym-contracts-common", "nym-crypto", "nym-socks5-client", @@ -3643,12 +3632,10 @@ dependencies = [ name = "nym-socks5-client" version = "1.1.9" dependencies = [ - "build-information", "clap", "client-connections", "client-core", "coconut-interface", - "completions", "config", "credentials", "dirs", @@ -3657,15 +3644,14 @@ dependencies = [ "gateway-requests", "lazy_static", "log", - "logging", "mobile-storage", "network-defaults", + "nym-bin-common", "nym-crypto", "nym-pemstore", "nym-sphinx", "nym-task", "nym-topology", - "nym-version-checker", "ordered-buffer", "pin-project", "pretty_env_logger", @@ -3825,22 +3811,15 @@ version = "0.1.0" dependencies = [ "bs58", "log", + "nym-bin-common", "nym-crypto", "nym-mixnet-contract-common", "nym-sphinx-addressing", "nym-sphinx-types", - "nym-version-checker", "rand 0.7.3", "thiserror", ] -[[package]] -name = "nym-version-checker" -version = "0.1.0" -dependencies = [ - "semver 0.11.0", -] - [[package]] name = "nym-vesting-contract" version = "1.1.3" @@ -5362,8 +5341,8 @@ name = "service-providers-common" version = "0.1.0" dependencies = [ "async-trait", - "build-information", "log", + "nym-bin-common", "nym-sphinx-anonymous-replies", "serde", "serde_json", diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect-android/src-tauri/Cargo.toml index 2971937987..7db18d789b 100644 --- a/nym-connect-android/src-tauri/Cargo.toml +++ b/nym-connect-android/src-tauri/Cargo.toml @@ -51,7 +51,7 @@ nym-api-requests = { path = "../../nym-api/nym-api-requests" } nym-contracts-common = { path = "../../common/cosmwasm-smart-contracts/contracts-common"} config-common = { path = "../../common/config", package = "config" } nym-crypto = { path = "../../common/crypto" } -logging = { path = "../../common/logging"} +nym-bin-common = { path = "../../common/bin-common"} nym-socks5-client = { path = "../../clients/socks5", features = ["mobile"], default-features = false } nym-task = { path = "../../common/task" } diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/src-tauri/Cargo.toml index 887360b22f..51a42283ab 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/src-tauri/Cargo.toml @@ -49,7 +49,7 @@ nym-api-requests = { path = "../../nym-api/nym-api-requests" } nym-contracts-common = { path = "../../common/cosmwasm-smart-contracts/contracts-common"} config-common = { path = "../../common/config", package = "config" } nym-crypto = { path = "../../common/crypto" } -logging = { path = "../../common/logging"} +nym-bin-common = { path = "../../common/bin-common"} nym-socks5-client = { path = "../../clients/socks5" } nym-task = { path = "../../common/task" } diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 33382ca8d8..6c4ef3310a 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -517,6 +517,25 @@ dependencies = [ "termcolor", ] +[[package]] +name = "clap_complete" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd125be87bf4c255ebc50de0b7f4d2a6201e8ac3dc86e39c0ad081dc5e7236fe" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_complete_fig" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63a06158a72dbb088f864887b4409fd22600ba379f3cee3040f842234cc5c2d0" +dependencies = [ + "clap", + "clap_complete", +] + [[package]] name = "clap_derive" version = "4.1.0" @@ -1336,7 +1355,16 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2953d1df47ac0eb70086ccabf0275aa8da8591a28bd358ee2b52bd9f9e3ff9e9" dependencies = [ - "enum-iterator-derive", + "enum-iterator-derive 0.8.1", +] + +[[package]] +name = "enum-iterator" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea166b3f7dc1032f7866d13f8d8e02c8d87507b61750176b86554964dc6a7bf" +dependencies = [ + "enum-iterator-derive 1.1.0", ] [[package]] @@ -1350,6 +1378,17 @@ dependencies = [ "syn", ] +[[package]] +name = "enum-iterator-derive" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "828de45d0ca18782232dfb8f3ea9cc428e8ced380eb26a520baaacfc70de39ce" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "env_logger" version = "0.7.1" @@ -2597,14 +2636,6 @@ dependencies = [ "serde", ] -[[package]] -name = "logging" -version = "0.1.0" -dependencies = [ - "log", - "pretty_env_logger", -] - [[package]] name = "loom" version = "0.5.6" @@ -2908,6 +2939,19 @@ dependencies = [ "serde", ] +[[package]] +name = "nym-bin-common" +version = "0.1.0" +dependencies = [ + "clap", + "clap_complete", + "clap_complete_fig", + "log", + "pretty_env_logger", + "semver 0.11.0", + "vergen 7.5.1", +] + [[package]] name = "nym-contracts-common" version = "0.1.0" @@ -2981,7 +3025,7 @@ dependencies = [ "schemars", "serde", "thiserror", - "vergen", + "vergen 5.1.17", ] [[package]] @@ -3006,7 +3050,7 @@ dependencies = [ "bip39", "clap", "log", - "logging", + "nym-bin-common", "pretty_env_logger", "serde_json", ] @@ -5569,7 +5613,7 @@ dependencies = [ "anyhow", "cfg-if", "chrono", - "enum-iterator", + "enum-iterator 0.8.1", "getset", "git2", "rustc_version 0.4.0", @@ -5577,6 +5621,23 @@ dependencies = [ "thiserror", ] +[[package]] +name = "vergen" +version = "7.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21b881cd6636ece9735721cf03c1fe1e774fe258683d084bb2812ab67435749" +dependencies = [ + "anyhow", + "cfg-if", + "enum-iterator 1.3.0", + "getset", + "git2", + "rustc_version 0.4.0", + "rustversion", + "thiserror", + "time 0.3.17", +] + [[package]] name = "version-compare" version = "0.0.11" diff --git a/nym-wallet/nym-wallet-recovery-cli/Cargo.toml b/nym-wallet/nym-wallet-recovery-cli/Cargo.toml index 3f2569adfd..30d478d3b3 100644 --- a/nym-wallet/nym-wallet-recovery-cli/Cargo.toml +++ b/nym-wallet/nym-wallet-recovery-cli/Cargo.toml @@ -16,4 +16,4 @@ log = "0.4" pretty_env_logger = "0.4" serde_json = "1.0.0" -logging = { path = "../../common/logging" } \ No newline at end of file +nym-bin-common = { path = "../../common/bin-common" } diff --git a/nym-wallet/nym-wallet-recovery-cli/src/main.rs b/nym-wallet/nym-wallet-recovery-cli/src/main.rs index 08146d6234..d12d2bbaf7 100644 --- a/nym-wallet/nym-wallet-recovery-cli/src/main.rs +++ b/nym-wallet/nym-wallet-recovery-cli/src/main.rs @@ -12,7 +12,7 @@ use aes_gcm::{aead::Aead, Aes256Gcm, Key, NewAead, Nonce}; use anyhow::{anyhow, Result}; use argon2::{Algorithm, Argon2, Params, Version}; use clap::Parser; -use logging::setup_logging; +use nym_bin_common::logging::setup_logging; use serde_json::Value; // Mostly defaults diff --git a/sdk/rust/nym-sdk/Cargo.toml b/sdk/rust/nym-sdk/Cargo.toml index 67bad0b816..253cb76716 100644 --- a/sdk/rust/nym-sdk/Cargo.toml +++ b/sdk/rust/nym-sdk/Cargo.toml @@ -27,4 +27,4 @@ toml = "0.5.10" [dev-dependencies] pretty_env_logger = "0.4.0" tokio = { version = "1", features = ["full"] } -logging = { path = "../../../common/logging" } +nym-bin-common = { path = "../../../common/bin-common" } diff --git a/sdk/rust/nym-sdk/examples/builder.rs b/sdk/rust/nym-sdk/examples/builder.rs index 73606a7894..87e6461418 100644 --- a/sdk/rust/nym-sdk/examples/builder.rs +++ b/sdk/rust/nym-sdk/examples/builder.rs @@ -2,7 +2,7 @@ use nym_sdk::mixnet; #[tokio::main] async fn main() { - logging::setup_logging(); + nym_bin_common::logging::setup_logging(); // Create client builder, including ephemeral keys. The builder can be usable in the context // where you don't want to connect just yet. diff --git a/sdk/rust/nym-sdk/examples/builder_with_storage.rs b/sdk/rust/nym-sdk/examples/builder_with_storage.rs index f51ff4c156..c6ff57627b 100644 --- a/sdk/rust/nym-sdk/examples/builder_with_storage.rs +++ b/sdk/rust/nym-sdk/examples/builder_with_storage.rs @@ -4,7 +4,7 @@ use nym_sdk::mixnet; #[tokio::main] async fn main() { - logging::setup_logging(); + nym_bin_common::logging::setup_logging(); // Specify some config options let config_dir = PathBuf::from("/tmp/mixnet-client"); diff --git a/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs b/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs index b29a8f9037..8c40e86870 100644 --- a/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs +++ b/sdk/rust/nym-sdk/examples/manually_handle_keys_and_config.rs @@ -2,7 +2,7 @@ use nym_sdk::mixnet; #[tokio::main] async fn main() { - logging::setup_logging(); + nym_bin_common::logging::setup_logging(); let user_chosen_gateway_id = None; let nym_api_endpoints = vec!["https://validator.nymtech.net/api/".parse().unwrap()]; diff --git a/sdk/rust/nym-sdk/examples/simple.rs b/sdk/rust/nym-sdk/examples/simple.rs index 73d4aba821..f2325e6048 100644 --- a/sdk/rust/nym-sdk/examples/simple.rs +++ b/sdk/rust/nym-sdk/examples/simple.rs @@ -2,7 +2,7 @@ use nym_sdk::mixnet; #[tokio::main] async fn main() { - logging::setup_logging(); + nym_bin_common::logging::setup_logging(); // Passing no config makes the client fire up an ephemeral session and figure shit out on its own let mut client = mixnet::MixnetClient::connect_new().await.unwrap(); diff --git a/service-providers/common/Cargo.toml b/service-providers/common/Cargo.toml index 94c3bcc814..e180849ccb 100644 --- a/service-providers/common/Cargo.toml +++ b/service-providers/common/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -build-information = { path = "../../common/build-information", features = ["serde"] } +nym-bin-common = { path = "../../common/bin-common", features = ["serde"] } nym-sphinx-anonymous-replies = { path = "../../common/nymsphinx/anonymous-replies" } async-trait = { workspace = true } diff --git a/service-providers/common/src/interface/control.rs b/service-providers/common/src/interface/control.rs index 2cb2c11120..3d7f151f1c 100644 --- a/service-providers/common/src/interface/control.rs +++ b/service-providers/common/src/interface/control.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::interface::{Serializable, ServiceProviderMessagingError}; -use build_information::BinaryBuildInformationOwned; +use nym_bin_common::build_information::BinaryBuildInformationOwned; use serde::{Deserialize, Serialize}; #[derive(Debug)] diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 42b8a7a6f9..0bb058fe6e 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -31,13 +31,11 @@ tokio-tungstenite = "0.17.2" url = { workspace = true } # internal -build-information = { path = "../../common/build-information" } client-connections = { path = "../../common/client-connections" } client-core = { path = "../../clients/client-core" } -completions = { path = "../../common/completions" } config = { path = "../../common/config" } nym-crypto = { path = "../../common/crypto" } -logging = { path = "../../common/logging"} +nym-bin-common = { path = "../../common/bin-common"} network-defaults = { path = "../../common/network-defaults" } nym-sdk = { path = "../../sdk/rust/nym-sdk" } nym-sphinx = { path = "../../common/nymsphinx" } @@ -47,5 +45,4 @@ service-providers-common = { path = "../common" } socks5-requests = { path = "../../common/socks5/requests" } statistics-common = { path = "../../common/statistics" } nym-task = { path = "../../common/task" } -nym-version-checker = { path = "../../common/version-checker" } websocket-requests = { path = "../../clients/native/websocket-requests" } diff --git a/service-providers/network-requester/src/cli/mod.rs b/service-providers/network-requester/src/cli/mod.rs index 37471c4fea..3185d52c50 100644 --- a/service-providers/network-requester/src/cli/mod.rs +++ b/service-providers/network-requester/src/cli/mod.rs @@ -1,9 +1,9 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use build_information::BinaryBuildInformation; use clap::{CommandFactory, Parser, Subcommand}; -use completions::{fig_generate, ArgShell}; +use nym_bin_common::build_information::BinaryBuildInformation; +use nym_bin_common::completions::{fig_generate, ArgShell}; use crate::{ config::{BaseConfig, Config}, diff --git a/service-providers/network-requester/src/cli/run.rs b/service-providers/network-requester/src/cli/run.rs index 7dd5fef982..d4d2a9952b 100644 --- a/service-providers/network-requester/src/cli/run.rs +++ b/service-providers/network-requester/src/cli/run.rs @@ -8,6 +8,7 @@ use crate::{ }; use clap::Args; use config::NymConfig; +use nym_bin_common::version_checker; use nym_sphinx::addressing::clients::Recipient; const ENABLE_STATISTICS: &str = "enable-statistics"; @@ -73,7 +74,7 @@ fn version_check(cfg: &Config) -> bool { binary_version, config_version ); - if nym_version_checker::is_minor_version_compatible(binary_version, config_version) { + if version_checker::is_minor_version_compatible(binary_version, config_version) { log::info!( "but they are still semver compatible. \ However, consider running the `upgrade` command" diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index da0e8821f6..e05f8bbeb0 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -9,10 +9,10 @@ use crate::reply::MixnetMessage; use crate::statistics::ServiceStatisticsCollector; use crate::{reply, socks5}; use async_trait::async_trait; -use build_information::BinaryBuildInformation; use client_connections::LaneQueueLengths; use futures::channel::mpsc; use log::warn; +use nym_bin_common::build_information::BinaryBuildInformation; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use nym_task::{TaskClient, TaskManager}; diff --git a/service-providers/network-requester/src/main.rs b/service-providers/network-requester/src/main.rs index d1987048c1..ca25899bf3 100644 --- a/service-providers/network-requester/src/main.rs +++ b/service-providers/network-requester/src/main.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use clap::{crate_name, crate_version, Parser}; -use logging::setup_logging; use network_defaults::setup_env; +use nym_bin_common::logging::{banner, setup_logging}; use error::NetworkRequesterError; @@ -19,7 +19,7 @@ mod statistics; #[tokio::main] async fn main() -> Result<(), NetworkRequesterError> { setup_logging(); - println!("{}", logging::banner(crate_name!(), crate_version!())); + println!("{}", banner(crate_name!(), crate_version!())); let args = cli::Cli::parse(); setup_env(args.config_env_file.as_ref()); diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index 18c482c3c0..bff7abd293 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -14,7 +14,7 @@ serde = { version = "1.0", features = ["derive"] } sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate", "chrono"]} thiserror = "1" tokio = { version = "1.4", features = [ "net", "rt-multi-thread", "macros", "time" ] } -logging = { path = "../../common/logging"} +nym-bin-common = { path = "../../common/bin-common"} statistics-common = { path = "../../common/statistics" } [build-dependencies] diff --git a/service-providers/network-statistics/src/main.rs b/service-providers/network-statistics/src/main.rs index d9dab909e4..e9ced2c1ef 100644 --- a/service-providers/network-statistics/src/main.rs +++ b/service-providers/network-statistics/src/main.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use api::NetworkStatisticsAPI; -use logging::setup_logging; +use nym_bin_common::logging::setup_logging; use std::path::PathBuf; mod api; diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index ef0c22404b..79a03ea268 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -21,6 +21,6 @@ anyhow = "1" tap = "1" nym-cli-commands = { path = "../../common/commands" } -logging = { path = "../../common/logging"} +nym-bin-common = { path = "../../common/bin-common"} validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } network-defaults = { path = "../../common/network-defaults" } diff --git a/tools/nym-cli/src/main.rs b/tools/nym-cli/src/main.rs index 49183df58a..6007a3501f 100644 --- a/tools/nym-cli/src/main.rs +++ b/tools/nym-cli/src/main.rs @@ -3,7 +3,7 @@ use clap::{CommandFactory, Parser, Subcommand}; use log::{error, warn}; -use logging::setup_logging; +use nym_bin_common::logging::setup_logging; use nym_cli_commands::context::{get_network_details, ClientArgs}; use validator_client::nyxd::AccountId; From 964955f740c2b61bc5907cddb7b339e559100038 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Tue, 21 Feb 2023 13:37:11 +0200 Subject: [PATCH 409/591] update calls to binaries --- tests/nym-gateway-binary-check.sh | 50 ++++++++++++++--- tests/nym-mixnode-binary-check.sh | 93 ++++++++++++++++++++++++------- 2 files changed, 117 insertions(+), 26 deletions(-) diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 7489553617..de1b71e5c4 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -9,30 +9,66 @@ RELEASE_DIRECTORY="target/release" VERSION_NUMBER=$1 WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr MOCK_HOST="1.2.3.4" -OUTPUT=$(for i in {1..8}; do echo -n $(( $RANDOM % 10 )); done) +OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${OUTPUT}" +BINARY_NAME="nym-gateway" -echo "the version number is ${VERSION_NUMBER}" +echo "the version number is ${VERSION_NUMBER} to be installed from github" cd ${PWD}${RELEASE_DIRECTORY} -if [ -f nym-gateway ]; then +# steps +# we curl the existing binary from the release page of github +# we init the binary to check successful init +# then in our testing branch, we build the binary locally +# re run the init based upon the configuration injected +# we validate that no errors are return from upgrading the binary against the test + +# install the current release binary +# so this is dependant on running on a linux machine for the time being + +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +chmod u+x $BINARY_NAME + +#-------------------------------------- +# functions +#-------------------------------------- + +check_gateway_binary_build() if [ -f nym-gateway ]; then echo "running init tests" # we wont use config env files for now # unless we want to use a specific environment - OUTPUT=$(./nym-gateway --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) > /dev/null 2>&1 - + OUTPUT=$(./nym-gateway --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) >/dev/null 2>&1 + # get jq values for things we can assert against VALUE=$(echo ${OUTPUT} | jq .wallet_address) VALUE=${VALUE#\"} VALUE=${VALUE%\"} - + + echo $OUTPUT + sleep 2 + # do asserts here based upon the output on init - assert $(cat ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) + assert $(echo ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) assert_end nym-gateway-tests else echo "exting test no binary found" fi +# we run the release version first +check_gateway_binary_build +# lets remove the binary then navigate to the target/release directory for checking the latest version +# expect to have successful output and configuration +if [ -f $BINARY_NAME ]; then + echo "removing nym-mixnode" + rm -rf $BINARY_NAME +else + echo "no binary found exiting" + exit 1 +fi + +# we should expect it to pass because no errors should be presented when performing the upgrade of an init +# this should be caught at testing staage +check_gateway_binary_build diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 1e62b21318..35c2a5b9a2 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -4,31 +4,86 @@ PWD="../" RELEASE_DIRECTORY="target/release" -VERSION_NUMBER=$1 +RELEASE_VERSION_NUMBER=$1 WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr MOCK_HOST="1.2.3.4" -OUTPUT=$(for i in {1..8}; do echo -n $(( $RANDOM % 10 )); done) +OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${OUTPUT}" +BINARY_NAME="nym-mixnode" -echo "the version number is ${VERSION_NUMBER}" +echo "the version number is ${VERSION_NUMBER} to be installed from github" -cd $PWD/$RELEASE_DIRECTORY +# steps +# we curl the existing binary from the release page of github +# we init the binary to check successful init +# then in our testing branch, we build the binary locally +# re run the init based upon the configuration injected +# we validate that no errors are return from upgrading the binary against the test -if [ -f nym-mixnode ]; then - echo "running init tests" - # we wont use config env files for now - OUTPUT=$(./nym-mixnode --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) > /dev/null 2>&1 - - # get jq values for things we can assert against - # tidy this bit up - okay for first push - VALUE=$(echo ${OUTPUT} | jq .wallet_address) - VALUE=${VALUE#\"} - VALUE=${VALUE%\"} - - # do asserts here based upon the output on init +# install the current release binary +# so this is dependant on running on a linux machine for the time being +curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o nym-mixnode +chmod u+x "$BINARY_NAME" - assert $(cat ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) - assert_end nym-mixnode-tests +#-------------------------------------- +# functions +#-------------------------------------- +check_mixnode_binary_build() { + if [ -f "$BINARY_NAME" ]; then + echo "running init tests" + # we wont use config env files for now + OUTPUT=$(./${BINARY_NAME} --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST} > /dev/null) + # get jq values for things we can assert against + # tidy this bit up - okay for first push + + VALUE="$(echo ${OUTPUT} | jq .wallet_address | tr -d '"')" + + # do asserts here based upon the output on init + assert "echo ${VALUE}" $(echo ${WALLET_ADDRESS_CONST}) + assert_end nym-mixnode-tests + else + echo "exiting test no binary found" + fi +} + +#------------------------------- +# tests +#------------------------------- + +# we run the release version first +check_mixnode_binary_build +# whoami +# this is dependant on where it runs on ci potentially, will need to tweak this in the future +first_init=$(cat /root/.nym/mixnodes/${ID}/config/config.toml | grep -v "^\[mixnode\]$" | grep -v "^version =") + +#lets remove the binary then navigate to the target/release directory for checking the latest version +if [ -f "$BINARY_NAME" ]; then + echo "removing nym-mixnode" + rm -rf "$BINARY_NAME" + echo "successfully removed nym-mixnode" else - echo "exting test no binary found" + echo "no binary found exiting" + exit 1 +fi +# we should expect it to pass because no errors should be presented when performing the upgrade of an init +# this should be caught at testing stage +# navigate to latest binary build +cd $PWD$RELEASE_DIRECTORY +#re run against the current binary built locally +check_mixnode_binary_build + +echo "diff the config files after each init" +echo "-------------------------------------" + +second_init=$(cat /root/.nym/mixnodes/${ID}/config/config.toml | grep -v "^\[mixnode\]$" | grep -v "^version =") + +diff -w <(echo "$first_init") <(echo "$second_init") + +# check the status of the diff +if [ $? -eq 0 ]; then + echo "no differences in config files, exiting script" + exit 0 +else + echo "there are differences in the config files, it may require a fresh init on the binary" + exit 1 fi From 03fa8c17d7abd115861c2df7ad819841a9e080e8 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 07:32:39 -0500 Subject: [PATCH 410/591] docs: minor cleanup changes to changelog --- CHANGELOG.md | 16 ++++++---------- nym-connect/CHANGELOG.md | 2 +- nym-wallet/CHANGELOG.md | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4adb139bfc..e275c0f244 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -# [Unreleased] +## [Unreleased] ### Added @@ -11,13 +11,15 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// [#2936]: https://github.com/nymtech/nym/pull/2936 -# [v1.1.9] (2023-02-07) +## [v1.1.9] (2023-02-07) ### Added + - Remove Coconut feature flag ([#2793]) - Separate `nym-api` endpoints with values of "total-supply" and "circulating-supply" in `nym` ([#2964]) ### Changed + - native-client: is now capable of listening for requests on sockets different than `127.0.0.1` ([#2912]). This can be specified via `--host` flag during `init` or `run`. Alternatively a custom `host` can be set in `config.toml` file under `socket` section. - mixnode, gateway: fix unexpected shutdown on corrupted connection ([#2963]) @@ -26,7 +28,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// [#2964]: https://github.com/nymtech/nym/issues/2964 [#2963]: https://github.com/nymtech/nym/issues/3017 -# [v1.1.8] (2023-01-31) +## [v1.1.8] (2023-01-31) ### Added @@ -46,7 +48,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// [#2873]: https://github.com/nymtech/nym/issues/2873 -# [v1.1.7] (2023-01-24) +## [v1.1.7] (2023-01-24) ### Added @@ -102,12 +104,6 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ### Added -### Changed - -## [v1.1.5] (2023-01-10) - -### Added - - socks5: send status message for service ready, and network-requester error response in https://github.com/nymtech/nym/pull/2715 ### Changed diff --git a/nym-connect/CHANGELOG.md b/nym-connect/CHANGELOG.md index af8596e845..4eaec3e939 100644 --- a/nym-connect/CHANGELOG.md +++ b/nym-connect/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## UNRELEASED +## [Unreleased] ## [nym-connect-v1.1.10](https://github.com/nymtech/nym/tree/nym-connect-v1.1.10) (2023-02-21) diff --git a/nym-wallet/CHANGELOG.md b/nym-wallet/CHANGELOG.md index 9ffc639975..6aa9bcd09b 100644 --- a/nym-wallet/CHANGELOG.md +++ b/nym-wallet/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## UNRELEASED +## [Unreleased] ## [nym-wallet-v1.1.10](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.10) (2023-02-21) From 02397832f4b7e5c092593fdfd2bf502c038a8cb4 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 07:44:03 -0500 Subject: [PATCH 411/591] chore: updated versions as part of preparation for release v1.1.10 --- clients/client-core/Cargo.toml | 2 +- clients/native/Cargo.toml | 2 +- clients/socks5/Cargo.toml | 2 +- explorer-api/Cargo.toml | 2 +- gateway/Cargo.toml | 2 +- mixnode/Cargo.toml | 2 +- nym-api/Cargo.toml | 2 +- nym-connect/package.json | 2 +- nym-connect/src-tauri/Cargo.toml | 2 +- nym-connect/src-tauri/tauri.conf.json | 2 +- nym-wallet/package.json | 2 +- nym-wallet/src-tauri/Cargo.toml | 2 +- nym-wallet/src-tauri/tauri.conf.json | 2 +- service-providers/network-requester/Cargo.toml | 2 +- service-providers/network-statistics/Cargo.toml | 2 +- tools/nym-cli/Cargo.toml | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index d168b659ac..c0124abf2e 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "client-core" -version = "1.1.9" +version = "1.1.10" authors = ["Dave Hrycyszyn "] edition = "2021" rust-version = "1.66" diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index ed7227bf02..c7c190b52c 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.9" +version = "1.1.10" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 397bba0f8f..5a43646d45 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.9" +version = "1.1.10" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index 5ec59612f0..81f486802a 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "explorer-api" -version = "1.1.9" +version = "1.1.10" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 66d94cd1e8..13c19f26e8 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-gateway" -version = "1.1.9" +version = "1.1.10" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index e4345a0c11..9d264f7840 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-mixnode" -version = "1.1.10" +version = "1.1.11" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 61b524092f..42f8fea09c 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.10" +version = "1.1.11" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-connect/package.json b/nym-connect/package.json index b124d71730..985b09214f 100644 --- a/nym-connect/package.json +++ b/nym-connect/package.json @@ -1,6 +1,6 @@ { "name": "@nym/nym-connect", - "version": "1.1.9", + "version": "1.1.10", "main": "index.js", "license": "MIT", "scripts": { diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/src-tauri/Cargo.toml index 11dd7db775..be44e15e69 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.9" +version = "1.1.10" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/src-tauri/tauri.conf.json b/nym-connect/src-tauri/tauri.conf.json index 8642c2e26c..915e0421fc 100644 --- a/nym-connect/src-tauri/tauri.conf.json +++ b/nym-connect/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.9" + "version": "1.1.10" }, "build": { "distDir": "../dist", diff --git a/nym-wallet/package.json b/nym-wallet/package.json index b1eda933fd..faac47b023 100644 --- a/nym-wallet/package.json +++ b/nym-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@nymproject/nym-wallet-app", - "version": "1.1.9", + "version": "1.1.10", "main": "index.js", "license": "MIT", "scripts": { diff --git a/nym-wallet/src-tauri/Cargo.toml b/nym-wallet/src-tauri/Cargo.toml index d34c014306..00aed29983 100644 --- a/nym-wallet/src-tauri/Cargo.toml +++ b/nym-wallet/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym_wallet" -version = "1.1.9" +version = "1.1.10" description = "Nym Native Wallet" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-wallet/src-tauri/tauri.conf.json b/nym-wallet/src-tauri/tauri.conf.json index 8b14c1d304..ad4430ecc3 100644 --- a/nym-wallet/src-tauri/tauri.conf.json +++ b/nym-wallet/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-wallet", - "version": "1.1.9" + "version": "1.1.10" }, "build": { "distDir": "../dist", diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 88d0b8ad41..17667a8f14 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-network-requester" -version = "1.1.9" +version = "1.1.10" authors.workspace = true edition.workspace = true rust-version = "1.65" diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index 18c482c3c0..b06e55c7c3 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-statistics" -version = "1.1.9" +version = "1.1.10" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index ef0c22404b..f4f51e1a5f 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.9" +version = "1.1.10" authors.workspace = true edition = "2021" From 9912e445a4772f045b35b3a023636961f86bc4df Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 07:53:08 -0500 Subject: [PATCH 412/591] docs: updated changelogs in preparation for release --- CHANGELOG.md | 27 +++++++++++++++++++++++---- nym-connect/CHANGELOG.md | 6 ++++-- nym-wallet/CHANGELOG.md | 11 ++++++++--- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e275c0f244..f2317a5b14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,31 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] -### Added +## [v1.1.9] (2023-02-21) -- dkg resharing mode ([#2936]) - -[#2936]: https://github.com/nymtech/nym/pull/2936 +- Verloc listener causing mixnode unexpected shutdown ([#3038]) +- rust-sdk - update API following implementation experience with the network-requester ([#3001]) +- Prevent coconut deposits in incompatible states ([#2991]) +- Support unavailable signer within threshold ([#2987]) +- Implement DKG re-sharing ([#2935]) +- contracts: add nym prefix to mixnet and vesting contract packages ([#2855]) +- Introduce common interface for all service providers to allow obtaining information such as whether they're online, what binary version they're running, etc. ([#2758]) +- Add client functionality to nym-network-requester ([#1900]) +- nym-api: uptime rework ([#3053]) +- ci: update typescript-lint.yml ([#3035]) +- contracts: add nym prefix to mixnet and vesting contract packages ([#2855]) +[#3038]: https://github.com/nymtech/nym/issues/3038 +[#3001]: https://github.com/nymtech/nym/issues/3001 +[#2991]: https://github.com/nymtech/nym/issues/2991 +[#2987]: https://github.com/nymtech/nym/issues/2987 +[#2935]: https://github.com/nymtech/nym/issues/2935 +[#2855]: https://github.com/nymtech/nym/pull/2855 +[#2758]: https://github.com/nymtech/nym/issues/2758 +[#1900]: https://github.com/nymtech/nym/issues/1900 +[#3053]: https://github.com/nymtech/nym/pull/3053 +[#3035]: https://github.com/nymtech/nym/pull/3035 +[#2855]: https://github.com/nymtech/nym/pull/2855 ## [v1.1.9] (2023-02-07) diff --git a/nym-connect/CHANGELOG.md b/nym-connect/CHANGELOG.md index 4eaec3e939..52edcc5f66 100644 --- a/nym-connect/CHANGELOG.md +++ b/nym-connect/CHANGELOG.md @@ -2,9 +2,11 @@ ## [Unreleased] -## [nym-connect-v1.1.10](https://github.com/nymtech/nym/tree/nym-connect-v1.1.10) (2023-02-21) +## [v1.1.10] (2023-02-21) -- Allow opening and closing of logs within the app +- NC - add logs window for troubleshooting ([#2951]) + +[#2951]: https://github.com/nymtech/nym/issues/2951 ## [nym-connect-v1.1.9](https://github.com/nymtech/nym/tree/nym-connect-v1.1.9) (2023-02-14) diff --git a/nym-wallet/CHANGELOG.md b/nym-wallet/CHANGELOG.md index 6aa9bcd09b..fa1141b782 100644 --- a/nym-wallet/CHANGELOG.md +++ b/nym-wallet/CHANGELOG.md @@ -2,10 +2,15 @@ ## [Unreleased] -## [nym-wallet-v1.1.10](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.10) (2023-02-21) +## [v1.1.10] (2023-02-20) -- Remove non-zero and trailing white spaces -- Add error description on failed send txs +- Wallet - Fix send address bug ([#3030]) +- Wallet - [Issue] the `Operator cost` field in the Playground does not allow values above 100.0000 ([#2998]) +- nym-wallet: fix auto-updated files ([#3043]) + +[#3030]: https://github.com/nymtech/nym/issues/3030 +[#2998]: https://github.com/nymtech/nym/issues/2998 +[#3043]: https://github.com/nymtech/nym/pull/3043 ## [nym-wallet-v1.1.9](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.1.9) (2023-02-14) From 586d5f658b4683ed91e7f0b0c8b86bc8b0c4cf01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 21 Feb 2023 13:54:27 +0100 Subject: [PATCH 413/591] Move client-connections crate to nym-task (#3068) * Move client-connections to nym-task * rustfmt --- Cargo.lock | 14 -------------- Cargo.toml | 1 - clients/client-core/Cargo.toml | 1 - clients/client-core/src/client/base_client/mod.rs | 2 +- clients/client-core/src/client/inbound_messages.rs | 2 +- .../input_message_listener.rs | 2 +- .../retransmission_request_listener.rs | 2 +- .../real_messages_control/message_handler.rs | 2 +- .../src/client/real_messages_control/mod.rs | 2 +- .../real_messages_control/real_traffic_stream.rs | 6 +++--- .../src/client/replies/reply_controller/mod.rs | 2 +- .../client/replies/reply_controller/requests.rs | 2 +- .../client-core/src/client/transmission_buffer.rs | 2 +- clients/native/Cargo.toml | 1 - clients/native/src/client/mod.rs | 2 +- clients/native/src/websocket/handler.rs | 6 +++--- clients/socks5/Cargo.toml | 1 - clients/socks5/src/socks/client.rs | 2 +- clients/socks5/src/socks/server.rs | 2 +- clients/webassembly/Cargo.toml | 1 - clients/webassembly/src/client/mod.rs | 2 +- common/client-connections/Cargo.toml | 10 ---------- common/socks5/proxy-helpers/Cargo.toml | 1 - .../proxy-helpers/src/connection_controller.rs | 2 +- .../proxy-helpers/src/proxy_runner/inbound.rs | 4 ++-- .../socks5/proxy-helpers/src/proxy_runner/mod.rs | 2 +- .../src/lib.rs => task/src/connections.rs} | 0 common/task/src/lib.rs | 1 + nym-connect-android/src-tauri/Cargo.lock | 11 ----------- sdk/rust/nym-sdk/Cargo.toml | 1 - sdk/rust/nym-sdk/src/mixnet/client.rs | 10 ++++++---- service-providers/network-requester/Cargo.toml | 1 - service-providers/network-requester/src/core.rs | 2 +- service-providers/network-requester/src/reply.rs | 2 +- .../network-requester/src/socks5/tcp.rs | 2 +- 35 files changed, 33 insertions(+), 73 deletions(-) delete mode 100644 common/client-connections/Cargo.toml rename common/{client-connections/src/lib.rs => task/src/connections.rs} (100%) diff --git a/Cargo.lock b/Cargo.lock index 549e8ecbca..c46600d2e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -675,20 +675,11 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "client-connections" -version = "0.1.0" -dependencies = [ - "futures", - "log", -] - [[package]] name = "client-core" version = "1.1.9" dependencies = [ "async-trait", - "client-connections", "config", "dashmap 5.4.0", "dirs", @@ -3513,7 +3504,6 @@ name = "nym-client" version = "1.1.9" dependencies = [ "clap 4.1.4", - "client-connections", "client-core", "coconut-interface", "config", @@ -3699,7 +3689,6 @@ version = "1.1.9" dependencies = [ "async-trait", "clap 4.1.4", - "client-connections", "client-core", "config", "dirs", @@ -3775,7 +3764,6 @@ dependencies = [ name = "nym-sdk" version = "0.1.0" dependencies = [ - "client-connections", "client-core", "futures", "gateway-client", @@ -3801,7 +3789,6 @@ name = "nym-socks5-client" version = "1.1.9" dependencies = [ "clap 4.1.4", - "client-connections", "client-core", "coconut-interface", "config", @@ -4613,7 +4600,6 @@ name = "proxy-helpers" version = "0.1.0" dependencies = [ "bytes", - "client-connections", "futures", "log", "nym-task", diff --git a/Cargo.toml b/Cargo.toml index 4e562f6179..38bce5a808 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,6 @@ members = [ "common/client-libs/gateway-client", "common/client-libs/mixnet-client", "common/client-libs/validator-client", - "common/client-connections", "common/coconut-interface", "common/commands", "common/config", diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index b1cbb77c2a..e5e5ceeefc 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -25,7 +25,6 @@ time = "0.3.17" # internal config = { path = "../../common/config" } -client-connections = { path = "../../common/client-connections" } nym-crypto = { path = "../../common/crypto" } gateway-client = { path = "../../common/client-libs/gateway-client" } #gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm", "coconut"] } diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index 52b45a4e17..f517698bf2 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -21,7 +21,6 @@ use crate::client::topology_control::{ use crate::config::{Config, DebugConfig, GatewayEndpointConfig}; use crate::error::ClientCoreError; use crate::spawn_future; -use client_connections::{ConnectionCommandReceiver, ConnectionCommandSender, LaneQueueLengths}; use futures::channel::mpsc; use gateway_client::bandwidth::BandwidthController; #[cfg(target_arch = "wasm32")] @@ -36,6 +35,7 @@ use nym_sphinx::acknowledgements::AckKey; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::addressing::nodes::NodeIdentity; use nym_sphinx::receiver::ReconstructedMessage; +use nym_task::connections::{ConnectionCommandReceiver, ConnectionCommandSender, LaneQueueLengths}; use nym_task::{TaskClient, TaskManager}; use std::sync::Arc; use std::time::Duration; diff --git a/clients/client-core/src/client/inbound_messages.rs b/clients/client-core/src/client/inbound_messages.rs index ff2293936e..69f8af0d45 100644 --- a/clients/client-core/src/client/inbound_messages.rs +++ b/clients/client-core/src/client/inbound_messages.rs @@ -1,6 +1,6 @@ -use client_connections::TransmissionLane; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::connections::TransmissionLane; pub type InputMessageSender = tokio::sync::mpsc::Sender; pub type InputMessageReceiver = tokio::sync::mpsc::Receiver; diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs index 85d73fa304..ae10c88015 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/input_message_listener.rs @@ -4,10 +4,10 @@ use crate::client::inbound_messages::{InputMessage, InputMessageReceiver}; use crate::client::real_messages_control::message_handler::MessageHandler; use crate::client::replies::reply_controller::ReplyControllerSender; -use client_connections::TransmissionLane; use log::*; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::connections::TransmissionLane; use rand::{CryptoRng, Rng}; /// Module responsible for dealing with the received messages: splitting them, creating acknowledgements, diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs index 45072dc2f3..194c440720 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/retransmission_request_listener.rs @@ -9,12 +9,12 @@ use crate::client::real_messages_control::acknowledgement_control::PacketDestina use crate::client::real_messages_control::message_handler::{MessageHandler, PreparationError}; use crate::client::real_messages_control::real_traffic_stream::RealMessage; use crate::client::replies::reply_controller::ReplyControllerSender; -use client_connections::TransmissionLane; use futures::StreamExt; use log::*; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::chunking::fragment::Fragment; use nym_sphinx::preparer::PreparedFragment; +use nym_task::connections::TransmissionLane; use rand::{CryptoRng, Rng}; use std::sync::{Arc, Weak}; diff --git a/clients/client-core/src/client/real_messages_control/message_handler.rs b/clients/client-core/src/client/real_messages_control/message_handler.rs index 29f9a39fad..cad6974b25 100644 --- a/clients/client-core/src/client/real_messages_control/message_handler.rs +++ b/clients/client-core/src/client/real_messages_control/message_handler.rs @@ -8,7 +8,6 @@ use crate::client::real_messages_control::real_traffic_stream::{ use crate::client::real_messages_control::{AckActionSender, Action}; use crate::client::replies::reply_storage::{ReceivedReplySurbsMap, SentReplyKeys, UsedSenderTags}; use crate::client::topology_control::{TopologyAccessor, TopologyReadPermit}; -use client_connections::TransmissionLane; use log::{debug, error, info, trace, warn}; use nym_sphinx::acknowledgements::AckKey; use nym_sphinx::addressing::clients::Recipient; @@ -19,6 +18,7 @@ use nym_sphinx::message::NymMessage; use nym_sphinx::params::{PacketSize, DEFAULT_NUM_MIX_HOPS}; use nym_sphinx::preparer::{MessagePreparer, PreparedFragment}; use nym_sphinx::Delay; +use nym_task::connections::TransmissionLane; use nym_topology::{NymTopology, NymTopologyError}; use rand::{CryptoRng, Rng}; use std::collections::HashMap; diff --git a/clients/client-core/src/client/real_messages_control/mod.rs b/clients/client-core/src/client/real_messages_control/mod.rs index bb40312aa9..69ca797e67 100644 --- a/clients/client-core/src/client/real_messages_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/mod.rs @@ -21,13 +21,13 @@ use crate::{ }, spawn_future, }; -use client_connections::{ConnectionCommandReceiver, LaneQueueLengths}; use futures::channel::mpsc; use gateway_client::AcknowledgementReceiver; use log::*; use nym_sphinx::acknowledgements::AckKey; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::params::PacketSize; +use nym_task::connections::{ConnectionCommandReceiver, LaneQueueLengths}; use rand::{rngs::OsRng, CryptoRng, Rng}; use std::sync::Arc; use std::time::Duration; diff --git a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs index 650a77870a..4bcebe75d0 100644 --- a/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs +++ b/clients/client-core/src/client/real_messages_control/real_traffic_stream.rs @@ -6,9 +6,6 @@ use crate::client::mix_traffic::BatchMixMessageSender; use crate::client::real_messages_control::acknowledgement_control::SentPacketNotificationSender; use crate::client::topology_control::TopologyAccessor; use crate::client::transmission_buffer::TransmissionBuffer; -use client_connections::{ - ConnectionCommand, ConnectionCommandReceiver, ConnectionId, LaneQueueLengths, TransmissionLane, -}; use futures::task::{Context, Poll}; use futures::{Future, Stream, StreamExt}; use log::*; @@ -20,6 +17,9 @@ use nym_sphinx::forwarding::packet::MixPacket; use nym_sphinx::params::PacketSize; use nym_sphinx::preparer::PreparedFragment; use nym_sphinx::utils::sample_poisson_duration; +use nym_task::connections::{ + ConnectionCommand, ConnectionCommandReceiver, ConnectionId, LaneQueueLengths, TransmissionLane, +}; use rand::{CryptoRng, Rng}; use std::pin::Pin; use std::sync::Arc; diff --git a/clients/client-core/src/client/replies/reply_controller/mod.rs b/clients/client-core/src/client/replies/reply_controller/mod.rs index 7df94c08c7..267e2ada1f 100644 --- a/clients/client-core/src/client/replies/reply_controller/mod.rs +++ b/clients/client-core/src/client/replies/reply_controller/mod.rs @@ -4,7 +4,6 @@ use crate::client::real_messages_control::acknowledgement_control::PendingAcknowledgement; use crate::client::real_messages_control::message_handler::{MessageHandler, PreparationError}; use crate::client::replies::reply_storage::CombinedReplyStorage; -use client_connections::{ConnectionId, TransmissionLane}; use futures::channel::oneshot; use futures::StreamExt; use log::{debug, error, info, trace, warn}; @@ -12,6 +11,7 @@ use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use nym_sphinx::anonymous_replies::ReplySurb; use nym_sphinx::chunking::fragment::{Fragment, FragmentIdentifier}; +use nym_task::connections::{ConnectionId, TransmissionLane}; use rand::{CryptoRng, Rng}; use std::cmp::{max, min}; use std::collections::btree_map::Entry; diff --git a/clients/client-core/src/client/replies/reply_controller/requests.rs b/clients/client-core/src/client/replies/reply_controller/requests.rs index b4322c1e54..a215805088 100644 --- a/clients/client-core/src/client/replies/reply_controller/requests.rs +++ b/clients/client-core/src/client/replies/reply_controller/requests.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::client::real_messages_control::acknowledgement_control::PendingAcknowledgement; -use client_connections::{ConnectionId, TransmissionLane}; use futures::channel::{mpsc, oneshot}; use log::error; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use nym_sphinx::anonymous_replies::ReplySurb; +use nym_task::connections::{ConnectionId, TransmissionLane}; use std::sync::Weak; pub(crate) fn new_control_channels() -> (ReplyControllerSender, ReplyControllerReceiver) { diff --git a/clients/client-core/src/client/transmission_buffer.rs b/clients/client-core/src/client/transmission_buffer.rs index a8a26d1dd9..7686957fee 100644 --- a/clients/client-core/src/client/transmission_buffer.rs +++ b/clients/client-core/src/client/transmission_buffer.rs @@ -3,8 +3,8 @@ use crate::client::helpers::{get_time_now, Instant}; use crate::client::real_messages_control::real_traffic_stream::RealMessage; -use client_connections::TransmissionLane; use nym_sphinx::chunking::fragment::Fragment; +use nym_task::connections::TransmissionLane; use rand::{seq::SliceRandom, Rng}; use std::{ collections::{HashMap, HashSet, VecDeque}, diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 104da1e222..7de33b78b2 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -36,7 +36,6 @@ tokio-tungstenite = "0.14" # websocket ## internal nym-bin-common = { path = "../../common/bin-common" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } -client-connections = { path = "../../common/client-connections" } coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } credential-storage = { path = "../../common/credential-storage" } diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index ddd6ea0ce2..2d3d33f458 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -6,7 +6,6 @@ use std::error::Error; use crate::client::config::Config; use crate::error::ClientError; use crate::websocket; -use client_connections::TransmissionLane; use client_core::client::base_client::{ non_wasm_helpers, BaseClientBuilder, ClientInput, ClientOutput, ClientState, }; @@ -19,6 +18,7 @@ use futures::channel::mpsc; use gateway_client::bandwidth::BandwidthController; use log::*; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::connections::TransmissionLane; use nym_task::TaskManager; use tokio::sync::watch::error::SendError; use validator_client::nyxd::QueryNyxdClient; diff --git a/clients/native/src/websocket/handler.rs b/clients/native/src/websocket/handler.rs index 753d2c4386..e0d3501927 100644 --- a/clients/native/src/websocket/handler.rs +++ b/clients/native/src/websocket/handler.rs @@ -1,9 +1,6 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use client_connections::{ - ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane, -}; use client_core::client::replies::reply_controller::requests::ReplyControllerSender; use client_core::client::{ inbound_messages::{InputMessage, InputMessageSender}, @@ -17,6 +14,9 @@ use log::*; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; use nym_sphinx::receiver::ReconstructedMessage; +use nym_task::connections::{ + ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane, +}; use std::time::Duration; use tokio::net::TcpStream; use tokio::time::Instant; diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index ab59a1dc76..cbd03069ee 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -29,7 +29,6 @@ url = "2.2" # internal nym-bin-common = { path = "../../common/bin-common" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } -client-connections = { path = "../../common/client-connections" } coconut-interface = { path = "../../common/coconut-interface" } config = { path = "../../common/config" } credential-storage = { path = "../../common/credential-storage", optional = true } diff --git a/clients/socks5/src/socks/client.rs b/clients/socks5/src/socks/client.rs index 15dc64a513..83e5c68530 100644 --- a/clients/socks5/src/socks/client.rs +++ b/clients/socks5/src/socks/client.rs @@ -4,12 +4,12 @@ use super::authentication::{AuthenticationMethods, Authenticator, User}; use super::request::{SocksCommand, SocksRequest}; use super::types::{ResponseCodeV4, ResponseCodeV5, SocksProxyError}; use super::{SocksVersion, RESERVED, SOCKS4_VERSION, SOCKS5_VERSION}; -use client_connections::{LaneQueueLengths, TransmissionLane}; use client_core::client::inbound_messages::{InputMessage, InputMessageSender}; use futures::channel::mpsc; use futures::task::{Context, Poll}; use log::*; use nym_sphinx::addressing::clients::Recipient; +use nym_task::connections::{LaneQueueLengths, TransmissionLane}; use nym_task::TaskClient; use pin_project::pin_project; use proxy_helpers::connection_controller::{ diff --git a/clients/socks5/src/socks/server.rs b/clients/socks5/src/socks/server.rs index 23ace2e198..f986f90777 100644 --- a/clients/socks5/src/socks/server.rs +++ b/clients/socks5/src/socks/server.rs @@ -4,12 +4,12 @@ use super::{ authentication::Authenticator, client::SocksClient, mixnet_responses::MixnetResponseListener, }; use crate::socks::client; -use client_connections::{ConnectionCommandSender, LaneQueueLengths}; use client_core::client::{ inbound_messages::InputMessageSender, received_buffer::ReceivedBufferRequestSender, }; use log::*; use nym_sphinx::addressing::clients::Recipient; +use nym_task::connections::{ConnectionCommandSender, LaneQueueLengths}; use nym_task::TaskClient; use proxy_helpers::connection_controller::Controller; use std::net::SocketAddr; diff --git a/clients/webassembly/Cargo.toml b/clients/webassembly/Cargo.toml index 430dc7a7d3..87bcd3ce91 100644 --- a/clients/webassembly/Cargo.toml +++ b/clients/webassembly/Cargo.toml @@ -31,7 +31,6 @@ wasm-bindgen-futures = "0.4" # internal client-core = { path = "../client-core", default-features = false, features = ["wasm"] } -client-connections = { path = "../../common/client-connections" } coconut-interface = { path = "../../common/coconut-interface" } credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } diff --git a/clients/webassembly/src/client/mod.rs b/clients/webassembly/src/client/mod.rs index 34ec4a9396..dd45c28bb8 100644 --- a/clients/webassembly/src/client/mod.rs +++ b/clients/webassembly/src/client/mod.rs @@ -4,7 +4,6 @@ use self::config::Config; use crate::client::helpers::InputSender; use crate::client::response_pusher::ResponsePusher; -use client_connections::TransmissionLane; use client_core::client::base_client::{ BaseClientBuilder, ClientInput, ClientOutput, CredentialsToggle, }; @@ -15,6 +14,7 @@ use gateway_client::wasm_mockups::SigningNyxdClient; use js_sys::Promise; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::connections::TransmissionLane; use nym_task::TaskManager; use rand::rngs::OsRng; use std::sync::Arc; diff --git a/common/client-connections/Cargo.toml b/common/client-connections/Cargo.toml deleted file mode 100644 index a3d51b3b54..0000000000 --- a/common/client-connections/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "client-connections" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -futures = "0.3" -log = { workspace = true } diff --git a/common/socks5/proxy-helpers/Cargo.toml b/common/socks5/proxy-helpers/Cargo.toml index 8e7c44d1a6..3f1403fd9b 100644 --- a/common/socks5/proxy-helpers/Cargo.toml +++ b/common/socks5/proxy-helpers/Cargo.toml @@ -16,7 +16,6 @@ futures = "0.3" log = { workspace = true } # internal -client-connections = { path = "../../client-connections" } ordered-buffer = { path = "../ordered-buffer" } socks5-requests = { path = "../requests" } nym-task = { path = "../../task" } diff --git a/common/socks5/proxy-helpers/src/connection_controller.rs b/common/socks5/proxy-helpers/src/connection_controller.rs index 79e06025c5..b50e0fb7a3 100644 --- a/common/socks5/proxy-helpers/src/connection_controller.rs +++ b/common/socks5/proxy-helpers/src/connection_controller.rs @@ -1,10 +1,10 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use client_connections::{ConnectionCommand, ConnectionCommandSender}; use futures::channel::mpsc; use futures::StreamExt; use log::*; +use nym_task::connections::{ConnectionCommand, ConnectionCommandSender}; use nym_task::TaskClient; use ordered_buffer::{OrderedMessage, OrderedMessageBuffer, ReadContiguousData}; use socks5_requests::{ConnectionId, NetworkData, SendRequest}; diff --git a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs index 520843167c..959de166de 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/inbound.rs @@ -5,11 +5,11 @@ use super::MixProxySender; use super::SHUTDOWN_TIMEOUT; use crate::available_reader::AvailableReader; use bytes::Bytes; -use client_connections::LaneQueueLengths; -use client_connections::TransmissionLane; use futures::FutureExt; use futures::StreamExt; use log::*; +use nym_task::connections::LaneQueueLengths; +use nym_task::connections::TransmissionLane; use nym_task::TaskClient; use ordered_buffer::OrderedMessageSender; use socks5_requests::ConnectionId; diff --git a/common/socks5/proxy-helpers/src/proxy_runner/mod.rs b/common/socks5/proxy-helpers/src/proxy_runner/mod.rs index 3304cba8d2..d0e427c2da 100644 --- a/common/socks5/proxy-helpers/src/proxy_runner/mod.rs +++ b/common/socks5/proxy-helpers/src/proxy_runner/mod.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::connection_controller::ConnectionReceiver; -use client_connections::LaneQueueLengths; +use nym_task::connections::LaneQueueLengths; use nym_task::TaskClient; use socks5_requests::ConnectionId; use std::fmt::Debug; diff --git a/common/client-connections/src/lib.rs b/common/task/src/connections.rs similarity index 100% rename from common/client-connections/src/lib.rs rename to common/task/src/connections.rs diff --git a/common/task/src/lib.rs b/common/task/src/lib.rs index eab1fc2177..b719da3a6f 100644 --- a/common/task/src/lib.rs +++ b/common/task/src/lib.rs @@ -1,6 +1,7 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +pub mod connections; pub mod manager; #[cfg(not(target_arch = "wasm32"))] pub mod signal; diff --git a/nym-connect-android/src-tauri/Cargo.lock b/nym-connect-android/src-tauri/Cargo.lock index 02aa333473..cb0e68c00b 100644 --- a/nym-connect-android/src-tauri/Cargo.lock +++ b/nym-connect-android/src-tauri/Cargo.lock @@ -610,20 +610,11 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "client-connections" -version = "0.1.0" -dependencies = [ - "futures", - "log", -] - [[package]] name = "client-core" version = "1.1.9" dependencies = [ "async-trait", - "client-connections", "config", "dashmap", "dirs", @@ -3633,7 +3624,6 @@ name = "nym-socks5-client" version = "1.1.9" dependencies = [ "clap", - "client-connections", "client-core", "coconut-interface", "config", @@ -4491,7 +4481,6 @@ name = "proxy-helpers" version = "0.1.0" dependencies = [ "bytes", - "client-connections", "futures", "log", "nym-task", diff --git a/sdk/rust/nym-sdk/Cargo.toml b/sdk/rust/nym-sdk/Cargo.toml index 253cb76716..362af20483 100644 --- a/sdk/rust/nym-sdk/Cargo.toml +++ b/sdk/rust/nym-sdk/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -client-connections = { path = "../../../common/client-connections" } client-core = { path = "../../../clients/client-core", features = ["fs-surb-storage"]} nym-crypto = { path = "../../../common/crypto" } gateway-client = { path = "../../../common/client-libs/gateway-client" } diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 11b5113d43..d8b1e06b65 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -1,6 +1,5 @@ use std::{path::Path, sync::Arc}; -use client_connections::TransmissionLane; use client_core::{ client::{ base_client::{ @@ -18,7 +17,10 @@ use nym_sphinx::{ addressing::clients::{ClientIdentity, Recipient}, receiver::ReconstructedMessage, }; -use nym_task::TaskManager; +use nym_task::{ + connections::{ConnectionCommandSender, LaneQueueLengths, TransmissionLane}, + TaskManager, +}; use futures::StreamExt; use validator_client::nyxd::SigningNyxdClient; @@ -500,13 +502,13 @@ impl MixnetClient { /// Get a shallow clone of [`ConnectionCommandSender`]. This is useful if you want to e.g /// explictly close a transmission lane that is still sending data even though it should /// cancel. - pub fn connection_command_sender(&self) -> client_connections::ConnectionCommandSender { + pub fn connection_command_sender(&self) -> ConnectionCommandSender { self.client_input.connection_command_sender.clone() } /// Get a shallow clone of [`LaneQueueLengths`]. This is useful to manually implement some form /// of backpressure logic. - pub fn shared_lane_queue_lengths(&self) -> client_connections::LaneQueueLengths { + pub fn shared_lane_queue_lengths(&self) -> LaneQueueLengths { self.client_state.shared_lane_queue_lengths.clone() } diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 0bb058fe6e..483c5f99ab 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -31,7 +31,6 @@ tokio-tungstenite = "0.17.2" url = { workspace = true } # internal -client-connections = { path = "../../common/client-connections" } client-core = { path = "../../clients/client-core" } config = { path = "../../common/config" } nym-crypto = { path = "../../common/crypto" } diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index e05f8bbeb0..a0f4ae5878 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -9,12 +9,12 @@ use crate::reply::MixnetMessage; use crate::statistics::ServiceStatisticsCollector; use crate::{reply, socks5}; use async_trait::async_trait; -use client_connections::LaneQueueLengths; use futures::channel::mpsc; use log::warn; use nym_bin_common::build_information::BinaryBuildInformation; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::connections::LaneQueueLengths; use nym_task::{TaskClient, TaskManager}; use proxy_helpers::connection_controller::{Controller, ControllerCommand, ControllerSender}; use proxy_helpers::proxy_runner::{MixProxyReader, MixProxySender}; diff --git a/service-providers/network-requester/src/reply.rs b/service-providers/network-requester/src/reply.rs index 947951f06b..6f49263694 100644 --- a/service-providers/network-requester/src/reply.rs +++ b/service-providers/network-requester/src/reply.rs @@ -1,10 +1,10 @@ // Copyright 2022-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use client_connections::TransmissionLane; use nym_sdk::mixnet::InputMessage; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_task::connections::TransmissionLane; use service_providers_common::interface::{ ControlRequest, ControlResponse, ProviderInterfaceVersion, RequestVersion, }; diff --git a/service-providers/network-requester/src/socks5/tcp.rs b/service-providers/network-requester/src/socks5/tcp.rs index 45f173c1c7..32c6a8c241 100644 --- a/service-providers/network-requester/src/socks5/tcp.rs +++ b/service-providers/network-requester/src/socks5/tcp.rs @@ -3,7 +3,7 @@ use crate::reply; use crate::reply::MixnetMessage; -use client_connections::LaneQueueLengths; +use nym_task::connections::LaneQueueLengths; use nym_task::TaskClient; use proxy_helpers::connection_controller::ConnectionReceiver; use proxy_helpers::proxy_runner::{MixProxySender, ProxyRunner}; From 4587d5da261f1d8d142368520b444ea64fb8b362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 21 Feb 2023 14:26:28 +0100 Subject: [PATCH 414/591] Add nym- prefix to network-defaults (#3069) * network-defaults: update cargo metadata * Add nym- prefix to network-defaults crate * Some manual updating * rustfmt --- Cargo.lock | 54 +++++++++---------- Cargo.toml | 3 ++ clients/credential/Cargo.toml | 2 +- clients/credential/src/client.rs | 2 +- clients/credential/src/commands.rs | 2 +- clients/credential/src/main.rs | 2 +- clients/native/Cargo.toml | 2 +- clients/native/src/client/mod.rs | 2 +- clients/native/src/commands/mod.rs | 4 +- clients/native/src/main.rs | 2 +- clients/socks5/Cargo.toml | 2 +- clients/socks5/src/client/mod.rs | 2 +- clients/socks5/src/commands/mod.rs | 4 +- clients/socks5/src/main.rs | 2 +- common/client-libs/gateway-client/Cargo.toml | 2 +- .../client-libs/gateway-client/src/client.rs | 2 +- .../client-libs/validator-client/Cargo.toml | 2 +- .../validator-client/src/client.rs | 4 +- .../validator-client/src/connection_tester.rs | 2 +- .../validator-client/src/nym_api/routes.rs | 2 +- .../validator-client/src/nyxd/mod.rs | 2 +- .../validator-client/src/nyxd/wallet/mod.rs | 2 +- common/commands/Cargo.toml | 2 +- common/commands/src/context/mod.rs | 2 +- .../cosmwasm/generators/coconut_bandwidth.rs | 4 +- .../cosmwasm/generators/coconut_dkg.rs | 17 +++--- .../validator/cosmwasm/generators/mixnet.rs | 6 +-- .../validator/cosmwasm/generators/multisig.rs | 4 +- .../validator/cosmwasm/generators/vesting.rs | 4 +- .../src/validator/cosmwasm/init_contract.rs | 2 +- .../mixnet/operators/gateway/bond_gateway.rs | 2 +- .../operators/gateway/vesting_bond_gateway.rs | 2 +- .../mixnet/operators/mixnode/bond_mixnode.rs | 4 +- .../operators/mixnode/vesting_bond_mixnode.rs | 6 +-- .../vesting/create_vesting_schedule.rs | 2 +- common/config/Cargo.toml | 2 +- common/config/src/defaults.rs | 2 +- common/config/src/lib.rs | 4 +- common/mixnode-common/Cargo.toml | 2 +- common/mixnode-common/src/verloc/mod.rs | 2 +- common/network-defaults/Cargo.toml | 23 ++++---- explorer-api/Cargo.toml | 2 +- explorer-api/src/client.rs | 2 +- explorer-api/src/main.rs | 2 +- gateway/Cargo.toml | 2 +- gateway/src/commands/init.rs | 2 +- gateway/src/commands/mod.rs | 4 +- gateway/src/config/mod.rs | 2 +- gateway/src/main.rs | 2 +- gateway/src/node/client_handling/bandwidth.rs | 2 +- .../connection_handler/eth_events.rs | 2 +- gateway/src/node/mod.rs | 2 +- nym-connect-android/src-tauri/Cargo.lock | 34 ++++++------ nym-wallet/Cargo.lock | 32 +++++------ nym-wallet/nym-wallet-types/Cargo.toml | 2 +- nym-wallet/nym-wallet-types/src/network.rs | 12 ++--- sdk/rust/nym-sdk/Cargo.toml | 2 +- sdk/rust/nym-sdk/src/mixnet/config.rs | 2 +- .../network-requester/Cargo.toml | 2 +- .../network-requester/src/cli/mod.rs | 4 +- .../network-requester/src/main.rs | 2 +- tools/nym-cli/Cargo.toml | 2 +- tools/nym-cli/src/validator/account.rs | 2 +- tools/nym-cli/src/validator/block.rs | 2 +- tools/nym-cli/src/validator/cosmwasm/mod.rs | 2 +- .../src/validator/mixnet/delegators/mod.rs | 2 +- .../mixnet/delegators/rewards/mod.rs | 2 +- tools/nym-cli/src/validator/mixnet/mod.rs | 2 +- .../mixnet/operators/gateways/mod.rs | 2 +- .../mixnet/operators/mixnodes/mod.rs | 2 +- .../mixnet/operators/mixnodes/rewards/mod.rs | 2 +- .../mixnet/operators/mixnodes/settings/mod.rs | 2 +- .../src/validator/mixnet/operators/mod.rs | 2 +- .../nym-cli/src/validator/mixnet/query/mod.rs | 2 +- tools/nym-cli/src/validator/signature.rs | 2 +- tools/nym-cli/src/validator/transactions.rs | 2 +- tools/nym-cli/src/validator/vesting.rs | 2 +- 77 files changed, 174 insertions(+), 169 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c46600d2e2..d04d668d80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -795,7 +795,7 @@ dependencies = [ "cfg-if", "handlebars", "log", - "network-defaults", + "nym-network-defaults", "serde", "toml", "url", @@ -1013,9 +1013,9 @@ dependencies = [ "credential-storage", "credentials", "log", - "network-defaults", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-pemstore", "rand 0.7.3", "serde", @@ -1830,10 +1830,10 @@ dependencies = [ "itertools", "log", "maxminddb", - "network-defaults", "nym-bin-common", "nym-contracts-common", "nym-mixnet-contract-common", + "nym-network-defaults", "nym-task", "okapi", "pretty_env_logger", @@ -2098,8 +2098,8 @@ dependencies = [ "getrandom 0.2.8", "log", "mobile-storage", - "network-defaults", "nym-crypto", + "nym-network-defaults", "nym-pemstore", "nym-sphinx", "nym-task", @@ -3151,9 +3151,9 @@ dependencies = [ "futures", "humantime-serde", "log", - "network-defaults", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-sphinx-acknowledgements", "nym-sphinx-addressing", "nym-sphinx-forwarding", @@ -3230,19 +3230,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "network-defaults" -version = "0.1.0" -dependencies = [ - "cfg-if", - "dotenv", - "hex-literal", - "once_cell", - "serde", - "thiserror", - "url", -] - [[package]] name = "no-std-compat" version = "0.4.1" @@ -3454,9 +3441,9 @@ dependencies = [ "clap_complete_fig", "dotenv", "log", - "network-defaults", "nym-bin-common", "nym-cli-commands", + "nym-network-defaults", "pretty_env_logger", "serde", "serde_json", @@ -3485,8 +3472,8 @@ dependencies = [ "k256", "log", "multisig-contract-common", - "network-defaults", "nym-mixnet-contract-common", + "nym-network-defaults", "nym-vesting-contract-common", "rand 0.6.5", "serde", @@ -3515,9 +3502,9 @@ dependencies = [ "gateway-requests", "lazy_static", "log", - "network-defaults", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-pemstore", "nym-sphinx", "nym-task", @@ -3597,10 +3584,10 @@ dependencies = [ "log", "mixnet-client", "mixnode-common", - "network-defaults", "nym-api-requests", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-pemstore", "nym-sphinx", "nym-task", @@ -3683,6 +3670,19 @@ dependencies = [ "validator-client", ] +[[package]] +name = "nym-network-defaults" +version = "0.1.0" +dependencies = [ + "cfg-if", + "dotenv", + "hex-literal", + "once_cell", + "serde", + "thiserror", + "url", +] + [[package]] name = "nym-network-requester" version = "1.1.9" @@ -3696,9 +3696,9 @@ dependencies = [ "ipnetwork 0.20.0", "lazy_static", "log", - "network-defaults", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-sdk", "nym-sphinx", "nym-task", @@ -3769,9 +3769,9 @@ dependencies = [ "gateway-client", "gateway-requests", "log", - "network-defaults", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-sphinx", "nym-task", "pretty_env_logger", @@ -3801,9 +3801,9 @@ dependencies = [ "lazy_static", "log", "mobile-storage", - "network-defaults", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-pemstore", "nym-sphinx", "nym-task", @@ -4039,8 +4039,8 @@ dependencies = [ "cosmrs", "cosmwasm-std", "hex-literal", - "network-defaults", "nym-mixnet-contract-common", + "nym-network-defaults", "nym-types", "nym-vesting-contract", "nym-vesting-contract-common", @@ -6882,10 +6882,10 @@ dependencies = [ "itertools", "log", "multisig-contract-common", - "network-defaults", "nym-api-requests", "nym-contracts-common", "nym-mixnet-contract-common", + "nym-network-defaults", "nym-vesting-contract", "nym-vesting-contract-common", "prost 0.10.4", diff --git a/Cargo.toml b/Cargo.toml index 38bce5a808..51b310e50c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,8 +106,11 @@ license = "Apache-2.0" [workspace.dependencies] async-trait = "0.1.63" +cfg-if = "1.0.0" +dotenv = "0.15.0" lazy_static = "1.4.0" log = "0.4" +once_cell = "1.7.2" serde = "1.0.152" serde_json = "1.0.91" tap = "1.0.1" diff --git a/clients/credential/Cargo.toml b/clients/credential/Cargo.toml index 91bfd5de60..93f80477a9 100644 --- a/clients/credential/Cargo.toml +++ b/clients/credential/Cargo.toml @@ -21,7 +21,7 @@ credentials = { path = "../../common/credentials" } credential-storage = { path = "../../common/credential-storage" } nym-crypto = { path = "../../common/crypto", features = ["rand", "asymmetric", "symmetric", "aes", "hashing"] } nym-bin-common = { path = "../../common/bin-common"} -network-defaults = { path = "../../common/network-defaults" } +nym-network-defaults = { path = "../../common/network-defaults" } nym-pemstore = { path = "../../common/pemstore" } validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } diff --git a/clients/credential/src/client.rs b/clients/credential/src/client.rs index d4ee436698..7e947a5b74 100644 --- a/clients/credential/src/client.rs +++ b/clients/credential/src/client.rs @@ -3,7 +3,7 @@ use crate::error::Result; use bip39::Mnemonic; -use network_defaults::{NymNetworkDetails, VOUCHER_INFO}; +use nym_network_defaults::{NymNetworkDetails, VOUCHER_INFO}; use std::str::FromStr; use url::Url; use validator_client::nyxd; diff --git a/clients/credential/src/commands.rs b/clients/credential/src/commands.rs index 9351384216..4dbc1e30f2 100644 --- a/clients/credential/src/commands.rs +++ b/clients/credential/src/commands.rs @@ -12,8 +12,8 @@ use credential_storage::storage::Storage; use credential_storage::PersistentStorage; use credentials::coconut::bandwidth::{BandwidthVoucher, TOTAL_ATTRIBUTES}; use credentials::coconut::utils::obtain_aggregate_signature; -use network_defaults::VOUCHER_INFO; use nym_crypto::asymmetric::{encryption, identity}; +use nym_network_defaults::VOUCHER_INFO; use validator_client::nyxd::traits::DkgQueryClient; use validator_client::nyxd::tx::Hash; use validator_client::nyxd::CosmWasmClient; diff --git a/clients/credential/src/main.rs b/clients/credential/src/main.rs index caa9a480c8..f98409578a 100644 --- a/clients/credential/src/main.rs +++ b/clients/credential/src/main.rs @@ -11,8 +11,8 @@ use commands::*; use config::{DATA_DIR, DB_FILE_NAME}; use error::Result; use log::*; -use network_defaults::{setup_env, NymNetworkDetails}; use nym_bin_common::completions::fig_generate; +use nym_network_defaults::{setup_env, NymNetworkDetails}; use std::process::exit; use std::time::{Duration, SystemTime}; diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 7de33b78b2..70560e8153 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -43,7 +43,7 @@ credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } -network-defaults = { path = "../../common/network-defaults" } +nym-network-defaults = { path = "../../common/network-defaults" } nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } nym-task = { path = "../../common/task" } diff --git a/clients/native/src/client/mod.rs b/clients/native/src/client/mod.rs index 2d3d33f458..1e4e17d94c 100644 --- a/clients/native/src/client/mod.rs +++ b/clients/native/src/client/mod.rs @@ -56,7 +56,7 @@ impl SocketClient { } async fn create_bandwidth_controller(config: &Config) -> BandwidthController { - let details = network_defaults::NymNetworkDetails::new_from_env(); + let details = nym_network_defaults::NymNetworkDetails::new_from_env(); let mut client_config = validator_client::Config::try_from_nym_network_details(&details) .expect("failed to construct validator client config"); let nyxd_url = config diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index 1bedb2cfba..fee9a18339 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -87,13 +87,13 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { .with_optional_custom_env_ext( BaseConfig::with_custom_nym_apis, args.nym_apis, - network_defaults::var_names::NYM_API, + nym_network_defaults::var_names::NYM_API, config::parse_urls, ) .with_optional_custom_env_ext( BaseConfig::with_custom_nyxd, args.nyxd_urls, - network_defaults::var_names::NYXD, + nym_network_defaults::var_names::NYXD, config::parse_urls, ) .with_optional_ext( diff --git a/clients/native/src/main.rs b/clients/native/src/main.rs index 8e476419d4..48965e7c1a 100644 --- a/clients/native/src/main.rs +++ b/clients/native/src/main.rs @@ -4,8 +4,8 @@ use std::error::Error; use clap::{crate_name, crate_version, Parser}; -use network_defaults::setup_env; use nym_bin_common::logging::{banner, setup_logging}; +use nym_network_defaults::setup_env; pub mod client; pub mod commands; diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index cbd03069ee..303aaf6934 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -37,7 +37,7 @@ credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } gateway-client = { path = "../../common/client-libs/gateway-client" } gateway-requests = { path = "../../gateway/gateway-requests" } -network-defaults = { path = "../../common/network-defaults" } +nym-network-defaults = { path = "../../common/network-defaults" } nym-sphinx = { path = "../../common/nymsphinx" } ordered-buffer = { path = "../../common/socks5/ordered-buffer" } nym-pemstore = { path = "../../common/pemstore" } diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index ae50726184..99a78c86b8 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -72,7 +72,7 @@ impl NymClient { #[cfg(not(feature = "mobile"))] async fn create_bandwidth_controller(config: &Config) -> BandwidthController { - let details = network_defaults::NymNetworkDetails::new_from_env(); + let details = nym_network_defaults::NymNetworkDetails::new_from_env(); let mut client_config = validator_client::Config::try_from_nym_network_details(&details) .expect("failed to construct validator client config"); let nyxd_url = config diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index 12c0cee7c0..2fc8f508c4 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -86,13 +86,13 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { .with_optional_custom_env_ext( BaseConfig::with_custom_nym_apis, args.nym_apis, - network_defaults::var_names::NYM_API, + nym_network_defaults::var_names::NYM_API, config::parse_urls, ) .with_optional_custom_env_ext( BaseConfig::with_custom_nyxd, args.nyxd_urls, - network_defaults::var_names::NYXD, + nym_network_defaults::var_names::NYXD, config::parse_urls, ) .with_optional_ext( diff --git a/clients/socks5/src/main.rs b/clients/socks5/src/main.rs index e9a5811b3d..4630ebb5e4 100644 --- a/clients/socks5/src/main.rs +++ b/clients/socks5/src/main.rs @@ -4,8 +4,8 @@ use std::error::Error; use clap::{crate_name, crate_version, Parser}; -use network_defaults::setup_env; use nym_bin_common::logging::{banner, setup_logging}; +use nym_network_defaults::setup_env; pub mod client; mod commands; diff --git a/common/client-libs/gateway-client/Cargo.toml b/common/client-libs/gateway-client/Cargo.toml index 1924f94dba..195d7df616 100644 --- a/common/client-libs/gateway-client/Cargo.toml +++ b/common/client-libs/gateway-client/Cargo.toml @@ -22,7 +22,7 @@ coconut-interface = { path = "../../coconut-interface" } credentials = { path = "../../credentials" } nym-crypto = { path = "../../crypto" } gateway-requests = { path = "../../../gateway/gateway-requests" } -network-defaults = { path = "../../network-defaults" } +nym-network-defaults = { path = "../../network-defaults" } nym-sphinx = { path = "../../nymsphinx" } nym-pemstore = { path = "../../pemstore" } validator-client = { path = "../validator-client" } diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index aa16a0667e..a1d1662fd6 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -16,8 +16,8 @@ use gateway_requests::iv::IV; use gateway_requests::registration::handshake::{client_handshake, SharedKeys}; use gateway_requests::{BinaryRequest, ClientControlRequest, ServerResponse, PROTOCOL_VERSION}; use log::*; -use network_defaults::{REMAINING_BANDWIDTH_THRESHOLD, TOKENS_TO_BURN}; use nym_crypto::asymmetric::identity; +use nym_network_defaults::{REMAINING_BANDWIDTH_THRESHOLD, TOKENS_TO_BURN}; use nym_sphinx::forwarding::packet::MixPacket; use nym_task::TaskClient; use rand::rngs::OsRng; diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index f708d02554..3774ba7eb7 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -29,7 +29,7 @@ tokio = { version = "1.24.1", features = ["sync", "time"] } futures = "0.3" coconut-interface = { path = "../../coconut-interface" } -network-defaults = { path = "../../network-defaults" } +nym-network-defaults = { path = "../../network-defaults" } nym-api-requests = { path = "../../../nym-api/nym-api-requests" } # required for nyxd-client diff --git a/common/client-libs/validator-client/src/client.rs b/common/client-libs/validator-client/src/client.rs index a474af73da..d75542e83f 100644 --- a/common/client-libs/validator-client/src/client.rs +++ b/common/client-libs/validator-client/src/client.rs @@ -30,8 +30,6 @@ use coconut_interface::Base58; #[cfg(feature = "nyxd-client")] use cw3::ProposalResponse; #[cfg(feature = "nyxd-client")] -use network_defaults::NymNetworkDetails; -#[cfg(feature = "nyxd-client")] use nym_api_requests::models::MixNodeBondAnnotated; #[cfg(feature = "nyxd-client")] use nym_mixnet_contract_common::{ @@ -41,6 +39,8 @@ use nym_mixnet_contract_common::{ Delegation, IdentityKey, RewardedSetNodeStatus, UnbondedMixnode, }; #[cfg(feature = "nyxd-client")] +use nym_network_defaults::NymNetworkDetails; +#[cfg(feature = "nyxd-client")] use std::str::FromStr; use url::Url; diff --git a/common/client-libs/validator-client/src/connection_tester.rs b/common/client-libs/validator-client/src/connection_tester.rs index 14f365639a..fe7ded3e5b 100644 --- a/common/client-libs/validator-client/src/connection_tester.rs +++ b/common/client-libs/validator-client/src/connection_tester.rs @@ -6,7 +6,7 @@ use crate::nyxd::traits::MixnetQueryClient; use colored::Colorize; use core::fmt; use itertools::Itertools; -use network_defaults::NymNetworkDetails; +use nym_network_defaults::NymNetworkDetails; use std::collections::HashMap; use std::hash::BuildHasher; use std::time::Duration; diff --git a/common/client-libs/validator-client/src/nym_api/routes.rs b/common/client-libs/validator-client/src/nym_api/routes.rs index a54b5d5e16..1c715ff1b8 100644 --- a/common/client-libs/validator-client/src/nym_api/routes.rs +++ b/common/client-libs/validator-client/src/nym_api/routes.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NYM_API_VERSION; +use nym_network_defaults::NYM_API_VERSION; pub const API_VERSION: &str = NYM_API_VERSION; pub const MIXNODES: &str = "mixnodes"; diff --git a/common/client-libs/validator-client/src/nyxd/mod.rs b/common/client-libs/validator-client/src/nyxd/mod.rs index ac70ac63fb..3c20b2acf4 100644 --- a/common/client-libs/validator-client/src/nyxd/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/mod.rs @@ -17,8 +17,8 @@ use cosmrs::rpc::HttpClientUrl; use cosmrs::tx::Msg; use execute::execute; use log::debug; -use network_defaults::{ChainDetails, NymNetworkDetails}; use nym_mixnet_contract_common::MixId; +use nym_network_defaults::{ChainDetails, NymNetworkDetails}; use nym_vesting_contract_common::ExecuteMsg as VestingExecuteMsg; use nym_vesting_contract_common::PledgeCap; use serde::{Deserialize, Serialize}; diff --git a/common/client-libs/validator-client/src/nyxd/wallet/mod.rs b/common/client-libs/validator-client/src/nyxd/wallet/mod.rs index 8983176692..30242b433f 100644 --- a/common/client-libs/validator-client/src/nyxd/wallet/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/wallet/mod.rs @@ -207,7 +207,7 @@ impl DirectSecp256k1HdWalletBuilder { #[cfg(test)] mod tests { - use network_defaults::NymNetworkDetails; + use nym_network_defaults::NymNetworkDetails; use super::*; diff --git a/common/commands/Cargo.toml b/common/commands/Cargo.toml index eb785764d9..cf941a1961 100644 --- a/common/commands/Cargo.toml +++ b/common/commands/Cargo.toml @@ -29,7 +29,7 @@ cosmrs = { git = "https://github.com/neacsu/cosmos-rust", branch = "neacsu/feegr cosmwasm-std = { version = "1.0.0" } validator-client = { path = "../client-libs/validator-client", features = ["nyxd-client"] } -network-defaults = { path = "../network-defaults" } +nym-network-defaults = { path = "../network-defaults" } nym-mixnet-contract-common = { path = "../cosmwasm-smart-contracts/mixnet-contract" } nym-vesting-contract-common = { path = "../cosmwasm-smart-contracts/vesting-contract" } coconut-bandwidth-contract-common = { path = "../cosmwasm-smart-contracts/coconut-bandwidth-contract" } diff --git a/common/commands/src/context/mod.rs b/common/commands/src/context/mod.rs index 8a5960dc6e..0355f98c30 100644 --- a/common/commands/src/context/mod.rs +++ b/common/commands/src/context/mod.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::{ +use nym_network_defaults::{ setup_env, var_names::{MIXNET_CONTRACT_ADDRESS, NYM_API, NYXD, VESTING_CONTRACT_ADDRESS}, NymNetworkDetails, diff --git a/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs b/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs index 788810c8be..936ec5b383 100644 --- a/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs +++ b/common/commands/src/validator/cosmwasm/generators/coconut_bandwidth.rs @@ -27,14 +27,14 @@ pub async fn generate(args: Args) { debug!("Received arguments: {:?}", args); let multisig_addr = args.multisig_addr.unwrap_or_else(|| { - let address = std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + let address = std::env::var(nym_network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) .expect("Multisig address has to be set"); AccountId::from_str(address.as_str()) .expect("Failed converting multisig address to AccountId") }); let mix_denom = args.mix_denom.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") + std::env::var(nym_network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") }); let instantiate_msg = InstantiateMsg { diff --git a/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs index 9d83de31bf..6386d9b600 100644 --- a/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs +++ b/common/commands/src/validator/cosmwasm/generators/coconut_dkg.rs @@ -45,22 +45,23 @@ pub async fn generate(args: Args) { debug!("Received arguments: {:?}", args); let multisig_addr = args.multisig_addr.unwrap_or_else(|| { - let address = std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + let address = std::env::var(nym_network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) .expect("Multisig address has to be set"); AccountId::from_str(address.as_str()) .expect("Failed converting multisig address to AccountId") }); let mix_denom = args.mix_denom.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") + std::env::var(nym_network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") }); - let mut time_configuration = - if let Ok(config) = std::env::var(network_defaults::var_names::DKG_TIME_CONFIGURATION) { - TimeConfiguration::from_str(&config).expect("Invalid env variable value") - } else { - TimeConfiguration::default() - }; + let mut time_configuration = if let Ok(config) = + std::env::var(nym_network_defaults::var_names::DKG_TIME_CONFIGURATION) + { + TimeConfiguration::from_str(&config).expect("Invalid env variable value") + } else { + TimeConfiguration::default() + }; if let Some(public_key_submission_time_secs) = args.public_key_submission_time_secs { time_configuration.public_key_submission_time_secs = public_key_submission_time_secs; } diff --git a/common/commands/src/validator/cosmwasm/generators/mixnet.rs b/common/commands/src/validator/cosmwasm/generators/mixnet.rs index bb08b31462..4579385dd3 100644 --- a/common/commands/src/validator/cosmwasm/generators/mixnet.rs +++ b/common/commands/src/validator/cosmwasm/generators/mixnet.rs @@ -79,21 +79,21 @@ pub async fn generate(args: Args) { debug!("initial_rewarding_params: {:?}", initial_rewarding_params); let rewarding_validator_address = args.rewarding_validator_address.unwrap_or_else(|| { - let address = std::env::var(network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) + let address = std::env::var(nym_network_defaults::var_names::REWARDING_VALIDATOR_ADDRESS) .expect("Rewarding validator address has to be set"); AccountId::from_str(address.as_str()) .expect("Failed converting rewarding validator address to AccountId") }); let vesting_contract_address = args.vesting_contract_address.unwrap_or_else(|| { - let address = std::env::var(network_defaults::var_names::VESTING_CONTRACT_ADDRESS) + let address = std::env::var(nym_network_defaults::var_names::VESTING_CONTRACT_ADDRESS) .expect("Vesting contract address has to be set"); AccountId::from_str(address.as_str()) .expect("Failed converting vesting contract address to AccountId") }); let rewarding_denom = args.rewarding_denom.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::MIX_DENOM) + std::env::var(nym_network_defaults::var_names::MIX_DENOM) .expect("Rewarding (mix) denom has to be set") }); diff --git a/common/commands/src/validator/cosmwasm/generators/multisig.rs b/common/commands/src/validator/cosmwasm/generators/multisig.rs index 3821374fd0..0d0be11477 100644 --- a/common/commands/src/validator/cosmwasm/generators/multisig.rs +++ b/common/commands/src/validator/cosmwasm/generators/multisig.rs @@ -36,14 +36,14 @@ pub async fn generate(args: Args) { let coconut_bandwidth_contract_address = args.coconut_bandwidth_contract_address.unwrap_or_else(|| { let address = - std::env::var(network_defaults::var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS) + std::env::var(nym_network_defaults::var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS) .expect("Coconut bandwidth contract address has to be set"); AccountId::from_str(address.as_str()) .expect("Failed converting bandwidth contract address to AccountId") }); let coconut_dkg_contract_address = args.coconut_dkg_contract_address.unwrap_or_else(|| { - let address = std::env::var(network_defaults::var_names::COCONUT_DKG_CONTRACT_ADDRESS) + let address = std::env::var(nym_network_defaults::var_names::COCONUT_DKG_CONTRACT_ADDRESS) .expect("Coconut DKG contract address has to be set"); AccountId::from_str(address.as_str()) .expect("Failed converting DKG contract address to AccountId") diff --git a/common/commands/src/validator/cosmwasm/generators/vesting.rs b/common/commands/src/validator/cosmwasm/generators/vesting.rs index d10e222d57..d9946f8ebb 100644 --- a/common/commands/src/validator/cosmwasm/generators/vesting.rs +++ b/common/commands/src/validator/cosmwasm/generators/vesting.rs @@ -24,14 +24,14 @@ pub async fn generate(args: Args) { debug!("Received arguments: {:?}", args); let mixnet_contract_address = args.mixnet_contract_address.unwrap_or_else(|| { - let address = std::env::var(network_defaults::var_names::MIXNET_CONTRACT_ADDRESS) + let address = std::env::var(nym_network_defaults::var_names::MIXNET_CONTRACT_ADDRESS) .expect("Mixnet contract address has to be set"); AccountId::from_str(address.as_str()) .expect("Failed converting mixnet address to AccountId") }); let mix_denom = args.mix_denom.unwrap_or_else(|| { - std::env::var(network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") + std::env::var(nym_network_defaults::var_names::MIX_DENOM).expect("Mix denom has to be set") }); let instantiate_msg = InitMsg { diff --git a/common/commands/src/validator/cosmwasm/init_contract.rs b/common/commands/src/validator/cosmwasm/init_contract.rs index 6ee55b7791..c85e5cd462 100644 --- a/common/commands/src/validator/cosmwasm/init_contract.rs +++ b/common/commands/src/validator/cosmwasm/init_contract.rs @@ -5,7 +5,7 @@ use crate::context::SigningClient; use clap::Parser; use cosmrs::{AccountId, Coin as CosmosCoin}; use log::info; -use network_defaults::NymNetworkDetails; +use nym_network_defaults::NymNetworkDetails; use validator_client::nyxd::cosmwasm_client::types::{ContractCodeId, InstantiateOptions}; use validator_client::nyxd::Coin; diff --git a/common/commands/src/validator/mixnet/operators/gateway/bond_gateway.rs b/common/commands/src/validator/mixnet/operators/gateway/bond_gateway.rs index 376c9dbcb7..e565364609 100644 --- a/common/commands/src/validator/mixnet/operators/gateway/bond_gateway.rs +++ b/common/commands/src/validator/mixnet/operators/gateway/bond_gateway.rs @@ -4,8 +4,8 @@ use crate::context::SigningClient; use clap::Parser; use log::{info, warn}; -use network_defaults::{DEFAULT_CLIENT_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT}; use nym_mixnet_contract_common::Coin; +use nym_network_defaults::{DEFAULT_CLIENT_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT}; use validator_client::nyxd::traits::MixnetSigningClient; #[derive(Debug, Parser)] diff --git a/common/commands/src/validator/mixnet/operators/gateway/vesting_bond_gateway.rs b/common/commands/src/validator/mixnet/operators/gateway/vesting_bond_gateway.rs index a25ca4aa6a..9cb4b338d4 100644 --- a/common/commands/src/validator/mixnet/operators/gateway/vesting_bond_gateway.rs +++ b/common/commands/src/validator/mixnet/operators/gateway/vesting_bond_gateway.rs @@ -4,8 +4,8 @@ use crate::context::SigningClient; use clap::Parser; use log::{info, warn}; -use network_defaults::{DEFAULT_CLIENT_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT}; use nym_mixnet_contract_common::{Coin, Gateway}; +use nym_network_defaults::{DEFAULT_CLIENT_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT}; use validator_client::nyxd::VestingSigningClient; #[derive(Debug, Parser)] diff --git a/common/commands/src/validator/mixnet/operators/mixnode/bond_mixnode.rs b/common/commands/src/validator/mixnet/operators/mixnode/bond_mixnode.rs index dc394c0e81..f6650a9ac9 100644 --- a/common/commands/src/validator/mixnet/operators/mixnode/bond_mixnode.rs +++ b/common/commands/src/validator/mixnet/operators/mixnode/bond_mixnode.rs @@ -5,10 +5,10 @@ use clap::Parser; use cosmwasm_std::Uint128; use log::{info, warn}; -use network_defaults::{ +use nym_mixnet_contract_common::{Coin, MixNodeCostParams, Percent}; +use nym_network_defaults::{ DEFAULT_HTTP_API_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT, DEFAULT_VERLOC_LISTENING_PORT, }; -use nym_mixnet_contract_common::{Coin, MixNodeCostParams, Percent}; use validator_client::nyxd::traits::MixnetSigningClient; use validator_client::nyxd::CosmWasmCoin; diff --git a/common/commands/src/validator/mixnet/operators/mixnode/vesting_bond_mixnode.rs b/common/commands/src/validator/mixnet/operators/mixnode/vesting_bond_mixnode.rs index 8e17762168..a42d3b02de 100644 --- a/common/commands/src/validator/mixnet/operators/mixnode/vesting_bond_mixnode.rs +++ b/common/commands/src/validator/mixnet/operators/mixnode/vesting_bond_mixnode.rs @@ -5,11 +5,11 @@ use crate::context::SigningClient; use clap::Parser; use cosmwasm_std::Uint128; use log::{info, warn}; -use network_defaults::{ - DEFAULT_HTTP_API_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT, DEFAULT_VERLOC_LISTENING_PORT, -}; use nym_mixnet_contract_common::{Coin, MixNodeCostParams}; use nym_mixnet_contract_common::{MixNode, Percent}; +use nym_network_defaults::{ + DEFAULT_HTTP_API_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT, DEFAULT_VERLOC_LISTENING_PORT, +}; use validator_client::nyxd::{CosmWasmCoin, VestingSigningClient}; #[derive(Debug, Parser)] diff --git a/common/commands/src/validator/vesting/create_vesting_schedule.rs b/common/commands/src/validator/vesting/create_vesting_schedule.rs index 5766c7d0df..dc3cd25624 100644 --- a/common/commands/src/validator/vesting/create_vesting_schedule.rs +++ b/common/commands/src/validator/vesting/create_vesting_schedule.rs @@ -6,8 +6,8 @@ use std::str::FromStr; use clap::Parser; use log::info; -use network_defaults::NymNetworkDetails; use nym_mixnet_contract_common::Coin; +use nym_network_defaults::NymNetworkDetails; use nym_vesting_contract_common::messages::VestingSpecification; use nym_vesting_contract_common::PledgeCap; use validator_client::nyxd::AccountId; diff --git a/common/config/Cargo.toml b/common/config/Cargo.toml index 167286538e..035d555765 100644 --- a/common/config/Cargo.toml +++ b/common/config/Cargo.toml @@ -14,4 +14,4 @@ serde = { version = "1.0", features = ["derive"] } toml = "0.5.6" url = "2.2" -network-defaults = { path = "../network-defaults" } +nym-network-defaults = { path = "../network-defaults" } diff --git a/common/config/src/defaults.rs b/common/config/src/defaults.rs index ffcdb0004f..1fdccc00b7 100644 --- a/common/config/src/defaults.rs +++ b/common/config/src/defaults.rs @@ -4,4 +4,4 @@ // re-export everything from the `network-defaults` to not break the existing imports // reason for moving defaults to separate crate is that I don't want to pull in all dependencies // like `handlebars`, `toml`, etc if I only want to grab one constant... -pub use network_defaults::*; +pub use nym_network_defaults::*; diff --git a/common/config/src/lib.rs b/common/config/src/lib.rs index f14b94faf2..746e1c6443 100644 --- a/common/config/src/lib.rs +++ b/common/config/src/lib.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use handlebars::Handlebars; -use network_defaults::mainnet::read_var_if_not_default; -use network_defaults::var_names::CONFIGURED; +use nym_network_defaults::mainnet::read_var_if_not_default; +use nym_network_defaults::var_names::CONFIGURED; use serde::de::DeserializeOwned; use serde::Serialize; use std::any::type_name; diff --git a/common/mixnode-common/Cargo.toml b/common/mixnode-common/Cargo.toml index d443e28a17..0b0e444731 100644 --- a/common/mixnode-common/Cargo.toml +++ b/common/mixnode-common/Cargo.toml @@ -19,7 +19,7 @@ url = "2.2" thiserror = "1.0.37" nym-crypto = { path = "../crypto" } -network-defaults = { path = "../network-defaults" } +nym-network-defaults = { path = "../network-defaults" } nym-sphinx-acknowledgements = { path = "../nymsphinx/acknowledgements" } nym-sphinx-addressing = { path = "../nymsphinx/addressing" } nym-sphinx-forwarding = { path = "../nymsphinx/forwarding" } diff --git a/common/mixnode-common/src/verloc/mod.rs b/common/mixnode-common/src/verloc/mod.rs index 0831606ef1..336d8a20e9 100644 --- a/common/mixnode-common/src/verloc/mod.rs +++ b/common/mixnode-common/src/verloc/mod.rs @@ -6,9 +6,9 @@ use crate::verloc::sender::{PacketSender, TestedNode}; use futures::stream::FuturesUnordered; use futures::StreamExt; use log::*; -use network_defaults::mainnet::NYM_API; use nym_bin_common::version_checker::{self, parse_version}; use nym_crypto::asymmetric::identity; +use nym_network_defaults::mainnet::NYM_API; use nym_task::TaskClient; use rand::seq::SliceRandom; use rand::thread_rng; diff --git a/common/network-defaults/Cargo.toml b/common/network-defaults/Cargo.toml index 0c84938c7b..a8db7465a3 100644 --- a/common/network-defaults/Cargo.toml +++ b/common/network-defaults/Cargo.toml @@ -1,16 +1,17 @@ [package] -name = "network-defaults" +name = "nym-network-defaults" version = "0.1.0" -authors = ["Jędrzej Stuczyński "] -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +description = "Nym network defaults" +edition.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true [dependencies] -cfg-if = "1.0.0" -dotenv = "0.15.0" +cfg-if = { workspace = true } +dotenv = { workspace = true } hex-literal = "0.3.3" -once_cell = "1.7.2" -serde = {version = "1.0", features = ["derive"]} -thiserror = "1.0" -url = "2.2" +once_cell = { workspace = true } +serde = { workspace = true, features = ["derive"]} +thiserror = { workspace = true } +url = { workspace = true } diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index e5f5aaa2ac..7630b79979 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -31,7 +31,7 @@ rand_pcg = "0.3.1" nym-mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet-contract" } nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common" } -network-defaults = { path = "../common/network-defaults" } +nym-network-defaults = { path = "../common/network-defaults" } nym-bin-common = { path = "../common/bin-common"} nym-task = { path = "../common/task" } validator-client = { path = "../common/client-libs/validator-client", features=["nyxd-client"] } diff --git a/explorer-api/src/client.rs b/explorer-api/src/client.rs index ca9449f971..40e0e1d7f8 100644 --- a/explorer-api/src/client.rs +++ b/explorer-api/src/client.rs @@ -1,4 +1,4 @@ -use network_defaults::{ +use nym_network_defaults::{ var_names::{NYM_API, NYXD}, NymNetworkDetails, }; diff --git a/explorer-api/src/main.rs b/explorer-api/src/main.rs index 4fa35f2dbe..bd71b7c074 100644 --- a/explorer-api/src/main.rs +++ b/explorer-api/src/main.rs @@ -6,8 +6,8 @@ extern crate rocket_okapi; use clap::Parser; use dotenv::dotenv; use log::info; -use network_defaults::setup_env; use nym_bin_common::logging::setup_logging; +use nym_network_defaults::setup_env; use nym_task::TaskManager; pub(crate) mod cache; diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index c40f5e042b..de98afbb42 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -60,7 +60,7 @@ nym-bin-common = { path = "../common/bin-common" } gateway-requests = { path = "gateway-requests" } mixnet-client = { path = "../common/client-libs/mixnet-client" } mixnode-common = { path = "../common/mixnode-common" } -network-defaults = { path = "../common/network-defaults" } +nym-network-defaults = { path = "../common/network-defaults" } nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } statistics-common = { path = "../common/statistics" } diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index a21039cac6..ce66400642 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -161,7 +161,7 @@ pub async fn execute(args: Init, output: OutputFormat) -> Result<(), Box for Bandwidth { fn from(credential: Credential) -> Self { let token_value = credential.voucher_value(); - let bandwidth_bytes = token_value * network_defaults::BYTES_PER_UTOKEN; + let bandwidth_bytes = token_value * nym_network_defaults::BYTES_PER_UTOKEN; Bandwidth { value: bandwidth_bytes, } diff --git a/gateway/src/node/client_handling/websocket/connection_handler/eth_events.rs b/gateway/src/node/client_handling/websocket/connection_handler/eth_events.rs index 3998ceed0d..53efa7ebb6 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/eth_events.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/eth_events.rs @@ -6,7 +6,7 @@ use bandwidth_claim_contract::msg::ExecuteMsg; use bandwidth_claim_contract::payment::LinkPaymentData; use credentials::token::bandwidth::TokenCredential; use nym_crypto::asymmetric::identity::{PublicKey, Signature, SIGNATURE_LENGTH}; -use network_defaults::{ETH_EVENT_NAME, ETH_MIN_BLOCK_DEPTH}; +use nym_network_defaults::{ETH_EVENT_NAME, ETH_MIN_BLOCK_DEPTH}; use std::str::FromStr; use validator_client::nxmd::traits::MixnetQueryClient; use validator_client::nyxd::{AccountId, NyxdClient, SigningNyxdClient}; diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index 3fa11671d4..3d7930bc8f 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -16,8 +16,8 @@ use crate::{commands::sign::load_identity_keys, OutputFormat}; use colored::Colorize; use log::*; use mixnet_client::forwarder::{MixForwardingSender, PacketForwarder}; -use network_defaults::NymNetworkDetails; use nym_crypto::asymmetric::{encryption, identity}; +use nym_network_defaults::NymNetworkDetails; use nym_task::{TaskClient, TaskManager}; use rand::seq::SliceRandom; use rand::thread_rng; diff --git a/nym-connect-android/src-tauri/Cargo.lock b/nym-connect-android/src-tauri/Cargo.lock index cb0e68c00b..8c08eced60 100644 --- a/nym-connect-android/src-tauri/Cargo.lock +++ b/nym-connect-android/src-tauri/Cargo.lock @@ -775,7 +775,7 @@ dependencies = [ "cfg-if", "handlebars", "log", - "network-defaults", + "nym-network-defaults", "serde", "toml", "url", @@ -1948,8 +1948,8 @@ dependencies = [ "getrandom 0.2.8", "log", "mobile-storage", - "network-defaults", "nym-crypto", + "nym-network-defaults", "nym-pemstore", "nym-sphinx", "nym-task", @@ -3343,19 +3343,6 @@ dependencies = [ "jni-sys", ] -[[package]] -name = "network-defaults" -version = "0.1.0" -dependencies = [ - "cfg-if", - "dotenv", - "hex-literal", - "once_cell", - "serde", - "thiserror", - "url", -] - [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -3612,6 +3599,19 @@ dependencies = [ "time 0.3.18", ] +[[package]] +name = "nym-network-defaults" +version = "0.1.0" +dependencies = [ + "cfg-if", + "dotenv", + "hex-literal", + "once_cell", + "serde", + "thiserror", + "url", +] + [[package]] name = "nym-pemstore" version = "0.1.0" @@ -3635,9 +3635,9 @@ dependencies = [ "lazy_static", "log", "mobile-storage", - "network-defaults", "nym-bin-common", "nym-crypto", + "nym-network-defaults", "nym-pemstore", "nym-sphinx", "nym-task", @@ -6779,10 +6779,10 @@ dependencies = [ "itertools", "log", "multisig-contract-common", - "network-defaults", "nym-api-requests", "nym-contracts-common", "nym-mixnet-contract-common", + "nym-network-defaults", "nym-vesting-contract", "nym-vesting-contract-common", "prost", diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 6c4ef3310a..b01ceeafaf 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -686,7 +686,7 @@ dependencies = [ "cfg-if", "handlebars", "log", - "network-defaults", + "nym-network-defaults", "serde", "toml", "url", @@ -2809,19 +2809,6 @@ dependencies = [ "jni-sys", ] -[[package]] -name = "network-defaults" -version = "0.1.0" -dependencies = [ - "cfg-if", - "dotenv", - "hex-literal", - "once_cell", - "serde", - "thiserror", - "url", -] - [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -2981,6 +2968,19 @@ dependencies = [ "ts-rs", ] +[[package]] +name = "nym-network-defaults" +version = "0.1.0" +dependencies = [ + "cfg-if", + "dotenv", + "hex-literal", + "once_cell", + "serde", + "thiserror", + "url", +] + [[package]] name = "nym-pemstore" version = "0.1.0" @@ -3063,8 +3063,8 @@ dependencies = [ "cosmrs", "cosmwasm-std", "hex-literal", - "network-defaults", "nym-mixnet-contract-common", + "nym-network-defaults", "nym-types", "nym-vesting-contract", "nym-vesting-contract-common", @@ -5576,10 +5576,10 @@ dependencies = [ "itertools", "log", "multisig-contract-common", - "network-defaults", "nym-api-requests", "nym-contracts-common", "nym-mixnet-contract-common", + "nym-network-defaults", "nym-vesting-contract", "nym-vesting-contract-common", "prost", diff --git a/nym-wallet/nym-wallet-types/Cargo.toml b/nym-wallet/nym-wallet-types/Cargo.toml index 399de11c26..beb4deebee 100644 --- a/nym-wallet/nym-wallet-types/Cargo.toml +++ b/nym-wallet/nym-wallet-types/Cargo.toml @@ -15,7 +15,7 @@ cosmwasm-std = "1.0.0-beta8" cosmrs = { git = "https://github.com/neacsu/cosmos-rust", branch = "neacsu/feegrant_support" } config = { path = "../../common/config" } -network-defaults = { path = "../../common/network-defaults" } +nym-network-defaults = { path = "../../common/network-defaults" } nym-mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract" } validator-client = { path = "../../common/client-libs/validator-client", features = [ "nyxd-client", diff --git a/nym-wallet/nym-wallet-types/src/network.rs b/nym-wallet/nym-wallet-types/src/network.rs index 7a2275a092..24daf1b02c 100644 --- a/nym-wallet/nym-wallet-types/src/network.rs +++ b/nym-wallet/nym-wallet-types/src/network.rs @@ -94,7 +94,7 @@ fn parse_optional_str(raw: &str) -> Option { } mod sandbox { - use network_defaults::{ChainDetails, DenomDetails, NymContracts, ValidatorDetails}; + use nym_network_defaults::{ChainDetails, DenomDetails, NymContracts, ValidatorDetails}; use super::parse_optional_str; @@ -129,8 +129,8 @@ mod sandbox { )] } - pub(crate) fn network_details() -> network_defaults::NymNetworkDetails { - network_defaults::NymNetworkDetails { + pub(crate) fn network_details() -> nym_network_defaults::NymNetworkDetails { + nym_network_defaults::NymNetworkDetails { chain_details: ChainDetails { bech32_account_prefix: BECH32_PREFIX.to_string(), mix_denom: MIX_DENOM.into(), @@ -155,7 +155,7 @@ mod sandbox { } mod qa { - use network_defaults::{ChainDetails, DenomDetails, NymContracts, ValidatorDetails}; + use nym_network_defaults::{ChainDetails, DenomDetails, NymContracts, ValidatorDetails}; use super::parse_optional_str; @@ -190,8 +190,8 @@ mod qa { )] } - pub(crate) fn network_details() -> network_defaults::NymNetworkDetails { - network_defaults::NymNetworkDetails { + pub(crate) fn network_details() -> nym_network_defaults::NymNetworkDetails { + nym_network_defaults::NymNetworkDetails { chain_details: ChainDetails { bech32_account_prefix: BECH32_PREFIX.to_string(), mix_denom: MIX_DENOM.into(), diff --git a/sdk/rust/nym-sdk/Cargo.toml b/sdk/rust/nym-sdk/Cargo.toml index 362af20483..6c9027a70d 100644 --- a/sdk/rust/nym-sdk/Cargo.toml +++ b/sdk/rust/nym-sdk/Cargo.toml @@ -10,7 +10,7 @@ client-core = { path = "../../../clients/client-core", features = ["fs-surb-stor nym-crypto = { path = "../../../common/crypto" } gateway-client = { path = "../../../common/client-libs/gateway-client" } gateway-requests = { path = "../../../gateway/gateway-requests" } -network-defaults = { path = "../../../common/network-defaults" } +nym-network-defaults = { path = "../../../common/network-defaults" } nym-sphinx = { path = "../../../common/nymsphinx" } nym-task = { path = "../../../common/task" } validator-client = { path = "../../../common/client-libs/validator-client", features = ["nyxd-client"] } diff --git a/sdk/rust/nym-sdk/src/mixnet/config.rs b/sdk/rust/nym-sdk/src/mixnet/config.rs index b5705cae92..1f7dd49812 100644 --- a/sdk/rust/nym-sdk/src/mixnet/config.rs +++ b/sdk/rust/nym-sdk/src/mixnet/config.rs @@ -1,5 +1,5 @@ use client_core::config::DebugConfig; -use network_defaults::mainnet; +use nym_network_defaults::mainnet; use url::Url; /// Config struct for [`crate::mixnet::MixnetClient`] diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 483c5f99ab..bc2f99f177 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -35,7 +35,7 @@ client-core = { path = "../../clients/client-core" } config = { path = "../../common/config" } nym-crypto = { path = "../../common/crypto" } nym-bin-common = { path = "../../common/bin-common"} -network-defaults = { path = "../../common/network-defaults" } +nym-network-defaults = { path = "../../common/network-defaults" } nym-sdk = { path = "../../sdk/rust/nym-sdk" } nym-sphinx = { path = "../../common/nymsphinx" } ordered-buffer = {path = "../../common/socks5/ordered-buffer"} diff --git a/service-providers/network-requester/src/cli/mod.rs b/service-providers/network-requester/src/cli/mod.rs index 3185d52c50..b4e576b190 100644 --- a/service-providers/network-requester/src/cli/mod.rs +++ b/service-providers/network-requester/src/cli/mod.rs @@ -67,13 +67,13 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { .with_optional_custom_env_ext( BaseConfig::with_custom_nym_apis, args.nym_apis, - network_defaults::var_names::NYM_API, + nym_network_defaults::var_names::NYM_API, config::parse_urls, ) .with_optional_custom_env_ext( BaseConfig::with_custom_nyxd, args.nyxd_urls, - network_defaults::var_names::NYXD, + nym_network_defaults::var_names::NYXD, config::parse_urls, ) .with_optional_ext( diff --git a/service-providers/network-requester/src/main.rs b/service-providers/network-requester/src/main.rs index ca25899bf3..0629525185 100644 --- a/service-providers/network-requester/src/main.rs +++ b/service-providers/network-requester/src/main.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use clap::{crate_name, crate_version, Parser}; -use network_defaults::setup_env; use nym_bin_common::logging::{banner, setup_logging}; +use nym_network_defaults::setup_env; use error::NetworkRequesterError; diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index 79a03ea268..dadda79fe0 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -23,4 +23,4 @@ tap = "1" nym-cli-commands = { path = "../../common/commands" } nym-bin-common = { path = "../../common/bin-common"} validator-client = { path = "../../common/client-libs/validator-client", features = ["nyxd-client"] } -network-defaults = { path = "../../common/network-defaults" } +nym-network-defaults = { path = "../../common/network-defaults" } diff --git a/tools/nym-cli/src/validator/account.rs b/tools/nym-cli/src/validator/account.rs index e3d8d5c12d..44ee130d58 100644 --- a/tools/nym-cli/src/validator/account.rs +++ b/tools/nym-cli/src/validator/account.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_query_client, create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; use validator_client::nyxd::AccountId; pub(crate) async fn execute( diff --git a/tools/nym-cli/src/validator/block.rs b/tools/nym-cli/src/validator/block.rs index 104680a1d1..6323f09ba6 100644 --- a/tools/nym-cli/src/validator/block.rs +++ b/tools/nym-cli/src/validator/block.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::create_query_client; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( block: nym_cli_commands::validator::block::Block, diff --git a/tools/nym-cli/src/validator/cosmwasm/mod.rs b/tools/nym-cli/src/validator/cosmwasm/mod.rs index 33d84d2519..28f197eedb 100644 --- a/tools/nym-cli/src/validator/cosmwasm/mod.rs +++ b/tools/nym-cli/src/validator/cosmwasm/mod.rs @@ -1,5 +1,5 @@ -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; pub(crate) mod generators; diff --git a/tools/nym-cli/src/validator/mixnet/delegators/mod.rs b/tools/nym-cli/src/validator/mixnet/delegators/mod.rs index 3e40d2d26a..76776b1146 100644 --- a/tools/nym-cli/src/validator/mixnet/delegators/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/delegators/mod.rs @@ -1,10 +1,10 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{ create_signing_client, create_signing_client_with_nym_api, ClientArgs, }; +use nym_network_defaults::NymNetworkDetails; pub(crate) mod rewards; diff --git a/tools/nym-cli/src/validator/mixnet/delegators/rewards/mod.rs b/tools/nym-cli/src/validator/mixnet/delegators/rewards/mod.rs index 39ca3f673c..211d858838 100644 --- a/tools/nym-cli/src/validator/mixnet/delegators/rewards/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/delegators/rewards/mod.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( global_args: ClientArgs, diff --git a/tools/nym-cli/src/validator/mixnet/mod.rs b/tools/nym-cli/src/validator/mixnet/mod.rs index 366b922b16..29edfd9088 100644 --- a/tools/nym-cli/src/validator/mixnet/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/mod.rs @@ -1,5 +1,5 @@ -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::ClientArgs; +use nym_network_defaults::NymNetworkDetails; pub(crate) mod delegators; pub(crate) mod operators; diff --git a/tools/nym-cli/src/validator/mixnet/operators/gateways/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/gateways/mod.rs index f54ac43bca..b7bde45cf3 100644 --- a/tools/nym-cli/src/validator/mixnet/operators/gateways/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/operators/gateways/mod.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( global_args: ClientArgs, diff --git a/tools/nym-cli/src/validator/mixnet/operators/mixnodes/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/mixnodes/mod.rs index 2a6a3d0477..fbe07679fb 100644 --- a/tools/nym-cli/src/validator/mixnet/operators/mixnodes/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/operators/mixnodes/mod.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; pub(crate) mod keys; pub(crate) mod rewards; diff --git a/tools/nym-cli/src/validator/mixnet/operators/mixnodes/rewards/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/mixnodes/rewards/mod.rs index fb2d241b74..d485a5131b 100644 --- a/tools/nym-cli/src/validator/mixnet/operators/mixnodes/rewards/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/operators/mixnodes/rewards/mod.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( global_args: ClientArgs, diff --git a/tools/nym-cli/src/validator/mixnet/operators/mixnodes/settings/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/mixnodes/settings/mod.rs index 9dce8335b7..77b12e2cc4 100644 --- a/tools/nym-cli/src/validator/mixnet/operators/mixnodes/settings/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/operators/mixnodes/settings/mod.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( global_args: ClientArgs, diff --git a/tools/nym-cli/src/validator/mixnet/operators/mod.rs b/tools/nym-cli/src/validator/mixnet/operators/mod.rs index b1706fb6c8..a79b432872 100644 --- a/tools/nym-cli/src/validator/mixnet/operators/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/operators/mod.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::ClientArgs; +use nym_network_defaults::NymNetworkDetails; pub(crate) mod gateways; pub(crate) mod mixnodes; diff --git a/tools/nym-cli/src/validator/mixnet/query/mod.rs b/tools/nym-cli/src/validator/mixnet/query/mod.rs index ea41ebd7d6..8726787fc3 100644 --- a/tools/nym-cli/src/validator/mixnet/query/mod.rs +++ b/tools/nym-cli/src/validator/mixnet/query/mod.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::create_query_client_with_nym_api; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( query: nym_cli_commands::validator::mixnet::query::MixnetQuery, diff --git a/tools/nym-cli/src/validator/signature.rs b/tools/nym-cli/src/validator/signature.rs index edc237753f..136878bd6e 100644 --- a/tools/nym-cli/src/validator/signature.rs +++ b/tools/nym-cli/src/validator/signature.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::create_query_client; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( signature: nym_cli_commands::validator::signature::Signature, diff --git a/tools/nym-cli/src/validator/transactions.rs b/tools/nym-cli/src/validator/transactions.rs index 05455a3502..55844a3839 100644 --- a/tools/nym-cli/src/validator/transactions.rs +++ b/tools/nym-cli/src/validator/transactions.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::create_query_client; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( transactions: nym_cli_commands::validator::transactions::Transactions, diff --git a/tools/nym-cli/src/validator/vesting.rs b/tools/nym-cli/src/validator/vesting.rs index 202011bc3c..690ad68fb9 100644 --- a/tools/nym-cli/src/validator/vesting.rs +++ b/tools/nym-cli/src/validator/vesting.rs @@ -1,8 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use network_defaults::NymNetworkDetails; use nym_cli_commands::context::{create_query_client, create_signing_client, ClientArgs}; +use nym_network_defaults::NymNetworkDetails; pub(crate) async fn execute( global_args: ClientArgs, From 39e75850ff44dbb3939977f8b377ed9565973ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Tue, 21 Feb 2023 13:55:14 +0000 Subject: [PATCH 415/591] Problem142 (#3025) * revamped calculation of spendable coins and behaviour of stakes * added new queries to the VestingQueryClient * fixed return types for the query client * updated wallet commands * updated common commands * :fire: removed dead and commented out code * comment regarding the 'state_dump_decoder' * query for withdrawn coins --- .../src/nyxd/traits/vesting_query_client.rs | 58 +- .../vesting/query_vesting_schedule.rs | 20 +- .../vesting-contract/src/messages.rs | 21 +- contracts/vesting/Cargo.toml | 6 + contracts/vesting/src/contract.rs | 98 ++- contracts/vesting/src/errors.rs | 5 +- contracts/vesting/src/support/tests.rs | 312 +++++++- .../vesting/src/traits/vesting_account.rs | 54 +- .../src/vesting/account/delegating_account.rs | 20 +- .../account/gateway_bonding_account.rs | 20 +- .../account/mixnode_bonding_account.rs | 39 +- contracts/vesting/src/vesting/account/mod.rs | 45 ++ .../src/vesting/account/vesting_account.rs | 217 ++---- contracts/vesting/src/vesting/mod.rs | 686 +----------------- nym-wallet/src-tauri/src/error.rs | 3 + nym-wallet/src-tauri/src/main.rs | 11 +- .../src/operations/vesting/queries.rs | 183 +++-- 17 files changed, 797 insertions(+), 1001 deletions(-) diff --git a/common/client-libs/validator-client/src/nyxd/traits/vesting_query_client.rs b/common/client-libs/validator-client/src/nyxd/traits/vesting_query_client.rs index ef54f11ef1..64774af6e6 100644 --- a/common/client-libs/validator-client/src/nyxd/traits/vesting_query_client.rs +++ b/common/client-libs/validator-client/src/nyxd/traits/vesting_query_client.rs @@ -134,28 +134,68 @@ pub trait VestingQueryClient { .await } - async fn delegated_free( + async fn get_historical_vesting_staking_reward( &self, vesting_account_address: &str, - block_time: Option, ) -> Result { - self.query_vesting_contract::(VestingQueryMsg::GetDelegatedFree { + self.query_vesting_contract::( + VestingQueryMsg::GetHistoricalVestingStakingReward { + vesting_account_address: vesting_account_address.to_string(), + }, + ) + .await + .map(Into::into) + } + + async fn get_spendable_vested_coins( + &self, + vesting_account_address: &str, + ) -> Result { + self.query_vesting_contract::(VestingQueryMsg::GetSpendableVestedCoins { vesting_account_address: vesting_account_address.to_string(), - block_time, }) .await .map(Into::into) } - /// Returns the total amount of delegated tokens that have vested - async fn delegated_vesting( + async fn get_spendable_reward_coins( &self, vesting_account_address: &str, - block_time: Option, ) -> Result { - self.query_vesting_contract::(VestingQueryMsg::GetDelegatedVesting { + self.query_vesting_contract::(VestingQueryMsg::GetSpendableRewardCoins { + vesting_account_address: vesting_account_address.to_string(), + }) + .await + .map(Into::into) + } + + async fn get_delegated_coins(&self, vesting_account_address: &str) -> Result { + self.query_vesting_contract::(VestingQueryMsg::GetDelegatedCoins { + vesting_account_address: vesting_account_address.to_string(), + }) + .await + .map(Into::into) + } + + async fn get_pledged_coins(&self, vesting_account_address: &str) -> Result { + self.query_vesting_contract::(VestingQueryMsg::GetPledgedCoins { + vesting_account_address: vesting_account_address.to_string(), + }) + .await + .map(Into::into) + } + + async fn get_staked_coins(&self, vesting_account_address: &str) -> Result { + self.query_vesting_contract::(VestingQueryMsg::GetStakedCoins { + vesting_account_address: vesting_account_address.to_string(), + }) + .await + .map(Into::into) + } + + async fn get_withdrawn_coins(&self, vesting_account_address: &str) -> Result { + self.query_vesting_contract::(VestingQueryMsg::GetWithdrawnCoins { vesting_account_address: vesting_account_address.to_string(), - block_time, }) .await .map(Into::into) diff --git a/common/commands/src/validator/vesting/query_vesting_schedule.rs b/common/commands/src/validator/vesting/query_vesting_schedule.rs index 3d486124ef..d3f544c7ee 100644 --- a/common/commands/src/validator/vesting/query_vesting_schedule.rs +++ b/common/commands/src/validator/vesting/query_vesting_schedule.rs @@ -53,8 +53,10 @@ pub async fn query(args: Args, client: QueryClient, address_from_mnemonic: Optio // TODO: get better copy text for what these are let vesting_coins = client.vesting_coins(&vesting_address, None).await; - let delegated_vesting = client.delegated_vesting(&vesting_address, None).await; - let delegated_free = client.delegated_free(&vesting_address, None).await; + let delegated = client.get_delegated_coins(&vesting_address).await; + let pledged = client.get_pledged_coins(&vesting_address).await; + let withdrawn = client.get_withdrawn_coins(&vesting_address).await; + let staked = client.get_staked_coins(&vesting_address).await; original_vesting.as_ref().map_or_else(show_error, |res| { println!( @@ -139,11 +141,17 @@ pub async fn query(args: Args, client: QueryClient, address_from_mnemonic: Optio vesting_coins.map_or_else(show_error, |res| { println!("Vesting coins: {} ({})", pretty_coin(&res), res); }); - delegated_vesting.map_or_else(show_error, |res| { - println!("Delegated vesting: {} ({})", pretty_coin(&res), res); + withdrawn.map_or_else(show_error, |res| { + println!("Withdrawn: {} ({})", pretty_coin(&res), res); }); - delegated_free.map_or_else(show_error, |res| { - println!("Delegation free: {} ({})", pretty_coin(&res), res); + delegated.map_or_else(show_error, |res| { + println!("Delegated: {} ({})", pretty_coin(&res), res); + }); + pledged.map_or_else(show_error, |res| { + println!("Pledged: {} ({})", pretty_coin(&res), res); + }); + staked.map_or_else(show_error, |res| { + println!("Staked: {} ({})", pretty_coin(&res), res); }); println!(); diff --git a/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs b/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs index 515c9beaf3..e69a2eef55 100644 --- a/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs +++ b/common/cosmwasm-smart-contracts/vesting-contract/src/messages.rs @@ -221,12 +221,25 @@ pub enum QueryMsg { GetOriginalVesting { vesting_account_address: String, }, - GetDelegatedFree { - block_time: Option, + GetHistoricalVestingStakingReward { vesting_account_address: String, }, - GetDelegatedVesting { - block_time: Option, + GetSpendableVestedCoins { + vesting_account_address: String, + }, + GetSpendableRewardCoins { + vesting_account_address: String, + }, + GetDelegatedCoins { + vesting_account_address: String, + }, + GetPledgedCoins { + vesting_account_address: String, + }, + GetStakedCoins { + vesting_account_address: String, + }, + GetWithdrawnCoins { vesting_account_address: String, }, GetAccount { diff --git a/contracts/vesting/Cargo.toml b/contracts/vesting/Cargo.toml index d9d9120a45..ac414c1c18 100644 --- a/contracts/vesting/Cargo.toml +++ b/contracts/vesting/Cargo.toml @@ -26,5 +26,11 @@ schemars = "0.8" serde = { version = "1.0", default-features = false, features = ["derive"] } thiserror = { version = "1.0" } +[dev-dependencies] +rand_chacha = "0.3.1" +base64 = "0.21.0" +hex = "0.4.3" +serde_json = "1.0.66" + [build-dependencies] vergen = { version = "5", default-features = false, features = ["build", "git", "rustc"] } diff --git a/contracts/vesting/src/contract.rs b/contracts/vesting/src/contract.rs index cde9415bd2..25e41ea5c2 100644 --- a/contracts/vesting/src/contract.rs +++ b/contracts/vesting/src/contract.rs @@ -533,7 +533,7 @@ fn try_undelegate_from_mixnode( /// Creates a new periodic vesting account, and deposits funds to vest into the contract. /// /// Callable by ADMIN only, see [instantiate]. -fn try_create_periodic_vesting_account( +pub(crate) fn try_create_periodic_vesting_account( owner_address: &str, staking_address: Option, vesting_spec: Option, @@ -660,24 +660,38 @@ pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result to_binary(&try_get_original_vesting(&vesting_account_address, deps)?), - QueryMsg::GetDelegatedFree { - block_time, + QueryMsg::GetHistoricalVestingStakingReward { vesting_account_address, - } => to_binary(&try_get_delegated_free( - block_time, + } => to_binary(&try_get_historical_vesting_staking_reward( &vesting_account_address, - env, deps, )?), - QueryMsg::GetDelegatedVesting { - block_time, + QueryMsg::GetSpendableVestedCoins { vesting_account_address, - } => to_binary(&try_get_delegated_vesting( - block_time, + } => to_binary(&try_get_spendable_vested_coins( &vesting_account_address, - env, deps, + env, )?), + QueryMsg::GetSpendableRewardCoins { + vesting_account_address, + } => to_binary(&try_get_spendable_reward_coins( + &vesting_account_address, + deps, + env, + )?), + QueryMsg::GetDelegatedCoins { + vesting_account_address, + } => to_binary(&try_get_delegated_coins(&vesting_account_address, deps)?), + QueryMsg::GetPledgedCoins { + vesting_account_address, + } => to_binary(&try_get_pledged_coins(&vesting_account_address, deps)?), + QueryMsg::GetStakedCoins { + vesting_account_address, + } => to_binary(&try_get_staked_coins(&vesting_account_address, deps)?), + QueryMsg::GetWithdrawnCoins { + vesting_account_address, + } => to_binary(&try_get_withdrawn_coins(&vesting_account_address, deps)?), QueryMsg::GetAccount { address } => to_binary(&try_get_account(&address, deps)?), QueryMsg::GetMixnode { address } => to_binary(&try_get_mixnode(&address, deps)?), QueryMsg::GetGateway { address } => to_binary(&try_get_gateway(&address, deps)?), @@ -873,26 +887,70 @@ pub fn try_get_original_vesting( account.get_original_vesting() } -/// See [crate::traits::VestingAccount::get_delegated_free] -pub fn try_get_delegated_free( - block_time: Option, +pub fn try_get_historical_vesting_staking_reward( vesting_account_address: &str, - env: Env, deps: Deps<'_>, ) -> Result { let account = account_from_address(vesting_account_address, deps.storage, deps.api)?; - account.get_delegated_free(block_time, &env, deps.storage) + account.get_historical_vested_staking_rewards(deps.storage) } -/// See [crate::traits::VestingAccount::get_delegated_vesting] -pub fn try_get_delegated_vesting( - block_time: Option, +pub fn try_get_spendable_vested_coins( vesting_account_address: &str, + deps: Deps<'_>, env: Env, +) -> Result { + let account = account_from_address(vesting_account_address, deps.storage, deps.api)?; + account.spendable_vested_coins(None, &env, deps.storage) +} + +pub fn try_get_spendable_reward_coins( + vesting_account_address: &str, + deps: Deps<'_>, + env: Env, +) -> Result { + let account = account_from_address(vesting_account_address, deps.storage, deps.api)?; + account.spendable_reward_coins(None, &env, deps.storage) +} + +pub fn try_get_delegated_coins( + vesting_account_address: &str, deps: Deps<'_>, ) -> Result { let account = account_from_address(vesting_account_address, deps.storage, deps.api)?; - account.get_delegated_vesting(block_time, &env, deps.storage) + let denom = MIX_DENOM.load(deps.storage)?; + let amount = account.total_delegations(deps.storage)?; + Ok(Coin { denom, amount }) +} + +pub fn try_get_pledged_coins( + vesting_account_address: &str, + deps: Deps<'_>, +) -> Result { + let account = account_from_address(vesting_account_address, deps.storage, deps.api)?; + let denom = MIX_DENOM.load(deps.storage)?; + let amount = account.total_pledged(deps.storage)?; + Ok(Coin { denom, amount }) +} + +pub fn try_get_staked_coins( + vesting_account_address: &str, + deps: Deps<'_>, +) -> Result { + let account = account_from_address(vesting_account_address, deps.storage, deps.api)?; + let denom = MIX_DENOM.load(deps.storage)?; + let amount = account.total_staked(deps.storage)?; + Ok(Coin { denom, amount }) +} + +pub fn try_get_withdrawn_coins( + vesting_account_address: &str, + deps: Deps<'_>, +) -> Result { + let account = account_from_address(vesting_account_address, deps.storage, deps.api)?; + let denom = MIX_DENOM.load(deps.storage)?; + let amount = account.load_withdrawn(deps.storage)?; + Ok(Coin { denom, amount }) } /// Returns timestamps at which delegations were made diff --git a/contracts/vesting/src/errors.rs b/contracts/vesting/src/errors.rs index 822d30b1b5..7fc596f6e4 100644 --- a/contracts/vesting/src/errors.rs +++ b/contracts/vesting/src/errors.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{Addr, StdError, Uint128}; +use cosmwasm_std::{Addr, OverflowError, StdError, Uint128}; use mixnet_contract_common::MixId; use thiserror::Error; @@ -7,6 +7,9 @@ pub enum ContractError { #[error("VESTING ({}): {0}", line!())] Std(#[from] StdError), + #[error("VESTING: {0}")] + OverflowError(#[from] OverflowError), + #[error("VESTING ({}): Account does not exist - {0}", line!())] NoAccountForAddress(String), diff --git a/contracts/vesting/src/support/tests.rs b/contracts/vesting/src/support/tests.rs index 8f24359f52..831b071663 100644 --- a/contracts/vesting/src/support/tests.rs +++ b/contracts/vesting/src/support/tests.rs @@ -1,14 +1,320 @@ #[cfg(test)] pub mod helpers { - use crate::contract::instantiate; + + // TODO: once https://github.com/nymtech/nym/pull/3040 gets merged, + // the `ContractState` should replace the below + #[allow(unused)] + mod state_dump_decoder { + use base64::{engine::general_purpose, Engine}; + use serde::{Deserialize, Serialize}; + use std::fs::File; + use std::path::Path; + + #[derive(Serialize, Deserialize, Debug)] + pub struct RawState { + pub height: String, + pub result: Vec, + } + + impl RawState { + pub fn decode(self) -> DecodedState { + DecodedState { + height: self.height.parse().unwrap(), + result: self + .result + .into_iter() + .map(|raw| DecodedKV { + key: hex::decode(&raw.key).unwrap(), + value: general_purpose::STANDARD.decode(&raw.value).unwrap(), + }) + .collect(), + } + } + + pub fn from_file>(path: P) -> Self { + let file = File::open(path).expect("failed to open specified file"); + serde_json::from_reader(file).expect("failed to parse specified file") + } + } + + #[derive(Serialize, Deserialize, Debug)] + pub struct RawKV { + // hex + pub key: String, + + // base64 + pub value: String, + } + + #[derive(Serialize, Deserialize, Debug)] + pub struct DecodedKV { + pub key: Vec, + pub value: Vec, + } + + #[derive(Serialize, Deserialize, Debug)] + pub struct DecodedState { + pub height: u64, + pub result: Vec, + } + + impl DecodedState { + pub fn find_value(&self, key: &[u8]) -> Option> { + self.result + .iter() + .find(|kv| kv.key == key) + .map(|kv| kv.value.clone()) + } + } + } + + use crate::contract::{instantiate, try_create_periodic_vesting_account}; + use crate::storage::{ACCOUNTS, ADMIN, MIXNET_CONTRACT_ADDRESS, MIX_DENOM}; + use crate::support::tests::helpers::state_dump_decoder::RawState; + use crate::traits::VestingAccount; use crate::vesting::{populate_vesting_periods, Account}; use contracts_common::Percent; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier}; - use cosmwasm_std::{Addr, Coin, Empty, Env, MemoryStorage, OwnedDeps, Storage, Uint128}; + use cosmwasm_std::{ + coin, Addr, BlockInfo, Coin, ContractInfo, Deps, DepsMut, Empty, Env, MemoryStorage, + MessageInfo, OwnedDeps, Storage, Timestamp, Uint128, + }; + use rand_chacha::rand_core::SeedableRng; + use rand_chacha::ChaCha20Rng; + use std::path::Path; use std::str::FromStr; use vesting_contract_common::messages::{InitMsg, VestingSpecification}; use vesting_contract_common::PledgeCap; + // use rng with constant seed for all tests so that they would be deterministic + #[allow(unused)] + pub fn test_rng() -> ChaCha20Rng { + let dummy_seed = [42u8; 32]; + rand_chacha::ChaCha20Rng::from_seed(dummy_seed) + } + + #[allow(unused)] + pub struct TestSetup { + pub deps: OwnedDeps>, + pub env: Env, + pub rng: ChaCha20Rng, + + pub admin: MessageInfo, + } + + #[allow(unused)] + impl TestSetup { + pub fn new() -> Self { + let deps = init_contract(); + let admin = ADMIN.load(deps.as_ref().storage).unwrap(); + + TestSetup { + deps, + env: mock_env(), + rng: test_rng(), + admin: mock_info(admin.as_str(), &[]), + } + } + + pub fn new_from_state_dump>(dump_file: P) -> Self { + let state = RawState::from_file(dump_file).decode(); + + let mut deps = mock_dependencies(); + for kv in state.result { + deps.storage.set(&kv.key, &kv.value) + } + + let admin = ADMIN.load(deps.as_ref().storage).unwrap(); + let env = Env { + block: BlockInfo { + height: 5633424, + time: Timestamp::from_seconds(1676025955), + chain_id: "nyx".to_string(), + }, + transaction: None, + contract: ContractInfo { + address: Addr::unchecked( + "n1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrq73f2nw", + ), + }, + }; + + TestSetup { + deps, + env, + rng: test_rng(), + admin: mock_info(admin.as_str(), &[]), + } + } + + pub fn create_vesting_account( + &mut self, + owner: &str, + spec: Option, + amount: u128, + ) -> Account { + let mut sender = self.admin(); + sender.funds = vec![self.coin(amount)]; + let env = self.env(); + try_create_periodic_vesting_account( + owner, + None, + spec, + Some(PledgeCap::Percent( + Percent::from_percentage_value(100).unwrap(), + )), + sender, + env, + self.deps_mut(), + ) + .unwrap(); + + self.unchecked_account(Addr::unchecked(owner)) + } + + pub fn deps(&self) -> Deps<'_> { + self.deps.as_ref() + } + + pub fn deps_mut(&mut self) -> DepsMut<'_> { + self.deps.as_mut() + } + + pub fn env(&self) -> Env { + self.env.clone() + } + + pub fn admin(&self) -> MessageInfo { + self.admin.clone() + } + + pub fn mixnet_contract(&self) -> Addr { + MIXNET_CONTRACT_ADDRESS.load(self.deps().storage).unwrap() + } + + pub fn coin(&self, amount: u128) -> Coin { + let denom = MIX_DENOM.load(self.deps().storage).unwrap(); + coin(amount, denom) + } + + pub fn unchecked_account(&self, address: Addr) -> Account { + ACCOUNTS.load(self.deps().storage, address).unwrap() + } + + pub fn print_account_coins(&self, account: &Account) { + let original = self.original_vesting(account); + let balance = self.balance(account); + let withdrawn = self.withdrawn(account); + let vesting = self.vesting_coins(account); + let vested = self.vested_coins(account); + + let locked = self.locked_coins(account); + let spendable = self.spendable_coins(account); + let spendable_vested = self.spendable_vested_coins(account); + let spendable_reward = self.spendable_reward_coins(account); + + assert_eq!( + spendable.amount, + spendable_vested.amount + spendable_reward.amount + ); + + let total_delegated = self.delegated_total(account); + let historical_rewards = self.historical_staking_rewards(account); + + let pretty = format!( + r#" +{:<20}{original} +{:<20}{vesting} +{:<20}{vested} +{:<20}{balance} +{:<20}{withdrawn} +{:<20}{historical_rewards} +{:<20}{locked} +{:<20}{spendable} +{:<20}{spendable_vested} +{:<20}{spendable_reward} +{:<20}{total_delegated} +"#, + "original", + "vesting", + "vested:", + "balance", + "withdrawn", + "historical rewards", + "locked", + "spendable", + "spendable vested", + "spendable reward", + "total delegated", + ); + + println!("{pretty}") + } + + pub fn original_vesting(&self, account: &Account) -> Coin { + account.get_original_vesting().unwrap().amount() + } + + pub fn balance(&self, account: &Account) -> Coin { + self.coin(account.load_balance(self.deps().storage).unwrap().u128()) + } + + pub fn withdrawn(&self, account: &Account) -> Coin { + self.coin(account.load_withdrawn(self.deps().storage).unwrap().u128()) + } + + pub fn vesting_coins(&self, account: &Account) -> Coin { + account + .get_vesting_coins(None, &self.env, self.deps().storage) + .unwrap() + } + + pub fn vested_coins(&self, account: &Account) -> Coin { + account + .get_vested_coins(None, &self.env, self.deps().storage) + .unwrap() + } + + pub fn locked_coins(&self, account: &Account) -> Coin { + account + .locked_coins(None, &self.env, self.deps().storage) + .unwrap() + } + + pub fn spendable_coins(&self, account: &Account) -> Coin { + account + .spendable_coins(None, &self.env, self.deps().storage) + .unwrap() + } + + pub fn spendable_vested_coins(&self, account: &Account) -> Coin { + account + .spendable_vested_coins(None, &self.env, self.deps().storage) + .unwrap() + } + + pub fn spendable_reward_coins(&self, account: &Account) -> Coin { + account + .spendable_reward_coins(None, &self.env, self.deps().storage) + .unwrap() + } + + pub fn delegated_total(&self, account: &Account) -> Coin { + self.coin( + account + .total_delegations(self.deps().storage) + .unwrap() + .u128(), + ) + } + + pub fn historical_staking_rewards(&self, account: &Account) -> Coin { + account + .get_historical_vested_staking_rewards(self.deps().storage) + .unwrap() + } + } + pub const TEST_COIN_DENOM: &str = "unym"; pub fn init_contract() -> OwnedDeps> { @@ -20,7 +326,7 @@ pub mod helpers { let env = mock_env(); let info = mock_info("admin", &[]); instantiate(deps.as_mut(), env.clone(), info, msg).unwrap(); - return deps; + deps } pub fn vesting_account_mid_fixture(storage: &mut dyn Storage, env: &Env) -> Account { diff --git a/contracts/vesting/src/traits/vesting_account.rs b/contracts/vesting/src/traits/vesting_account.rs index 52af7d426c..258a750492 100644 --- a/contracts/vesting/src/traits/vesting_account.rs +++ b/contracts/vesting/src/traits/vesting_account.rs @@ -3,11 +3,7 @@ use cosmwasm_std::{Addr, Coin, Env, Storage, Timestamp, Uint128}; use vesting_contract_common::OriginalVestingResponse; pub trait VestingAccount { - fn total_pledged_locked( - &self, - storage: &dyn Storage, - env: &Env, - ) -> Result; + fn total_staked(&self, storage: &dyn Storage) -> Result; /// Returns the set of coins that are not spendable (can still be delegated tough) (i.e. locked), /// defined as vesting coins that are not delegated or pledged. @@ -32,6 +28,20 @@ pub trait VestingAccount { storage: &dyn Storage, ) -> Result; + fn spendable_vested_coins( + &self, + block_time: Option, + env: &Env, + storage: &dyn Storage, + ) -> Result; + + fn spendable_reward_coins( + &self, + block_time: Option, + env: &Env, + storage: &dyn Storage, + ) -> Result; + /// See [/vesting-contract/struct.Account.html/method.get_vested_coins] for impl fn get_vested_coins( &self, @@ -57,36 +67,6 @@ pub trait VestingAccount { /// See [/vesting-contract/struct.Account.html/method.get_original_vesting] for impl fn get_original_vesting(&self) -> Result; - /// See [/vesting-contract/struct.Account.html/method.get_delegated_free] for impl - fn get_delegated_free( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result; - - /// See [/vesting-contract/struct.Account.html/method.get_delegated_vesting] for impl - fn get_delegated_vesting( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result; - - /// See [/vesting-contract/struct.Account.html/method.get_pledged_free] for impl - fn get_pledged_free( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result; - /// See [/vesting-contract/struct.Account.html/method.get_pledged_vesting] for impl - fn get_pledged_vesting( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result; /// See [/vesting-contract/struct.Account.html/method.transfer_ownership] for impl fn transfer_ownership( &mut self, @@ -100,4 +80,8 @@ pub trait VestingAccount { storage: &mut dyn Storage, ) -> Result<(), ContractError>; fn track_reward(&self, amount: Coin, storage: &mut dyn Storage) -> Result<(), ContractError>; + fn get_historical_vested_staking_rewards( + &self, + storage: &dyn Storage, + ) -> Result; } diff --git a/contracts/vesting/src/vesting/account/delegating_account.rs b/contracts/vesting/src/vesting/account/delegating_account.rs index 62fa42b21e..23c932ef85 100644 --- a/contracts/vesting/src/vesting/account/delegating_account.rs +++ b/contracts/vesting/src/vesting/account/delegating_account.rs @@ -2,7 +2,6 @@ use crate::errors::ContractError; use crate::storage::save_delegation; use crate::storage::MIXNET_CONTRACT_ADDRESS; use crate::traits::DelegatingAccount; -use crate::traits::VestingAccount; use cosmwasm_std::{wasm_execute, Coin, Env, Response, Storage, Uint128}; use mixnet_contract_common::ExecuteMsg as MixnetExecuteMsg; use mixnet_contract_common::MixId; @@ -36,24 +35,7 @@ impl DelegatingAccount for Account { env: &Env, storage: &mut dyn Storage, ) -> Result { - let current_balance = self.load_balance(storage)?; - let total_pledged_locked = self.total_pledged_locked(storage, env)?; - let total_pledged_after = total_pledged_locked + coin.amount; - let locked_pledge_cap = self.absolute_pledge_cap()?; - - if locked_pledge_cap < total_pledged_after { - return Err(ContractError::LockedPledgeCapReached { - current: total_pledged_after, - cap: locked_pledge_cap, - }); - } - - if current_balance < coin.amount { - return Err(ContractError::InsufficientBalance( - self.owner_address().as_str().to_string(), - current_balance.u128(), - )); - } + let current_balance = self.ensure_valid_additional_stake(&coin, storage)?; let msg = MixnetExecuteMsg::DelegateToMixnodeOnBehalf { mix_id, diff --git a/contracts/vesting/src/vesting/account/gateway_bonding_account.rs b/contracts/vesting/src/vesting/account/gateway_bonding_account.rs index 91cdd41c68..6669593871 100644 --- a/contracts/vesting/src/vesting/account/gateway_bonding_account.rs +++ b/contracts/vesting/src/vesting/account/gateway_bonding_account.rs @@ -2,7 +2,6 @@ use super::PledgeData; use crate::errors::ContractError; use crate::storage::MIXNET_CONTRACT_ADDRESS; use crate::traits::GatewayBondingAccount; -use crate::traits::VestingAccount; use cosmwasm_std::{wasm_execute, Coin, Env, Response, Storage, Uint128}; use mixnet_contract_common::{ExecuteMsg as MixnetExecuteMsg, Gateway}; use vesting_contract_common::events::{ @@ -20,24 +19,7 @@ impl GatewayBondingAccount for Account { env: &Env, storage: &mut dyn Storage, ) -> Result { - let current_balance = self.load_balance(storage)?; - let total_pledged_locked = self.total_pledged_locked(storage, env)?; - let total_pledged_after = total_pledged_locked + pledge.amount; - let locked_pledge_cap = self.absolute_pledge_cap()?; - - if locked_pledge_cap < total_pledged_after { - return Err(ContractError::LockedPledgeCapReached { - current: total_pledged_after, - cap: locked_pledge_cap, - }); - } - - if current_balance < pledge.amount { - return Err(ContractError::InsufficientBalance( - self.owner_address().as_str().to_string(), - current_balance.u128(), - )); - } + let current_balance = self.ensure_valid_additional_stake(&pledge, storage)?; let pledge_data = if self.load_gateway_pledge(storage)?.is_some() { return Err(ContractError::AlreadyBonded( diff --git a/contracts/vesting/src/vesting/account/mixnode_bonding_account.rs b/contracts/vesting/src/vesting/account/mixnode_bonding_account.rs index 74917a16c7..93bfb8840c 100644 --- a/contracts/vesting/src/vesting/account/mixnode_bonding_account.rs +++ b/contracts/vesting/src/vesting/account/mixnode_bonding_account.rs @@ -5,7 +5,6 @@ use super::Account; use crate::errors::ContractError; use crate::storage::MIXNET_CONTRACT_ADDRESS; use crate::traits::MixnodeBondingAccount; -use crate::traits::VestingAccount; use cosmwasm_std::{wasm_execute, Coin, Env, Response, Storage, Uint128}; use mixnet_contract_common::mixnode::MixNodeConfigUpdate; use mixnet_contract_common::mixnode::MixNodeCostParams; @@ -38,24 +37,7 @@ impl MixnodeBondingAccount for Account { env: &Env, storage: &mut dyn Storage, ) -> Result { - let current_balance = self.load_balance(storage)?; - let total_pledged_locked = self.total_pledged_locked(storage, env)?; - let total_pledged_after = total_pledged_locked + pledge.amount; - let locked_pledge_cap = self.absolute_pledge_cap()?; - - if locked_pledge_cap < total_pledged_after { - return Err(ContractError::LockedPledgeCapReached { - current: total_pledged_after, - cap: locked_pledge_cap, - }); - } - - if current_balance < pledge.amount { - return Err(ContractError::InsufficientBalance( - self.owner_address().as_str().to_string(), - current_balance.u128(), - )); - } + let current_balance = self.ensure_valid_additional_stake(&pledge, storage)?; let pledge_data = if self.load_mixnode_pledge(storage)?.is_some() { return Err(ContractError::AlreadyBonded( @@ -91,24 +73,7 @@ impl MixnodeBondingAccount for Account { env: &Env, storage: &mut dyn Storage, ) -> Result { - let current_balance = self.load_balance(storage)?; - let total_pledged_after = - self.total_pledged_locked(storage, env)? + additional_pledge.amount; - let locked_pledge_cap = self.absolute_pledge_cap()?; - - if locked_pledge_cap < total_pledged_after { - return Err(ContractError::LockedPledgeCapReached { - current: total_pledged_after, - cap: locked_pledge_cap, - }); - } - - if current_balance < additional_pledge.amount { - return Err(ContractError::InsufficientBalance( - self.owner_address().as_str().to_string(), - current_balance.u128(), - )); - } + let current_balance = self.ensure_valid_additional_stake(&additional_pledge, storage)?; let mut pledge_data = if let Some(pledge_data) = self.load_mixnode_pledge(storage)? { pledge_data diff --git a/contracts/vesting/src/vesting/account/mod.rs b/contracts/vesting/src/vesting/account/mod.rs index 7ba2ec0251..1df8c056c6 100644 --- a/contracts/vesting/src/vesting/account/mod.rs +++ b/contracts/vesting/src/vesting/account/mod.rs @@ -63,6 +63,36 @@ impl Account { Ok(account) } + /// Checks whether the additional stake would be within the cap associated with the account + /// and whether the account has enough tokens for staking. + /// Returns the value of the current balance of the account. + pub fn ensure_valid_additional_stake( + &self, + additional_stake: &Coin, + storage: &dyn Storage, + ) -> Result { + let current_balance = self.load_balance(storage)?; + let current_total_staked = self.total_staked(storage)?; + let total_staked_after = current_total_staked + additional_stake.amount; + let locked_pledge_cap = self.absolute_pledge_cap()?; + + if locked_pledge_cap < total_staked_after { + return Err(ContractError::LockedPledgeCapReached { + current: total_staked_after, + cap: locked_pledge_cap, + }); + } + + if current_balance < additional_stake.amount { + return Err(ContractError::InsufficientBalance( + self.owner_address().as_str().to_string(), + current_balance.u128(), + )); + } + + Ok(current_balance) + } + pub fn pledge_cap(&self) -> PledgeCap { self.pledge_cap.clone().unwrap_or_default() } @@ -293,6 +323,9 @@ impl Account { .fold(Uint128::zero(), |acc, (_key, val)| acc + val)) } + // TODO: this should get reworked... somehow... (maybe with a memoized value?) + // as it's an unbounded iteration that could fail if an account has made a lot of delegations + // (I guess in order of thousands) pub fn total_delegations(&self, storage: &dyn Storage) -> Result { Ok(DELEGATIONS .sub_prefix(self.storage_key()) @@ -301,6 +334,18 @@ impl Account { .fold(Uint128::zero(), |acc, (_key, val)| acc + val)) } + pub fn total_pledged(&self, storage: &dyn Storage) -> Result { + let amount = if let Some(bond) = self + .load_mixnode_pledge(storage)? + .or(self.load_gateway_pledge(storage)?) + { + bond.amount().amount + } else { + Uint128::zero() + }; + Ok(amount) + } + pub fn total_delegations_at_timestamp( &self, storage: &dyn Storage, diff --git a/contracts/vesting/src/vesting/account/vesting_account.rs b/contracts/vesting/src/vesting/account/vesting_account.rs index e015fd1352..cb17766013 100644 --- a/contracts/vesting/src/vesting/account/vesting_account.rs +++ b/contracts/vesting/src/vesting/account/vesting_account.rs @@ -2,44 +2,32 @@ use crate::errors::ContractError; use crate::storage::{delete_account, save_account, MIX_DENOM}; use crate::traits::VestingAccount; use cosmwasm_std::{Addr, Coin, Env, Storage, Timestamp, Uint128}; +use std::cmp::min; use vesting_contract_common::{OriginalVestingResponse, Period}; use super::Account; impl VestingAccount for Account { - fn total_pledged_locked( - &self, - storage: &dyn Storage, - env: &Env, - ) -> Result { - Ok(self.get_delegated_vesting(None, env, storage)?.amount - + self.get_pledged_vesting(None, env, storage)?.amount) + fn total_staked(&self, storage: &dyn Storage) -> Result { + Ok(self.total_delegations(storage)? + self.total_pledged(storage)?) } /// See [VestingAccount::locked_coins] for documentation. /// Returns 0 in case of underflow. Which is fine, as the amount of pledged and delegated tokens can be larger then vesting_coins due to rewards and vesting periods expiring + + // TODO: rename. it's no longer 'locked'... or is it? fn locked_coins( &self, block_time: Option, env: &Env, storage: &dyn Storage, ) -> Result { + let still_vesting = self.get_vesting_coins(block_time, env, storage)?.amount; + let staked = self.total_staked(storage)?; + let locked_amount = still_vesting.saturating_sub(staked); + Ok(Coin { - amount: Uint128::new( - self.get_vesting_coins(block_time, env, storage)? - .amount - .u128() - .saturating_sub( - self.get_delegated_vesting(block_time, env, storage)? - .amount - .u128(), - ) - .saturating_sub( - self.get_pledged_vesting(block_time, env, storage)? - .amount - .u128(), - ), - ), + amount: locked_amount, denom: MIX_DENOM.load(storage)?, }) } @@ -51,15 +39,54 @@ impl VestingAccount for Account { storage: &dyn Storage, ) -> Result { Ok(Coin { - amount: Uint128::new( - self.load_balance(storage)? - .u128() - .saturating_sub(self.locked_coins(block_time, env, storage)?.amount.u128()), - ), + amount: self + .load_balance(storage)? + .saturating_sub(self.locked_coins(block_time, env, storage)?.amount), denom: MIX_DENOM.load(storage)?, }) } + fn spendable_vested_coins( + &self, + block_time: Option, + env: &Env, + storage: &dyn Storage, + ) -> Result { + let vested = self.get_vested_coins(block_time, env, storage)?; + let withdrawn = self.load_withdrawn(storage)?; + + let not_withdrawn_vested = vested.amount.saturating_sub(withdrawn); + if not_withdrawn_vested == Uint128::zero() { + return Ok(Coin { + denom: vested.denom, + amount: Uint128::zero(), + }); + } + let spendable = self.spendable_coins(block_time, env, storage)?; + + Ok(Coin { + denom: spendable.denom, + // TODO: actually, is it even possible for spendable > not_withdrawn_vested? + amount: min(spendable.amount, not_withdrawn_vested), + }) + } + + fn spendable_reward_coins( + &self, + block_time: Option, + env: &Env, + storage: &dyn Storage, + ) -> Result { + let spendable = self.spendable_coins(block_time, env, storage)?; + let spendable_vested = self.spendable_vested_coins(block_time, env, storage)?; + + Ok(Coin { + denom: spendable.denom, + // don't use saturating subs as those should never fail, thus return an error + amount: spendable.amount.checked_sub(spendable_vested.amount)?, + }) + } + fn get_vested_coins( &self, block_time: Option, @@ -116,118 +143,6 @@ impl VestingAccount for Account { )) } - fn get_delegated_free( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result { - let block_time = block_time.unwrap_or(env.block.time); - let period = self.get_current_vesting_period(block_time)?; - let withdrawn = self.load_withdrawn(storage)?; - let max_available = self - .get_vested_coins(Some(block_time), env, storage)? - .amount - .saturating_sub(withdrawn); - let start_time = match period { - Period::Before => 0, - Period::After => u64::MAX, - Period::In(idx) => self.periods[idx].start_time, - }; - - let coin = self.total_delegations_at_timestamp(storage, start_time)?; - - let amount = Uint128::new(coin.u128().min(max_available.u128())); - - Ok(Coin { - amount, - denom: MIX_DENOM.load(storage)?, - }) - } - - // TODO: why do we allow querying for block times in the past? - just use env.block.time all the time - fn get_delegated_vesting( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result { - let block_time = block_time.unwrap_or(env.block.time); - let delegated_free = self.get_delegated_free(Some(block_time), env, storage)?; - - let delegations_before_start_time = - self.total_delegations_at_timestamp(storage, block_time.seconds())?; - - let amount = delegations_before_start_time - delegated_free.amount; - - Ok(Coin { - amount, - denom: MIX_DENOM.load(storage)?, - }) - } - - fn get_pledged_free( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result { - let block_time = block_time.unwrap_or(env.block.time); - let period = self.get_current_vesting_period(block_time)?; - let max_vested = self.get_vested_coins(Some(block_time), env, storage)?; - let start_time = match period { - Period::Before => 0, - Period::After => u64::MAX, - Period::In(idx) => self.periods[idx].start_time, - }; - - let amount = if let Some(bond) = self - .load_mixnode_pledge(storage)? - .or(self.load_gateway_pledge(storage)?) - { - if bond.block_time().seconds() < start_time { - bond.amount().amount - } else { - Uint128::zero() - } - } else { - Uint128::zero() - }; - - let amount = Uint128::new(amount.u128().min(max_vested.amount.u128())); - - Ok(Coin { - amount, - denom: MIX_DENOM.load(storage)?, - }) - } - - fn get_pledged_vesting( - &self, - block_time: Option, - env: &Env, - storage: &dyn Storage, - ) -> Result { - let block_time = block_time.unwrap_or(env.block.time); - let bonded_free = self.get_pledged_free(Some(block_time), env, storage)?; - - if let Some(bond) = self - .load_mixnode_pledge(storage)? - .or(self.load_gateway_pledge(storage)?) - { - let amount = bond.amount().amount - bonded_free.amount; - Ok(Coin { - amount, - denom: MIX_DENOM.load(storage)?, - }) - } else { - Ok(Coin { - amount: Uint128::zero(), - denom: MIX_DENOM.load(storage)?, - }) - } - } - fn transfer_ownership( &mut self, to_address: &Addr, @@ -258,4 +173,28 @@ impl VestingAccount for Account { self.save_balance(new_balance, storage)?; Ok(()) } + + // balance consists of: + // - original vesting amount + // - minus what you have staked + // - minus what you have withdrawn + // - plus whatever reward you have claimed + // thus rewards = (balance + withdrawn + staked) - original vesting + fn get_historical_vested_staking_rewards( + &self, + storage: &dyn Storage, + ) -> Result { + let balance = self.load_balance(storage)?; + let withdrawn = self.load_withdrawn(storage)?; + let staked = self.total_staked(storage)?; + let original = &self.coin; + let total = balance + withdrawn + staked; + + let rewards = Coin { + denom: original.denom.clone(), + amount: total.checked_sub(original.amount)?, + }; + + Ok(rewards) + } } diff --git a/contracts/vesting/src/vesting/mod.rs b/contracts/vesting/src/vesting/mod.rs index e2c57a4bc0..68a01b6a46 100644 --- a/contracts/vesting/src/vesting/mod.rs +++ b/contracts/vesting/src/vesting/mod.rs @@ -46,12 +46,11 @@ mod tests { use crate::traits::DelegatingAccount; use crate::traits::VestingAccount; use crate::traits::{GatewayBondingAccount, MixnodeBondingAccount}; - use crate::vesting::{populate_vesting_periods, Account}; use cosmwasm_std::testing::{mock_env, mock_info}; - use cosmwasm_std::{coin, coins, Addr, Coin, MessageInfo, Timestamp, Uint128}; + use cosmwasm_std::{coin, coins, Addr, Coin, Timestamp, Uint128}; use mixnet_contract_common::mixnode::MixNodeCostParams; use mixnet_contract_common::{Gateway, MixNode, Percent}; - use vesting_contract_common::messages::{ExecuteMsg, VestingSpecification}; + use vesting_contract_common::messages::ExecuteMsg; use vesting_contract_common::Period; use vesting_contract_common::PledgeCap; @@ -461,13 +460,11 @@ mod tests { let vesting_coins = account .get_vesting_coins(None, &env, &deps.storage) .unwrap(); - let locked_coins = account.locked_coins(None, &env, &mut deps.storage).unwrap(); + let locked_coins = account.locked_coins(None, &env, &deps.storage).unwrap(); assert_eq!(vested_coins.amount, Uint128::new(250_000_000_000)); assert_eq!(vesting_coins.amount, Uint128::new(750_000_000_000)); assert_eq!(locked_coins.amount, Uint128::new(750_000_000_000)); - let spendable = account - .spendable_coins(None, &env, &mut deps.storage) - .unwrap(); + let spendable = account.spendable_coins(None, &env, &deps.storage).unwrap(); assert_eq!(spendable.amount, Uint128::new(250_000_000_000)); let withdrawn = account.load_withdrawn(&deps.storage).unwrap(); assert_eq!(withdrawn, Uint128::zero()); @@ -490,40 +487,24 @@ mod tests { assert_eq!(vested_coins.amount, Uint128::new(250_000_000_000)); assert_eq!(vesting_coins.amount, Uint128::new(750_000_000_000)); - let delegated_free = account - .get_delegated_free(None, &env, &mut deps.storage) - .unwrap(); - let delegated_vesting = account - .get_delegated_vesting(None, &env, &mut deps.storage) - .unwrap(); + let delegated = account.total_delegations(&deps.storage).unwrap(); + assert_eq!(delegated, Uint128::new(90_000_000_000)); - assert_eq!(delegated_free.amount, Uint128::new(90_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::zero()); + let locked_coins = account.locked_coins(None, &env, &deps.storage).unwrap(); + // vesting - delegated + assert_eq!(locked_coins.amount, Uint128::new(660_000_000_000)); + let spendable = account.spendable_coins(None, &env, &deps.storage).unwrap(); + assert_eq!(spendable.amount, Uint128::new(250_000_000_000)); - let locked_coins = account.locked_coins(None, &env, &mut deps.storage).unwrap(); - // vesting - delegated_vesting - pledged_vesting - assert_eq!(locked_coins.amount, Uint128::new(750_000_000_000)); - let spendable = account - .spendable_coins(None, &env, &mut deps.storage) - .unwrap(); - assert_eq!(spendable.amount, Uint128::new(160_000_000_000)); - - let ok = account.try_undelegate_from_mixnode(mix_id, &mut deps.storage); + let ok = account.try_undelegate_from_mixnode(mix_id, &deps.storage); assert!(ok.is_ok()); account .track_undelegation(mix_id, delegation.clone(), &mut deps.storage) .unwrap(); - let delegated_free = account - .get_delegated_free(None, &env, &mut deps.storage) - .unwrap(); - let delegated_vesting = account - .get_delegated_vesting(None, &env, &mut deps.storage) - .unwrap(); - - assert_eq!(delegated_free.amount, Uint128::zero()); - assert_eq!(delegated_vesting.amount, Uint128::zero()); + let delegated = account.total_delegations(&deps.storage).unwrap(); + assert_eq!(delegated, Uint128::zero()); assert_eq!( account.load_balance(&deps.storage).unwrap(), @@ -549,40 +530,29 @@ mod tests { let vesting_coins = account .get_vesting_coins(None, &env, &deps.storage) .unwrap(); - let locked_coins = account.locked_coins(None, &env, &mut deps.storage).unwrap(); + let locked_coins = account.locked_coins(None, &env, &deps.storage).unwrap(); assert_eq!(vested_coins.amount, Uint128::new(250_000_000_000)); assert_eq!(vesting_coins.amount, Uint128::new(750_000_000_000)); assert_eq!(locked_coins.amount, Uint128::new(750_000_000_000)); - let spendable = account - .spendable_coins(None, &env, &mut deps.storage) - .unwrap(); + let spendable = account.spendable_coins(None, &env, &deps.storage).unwrap(); assert_eq!(spendable.amount, Uint128::zero()); - let ok = - account.try_delegate_to_mixnode(mix_id, delegation.clone(), &env, &mut deps.storage); + let ok = account.try_delegate_to_mixnode(mix_id, delegation, &env, &mut deps.storage); assert!(ok.is_ok()); let vested_coins = account.get_vested_coins(None, &env, &deps.storage).unwrap(); let vesting_coins = account .get_vesting_coins(None, &env, &deps.storage) .unwrap(); - let locked_coins = account.locked_coins(None, &env, &mut deps.storage).unwrap(); + let locked_coins = account.locked_coins(None, &env, &deps.storage).unwrap(); assert_eq!(vested_coins.amount, Uint128::new(250_000_000_000)); assert_eq!(vesting_coins.amount, Uint128::new(750_000_000_000)); - let spendable = account - .spendable_coins(None, &env, &mut deps.storage) - .unwrap(); + let spendable = account.spendable_coins(None, &env, &deps.storage).unwrap(); assert_eq!(spendable.amount, Uint128::zero()); - let delegated_free = account - .get_delegated_free(None, &env, &mut deps.storage) - .unwrap(); - let delegated_vesting = account - .get_delegated_vesting(None, &env, &mut deps.storage) - .unwrap(); + let delegated = account.total_delegations(&deps.storage).unwrap(); - assert_eq!(delegated_free.amount, Uint128::zero()); - assert_eq!(delegated_vesting.amount, Uint128::new(90_000_000_000)); + assert_eq!(delegated, Uint128::new(90_000_000_000)); // vesting - delegated_vesting - pledged_vesting assert_eq!(locked_coins.amount, Uint128::new(660_000_000_000)); @@ -673,70 +643,6 @@ mod tests { let total_delegations = account.total_delegations_for_mix(1, &deps.storage).unwrap(); assert_eq!(Uint128::new(90_000_000_000), total_delegations); - - let account = load_account(Addr::unchecked("owner"), &deps.storage) - .unwrap() - .unwrap(); - - // Current period -> block_time: None - let delegated_free = account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - assert_eq!(Uint128::new(0), delegated_free.amount); - - let delegated_vesting = account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - assert_eq!( - account.total_delegations(&deps.storage).unwrap() - delegated_free.amount, - delegated_vesting.amount - ); - - // All periods - for (i, period) in account.periods().iter().enumerate() { - let delegated_free = account - .get_delegated_free( - Some(Timestamp::from_seconds(period.start_time + 1)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!( - (account.tokens_per_period().unwrap() * i as u128) - .min(account.total_delegations(&deps.storage).unwrap().u128()), - delegated_free.amount.u128() - ); - - let delegated_vesting = account - .get_delegated_vesting( - Some(Timestamp::from_seconds(period.start_time + 1)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!( - account.total_delegations(&deps.storage).unwrap() - delegated_free.amount, - delegated_vesting.amount - ); - } - - let delegated_free = account - .get_delegated_free( - Some(Timestamp::from_seconds(1764416964)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!(total_delegations, delegated_free.amount); - - let delegated_free = account - .get_delegated_vesting( - Some(Timestamp::from_seconds(1764416964)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!(Uint128::zero(), delegated_free.amount); } #[test] @@ -809,64 +715,6 @@ mod tests { let pledge = account.load_mixnode_pledge(&deps.storage).unwrap().unwrap(); assert_eq!(Uint128::new(90_000_000_000), pledge.amount().amount); - - // Current period -> block_time: None - let bonded_free = account.get_pledged_free(None, &env, &deps.storage).unwrap(); - assert_eq!(Uint128::new(0), bonded_free.amount); - - let bonded_vesting = account - .get_pledged_vesting(None, &env, &deps.storage) - .unwrap(); - assert_eq!( - pledge.amount().amount - bonded_free.amount, - bonded_vesting.amount - ); - - // All periods - for (i, period) in account.periods().iter().enumerate() { - let bonded_free = account - .get_pledged_free( - Some(Timestamp::from_seconds(period.start_time + 1)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!( - (account.tokens_per_period().unwrap() * i as u128) - .min(pledge.amount().amount.u128()), - bonded_free.amount.u128() - ); - - let bonded_vesting = account - .get_pledged_vesting( - Some(Timestamp::from_seconds(period.start_time + 1)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!( - pledge.amount().amount - bonded_free.amount, - bonded_vesting.amount - ); - } - - let bonded_free = account - .get_pledged_free( - Some(Timestamp::from_seconds(1764416964)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!(pledge.amount().amount, bonded_free.amount); - - let bonded_vesting = account - .get_pledged_vesting( - Some(Timestamp::from_seconds(1764416964)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!(Uint128::zero(), bonded_vesting.amount); } #[test] @@ -929,497 +777,5 @@ mod tests { let pledge = account.load_gateway_pledge(&deps.storage).unwrap().unwrap(); assert_eq!(Uint128::new(90_000_000_000), pledge.amount().amount); - - // Current period -> block_time: None - let bonded_free = account.get_pledged_free(None, &env, &deps.storage).unwrap(); - assert_eq!(Uint128::new(0), bonded_free.amount); - - let bonded_vesting = account - .get_pledged_vesting(None, &env, &deps.storage) - .unwrap(); - assert_eq!( - pledge.amount().amount - bonded_free.amount, - bonded_vesting.amount - ); - - // All periods - for (i, period) in account.periods().iter().enumerate() { - let bonded_free = account - .get_pledged_free( - Some(Timestamp::from_seconds(period.start_time + 1)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!( - (account.tokens_per_period().unwrap() * i as u128) - .min(pledge.amount().amount.u128()), - bonded_free.amount.u128() - ); - - let bonded_vesting = account - .get_pledged_vesting( - Some(Timestamp::from_seconds(period.start_time + 1)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!( - pledge.amount().amount - bonded_free.amount, - bonded_vesting.amount - ); - } - - let bonded_free = account - .get_pledged_free( - Some(Timestamp::from_seconds(1764416964)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!(pledge.amount().amount, bonded_free.amount); - - let bonded_vesting = account - .get_pledged_vesting( - Some(Timestamp::from_seconds(1764416964)), - &env, - &deps.storage, - ) - .unwrap(); - assert_eq!(Uint128::zero(), bonded_vesting.amount); - } - - #[test] - fn delegated_free() { - let mut deps = init_contract(); - let mut env = mock_env(); - - let vesting_period_length_secs = 3600; - - let account_creation_timestamp = 1650000000; - let account_creation_blockheight = 12345; - - // this value is completely arbitrary, I just wanted to keep consistent - // (and make sure that if block timestamp increases so does the block height) - let blocks_per_period = 100; - - env.block.height = account_creation_blockheight; - env.block.time = Timestamp::from_seconds(account_creation_timestamp); - - // lets define some helper timestamps - - // our account is set to be created after 2 vesting periods already passed - let vesting_start_blockheight = account_creation_blockheight - 2 * blocks_per_period; - let vesting_start_timestamp = account_creation_timestamp - 2 * vesting_period_length_secs; - - let vesting_period2_start_blockheight = vesting_start_blockheight + blocks_per_period; - let vesting_period2_start_timestamp = vesting_start_timestamp + vesting_period_length_secs; - - // this vesting period is currently in progress! - let vesting_period3_start_blockheight = - vesting_period2_start_blockheight + blocks_per_period; - let vesting_period3_start_timestamp = - vesting_period2_start_timestamp + vesting_period_length_secs; - - // and this one is in the future! (in relation to account creation) - let vesting_period4_start_blockheight = - vesting_period3_start_blockheight + blocks_per_period; - let vesting_period4_start_timestamp = - vesting_period3_start_timestamp + vesting_period_length_secs; - - // lets create our vesting account - let periods = populate_vesting_periods( - vesting_start_timestamp, - VestingSpecification::new(None, Some(vesting_period_length_secs), None), - ); - - let vesting_account = Account::new( - Addr::unchecked("owner"), - Some(Addr::unchecked("staking")), - Coin { - amount: Uint128::new(1_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }, - Timestamp::from_seconds(account_creation_timestamp), - periods, - Some(PledgeCap::Absolute(Uint128::from(100_000_000_000u128))), - deps.as_mut().storage, - ) - .unwrap(); - - // time for some delegations - - let mix_id = 42; - - let delegation = Coin { - amount: Uint128::new(90_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - - // delegate explicitly at the time the account was created - // (i.e. after 2 vesting periods already elapsed) - env.block.height = account_creation_blockheight; - env.block.time = Timestamp::from_seconds(account_creation_timestamp); - let ok = vesting_account.try_delegate_to_mixnode( - mix_id, - delegation.clone(), - &env, - &mut deps.storage, - ); - assert!(ok.is_ok()); - - let vested_coins = vesting_account - .get_vested_coins(None, &env, &deps.storage) - .unwrap(); - let vesting_coins = vesting_account - .get_vesting_coins(None, &env, &deps.storage) - .unwrap(); - assert_eq!(vested_coins.amount, Uint128::new(250_000_000_000)); - assert_eq!(vesting_coins.amount, Uint128::new(750_000_000_000)); - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - - // all good so far - assert_eq!(delegated_free.amount, Uint128::new(90_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::zero()); - - // some time passes, and we're now into the next vesting period, more of our coins got unlocked! - env.block.height = vesting_period4_start_blockheight; - env.block.time = Timestamp::from_seconds(vesting_period4_start_timestamp); - - let vested_coins = vesting_account - .get_vested_coins(None, &env, &deps.storage) - .unwrap(); - let vesting_coins = vesting_account - .get_vesting_coins(None, &env, &deps.storage) - .unwrap(); - assert_eq!(vested_coins.amount, Uint128::new(375_000_000_000)); - assert_eq!(vesting_coins.amount, Uint128::new(625_000_000_000)); - - // and nothing about our existing delegation changed - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - assert_eq!(delegated_free.amount, Uint128::new(90_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::zero()); - - // however, create a new delegation now in this brand new vesting period - let delegation = Coin { - amount: Uint128::new(50_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - let ok = vesting_account.try_delegate_to_mixnode( - mix_id, - delegation.clone(), - &env, - &mut deps.storage, - ); - assert!(ok.is_ok()); - - // we're still good here, we have delegated in total 140M from our vested tokens! - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - assert_eq!(delegated_free.amount, Uint128::new(140_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::zero()); - - // but let's ask now a different question: - // how many vested tokens have I had delegated during vesting period3? (i.e. after account creation) - let delegated_free = vesting_account - .get_delegated_free( - Some(Timestamp::from_seconds(vesting_period3_start_timestamp)), - &env, - &deps.storage, - ) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting( - Some(Timestamp::from_seconds(vesting_period3_start_timestamp)), - &env, - &deps.storage, - ) - .unwrap(); - - // returns 90M as the 50M delegation didn't exist at this point of time - assert_eq!(delegated_free.amount, Uint128::new(90_000_000_000)); - - // the 50M delegation wasn't a thing here for VESTING tokens either - assert_eq!(delegated_vesting.amount, Uint128::zero()); - } - - #[test] - fn vesting_cap_escape() { - let mut deps = init_contract(); - let mut env = mock_env(); - - let vesting_period_length_secs = 3600; - let blocks_per_period = 100; - - let account_creation_timestamp = 1650000000; - let vesting_start_timestamp = 1650000000; - - let account_creation_blockheight = 12345; - - env.block.height = account_creation_blockheight; - env.block.time = Timestamp::from_seconds(account_creation_timestamp); - - let periods = populate_vesting_periods( - vesting_start_timestamp, - VestingSpecification::new(None, Some(vesting_period_length_secs), None), - ); - - let vesting_account = Account::new( - Addr::unchecked("owner"), - None, - Coin { - amount: Uint128::new(40_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }, - Timestamp::from_seconds(account_creation_timestamp), - periods, - Some(PledgeCap::Percent( - Percent::from_percentage_value(10).unwrap(), - )), - deps.as_mut().storage, - ) - .unwrap(); - - let mix_id = 42; - - let delegation = Coin { - amount: Uint128::new(5_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - - // delegate explicitly at the time the account was created - // (i.e. after 2 vesting periods already elapsed) - env.block.height = account_creation_blockheight; - env.block.time = Timestamp::from_seconds(account_creation_timestamp); - let err = vesting_account.try_delegate_to_mixnode( - mix_id, - delegation.clone(), - &env, - &mut deps.storage, - ); - // Can't delegate due to cap - assert!(err.is_err()); - - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - - assert_eq!(delegated_free.amount, Uint128::new(0)); - assert_eq!(delegated_vesting.amount, Uint128::new(0)); - - let delegation = Coin { - amount: Uint128::new(4_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - - // delegate explicitly at the time the account was created - // (i.e. after 2 vesting periods already elapsed) - env.block.height = account_creation_blockheight; - env.block.time = Timestamp::from_seconds(account_creation_timestamp); - let ok = vesting_account.try_delegate_to_mixnode( - mix_id, - delegation.clone(), - &env, - &mut deps.storage, - ); - - // Max delegation allowed by cap - assert!(ok.is_ok()); - - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - - assert_eq!(delegated_free.amount, Uint128::new(0)); - assert_eq!(delegated_vesting.amount, Uint128::new(4_000_000_000_000)); - - // Advance vesting period - env.block.height += blocks_per_period * 2; - env.block.time = - Timestamp::from_seconds(env.block.time.seconds() + vesting_period_length_secs * 2); - - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - - let spendable_coins = vesting_account - .spendable_coins(None, &env, &deps.storage) - .unwrap(); - - // let balance = vesting_account.load_balance(&deps.storage).unwrap(); - // assert_eq!(balance, Uint128::new(6_000_000_000_000)); - - // Entire delegation amount is no free, and more can be delegated from the locked tokens - assert_eq!(delegated_free.amount, Uint128::new(4_000_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::new(0)); - assert_eq!(spendable_coins.amount, Uint128::new(6_000_000_000_000)); - - let total_pledged_locked = vesting_account - .total_pledged_locked(&deps.storage, &env) - .unwrap(); - assert_eq!(total_pledged_locked, Uint128::new(0)); - - let delegation = Coin { - amount: Uint128::new(5_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - - let err = vesting_account.try_delegate_to_mixnode( - mix_id, - delegation.clone(), - &env, - &mut deps.storage, - ); - - // Can't delegate due to cap - assert!(err.is_err()); - - let delegation = Coin { - amount: Uint128::new(4_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - - let ok = vesting_account.try_delegate_to_mixnode( - mix_id, - delegation.clone(), - &env, - &mut deps.storage, - ); - // Delegate max allowed amount - assert!(ok.is_ok()); - - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - let total_pledged_locked = vesting_account - .total_pledged_locked(&deps.storage, &env) - .unwrap(); - let spendable_coins = vesting_account - .spendable_coins(None, &env, &deps.storage) - .unwrap(); - // There is an additional problem here since the cap calculation does not take vesting periods into account - assert_eq!(total_pledged_locked, Uint128::new(0)); - - // Entire delegation amount is now free, and more can be delegated from the locked tokens - assert_eq!(delegated_free.amount, Uint128::new(8_000_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::new(0)); - assert_eq!(spendable_coins.amount, Uint128::new(2_000_000_000_000)); - - // Delegate some more to saturate the cap - env.block.height += 1; - env.block.time = Timestamp::from_seconds(env.block.time.seconds() + 36); - - let delegation = Coin { - amount: Uint128::new(4_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - - vesting_account - .try_delegate_to_mixnode(mix_id, delegation.clone(), &env, &mut deps.storage) - .unwrap(); - - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - let total_pledged_locked = vesting_account - .total_pledged_locked(&deps.storage, &env) - .unwrap(); - - // There is an additional problem here since the cap calculation does not take vesting periods into account - assert_eq!(total_pledged_locked, Uint128::new(4_000_000_000_000)); - - assert_eq!(delegated_free.amount, Uint128::new(8_000_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::new(4_000_000_000_000)); - - let spendable_coins = vesting_account - .spendable_coins(None, &env, &deps.storage) - .unwrap(); - - let locked_coins = vesting_account - .locked_coins(None, &env, &deps.storage) - .unwrap(); - - assert_eq!(spendable_coins.amount, Uint128::new(2_000_000_000_000)); - assert_eq!(locked_coins.amount, Uint128::new(26_000_000_000_000)); - - // Check that user can't withdraw free coins if they're delegated - - let info = MessageInfo { - sender: Addr::unchecked("owner"), - funds: vec![], - }; - - let ok = try_withdraw_vested_coins( - Coin::new(1_000_000_000_000, TEST_COIN_DENOM), - env.clone(), - info, - deps.as_mut(), - ); - - assert!(ok.is_ok()); - - let spendable_coins = vesting_account - .spendable_coins(None, &env, &deps.storage) - .unwrap(); - - assert_eq!(spendable_coins.amount, Uint128::new(1_000_000_000_000)); - - let delegated_free = vesting_account - .get_delegated_free(None, &env, &deps.storage) - .unwrap(); - let delegated_vesting = vesting_account - .get_delegated_vesting(None, &env, &deps.storage) - .unwrap(); - let total_pledged_locked = vesting_account - .total_pledged_locked(&deps.storage, &env) - .unwrap(); - - assert_eq!(total_pledged_locked, Uint128::new(4_000_000_000_000)); - - assert_eq!(delegated_free.amount, Uint128::new(8_000_000_000_000)); - assert_eq!(delegated_vesting.amount, Uint128::new(4_000_000_000_000)); - - let delegation = Coin { - amount: Uint128::new(1_000_000_000_000), - denom: TEST_COIN_DENOM.to_string(), - }; - - let err = vesting_account.try_delegate_to_mixnode( - mix_id, - delegation.clone(), - &env, - &mut deps.storage, - ); - - assert!(err.is_err()); } } diff --git a/nym-wallet/src-tauri/src/error.rs b/nym-wallet/src-tauri/src/error.rs index e47a0ab272..0166435c3e 100644 --- a/nym-wallet/src-tauri/src/error.rs +++ b/nym-wallet/src-tauri/src/error.rs @@ -121,6 +121,9 @@ pub enum BackendError { SignatureError(String), #[error("Unable to open a new window")] NewWindowError, + + #[error("This command ({name}) has been removed. Please try to use {alternative} instead.")] + RemovedCommand { name: String, alternative: String }, } impl Serialize for BackendError { diff --git a/nym-wallet/src-tauri/src/main.rs b/nym-wallet/src-tauri/src/main.rs index 33b8217c58..7c918624f1 100644 --- a/nym-wallet/src-tauri/src/main.rs +++ b/nym-wallet/src-tauri/src/main.rs @@ -121,13 +121,20 @@ fn main() { vesting::bond::withdraw_vested_coins, vesting::delegate::vesting_delegate_to_mixnode, vesting::delegate::vesting_undelegate_from_mixnode, - vesting::queries::delegated_free, - vesting::queries::delegated_vesting, vesting::queries::get_account_info, vesting::queries::get_current_vesting_period, vesting::queries::locked_coins, vesting::queries::original_vesting, vesting::queries::spendable_coins, + vesting::queries::get_historical_vesting_staking_reward, + vesting::queries::get_spendable_vested_coins, + vesting::queries::get_spendable_reward_coins, + vesting::queries::get_delegated_coins, + vesting::queries::get_pledged_coins, + vesting::queries::get_withdrawn_coins, + vesting::queries::get_staked_coins, + vesting::queries::delegated_free, + vesting::queries::delegated_vesting, vesting::queries::vested_coins, vesting::queries::vesting_coins, vesting::queries::vesting_end_time, diff --git a/nym-wallet/src-tauri/src/operations/vesting/queries.rs b/nym-wallet/src-tauri/src/operations/vesting/queries.rs index cf664652ca..afef1d3dac 100644 --- a/nym-wallet/src-tauri/src/operations/vesting/queries.rs +++ b/nym-wallet/src-tauri/src/operations/vesting/queries.rs @@ -12,7 +12,7 @@ use nym_vesting_contract_common::Period; use validator_client::nyxd::VestingQueryClient; #[tauri::command] -pub async fn locked_coins( +pub(crate) async fn locked_coins( block_time: Option, state: tauri::State<'_, WalletState>, ) -> Result { @@ -33,7 +33,7 @@ pub async fn locked_coins( } #[tauri::command] -pub async fn spendable_coins( +pub(crate) async fn spendable_coins( block_time: Option, state: tauri::State<'_, WalletState>, ) -> Result { @@ -55,7 +55,7 @@ pub async fn spendable_coins( } #[tauri::command] -pub async fn vested_coins( +pub(crate) async fn vested_coins( vesting_account_address: &str, block_time: Option, state: tauri::State<'_, WalletState>, @@ -78,7 +78,7 @@ pub async fn vested_coins( } #[tauri::command] -pub async fn vesting_coins( +pub(crate) async fn vesting_coins( vesting_account_address: &str, block_time: Option, state: tauri::State<'_, WalletState>, @@ -101,7 +101,7 @@ pub async fn vesting_coins( } #[tauri::command] -pub async fn vesting_start_time( +pub(crate) async fn vesting_start_time( vesting_account_address: &str, state: tauri::State<'_, WalletState>, ) -> Result { @@ -115,7 +115,7 @@ pub async fn vesting_start_time( } #[tauri::command] -pub async fn vesting_end_time( +pub(crate) async fn vesting_end_time( vesting_account_address: &str, state: tauri::State<'_, WalletState>, ) -> Result { @@ -129,7 +129,7 @@ pub async fn vesting_end_time( } #[tauri::command] -pub async fn original_vesting( +pub(crate) async fn original_vesting( vesting_account_address: &str, state: tauri::State<'_, WalletState>, ) -> Result { @@ -149,54 +149,153 @@ pub async fn original_vesting( } #[tauri::command] -pub async fn delegated_free( - vesting_account_address: &str, - block_time: Option, +pub(crate) async fn get_historical_vesting_staking_reward( state: tauri::State<'_, WalletState>, ) -> Result { - log::info!(">>> Query delegated free"); + log::info!(">>> Query historical vesting staking reward coins"); let guard = state.read().await; + let client = guard.current_client()?; - let res = guard - .current_client()? + let res = client .nyxd - .delegated_free( - vesting_account_address, - block_time.map(Timestamp::from_seconds), - ) + .get_historical_vesting_staking_reward(client.nyxd.address().as_ref()) .await?; - let display = guard.attempt_convert_to_display_dec_coin(res)?; - log::info!("<<< delegated free = {}", display); + log::info!("<<< historical vesting staking reward coins = {}", display); Ok(display) } +#[tauri::command] +pub(crate) async fn get_spendable_vested_coins( + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Query spendable vested coins"); + let guard = state.read().await; + let client = guard.current_client()?; + + let res = client + .nyxd + .get_spendable_vested_coins(client.nyxd.address().as_ref()) + .await?; + let display = guard.attempt_convert_to_display_dec_coin(res)?; + log::info!("<<< spendable vested coins = {}", display); + Ok(display) +} + +#[tauri::command] +pub(crate) async fn get_spendable_reward_coins( + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Query spendable reward coins"); + let guard = state.read().await; + let client = guard.current_client()?; + + let res = client + .nyxd + .get_spendable_reward_coins(client.nyxd.address().as_ref()) + .await?; + let display = guard.attempt_convert_to_display_dec_coin(res)?; + log::info!("<<< spendable reward coins = {}", display); + Ok(display) +} + +#[tauri::command] +pub(crate) async fn get_delegated_coins( + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Query delegated coins"); + let guard = state.read().await; + let client = guard.current_client()?; + + let res = client + .nyxd + .get_delegated_coins(client.nyxd.address().as_ref()) + .await?; + let display = guard.attempt_convert_to_display_dec_coin(res)?; + log::info!("<<< delegated coins = {}", display); + Ok(display) +} + +#[tauri::command] +pub(crate) async fn get_pledged_coins( + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Query pledged coins"); + let guard = state.read().await; + let client = guard.current_client()?; + + let res = client + .nyxd + .get_pledged_coins(client.nyxd.address().as_ref()) + .await?; + let display = guard.attempt_convert_to_display_dec_coin(res)?; + log::info!("<<< pledged coins = {}", display); + Ok(display) +} + +#[tauri::command] +pub(crate) async fn get_staked_coins( + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Query staked coins"); + let guard = state.read().await; + let client = guard.current_client()?; + + let res = client + .nyxd + .get_staked_coins(client.nyxd.address().as_ref()) + .await?; + let display = guard.attempt_convert_to_display_dec_coin(res)?; + log::info!("<<< staked coins = {}", display); + Ok(display) +} + +#[tauri::command] +pub(crate) async fn get_withdrawn_coins( + state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Query withdrawn coins"); + let guard = state.read().await; + let client = guard.current_client()?; + + let res = client + .nyxd + .get_withdrawn_coins(client.nyxd.address().as_ref()) + .await?; + let display = guard.attempt_convert_to_display_dec_coin(res)?; + log::info!("<<< pledged coins = {}", display); + Ok(display) +} + +#[tauri::command] +pub(crate) async fn delegated_free( + _vesting_account_address: &str, + _block_time: Option, + _state: tauri::State<'_, WalletState>, +) -> Result { + log::info!(">>> Query delegated free -> THIS QUERY HAS BEEN REMOVED FROM THE CONTRACT"); + Err(BackendError::RemovedCommand { + name: "vesting::queries::delegated_free".to_string(), + alternative: "vesting::queries::get_delegated_coins".to_string(), + }) +} + /// Returns the total amount of delegated tokens that have vested #[tauri::command] -pub async fn delegated_vesting( - block_time: Option, - vesting_account_address: &str, - state: tauri::State<'_, WalletState>, +pub(crate) async fn delegated_vesting( + _block_time: Option, + _vesting_account_address: &str, + _state: tauri::State<'_, WalletState>, ) -> Result { - log::info!(">>> Query delegated vesting"); - let guard = state.read().await; - - let res = guard - .current_client()? - .nyxd - .delegated_vesting( - vesting_account_address, - block_time.map(Timestamp::from_seconds), - ) - .await?; - - let display = guard.attempt_convert_to_display_dec_coin(res)?; - log::info!("<<< delegated_vesting = {}", display); - Ok(display) + log::info!(">>> Query delegated vesting -> THIS QUERY HAS BEEN REMOVED FROM THE CONTRACT"); + Err(BackendError::RemovedCommand { + name: "vesting::queries::delegated_vesting".to_string(), + alternative: "vesting::queries::get_delegated_coins".to_string(), + }) } #[tauri::command] -pub async fn vesting_get_mixnode_pledge( +pub(crate) async fn vesting_get_mixnode_pledge( address: &str, state: tauri::State<'_, WalletState>, ) -> Result, BackendError> { @@ -217,7 +316,7 @@ pub async fn vesting_get_mixnode_pledge( } #[tauri::command] -pub async fn vesting_get_gateway_pledge( +pub(crate) async fn vesting_get_gateway_pledge( address: &str, state: tauri::State<'_, WalletState>, ) -> Result, BackendError> { @@ -238,7 +337,7 @@ pub async fn vesting_get_gateway_pledge( } #[tauri::command] -pub async fn get_current_vesting_period( +pub(crate) async fn get_current_vesting_period( address: &str, state: tauri::State<'_, WalletState>, ) -> Result { @@ -251,7 +350,7 @@ pub async fn get_current_vesting_period( } #[tauri::command] -pub async fn get_account_info( +pub(crate) async fn get_account_info( address: &str, state: tauri::State<'_, WalletState>, ) -> Result { From 92a755dc6cb86798e6a89013c0d103d4e42d5d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Walther?= Date: Tue, 21 Feb 2023 14:57:07 +0100 Subject: [PATCH 416/591] Github Actions: disable temporary rust install --- .github/workflows/nym-connect-publish-windows10.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 599b6d27e4..d33db8098e 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -44,10 +44,10 @@ jobs: with: node-version: 16 - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable +# - name: Install Rust stable +# uses: actions-rs/toolchain@v1 +# with: +# toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 From 9e7c77ca6ac4afee12ec30acad1911161b1062fb Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 08:59:40 -0500 Subject: [PATCH 417/591] docs: update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2317a5b14..870526ee43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,9 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] -## [v1.1.9] (2023-02-21) +## [v1.1.10] (2023-02-21) +- Problem 142 (rust-side) ([#3024]) - Verloc listener causing mixnode unexpected shutdown ([#3038]) - rust-sdk - update API following implementation experience with the network-requester ([#3001]) - Prevent coconut deposits in incompatible states ([#2991]) @@ -18,6 +19,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// - ci: update typescript-lint.yml ([#3035]) - contracts: add nym prefix to mixnet and vesting contract packages ([#2855]) +[#3024]: https://github.com/nymtech/nym/issues/3024 [#3038]: https://github.com/nymtech/nym/issues/3038 [#3001]: https://github.com/nymtech/nym/issues/3001 [#2991]: https://github.com/nymtech/nym/issues/2991 From b3425a6a6e5297e59b7081b62bb1f43d5f45c938 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 09:03:56 -0500 Subject: [PATCH 418/591] chore: bump vesting contract --- contracts/vesting/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/vesting/Cargo.toml b/contracts/vesting/Cargo.toml index ac414c1c18..edb0bb52b2 100644 --- a/contracts/vesting/Cargo.toml +++ b/contracts/vesting/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-vesting-contract" -version = "1.1.3" +version = "1.1.4" authors = ["Drazen Urch "] edition = "2021" From bda32cfef3aac031403ea77c91fd6777424c61d4 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 09:07:41 -0500 Subject: [PATCH 419/591] docs: update changelog --- CHANGELOG.md | 2 -- contracts/CHANGELOG.md | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 870526ee43..ae9f5f1e29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,6 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [v1.1.10] (2023-02-21) -- Problem 142 (rust-side) ([#3024]) - Verloc listener causing mixnode unexpected shutdown ([#3038]) - rust-sdk - update API following implementation experience with the network-requester ([#3001]) - Prevent coconut deposits in incompatible states ([#2991]) @@ -19,7 +18,6 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// - ci: update typescript-lint.yml ([#3035]) - contracts: add nym prefix to mixnet and vesting contract packages ([#2855]) -[#3024]: https://github.com/nymtech/nym/issues/3024 [#3038]: https://github.com/nymtech/nym/issues/3038 [#3001]: https://github.com/nymtech/nym/issues/3001 [#2991]: https://github.com/nymtech/nym/issues/2991 diff --git a/contracts/CHANGELOG.md b/contracts/CHANGELOG.md index 5baa36317a..d622d922fa 100644 --- a/contracts/CHANGELOG.md +++ b/contracts/CHANGELOG.md @@ -1,5 +1,11 @@ +# Changelog + ## Unreleased +## [v1.1.4] (2023-02-21) + +- Problem 142 (rust-side) ([#3024]) + ## [nym-contracts-v1.1.3](https://github.com/nymtech/nym/tree/nym-contracts-v1.1.3) (2022-01-25) ### Added From c2326f35a630e957b073479713aa123cdb75b6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Walther?= Date: Tue, 21 Feb 2023 15:10:42 +0100 Subject: [PATCH 420/591] Revert "Github Actions: disable temporary rust install" This reverts commit 92a755dc6cb86798e6a89013c0d103d4e42d5d51. --- .github/workflows/nym-connect-publish-windows10.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index d33db8098e..599b6d27e4 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -44,10 +44,10 @@ jobs: with: node-version: 16 -# - name: Install Rust stable -# uses: actions-rs/toolchain@v1 -# with: -# toolchain: stable + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 From 69c8891f82a7fe4fa0b1c3e29b291c36e64eee80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Walther?= Date: Tue, 21 Feb 2023 15:12:27 +0100 Subject: [PATCH 421/591] Github Actions: disable temporary rust install --- .github/workflows/nym-wallet-publish-windows10.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-wallet-publish-windows10.yml b/.github/workflows/nym-wallet-publish-windows10.yml index 6f22820943..6ea214808b 100644 --- a/.github/workflows/nym-wallet-publish-windows10.yml +++ b/.github/workflows/nym-wallet-publish-windows10.yml @@ -43,10 +43,10 @@ jobs: with: node-version: 16 - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable +# - name: Install Rust stable +# uses: actions-rs/toolchain@v1 +# with: +# toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 From b62e221aadf18dfe5a14ce3692b5a632527e5be8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 21 Feb 2023 15:15:53 +0100 Subject: [PATCH 422/591] gateway: stray println that should be eprintln --- gateway/src/commands/init.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index ce66400642..15aff4ca9b 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -101,7 +101,7 @@ impl From for OverrideConfig { } pub async fn execute(args: Init, output: OutputFormat) -> Result<(), Box> { - println!("Initialising gateway {}...", args.id); + eprintln!("Initialising gateway {}...", args.id); let already_init = if Config::default_config_file_path(&args.id).exists() { eprintln!( From ddd9498c0b14da3f32d4f5044e07b6c735ef785a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 21 Feb 2023 15:15:53 +0100 Subject: [PATCH 423/591] gateway: stray println that should be eprintln --- gateway/src/commands/init.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index a21039cac6..ecdb5ad583 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -101,7 +101,7 @@ impl From for OverrideConfig { } pub async fn execute(args: Init, output: OutputFormat) -> Result<(), Box> { - println!("Initialising gateway {}...", args.id); + eprintln!("Initialising gateway {}...", args.id); let already_init = if Config::default_config_file_path(&args.id).exists() { eprintln!( From 6ce743fbd55e37db06a1aa69580ee8e8bfcde378 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Tue, 21 Feb 2023 17:11:20 +0200 Subject: [PATCH 424/591] add the nym-client and tidy up the mixnode next up gateway, socks-5, network-requester --- tests/nym-client-binary-check.sh | 114 ++++++++++++++++++++++++++++++ tests/nym-mixnode-binary-check.sh | 20 ++++-- 2 files changed, 127 insertions(+), 7 deletions(-) create mode 100755 tests/nym-client-binary-check.sh diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh new file mode 100755 index 0000000000..c54f40948c --- /dev/null +++ b/tests/nym-client-binary-check.sh @@ -0,0 +1,114 @@ +#!/bin/bash + +set -e + +. assert.sh -v -x + +PWD="../" +RELEASE_DIRECTORY="target/release" +VERSION_NUMBER=$1 +OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) +ID="test-${OUTPUT}" +BINARY_NAME="nym-client" + +echo "the version number is ${VERSION_NUMBER} to be installed from github" + +cd ${PWD}${RELEASE_DIRECTORY} + +# steps +# we curl the existing binary from the release page of github +# we init the binary to check successful init +# then in our testing branch, we build the binary locally +# re run the init based upon the configuration injected +# we validate that no errors are return from upgrading the binary against the test + +# install the current release binary +# so this is dependant on running on a linux machine for the time being + +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +chmod u+x $BINARY_NAME + +#---------------------------------------------------------------------------------------------------------- +# functions +#---------------------------------------------------------------------------------------------------------- + +check_nym_client_binary_build() if [ -f $BINARY_NAME ]; then + echo "running init tests" + ./${BINARY_NAME} init --id ${ID} --output-json >/dev/null 2>&1 + + # currently this outputs to a file name name + # we currently store the output in a file in the same directory + + if [ -f client_init_results.json ]; then + OUTPUT=$(cat client_init_results.json) + + # get jq values for things we can assert against + # until the service provider is provided in the output we can validate the id is correct on init + VALUE=$(echo ${OUTPUT} | jq .id) + VALUE=${VALUE#\"} + VALUE=${VALUE%\"} + + echo "${OUTPUT}" + sleep 2 + + # do asserts here based upon the output on init + + assert $(echo ${VALUE}) $(echo ${ID}) + assert_end nym-client-tests + else + echo "exting test no binary found" + fi +else + echo "exting test no binary found" +fi + +#---------------------------------------------------------------------------------------------------------- +# tests +#---------------------------------------------------------------------------------------------------------- +# we run the release version first + +check_nym_client_binary_build + +first_init=$(cat /root/.nym/clients/${ID}/config/config.toml | grep -v "^version =") + +#---------------------------------------------------------------------------------------------------------- +# lets remove the binary then navigate to the target/release directory for checking the latest version +# expect to have successful output and configuration +#---------------------------------------------------------------------------------------------------------- + +if [ -f $BINARY_NAME ]; then + echo "removing client binary" + rm -rf $BINARY_NAME +else + echo "no binary found exiting" + exit 1 +fi + +#---------------------------------------------------------------------------------------------------------- +# we should expect it to pass because no errors should be presented when performing the upgrade of an init +# this should be caught at testing stage - navigate to latest binary build +#---------------------------------------------------------------------------------------------------------- + +cd ${PWD}${RELEASE_DIRECTORY} + +# re-run against the current binary built locally + +echo "diff the config files after each init" +echo "-------------------------------------" + +check_nym_client_binary_build + +second_init=$(cat /root/.nym/clients/${ID}/config/config.toml | grep -v "^version =") + +diff -w <(echo "$first_init") <(echo "$second_init") + +# check the status of the diff +if [ $? -eq 0 ]; then + echo "no differences in config files, exiting script" + exit 0 +else + echo "there are differences in the config files, it may require a fresh init on the binary" + exit 1 +fi + +# we should expect it to pass because no errors should be presented when performing the upgrade of an init diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 35c2a5b9a2..89a4a604b6 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -25,14 +25,15 @@ echo "the version number is ${VERSION_NUMBER} to be installed from github" curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o nym-mixnode chmod u+x "$BINARY_NAME" -#-------------------------------------- +#---------------------------------------------------------------------------------------------------------- # functions -#-------------------------------------- +#---------------------------------------------------------------------------------------------------------- + check_mixnode_binary_build() { if [ -f "$BINARY_NAME" ]; then echo "running init tests" # we wont use config env files for now - OUTPUT=$(./${BINARY_NAME} --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST} > /dev/null) + OUTPUT=$(./${BINARY_NAME} --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST} >/dev/null) # get jq values for things we can assert against # tidy this bit up - okay for first push @@ -46,9 +47,9 @@ check_mixnode_binary_build() { fi } -#------------------------------- +#---------------------------------------------------------------------------------------------------------- # tests -#------------------------------- +#---------------------------------------------------------------------------------------------------------- # we run the release version first check_mixnode_binary_build @@ -65,11 +66,16 @@ else echo "no binary found exiting" exit 1 fi + +#---------------------------------------------------------------------------------------------------------- # we should expect it to pass because no errors should be presented when performing the upgrade of an init -# this should be caught at testing stage -# navigate to latest binary build +# this should be caught at testing stage - navigate to latest binary build +#---------------------------------------------------------------------------------------------------------- + cd $PWD$RELEASE_DIRECTORY + #re run against the current binary built locally + check_mixnode_binary_build echo "diff the config files after each init" From 5813e9212b66076f018eb662b25e3a78a2bd6ad4 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Tue, 21 Feb 2023 17:34:34 +0200 Subject: [PATCH 425/591] adding socks-5-test --- tests/nym-socks-5-binary-check.sh | 116 ++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100755 tests/nym-socks-5-binary-check.sh diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh new file mode 100755 index 0000000000..9433ed932c --- /dev/null +++ b/tests/nym-socks-5-binary-check.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +set -e + +. assert.sh -v -x + +PWD="../" +RELEASE_DIRECTORY="target/release" +VERSION_NUMBER=$1 +MOCK_SERVICE_PROVIDER="36cUqdggtdXixZhmXfyZm3Dep3Q5QsKVPotMrVSmS4oY.ZCCAdFPwPNSTtUMYveA62ttEFe8FDiB3cdheWHtCytX@6Lnxj9vD2YMtSmfe8zp5RBtj1uZLYQAFRxY9q7ANwrZz" +RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) +ID="test-${RANDOM_ID}" +BINARY_NAME="nym-socks5-client" + +echo "the version number is ${VERSION_NUMBER} to be installed from github" + +cd ${PWD}${RELEASE_DIRECTORY} + +# steps +# we curl the existing binary from the release page of github +# we init the binary to check successful init +# then in our testing branch, we build the binary locally +# re run the init based upon the configuration injected +# we validate that no errors are return from upgrading the binary against the test + +# install the current release binary +# so this is dependant on running on a linux machine for the time being + +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +chmod u+x $BINARY_NAME + + +#---------------------------------------------------------------------------------------------------------- +# functions +#---------------------------------------------------------------------------------------------------------- + +check_nym_socks5_client_binary_build() if [ -f $BINARY_NAME ]; then + echo "running init tests" + ./${BINARY_NAME} init --id ${ID} --provider ${MOCK_SERVICE_PROVIDER} --output-json >/dev/null 2>&1 + + # currently this outputs to a file name name + # we currently store the output in a file in the same directory + + if [ -f "socks5_client_init_results.json" ]; then + OUTPUT=$(cat socks5_client_init_results.json) + + # get jq values for things we can assert against + # until the service provider is provided in the output we can validate the id is correct on init + VALUE=$(echo ${OUTPUT} | jq .id) + VALUE=${VALUE#\"} + VALUE=${VALUE%\"} + + echo "${OUTPUT}" + sleep 2 + + # do asserts here based upon the output on init + + assert $(echo ${VALUE}) $(echo ${ID}) + assert_end nym-client-tests + else + echo "exting test no binary found" + fi +else + echo "exting test no binary found" +fi + +#---------------------------------------------------------------------------------------------------------- +# tests +#---------------------------------------------------------------------------------------------------------- +# we run the release version first + +check_nym_socks5_client_binary_build + +first_init=$(cat /root/.nym/socks5-clients/${ID}/config/config.toml | grep -v "^version =") + +#---------------------------------------------------------------------------------------------------------- +# lets remove the binary then navigate to the target/release directory for checking the latest version +# expect to have successful output and configuration +#---------------------------------------------------------------------------------------------------------- + +if [ -f $BINARY_NAME ]; then + echo "removing client binary" + rm -rf $BINARY_NAME +else + echo "no binary found exiting" + exit 1 +fi + +#---------------------------------------------------------------------------------------------------------- +# we should expect it to pass because no errors should be presented when performing the upgrade of an init +# this should be caught at testing stage - navigate to latest binary build +#---------------------------------------------------------------------------------------------------------- + +cd ${PWD}${RELEASE_DIRECTORY} + +# re-run against the current binary built locally + +echo "diff the config files after each init" +echo "-------------------------------------" + +check_nym_socks5_client_binary_build + +second_init=$(cat /root/.nym/socks5-clients/${ID}/config/config.toml | grep -v "^version =") + +diff -w <(echo "$first_init") <(echo "$second_init") + +# check the status of the diff +if [ $? -eq 0 ]; then + echo "no differences in config files, exiting script" + exit 0 +else + echo "there are differences in the config files, it may require a fresh init on the binary" + exit 1 +fi + +# we should expect it to pass because no errors should be presented when performing the upgrade of an init From cc1c9a75b492e3d6d020a35cd880d78cd6628331 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Tue, 21 Feb 2023 17:35:11 +0200 Subject: [PATCH 426/591] remove file --- tests/socks5-binary-check.sh | 2 -- 1 file changed, 2 deletions(-) delete mode 100755 tests/socks5-binary-check.sh diff --git a/tests/socks5-binary-check.sh b/tests/socks5-binary-check.sh deleted file mode 100755 index 74c27dbf69..0000000000 --- a/tests/socks5-binary-check.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -# TODO \ No newline at end of file From 79e51252a88942c59f163209261258b356720442 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 10:44:33 -0500 Subject: [PATCH 427/591] fix: comment out install rust on windows build as it breaks it --- .github/workflows/nym-connect-publish-windows10.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 599b6d27e4..cce4351833 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -44,10 +44,10 @@ jobs: with: node-version: 16 - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable + #- name: Install Rust stable + #uses: actions-rs/toolchain@v1 + #with: + #toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 From b3b4b5ff368d6ee200a58f0ce5bba6f4a426b001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 21 Feb 2023 17:01:36 +0100 Subject: [PATCH 428/591] Add nym prefix to inclusion-probability crate (#3079) * inclusion-probability: update metadata * Add nym- prefix to inclusion-probability crate --- Cargo.lock | 20 +++++++++---------- Cargo.toml | 1 + common/inclusion-probability/Cargo.toml | 14 +++++++------ nym-api/Cargo.toml | 2 +- .../cache/inclusion_probabilities.rs | 4 ++-- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d04d668d80..2acc50931d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2696,15 +2696,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "inclusion-probability" -version = "0.1.0" -dependencies = [ - "log", - "rand 0.8.5", - "thiserror", -] - [[package]] name = "indenter" version = "0.3.3" @@ -3346,7 +3337,6 @@ dependencies = [ "gateway-client", "getset", "humantime-serde", - "inclusion-probability", "lazy_static", "log", "multisig-contract-common", @@ -3354,6 +3344,7 @@ dependencies = [ "nym-bin-common", "nym-contracts-common", "nym-crypto", + "nym-inclusion-probability", "nym-mixnet-contract-common", "nym-pemstore", "nym-sphinx", @@ -3609,6 +3600,15 @@ dependencies = [ "validator-client", ] +[[package]] +name = "nym-inclusion-probability" +version = "0.1.0" +dependencies = [ + "log", + "rand 0.8.5", + "thiserror", +] + [[package]] name = "nym-mixnet-contract-common" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 51b310e50c..5998bb32b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -111,6 +111,7 @@ dotenv = "0.15.0" lazy_static = "1.4.0" log = "0.4" once_cell = "1.7.2" +rand = "0.8.5" serde = "1.0.152" serde_json = "1.0.91" tap = "1.0.1" diff --git a/common/inclusion-probability/Cargo.toml b/common/inclusion-probability/Cargo.toml index d6cd2dae19..b98a1ec5e8 100644 --- a/common/inclusion-probability/Cargo.toml +++ b/common/inclusion-probability/Cargo.toml @@ -1,11 +1,13 @@ [package] -name = "inclusion-probability" +name = "nym-inclusion-probability" version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +description = "Nym active set probability simulator" +edition.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true [dependencies] log = { workspace = true } -rand = "0.8.5" -thiserror = "1.0.32" +rand = { workspace = true } +thiserror = { workspace = true } diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index ea2a6b4776..a1ae9478b5 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -77,7 +77,7 @@ cw3 = { version = "0.13.4" } cw4 = { version = "0.13.4" } dkg = { path = "../common/dkg" } gateway-client = { path = "../common/client-libs/gateway-client" } -inclusion-probability = { path = "../common/inclusion-probability" } +nym-inclusion-probability = { path = "../common/inclusion-probability" } nym-mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet-contract" } nym-vesting-contract-common = { path = "../common/cosmwasm-smart-contracts/vesting-contract" } nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common", features = ["dkg"] } diff --git a/nym-api/src/node_status_api/cache/inclusion_probabilities.rs b/nym-api/src/node_status_api/cache/inclusion_probabilities.rs index 584b06801a..7a59de4145 100644 --- a/nym-api/src/node_status_api/cache/inclusion_probabilities.rs +++ b/nym-api/src/node_status_api/cache/inclusion_probabilities.rs @@ -46,7 +46,7 @@ fn compute_inclusion_probabilities( // Compute inclusion probabilitites and keep track of how long time it took. let mut rng = rand::thread_rng(); - let results = inclusion_probability::simulate_selection_probability_mixnodes( + let results = nym_inclusion_probability::simulate_selection_probability_mixnodes( &mixnode_total_bonds, active_set_size as usize, standby_set_size as usize, @@ -75,7 +75,7 @@ fn unzip_into_mixnode_ids_and_total_bonds(mixnodes: &[MixNodeDetails]) -> (Vec Vec { ids.iter() .zip(results.active_set_probability.iter()) From 312cd65d20da62f290aeeb24b15f720bbdc5aff1 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 12:43:37 -0500 Subject: [PATCH 429/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index cce4351833..0890cb8651 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -10,7 +10,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release' }} + if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && (github.event_name == 'release' || github.event_name == "workflow_dispatch" ) }} strategy: fail-fast: false matrix: From 23fb48316a41fa14b49647b6d1599871d932b914 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 13:00:29 -0500 Subject: [PATCH 430/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 0890cb8651..924c66c392 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -44,10 +44,10 @@ jobs: with: node-version: 16 - #- name: Install Rust stable - #uses: actions-rs/toolchain@v1 - #with: - #toolchain: stable + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 From 1f36b53b64d4816149d92704efc1e552b17f2599 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 13:02:02 -0500 Subject: [PATCH 431/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 924c66c392..7b1cd219cc 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -10,7 +10,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && (github.event_name == 'release' || github.event_name == "workflow_dispatch" ) }} + if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && (github.event_name == 'release' || github.event_name == 'workflow_dispatch' ) }} strategy: fail-fast: false matrix: From ba90e740e2c57eafac5d9cc965e1e85be1e80d24 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 13:03:25 -0500 Subject: [PATCH 432/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 7b1cd219cc..d14417539d 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -10,7 +10,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && (github.event_name == 'release' || github.event_name == 'workflow_dispatch' ) }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: From 06c9c54cdbe1c3ad3f4fab607dec82b6f43c44c1 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 13:26:53 -0500 Subject: [PATCH 433/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index d14417539d..b5e2ff20b7 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -44,10 +44,10 @@ jobs: with: node-version: 16 - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable + #- name: Install Rust stable + # uses: actions-rs/toolchain@v1 + # with: + # toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 @@ -66,6 +66,7 @@ jobs: WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }} TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + RUST_BACKTRACE: 1 run: yarn build - name: Upload Artifact From 495aec39f5727a491bf8c6a089618a628ed2ff93 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 13:43:33 -0500 Subject: [PATCH 434/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index b5e2ff20b7..b1fc06200a 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -44,10 +44,12 @@ jobs: with: node-version: 16 - #- name: Install Rust stable - # uses: actions-rs/toolchain@v1 - # with: - # toolchain: stable + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + components: rustfmt, clippy - name: Create env file uses: timheuer/base64-to-file@v1.1 From fbae1d7963171894cf06aecd7c8405940fbc281d Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 14:10:29 -0500 Subject: [PATCH 435/591] trying to fix windows build --- .../nym-connect-publish-windows10.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index b1fc06200a..ffffa934c2 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -44,12 +44,10 @@ jobs: with: node-version: 16 - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - components: rustfmt, clippy + #- name: Install Rust stable + # uses: actions-rs/toolchain@v1 + # with: + # toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 @@ -59,6 +57,13 @@ jobs: - name: Install app dependencies run: yarn + working-directory: nym-connect + + - name: Check if rustc is available + run: rustc --version + + - name: Check if cargo is available + run: cargo --version - name: Build and sign it env: @@ -70,6 +75,7 @@ jobs: TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} RUST_BACKTRACE: 1 run: yarn build + working-directory: nym-connect - name: Upload Artifact uses: actions/upload-artifact@v3 From 4e2fae8878b41a844aaf7ff8d8e4707ed01ef140 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 14:26:03 -0500 Subject: [PATCH 436/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index ffffa934c2..71335ca237 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -59,6 +59,13 @@ jobs: run: yarn working-directory: nym-connect + - name: Update PATH + run: | + "C:\Users\nymtech\.cargo\bin" >> $env:GITHUB_PATH + + - name: Echo PATH + run: echo "$PATH" + - name: Check if rustc is available run: rustc --version From 1080cf4afe1d229e68936a2802f76377098288c5 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 14:32:44 -0500 Subject: [PATCH 437/591] trying to fix windows build --- .../nym-connect-publish-windows10.yml | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 71335ca237..e48409cd40 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -4,6 +4,10 @@ on: release: types: [created] +env: + ACTIONS_RUNNER_DEBUG: true + ACTIONS_STEP_DEBUG: true + defaults: run: working-directory: nym-connect @@ -44,10 +48,10 @@ jobs: with: node-version: 16 - #- name: Install Rust stable - # uses: actions-rs/toolchain@v1 - # with: - # toolchain: stable + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 @@ -59,13 +63,6 @@ jobs: run: yarn working-directory: nym-connect - - name: Update PATH - run: | - "C:\Users\nymtech\.cargo\bin" >> $env:GITHUB_PATH - - - name: Echo PATH - run: echo "$PATH" - - name: Check if rustc is available run: rustc --version @@ -80,7 +77,6 @@ jobs: WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }} TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - RUST_BACKTRACE: 1 run: yarn build working-directory: nym-connect From add92c7b5e3b255efc47c1e9a52df33d78a39f59 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 14:42:18 -0500 Subject: [PATCH 438/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index e48409cd40..c499d36009 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -48,10 +48,10 @@ jobs: with: node-version: 16 - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable + #- name: Install Rust stable + #uses: actions-rs/toolchain@v1 + #with: + #toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 @@ -63,6 +63,10 @@ jobs: run: yarn working-directory: nym-connect + - name: Update path + run: | + echo "C:\Users\nymtech\.cargo\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + - name: Check if rustc is available run: rustc --version From c15a081e6fa5a16f7af29c6b00b2fd841bae21e1 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 14:50:09 -0500 Subject: [PATCH 439/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index c499d36009..1a48861b94 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -48,10 +48,8 @@ jobs: with: node-version: 16 - #- name: Install Rust stable - #uses: actions-rs/toolchain@v1 - #with: - #toolchain: stable + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable - name: Create env file uses: timheuer/base64-to-file@v1.1 @@ -63,10 +61,6 @@ jobs: run: yarn working-directory: nym-connect - - name: Update path - run: | - echo "C:\Users\nymtech\.cargo\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - - name: Check if rustc is available run: rustc --version From 71b54773348ad17bd6763747973f0c30332f62a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Tue, 21 Feb 2023 21:28:10 +0100 Subject: [PATCH 440/591] pemstore: simplify crate metadata --- common/pemstore/Cargo.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/common/pemstore/Cargo.toml b/common/pemstore/Cargo.toml index 8603c9bf08..9fbbcf263b 100644 --- a/common/pemstore/Cargo.toml +++ b/common/pemstore/Cargo.toml @@ -6,9 +6,6 @@ edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } [dependencies] pem = "0.8" From 316e984b0aeab0a582138b33dea5a2e83c9d5970 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 18:41:46 -0500 Subject: [PATCH 441/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 1a48861b94..3882d6de4f 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -4,10 +4,6 @@ on: release: types: [created] -env: - ACTIONS_RUNNER_DEBUG: true - ACTIONS_STEP_DEBUG: true - defaults: run: working-directory: nym-connect @@ -18,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [windows10] + platform: [windows-latest] runs-on: ${{ matrix.platform }} steps: @@ -61,12 +57,6 @@ jobs: run: yarn working-directory: nym-connect - - name: Check if rustc is available - run: rustc --version - - - name: Check if cargo is available - run: cargo --version - - name: Build and sign it env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From d867e0e244150bafe13d8f3ab1951b0452a7bdc0 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 19:13:33 -0500 Subject: [PATCH 442/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 3882d6de4f..71830fd45b 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [windows-latest] + platform: [windows10] runs-on: ${{ matrix.platform }} steps: From 13e3a79a93687ca4d10b897030e0ee7e7152603a Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 19:19:27 -0500 Subject: [PATCH 443/591] trying to fix windows build --- .../workflows/nym-connect-publish-windows10.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 71830fd45b..e48409cd40 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -4,6 +4,10 @@ on: release: types: [created] +env: + ACTIONS_RUNNER_DEBUG: true + ACTIONS_STEP_DEBUG: true + defaults: run: working-directory: nym-connect @@ -45,7 +49,9 @@ jobs: node-version: 16 - name: Install Rust stable - uses: dtolnay/rust-toolchain@stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 @@ -57,6 +63,12 @@ jobs: run: yarn working-directory: nym-connect + - name: Check if rustc is available + run: rustc --version + + - name: Check if cargo is available + run: cargo --version + - name: Build and sign it env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 19c1ef66c86c6fd9faea4e8dd53e27caf2b1e2fa Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 19:44:12 -0500 Subject: [PATCH 444/591] trying to fix windows build --- contracts/vesting/build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/vesting/build.rs b/contracts/vesting/build.rs index 01b3a20dc6..7245a3647d 100644 --- a/contracts/vesting/build.rs +++ b/contracts/vesting/build.rs @@ -4,5 +4,6 @@ use vergen::{vergen, Config}; fn main() { + #[cfg(not(target_family = "windows"))] vergen(Config::default()).expect("failed to extract build metadata") } From 4ecd2525618e3d407909d9979b5092969f6d1d0c Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 21 Feb 2023 20:08:27 -0500 Subject: [PATCH 445/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 7 ++----- contracts/vesting/build.rs | 1 - 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index e48409cd40..9977bae2fa 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -63,11 +63,8 @@ jobs: run: yarn working-directory: nym-connect - - name: Check if rustc is available - run: rustc --version - - - name: Check if cargo is available - run: cargo --version + - name: Add safe directory + run: git config --global --add safe.directory "*" - name: Build and sign it env: diff --git a/contracts/vesting/build.rs b/contracts/vesting/build.rs index 7245a3647d..01b3a20dc6 100644 --- a/contracts/vesting/build.rs +++ b/contracts/vesting/build.rs @@ -4,6 +4,5 @@ use vergen::{vergen, Config}; fn main() { - #[cfg(not(target_family = "windows"))] vergen(Config::default()).expect("failed to extract build metadata") } From af9df88a48c3f224cf9be0562b6daf935e560d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 22 Feb 2023 09:22:35 +0100 Subject: [PATCH 446/591] ci: bandaid for running out of disk space on ubuntu --- .github/workflows/nightly_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index bceae87b4f..78ae755570 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -65,7 +65,7 @@ jobs: - name: Reclaim some disk space (because Windows is being annoying) uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: command: clean From ceec4da27d19e06a302b9466e9752e312807a0d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 22 Feb 2023 11:38:07 +0100 Subject: [PATCH 447/591] nymsphinx: use published sphinx-packet crate (#3083) --- Cargo.lock | 7 ++++--- common/nymsphinx/types/Cargo.toml | 8 ++++---- common/nymsphinx/types/src/lib.rs | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2acc50931d..7235f28297 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3948,7 +3948,7 @@ dependencies = [ name = "nym-sphinx-types" version = "0.1.0" dependencies = [ - "sphinx", + "sphinx-packet", ] [[package]] @@ -5705,9 +5705,10 @@ dependencies = [ ] [[package]] -name = "sphinx" +name = "sphinx-packet" version = "0.1.0" -source = "git+https://github.com/nymtech/sphinx?rev=e05a1992522ed0afd3c6fcac160313ffc9bb306a#e05a1992522ed0afd3c6fcac160313ffc9bb306a" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc43eda802856ee82a7555c7b75ceb9e07451741c7a2f5f23d036020e01189d4" dependencies = [ "aes 0.7.5", "arrayref", diff --git a/common/nymsphinx/types/Cargo.toml b/common/nymsphinx/types/Cargo.toml index 2461691c1a..9eaa417b42 100644 --- a/common/nymsphinx/types/Cargo.toml +++ b/common/nymsphinx/types/Cargo.toml @@ -9,8 +9,8 @@ readme = { workspace = true } homepage = { workspace = true } documentation = { workspace = true } -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] -sphinx = { git = "https://github.com/nymtech/sphinx", rev="e05a1992522ed0afd3c6fcac160313ffc9bb306a" } -#sphinx = { path = "../../../../sphinx"} +sphinx-packet = { version = "0.1.0" } + +#[patch.crates-io] +#sphinx-packet = { path = "../../../../sphinx" } diff --git a/common/nymsphinx/types/src/lib.rs b/common/nymsphinx/types/src/lib.rs index d3f8d629e4..e80268ada0 100644 --- a/common/nymsphinx/types/src/lib.rs +++ b/common/nymsphinx/types/src/lib.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // re-exporting types and constants available in sphinx -pub use sphinx::{ +pub use sphinx_packet::{ constants::{ self, DESTINATION_ADDRESS_LENGTH, IDENTIFIER_LENGTH, MAX_PATH_LENGTH, NODE_ADDRESS_LENGTH, PAYLOAD_KEY_SIZE, From 2b5c426d67ea743def85c5a11426f1380428a3b8 Mon Sep 17 00:00:00 2001 From: benedettadavico Date: Wed, 22 Feb 2023 12:36:47 +0100 Subject: [PATCH 448/591] adding CI for api tests --- .github/workflows/run-api-tests.yml | 22 ++++++++++++++++++++++ Makefile | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/run-api-tests.yml diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml new file mode 100644 index 0000000000..9eca6539b8 --- /dev/null +++ b/.github/workflows/run-api-tests.yml @@ -0,0 +1,22 @@ +name: CI for Nym API Tests + +on: + push: + paths: 'nym-api/**' + +defaults: + run: + working-directory: nym-api/tests + +jobs: + build: + - name: Install Dependencies (Linux) + run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true + + - name: Use correct nvm version + run: nvm use v18.1.0 + + - name: Run tests + run: yarn test:qa + working-directory: nym-api/tests diff --git a/Makefile b/Makefile index 3f4c1725d2..5ae3c7d51a 100644 --- a/Makefile +++ b/Makefile @@ -134,5 +134,5 @@ generate-typescript: cd tools/ts-rs-cli && cargo run && cd ../.. yarn types:lint:fix -run-validator-tests: +run-api-tests: cd nym-api/tests/functional_test && yarn test:qa From ba64c4f8b3d84cf8688f332ef9639d9465d89703 Mon Sep 17 00:00:00 2001 From: benedettadavico Date: Wed, 22 Feb 2023 12:52:06 +0100 Subject: [PATCH 449/591] Edit broken file --- .github/workflows/run-api-tests.yml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml index 9eca6539b8..02621beffe 100644 --- a/.github/workflows/run-api-tests.yml +++ b/.github/workflows/run-api-tests.yml @@ -1,22 +1,23 @@ name: CI for Nym API Tests - -on: +'on': push: - paths: 'nym-api/**' - + paths: + - nym-api/** defaults: run: working-directory: nym-api/tests - jobs: - build: - - name: Install Dependencies (Linux) - run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools - continue-on-error: true - + test: + name: nym-api tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 - name: Use correct nvm version run: nvm use v18.1.0 - + - name: Install yarn + run: yarn install + - name: Run yarn + run: yarn - name: Run tests - run: yarn test:qa + run: 'yarn test:qa' working-directory: nym-api/tests From 4e829ef540163d5846cdd1340f486912b06945ed Mon Sep 17 00:00:00 2001 From: benedetta davico <46782255+benedettadavico@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:04:19 +0100 Subject: [PATCH 450/591] Update run-api-tests.yml --- .github/workflows/run-api-tests.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml index 02621beffe..6f3576ff93 100644 --- a/.github/workflows/run-api-tests.yml +++ b/.github/workflows/run-api-tests.yml @@ -1,8 +1,8 @@ name: CI for Nym API Tests -'on': +on: push: paths: - - nym-api/** + - 'nym-api/**' defaults: run: working-directory: nym-api/tests @@ -12,12 +12,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Use correct nvm version - run: nvm use v18.1.0 + - name: Use node v18 + uses: actions/setup-node@v3 + with: + node-version: 18.1.0 - name: Install yarn run: yarn install - name: Run yarn run: yarn - name: Run tests - run: 'yarn test:qa' + run: yarn test:qa working-directory: nym-api/tests From 5f7270acc8903d126dc90e38f70ddd5d3eae877b Mon Sep 17 00:00:00 2001 From: benedetta davico <46782255+benedettadavico@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:12:37 +0100 Subject: [PATCH 451/591] Update run-api-tests.yml --- .github/workflows/run-api-tests.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml index 6f3576ff93..611f427a58 100644 --- a/.github/workflows/run-api-tests.yml +++ b/.github/workflows/run-api-tests.yml @@ -1,25 +1,33 @@ + name: CI for Nym API Tests + on: push: paths: - - 'nym-api/**' + - "nym-api/**" + defaults: run: working-directory: nym-api/tests + jobs: test: name: nym-api tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Use node v18 + + - name: Node v18 uses: actions/setup-node@v3 with: node-version: 18.1.0 + - name: Install yarn run: yarn install + - name: Run yarn run: yarn + - name: Run tests - run: yarn test:qa + run: yarn test working-directory: nym-api/tests From 7b7cac505415160cfbb8cca79fc539bb251b0710 Mon Sep 17 00:00:00 2001 From: benedetta davico <46782255+benedettadavico@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:15:07 +0100 Subject: [PATCH 452/591] Update run-api-tests.yml --- .github/workflows/run-api-tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml index 611f427a58..c54d8ef611 100644 --- a/.github/workflows/run-api-tests.yml +++ b/.github/workflows/run-api-tests.yml @@ -1,4 +1,3 @@ - name: CI for Nym API Tests on: From 2dc3999c77594f13ace7db0cb437c7ae2a051b77 Mon Sep 17 00:00:00 2001 From: benedetta davico <46782255+benedettadavico@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:20:51 +0100 Subject: [PATCH 453/591] Update run-api-tests.yml --- .github/workflows/run-api-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml index c54d8ef611..48a653f8ab 100644 --- a/.github/workflows/run-api-tests.yml +++ b/.github/workflows/run-api-tests.yml @@ -1,6 +1,7 @@ name: CI for Nym API Tests on: + workflow_dispatch: push: paths: - "nym-api/**" From 7c86ef4cbcac5584e8dca4d539d27ca9bb737e65 Mon Sep 17 00:00:00 2001 From: benedetta davico <46782255+benedettadavico@users.noreply.github.com> Date: Wed, 22 Feb 2023 13:22:49 +0100 Subject: [PATCH 454/591] Update run-api-tests.yml --- .github/workflows/run-api-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml index 48a653f8ab..c33eebd2d3 100644 --- a/.github/workflows/run-api-tests.yml +++ b/.github/workflows/run-api-tests.yml @@ -29,5 +29,5 @@ jobs: run: yarn - name: Run tests - run: yarn test + run: yarn test:qa working-directory: nym-api/tests From 699b032f2a206000bed010877735dc5f74bfab18 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 08:04:52 -0500 Subject: [PATCH 455/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 9977bae2fa..59f9a5f5c8 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [windows10] + platform: [windows-latest] runs-on: ${{ matrix.platform }} steps: @@ -81,7 +81,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: nym-connect_1.0.0_x64_en-US.msi - path: nym-connect/target/release/bundle/msi/nym-connect_1.0.0_x64_en-US.msi + path: nym-connect/target/release/bundle/msi/nym-connect_1.*.msi retention-days: 30 - name: Upload to release based on tag name From 300df601fa18cd6651b09975a67c8be7b001acc5 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 08:34:27 -0500 Subject: [PATCH 456/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 59f9a5f5c8..aa805049f8 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -60,7 +60,7 @@ jobs: encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }} - name: Install app dependencies - run: yarn + run: yarn --network-timeout 100000 working-directory: nym-connect - name: Add safe directory From 1ba23cf4b52d076c9b953ef5179779b9830cc8fd Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 09:02:42 -0500 Subject: [PATCH 457/591] trying to fix windows build --- .github/workflows/nym-connect-publish-windows10.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index aa805049f8..40f3bc7d56 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [windows-latest] + platform: [windows10] runs-on: ${{ matrix.platform }} steps: From 9b7f98518cf01ab3e5acdbebd99b716e982210a3 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 09:14:27 -0500 Subject: [PATCH 458/591] trying to fix windows build --- .../nym-wallet-publish-windows10.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/nym-wallet-publish-windows10.yml b/.github/workflows/nym-wallet-publish-windows10.yml index 6ea214808b..30500e0db1 100644 --- a/.github/workflows/nym-wallet-publish-windows10.yml +++ b/.github/workflows/nym-wallet-publish-windows10.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [windows10] + platform: [windows-latest] runs-on: ${{ matrix.platform }} steps: @@ -43,10 +43,10 @@ jobs: with: node-version: 16 -# - name: Install Rust stable -# uses: actions-rs/toolchain@v1 -# with: -# toolchain: stable + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable - name: Create env file uses: timheuer/base64-to-file@v1.1 @@ -55,7 +55,7 @@ jobs: encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }} - name: Install app dependencies - run: yarn + run: yarn --network-timeout 100000 - name: Build and sign it env: @@ -67,6 +67,13 @@ jobs: TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} run: yarn build + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: nym-wallet.0.0_x64_en-US.msi + path: nym-wallet/target/release/bundle/msi/nym-wallet_1.*.msi + retention-days: 30 + - name: Upload to release based on tag name uses: softprops/action-gh-release@v1 with: From 650d3eeae0ab66d5a82b3e4d8ab30ec16cbfdef8 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 09:15:34 -0500 Subject: [PATCH 459/591] trying to fix windows build --- .github/workflows/nym-wallet-publish-windows10.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nym-wallet-publish-windows10.yml b/.github/workflows/nym-wallet-publish-windows10.yml index 30500e0db1..39833bd3cd 100644 --- a/.github/workflows/nym-wallet-publish-windows10.yml +++ b/.github/workflows/nym-wallet-publish-windows10.yml @@ -1,5 +1,6 @@ name: Publish Nym Wallet (Windows 10) on: + workflow_dispatch: release: types: [created] @@ -9,7 +10,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release' }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: From 6c6233240988b217899b979bba09f869f5508aa1 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 09:16:19 -0500 Subject: [PATCH 460/591] add workflow dispatch to windows10 build --- .github/workflows/nym-wallet-publish-windows10.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nym-wallet-publish-windows10.yml b/.github/workflows/nym-wallet-publish-windows10.yml index 6f22820943..5eab299f9d 100644 --- a/.github/workflows/nym-wallet-publish-windows10.yml +++ b/.github/workflows/nym-wallet-publish-windows10.yml @@ -1,5 +1,6 @@ name: Publish Nym Wallet (Windows 10) on: + workflow_dispatch: release: types: [created] From fceef1afa623c465dcfba0004f3d938f690c62da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 22 Feb 2023 15:19:26 +0100 Subject: [PATCH 461/591] nymsphinx: clean up Cargo metadata (#3084) --- common/nymsphinx/Cargo.toml | 6 +----- common/nymsphinx/acknowledgements/Cargo.toml | 6 +----- common/nymsphinx/addressing/Cargo.toml | 6 +----- common/nymsphinx/anonymous-replies/Cargo.toml | 6 +----- common/nymsphinx/chunking/Cargo.toml | 4 +--- common/nymsphinx/cover/Cargo.toml | 6 +----- common/nymsphinx/forwarding/Cargo.toml | 6 +----- common/nymsphinx/framing/Cargo.toml | 6 +----- common/nymsphinx/params/Cargo.toml | 6 +----- common/nymsphinx/types/Cargo.toml | 4 +--- 10 files changed, 10 insertions(+), 46 deletions(-) diff --git a/common/nymsphinx/Cargo.toml b/common/nymsphinx/Cargo.toml index bb738f75d6..d5d10ea633 100644 --- a/common/nymsphinx/Cargo.toml +++ b/common/nymsphinx/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx" version = "0.1.0" +description = "Top-level crate for sphinx packets as used by the Nym mixnet" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] rand = { version = "0.7.3", features = ["wasm-bindgen"] } diff --git a/common/nymsphinx/acknowledgements/Cargo.toml b/common/nymsphinx/acknowledgements/Cargo.toml index 50d41e7bd9..3db7d909db 100644 --- a/common/nymsphinx/acknowledgements/Cargo.toml +++ b/common/nymsphinx/acknowledgements/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx-acknowledgements" version = "0.1.0" +description = "Sphinx packet ack messages" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] rand = { version = "0.7.3", features = ["wasm-bindgen"] } diff --git a/common/nymsphinx/addressing/Cargo.toml b/common/nymsphinx/addressing/Cargo.toml index 6b2aae04d4..f9c646e04b 100644 --- a/common/nymsphinx/addressing/Cargo.toml +++ b/common/nymsphinx/addressing/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx-addressing" version = "0.1.0" +description = "Nym mixnet addressing" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] nym-crypto = { path = "../../crypto", features = ["asymmetric"] } # all addresses are expressed in terms on their crypto keys diff --git a/common/nymsphinx/anonymous-replies/Cargo.toml b/common/nymsphinx/anonymous-replies/Cargo.toml index c9068d859d..40a6d19308 100644 --- a/common/nymsphinx/anonymous-replies/Cargo.toml +++ b/common/nymsphinx/anonymous-replies/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx-anonymous-replies" version = "0.1.0" +description = "Anonymous sphinx packet replies using singly-use-reply-blocks (SURB)" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] rand = { version = "0.7.3", features = ["wasm-bindgen"] } diff --git a/common/nymsphinx/chunking/Cargo.toml b/common/nymsphinx/chunking/Cargo.toml index 2e26f1626f..94bec5886b 100644 --- a/common/nymsphinx/chunking/Cargo.toml +++ b/common/nymsphinx/chunking/Cargo.toml @@ -1,13 +1,11 @@ [package] name = "nym-sphinx-chunking" version = "0.1.0" +description = "Sphinx packet chunking of underlying data packets" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/common/nymsphinx/cover/Cargo.toml b/common/nymsphinx/cover/Cargo.toml index 1e32ff500e..f1558d3676 100644 --- a/common/nymsphinx/cover/Cargo.toml +++ b/common/nymsphinx/cover/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx-cover" version = "0.1.0" +description = "Sphinx packets used as cover traffic" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] rand = { version = "0.7.3", features = ["wasm-bindgen"] } diff --git a/common/nymsphinx/forwarding/Cargo.toml b/common/nymsphinx/forwarding/Cargo.toml index bd1a6a830b..e4931b7d8b 100644 --- a/common/nymsphinx/forwarding/Cargo.toml +++ b/common/nymsphinx/forwarding/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx-forwarding" version = "0.1.0" +description = "Sphinx packet forwarding as Nym mix packets" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] nym-sphinx-addressing = { path = "../addressing" } diff --git a/common/nymsphinx/framing/Cargo.toml b/common/nymsphinx/framing/Cargo.toml index 90a8e94e5a..b510926555 100644 --- a/common/nymsphinx/framing/Cargo.toml +++ b/common/nymsphinx/framing/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx-framing" version = "0.1.0" +description = "Sphinx packet framing for the Nym mixnet" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] bytes = "1.0" diff --git a/common/nymsphinx/params/Cargo.toml b/common/nymsphinx/params/Cargo.toml index 319a55513d..6037bdb333 100644 --- a/common/nymsphinx/params/Cargo.toml +++ b/common/nymsphinx/params/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-sphinx-params" version = "0.1.0" +description = "Sphinx packet parameters for the Nym mixnet" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] thiserror = "1.0.37" diff --git a/common/nymsphinx/types/Cargo.toml b/common/nymsphinx/types/Cargo.toml index 9eaa417b42..53e399ebcf 100644 --- a/common/nymsphinx/types/Cargo.toml +++ b/common/nymsphinx/types/Cargo.toml @@ -1,13 +1,11 @@ [package] name = "nym-sphinx-types" version = "0.1.0" +description = "Re-export sphinx packet types" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } [dependencies] sphinx-packet = { version = "0.1.0" } From 17d5cea636b585d1b5c1eae342f0056766d2987a Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 09:43:34 -0500 Subject: [PATCH 462/591] test if workflow works without adding a safe directory --- .github/workflows/nym-connect-publish-windows10.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 40f3bc7d56..755450f89e 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -63,9 +63,6 @@ jobs: run: yarn --network-timeout 100000 working-directory: nym-connect - - name: Add safe directory - run: git config --global --add safe.directory "*" - - name: Build and sign it env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From cfa8854ada8866c90b2c7bfe2fee884b8826d24d Mon Sep 17 00:00:00 2001 From: benedettadavico Date: Wed, 22 Feb 2023 15:48:59 +0100 Subject: [PATCH 463/591] cleaning up api tests --- .../circulating-supply.test.ts | 23 +- .../mixnode/contract-cache-mixnode.test.ts | 72 +- .../status/status-gateway.test.ts | 1 - .../status/status-mixnode.test.ts | 32 +- .../tests/src/endpoints/CirculatingSupply.ts | 14 + nym-api/tests/src/endpoints/Status.ts | 8 +- .../tests/src/types/CirculatingSupplyTypes.ts | 2 +- nym-api/tests/yarn.lock | 4064 ++++++++--------- 8 files changed, 2104 insertions(+), 2112 deletions(-) diff --git a/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts b/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts index e2961d380d..f3362574bf 100644 --- a/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts +++ b/nym-api/tests/functional_test/circulating_supply/circulating-supply.test.ts @@ -11,13 +11,22 @@ describe("Get circulating supply", (): void => { it("Get circulating supply amounts", async (): Promise => { const response = await contract.getCirculatingSupply(); - - let initial: number = +response.initial_supply.amount; - let mixmining: number = +response.mixmining_reserve.amount; - let vest: number = +response.vesting_tokens.amount; - let circsupply: number = +response.circulating_supply.amount; + const initial: number = +response.total_supply.amount; + const mixmining: number = +response.mixmining_reserve.amount; + const vest: number = +response.vesting_tokens.amount; + const circsupply: number = +response.circulating_supply.amount; expect(typeof response.vesting_tokens.amount).toBe("string"); expect(initial - mixmining - vest).toStrictEqual(circsupply); - }); - }); \ No newline at end of file + }); + + it("Get total supply value", async (): Promise => { + const response = await contract.getTotalSupplyValue(); + expect(response).toStrictEqual(1000000000); + }); + + it("Get circulating supply value", async (): Promise => { + const response = await contract.getCirculatingSupplyValue(); + expect(typeof response).toBe("number"); + }); +}); diff --git a/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts index e3637a3fe7..1605cd0bf4 100644 --- a/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts +++ b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts @@ -12,7 +12,6 @@ describe("Get mixnode data", (): void => { it("Get all mixnodes", async (): Promise => { const response = await contract.getMixnodes(); - response.forEach((mixnode) => { //bond information overview expect(typeof mixnode.bond_information.mix_id).toBe("number"); @@ -40,17 +39,15 @@ describe("Get mixnode data", (): void => { const identitykey = mixnode.bond_information.mix_node.identity_key; if (typeof identitykey === "string") { if (identitykey.length === 43) { - return true - } - else expect(identitykey).toHaveLength(44); + return true; + } else expect(identitykey).toHaveLength(44); } - const sphinx = mixnode.bond_information.mix_node.sphinx_key + const sphinx = mixnode.bond_information.mix_node.sphinx_key; if (typeof sphinx === "string") { if (sphinx.length === 43) { - return true - } - else expect(sphinx).toHaveLength(44); + return true; + } else expect(sphinx).toHaveLength(44); } //rewarding details @@ -63,7 +60,6 @@ describe("Get mixnode data", (): void => { expect(typeof mixnode.rewarding_details.unit_delegation).toBe("string"); expect(typeof mixnode.rewarding_details.last_rewarded_epoch).toBe("number"); expect(typeof mixnode.rewarding_details.unique_delegations).toBe("number"); - }); }); @@ -76,7 +72,8 @@ describe("Get mixnode data", (): void => { expect(typeof mixnode.performance).toBe("string"); expect(typeof mixnode.uncapped_stake_saturation).toBe("string"); expect(typeof mixnode.stake_saturation).toBe("string"); - expect(typeof mixnode.family).toBe("string"); + // TODO why family is tempermental + // expect(typeof mixnode.family).toBe("string"); //mixnode details bond info expect(typeof mixnode.mixnode_details.bond_information.mix_id).toBe("number") @@ -89,75 +86,71 @@ describe("Get mixnode data", (): void => { if (mixnode.mixnode_details.bond_information.proxy === null) { return true; - } - else { + } else { expect(typeof mixnode.mixnode_details.bond_information.proxy).toBe("string"); } //mixnode - expect(typeof mixnode.mixnode_details.bond_information.mix_node.host).toBe("string") + expect(typeof mixnode.mixnode_details.bond_information.mix_node.host).toBe("string"); expect(mixnode.mixnode_details.bond_information.mix_node.http_api_port).toStrictEqual(8000); - expect(typeof mixnode.mixnode_details.bond_information.mix_node.verloc_port).toBe("number") - expect(typeof mixnode.mixnode_details.bond_information.mix_node.mix_port).toBe("number") + expect(typeof mixnode.mixnode_details.bond_information.mix_node.verloc_port).toBe("number"); + expect(typeof mixnode.mixnode_details.bond_information.mix_node.mix_port).toBe("number"); expect(mixnode.mixnode_details.bond_information.mix_node.mix_port).toStrictEqual(1789); - expect(mixnode.mixnode_details.bond_information.mix_node.verloc_port).toStrictEqual(1790) + expect(mixnode.mixnode_details.bond_information.mix_node.verloc_port).toStrictEqual(1790); - let identitykey2 = mixnode.mixnode_details.bond_information.mix_node.identity_key + const identitykey2 = mixnode.mixnode_details.bond_information.mix_node.identity_key if (typeof identitykey2 === "string") { if (identitykey2.length === 43) { - return true - } - else expect(identitykey2).toHaveLength(44); + return true; + } else expect(identitykey2).toHaveLength(44); } - let sphinx2 = mixnode.mixnode_details.bond_information.mix_node.sphinx_key + const sphinx2 = mixnode.mixnode_details.bond_information.mix_node.sphinx_key if (typeof sphinx2 === "string") { if (sphinx2.length === 43) { - return true - } - else expect(sphinx2).toHaveLength(44); + return true; + } else expect(sphinx2).toHaveLength(44); } //mixnode rewarding info - expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBe("string") - expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.denom).toBe("string") - expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.amount).toBe("string") - expect(typeof mixnode.mixnode_details.rewarding_details.operator).toBe("string") - expect(typeof mixnode.mixnode_details.rewarding_details.delegates).toBe("string") - expect(typeof mixnode.mixnode_details.rewarding_details.total_unit_reward).toBe("string") - expect(typeof mixnode.mixnode_details.rewarding_details.unit_delegation).toBe("string") - expect(typeof mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBe("number") - expect(typeof mixnode.mixnode_details.rewarding_details.unique_delegations).toBe("number") - + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBe("string"); + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.denom).toBe("string"); + expect(typeof mixnode.mixnode_details.rewarding_details.cost_params.interval_operating_cost.amount).toBe("string"); + expect(typeof mixnode.mixnode_details.rewarding_details.operator).toBe("string"); + expect(typeof mixnode.mixnode_details.rewarding_details.delegates).toBe("string"); + expect(typeof mixnode.mixnode_details.rewarding_details.total_unit_reward).toBe("string"); + expect(typeof mixnode.mixnode_details.rewarding_details.unit_delegation).toBe("string"); + expect(typeof mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBe("number"); + expect(typeof mixnode.mixnode_details.rewarding_details.unique_delegations).toBe("number"); }); }); it("Get active mixnodes", async (): Promise => { const response = await contract.getActiveMixnodes(); response.forEach(function (mixnode) { - expect(mixnode.rewarding_details.cost_params.profit_margin_percent).toBeTruthy() - expect(typeof mixnode.bond_information.layer).toBe("number") + expect(mixnode.rewarding_details.cost_params.profit_margin_percent).toBeTruthy(); + expect(typeof mixnode.bond_information.layer).toBe("number"); }); }); it("Get active mixnodes detailed", async (): Promise => { const response = await contract.getActiveMixnodesDetailed(); response.forEach(function (mixnode) { - expect(mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBeTruthy() + expect(mixnode.mixnode_details.rewarding_details.cost_params.profit_margin_percent).toBeTruthy(); }); }); it("Get rewarded mixnodes", async (): Promise => { const response = await contract.getRewardedMixnodes(); response.forEach(function (mixnode) { - expect(mixnode.rewarding_details.last_rewarded_epoch).toBeTruthy() + expect(mixnode.rewarding_details.last_rewarded_epoch).toBeTruthy(); }); }); it("Get rewarded mixnodes detailed", async (): Promise => { const response = await contract.getRewardedMixnodesDetailed(); response.forEach(function (mixnode) { - expect(mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBeTruthy() + expect(mixnode.mixnode_details.rewarding_details.last_rewarded_epoch).toBeTruthy(); }); }); @@ -167,5 +160,4 @@ describe("Get mixnode data", (): void => { expect(typeof value).toBe("number"); }); }); - }); diff --git a/nym-api/tests/functional_test/status/status-gateway.test.ts b/nym-api/tests/functional_test/status/status-gateway.test.ts index 9c046cd2b7..b14b71ddb8 100644 --- a/nym-api/tests/functional_test/status/status-gateway.test.ts +++ b/nym-api/tests/functional_test/status/status-gateway.test.ts @@ -46,5 +46,4 @@ describe("Get gateway data", (): void => { expect(typeof response.last_hour).toBe("number"); expect(typeof response.last_day).toBe("number"); }); - }); diff --git a/nym-api/tests/functional_test/status/status-mixnode.test.ts b/nym-api/tests/functional_test/status/status-mixnode.test.ts index ca2880dd00..1a6b02f655 100644 --- a/nym-api/tests/functional_test/status/status-mixnode.test.ts +++ b/nym-api/tests/functional_test/status/status-mixnode.test.ts @@ -40,9 +40,9 @@ describe("Get mixnode data", (): void => { const response = await status.getMixnodeHistory(identity_key); response.history.forEach((x) => { - console.log(x.date); - console.log(x.uptime); - }) + expect(typeof x.date).toBe("string"); + expect(typeof x.uptime).toBe("number"); + }); expect(identity_key).toStrictEqual(response.mix_id); expect(typeof response.owner).toBe("string"); @@ -79,42 +79,38 @@ describe("Get mixnode data", (): void => { expect(typeof response.in_active).toBe("string"); }); - it("Get all mixnodes inclusion probability", async (): Promise => { + it("Get all mixnodes inclusion probabilities", async (): Promise => { const response = await status.getAllMixnodeInclusionProbability(); - - expect(response.inclusion_probabilities).toBeTruthy(); + expect(typeof response.inclusion_probabilities[0].mix_id).toBe("number"); + expect(typeof response.inclusion_probabilities[0].in_active).toBe("number"); + expect(typeof response.delta_max).toBe("number"); }); it("Get all mixnodes", async (): Promise => { const response = await status.getDetailedMixnodes(); - - expect(typeof response.stake_saturation).toBe("string"); + expect(typeof response[0].stake_saturation).toBe("string"); }); it("Get all rewarded mixnodes", async (): Promise => { const response = await status.getDetailedRewardedMixnodes(); - - expect(typeof response.mixnode_details.rewarding_details.last_rewarded_epoch).toBe("number"); + expect(typeof response[0].mixnode_details.rewarding_details.last_rewarded_epoch).toBe("number"); }); it("Get all active mixnodes", async (): Promise => { const response = await status.getDetailedActiveMixnodes(); - expect(typeof response.mixnode_details.bond_information.layer).toBe("number"); + expect(typeof response[0].mixnode_details.bond_information.layer).toBe("number"); }); - }); describe("Compute mixnode reward estimation", (): void => { beforeAll(async (): Promise => { status = new Status(); config = ConfigHandler.getInstance(); - }); - it("with correct data", async (): Promise => { - const response = await status.sendMixnodeRewardEstimatedComputation(8); - const body = - - expect(typeof response.estimation.total_node_reward).toBe("string"); }); + it("with correct data", async (): Promise => { + const response = await status.sendMixnodeRewardEstimatedComputation(7); + expect(typeof response.estimation.delegates).toBe("string"); + }); }); diff --git a/nym-api/tests/src/endpoints/CirculatingSupply.ts b/nym-api/tests/src/endpoints/CirculatingSupply.ts index 8d5153d9a1..022a143c4b 100644 --- a/nym-api/tests/src/endpoints/CirculatingSupply.ts +++ b/nym-api/tests/src/endpoints/CirculatingSupply.ts @@ -12,4 +12,18 @@ export default class ContractCache extends APIClient { }); return response.data; } + + public async getTotalSupplyValue(): Promise { + const response = await this.restClient.sendGet({ + route: `circulating-supply/total-supply-value`, + }); + return response.data; + } + + public async getCirculatingSupplyValue(): Promise { + const response = await this.restClient.sendGet({ + route: `circulating-supply/circulating-supply-value`, + }); + return response.data; + } } diff --git a/nym-api/tests/src/endpoints/Status.ts b/nym-api/tests/src/endpoints/Status.ts index 53c121859a..de6aa7da9c 100644 --- a/nym-api/tests/src/endpoints/Status.ts +++ b/nym-api/tests/src/endpoints/Status.ts @@ -147,13 +147,13 @@ export default class Status extends APIClient { public async getAllMixnodeInclusionProbability(): Promise { const response = await this.restClient.sendGet({ - route: `/mixnodes/inclusion-probability`, + route: `/mixnodes/inclusion_probability`, }); return response.data; } - public async getDetailedMixnodes(): Promise { + public async getDetailedMixnodes(): Promise { const response = await this.restClient.sendGet({ route: `/mixnodes/detailed`, }); @@ -161,7 +161,7 @@ export default class Status extends APIClient { return response.data; } - public async getDetailedRewardedMixnodes(): Promise { + public async getDetailedRewardedMixnodes(): Promise { const response = await this.restClient.sendGet({ route: `/mixnodes/rewarded/detailed`, }); @@ -169,7 +169,7 @@ export default class Status extends APIClient { return response.data; } - public async getDetailedActiveMixnodes(): Promise { + public async getDetailedActiveMixnodes(): Promise { const response = await this.restClient.sendGet({ route: `/mixnodes/active/detailed`, }); diff --git a/nym-api/tests/src/types/CirculatingSupplyTypes.ts b/nym-api/tests/src/types/CirculatingSupplyTypes.ts index e2b3abbf2e..6ea3454d9a 100644 --- a/nym-api/tests/src/types/CirculatingSupplyTypes.ts +++ b/nym-api/tests/src/types/CirculatingSupplyTypes.ts @@ -1,5 +1,5 @@ export type Detailed = { - initial_supply: InitialSupply; + total_supply: InitialSupply; mixmining_reserve: MixminingReserve; vesting_tokens: VestingTokens; circulating_supply: CirculatingSupply; diff --git a/nym-api/tests/yarn.lock b/nym-api/tests/yarn.lock index 57b3910ded..09186f794d 100644 --- a/nym-api/tests/yarn.lock +++ b/nym-api/tests/yarn.lock @@ -3,29 +3,29 @@ "@ampproject/remapping@^2.1.0": - "integrity" "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==" - "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - "version" "2.2.0" + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - "integrity" "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.18.8": - "integrity" "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" - "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz" - "version" "7.18.8" + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": - "integrity" "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==" - "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" - "version" "7.18.10" +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" @@ -37,62 +37,62 @@ "@babel/template" "^7.18.10" "@babel/traverse" "^7.18.10" "@babel/types" "^7.18.10" - "convert-source-map" "^1.7.0" - "debug" "^4.1.0" - "gensync" "^1.0.0-beta.2" - "json5" "^2.2.1" - "semver" "^6.3.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" "@babel/generator@^7.18.10", "@babel/generator@^7.7.2": - "integrity" "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==" - "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" - "version" "7.18.12" + version "7.18.12" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz" + integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== dependencies: "@babel/types" "^7.18.10" "@jridgewell/gen-mapping" "^0.3.2" - "jsesc" "^2.5.1" + jsesc "^2.5.1" "@babel/helper-compilation-targets@^7.18.9": - "integrity" "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==" - "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" - "version" "7.18.9" + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: "@babel/compat-data" "^7.18.8" "@babel/helper-validator-option" "^7.18.6" - "browserslist" "^4.20.2" - "semver" "^6.3.0" + browserslist "^4.20.2" + semver "^6.3.0" "@babel/helper-environment-visitor@^7.18.9": - "integrity" "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - "version" "7.18.9" + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-function-name@^7.18.9": - "integrity" "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==" - "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" - "version" "7.18.9" + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== dependencies: "@babel/template" "^7.18.6" "@babel/types" "^7.18.9" "@babel/helper-hoist-variables@^7.18.6": - "integrity" "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==" - "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-imports@^7.18.6": - "integrity" "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-transforms@^7.18.9": - "integrity" "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==" - "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" - "version" "7.18.9" + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -104,166 +104,166 @@ "@babel/types" "^7.18.9" "@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.8.0": - "integrity" "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" - "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" - "version" "7.18.9" + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== "@babel/helper-simple-access@^7.18.6": - "integrity" "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==" - "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== dependencies: "@babel/types" "^7.18.6" "@babel/helper-split-export-declaration@^7.18.6": - "integrity" "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==" - "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.18.10": - "integrity" "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" - "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" - "version" "7.18.10" + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== "@babel/helper-validator-identifier@^7.18.6": - "integrity" "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== "@babel/helper-validator-option@^7.18.6": - "integrity" "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helpers@^7.18.9": - "integrity" "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==" - "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" - "version" "7.18.9" + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== dependencies: "@babel/template" "^7.18.6" "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" "@babel/highlight@^7.18.6": - "integrity" "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==" - "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" - "chalk" "^2.0.0" - "js-tokens" "^4.0.0" + chalk "^2.0.0" + js-tokens "^4.0.0" "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11": - "integrity" "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==" - "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz" - "version" "7.18.11" + version "7.18.11" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz" + integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== "@babel/plugin-syntax-async-generators@^7.8.4": - "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - "version" "7.8.4" + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": - "integrity" "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - "version" "7.12.13" + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": - "integrity" "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": - "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": - "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - "version" "7.10.4" + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": - "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": - "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - "version" "7.8.3" + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": - "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - "version" "7.14.5" + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - "integrity" "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==" - "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - "version" "7.18.6" + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": - "integrity" "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==" - "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" - "version" "7.18.10" + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== dependencies: "@babel/code-frame" "^7.18.6" "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": - "integrity" "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==" - "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz" - "version" "7.18.11" + version "7.18.11" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz" + integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.18.10" @@ -273,89 +273,89 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/parser" "^7.18.11" "@babel/types" "^7.18.10" - "debug" "^4.1.0" - "globals" "^11.1.0" + debug "^4.1.0" + globals "^11.1.0" "@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - "integrity" "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==" - "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz" - "version" "7.18.10" + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz" + integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== dependencies: "@babel/helper-string-parser" "^7.18.10" "@babel/helper-validator-identifier" "^7.18.6" - "to-fast-properties" "^2.0.0" + to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": - "integrity" "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - "resolved" "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - "version" "0.2.3" + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@eslint/eslintrc@^1.3.0": - "integrity" "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==" - "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz" - "version" "1.3.0" + version "1.3.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== dependencies: - "ajv" "^6.12.4" - "debug" "^4.3.2" - "espree" "^9.3.2" - "globals" "^13.15.0" - "ignore" "^5.2.0" - "import-fresh" "^3.2.1" - "js-yaml" "^4.1.0" - "minimatch" "^3.1.2" - "strip-json-comments" "^3.1.1" + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" "@humanwhocodes/config-array@^0.10.4": - "integrity" "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz" - "version" "0.10.4" + version "0.10.4" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== dependencies: "@humanwhocodes/object-schema" "^1.2.1" - "debug" "^4.1.1" - "minimatch" "^3.0.4" + debug "^4.1.1" + minimatch "^3.0.4" "@humanwhocodes/gitignore-to-minimatch@^1.0.2": - "integrity" "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz" - "version" "1.0.2" + version "1.0.2" + resolved "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== "@humanwhocodes/object-schema@^1.2.1": - "integrity" "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - "version" "1.2.1" + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": - "integrity" "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==" - "resolved" "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - "version" "1.1.0" + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: - "camelcase" "^5.3.1" - "find-up" "^4.1.0" - "get-package-type" "^0.1.0" - "js-yaml" "^3.13.1" - "resolve-from" "^5.0.0" + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - "integrity" "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" - "resolved" "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - "version" "0.1.3" + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^28.1.3": - "integrity" "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==" - "resolved" "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== dependencies: "@jest/types" "^28.1.3" "@types/node" "*" - "chalk" "^4.0.0" - "jest-message-util" "^28.1.3" - "jest-util" "^28.1.3" - "slash" "^3.0.0" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" "@jest/core@^28.1.3": - "integrity" "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==" - "resolved" "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== dependencies: "@jest/console" "^28.1.3" "@jest/reporters" "^28.1.3" @@ -363,80 +363,80 @@ "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - "ansi-escapes" "^4.2.1" - "chalk" "^4.0.0" - "ci-info" "^3.2.0" - "exit" "^0.1.2" - "graceful-fs" "^4.2.9" - "jest-changed-files" "^28.1.3" - "jest-config" "^28.1.3" - "jest-haste-map" "^28.1.3" - "jest-message-util" "^28.1.3" - "jest-regex-util" "^28.0.2" - "jest-resolve" "^28.1.3" - "jest-resolve-dependencies" "^28.1.3" - "jest-runner" "^28.1.3" - "jest-runtime" "^28.1.3" - "jest-snapshot" "^28.1.3" - "jest-util" "^28.1.3" - "jest-validate" "^28.1.3" - "jest-watcher" "^28.1.3" - "micromatch" "^4.0.4" - "pretty-format" "^28.1.3" - "rimraf" "^3.0.0" - "slash" "^3.0.0" - "strip-ansi" "^6.0.0" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" + micromatch "^4.0.4" + pretty-format "^28.1.3" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" "@jest/environment@^28.1.3": - "integrity" "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==" - "resolved" "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== dependencies: "@jest/fake-timers" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - "jest-mock" "^28.1.3" + jest-mock "^28.1.3" "@jest/expect-utils@^28.1.3": - "integrity" "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==" - "resolved" "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== dependencies: - "jest-get-type" "^28.0.2" + jest-get-type "^28.0.2" "@jest/expect@^28.1.3": - "integrity" "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==" - "resolved" "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== dependencies: - "expect" "^28.1.3" - "jest-snapshot" "^28.1.3" + expect "^28.1.3" + jest-snapshot "^28.1.3" "@jest/fake-timers@^28.1.3": - "integrity" "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==" - "resolved" "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== dependencies: "@jest/types" "^28.1.3" "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - "jest-message-util" "^28.1.3" - "jest-mock" "^28.1.3" - "jest-util" "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" "@jest/globals@^28.1.3": - "integrity" "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==" - "resolved" "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== dependencies: "@jest/environment" "^28.1.3" "@jest/expect" "^28.1.3" "@jest/types" "^28.1.3" "@jest/reporters@^28.1.3": - "integrity" "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==" - "resolved" "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== dependencies: "@bcoe/v8-coverage" "^0.2.3" "@jest/console" "^28.1.3" @@ -445,178 +445,178 @@ "@jest/types" "^28.1.3" "@jridgewell/trace-mapping" "^0.3.13" "@types/node" "*" - "chalk" "^4.0.0" - "collect-v8-coverage" "^1.0.0" - "exit" "^0.1.2" - "glob" "^7.1.3" - "graceful-fs" "^4.2.9" - "istanbul-lib-coverage" "^3.0.0" - "istanbul-lib-instrument" "^5.1.0" - "istanbul-lib-report" "^3.0.0" - "istanbul-lib-source-maps" "^4.0.0" - "istanbul-reports" "^3.1.3" - "jest-message-util" "^28.1.3" - "jest-util" "^28.1.3" - "jest-worker" "^28.1.3" - "slash" "^3.0.0" - "string-length" "^4.0.1" - "strip-ansi" "^6.0.0" - "terminal-link" "^2.0.0" - "v8-to-istanbul" "^9.0.1" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.1" "@jest/schemas@^28.1.3": - "integrity" "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==" - "resolved" "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== dependencies: "@sinclair/typebox" "^0.24.1" "@jest/source-map@^28.1.2": - "integrity" "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==" - "resolved" "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" - "version" "28.1.2" + version "28.1.2" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== dependencies: "@jridgewell/trace-mapping" "^0.3.13" - "callsites" "^3.0.0" - "graceful-fs" "^4.2.9" + callsites "^3.0.0" + graceful-fs "^4.2.9" "@jest/test-result@^28.1.3": - "integrity" "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==" - "resolved" "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== dependencies: "@jest/console" "^28.1.3" "@jest/types" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" - "collect-v8-coverage" "^1.0.0" + collect-v8-coverage "^1.0.0" "@jest/test-sequencer@^28.1.3": - "integrity" "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==" - "resolved" "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== dependencies: "@jest/test-result" "^28.1.3" - "graceful-fs" "^4.2.9" - "jest-haste-map" "^28.1.3" - "slash" "^3.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" "@jest/transform@^28.1.3": - "integrity" "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==" - "resolved" "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" - "version" "28.1.3" + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== dependencies: "@babel/core" "^7.11.6" "@jest/types" "^28.1.3" "@jridgewell/trace-mapping" "^0.3.13" - "babel-plugin-istanbul" "^6.1.1" - "chalk" "^4.0.0" - "convert-source-map" "^1.4.0" - "fast-json-stable-stringify" "^2.0.0" - "graceful-fs" "^4.2.9" - "jest-haste-map" "^28.1.3" - "jest-regex-util" "^28.0.2" - "jest-util" "^28.1.3" - "micromatch" "^4.0.4" - "pirates" "^4.0.4" - "slash" "^3.0.0" - "write-file-atomic" "^4.0.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" -"@jest/types@^28.0.0", "@jest/types@^28.1.3": - "integrity" "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==" - "resolved" "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" - "version" "28.1.3" +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" - "chalk" "^4.0.0" + chalk "^4.0.0" "@jridgewell/gen-mapping@^0.1.0": - "integrity" "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==" - "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - "version" "0.1.1" + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/gen-mapping@^0.3.2": - "integrity" "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==" - "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - "version" "0.3.2" + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.0.3": - "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - "version" "3.1.0" + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10": - "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - "version" "1.4.14" + 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.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.9": - "integrity" "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==" - "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" - "version" "0.3.14" + version "0.3.14" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" "@nodelib/fs.scandir@2.1.5": - "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - "version" "2.1.5" + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - "version" "2.0.5" +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - "version" "1.2.8" + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" + fastq "^1.6.0" "@sinclair/typebox@^0.24.1": - "integrity" "sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==" - "resolved" "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz" - "version" "0.24.27" + version "0.24.27" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz" + integrity sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg== "@sinonjs/commons@^1.7.0": - "integrity" "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==" - "resolved" "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" - "version" "1.8.3" + version "1.8.3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: - "type-detect" "4.0.8" + type-detect "4.0.8" "@sinonjs/fake-timers@^9.1.2": - "integrity" "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==" - "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" - "version" "9.1.2" + version "9.1.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" "@types/babel__core@^7.1.14": - "integrity" "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==" - "resolved" "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" - "version" "7.1.19" + version "7.1.19" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -625,318 +625,318 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - "integrity" "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==" - "resolved" "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - "version" "7.6.4" + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - "integrity" "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==" - "resolved" "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - "version" "7.4.1" + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - "integrity" "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==" - "resolved" "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz" - "version" "7.18.0" + version "7.18.0" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz" + integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== dependencies: "@babel/types" "^7.3.0" "@types/graceful-fs@^4.1.3": - "integrity" "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==" - "resolved" "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" - "version" "4.1.5" + version "4.1.5" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - "integrity" "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - "resolved" "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - "version" "2.0.4" + 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@*": - "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==" - "resolved" "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - "version" "3.0.0" + 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": - "integrity" "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==" - "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - "version" "3.0.1" + 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@28.1.6": - "integrity" "sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==" - "resolved" "https://registry.npmjs.org/@types/jest/-/jest-28.1.6.tgz" - "version" "28.1.6" + version "28.1.6" + resolved "https://registry.npmjs.org/@types/jest/-/jest-28.1.6.tgz" + integrity sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ== dependencies: - "jest-matcher-utils" "^28.0.0" - "pretty-format" "^28.0.0" + jest-matcher-utils "^28.0.0" + pretty-format "^28.0.0" "@types/json-schema@^7.0.9": - "integrity" "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - "version" "7.0.11" + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/mocha@^10.0.1": - "integrity" "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==" - "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz" - "version" "10.0.1" + version "10.0.1" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== "@types/node@*": - "integrity" "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz" - "version" "18.7.1" + version "18.7.1" + resolved "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz" + integrity sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ== "@types/prettier@^2.1.5": - "integrity" "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==" - "resolved" "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz" - "version" "2.7.0" + version "2.7.0" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz" + integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== "@types/stack-utils@^2.0.0": - "integrity" "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - "resolved" "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" - "version" "2.0.1" + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/uuid@8.3.4": - "integrity" "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" - "resolved" "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" - "version" "8.3.4" + version "8.3.4" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@types/yargs-parser@*": - "integrity" "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - "resolved" "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - "version" "21.0.0" + 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@^17.0.8": - "integrity" "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==" - "resolved" "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz" - "version" "17.0.11" + version "17.0.11" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz" + integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.12.1": - "integrity" "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz" - "version" "5.33.0" + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz" + integrity sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg== dependencies: "@typescript-eslint/scope-manager" "5.33.0" "@typescript-eslint/type-utils" "5.33.0" "@typescript-eslint/utils" "5.33.0" - "debug" "^4.3.4" - "functional-red-black-tree" "^1.0.1" - "ignore" "^5.2.0" - "regexpp" "^3.2.0" - "semver" "^7.3.7" - "tsutils" "^3.21.0" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.33.0": - "integrity" "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz" - "version" "5.33.0" +"@typescript-eslint/parser@^5.33.0": + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz" + integrity sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w== dependencies: "@typescript-eslint/scope-manager" "5.33.0" "@typescript-eslint/types" "5.33.0" "@typescript-eslint/typescript-estree" "5.33.0" - "debug" "^4.3.4" + debug "^4.3.4" "@typescript-eslint/scope-manager@5.33.0": - "integrity" "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz" - "version" "5.33.0" + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz" + integrity sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw== dependencies: "@typescript-eslint/types" "5.33.0" "@typescript-eslint/visitor-keys" "5.33.0" "@typescript-eslint/type-utils@5.33.0": - "integrity" "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz" - "version" "5.33.0" + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz" + integrity sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA== dependencies: "@typescript-eslint/utils" "5.33.0" - "debug" "^4.3.4" - "tsutils" "^3.21.0" + debug "^4.3.4" + tsutils "^3.21.0" "@typescript-eslint/types@5.33.0": - "integrity" "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz" - "version" "5.33.0" + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz" + integrity sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw== "@typescript-eslint/typescript-estree@5.33.0": - "integrity" "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz" - "version" "5.33.0" + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz" + integrity sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ== dependencies: "@typescript-eslint/types" "5.33.0" "@typescript-eslint/visitor-keys" "5.33.0" - "debug" "^4.3.4" - "globby" "^11.1.0" - "is-glob" "^4.0.3" - "semver" "^7.3.7" - "tsutils" "^3.21.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.33.0": - "integrity" "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz" - "version" "5.33.0" + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz" + integrity sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw== dependencies: "@types/json-schema" "^7.0.9" "@typescript-eslint/scope-manager" "5.33.0" "@typescript-eslint/types" "5.33.0" "@typescript-eslint/typescript-estree" "5.33.0" - "eslint-scope" "^5.1.1" - "eslint-utils" "^3.0.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" "@typescript-eslint/visitor-keys@5.33.0": - "integrity" "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==" - "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz" - "version" "5.33.0" + version "5.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz" + integrity sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw== dependencies: "@typescript-eslint/types" "5.33.0" - "eslint-visitor-keys" "^3.3.0" + eslint-visitor-keys "^3.3.0" -"acorn-jsx@^5.3.2": - "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - "version" "5.3.2" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.8.0": - "integrity" "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" - "version" "8.8.0" +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== -"ajv@^6.10.0", "ajv@^6.12.4": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - "fast-deep-equal" "^3.1.1" - "fast-json-stable-stringify" "^2.0.0" - "json-schema-traverse" "^0.4.1" - "uri-js" "^4.2.2" + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -"ansi-escapes@^4.2.1": - "integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==" - "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - "version" "4.3.2" +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - "type-fest" "^0.21.3" + type-fest "^0.21.3" -"ansi-regex@^5.0.1": - "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - "version" "5.0.1" +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -"ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - "color-convert" "^1.9.0" + color-convert "^1.9.0" -"ansi-styles@^4.0.0", "ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" +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" + color-convert "^2.0.1" -"ansi-styles@^5.0.0": - "integrity" "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - "version" "5.2.0" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -"anymatch@^3.0.3": - "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - "version" "3.1.2" +anymatch@^3.0.3: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" + normalize-path "^3.0.0" + picomatch "^2.0.4" -"argparse@^1.0.7": - "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - "version" "1.0.10" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: - "sprintf-js" "~1.0.2" + sprintf-js "~1.0.2" -"argparse@^2.0.1": - "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - "version" "2.0.1" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -"array-union@^2.1.0": - "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - "version" "2.1.0" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -"asynckit@^0.4.0": - "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -"axios-mock-adapter@^1.20.0": - "integrity" "sha512-jzyNxU3JzB2XVhplZboUcF0YDs7xuExzoRSHXPHr+UQajaGmcTqvkkUADgkVI2WkGlpZ1zZlMVdcTMU0ejV8zQ==" - "resolved" "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz" - "version" "1.21.2" +axios-mock-adapter@^1.20.0: + version "1.21.2" + resolved "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.2.tgz" + integrity sha512-jzyNxU3JzB2XVhplZboUcF0YDs7xuExzoRSHXPHr+UQajaGmcTqvkkUADgkVI2WkGlpZ1zZlMVdcTMU0ejV8zQ== dependencies: - "fast-deep-equal" "^3.1.3" - "is-buffer" "^2.0.5" + fast-deep-equal "^3.1.3" + is-buffer "^2.0.5" -"axios@^0.27.2", "axios@>= 0.17.0": - "integrity" "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==" - "resolved" "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" - "version" "0.27.2" +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== dependencies: - "follow-redirects" "^1.14.9" - "form-data" "^4.0.0" + follow-redirects "^1.14.9" + form-data "^4.0.0" -"babel-jest@^28.0.0", "babel-jest@^28.1.3": - "integrity" "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==" - "resolved" "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" - "version" "28.1.3" +babel-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== dependencies: "@jest/transform" "^28.1.3" "@types/babel__core" "^7.1.14" - "babel-plugin-istanbul" "^6.1.1" - "babel-preset-jest" "^28.1.3" - "chalk" "^4.0.0" - "graceful-fs" "^4.2.9" - "slash" "^3.0.0" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" -"babel-plugin-istanbul@^6.1.1": - "integrity" "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==" - "resolved" "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - "version" "6.1.1" +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - "istanbul-lib-instrument" "^5.0.4" - "test-exclude" "^6.0.0" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" -"babel-plugin-jest-hoist@^28.1.3": - "integrity" "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==" - "resolved" "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" - "version" "28.1.3" +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -"babel-preset-current-node-syntax@^1.0.0": - "integrity" "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==" - "resolved" "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" - "version" "1.0.1" +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -951,1051 +951,1038 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -"babel-preset-jest@^28.1.3": - "integrity" "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==" - "resolved" "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" - "version" "28.1.3" +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== dependencies: - "babel-plugin-jest-hoist" "^28.1.3" - "babel-preset-current-node-syntax" "^1.0.0" + babel-plugin-jest-hoist "^28.1.3" + babel-preset-current-node-syntax "^1.0.0" -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" +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== -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" +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" + balanced-match "^1.0.0" + concat-map "0.0.1" -"braces@^3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - "fill-range" "^7.0.1" + fill-range "^7.0.1" -"browserslist@^4.20.2", "browserslist@>= 4.21.0": - "integrity" "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==" - "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" - "version" "4.21.3" +browserslist@^4.20.2: + version "4.21.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== dependencies: - "caniuse-lite" "^1.0.30001370" - "electron-to-chromium" "^1.4.202" - "node-releases" "^2.0.6" - "update-browserslist-db" "^1.0.5" + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" + node-releases "^2.0.6" + update-browserslist-db "^1.0.5" -"bs-logger@0.x": - "integrity" "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==" - "resolved" "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" - "version" "0.2.6" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: - "fast-json-stable-stringify" "2.x" + fast-json-stable-stringify "2.x" -"bser@2.1.1": - "integrity" "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==" - "resolved" "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - "version" "2.1.1" +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: - "node-int64" "^0.4.0" + node-int64 "^0.4.0" -"buffer-from@^1.0.0": - "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - "version" "1.1.2" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -"camelcase@^5.3.1": - "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - "version" "5.3.1" +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -"camelcase@^6.2.0": - "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - "version" "6.3.0" +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -"caniuse-lite@^1.0.30001370": - "integrity" "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==" - "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz" - "version" "1.0.30001375" +caniuse-lite@^1.0.30001370: + version "1.0.30001375" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz" + integrity sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw== -"chalk@^2.0.0": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -"chalk@^4.0.0": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.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" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -"char-regex@^1.0.2": - "integrity" "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - "resolved" "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" - "version" "1.0.2" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -"ci-info@^3.2.0": - "integrity" "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==" - "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz" - "version" "3.3.2" +ci-info@^3.2.0: + version "3.3.2" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== -"cjs-module-lexer@^1.0.0": - "integrity" "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" - "resolved" "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" - "version" "1.2.2" +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -"cliui@^7.0.2": - "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - "version" "7.0.4" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - "string-width" "^4.2.0" - "strip-ansi" "^6.0.0" - "wrap-ansi" "^7.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" -"co@^4.6.0": - "integrity" "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" - "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - "version" "4.6.0" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== -"collect-v8-coverage@^1.0.0": - "integrity" "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - "resolved" "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" - "version" "1.0.1" +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" +color-convert@^1.9.0: + 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-name "1.1.3" -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" +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.4" -"color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "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.1.3": - "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" +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== -"combined-stream@^1.0.8": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: - "delayed-stream" "~1.0.0" + delayed-stream "~1.0.0" -"concat-map@0.0.1": - "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" +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== -"convert-source-map@^1.4.0", "convert-source-map@^1.6.0", "convert-source-map@^1.7.0": - "integrity" "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==" - "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - "version" "1.8.0" +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: - "safe-buffer" "~5.1.1" + safe-buffer "~5.1.1" -"cross-spawn@^7.0.2", "cross-spawn@^7.0.3": - "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" - "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - "version" "7.0.3" +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - "path-key" "^3.1.0" - "shebang-command" "^2.0.0" - "which" "^2.0.1" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -"debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4": - "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - "version" "4.3.4" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - "ms" "2.1.2" + ms "2.1.2" -"dedent@^0.7.0": - "integrity" "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - "resolved" "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - "version" "0.7.0" +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -"deep-is@^0.1.3": - "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - "version" "0.1.4" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -"deepmerge@^4.2.2": - "integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - "version" "4.2.2" +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -"delayed-stream@~1.0.0": - "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -"detect-newline@^3.0.0": - "integrity" "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - "resolved" "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - "version" "3.1.0" +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -"diff-sequences@^28.1.1": - "integrity" "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==" - "resolved" "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" - "version" "28.1.1" +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== -"dir-glob@^3.0.1": - "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - "version" "3.0.1" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - "path-type" "^4.0.0" + path-type "^4.0.0" -"doctrine@^3.0.0": - "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" - "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - "version" "3.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - "esutils" "^2.0.2" + esutils "^2.0.2" -"electron-to-chromium@^1.4.202": - "integrity" "sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg==" - "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz" - "version" "1.4.215" +electron-to-chromium@^1.4.202: + version "1.4.215" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz" + integrity sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg== -"emittery@^0.10.2": - "integrity" "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==" - "resolved" "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" - "version" "0.10.2" +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== -"emoji-regex@^8.0.0": - "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - "version" "8.0.0" +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -"error-ex@^1.3.1": - "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" - "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - "version" "1.3.2" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: - "is-arrayish" "^0.2.1" + is-arrayish "^0.2.1" -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -"escape-string-regexp@^1.0.5": - "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -"escape-string-regexp@^2.0.0": - "integrity" "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - "version" "2.0.0" +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -"escape-string-regexp@^4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -"eslint-config-prettier@^8.4.0": - "integrity" "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==" - "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" - "version" "8.5.0" +eslint-config-prettier@^8.4.0: + version "8.5.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -"eslint-plugin-prettier@^4.0.0": - "integrity" "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==" - "resolved" "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" - "version" "4.2.1" +eslint-plugin-prettier@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: - "prettier-linter-helpers" "^1.0.0" + prettier-linter-helpers "^1.0.0" -"eslint-scope@^5.1.1": - "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - "version" "5.1.1" +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^4.1.1" + esrecurse "^4.3.0" + estraverse "^4.1.1" -"eslint-scope@^7.1.1": - "integrity" "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==" - "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" - "version" "7.1.1" +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - "esrecurse" "^4.3.0" - "estraverse" "^5.2.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" -"eslint-utils@^3.0.0": - "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" - "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" - "version" "3.0.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - "eslint-visitor-keys" "^2.0.0" + eslint-visitor-keys "^2.0.0" -"eslint-visitor-keys@^2.0.0": - "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - "version" "2.1.0" +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -"eslint-visitor-keys@^3.3.0": - "integrity" "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" - "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" - "version" "3.3.0" +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -"eslint@*", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^8.21.0", "eslint@>=5", "eslint@>=7.0.0", "eslint@>=7.28.0": - "integrity" "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==" - "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz" - "version" "8.21.0" +eslint@^8.21.0: + version "8.21.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz" + integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== dependencies: "@eslint/eslintrc" "^1.3.0" "@humanwhocodes/config-array" "^0.10.4" "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" - "ajv" "^6.10.0" - "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.1.1" - "eslint-utils" "^3.0.0" - "eslint-visitor-keys" "^3.3.0" - "espree" "^9.3.3" - "esquery" "^1.4.0" - "esutils" "^2.0.2" - "fast-deep-equal" "^3.1.3" - "file-entry-cache" "^6.0.1" - "find-up" "^5.0.0" - "functional-red-black-tree" "^1.0.1" - "glob-parent" "^6.0.1" - "globals" "^13.15.0" - "globby" "^11.1.0" - "grapheme-splitter" "^1.0.4" - "ignore" "^5.2.0" - "import-fresh" "^3.0.0" - "imurmurhash" "^0.1.4" - "is-glob" "^4.0.0" - "js-yaml" "^4.1.0" - "json-stable-stringify-without-jsonify" "^1.0.1" - "levn" "^0.4.1" - "lodash.merge" "^4.6.2" - "minimatch" "^3.1.2" - "natural-compare" "^1.4.0" - "optionator" "^0.9.1" - "regexpp" "^3.2.0" - "strip-ansi" "^6.0.1" - "strip-json-comments" "^3.1.0" - "text-table" "^0.2.0" - "v8-compile-cache" "^2.0.3" + ajv "^6.10.0" + 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.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.3" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" -"espree@^9.3.2", "espree@^9.3.3": - "integrity" "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==" - "resolved" "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz" - "version" "9.3.3" +espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== dependencies: - "acorn" "^8.8.0" - "acorn-jsx" "^5.3.2" - "eslint-visitor-keys" "^3.3.0" + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" -"esprima@^4.0.0": - "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - "version" "4.0.1" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -"esquery@^1.4.0": - "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" - "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - "version" "1.4.0" +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - "estraverse" "^5.1.0" + estraverse "^5.1.0" -"esrecurse@^4.3.0": - "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - "version" "4.3.0" +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - "estraverse" "^5.2.0" + estraverse "^5.2.0" -"estraverse@^4.1.1": - "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - "version" "4.3.0" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -"estraverse@^5.1.0": - "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - "version" "5.3.0" +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -"estraverse@^5.2.0": - "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - "version" "5.3.0" +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" - -"execa@^5.0.0": - "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==" - "resolved" "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - "version" "5.1.1" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - "cross-spawn" "^7.0.3" - "get-stream" "^6.0.0" - "human-signals" "^2.1.0" - "is-stream" "^2.0.0" - "merge-stream" "^2.0.0" - "npm-run-path" "^4.0.1" - "onetime" "^5.1.2" - "signal-exit" "^3.0.3" - "strip-final-newline" "^2.0.0" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" -"exit@^0.1.2": - "integrity" "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" - "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - "version" "0.1.2" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -"expect@^28.1.3": - "integrity" "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==" - "resolved" "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" - "version" "28.1.3" +expect@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== dependencies: "@jest/expect-utils" "^28.1.3" - "jest-get-type" "^28.0.2" - "jest-matcher-utils" "^28.1.3" - "jest-message-util" "^28.1.3" - "jest-util" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" -"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -"fast-diff@^1.1.2": - "integrity" "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" - "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" - "version" "1.2.0" +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -"fast-glob@^3.2.9": - "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" - "version" "3.2.11" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - "glob-parent" "^5.1.2" - "merge2" "^1.3.0" - "micromatch" "^4.0.4" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" -"fast-json-stable-stringify@^2.0.0", "fast-json-stable-stringify@2.x": - "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - "version" "2.1.0" +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -"fast-levenshtein@^2.0.6": - "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -"fastq@^1.6.0": - "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - "version" "1.13.0" +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: - "reusify" "^1.0.4" + reusify "^1.0.4" -"fb-watchman@^2.0.0": - "integrity" "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==" - "resolved" "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" - "version" "2.0.1" +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: - "bser" "2.1.1" + bser "2.1.1" -"file-entry-cache@^6.0.1": - "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" - "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - "version" "6.0.1" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - "flat-cache" "^3.0.4" + flat-cache "^3.0.4" -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - "to-regex-range" "^5.0.1" + to-regex-range "^5.0.1" -"find-up@^4.0.0": - "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - "version" "4.1.0" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - "locate-path" "^5.0.0" - "path-exists" "^4.0.0" + locate-path "^5.0.0" + path-exists "^4.0.0" -"find-up@^4.1.0": - "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - "version" "4.1.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - "locate-path" "^5.0.0" - "path-exists" "^4.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" -"find-up@^5.0.0": - "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - "version" "5.0.0" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - "locate-path" "^6.0.0" - "path-exists" "^4.0.0" + flatted "^3.1.0" + rimraf "^3.0.2" -"flat-cache@^3.0.4": - "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" - "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - "version" "3.0.4" +flatted@^3.1.0: + version "3.2.6" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + +follow-redirects@^1.14.9: + version "1.15.1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +form-data@4.0.0, form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: - "flatted" "^3.1.0" - "rimraf" "^3.0.2" + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" -"flatted@^3.1.0": - "integrity" "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==" - "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz" - "version" "3.2.6" +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== -"follow-redirects@^1.14.9": - "integrity" "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" - "version" "1.15.1" +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -"form-data@^4.0.0", "form-data@4.0.0": - "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - "version" "4.0.0" +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== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +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-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.8" - "mime-types" "^2.1.12" + is-glob "^4.0.1" -"fs.realpath@^1.0.0": - "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" - -"fsevents@^2.3.2": - "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" - "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - "version" "2.3.2" - -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" - -"functional-red-black-tree@^1.0.1": - "integrity" "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - "version" "1.0.1" - -"gensync@^1.0.0-beta.2": - "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - "version" "1.0.0-beta.2" - -"get-caller-file@^2.0.5": - "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - "version" "2.0.5" - -"get-package-type@^0.1.0": - "integrity" "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - "resolved" "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" - "version" "0.1.0" - -"get-stream@^6.0.0": - "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - "version" "6.0.1" - -"glob-parent@^5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - "is-glob" "^4.0.1" + is-glob "^4.0.3" -"glob-parent@^6.0.1": - "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - "version" "6.0.2" +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: - "is-glob" "^4.0.3" + 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" -"glob@^7.1.3", "glob@^7.1.4": - "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - "version" "7.2.3" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== 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" + type-fest "^0.20.2" -"globals@^11.1.0": - "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - "version" "11.12.0" - -"globals@^13.15.0": - "integrity" "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==" - "resolved" "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" - "version" "13.17.0" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: - "type-fest" "^0.20.2" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" -"globby@^11.1.0": - "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" - "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - "version" "11.1.0" +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +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@^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: - "array-union" "^2.1.0" - "dir-glob" "^3.0.1" - "fast-glob" "^3.2.9" - "ignore" "^5.2.0" - "merge2" "^1.4.1" - "slash" "^3.0.0" + function-bind "^1.1.1" -"graceful-fs@^4.2.9": - "integrity" "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - "version" "4.2.10" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -"grapheme-splitter@^1.0.4": - "integrity" "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" - "resolved" "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" - "version" "1.0.4" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -"has-flag@^3.0.0": - "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" - -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: - "function-bind" "^1.1.1" + parent-module "^1.0.0" + resolve-from "^4.0.0" -"html-escaper@^2.0.0": - "integrity" "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - "resolved" "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - "version" "2.0.2" - -"human-signals@^2.1.0": - "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - "version" "2.1.0" - -"ignore@^5.2.0": - "integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - "version" "5.2.0" - -"import-fresh@^3.0.0", "import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" -"import-local@^3.0.2": - "integrity" "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==" - "resolved" "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" - "version" "3.1.0" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +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: - "pkg-dir" "^4.2.0" - "resolve-cwd" "^3.0.0" + once "^1.3.0" + wrappy "1" -"imurmurhash@^0.1.4": - "integrity" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - "version" "0.1.4" +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -"inflight@^1.0.4": - "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: - "once" "^1.3.0" - "wrappy" "1" + has "^1.0.3" -"inherits@2": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -"is-arrayish@^0.2.1": - "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -"is-buffer@^2.0.5": - "integrity" "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - "version" "2.0.5" +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -"is-core-module@^2.9.0": - "integrity" "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==" - "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" - "version" "2.10.0" +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - "has" "^1.0.3" + is-extglob "^2.1.1" -"is-extglob@^2.1.1": - "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -"is-fullwidth-code-point@^3.0.0": - "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - "version" "3.0.0" +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-generator-fn@^2.0.0": - "integrity" "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - "resolved" "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" - "version" "2.1.0" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "is-extglob" "^2.1.1" +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"is-stream@^2.0.0": - "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - "version" "2.0.1" - -"isexe@^2.0.0": - "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" - -"istanbul-lib-coverage@^3.0.0", "istanbul-lib-coverage@^3.2.0": - "integrity" "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" - "version" "3.2.0" - -"istanbul-lib-instrument@^5.0.4", "istanbul-lib-instrument@^5.1.0": - "integrity" "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==" - "resolved" "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" - "version" "5.2.0" +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - "istanbul-lib-coverage" "^3.2.0" - "semver" "^6.3.0" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" -"istanbul-lib-report@^3.0.0": - "integrity" "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - "version" "3.0.0" +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: - "istanbul-lib-coverage" "^3.0.0" - "make-dir" "^3.0.0" - "supports-color" "^7.1.0" + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" -"istanbul-lib-source-maps@^4.0.0": - "integrity" "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==" - "resolved" "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - "version" "4.0.1" +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: - "debug" "^4.1.1" - "istanbul-lib-coverage" "^3.0.0" - "source-map" "^0.6.1" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" -"istanbul-reports@^3.1.3": - "integrity" "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==" - "resolved" "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" - "version" "3.1.5" +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: - "html-escaper" "^2.0.0" - "istanbul-lib-report" "^3.0.0" + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" -"jest-changed-files@^28.1.3": - "integrity" "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==" - "resolved" "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" - "version" "28.1.3" +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== dependencies: - "execa" "^5.0.0" - "p-limit" "^3.1.0" + execa "^5.0.0" + p-limit "^3.1.0" -"jest-circus@^28.1.3": - "integrity" "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==" - "resolved" "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" - "version" "28.1.3" +jest-circus@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== dependencies: "@jest/environment" "^28.1.3" "@jest/expect" "^28.1.3" "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - "chalk" "^4.0.0" - "co" "^4.6.0" - "dedent" "^0.7.0" - "is-generator-fn" "^2.0.0" - "jest-each" "^28.1.3" - "jest-matcher-utils" "^28.1.3" - "jest-message-util" "^28.1.3" - "jest-runtime" "^28.1.3" - "jest-snapshot" "^28.1.3" - "jest-util" "^28.1.3" - "p-limit" "^3.1.0" - "pretty-format" "^28.1.3" - "slash" "^3.0.0" - "stack-utils" "^2.0.3" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" -"jest-cli@^28.1.3": - "integrity" "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==" - "resolved" "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" - "version" "28.1.3" +jest-cli@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== dependencies: "@jest/core" "^28.1.3" "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" - "chalk" "^4.0.0" - "exit" "^0.1.2" - "graceful-fs" "^4.2.9" - "import-local" "^3.0.2" - "jest-config" "^28.1.3" - "jest-util" "^28.1.3" - "jest-validate" "^28.1.3" - "prompts" "^2.0.1" - "yargs" "^17.3.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + prompts "^2.0.1" + yargs "^17.3.1" -"jest-config@^28.1.3": - "integrity" "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==" - "resolved" "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" - "version" "28.1.3" +jest-config@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== dependencies: "@babel/core" "^7.11.6" "@jest/test-sequencer" "^28.1.3" "@jest/types" "^28.1.3" - "babel-jest" "^28.1.3" - "chalk" "^4.0.0" - "ci-info" "^3.2.0" - "deepmerge" "^4.2.2" - "glob" "^7.1.3" - "graceful-fs" "^4.2.9" - "jest-circus" "^28.1.3" - "jest-environment-node" "^28.1.3" - "jest-get-type" "^28.0.2" - "jest-regex-util" "^28.0.2" - "jest-resolve" "^28.1.3" - "jest-runner" "^28.1.3" - "jest-util" "^28.1.3" - "jest-validate" "^28.1.3" - "micromatch" "^4.0.4" - "parse-json" "^5.2.0" - "pretty-format" "^28.1.3" - "slash" "^3.0.0" - "strip-json-comments" "^3.1.1" + babel-jest "^28.1.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" -"jest-diff@^28.1.3": - "integrity" "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==" - "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" - "version" "28.1.3" +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== dependencies: - "chalk" "^4.0.0" - "diff-sequences" "^28.1.1" - "jest-get-type" "^28.0.2" - "pretty-format" "^28.1.3" + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" -"jest-docblock@^28.1.1": - "integrity" "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==" - "resolved" "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" - "version" "28.1.1" +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== dependencies: - "detect-newline" "^3.0.0" + detect-newline "^3.0.0" -"jest-each@^28.1.3": - "integrity" "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==" - "resolved" "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" - "version" "28.1.3" +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== dependencies: "@jest/types" "^28.1.3" - "chalk" "^4.0.0" - "jest-get-type" "^28.0.2" - "jest-util" "^28.1.3" - "pretty-format" "^28.1.3" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" -"jest-environment-node@^28.1.3": - "integrity" "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==" - "resolved" "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" - "version" "28.1.3" +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== dependencies: "@jest/environment" "^28.1.3" "@jest/fake-timers" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - "jest-mock" "^28.1.3" - "jest-util" "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" -"jest-get-type@^28.0.2": - "integrity" "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==" - "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" - "version" "28.0.2" +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== -"jest-haste-map@^28.1.3": - "integrity" "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==" - "resolved" "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" - "version" "28.1.3" +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== dependencies: "@jest/types" "^28.1.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" - "anymatch" "^3.0.3" - "fb-watchman" "^2.0.0" - "graceful-fs" "^4.2.9" - "jest-regex-util" "^28.0.2" - "jest-util" "^28.1.3" - "jest-worker" "^28.1.3" - "micromatch" "^4.0.4" - "walker" "^1.0.8" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" optionalDependencies: - "fsevents" "^2.3.2" + fsevents "^2.3.2" -"jest-junit@^14.0.0": - "integrity" "sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g==" - "resolved" "https://registry.npmjs.org/jest-junit/-/jest-junit-14.0.0.tgz" - "version" "14.0.0" +jest-junit@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/jest-junit/-/jest-junit-14.0.0.tgz" + integrity sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g== dependencies: - "mkdirp" "^1.0.4" - "strip-ansi" "^6.0.1" - "uuid" "^8.3.2" - "xml" "^1.0.1" + mkdirp "^1.0.4" + strip-ansi "^6.0.1" + uuid "^8.3.2" + xml "^1.0.1" -"jest-leak-detector@^28.1.3": - "integrity" "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==" - "resolved" "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" - "version" "28.1.3" +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== dependencies: - "jest-get-type" "^28.0.2" - "pretty-format" "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" -"jest-matcher-utils@^28.0.0", "jest-matcher-utils@^28.1.3": - "integrity" "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==" - "resolved" "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" - "version" "28.1.3" +jest-matcher-utils@^28.0.0, jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== dependencies: - "chalk" "^4.0.0" - "jest-diff" "^28.1.3" - "jest-get-type" "^28.0.2" - "pretty-format" "^28.1.3" + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" -"jest-message-util@^28.1.3": - "integrity" "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==" - "resolved" "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" - "version" "28.1.3" +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^28.1.3" "@types/stack-utils" "^2.0.0" - "chalk" "^4.0.0" - "graceful-fs" "^4.2.9" - "micromatch" "^4.0.4" - "pretty-format" "^28.1.3" - "slash" "^3.0.0" - "stack-utils" "^2.0.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" -"jest-mock@^28.1.3": - "integrity" "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==" - "resolved" "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" - "version" "28.1.3" +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== dependencies: "@jest/types" "^28.1.3" "@types/node" "*" -"jest-pnp-resolver@^1.2.2": - "integrity" "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" - "resolved" "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" - "version" "1.2.2" +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -"jest-regex-util@^28.0.2": - "integrity" "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" - "resolved" "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" - "version" "28.0.2" +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -"jest-resolve-dependencies@^28.1.3": - "integrity" "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==" - "resolved" "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" - "version" "28.1.3" +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== dependencies: - "jest-regex-util" "^28.0.2" - "jest-snapshot" "^28.1.3" + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" -"jest-resolve@*", "jest-resolve@^28.1.3": - "integrity" "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==" - "resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" - "version" "28.1.3" +jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== dependencies: - "chalk" "^4.0.0" - "graceful-fs" "^4.2.9" - "jest-haste-map" "^28.1.3" - "jest-pnp-resolver" "^1.2.2" - "jest-util" "^28.1.3" - "jest-validate" "^28.1.3" - "resolve" "^1.20.0" - "resolve.exports" "^1.1.0" - "slash" "^3.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" -"jest-runner@^28.1.3": - "integrity" "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==" - "resolved" "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" - "version" "28.1.3" +jest-runner@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== dependencies: "@jest/console" "^28.1.3" "@jest/environment" "^28.1.3" @@ -2003,26 +1990,26 @@ "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - "chalk" "^4.0.0" - "emittery" "^0.10.2" - "graceful-fs" "^4.2.9" - "jest-docblock" "^28.1.1" - "jest-environment-node" "^28.1.3" - "jest-haste-map" "^28.1.3" - "jest-leak-detector" "^28.1.3" - "jest-message-util" "^28.1.3" - "jest-resolve" "^28.1.3" - "jest-runtime" "^28.1.3" - "jest-util" "^28.1.3" - "jest-watcher" "^28.1.3" - "jest-worker" "^28.1.3" - "p-limit" "^3.1.0" - "source-map-support" "0.5.13" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" -"jest-runtime@^28.1.3": - "integrity" "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==" - "resolved" "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" - "version" "28.1.3" +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== dependencies: "@jest/environment" "^28.1.3" "@jest/fake-timers" "^28.1.3" @@ -2031,26 +2018,26 @@ "@jest/test-result" "^28.1.3" "@jest/transform" "^28.1.3" "@jest/types" "^28.1.3" - "chalk" "^4.0.0" - "cjs-module-lexer" "^1.0.0" - "collect-v8-coverage" "^1.0.0" - "execa" "^5.0.0" - "glob" "^7.1.3" - "graceful-fs" "^4.2.9" - "jest-haste-map" "^28.1.3" - "jest-message-util" "^28.1.3" - "jest-mock" "^28.1.3" - "jest-regex-util" "^28.0.2" - "jest-resolve" "^28.1.3" - "jest-snapshot" "^28.1.3" - "jest-util" "^28.1.3" - "slash" "^3.0.0" - "strip-bom" "^4.0.0" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + strip-bom "^4.0.0" -"jest-snapshot@^28.1.3": - "integrity" "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==" - "resolved" "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" - "version" "28.1.3" +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -2062,893 +2049,888 @@ "@jest/types" "^28.1.3" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" - "babel-preset-current-node-syntax" "^1.0.0" - "chalk" "^4.0.0" - "expect" "^28.1.3" - "graceful-fs" "^4.2.9" - "jest-diff" "^28.1.3" - "jest-get-type" "^28.0.2" - "jest-haste-map" "^28.1.3" - "jest-matcher-utils" "^28.1.3" - "jest-message-util" "^28.1.3" - "jest-util" "^28.1.3" - "natural-compare" "^1.4.0" - "pretty-format" "^28.1.3" - "semver" "^7.3.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + natural-compare "^1.4.0" + pretty-format "^28.1.3" + semver "^7.3.5" -"jest-util@^28.0.0", "jest-util@^28.1.3": - "integrity" "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==" - "resolved" "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" - "version" "28.1.3" +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== dependencies: "@jest/types" "^28.1.3" "@types/node" "*" - "chalk" "^4.0.0" - "ci-info" "^3.2.0" - "graceful-fs" "^4.2.9" - "picomatch" "^2.2.3" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" -"jest-validate@^28.1.3": - "integrity" "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==" - "resolved" "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" - "version" "28.1.3" +jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== dependencies: "@jest/types" "^28.1.3" - "camelcase" "^6.2.0" - "chalk" "^4.0.0" - "jest-get-type" "^28.0.2" - "leven" "^3.1.0" - "pretty-format" "^28.1.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.3" -"jest-watcher@^28.1.3": - "integrity" "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==" - "resolved" "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" - "version" "28.1.3" +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== dependencies: "@jest/test-result" "^28.1.3" "@jest/types" "^28.1.3" "@types/node" "*" - "ansi-escapes" "^4.2.1" - "chalk" "^4.0.0" - "emittery" "^0.10.2" - "jest-util" "^28.1.3" - "string-length" "^4.0.1" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" -"jest-worker@^28.1.3": - "integrity" "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==" - "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" - "version" "28.1.3" +jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== dependencies: "@types/node" "*" - "merge-stream" "^2.0.0" - "supports-color" "^8.0.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" -"jest@^28.0.0", "jest@^28.1.3": - "integrity" "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==" - "resolved" "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" - "version" "28.1.3" +jest@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== dependencies: "@jest/core" "^28.1.3" "@jest/types" "^28.1.3" - "import-local" "^3.0.2" - "jest-cli" "^28.1.3" + import-local "^3.0.2" + jest-cli "^28.1.3" -"js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -"js-yaml@^3.13.1": - "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - "version" "3.14.1" +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: - "argparse" "^1.0.7" - "esprima" "^4.0.0" + argparse "^1.0.7" + esprima "^4.0.0" -"js-yaml@^4.1.0": - "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - "version" "4.1.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - "argparse" "^2.0.1" + argparse "^2.0.1" -"jsesc@^2.5.1": - "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - "version" "2.5.2" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -"json-parse-even-better-errors@^2.3.0": - "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - "version" "2.3.1" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -"json-schema-traverse@^0.4.1": - "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - "version" "0.4.1" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -"json-stable-stringify-without-jsonify@^1.0.1": - "integrity" "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - "version" "1.0.1" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -"json-stringify-safe@5.0.1": - "integrity" "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - "version" "5.0.1" +json-stringify-safe@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -"json5@^2.2.1": - "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - "version" "2.2.3" +json5@^2.2.1: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -"kleur@^3.0.3": - "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - "version" "3.0.3" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -"leven@^3.1.0": - "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - "version" "3.1.0" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -"levn@^0.4.1": - "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" - "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - "version" "0.4.1" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - "prelude-ls" "^1.2.1" - "type-check" "~0.4.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" -"lines-and-columns@^1.1.6": - "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - "version" "1.2.4" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -"locate-path@^5.0.0": - "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - "version" "5.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: - "p-locate" "^4.1.0" + p-locate "^4.1.0" -"locate-path@^6.0.0": - "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - "version" "6.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: - "p-locate" "^5.0.0" + p-locate "^5.0.0" -"lodash.memoize@4.x": - "integrity" "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - "version" "4.1.2" +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -"lodash.merge@^4.6.2": - "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - "version" "4.6.2" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -"lru-cache@^6.0.0": - "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - "version" "6.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" + yallist "^4.0.0" -"make-dir@^3.0.0": - "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" - "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - "version" "3.1.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: - "semver" "^6.0.0" + semver "^6.0.0" -"make-error@1.x": - "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - "version" "1.3.6" +make-error@1.x: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -"makeerror@1.0.12": - "integrity" "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==" - "resolved" "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - "version" "1.0.12" +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - "tmpl" "1.0.5" + tmpl "1.0.5" -"merge-stream@^2.0.0": - "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - "version" "2.0.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -"merge2@^1.3.0", "merge2@^1.4.1": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -"micromatch@^4.0.4": - "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - "version" "4.0.5" +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - "braces" "^3.0.2" - "picomatch" "^2.3.1" + braces "^3.0.2" + picomatch "^2.3.1" -"mime-db@1.52.0": - "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - "version" "1.52.0" +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.12": - "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - "version" "2.1.35" +mime-types@^2.1.12: + 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-db "1.52.0" -"mimic-fn@^2.1.0": - "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - "version" "2.1.0" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -"minimatch@^3.0.4", "minimatch@^3.1.1", "minimatch@^3.1.2": - "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - "version" "3.1.2" +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + 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" + brace-expansion "^1.1.7" -"mkdirp@^1.0.4": - "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - "version" "1.0.4" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -"ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -"natural-compare@^1.4.0": - "integrity" "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - "version" "1.4.0" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -"node-int64@^0.4.0": - "integrity" "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - "resolved" "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - "version" "0.4.0" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -"node-releases@^2.0.6": - "integrity" "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" - "version" "2.0.6" +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -"normalize-path@^3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -"npm-run-path@^4.0.1": - "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" - "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - "version" "4.0.1" +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - "path-key" "^3.0.0" + path-key "^3.0.0" -"once@^1.3.0": - "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" +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" + wrappy "1" -"onetime@^5.1.2": - "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" - "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - "version" "5.1.2" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: - "mimic-fn" "^2.1.0" + mimic-fn "^2.1.0" -"optionator@^0.9.1": - "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" - "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" - "version" "0.9.1" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - "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" + 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" -"p-limit@^2.2.0": - "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - "version" "2.3.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: - "p-try" "^2.0.0" + p-try "^2.0.0" -"p-limit@^3.0.2", "p-limit@^3.1.0": - "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - "version" "3.1.0" +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - "yocto-queue" "^0.1.0" + yocto-queue "^0.1.0" -"p-locate@^4.1.0": - "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - "version" "4.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: - "p-limit" "^2.2.0" + p-limit "^2.2.0" -"p-locate@^5.0.0": - "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - "version" "5.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - "p-limit" "^3.0.2" + p-limit "^3.0.2" -"p-try@^2.0.0": - "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - "version" "2.2.0" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - "callsites" "^3.0.0" + callsites "^3.0.0" -"parse-json@^5.2.0": - "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - "version" "5.2.0" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" - "error-ex" "^1.3.1" - "json-parse-even-better-errors" "^2.3.0" - "lines-and-columns" "^1.1.6" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" -"path-exists@^4.0.0": - "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - "version" "4.0.0" +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -"path-is-absolute@^1.0.0": - "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" +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-key@^3.0.0", "path-key@^3.1.0": - "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - "version" "3.1.1" +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -"path-parse@^1.0.7": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" +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-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -"picocolors@^1.0.0": - "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - "version" "1.0.0" +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -"picomatch@^2.0.4", "picomatch@^2.2.3", "picomatch@^2.3.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -"pirates@^4.0.4": - "integrity" "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" - "resolved" "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - "version" "4.0.5" +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -"pkg-dir@^4.2.0": - "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==" - "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - "version" "4.2.0" +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - "find-up" "^4.0.0" + find-up "^4.0.0" -"prelude-ls@^1.2.1": - "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - "version" "1.2.1" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -"prettier-linter-helpers@^1.0.0": - "integrity" "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==" - "resolved" "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" - "version" "1.0.0" +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: - "fast-diff" "^1.1.2" + fast-diff "^1.1.2" -"prettier@>=2.0.0", "prettier@2.7.1": - "integrity" "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" - "version" "2.7.1" +prettier@2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -"pretty-format@^28.0.0", "pretty-format@^28.1.3": - "integrity" "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==" - "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" - "version" "28.1.3" +pretty-format@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== dependencies: "@jest/schemas" "^28.1.3" - "ansi-regex" "^5.0.1" - "ansi-styles" "^5.0.0" - "react-is" "^18.0.0" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" -"process@0.11.10": - "integrity" "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - "resolved" "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - "version" "0.11.10" +process@0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -"prompts@^2.0.1": - "integrity" "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==" - "resolved" "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - "version" "2.4.2" +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: - "kleur" "^3.0.3" - "sisteransi" "^1.0.5" + kleur "^3.0.3" + sisteransi "^1.0.5" -"punycode@^2.1.0": - "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - "version" "2.1.1" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -"queue-microtask@^1.2.2": - "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - "version" "1.2.3" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -"react-is@^18.0.0": - "integrity" "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - "version" "18.2.0" +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -"regexpp@^3.2.0": - "integrity" "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - "version" "3.2.0" +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -"require-directory@^2.1.1": - "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - "version" "2.1.1" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -"resolve-cwd@^3.0.0": - "integrity" "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==" - "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" - "version" "3.0.0" +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: - "resolve-from" "^5.0.0" + resolve-from "^5.0.0" -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -"resolve-from@^5.0.0": - "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - "version" "5.0.0" +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -"resolve.exports@^1.1.0": - "integrity" "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" - "resolved" "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" - "version" "1.1.0" +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -"resolve@^1.20.0": - "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - "version" "1.22.1" +resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - "is-core-module" "^2.9.0" - "path-parse" "^1.0.7" - "supports-preserve-symlinks-flag" "^1.0.0" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -"rimraf@^3.0.0", "rimraf@^3.0.2": - "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - "version" "3.0.2" +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: - "glob" "^7.1.3" + glob "^7.1.3" -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - "queue-microtask" "^1.2.2" + queue-microtask "^1.2.2" -"safe-buffer@~5.1.1": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"semver@^6.0.0": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" - -"semver@^6.3.0": - "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - "version" "6.3.0" - -"semver@^7.3.5", "semver@^7.3.7", "semver@7.x": - "integrity" "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - "version" "7.3.7" +semver@7.x, semver@^7.3.5, semver@^7.3.7: + 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" + lru-cache "^6.0.0" -"shebang-command@^2.0.0": - "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" - "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - "version" "2.0.0" +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - "shebang-regex" "^3.0.0" + shebang-regex "^3.0.0" -"shebang-regex@^3.0.0": - "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - "version" "3.0.0" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -"signal-exit@^3.0.3", "signal-exit@^3.0.7": - "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - "version" "3.0.7" +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -"sisteransi@^1.0.5": - "integrity" "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - "resolved" "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - "version" "1.0.5" +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -"slash@^3.0.0": - "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - "version" "3.0.0" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -"source-map-support@^0.5.21": - "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - "version" "0.5.21" +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: - "buffer-from" "^1.0.0" - "source-map" "^0.6.0" + buffer-from "^1.0.0" + source-map "^0.6.0" -"source-map-support@0.5.13": - "integrity" "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - "version" "0.5.13" +source-map-support@^0.5.21: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: - "buffer-from" "^1.0.0" - "source-map" "^0.6.0" + buffer-from "^1.0.0" + source-map "^0.6.0" -"source-map@^0.6.0", "source-map@^0.6.1": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -"sprintf-js@~1.0.2": - "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - "version" "1.0.3" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -"stack-utils@^2.0.3": - "integrity" "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==" - "resolved" "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" - "version" "2.0.5" +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: - "escape-string-regexp" "^2.0.0" + escape-string-regexp "^2.0.0" -"string-length@^4.0.1": - "integrity" "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==" - "resolved" "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" - "version" "4.0.2" +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - "char-regex" "^1.0.2" - "strip-ansi" "^6.0.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" -"string-width@^4.1.0", "string-width@^4.2.0", "string-width@^4.2.3": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": - "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - "version" "6.0.1" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - "ansi-regex" "^5.0.1" + ansi-regex "^5.0.1" -"strip-bom@^4.0.0": - "integrity" "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - "version" "4.0.0" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -"strip-final-newline@^2.0.0": - "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - "version" "2.0.0" +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1": - "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - "version" "3.1.1" +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - "has-flag" "^3.0.0" + has-flag "^3.0.0" -"supports-color@^7.0.0", "supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" +supports-color@^7.0.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" + has-flag "^4.0.0" -"supports-color@^8.0.0": - "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - "version" "8.1.1" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - "has-flag" "^4.0.0" + has-flag "^4.0.0" -"supports-hyperlinks@^2.0.0": - "integrity" "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==" - "resolved" "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" - "version" "2.2.0" +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: - "has-flag" "^4.0.0" - "supports-color" "^7.0.0" + has-flag "^4.0.0" + supports-color "^7.0.0" -"supports-preserve-symlinks-flag@^1.0.0": - "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - "version" "1.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== -"terminal-link@^2.0.0": - "integrity" "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==" - "resolved" "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" - "version" "2.1.1" +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: - "ansi-escapes" "^4.2.1" - "supports-hyperlinks" "^2.0.0" + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" -"test-exclude@^6.0.0": - "integrity" "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==" - "resolved" "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" - "version" "6.0.0" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" - "glob" "^7.1.4" - "minimatch" "^3.0.4" + glob "^7.1.4" + minimatch "^3.0.4" -"text-table@^0.2.0": - "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - "version" "0.2.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -"tmpl@1.0.5": - "integrity" "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - "resolved" "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - "version" "1.0.5" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -"to-fast-properties@^2.0.0": - "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - "version" "2.0.0" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - "is-number" "^7.0.0" + is-number "^7.0.0" -"ts-jest@28.0.7": - "integrity" "sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA==" - "resolved" "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz" - "version" "28.0.7" +ts-jest@28.0.7: + version "28.0.7" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.7.tgz" + integrity sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA== dependencies: - "bs-logger" "0.x" - "fast-json-stable-stringify" "2.x" - "jest-util" "^28.0.0" - "json5" "^2.2.1" - "lodash.memoize" "4.x" - "make-error" "1.x" - "semver" "7.x" - "yargs-parser" "^21.0.1" + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" -"tslib@^1.8.1": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -"tslog@3.3.3": - "integrity" "sha512-lGrkndwpAohZ9ntQpT+xtUw5k9YFV1DjsksiWQlBSf82TTqsSAWBARPRD9juI730r8o3Awpkjp2aXy9k+6vr+g==" - "resolved" "https://registry.npmjs.org/tslog/-/tslog-3.3.3.tgz" - "version" "3.3.3" +tslog@3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/tslog/-/tslog-3.3.3.tgz" + integrity sha512-lGrkndwpAohZ9ntQpT+xtUw5k9YFV1DjsksiWQlBSf82TTqsSAWBARPRD9juI730r8o3Awpkjp2aXy9k+6vr+g== dependencies: - "source-map-support" "^0.5.21" + source-map-support "^0.5.21" -"tsutils@^3.21.0": - "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" - "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - "version" "3.21.0" +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: - "tslib" "^1.8.1" + tslib "^1.8.1" -"type-check@^0.4.0", "type-check@~0.4.0": - "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" - "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - "version" "0.4.0" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - "prelude-ls" "^1.2.1" + prelude-ls "^1.2.1" -"type-detect@4.0.8": - "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - "version" "4.0.8" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -"type-fest@^0.20.2": - "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - "version" "0.20.2" +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -"type-fest@^0.21.3": - "integrity" "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - "version" "0.21.3" +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -"typescript@^4.7.4", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=4.3": - "integrity" "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" - "version" "4.7.4" +typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== -"update-browserslist-db@^1.0.5": - "integrity" "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==" - "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" - "version" "1.0.5" +update-browserslist-db@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== dependencies: - "escalade" "^3.1.1" - "picocolors" "^1.0.0" + escalade "^3.1.1" + picocolors "^1.0.0" -"uri-js@^4.2.2": - "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - "version" "4.4.1" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: - "punycode" "^2.1.0" + punycode "^2.1.0" -"uuid@^8.3.2", "uuid@8.3.2": - "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - "version" "8.3.2" +uuid@8.3.2, 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== -"uuidv4@^6.2.12": - "integrity" "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==" - "resolved" "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz" - "version" "6.2.13" +uuidv4@^6.2.12: + version "6.2.13" + resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz" + integrity sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ== dependencies: "@types/uuid" "8.3.4" - "uuid" "8.3.2" + uuid "8.3.2" -"v8-compile-cache@^2.0.3": - "integrity" "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" - "version" "2.3.0" +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -"v8-to-istanbul@^9.0.1": - "integrity" "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==" - "resolved" "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" - "version" "9.0.1" +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - "convert-source-map" "^1.6.0" + convert-source-map "^1.6.0" -"walker@^1.0.8": - "integrity" "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==" - "resolved" "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - "version" "1.0.8" +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - "makeerror" "1.0.12" + makeerror "1.0.12" -"which@^2.0.1": - "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - "version" "2.0.2" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - "isexe" "^2.0.0" + isexe "^2.0.0" -"word-wrap@^1.2.3": - "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - "version" "1.2.3" +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -"wrap-ansi@^7.0.0": - "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - "version" "7.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - "ansi-styles" "^4.0.0" - "string-width" "^4.1.0" - "strip-ansi" "^6.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -"wrappy@1": - "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -"write-file-atomic@^4.0.1": - "integrity" "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==" - "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz" - "version" "4.0.1" +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== dependencies: - "imurmurhash" "^0.1.4" - "signal-exit" "^3.0.7" + imurmurhash "^0.1.4" + signal-exit "^3.0.7" -"xml@^1.0.1": - "integrity" "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" - "resolved" "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" - "version" "1.0.1" +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" + integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== -"y18n@^5.0.5": - "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - "version" "5.0.8" +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -"yallist@^4.0.0": - "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - "version" "4.0.0" +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -"yaml@^2.1.1": - "integrity" "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==" - "resolved" "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz" - "version" "2.1.1" +yaml@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz" + integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== -"yargs-parser@^21.0.0", "yargs-parser@^21.0.1": - "integrity" "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - "version" "21.1.1" +yargs-parser@^21.0.0, yargs-parser@^21.0.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -"yargs@^17.3.1": - "integrity" "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" - "version" "17.5.1" +yargs@^17.3.1: + version "17.5.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== dependencies: - "cliui" "^7.0.2" - "escalade" "^3.1.1" - "get-caller-file" "^2.0.5" - "require-directory" "^2.1.1" - "string-width" "^4.2.3" - "y18n" "^5.0.5" - "yargs-parser" "^21.0.0" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" -"yocto-queue@^0.1.0": - "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - "version" "0.1.0" +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 24823356fc71d08e4c2015f1ef03c826501cb28a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 22 Feb 2023 15:55:00 +0100 Subject: [PATCH 464/591] nym-crypto: update nym-sphinx-types dependency to published (#3086) * nym-crypto: update nym-sphinx-types dependency to published * nym-crypto: update cargo metadata --- common/crypto/Cargo.toml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/common/crypto/Cargo.toml b/common/crypto/Cargo.toml index b962a26f29..0600adf87d 100644 --- a/common/crypto/Cargo.toml +++ b/common/crypto/Cargo.toml @@ -1,15 +1,11 @@ [package] name = "nym-crypto" version = "0.1.0" +description = "Crypto library for the nym mixnet" edition = { workspace = true } authors = { workspace = true } license = { workspace = true } repository = { workspace = true } -readme = { workspace = true } -homepage = { workspace = true } -documentation = { workspace = true } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] aes = { version = "0.8.1", optional = true } @@ -30,7 +26,7 @@ subtle-encoding = { version = "0.5", features = ["bech32-preview"]} thiserror = "1.0.37" # internal -nym-sphinx-types = { path = "../nymsphinx/types" } +nym-sphinx-types = { path = "../nymsphinx/types", version = "0.1.0" } nym-pemstore = { path = "../../common/pemstore", version = "0.1.0" } [dev-dependencies] From f5bcb8be6f8ce07e4670ae9537cc8666860f2a59 Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 22 Feb 2023 10:06:33 -0500 Subject: [PATCH 465/591] cleanup after testing and fixing windows builds --- .github/workflows/nym-connect-publish-windows10.yml | 6 ------ .github/workflows/nym-wallet-publish-windows10.yml | 5 +++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 755450f89e..0b4ac6df96 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -4,10 +4,6 @@ on: release: types: [created] -env: - ACTIONS_RUNNER_DEBUG: true - ACTIONS_STEP_DEBUG: true - defaults: run: working-directory: nym-connect @@ -61,7 +57,6 @@ jobs: - name: Install app dependencies run: yarn --network-timeout 100000 - working-directory: nym-connect - name: Build and sign it env: @@ -72,7 +67,6 @@ jobs: TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} run: yarn build - working-directory: nym-connect - name: Upload Artifact uses: actions/upload-artifact@v3 diff --git a/.github/workflows/nym-wallet-publish-windows10.yml b/.github/workflows/nym-wallet-publish-windows10.yml index 39833bd3cd..53411b7571 100644 --- a/.github/workflows/nym-wallet-publish-windows10.yml +++ b/.github/workflows/nym-wallet-publish-windows10.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [windows-latest] + platform: [windows10] runs-on: ${{ matrix.platform }} steps: @@ -71,12 +71,13 @@ jobs: - name: Upload Artifact uses: actions/upload-artifact@v3 with: - name: nym-wallet.0.0_x64_en-US.msi + name: nym-wallet_1.0.0_x64_en-US.msi path: nym-wallet/target/release/bundle/msi/nym-wallet_1.*.msi retention-days: 30 - name: Upload to release based on tag name uses: softprops/action-gh-release@v1 + if: github.event_name == 'release' with: files: | nym-wallet/target/release/bundle/msi/*.msi From 2553d633ae6558fe35bec916dc8a4e507f27704f Mon Sep 17 00:00:00 2001 From: benedetta davico <46782255+benedettadavico@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:13:27 +0100 Subject: [PATCH 466/591] Update run-api-tests.yml --- .github/workflows/run-api-tests.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run-api-tests.yml b/.github/workflows/run-api-tests.yml index c33eebd2d3..1d2afec2bd 100644 --- a/.github/workflows/run-api-tests.yml +++ b/.github/workflows/run-api-tests.yml @@ -16,7 +16,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - + + - name: Install npm + run: npm install + - name: Node v18 uses: actions/setup-node@v3 with: From e09b2ab7d62670a87200c839c5075dfa2c354b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 22 Feb 2023 15:19:52 +0000 Subject: [PATCH 467/591] reversed the dependency between 'nym-contracts-common' and 'dkg' (#3089) --- Cargo.lock | 2 +- .../contracts-common/Cargo.toml | 1 - .../contracts-common/src/dealings.rs | 16 ---------------- common/dkg/Cargo.toml | 7 ++++++- common/dkg/src/dealing.rs | 18 ++++++++++++++++++ nym-api/Cargo.toml | 4 ++-- 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7235f28297..a5ae3d2f08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1601,6 +1601,7 @@ dependencies = [ "ff 0.11.1", "group 0.11.0", "lazy_static", + "nym-contracts-common", "nym-pemstore", "rand 0.8.5", "rand_chacha 0.3.1", @@ -3519,7 +3520,6 @@ version = "0.1.0" dependencies = [ "bs58", "cosmwasm-std", - "dkg", "schemars", "serde", "serde_json", diff --git a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml index 946f0cce90..59042f9a48 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml +++ b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml @@ -9,7 +9,6 @@ edition = "2021" [dependencies] bs58 = "0.4.0" cosmwasm-std = "1.0.0" -dkg = { path = "../../../common/dkg", optional = true } schemars = "0.8" serde = { version = "1.0", features = ["derive"] } thiserror = "1" diff --git a/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs b/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs index f28ca85ba2..cfc22e8727 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs +++ b/common/cosmwasm-smart-contracts/contracts-common/src/dealings.rs @@ -69,19 +69,3 @@ impl<'de> Deserialize<'de> for ContractSafeBytes { Ok(ContractSafeBytes(bytes)) } } - -#[cfg(feature = "dkg")] -impl<'a> From<&'a Dealing> for ContractSafeBytes { - fn from(dealing: &'a Dealing) -> Self { - ContractSafeBytes(dealing.to_bytes()) - } -} - -#[cfg(feature = "dkg")] -impl<'a> TryFrom<&'a ContractSafeBytes> for Dealing { - type Error = DkgError; - - fn try_from(value: &'a ContractSafeBytes) -> Result { - Dealing::try_from_bytes(&value.0) - } -} diff --git a/common/dkg/Cargo.toml b/common/dkg/Cargo.toml index 33ec03447a..525001f42e 100644 --- a/common/dkg/Cargo.toml +++ b/common/dkg/Cargo.toml @@ -12,9 +12,10 @@ bitvec = "1.0.0" # unfortunately until https://github.com/zkcrypto/bls12_381/issues/10 is resolved, we have to rely on the fork # as we need to be able to serialize Gt so that we could create the lookup table for baby-step-giant-step algorithm bls12_381 = { git = "https://github.com/jstuczyn/bls12_381", branch ="gt-serialisation", default-features = false, features = ["alloc", "pairings", "experimental", "zeroize"] } - +nym-contracts-common = { path = "../cosmwasm-smart-contracts/contracts-common", optional = true } bs58 = "0.4" + lazy_static = "1.4.0" rand = { version = "0.8.5", default-features = false} rand_chacha = "0.3" @@ -41,3 +42,7 @@ criterion = "0.3" [[bench]] name = "benchmarks" harness = false + +[features] +default = [] +cw-types = ["nym-contracts-common"] \ No newline at end of file diff --git a/common/dkg/src/dealing.rs b/common/dkg/src/dealing.rs index d92a9ba6b4..ff31c5736e 100644 --- a/common/dkg/src/dealing.rs +++ b/common/dkg/src/dealing.rs @@ -307,6 +307,24 @@ impl Dealing { } } +#[cfg(feature = "cw-types")] +impl<'a> From<&'a Dealing> for nym_contracts_common::dealings::ContractSafeBytes { + fn from(dealing: &'a Dealing) -> Self { + nym_contracts_common::dealings::ContractSafeBytes(dealing.to_bytes()) + } +} + +#[cfg(feature = "cw-types")] +impl<'a> TryFrom<&'a nym_contracts_common::dealings::ContractSafeBytes> for Dealing { + type Error = DkgError; + + fn try_from( + value: &'a nym_contracts_common::dealings::ContractSafeBytes, + ) -> Result { + Dealing::try_from_bytes(&value.0) + } +} + // this assumes all dealings have been verified pub fn try_recover_verification_keys( dealings: &[Dealing], diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index a1ae9478b5..f64d624708 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -75,12 +75,12 @@ credentials = { path = "../common/credentials" } nym-crypto = { path = "../common/crypto" } cw3 = { version = "0.13.4" } cw4 = { version = "0.13.4" } -dkg = { path = "../common/dkg" } +dkg = { path = "../common/dkg", features = ["cw-types"] } gateway-client = { path = "../common/client-libs/gateway-client" } nym-inclusion-probability = { path = "../common/inclusion-probability" } nym-mixnet-contract-common = { path = "../common/cosmwasm-smart-contracts/mixnet-contract" } nym-vesting-contract-common = { path = "../common/cosmwasm-smart-contracts/vesting-contract" } -nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common", features = ["dkg"] } +nym-contracts-common = { path = "../common/cosmwasm-smart-contracts/contracts-common" } multisig-contract-common = { path = "../common/cosmwasm-smart-contracts/multisig-contract" } nymcoconut = { path = "../common/nymcoconut" } nym-sphinx = { path = "../common/nymsphinx" } From ae56d3685c455b743220ec2d3b869012f4e90981 Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Wed, 22 Feb 2023 17:01:46 +0100 Subject: [PATCH 468/591] refactor(nym-connect): new file structure (#3082) * refactor(nc-android): move nc android into mobile/nym-connect rename the android app ID to "nym_connect" * chore(nc-mobile): restore dist directory * fix: typo * chore: restore gitkeep * chore: track Cargo.lock * ci: trigger ts lint workflow on pull request * refactor(nym-connect): new structure move temp mobile version under nym-connect-new/mobile * refactor(nym-connect): new structure move temp desktop version under nym-connect-new/desktop * refactor(nym-connect): new structure rename nym-connect-new to nym-connect * refactor(nym-connect): new structure restore lost .gitkeep * refactor(nym-connect): new structure restore lost .gitkeep * fix(nym-connect-desktop): broken relative paths * fix(nym-connect-mobile): add todo comment about broken deps * ci(nym-connect): fix relative paths * ci(nym-connect): rename workflow --- ...roid-apk.yml => connect-android-build.yml} | 14 +++--- ...nym-connect.yml => connect-desktop-ci.yml} | 8 +-- .../{connect.yml => connect-desktop.yml} | 44 +++++++++-------- ...connect-android.yml => connect-mobile.yml} | 22 +++++---- .../workflows/nym-connect-publish-macos.yml | 10 ++-- .../workflows/nym-connect-publish-ubuntu.yml | 10 ++-- .../nym-connect-publish-windows10.yml | 10 ++-- .github/workflows/typescript-lint.yml | 18 +++++-- Cargo.toml | 2 +- Makefile | 46 +++++++++--------- lerna.json | 5 +- .../nym_connect_android/app/.gitignore | 1 - .../nym_connect_android/MainActivity.kt | 3 -- .../arm64-v8a/libnym_connect_android.so | 1 - .../armeabi-v7a/libnym_connect_android.so | 1 - .../jniLibs/x86/libnym_connect_android.so | 1 - .../jniLibs/x86_64/libnym_connect_android.so | 1 - .../desktop}/.babelrc | 0 .../desktop}/.env.sample | 0 .../desktop}/.eslintrc | 0 .../desktop}/.nvmrc | 0 .../desktop}/.prettierrc | 0 .../desktop}/.storybook/main.js | 0 .../desktop}/.storybook/mocks/tauri/app.js | 0 .../.storybook/mocks/tauri/clipboard.js | 0 .../desktop}/.storybook/mocks/tauri/event.js | 0 .../desktop}/.storybook/mocks/tauri/index.js | 0 .../.storybook/mocks/tauri/notification.js | 0 .../desktop}/.storybook/mocks/tauri/window.js | 0 .../desktop}/.storybook/preview-fonts.js | 0 .../desktop}/.storybook/preview.js | 0 nym-connect/{ => desktop}/CHANGELOG.md | 0 nym-connect/{ => desktop}/Cargo.toml | 0 nym-connect/{ => desktop}/README.md | 2 +- .../desktop}/dist/.gitkeep | 0 nym-connect/{ => desktop}/package.json | 8 +-- .../desktop}/public/favicon.ico | Bin .../desktop}/public/favicon.png | Bin nym-connect/{ => desktop}/public/growth.html | 0 .../desktop}/public/index.html | 0 nym-connect/{ => desktop}/public/log.html | 0 .../desktop}/src-tauri/.gitignore | 0 .../{ => desktop}/src-tauri/Cargo.toml | 16 +++--- .../desktop}/src-tauri/icons/128x128.png | Bin .../desktop}/src-tauri/icons/128x128@2x.png | Bin .../desktop}/src-tauri/icons/32x32.png | Bin .../src-tauri/icons/Square107x107Logo.png | Bin .../src-tauri/icons/Square142x142Logo.png | Bin .../src-tauri/icons/Square150x150Logo.png | Bin .../src-tauri/icons/Square284x284Logo.png | Bin .../src-tauri/icons/Square30x30Logo.png | Bin .../src-tauri/icons/Square310x310Logo.png | Bin .../src-tauri/icons/Square44x44Logo.png | Bin .../src-tauri/icons/Square71x71Logo.png | Bin .../src-tauri/icons/Square89x89Logo.png | Bin .../desktop}/src-tauri/icons/StoreLogo.png | Bin .../desktop}/src-tauri/icons/icon.icns | Bin .../desktop}/src-tauri/icons/icon.ico | Bin .../desktop}/src-tauri/icons/icon.png | Bin .../desktop}/src-tauri/icons/tray_icon.ico | Bin .../desktop}/src-tauri/icons/tray_icon.png | Bin .../desktop}/src-tauri/src/build.rs | 0 .../{ => desktop}/src-tauri/src/config/mod.rs | 0 .../{ => desktop}/src-tauri/src/error.rs | 0 .../desktop}/src-tauri/src/events.rs | 0 .../desktop}/src-tauri/src/logging.rs | 0 .../{ => desktop}/src-tauri/src/main.rs | 0 .../{ => desktop}/src-tauri/src/menu.rs | 0 .../{ => desktop}/src-tauri/src/models/mod.rs | 0 .../src/operations/connection/connect.rs | 0 .../src/operations/connection/disconnect.rs | 0 .../src/operations/connection/health_check.rs | 0 .../src/operations/connection/mod.rs | 0 .../src/operations/connection/status.rs | 0 .../src-tauri/src/operations/directory/mod.rs | 0 .../src-tauri/src/operations/export.rs | 0 .../src/operations/growth/api_client.rs | 0 .../src-tauri/src/operations/growth/assets.rs | 0 .../src-tauri/src/operations/growth/mod.rs | 0 .../src/operations/growth/test_and_earn.rs | 0 .../src-tauri/src/operations/help/log.rs | 0 .../src-tauri/src/operations/help/mod.rs | 0 .../src-tauri/src/operations/help/storage.rs | 0 .../desktop}/src-tauri/src/operations/http.rs | 0 .../src-tauri/src/operations/mod.rs | 0 .../src-tauri/src/operations/window/mod.rs | 0 .../{ => desktop}/src-tauri/src/state.rs | 0 .../{ => desktop}/src-tauri/src/tasks.rs | 0 .../desktop}/src-tauri/src/window.rs | 0 .../{ => desktop}/src-tauri/tauri.conf.json | 0 .../desktop}/src/assets/help-step-four.png | Bin .../src/assets/help-step-one-legacy.png | Bin .../desktop}/src/assets/help-step-one.png | Bin .../desktop}/src/assets/help-step-three.png | Bin .../src/assets/help-step-two-legacy.png | Bin .../desktop}/src/assets/help-step-two.png | Bin .../desktop}/src/components/AppVersion.tsx | 0 .../src/components/AppWindowFrame.tsx | 0 .../src/components/ConnectionButton.tsx | 0 .../src/components/ConnectionStats.tsx | 0 .../src/components/ConnectionStatus.tsx | 0 .../src/components/ConntectionTimer.tsx | 0 .../src/components/CopyToClipboard.tsx | 0 .../src/components/CustomTitleBar.tsx | 11 ++++- .../desktop}/src/components/Error.tsx | 0 .../desktop}/src/components/ErrorFallback.tsx | 0 .../src/components/ExperimentalWarning.tsx | 0 .../Growth/TestAndEarnButtonArea.tsx | 0 .../Growth/TestAndEarnCurrentDraw.stories.tsx | 0 .../Growth/TestAndEarnCurrentDraw.tsx | 0 .../Growth/TestAndEarnDraws.stories.tsx | 0 .../components/Growth/TestAndEarnDraws.tsx | 0 .../TestAndEarnEnterWalletAddress.stories.tsx | 0 .../Growth/TestAndEarnEnterWalletAddress.tsx | 0 .../components/Growth/TestAndEarnError.tsx | 0 .../Growth/TestAndEarnPopup.stories.tsx | 0 .../components/Growth/TestAndEarnPopup.tsx | 0 .../components/Growth/TestAndEarnTakePart.tsx | 0 .../Growth/TestAndEarnWinner.stories.tsx | 0 .../components/Growth/TestAndEarnWinner.tsx | 0 .../Growth/TestAndEarnWinnerWalletAddress.tsx | 0 .../Growth/content/TestAndEarn/Error.mdx | 0 .../content/TestAndEarn/Stage0_intro.mdx | 0 .../TestAndEarn/WinnerEntersWalletAddress.mdx | 0 .../content/TestAndEarnNotAvaialble.mdx | 0 .../Growth/content/assets/matrix.webp | Bin .../Growth/content/assets/winner.webp | Bin .../src/components/Growth/content/en.yaml | 0 .../Growth/context/TestAndEarnContext.tsx | 0 .../context/mocks/TestAndEarnContext.tsx | 0 .../src/components/Growth/context/types.ts | 0 .../{ => desktop}/src/components/HelpPage.tsx | 0 .../src/components/HelpPageActions.tsx | 0 .../desktop}/src/components/HelpPageImage.tsx | 0 .../src/components/HelpPageStepIndicator.tsx | 0 .../src/components/InfoModal.tsx | 0 .../src/components/IpAddressAndPort.tsx | 0 .../src/components/IpAddressAndPortModal.tsx | 0 .../src/components/LogViewer/index.tsx | 0 .../desktop}/src/components/NeedHelp.tsx | 0 .../components/PowerButton/PowerButton.tsx | 0 .../components/PowerButton/power-button.css | 0 .../src/components/ServiceProviderPopup.tsx | 0 .../ServiceProviderSelector.stories.tsx | 0 .../components/ServiceProviderSelector.tsx | 0 .../components/ServiceSelector.stories.tsx | 0 .../src/components/ServiceSelector.tsx | 0 .../src/components/TooltipInfo.tsx | 0 .../desktop}/src/config.ts | 0 .../desktop}/src/context/main.tsx | 0 .../desktop}/src/context/mocks/main.tsx | 0 ...OpenSans-Italic-VariableFont_wdth,wght.ttf | Bin .../fonts/OpenSans-VariableFont_wdth,wght.ttf | Bin .../desktop}/src/fonts/fonts.css | 0 nym-connect/{ => desktop}/src/growth.tsx | 0 .../desktop}/src/hooks/events.ts | 0 nym-connect/{ => desktop}/src/index.tsx | 0 .../src/layouts/ConnectionLayout.tsx | 0 nym-connect/{ => desktop}/src/log.tsx | 0 .../src/pages/connection/Connected.tsx | 0 .../src/pages/connection/Disconnected.tsx | 0 .../src/pages/connection/index.tsx | 0 .../{ => desktop}/src/pages/menu/Apps.tsx | 0 .../desktop}/src/pages/menu/Guide.tsx | 0 .../{ => desktop}/src/pages/menu/index.tsx | 0 .../pages/menu/settings/GatewaySettings.tsx | 0 .../src/pages/menu/settings/index.tsx | 0 .../{ => desktop}/src/routes/index.tsx | 0 .../desktop}/src/stories/AppFlow.stories.tsx | 0 .../src/stories/AppWindowFrame.stories.tsx | 0 .../src/stories/ConnectedLayout.stories.tsx | 0 .../src/stories/ConnectionButton.stories.tsx | 0 .../src/stories/ConnectionStats.stories.tsx | 0 .../src/stories/ConnectionStatus.stories.tsx | 0 .../src/stories/DefaultLayout.stories.tsx | 0 .../src/stories/Introduction.stories.mdx | 0 .../src/stories/IpAddressAndPort.stories.tsx | 0 .../src/stories/PowerButton.stories.tsx | 0 .../desktop}/src/theme/index.tsx | 2 +- .../desktop}/src/theme/mui-theme.d.ts | 0 nym-connect/{ => desktop}/src/theme/theme.tsx | 0 .../desktop}/src/types/connection.ts | 0 .../desktop}/src/types/directory.ts | 0 .../desktop}/src/types/error.ts | 0 .../desktop}/src/types/event.ts | 0 .../desktop}/src/types/gateway.ts | 0 .../desktop}/src/types/index.ts | 0 .../desktop}/src/types/rust/index.ts | 0 .../desktop}/src/types/rust/stateparams.ts | 0 .../desktop}/src/typings/FC.d.ts | 0 .../desktop}/src/typings/jpeg.d.ts | 0 .../desktop}/src/typings/json.d.ts | 0 .../desktop}/src/typings/png.d.ts | 0 .../desktop}/src/typings/svg.d.ts | 0 .../desktop}/src/typings/webp.d.ts | 0 .../desktop}/src/typings/yaml.d.ts | 0 nym-connect/{ => desktop}/src/utils/index.ts | 0 .../desktop}/tsconfig.eslint.json | 0 nym-connect/{ => desktop}/tsconfig.json | 0 nym-connect/{ => desktop}/webpack.common.js | 0 nym-connect/{ => desktop}/webpack.dev.js | 0 nym-connect/{ => desktop}/webpack.prod.js | 0 nym-connect/{ => mobile}/.babelrc | 0 nym-connect/{ => mobile}/.env.sample | 0 nym-connect/{ => mobile}/.eslintrc | 0 nym-connect/{ => mobile}/.nvmrc | 0 nym-connect/{ => mobile}/.prettierrc | 0 nym-connect/{ => mobile}/.storybook/main.js | 0 .../.storybook/mocks/tauri/app.js | 0 .../.storybook/mocks/tauri/clipboard.js | 0 .../.storybook/mocks/tauri/event.js | 0 .../.storybook/mocks/tauri/index.js | 0 .../.storybook/mocks/tauri/notification.js | 0 .../.storybook/mocks/tauri/window.js | 0 .../{ => mobile}/.storybook/preview-fonts.js | 0 .../{ => mobile}/.storybook/preview.js | 0 .../mobile}/CHANGELOG.md | 0 .../mobile}/README.md | 15 +++--- .../mobile/dist}/.gitkeep | 0 .../mobile}/package.json | 22 +++++---- nym-connect/{ => mobile}/public/favicon.ico | Bin nym-connect/{ => mobile}/public/favicon.png | Bin nym-connect/{ => mobile}/public/index.html | 0 .../mobile}/src-tauri/.cargo/config.toml | 8 +-- .../mobile}/src-tauri/.cargo/libgcc.a | 0 nym-connect/{ => mobile}/src-tauri/.gitignore | 0 .../mobile}/src-tauri/Cargo.lock | 2 +- .../mobile}/src-tauri/Cargo.toml | 22 ++++----- .../gen/android/nym_connect}/.editorconfig | 0 .../gen/android/nym_connect}/.gitignore | 0 .../gen/android/nym_connect/app/.gitignore | 1 + .../android/nym_connect}/app/build.gradle.kts | 6 +-- .../nym_connect}/app/proguard-rules.pro | 0 .../app/src/main/AndroidManifest.xml | 7 ++- .../net/nymtech/nym_connect/MainActivity.kt | 3 ++ .../nymtech/nym_connect/generated}/.gitkeep | 0 .../src/main/jniLibs/x86_64/libnym_connect.so | 1 + .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_foreground.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_foreground.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../app/src/main/res/values-night/themes.xml | 4 +- .../app/src/main/res/values/colors.xml | 0 .../res/values/ic_launcher_background.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/themes.xml | 4 +- .../gen/android/nym_connect}/build.gradle.kts | 0 .../nym_connect}/buildSrc/build.gradle.kts | 0 .../nymtech/nym_connect}/kotlin/BuildTask.kt | 0 .../nymtech/nym_connect}/kotlin/RustPlugin.kt | 0 .../android/nym_connect}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gen/android/nym_connect}/gradlew | 0 .../gen/android/nym_connect}/gradlew.bat | 0 .../gen/android/nym_connect}/settings.gradle | 0 .../{ => mobile}/src-tauri/icons/128x128.png | Bin .../src-tauri/icons/128x128@2x.png | Bin .../{ => mobile}/src-tauri/icons/32x32.png | Bin .../src-tauri/icons/Square107x107Logo.png | Bin .../src-tauri/icons/Square142x142Logo.png | Bin .../src-tauri/icons/Square150x150Logo.png | Bin .../src-tauri/icons/Square284x284Logo.png | Bin .../src-tauri/icons/Square30x30Logo.png | Bin .../src-tauri/icons/Square310x310Logo.png | Bin .../src-tauri/icons/Square44x44Logo.png | Bin .../src-tauri/icons/Square71x71Logo.png | Bin .../src-tauri/icons/Square89x89Logo.png | Bin .../src-tauri/icons/StoreLogo.png | Bin .../{ => mobile}/src-tauri/icons/icon.icns | Bin .../{ => mobile}/src-tauri/icons/icon.ico | Bin .../{ => mobile}/src-tauri/icons/icon.png | Bin .../src-tauri/icons/tray_icon.ico | Bin .../src-tauri/icons/tray_icon.png | Bin .../{ => mobile}/src-tauri/src/build.rs | 0 .../mobile}/src-tauri/src/config/mod.rs | 0 .../mobile}/src-tauri/src/error.rs | 0 .../{ => mobile}/src-tauri/src/events.rs | 0 .../mobile}/src-tauri/src/lib.rs | 0 .../{ => mobile}/src-tauri/src/logging.rs | 0 .../mobile}/src-tauri/src/main.rs | 2 +- .../mobile}/src-tauri/src/menu.rs | 0 .../mobile}/src-tauri/src/mobile.rs | 0 .../mobile}/src-tauri/src/models/mod.rs | 0 .../src/operations/connection/connect.rs | 0 .../src/operations/connection/disconnect.rs | 0 .../src/operations/connection/health_check.rs | 0 .../src/operations/connection/mod.rs | 0 .../src/operations/connection/status.rs | 0 .../src-tauri/src/operations/directory/mod.rs | 0 .../src-tauri/src/operations/export.rs | 0 .../src-tauri/src/operations/help/log.rs | 0 .../src-tauri/src/operations/help/mod.rs | 0 .../src-tauri/src/operations/help/storage.rs | 0 .../src-tauri/src/operations/http.rs | 0 .../mobile}/src-tauri/src/operations/mod.rs | 0 .../src-tauri/src/operations/window/mod.rs | 0 .../mobile}/src-tauri/src/state.rs | 0 .../mobile}/src-tauri/src/tasks.rs | 0 .../{ => mobile}/src-tauri/src/window.rs | 0 .../mobile}/src-tauri/tauri.conf.json | 2 +- .../src/assets/help-step-four.png | Bin .../src/assets/help-step-one-legacy.png | Bin .../{ => mobile}/src/assets/help-step-one.png | Bin .../src/assets/help-step-three.png | Bin .../src/assets/help-step-two-legacy.png | Bin .../{ => mobile}/src/assets/help-step-two.png | Bin .../src/components/AppVersion.tsx | 0 .../mobile}/src/components/AppWindowFrame.tsx | 0 .../src/components/ConnectionButton.tsx | 0 .../src/components/ConnectionStats.tsx | 0 .../src/components/ConnectionStatus.tsx | 0 .../src/components/ConntectionTimer.tsx | 0 .../src/components/CopyToClipboard.tsx | 0 .../mobile}/src/components/CustomTitleBar.tsx | 11 ++++- .../{ => mobile}/src/components/Error.tsx | 0 .../src/components/ErrorFallback.tsx | 0 .../src/components/ExperimentalWarning.tsx | 0 .../Growth/content/assets/matrix.webp | Bin .../mobile}/src/components/HelpPage.tsx | 0 .../src/components/HelpPageActions.tsx | 0 .../src/components/HelpPageImage.tsx | 0 .../src/components/HelpPageStepIndicator.tsx | 0 .../mobile}/src/components/InfoModal.tsx | 0 .../src/components/IpAddressAndPort.tsx | 0 .../src/components/IpAddressAndPortModal.tsx | 0 .../{ => mobile}/src/components/NeedHelp.tsx | 0 .../components/PowerButton/PowerButton.tsx | 0 .../components/PowerButton/power-button.css | 0 .../src/components/ServiceProviderPopup.tsx | 0 .../ServiceProviderSelector.stories.tsx | 0 .../components/ServiceProviderSelector.tsx | 0 .../components/ServiceSelector.stories.tsx | 0 .../src/components/ServiceSelector.tsx | 0 .../mobile}/src/components/TooltipInfo.tsx | 0 nym-connect/{ => mobile}/src/config.ts | 0 nym-connect/{ => mobile}/src/context/main.tsx | 0 .../{ => mobile}/src/context/mocks/main.tsx | 0 ...OpenSans-Italic-VariableFont_wdth,wght.ttf | Bin .../fonts/OpenSans-VariableFont_wdth,wght.ttf | Bin nym-connect/{ => mobile}/src/fonts/fonts.css | 0 nym-connect/{ => mobile}/src/hooks/events.ts | 0 .../mobile}/src/index.tsx | 0 .../mobile}/src/layouts/ConnectionLayout.tsx | 0 .../src/pages/connection/Connected.tsx | 0 .../src/pages/connection/Disconnected.tsx | 0 .../mobile}/src/pages/connection/index.tsx | 0 .../mobile}/src/pages/menu/Apps.tsx | 0 .../{ => mobile}/src/pages/menu/Guide.tsx | 0 .../mobile}/src/pages/menu/Settings.tsx | 0 .../mobile}/src/pages/menu/index.tsx | 0 .../mobile}/src/routes/index.tsx | 0 .../src/stories/AppFlow.stories.tsx | 0 .../src/stories/AppWindowFrame.stories.tsx | 0 .../src/stories/ConnectedLayout.stories.tsx | 0 .../src/stories/ConnectionButton.stories.tsx | 0 .../src/stories/ConnectionStats.stories.tsx | 0 .../src/stories/ConnectionStatus.stories.tsx | 0 .../src/stories/DefaultLayout.stories.tsx | 0 .../src/stories/Introduction.stories.mdx | 0 .../src/stories/IpAddressAndPort.stories.tsx | 0 .../src/stories/PowerButton.stories.tsx | 0 nym-connect/{ => mobile}/src/theme/index.tsx | 2 +- .../{ => mobile}/src/theme/mui-theme.d.ts | 0 .../mobile}/src/theme/theme.tsx | 0 .../{ => mobile}/src/types/connection.ts | 0 .../{ => mobile}/src/types/directory.ts | 0 nym-connect/{ => mobile}/src/types/error.ts | 0 nym-connect/{ => mobile}/src/types/event.ts | 0 nym-connect/{ => mobile}/src/types/gateway.ts | 0 nym-connect/{ => mobile}/src/types/index.ts | 0 .../{ => mobile}/src/types/rust/index.ts | 0 .../src/types/rust/stateparams.ts | 0 nym-connect/{ => mobile}/src/typings/FC.d.ts | 0 .../{ => mobile}/src/typings/jpeg.d.ts | 0 .../{ => mobile}/src/typings/json.d.ts | 0 nym-connect/{ => mobile}/src/typings/png.d.ts | 0 nym-connect/{ => mobile}/src/typings/svg.d.ts | 0 .../{ => mobile}/src/typings/webp.d.ts | 0 .../{ => mobile}/src/typings/yaml.d.ts | 0 .../mobile}/src/utils/index.ts | 0 nym-connect/{ => mobile}/tsconfig.eslint.json | 0 .../mobile}/tsconfig.json | 0 .../mobile}/webpack.common.js | 0 .../mobile}/webpack.dev.js | 0 .../mobile}/webpack.prod.js | 0 package.json | 3 +- 403 files changed, 192 insertions(+), 159 deletions(-) rename .github/workflows/{nc-android-apk.yml => connect-android-build.yml} (87%) rename .github/workflows/{nym-connect.yml => connect-desktop-ci.yml} (92%) rename .github/workflows/{connect.yml => connect-desktop.yml} (53%) rename .github/workflows/{connect-android.yml => connect-mobile.yml} (65%) delete mode 100644 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore delete mode 100644 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/MainActivity.kt delete mode 120000 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so delete mode 120000 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so delete mode 120000 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86/libnym_connect_android.so delete mode 120000 nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86_64/libnym_connect_android.so rename {nym-connect-android => nym-connect/desktop}/.babelrc (100%) rename {nym-connect-android => nym-connect/desktop}/.env.sample (100%) rename {nym-connect-android => nym-connect/desktop}/.eslintrc (100%) rename {nym-connect-android => nym-connect/desktop}/.nvmrc (100%) rename {nym-connect-android => nym-connect/desktop}/.prettierrc (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/main.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/mocks/tauri/app.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/mocks/tauri/clipboard.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/mocks/tauri/event.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/mocks/tauri/index.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/mocks/tauri/notification.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/mocks/tauri/window.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/preview-fonts.js (100%) rename {nym-connect-android => nym-connect/desktop}/.storybook/preview.js (100%) rename nym-connect/{ => desktop}/CHANGELOG.md (100%) rename nym-connect/{ => desktop}/Cargo.toml (100%) rename nym-connect/{ => desktop}/README.md (99%) rename {nym-connect-android => nym-connect/desktop}/dist/.gitkeep (100%) rename nym-connect/{ => desktop}/package.json (96%) rename {nym-connect-android => nym-connect/desktop}/public/favicon.ico (100%) rename {nym-connect-android => nym-connect/desktop}/public/favicon.png (100%) rename nym-connect/{ => desktop}/public/growth.html (100%) rename {nym-connect-android => nym-connect/desktop}/public/index.html (100%) rename nym-connect/{ => desktop}/public/log.html (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/.gitignore (100%) rename nym-connect/{ => desktop}/src-tauri/Cargo.toml (75%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/128x128.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/128x128@2x.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/32x32.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square107x107Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square142x142Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square150x150Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square284x284Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square30x30Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square310x310Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square44x44Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square71x71Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/Square89x89Logo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/StoreLogo.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/icon.icns (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/icon.ico (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/icon.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/tray_icon.ico (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/icons/tray_icon.png (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/build.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/config/mod.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/error.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/events.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/logging.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/main.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/menu.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/models/mod.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/connection/connect.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/connection/disconnect.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/connection/health_check.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/connection/mod.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/connection/status.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/directory/mod.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/export.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/operations/growth/api_client.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/operations/growth/assets.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/operations/growth/mod.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/operations/growth/test_and_earn.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/operations/help/log.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/help/mod.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/help/storage.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/http.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/operations/mod.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/operations/window/mod.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/state.rs (100%) rename nym-connect/{ => desktop}/src-tauri/src/tasks.rs (100%) rename {nym-connect-android => nym-connect/desktop}/src-tauri/src/window.rs (100%) rename nym-connect/{ => desktop}/src-tauri/tauri.conf.json (100%) rename {nym-connect-android => nym-connect/desktop}/src/assets/help-step-four.png (100%) rename {nym-connect-android => nym-connect/desktop}/src/assets/help-step-one-legacy.png (100%) rename {nym-connect-android => nym-connect/desktop}/src/assets/help-step-one.png (100%) rename {nym-connect-android => nym-connect/desktop}/src/assets/help-step-three.png (100%) rename {nym-connect-android => nym-connect/desktop}/src/assets/help-step-two-legacy.png (100%) rename {nym-connect-android => nym-connect/desktop}/src/assets/help-step-two.png (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/AppVersion.tsx (100%) rename nym-connect/{ => desktop}/src/components/AppWindowFrame.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ConnectionButton.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ConnectionStats.tsx (100%) rename nym-connect/{ => desktop}/src/components/ConnectionStatus.tsx (100%) rename nym-connect/{ => desktop}/src/components/ConntectionTimer.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/CopyToClipboard.tsx (100%) rename nym-connect/{ => desktop}/src/components/CustomTitleBar.tsx (87%) rename {nym-connect-android => nym-connect/desktop}/src/components/Error.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ErrorFallback.tsx (100%) rename nym-connect/{ => desktop}/src/components/ExperimentalWarning.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnButtonArea.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnCurrentDraw.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnDraws.stories.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnDraws.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnEnterWalletAddress.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnError.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnPopup.stories.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnPopup.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnTakePart.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnWinner.stories.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnWinner.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/content/TestAndEarn/Error.mdx (100%) rename nym-connect/{ => desktop}/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx (100%) rename nym-connect/{ => desktop}/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx (100%) rename nym-connect/{ => desktop}/src/components/Growth/content/TestAndEarnNotAvaialble.mdx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/Growth/content/assets/matrix.webp (100%) rename nym-connect/{ => desktop}/src/components/Growth/content/assets/winner.webp (100%) rename nym-connect/{ => desktop}/src/components/Growth/content/en.yaml (100%) rename nym-connect/{ => desktop}/src/components/Growth/context/TestAndEarnContext.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/context/mocks/TestAndEarnContext.tsx (100%) rename nym-connect/{ => desktop}/src/components/Growth/context/types.ts (100%) rename nym-connect/{ => desktop}/src/components/HelpPage.tsx (100%) rename nym-connect/{ => desktop}/src/components/HelpPageActions.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/HelpPageImage.tsx (100%) rename nym-connect/{ => desktop}/src/components/HelpPageStepIndicator.tsx (100%) rename nym-connect/{ => desktop}/src/components/InfoModal.tsx (100%) rename nym-connect/{ => desktop}/src/components/IpAddressAndPort.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/IpAddressAndPortModal.tsx (100%) rename nym-connect/{ => desktop}/src/components/LogViewer/index.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/NeedHelp.tsx (100%) rename nym-connect/{ => desktop}/src/components/PowerButton/PowerButton.tsx (100%) rename nym-connect/{ => desktop}/src/components/PowerButton/power-button.css (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ServiceProviderPopup.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ServiceProviderSelector.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ServiceProviderSelector.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ServiceSelector.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/components/ServiceSelector.tsx (100%) rename nym-connect/{ => desktop}/src/components/TooltipInfo.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/config.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/context/main.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/context/mocks/main.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf (100%) rename {nym-connect-android => nym-connect/desktop}/src/fonts/OpenSans-VariableFont_wdth,wght.ttf (100%) rename {nym-connect-android => nym-connect/desktop}/src/fonts/fonts.css (100%) rename nym-connect/{ => desktop}/src/growth.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/hooks/events.ts (100%) rename nym-connect/{ => desktop}/src/index.tsx (100%) rename nym-connect/{ => desktop}/src/layouts/ConnectionLayout.tsx (100%) rename nym-connect/{ => desktop}/src/log.tsx (100%) rename nym-connect/{ => desktop}/src/pages/connection/Connected.tsx (100%) rename nym-connect/{ => desktop}/src/pages/connection/Disconnected.tsx (100%) rename nym-connect/{ => desktop}/src/pages/connection/index.tsx (100%) rename nym-connect/{ => desktop}/src/pages/menu/Apps.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/pages/menu/Guide.tsx (100%) rename nym-connect/{ => desktop}/src/pages/menu/index.tsx (100%) rename nym-connect/{ => desktop}/src/pages/menu/settings/GatewaySettings.tsx (100%) rename nym-connect/{ => desktop}/src/pages/menu/settings/index.tsx (100%) rename nym-connect/{ => desktop}/src/routes/index.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/AppFlow.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/AppWindowFrame.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/ConnectedLayout.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/ConnectionButton.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/ConnectionStats.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/ConnectionStatus.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/DefaultLayout.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/Introduction.stories.mdx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/IpAddressAndPort.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/stories/PowerButton.stories.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/theme/index.tsx (94%) rename {nym-connect-android => nym-connect/desktop}/src/theme/mui-theme.d.ts (100%) rename nym-connect/{ => desktop}/src/theme/theme.tsx (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/connection.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/directory.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/error.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/event.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/gateway.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/index.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/rust/index.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/types/rust/stateparams.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/typings/FC.d.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/typings/jpeg.d.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/typings/json.d.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/typings/png.d.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/typings/svg.d.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/typings/webp.d.ts (100%) rename {nym-connect-android => nym-connect/desktop}/src/typings/yaml.d.ts (100%) rename nym-connect/{ => desktop}/src/utils/index.ts (100%) rename {nym-connect-android => nym-connect/desktop}/tsconfig.eslint.json (100%) rename nym-connect/{ => desktop}/tsconfig.json (100%) rename nym-connect/{ => desktop}/webpack.common.js (100%) rename nym-connect/{ => desktop}/webpack.dev.js (100%) rename nym-connect/{ => desktop}/webpack.prod.js (100%) rename nym-connect/{ => mobile}/.babelrc (100%) rename nym-connect/{ => mobile}/.env.sample (100%) rename nym-connect/{ => mobile}/.eslintrc (100%) rename nym-connect/{ => mobile}/.nvmrc (100%) rename nym-connect/{ => mobile}/.prettierrc (100%) rename nym-connect/{ => mobile}/.storybook/main.js (100%) rename nym-connect/{ => mobile}/.storybook/mocks/tauri/app.js (100%) rename nym-connect/{ => mobile}/.storybook/mocks/tauri/clipboard.js (100%) rename nym-connect/{ => mobile}/.storybook/mocks/tauri/event.js (100%) rename nym-connect/{ => mobile}/.storybook/mocks/tauri/index.js (100%) rename nym-connect/{ => mobile}/.storybook/mocks/tauri/notification.js (100%) rename nym-connect/{ => mobile}/.storybook/mocks/tauri/window.js (100%) rename nym-connect/{ => mobile}/.storybook/preview-fonts.js (100%) rename nym-connect/{ => mobile}/.storybook/preview.js (100%) rename {nym-connect-android => nym-connect/mobile}/CHANGELOG.md (100%) rename {nym-connect-android => nym-connect/mobile}/README.md (71%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/generated => nym-connect/mobile/dist}/.gitkeep (100%) rename {nym-connect-android => nym-connect/mobile}/package.json (82%) rename nym-connect/{ => mobile}/public/favicon.ico (100%) rename nym-connect/{ => mobile}/public/favicon.png (100%) rename nym-connect/{ => mobile}/public/index.html (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/.cargo/config.toml (78%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/.cargo/libgcc.a (100%) rename nym-connect/{ => mobile}/src-tauri/.gitignore (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/Cargo.lock (99%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/Cargo.toml (75%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/.editorconfig (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/.gitignore (100%) create mode 100644 nym-connect/mobile/src-tauri/gen/android/nym_connect/app/.gitignore rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/build.gradle.kts (96%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/proguard-rules.pro (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/AndroidManifest.xml (86%) create mode 100644 nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/java/net/nymtech/nym_connect/MainActivity.kt rename nym-connect/{dist => mobile/src-tauri/gen/android/nym_connect/app/src/main/java/net/nymtech/nym_connect/generated}/.gitkeep (100%) create mode 120000 nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/jniLibs/x86_64/libnym_connect.so rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/layout/activity_main.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/values-night/themes.xml (88%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/values/colors.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/values/ic_launcher_background.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/values/strings.xml (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/app/src/main/res/values/themes.xml (88%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/build.gradle.kts (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/buildSrc/build.gradle.kts (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect}/kotlin/BuildTask.kt (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect}/kotlin/RustPlugin.kt (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/gradle.properties (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/gradle/wrapper/gradle-wrapper.jar (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/gradle/wrapper/gradle-wrapper.properties (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/gradlew (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/gradlew.bat (100%) rename {nym-connect-android/src-tauri/gen/android/nym_connect_android => nym-connect/mobile/src-tauri/gen/android/nym_connect}/settings.gradle (100%) rename nym-connect/{ => mobile}/src-tauri/icons/128x128.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/128x128@2x.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/32x32.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square107x107Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square142x142Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square150x150Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square284x284Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square30x30Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square310x310Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square44x44Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square71x71Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/Square89x89Logo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/StoreLogo.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/icon.icns (100%) rename nym-connect/{ => mobile}/src-tauri/icons/icon.ico (100%) rename nym-connect/{ => mobile}/src-tauri/icons/icon.png (100%) rename nym-connect/{ => mobile}/src-tauri/icons/tray_icon.ico (100%) rename nym-connect/{ => mobile}/src-tauri/icons/tray_icon.png (100%) rename nym-connect/{ => mobile}/src-tauri/src/build.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/config/mod.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/error.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/events.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/lib.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/logging.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/main.rs (91%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/menu.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/mobile.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/models/mod.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/connection/connect.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/connection/disconnect.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/connection/health_check.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/connection/mod.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/connection/status.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/directory/mod.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/export.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/operations/help/log.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/help/mod.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/help/storage.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/http.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/operations/mod.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/operations/window/mod.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/state.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/src/tasks.rs (100%) rename nym-connect/{ => mobile}/src-tauri/src/window.rs (100%) rename {nym-connect-android => nym-connect/mobile}/src-tauri/tauri.conf.json (97%) rename nym-connect/{ => mobile}/src/assets/help-step-four.png (100%) rename nym-connect/{ => mobile}/src/assets/help-step-one-legacy.png (100%) rename nym-connect/{ => mobile}/src/assets/help-step-one.png (100%) rename nym-connect/{ => mobile}/src/assets/help-step-three.png (100%) rename nym-connect/{ => mobile}/src/assets/help-step-two-legacy.png (100%) rename nym-connect/{ => mobile}/src/assets/help-step-two.png (100%) rename nym-connect/{ => mobile}/src/components/AppVersion.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/AppWindowFrame.tsx (100%) rename nym-connect/{ => mobile}/src/components/ConnectionButton.tsx (100%) rename nym-connect/{ => mobile}/src/components/ConnectionStats.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/ConnectionStatus.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/ConntectionTimer.tsx (100%) rename nym-connect/{ => mobile}/src/components/CopyToClipboard.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/CustomTitleBar.tsx (86%) rename nym-connect/{ => mobile}/src/components/Error.tsx (100%) rename nym-connect/{ => mobile}/src/components/ErrorFallback.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/ExperimentalWarning.tsx (100%) rename nym-connect/{ => mobile}/src/components/Growth/content/assets/matrix.webp (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/HelpPage.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/HelpPageActions.tsx (100%) rename nym-connect/{ => mobile}/src/components/HelpPageImage.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/HelpPageStepIndicator.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/InfoModal.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/IpAddressAndPort.tsx (100%) rename nym-connect/{ => mobile}/src/components/IpAddressAndPortModal.tsx (100%) rename nym-connect/{ => mobile}/src/components/NeedHelp.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/PowerButton/PowerButton.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/PowerButton/power-button.css (100%) rename nym-connect/{ => mobile}/src/components/ServiceProviderPopup.tsx (100%) rename nym-connect/{ => mobile}/src/components/ServiceProviderSelector.stories.tsx (100%) rename nym-connect/{ => mobile}/src/components/ServiceProviderSelector.tsx (100%) rename nym-connect/{ => mobile}/src/components/ServiceSelector.stories.tsx (100%) rename nym-connect/{ => mobile}/src/components/ServiceSelector.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/components/TooltipInfo.tsx (100%) rename nym-connect/{ => mobile}/src/config.ts (100%) rename nym-connect/{ => mobile}/src/context/main.tsx (100%) rename nym-connect/{ => mobile}/src/context/mocks/main.tsx (100%) rename nym-connect/{ => mobile}/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf (100%) rename nym-connect/{ => mobile}/src/fonts/OpenSans-VariableFont_wdth,wght.ttf (100%) rename nym-connect/{ => mobile}/src/fonts/fonts.css (100%) rename nym-connect/{ => mobile}/src/hooks/events.ts (100%) rename {nym-connect-android => nym-connect/mobile}/src/index.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/layouts/ConnectionLayout.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/pages/connection/Connected.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/pages/connection/Disconnected.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/pages/connection/index.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/pages/menu/Apps.tsx (100%) rename nym-connect/{ => mobile}/src/pages/menu/Guide.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/pages/menu/Settings.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/pages/menu/index.tsx (100%) rename {nym-connect-android => nym-connect/mobile}/src/routes/index.tsx (100%) rename nym-connect/{ => mobile}/src/stories/AppFlow.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/AppWindowFrame.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/ConnectedLayout.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/ConnectionButton.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/ConnectionStats.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/ConnectionStatus.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/DefaultLayout.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/Introduction.stories.mdx (100%) rename nym-connect/{ => mobile}/src/stories/IpAddressAndPort.stories.tsx (100%) rename nym-connect/{ => mobile}/src/stories/PowerButton.stories.tsx (100%) rename nym-connect/{ => mobile}/src/theme/index.tsx (94%) rename nym-connect/{ => mobile}/src/theme/mui-theme.d.ts (100%) rename {nym-connect-android => nym-connect/mobile}/src/theme/theme.tsx (100%) rename nym-connect/{ => mobile}/src/types/connection.ts (100%) rename nym-connect/{ => mobile}/src/types/directory.ts (100%) rename nym-connect/{ => mobile}/src/types/error.ts (100%) rename nym-connect/{ => mobile}/src/types/event.ts (100%) rename nym-connect/{ => mobile}/src/types/gateway.ts (100%) rename nym-connect/{ => mobile}/src/types/index.ts (100%) rename nym-connect/{ => mobile}/src/types/rust/index.ts (100%) rename nym-connect/{ => mobile}/src/types/rust/stateparams.ts (100%) rename nym-connect/{ => mobile}/src/typings/FC.d.ts (100%) rename nym-connect/{ => mobile}/src/typings/jpeg.d.ts (100%) rename nym-connect/{ => mobile}/src/typings/json.d.ts (100%) rename nym-connect/{ => mobile}/src/typings/png.d.ts (100%) rename nym-connect/{ => mobile}/src/typings/svg.d.ts (100%) rename nym-connect/{ => mobile}/src/typings/webp.d.ts (100%) rename nym-connect/{ => mobile}/src/typings/yaml.d.ts (100%) rename {nym-connect-android => nym-connect/mobile}/src/utils/index.ts (100%) rename nym-connect/{ => mobile}/tsconfig.eslint.json (100%) rename {nym-connect-android => nym-connect/mobile}/tsconfig.json (100%) rename {nym-connect-android => nym-connect/mobile}/webpack.common.js (100%) rename {nym-connect-android => nym-connect/mobile}/webpack.dev.js (100%) rename {nym-connect-android => nym-connect/mobile}/webpack.prod.js (100%) diff --git a/.github/workflows/nc-android-apk.yml b/.github/workflows/connect-android-build.yml similarity index 87% rename from .github/workflows/nc-android-apk.yml rename to .github/workflows/connect-android-build.yml index 22783d782a..b2e2e8178e 100644 --- a/.github/workflows/nc-android-apk.yml +++ b/.github/workflows/connect-android-build.yml @@ -1,4 +1,4 @@ -name: NC Android APK Release +name: Nym Connect - Android APK Build on: workflow_dispatch: @@ -88,14 +88,14 @@ jobs: run: | yarn install --frozen-lockfile yarn build - yarn workspace @nym/nym-connect-android webpack:prod + yarn workspace @nym/nym-connect-mobile webpack:prod - name: Build APK - working-directory: nym-connect-android + working-directory: nym-connect/mobile env: ANDROID_SDK_ROOT: ${{ env.ANDROID_HOME }} - WRY_ANDROID_PACKAGE: net.nymtech.nym_connect_android - WRY_ANDROID_LIBRARY: nym_connect_android + WRY_ANDROID_PACKAGE: net.nymtech.nym_connect + WRY_ANDROID_LIBRARY: nym_connect # TODO build with release profile (--release), it will requires # to sign the APK. For now build with debug profile to avoid that run: cargo tauri android build --debug --apk --split-per-abi -t aarch64 @@ -104,9 +104,9 @@ jobs: - name: Rename APK artifact run: | mkdir apk/ - mv nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build/outputs/apk/arm64/debug/app-arm64-debug.apk \ + mv nym-connect/mobile/src-tauri/gen/android/nym_connect/app/build/outputs/apk/arm64/debug/app-arm64-debug.apk \ apk/nym-connect-arm64-debug.apk - mv nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build/outputs/apk/x86_64/debug/app-x86_64-debug.apk \ + mv nym-connect/mobile/src-tauri/gen/android/nym_connect/app/build/outputs/apk/x86_64/debug/app-x86_64-debug.apk \ apk/nym-connect-x86_64-debug.apk - name: Upload APK artifact diff --git a/.github/workflows/nym-connect.yml b/.github/workflows/connect-desktop-ci.yml similarity index 92% rename from .github/workflows/nym-connect.yml rename to .github/workflows/connect-desktop-ci.yml index 69f5acb147..5846212222 100644 --- a/.github/workflows/nym-connect.yml +++ b/.github/workflows/connect-desktop-ci.yml @@ -1,13 +1,13 @@ -name: CI for nym-connect +name: CI for nym-connect - Desktop on: push: paths: - - 'nym-connect/**' + - 'nym-connect/desktop/**' defaults: run: - working-directory: nym-connect + working-directory: nym-connect/desktop jobs: build: @@ -34,7 +34,7 @@ jobs: env: SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} ARGS: "-rltgoDzvO --delete" - SOURCE: "nym-connect/storybook-static/" + SOURCE: "nym-connect/desktop/storybook-static/" REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/nym-connect-${{ env.GITHUB_REF_SLUG }} diff --git a/.github/workflows/connect.yml b/.github/workflows/connect-desktop.yml similarity index 53% rename from .github/workflows/connect.yml rename to .github/workflows/connect-desktop.yml index 29e347586e..e74b67a3bd 100644 --- a/.github/workflows/connect.yml +++ b/.github/workflows/connect-desktop.yml @@ -1,28 +1,30 @@ -name: Nym Connect (rust) +name: Nym Connect - desktop (Rust) on: push: paths: - - 'nym-connect/**' - - 'clients/client-core/**' - - 'clients/socks5/**' - - 'common/**' - - 'gateway/gateway-requests/**' - - 'contracts/vesting/**' - - 'nym-api/nym-api-requests/**' + - "nym-connect/desktop/src-tauri/**" + - "nym-connect/desktop/src-tauri/Cargo.toml" + - "clients/client-core/**" + - "clients/socks5/**" + - "common/**" + - "gateway/gateway-requests/**" + - "contracts/vesting/**" + - "nym-api/nym-api-requests/**" pull_request: paths: - - 'nym-connect/**' - - 'clients/client-core/**' - - 'clients/socks5/**' - - 'common/**' - - 'gateway/gateway-requests/**' - - 'contracts/vesting/**' - - 'nym-api/nym-api-requests/**' + - "nym-connect/desktop/src-tauri/**" + - "nym-connect/desktop/src-tauri/Cargo.toml" + - "clients/client-core/**" + - "clients/socks5/**" + - "common/**" + - "gateway/gateway-requests/**" + - "contracts/vesting/**" + - "nym-api/nym-api-requests/**" jobs: build: - runs-on: [ self-hosted, custom-linux ] + runs-on: [self-hosted, custom-linux] env: RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache steps: @@ -45,29 +47,29 @@ jobs: uses: actions-rs/cargo@v1 with: command: build - args: --manifest-path nym-connect/Cargo.toml --workspace + args: --manifest-path nym-connect/desktop/Cargo.toml --workspace - name: Run all tests uses: actions-rs/cargo@v1 with: command: test - args: --manifest-path nym-connect/Cargo.toml --workspace + args: --manifest-path nym-connect/desktop/Cargo.toml --workspace - name: Check formatting uses: actions-rs/cargo@v1 with: command: fmt - args: --manifest-path nym-connect/Cargo.toml --all -- --check + args: --manifest-path nym-connect/desktop/Cargo.toml --all -- --check - uses: actions-rs/clippy-check@v1 name: Clippy checks continue-on-error: true with: token: ${{ secrets.GITHUB_TOKEN }} - args: --manifest-path nym-connect/Cargo.toml --workspace --all-features + args: --manifest-path nym-connect/desktop/Cargo.toml --workspace --all-features - name: Run clippy uses: actions-rs/cargo@v1 with: command: clippy - args: --manifest-path nym-connect/Cargo.toml --workspace --all-features -- -D warnings + args: --manifest-path nym-connect/desktop/Cargo.toml --workspace --all-features -- -D warnings diff --git a/.github/workflows/connect-android.yml b/.github/workflows/connect-mobile.yml similarity index 65% rename from .github/workflows/connect-android.yml rename to .github/workflows/connect-mobile.yml index f6a30a6eb0..ccbd7203c4 100644 --- a/.github/workflows/connect-android.yml +++ b/.github/workflows/connect-mobile.yml @@ -1,10 +1,11 @@ -name: Nym Connect for Android (rust) +name: Nym Connect - mobile (Rust) on: push: paths: - - "nym-connect-android/src-tauri/**" - - "!nym-connect-android/src-tauri/gen/**" + - "nym-connect/mobile/src-tauri/**" + - "nym-connect/mobile/src-tauri/Cargo.toml" + - "!nym-connect/mobile/src-tauri/gen/**" - "clients/client-core/**" - "clients/socks5/**" - "common/**" @@ -13,8 +14,9 @@ on: - "nym-api/nym-api-requests/**" pull_request: paths: - - "nym-connect-android/src-tauri/**" - - "!nym-connect-android/src-tauri/gen/**" + - "nym-connect/mobile/src-tauri/**" + - "nym-connect/mobile/src-tauri/Cargo.toml" + - "!nym-connect/mobile/src-tauri/gen/**" - "clients/client-core/**" - "clients/socks5/**" - "common/**" @@ -30,7 +32,7 @@ jobs: #RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache #defaults: #run: - #working-directory: nym-connect-android/src-tauri/ + #working-directory: nym-connect/mobile/src-tauri/ steps: - name: Install Dependencies (Linux) run: | @@ -59,13 +61,13 @@ jobs: components: clippy, rustfmt - name: Check formatting - run: cargo fmt --manifest-path nym-connect-android/src-tauri/Cargo.toml -- --check + run: cargo fmt --manifest-path nym-connect/mobile/src-tauri/Cargo.toml -- --check - name: Build all binaries - run: cargo build --manifest-path nym-connect-android/src-tauri/Cargo.toml + run: cargo build --manifest-path nym-connect/mobile/src-tauri/Cargo.toml - name: Run all tests - run: cargo test --manifest-path nym-connect-android/src-tauri/Cargo.toml + run: cargo test --manifest-path nym-connect/mobile/src-tauri/Cargo.toml - name: Clippy - run: cargo clippy --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-targets -- -D warnings + run: cargo clippy --manifest-path nym-connect/mobile/src-tauri/Cargo.toml --all-targets -- -D warnings diff --git a/.github/workflows/nym-connect-publish-macos.yml b/.github/workflows/nym-connect-publish-macos.yml index ba2acfe519..faff21a30c 100644 --- a/.github/workflows/nym-connect-publish-macos.yml +++ b/.github/workflows/nym-connect-publish-macos.yml @@ -1,4 +1,4 @@ -name: Publish Nym Connect (MacOS) +name: Publish Nym Connect - desktop (MacOS) on: workflow_dispatch: release: @@ -6,7 +6,7 @@ on: defaults: run: - working-directory: nym-connect + working-directory: nym-connect/desktop jobs: publish-tauri: @@ -73,7 +73,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: nym-connect_1.0.0_x64.dmg - path: nym-connect/target/release/bundle/dmg/nym-connect_1.0.0_x64.dmg + path: nym-connect/desktop/target/release/bundle/dmg/nym-connect_1.0.0_x64.dmg retention-days: 30 - name: Clean up keychain @@ -86,5 +86,5 @@ jobs: if: github.event_name == 'release' with: files: | - nym-connect/target/release/bundle/dmg/*.dmg - nym-connect/target/release/bundle/macos/*.app.tar.gz* + nym-connect/desktop/target/release/bundle/dmg/*.dmg + nym-connect/desktop/target/release/bundle/macos/*.app.tar.gz* diff --git a/.github/workflows/nym-connect-publish-ubuntu.yml b/.github/workflows/nym-connect-publish-ubuntu.yml index f311abb53d..fd36ca4909 100644 --- a/.github/workflows/nym-connect-publish-ubuntu.yml +++ b/.github/workflows/nym-connect-publish-ubuntu.yml @@ -1,4 +1,4 @@ -name: Publish Nym Connect (Ubuntu) +name: Publish Nym Connect - desktop (Ubuntu) on: workflow_dispatch: release: @@ -6,7 +6,7 @@ on: defaults: run: - working-directory: nym-connect + working-directory: nym-connect/desktop jobs: publish-tauri: @@ -53,7 +53,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: nym-connect.AppImage.tar.gz - path: nym-connect/target/release/bundle/appimage/nym-connect_1.0.0_amd64.AppImage + path: nym-connect/desktop/target/release/bundle/appimage/nym-connect_1.0.0_amd64.AppImage retention-days: 30 - name: Upload to release based on tag name @@ -61,5 +61,5 @@ jobs: if: github.event_name == 'release' with: files: | - nym-connect/target/release/bundle/appimage/*.AppImage - nym-connect/target/release/bundle/appimage/*.AppImage.tar.gz* + nym-connect/desktop/target/release/bundle/appimage/*.AppImage + nym-connect/desktop/target/release/bundle/appimage/*.AppImage.tar.gz* diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 599b6d27e4..8e0f983754 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -1,4 +1,4 @@ -name: Publish Nym Connect (Windows 10) +name: Publish Nym Connect - desktop (Windows 10) on: workflow_dispatch: release: @@ -6,7 +6,7 @@ on: defaults: run: - working-directory: nym-connect + working-directory: nym-connect/desktop jobs: publish-tauri: @@ -72,7 +72,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: nym-connect_1.0.0_x64_en-US.msi - path: nym-connect/target/release/bundle/msi/nym-connect_1.0.0_x64_en-US.msi + path: nym-connect/desktop/target/release/bundle/msi/nym-connect_1.0.0_x64_en-US.msi retention-days: 30 - name: Upload to release based on tag name @@ -80,5 +80,5 @@ jobs: if: github.event_name == 'release' with: files: | - nym-connect/target/release/bundle/msi/*.msi - nym-connect/target/release/bundle/msi/*.msi.zip* + nym-connect/desktop/target/release/bundle/msi/*.msi + nym-connect/desktop/target/release/bundle/msi/*.msi.zip* diff --git a/.github/workflows/typescript-lint.yml b/.github/workflows/typescript-lint.yml index 7d03515abb..b3bd15b6e6 100644 --- a/.github/workflows/typescript-lint.yml +++ b/.github/workflows/typescript-lint.yml @@ -5,10 +5,20 @@ on: paths: - 'ts-packages/**' - 'sdk/typescript/**' - - 'nym-connect/src/**' - - 'nym-connect/package.json' - - 'nym-connect-android/src/**' - - 'nym-connect-android/package.json' + - 'nym-connect/desktop/src/**' + - 'nym-connect/desktop/package.json' + - 'nym-connect/mobile/src/**' + - 'nym-connect/mobile/package.json' + - 'nym-wallet/src/**' + - 'nym-wallet/package.json' + pull_request: + paths: + - 'ts-packages/**' + - 'sdk/typescript/**' + - 'nym-connect/desktop/src/**' + - 'nym-connect/desktop/package.json' + - 'nym-connect/mobile/src/**' + - 'nym-connect/mobile/package.json' - 'nym-wallet/src/**' - 'nym-wallet/package.json' diff --git a/Cargo.toml b/Cargo.toml index 5998bb32b6..96ef6b17cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,7 +94,7 @@ default-members = [ "explorer-api", ] -exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-connect", "nym-connect-android"] +exclude = ["explorer", "contracts", "clients/webassembly", "nym-wallet", "nym-connect/mobile/src-tauri", "nym-connect/desktop"] [workspace.package] authors = ["Nym Technologies SA"] diff --git a/Makefile b/Makefile index 5ae3c7d51a..a13100f7ba 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,12 @@ test: clippy-all cargo-test wasm fmt test-all: test cargo-test-expensive no-clippy: build cargo-test wasm fmt happy: fmt clippy-happy test -clippy-all: clippy-main clippy-main-examples clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-connect-android clippy-all-wasm-client -clippy-happy: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect clippy-happy-connect-android -cargo-test: test-main test-contracts test-wallet test-connect test-connect-android +clippy-all: clippy-main clippy-main-examples clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-connect-mobile clippy-all-wasm-client +clippy-happy: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect clippy-happy-connect-mobile +cargo-test: test-main test-contracts test-wallet test-connect test-connect-mobile cargo-test-expensive: test-main-expensive test-contracts-expensive test-wallet-expensive test-connect-expensive -build: build-contracts build-wallet build-main build-main-examples build-connect build-connect-android build-wasm-client -fmt: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-connect-android fmt-wasm-client +build: build-contracts build-wallet build-main build-main-examples build-connect build-connect-mobile build-wasm-client +fmt: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-connect-mobile fmt-wasm-client clippy-happy-main: cargo clippy @@ -19,10 +19,10 @@ clippy-happy-wallet: cargo clippy --manifest-path nym-wallet/Cargo.toml clippy-happy-connect: - cargo clippy --manifest-path nym-connect/Cargo.toml + cargo clippy --manifest-path nym-connect/desktop/Cargo.toml -clippy-happy-connect-android: - cargo clippy --manifest-path nym-connect-android/src-tauri/Cargo.toml +clippy-happy-connect-mobile: + cargo clippy --manifest-path nym-connect/mobile/src-tauri/Cargo.toml clippy-main: cargo clippy --workspace -- -D warnings @@ -41,10 +41,10 @@ clippy-all-wallet: cargo clippy --workspace --manifest-path nym-wallet/Cargo.toml --all-features -- -D warnings clippy-all-connect: - cargo clippy --workspace --manifest-path nym-connect/Cargo.toml --all-features -- -D warnings + cargo clippy --workspace --manifest-path nym-connect/desktop/Cargo.toml --all-features -- -D warnings -clippy-all-connect-android: - cargo clippy --workspace --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-features -- -D warnings +clippy-all-connect-mobile: + cargo clippy --workspace --manifest-path nym-connect/mobile/src-tauri/Cargo.toml --all-features -- -D warnings clippy-all-wasm-client: cargo clippy --workspace --manifest-path clients/webassembly/Cargo.toml --all-features --target wasm32-unknown-unknown -- -D warnings @@ -68,16 +68,16 @@ test-wallet-expensive: cargo test --manifest-path nym-wallet/Cargo.toml --all-features -- --ignored test-connect: - cargo test --manifest-path nym-connect/Cargo.toml --all-features + cargo test --manifest-path nym-connect/desktop/Cargo.toml --all-features test-connect-expensive: - cargo test --manifest-path nym-connect/Cargo.toml --all-features -- --ignored + cargo test --manifest-path nym-connect/desktop/Cargo.toml --all-features -- --ignored -test-connect-android: - cargo test --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-features +test-connect-mobile: + cargo test --manifest-path nym-connect/mobile/src-tauri/Cargo.toml --all-features -test-connect-android-expensive: - cargo test --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-features -- --ignored +test-connect-mobile-expensive: + cargo test --manifest-path nym-connect/mobile/src-tauri/Cargo.toml --all-features -- --ignored build-main: cargo build --workspace @@ -92,10 +92,10 @@ build-wallet: cargo build --manifest-path nym-wallet/Cargo.toml --workspace build-connect: - cargo build --manifest-path nym-connect/Cargo.toml --workspace + cargo build --manifest-path nym-connect/desktop/Cargo.toml --workspace -build-connect-android: - cargo build --manifest-path nym-connect-android/src-tauri/Cargo.toml --workspace +build-connect-mobile: + cargo build --manifest-path nym-connect/mobile/src-tauri/Cargo.toml --workspace build-explorer-api: cargo build --manifest-path explorer-api/Cargo.toml --workspace @@ -116,10 +116,10 @@ fmt-wallet: cargo fmt --manifest-path nym-wallet/Cargo.toml --all fmt-connect: - cargo fmt --manifest-path nym-connect/Cargo.toml --all + cargo fmt --manifest-path nym-connect/desktop/Cargo.toml --all -fmt-connect-android: - cargo fmt --manifest-path nym-connect-android/src-tauri/Cargo.toml --all +fmt-connect-mobile: + cargo fmt --manifest-path nym-connect/mobile/src-tauri/Cargo.toml --all fmt-wasm-client: cargo fmt --manifest-path clients/webassembly/Cargo.toml --all diff --git a/lerna.json b/lerna.json index e53d32b504..5d17094fd5 100644 --- a/lerna.json +++ b/lerna.json @@ -2,10 +2,9 @@ "packages": [ "ts-packages/*", "nym-wallet", - "nym-connect", - "nym-connect-android", + "nym-connect/**", "sdk/typescript/examples/docs", "sdk/typescript/packages/**" ], "version": "0.0.0" -} \ No newline at end of file +} diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore deleted file mode 100644 index cd06a0a15a..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/src/main/java/net/nymtech/nym_connect_android/generated diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/MainActivity.kt b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/MainActivity.kt deleted file mode 100644 index 5b7526aed3..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/MainActivity.kt +++ /dev/null @@ -1,3 +0,0 @@ -package net.nymtech.nym_connect_android - -class MainActivity : TauriActivity() diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so deleted file mode 120000 index 5963e98ea2..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/arm64-v8a/libnym_connect_android.so +++ /dev/null @@ -1 +0,0 @@ -/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/aarch64-linux-android/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so deleted file mode 120000 index 28db5686bb..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/armeabi-v7a/libnym_connect_android.so +++ /dev/null @@ -1 +0,0 @@ -/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/armv7-linux-androideabi/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86/libnym_connect_android.so deleted file mode 120000 index 3041208a37..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86/libnym_connect_android.so +++ /dev/null @@ -1 +0,0 @@ -/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/i686-linux-android/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86_64/libnym_connect_android.so b/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86_64/libnym_connect_android.so deleted file mode 120000 index d6aac3cf45..0000000000 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/jniLibs/x86_64/libnym_connect_android.so +++ /dev/null @@ -1 +0,0 @@ -/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/target/x86_64-linux-android/debug/libnym_connect_android.so \ No newline at end of file diff --git a/nym-connect-android/.babelrc b/nym-connect/desktop/.babelrc similarity index 100% rename from nym-connect-android/.babelrc rename to nym-connect/desktop/.babelrc diff --git a/nym-connect-android/.env.sample b/nym-connect/desktop/.env.sample similarity index 100% rename from nym-connect-android/.env.sample rename to nym-connect/desktop/.env.sample diff --git a/nym-connect-android/.eslintrc b/nym-connect/desktop/.eslintrc similarity index 100% rename from nym-connect-android/.eslintrc rename to nym-connect/desktop/.eslintrc diff --git a/nym-connect-android/.nvmrc b/nym-connect/desktop/.nvmrc similarity index 100% rename from nym-connect-android/.nvmrc rename to nym-connect/desktop/.nvmrc diff --git a/nym-connect-android/.prettierrc b/nym-connect/desktop/.prettierrc similarity index 100% rename from nym-connect-android/.prettierrc rename to nym-connect/desktop/.prettierrc diff --git a/nym-connect-android/.storybook/main.js b/nym-connect/desktop/.storybook/main.js similarity index 100% rename from nym-connect-android/.storybook/main.js rename to nym-connect/desktop/.storybook/main.js diff --git a/nym-connect-android/.storybook/mocks/tauri/app.js b/nym-connect/desktop/.storybook/mocks/tauri/app.js similarity index 100% rename from nym-connect-android/.storybook/mocks/tauri/app.js rename to nym-connect/desktop/.storybook/mocks/tauri/app.js diff --git a/nym-connect-android/.storybook/mocks/tauri/clipboard.js b/nym-connect/desktop/.storybook/mocks/tauri/clipboard.js similarity index 100% rename from nym-connect-android/.storybook/mocks/tauri/clipboard.js rename to nym-connect/desktop/.storybook/mocks/tauri/clipboard.js diff --git a/nym-connect-android/.storybook/mocks/tauri/event.js b/nym-connect/desktop/.storybook/mocks/tauri/event.js similarity index 100% rename from nym-connect-android/.storybook/mocks/tauri/event.js rename to nym-connect/desktop/.storybook/mocks/tauri/event.js diff --git a/nym-connect-android/.storybook/mocks/tauri/index.js b/nym-connect/desktop/.storybook/mocks/tauri/index.js similarity index 100% rename from nym-connect-android/.storybook/mocks/tauri/index.js rename to nym-connect/desktop/.storybook/mocks/tauri/index.js diff --git a/nym-connect-android/.storybook/mocks/tauri/notification.js b/nym-connect/desktop/.storybook/mocks/tauri/notification.js similarity index 100% rename from nym-connect-android/.storybook/mocks/tauri/notification.js rename to nym-connect/desktop/.storybook/mocks/tauri/notification.js diff --git a/nym-connect-android/.storybook/mocks/tauri/window.js b/nym-connect/desktop/.storybook/mocks/tauri/window.js similarity index 100% rename from nym-connect-android/.storybook/mocks/tauri/window.js rename to nym-connect/desktop/.storybook/mocks/tauri/window.js diff --git a/nym-connect-android/.storybook/preview-fonts.js b/nym-connect/desktop/.storybook/preview-fonts.js similarity index 100% rename from nym-connect-android/.storybook/preview-fonts.js rename to nym-connect/desktop/.storybook/preview-fonts.js diff --git a/nym-connect-android/.storybook/preview.js b/nym-connect/desktop/.storybook/preview.js similarity index 100% rename from nym-connect-android/.storybook/preview.js rename to nym-connect/desktop/.storybook/preview.js diff --git a/nym-connect/CHANGELOG.md b/nym-connect/desktop/CHANGELOG.md similarity index 100% rename from nym-connect/CHANGELOG.md rename to nym-connect/desktop/CHANGELOG.md diff --git a/nym-connect/Cargo.toml b/nym-connect/desktop/Cargo.toml similarity index 100% rename from nym-connect/Cargo.toml rename to nym-connect/desktop/Cargo.toml diff --git a/nym-connect/README.md b/nym-connect/desktop/README.md similarity index 99% rename from nym-connect/README.md rename to nym-connect/desktop/README.md index bbd9b55bbb..a30341be85 100644 --- a/nym-connect/README.md +++ b/nym-connect/desktop/README.md @@ -3,7 +3,7 @@ Copyright 2020 - Nym Technologies SA SPDX-License-Identifier: Apache-2.0 --> -# Nym Connect +# Nym Connect - Desktop Nym is an open-source, decentralized and permissionless privacy system. It provides full-stack privacy, allowing other applications, services or blockchains to provide their users with strong metadata protection, at both the network level (mixnet), and the application level (anonymous credentials) without the need to build privacy from scratch. diff --git a/nym-connect-android/dist/.gitkeep b/nym-connect/desktop/dist/.gitkeep similarity index 100% rename from nym-connect-android/dist/.gitkeep rename to nym-connect/desktop/dist/.gitkeep diff --git a/nym-connect/package.json b/nym-connect/desktop/package.json similarity index 96% rename from nym-connect/package.json rename to nym-connect/desktop/package.json index b124d71730..75b69a863e 100644 --- a/nym-connect/package.json +++ b/nym-connect/desktop/package.json @@ -4,17 +4,17 @@ "main": "index.js", "license": "MIT", "scripts": { - "prewebpack:dev": "yarn --cwd .. build", + "prewebpack:dev": "yarn --cwd ../.. build", "webpack:dev": "yarn webpack serve --config webpack.dev.js", "webpack:dev:onlyThis": "yarn webpack serve --config webpack.dev.js", "webpack:prod": "yarn webpack --progress --config webpack.prod.js", "tauri:dev": "RUST_DEBUG=1 yarn tauri dev", "tauri:build": "yarn tauri build", "dev": "run-p webpack:dev tauri:dev", - "prebuild": "yarn --cwd .. build", + "prebuild": "yarn --cwd ../.. build", "build": "run-s webpack:prod tauri:build", "storybook": "start-storybook -p 6006", - "prestorybook:build": "yarn --cwd .. build", + "prestorybook:build": "yarn --cwd ../.. build", "storybook:build": "build-storybook", "tsc": "tsc --noEmit true", "tsc:watch": "tsc --noEmit true --watch", @@ -113,4 +113,4 @@ "webpack-merge": "^5.8.0", "yaml-loader": "^0.8.0" } -} \ No newline at end of file +} diff --git a/nym-connect-android/public/favicon.ico b/nym-connect/desktop/public/favicon.ico similarity index 100% rename from nym-connect-android/public/favicon.ico rename to nym-connect/desktop/public/favicon.ico diff --git a/nym-connect-android/public/favicon.png b/nym-connect/desktop/public/favicon.png similarity index 100% rename from nym-connect-android/public/favicon.png rename to nym-connect/desktop/public/favicon.png diff --git a/nym-connect/public/growth.html b/nym-connect/desktop/public/growth.html similarity index 100% rename from nym-connect/public/growth.html rename to nym-connect/desktop/public/growth.html diff --git a/nym-connect-android/public/index.html b/nym-connect/desktop/public/index.html similarity index 100% rename from nym-connect-android/public/index.html rename to nym-connect/desktop/public/index.html diff --git a/nym-connect/public/log.html b/nym-connect/desktop/public/log.html similarity index 100% rename from nym-connect/public/log.html rename to nym-connect/desktop/public/log.html diff --git a/nym-connect-android/src-tauri/.gitignore b/nym-connect/desktop/src-tauri/.gitignore similarity index 100% rename from nym-connect-android/src-tauri/.gitignore rename to nym-connect/desktop/src-tauri/.gitignore diff --git a/nym-connect/src-tauri/Cargo.toml b/nym-connect/desktop/src-tauri/Cargo.toml similarity index 75% rename from nym-connect/src-tauri/Cargo.toml rename to nym-connect/desktop/src-tauri/Cargo.toml index 51a42283ab..982b000e28 100644 --- a/nym-connect/src-tauri/Cargo.toml +++ b/nym-connect/desktop/src-tauri/Cargo.toml @@ -44,14 +44,14 @@ tokio = { version = "1.24.1", features = ["sync", "time"] } url = "2.2" yaml-rust = "0.4" -client-core = { path = "../../clients/client-core" } -nym-api-requests = { path = "../../nym-api/nym-api-requests" } -nym-contracts-common = { path = "../../common/cosmwasm-smart-contracts/contracts-common"} -config-common = { path = "../../common/config", package = "config" } -nym-crypto = { path = "../../common/crypto" } -nym-bin-common = { path = "../../common/bin-common"} -nym-socks5-client = { path = "../../clients/socks5" } -nym-task = { path = "../../common/task" } +client-core = { path = "../../../clients/client-core" } +nym-api-requests = { path = "../../../nym-api/nym-api-requests" } +nym-contracts-common = { path = "../../../common/cosmwasm-smart-contracts/contracts-common"} +config-common = { path = "../../../common/config", package = "config" } +nym-crypto = { path = "../../../common/crypto" } +nym-bin-common = { path = "../../../common/bin-common"} +nym-socks5-client = { path = "../../../clients/socks5" } +nym-task = { path = "../../../common/task" } [dev-dependencies] ts-rs = "6.1.2" diff --git a/nym-connect-android/src-tauri/icons/128x128.png b/nym-connect/desktop/src-tauri/icons/128x128.png similarity index 100% rename from nym-connect-android/src-tauri/icons/128x128.png rename to nym-connect/desktop/src-tauri/icons/128x128.png diff --git a/nym-connect-android/src-tauri/icons/128x128@2x.png b/nym-connect/desktop/src-tauri/icons/128x128@2x.png similarity index 100% rename from nym-connect-android/src-tauri/icons/128x128@2x.png rename to nym-connect/desktop/src-tauri/icons/128x128@2x.png diff --git a/nym-connect-android/src-tauri/icons/32x32.png b/nym-connect/desktop/src-tauri/icons/32x32.png similarity index 100% rename from nym-connect-android/src-tauri/icons/32x32.png rename to nym-connect/desktop/src-tauri/icons/32x32.png diff --git a/nym-connect-android/src-tauri/icons/Square107x107Logo.png b/nym-connect/desktop/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square107x107Logo.png rename to nym-connect/desktop/src-tauri/icons/Square107x107Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square142x142Logo.png b/nym-connect/desktop/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square142x142Logo.png rename to nym-connect/desktop/src-tauri/icons/Square142x142Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square150x150Logo.png b/nym-connect/desktop/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square150x150Logo.png rename to nym-connect/desktop/src-tauri/icons/Square150x150Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square284x284Logo.png b/nym-connect/desktop/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square284x284Logo.png rename to nym-connect/desktop/src-tauri/icons/Square284x284Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square30x30Logo.png b/nym-connect/desktop/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square30x30Logo.png rename to nym-connect/desktop/src-tauri/icons/Square30x30Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square310x310Logo.png b/nym-connect/desktop/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square310x310Logo.png rename to nym-connect/desktop/src-tauri/icons/Square310x310Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square44x44Logo.png b/nym-connect/desktop/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square44x44Logo.png rename to nym-connect/desktop/src-tauri/icons/Square44x44Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square71x71Logo.png b/nym-connect/desktop/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square71x71Logo.png rename to nym-connect/desktop/src-tauri/icons/Square71x71Logo.png diff --git a/nym-connect-android/src-tauri/icons/Square89x89Logo.png b/nym-connect/desktop/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/Square89x89Logo.png rename to nym-connect/desktop/src-tauri/icons/Square89x89Logo.png diff --git a/nym-connect-android/src-tauri/icons/StoreLogo.png b/nym-connect/desktop/src-tauri/icons/StoreLogo.png similarity index 100% rename from nym-connect-android/src-tauri/icons/StoreLogo.png rename to nym-connect/desktop/src-tauri/icons/StoreLogo.png diff --git a/nym-connect-android/src-tauri/icons/icon.icns b/nym-connect/desktop/src-tauri/icons/icon.icns similarity index 100% rename from nym-connect-android/src-tauri/icons/icon.icns rename to nym-connect/desktop/src-tauri/icons/icon.icns diff --git a/nym-connect-android/src-tauri/icons/icon.ico b/nym-connect/desktop/src-tauri/icons/icon.ico similarity index 100% rename from nym-connect-android/src-tauri/icons/icon.ico rename to nym-connect/desktop/src-tauri/icons/icon.ico diff --git a/nym-connect-android/src-tauri/icons/icon.png b/nym-connect/desktop/src-tauri/icons/icon.png similarity index 100% rename from nym-connect-android/src-tauri/icons/icon.png rename to nym-connect/desktop/src-tauri/icons/icon.png diff --git a/nym-connect-android/src-tauri/icons/tray_icon.ico b/nym-connect/desktop/src-tauri/icons/tray_icon.ico similarity index 100% rename from nym-connect-android/src-tauri/icons/tray_icon.ico rename to nym-connect/desktop/src-tauri/icons/tray_icon.ico diff --git a/nym-connect-android/src-tauri/icons/tray_icon.png b/nym-connect/desktop/src-tauri/icons/tray_icon.png similarity index 100% rename from nym-connect-android/src-tauri/icons/tray_icon.png rename to nym-connect/desktop/src-tauri/icons/tray_icon.png diff --git a/nym-connect-android/src-tauri/src/build.rs b/nym-connect/desktop/src-tauri/src/build.rs similarity index 100% rename from nym-connect-android/src-tauri/src/build.rs rename to nym-connect/desktop/src-tauri/src/build.rs diff --git a/nym-connect/src-tauri/src/config/mod.rs b/nym-connect/desktop/src-tauri/src/config/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/config/mod.rs rename to nym-connect/desktop/src-tauri/src/config/mod.rs diff --git a/nym-connect/src-tauri/src/error.rs b/nym-connect/desktop/src-tauri/src/error.rs similarity index 100% rename from nym-connect/src-tauri/src/error.rs rename to nym-connect/desktop/src-tauri/src/error.rs diff --git a/nym-connect-android/src-tauri/src/events.rs b/nym-connect/desktop/src-tauri/src/events.rs similarity index 100% rename from nym-connect-android/src-tauri/src/events.rs rename to nym-connect/desktop/src-tauri/src/events.rs diff --git a/nym-connect-android/src-tauri/src/logging.rs b/nym-connect/desktop/src-tauri/src/logging.rs similarity index 100% rename from nym-connect-android/src-tauri/src/logging.rs rename to nym-connect/desktop/src-tauri/src/logging.rs diff --git a/nym-connect/src-tauri/src/main.rs b/nym-connect/desktop/src-tauri/src/main.rs similarity index 100% rename from nym-connect/src-tauri/src/main.rs rename to nym-connect/desktop/src-tauri/src/main.rs diff --git a/nym-connect/src-tauri/src/menu.rs b/nym-connect/desktop/src-tauri/src/menu.rs similarity index 100% rename from nym-connect/src-tauri/src/menu.rs rename to nym-connect/desktop/src-tauri/src/menu.rs diff --git a/nym-connect/src-tauri/src/models/mod.rs b/nym-connect/desktop/src-tauri/src/models/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/models/mod.rs rename to nym-connect/desktop/src-tauri/src/models/mod.rs diff --git a/nym-connect-android/src-tauri/src/operations/connection/connect.rs b/nym-connect/desktop/src-tauri/src/operations/connection/connect.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/connection/connect.rs rename to nym-connect/desktop/src-tauri/src/operations/connection/connect.rs diff --git a/nym-connect-android/src-tauri/src/operations/connection/disconnect.rs b/nym-connect/desktop/src-tauri/src/operations/connection/disconnect.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/connection/disconnect.rs rename to nym-connect/desktop/src-tauri/src/operations/connection/disconnect.rs diff --git a/nym-connect-android/src-tauri/src/operations/connection/health_check.rs b/nym-connect/desktop/src-tauri/src/operations/connection/health_check.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/connection/health_check.rs rename to nym-connect/desktop/src-tauri/src/operations/connection/health_check.rs diff --git a/nym-connect-android/src-tauri/src/operations/connection/mod.rs b/nym-connect/desktop/src-tauri/src/operations/connection/mod.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/connection/mod.rs rename to nym-connect/desktop/src-tauri/src/operations/connection/mod.rs diff --git a/nym-connect-android/src-tauri/src/operations/connection/status.rs b/nym-connect/desktop/src-tauri/src/operations/connection/status.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/connection/status.rs rename to nym-connect/desktop/src-tauri/src/operations/connection/status.rs diff --git a/nym-connect-android/src-tauri/src/operations/directory/mod.rs b/nym-connect/desktop/src-tauri/src/operations/directory/mod.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/directory/mod.rs rename to nym-connect/desktop/src-tauri/src/operations/directory/mod.rs diff --git a/nym-connect-android/src-tauri/src/operations/export.rs b/nym-connect/desktop/src-tauri/src/operations/export.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/export.rs rename to nym-connect/desktop/src-tauri/src/operations/export.rs diff --git a/nym-connect/src-tauri/src/operations/growth/api_client.rs b/nym-connect/desktop/src-tauri/src/operations/growth/api_client.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/growth/api_client.rs rename to nym-connect/desktop/src-tauri/src/operations/growth/api_client.rs diff --git a/nym-connect/src-tauri/src/operations/growth/assets.rs b/nym-connect/desktop/src-tauri/src/operations/growth/assets.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/growth/assets.rs rename to nym-connect/desktop/src-tauri/src/operations/growth/assets.rs diff --git a/nym-connect/src-tauri/src/operations/growth/mod.rs b/nym-connect/desktop/src-tauri/src/operations/growth/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/growth/mod.rs rename to nym-connect/desktop/src-tauri/src/operations/growth/mod.rs diff --git a/nym-connect/src-tauri/src/operations/growth/test_and_earn.rs b/nym-connect/desktop/src-tauri/src/operations/growth/test_and_earn.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/growth/test_and_earn.rs rename to nym-connect/desktop/src-tauri/src/operations/growth/test_and_earn.rs diff --git a/nym-connect/src-tauri/src/operations/help/log.rs b/nym-connect/desktop/src-tauri/src/operations/help/log.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/help/log.rs rename to nym-connect/desktop/src-tauri/src/operations/help/log.rs diff --git a/nym-connect-android/src-tauri/src/operations/help/mod.rs b/nym-connect/desktop/src-tauri/src/operations/help/mod.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/help/mod.rs rename to nym-connect/desktop/src-tauri/src/operations/help/mod.rs diff --git a/nym-connect-android/src-tauri/src/operations/help/storage.rs b/nym-connect/desktop/src-tauri/src/operations/help/storage.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/help/storage.rs rename to nym-connect/desktop/src-tauri/src/operations/help/storage.rs diff --git a/nym-connect-android/src-tauri/src/operations/http.rs b/nym-connect/desktop/src-tauri/src/operations/http.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/http.rs rename to nym-connect/desktop/src-tauri/src/operations/http.rs diff --git a/nym-connect/src-tauri/src/operations/mod.rs b/nym-connect/desktop/src-tauri/src/operations/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/mod.rs rename to nym-connect/desktop/src-tauri/src/operations/mod.rs diff --git a/nym-connect-android/src-tauri/src/operations/window/mod.rs b/nym-connect/desktop/src-tauri/src/operations/window/mod.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/window/mod.rs rename to nym-connect/desktop/src-tauri/src/operations/window/mod.rs diff --git a/nym-connect/src-tauri/src/state.rs b/nym-connect/desktop/src-tauri/src/state.rs similarity index 100% rename from nym-connect/src-tauri/src/state.rs rename to nym-connect/desktop/src-tauri/src/state.rs diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/desktop/src-tauri/src/tasks.rs similarity index 100% rename from nym-connect/src-tauri/src/tasks.rs rename to nym-connect/desktop/src-tauri/src/tasks.rs diff --git a/nym-connect-android/src-tauri/src/window.rs b/nym-connect/desktop/src-tauri/src/window.rs similarity index 100% rename from nym-connect-android/src-tauri/src/window.rs rename to nym-connect/desktop/src-tauri/src/window.rs diff --git a/nym-connect/src-tauri/tauri.conf.json b/nym-connect/desktop/src-tauri/tauri.conf.json similarity index 100% rename from nym-connect/src-tauri/tauri.conf.json rename to nym-connect/desktop/src-tauri/tauri.conf.json diff --git a/nym-connect-android/src/assets/help-step-four.png b/nym-connect/desktop/src/assets/help-step-four.png similarity index 100% rename from nym-connect-android/src/assets/help-step-four.png rename to nym-connect/desktop/src/assets/help-step-four.png diff --git a/nym-connect-android/src/assets/help-step-one-legacy.png b/nym-connect/desktop/src/assets/help-step-one-legacy.png similarity index 100% rename from nym-connect-android/src/assets/help-step-one-legacy.png rename to nym-connect/desktop/src/assets/help-step-one-legacy.png diff --git a/nym-connect-android/src/assets/help-step-one.png b/nym-connect/desktop/src/assets/help-step-one.png similarity index 100% rename from nym-connect-android/src/assets/help-step-one.png rename to nym-connect/desktop/src/assets/help-step-one.png diff --git a/nym-connect-android/src/assets/help-step-three.png b/nym-connect/desktop/src/assets/help-step-three.png similarity index 100% rename from nym-connect-android/src/assets/help-step-three.png rename to nym-connect/desktop/src/assets/help-step-three.png diff --git a/nym-connect-android/src/assets/help-step-two-legacy.png b/nym-connect/desktop/src/assets/help-step-two-legacy.png similarity index 100% rename from nym-connect-android/src/assets/help-step-two-legacy.png rename to nym-connect/desktop/src/assets/help-step-two-legacy.png diff --git a/nym-connect-android/src/assets/help-step-two.png b/nym-connect/desktop/src/assets/help-step-two.png similarity index 100% rename from nym-connect-android/src/assets/help-step-two.png rename to nym-connect/desktop/src/assets/help-step-two.png diff --git a/nym-connect-android/src/components/AppVersion.tsx b/nym-connect/desktop/src/components/AppVersion.tsx similarity index 100% rename from nym-connect-android/src/components/AppVersion.tsx rename to nym-connect/desktop/src/components/AppVersion.tsx diff --git a/nym-connect/src/components/AppWindowFrame.tsx b/nym-connect/desktop/src/components/AppWindowFrame.tsx similarity index 100% rename from nym-connect/src/components/AppWindowFrame.tsx rename to nym-connect/desktop/src/components/AppWindowFrame.tsx diff --git a/nym-connect-android/src/components/ConnectionButton.tsx b/nym-connect/desktop/src/components/ConnectionButton.tsx similarity index 100% rename from nym-connect-android/src/components/ConnectionButton.tsx rename to nym-connect/desktop/src/components/ConnectionButton.tsx diff --git a/nym-connect-android/src/components/ConnectionStats.tsx b/nym-connect/desktop/src/components/ConnectionStats.tsx similarity index 100% rename from nym-connect-android/src/components/ConnectionStats.tsx rename to nym-connect/desktop/src/components/ConnectionStats.tsx diff --git a/nym-connect/src/components/ConnectionStatus.tsx b/nym-connect/desktop/src/components/ConnectionStatus.tsx similarity index 100% rename from nym-connect/src/components/ConnectionStatus.tsx rename to nym-connect/desktop/src/components/ConnectionStatus.tsx diff --git a/nym-connect/src/components/ConntectionTimer.tsx b/nym-connect/desktop/src/components/ConntectionTimer.tsx similarity index 100% rename from nym-connect/src/components/ConntectionTimer.tsx rename to nym-connect/desktop/src/components/ConntectionTimer.tsx diff --git a/nym-connect-android/src/components/CopyToClipboard.tsx b/nym-connect/desktop/src/components/CopyToClipboard.tsx similarity index 100% rename from nym-connect-android/src/components/CopyToClipboard.tsx rename to nym-connect/desktop/src/components/CopyToClipboard.tsx diff --git a/nym-connect/src/components/CustomTitleBar.tsx b/nym-connect/desktop/src/components/CustomTitleBar.tsx similarity index 87% rename from nym-connect/src/components/CustomTitleBar.tsx rename to nym-connect/desktop/src/components/CustomTitleBar.tsx index d88b603873..88235e6074 100644 --- a/nym-connect/src/components/CustomTitleBar.tsx +++ b/nym-connect/desktop/src/components/CustomTitleBar.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { ArrowBack, Close, Menu, Minimize } from '@mui/icons-material'; import { Box, IconButton, Typography } from '@mui/material'; -import { NymWordmark } from '@nymproject/react/logo/NymWordmark'; +// TODO since the structure refactor for NC this import fails +// import { NymWordmark } from '@nymproject/react/logo/NymWordmark'; import { appWindow } from '@tauri-apps/api/window'; import { useNavigate } from 'react-router-dom'; @@ -47,7 +48,13 @@ const getTitleIcon = (path: string) => { ); } - return ; + + // TODO return ; + return ( + + NYM + + ); }; export const CustomTitleBar = ({ path = '/', onBack }: { path?: string; onBack?: () => void }) => ( diff --git a/nym-connect-android/src/components/Error.tsx b/nym-connect/desktop/src/components/Error.tsx similarity index 100% rename from nym-connect-android/src/components/Error.tsx rename to nym-connect/desktop/src/components/Error.tsx diff --git a/nym-connect-android/src/components/ErrorFallback.tsx b/nym-connect/desktop/src/components/ErrorFallback.tsx similarity index 100% rename from nym-connect-android/src/components/ErrorFallback.tsx rename to nym-connect/desktop/src/components/ErrorFallback.tsx diff --git a/nym-connect/src/components/ExperimentalWarning.tsx b/nym-connect/desktop/src/components/ExperimentalWarning.tsx similarity index 100% rename from nym-connect/src/components/ExperimentalWarning.tsx rename to nym-connect/desktop/src/components/ExperimentalWarning.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnButtonArea.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnButtonArea.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnButtonArea.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnCurrentDraw.stories.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnCurrentDraw.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnCurrentDraw.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnCurrentDraw.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnCurrentDraw.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnDraws.stories.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnDraws.stories.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnDraws.stories.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnDraws.stories.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnDraws.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnDraws.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnDraws.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnDraws.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnEnterWalletAddress.stories.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnEnterWalletAddress.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnEnterWalletAddress.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnEnterWalletAddress.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnError.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnError.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnError.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnError.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnPopup.stories.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnPopup.stories.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnPopup.stories.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnPopup.stories.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnPopup.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnPopup.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnPopup.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnPopup.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnTakePart.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnTakePart.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnTakePart.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnTakePart.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnWinner.stories.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnWinner.stories.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnWinner.stories.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnWinner.stories.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnWinner.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnWinner.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnWinner.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnWinner.tsx diff --git a/nym-connect/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx b/nym-connect/desktop/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx similarity index 100% rename from nym-connect/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx rename to nym-connect/desktop/src/components/Growth/TestAndEarnWinnerWalletAddress.tsx diff --git a/nym-connect/src/components/Growth/content/TestAndEarn/Error.mdx b/nym-connect/desktop/src/components/Growth/content/TestAndEarn/Error.mdx similarity index 100% rename from nym-connect/src/components/Growth/content/TestAndEarn/Error.mdx rename to nym-connect/desktop/src/components/Growth/content/TestAndEarn/Error.mdx diff --git a/nym-connect/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx b/nym-connect/desktop/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx similarity index 100% rename from nym-connect/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx rename to nym-connect/desktop/src/components/Growth/content/TestAndEarn/Stage0_intro.mdx diff --git a/nym-connect/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx b/nym-connect/desktop/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx similarity index 100% rename from nym-connect/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx rename to nym-connect/desktop/src/components/Growth/content/TestAndEarn/WinnerEntersWalletAddress.mdx diff --git a/nym-connect/src/components/Growth/content/TestAndEarnNotAvaialble.mdx b/nym-connect/desktop/src/components/Growth/content/TestAndEarnNotAvaialble.mdx similarity index 100% rename from nym-connect/src/components/Growth/content/TestAndEarnNotAvaialble.mdx rename to nym-connect/desktop/src/components/Growth/content/TestAndEarnNotAvaialble.mdx diff --git a/nym-connect-android/src/components/Growth/content/assets/matrix.webp b/nym-connect/desktop/src/components/Growth/content/assets/matrix.webp similarity index 100% rename from nym-connect-android/src/components/Growth/content/assets/matrix.webp rename to nym-connect/desktop/src/components/Growth/content/assets/matrix.webp diff --git a/nym-connect/src/components/Growth/content/assets/winner.webp b/nym-connect/desktop/src/components/Growth/content/assets/winner.webp similarity index 100% rename from nym-connect/src/components/Growth/content/assets/winner.webp rename to nym-connect/desktop/src/components/Growth/content/assets/winner.webp diff --git a/nym-connect/src/components/Growth/content/en.yaml b/nym-connect/desktop/src/components/Growth/content/en.yaml similarity index 100% rename from nym-connect/src/components/Growth/content/en.yaml rename to nym-connect/desktop/src/components/Growth/content/en.yaml diff --git a/nym-connect/src/components/Growth/context/TestAndEarnContext.tsx b/nym-connect/desktop/src/components/Growth/context/TestAndEarnContext.tsx similarity index 100% rename from nym-connect/src/components/Growth/context/TestAndEarnContext.tsx rename to nym-connect/desktop/src/components/Growth/context/TestAndEarnContext.tsx diff --git a/nym-connect/src/components/Growth/context/mocks/TestAndEarnContext.tsx b/nym-connect/desktop/src/components/Growth/context/mocks/TestAndEarnContext.tsx similarity index 100% rename from nym-connect/src/components/Growth/context/mocks/TestAndEarnContext.tsx rename to nym-connect/desktop/src/components/Growth/context/mocks/TestAndEarnContext.tsx diff --git a/nym-connect/src/components/Growth/context/types.ts b/nym-connect/desktop/src/components/Growth/context/types.ts similarity index 100% rename from nym-connect/src/components/Growth/context/types.ts rename to nym-connect/desktop/src/components/Growth/context/types.ts diff --git a/nym-connect/src/components/HelpPage.tsx b/nym-connect/desktop/src/components/HelpPage.tsx similarity index 100% rename from nym-connect/src/components/HelpPage.tsx rename to nym-connect/desktop/src/components/HelpPage.tsx diff --git a/nym-connect/src/components/HelpPageActions.tsx b/nym-connect/desktop/src/components/HelpPageActions.tsx similarity index 100% rename from nym-connect/src/components/HelpPageActions.tsx rename to nym-connect/desktop/src/components/HelpPageActions.tsx diff --git a/nym-connect-android/src/components/HelpPageImage.tsx b/nym-connect/desktop/src/components/HelpPageImage.tsx similarity index 100% rename from nym-connect-android/src/components/HelpPageImage.tsx rename to nym-connect/desktop/src/components/HelpPageImage.tsx diff --git a/nym-connect/src/components/HelpPageStepIndicator.tsx b/nym-connect/desktop/src/components/HelpPageStepIndicator.tsx similarity index 100% rename from nym-connect/src/components/HelpPageStepIndicator.tsx rename to nym-connect/desktop/src/components/HelpPageStepIndicator.tsx diff --git a/nym-connect/src/components/InfoModal.tsx b/nym-connect/desktop/src/components/InfoModal.tsx similarity index 100% rename from nym-connect/src/components/InfoModal.tsx rename to nym-connect/desktop/src/components/InfoModal.tsx diff --git a/nym-connect/src/components/IpAddressAndPort.tsx b/nym-connect/desktop/src/components/IpAddressAndPort.tsx similarity index 100% rename from nym-connect/src/components/IpAddressAndPort.tsx rename to nym-connect/desktop/src/components/IpAddressAndPort.tsx diff --git a/nym-connect-android/src/components/IpAddressAndPortModal.tsx b/nym-connect/desktop/src/components/IpAddressAndPortModal.tsx similarity index 100% rename from nym-connect-android/src/components/IpAddressAndPortModal.tsx rename to nym-connect/desktop/src/components/IpAddressAndPortModal.tsx diff --git a/nym-connect/src/components/LogViewer/index.tsx b/nym-connect/desktop/src/components/LogViewer/index.tsx similarity index 100% rename from nym-connect/src/components/LogViewer/index.tsx rename to nym-connect/desktop/src/components/LogViewer/index.tsx diff --git a/nym-connect-android/src/components/NeedHelp.tsx b/nym-connect/desktop/src/components/NeedHelp.tsx similarity index 100% rename from nym-connect-android/src/components/NeedHelp.tsx rename to nym-connect/desktop/src/components/NeedHelp.tsx diff --git a/nym-connect/src/components/PowerButton/PowerButton.tsx b/nym-connect/desktop/src/components/PowerButton/PowerButton.tsx similarity index 100% rename from nym-connect/src/components/PowerButton/PowerButton.tsx rename to nym-connect/desktop/src/components/PowerButton/PowerButton.tsx diff --git a/nym-connect/src/components/PowerButton/power-button.css b/nym-connect/desktop/src/components/PowerButton/power-button.css similarity index 100% rename from nym-connect/src/components/PowerButton/power-button.css rename to nym-connect/desktop/src/components/PowerButton/power-button.css diff --git a/nym-connect-android/src/components/ServiceProviderPopup.tsx b/nym-connect/desktop/src/components/ServiceProviderPopup.tsx similarity index 100% rename from nym-connect-android/src/components/ServiceProviderPopup.tsx rename to nym-connect/desktop/src/components/ServiceProviderPopup.tsx diff --git a/nym-connect-android/src/components/ServiceProviderSelector.stories.tsx b/nym-connect/desktop/src/components/ServiceProviderSelector.stories.tsx similarity index 100% rename from nym-connect-android/src/components/ServiceProviderSelector.stories.tsx rename to nym-connect/desktop/src/components/ServiceProviderSelector.stories.tsx diff --git a/nym-connect-android/src/components/ServiceProviderSelector.tsx b/nym-connect/desktop/src/components/ServiceProviderSelector.tsx similarity index 100% rename from nym-connect-android/src/components/ServiceProviderSelector.tsx rename to nym-connect/desktop/src/components/ServiceProviderSelector.tsx diff --git a/nym-connect-android/src/components/ServiceSelector.stories.tsx b/nym-connect/desktop/src/components/ServiceSelector.stories.tsx similarity index 100% rename from nym-connect-android/src/components/ServiceSelector.stories.tsx rename to nym-connect/desktop/src/components/ServiceSelector.stories.tsx diff --git a/nym-connect-android/src/components/ServiceSelector.tsx b/nym-connect/desktop/src/components/ServiceSelector.tsx similarity index 100% rename from nym-connect-android/src/components/ServiceSelector.tsx rename to nym-connect/desktop/src/components/ServiceSelector.tsx diff --git a/nym-connect/src/components/TooltipInfo.tsx b/nym-connect/desktop/src/components/TooltipInfo.tsx similarity index 100% rename from nym-connect/src/components/TooltipInfo.tsx rename to nym-connect/desktop/src/components/TooltipInfo.tsx diff --git a/nym-connect-android/src/config.ts b/nym-connect/desktop/src/config.ts similarity index 100% rename from nym-connect-android/src/config.ts rename to nym-connect/desktop/src/config.ts diff --git a/nym-connect-android/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx similarity index 100% rename from nym-connect-android/src/context/main.tsx rename to nym-connect/desktop/src/context/main.tsx diff --git a/nym-connect-android/src/context/mocks/main.tsx b/nym-connect/desktop/src/context/mocks/main.tsx similarity index 100% rename from nym-connect-android/src/context/mocks/main.tsx rename to nym-connect/desktop/src/context/mocks/main.tsx diff --git a/nym-connect-android/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf b/nym-connect/desktop/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf similarity index 100% rename from nym-connect-android/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf rename to nym-connect/desktop/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf diff --git a/nym-connect-android/src/fonts/OpenSans-VariableFont_wdth,wght.ttf b/nym-connect/desktop/src/fonts/OpenSans-VariableFont_wdth,wght.ttf similarity index 100% rename from nym-connect-android/src/fonts/OpenSans-VariableFont_wdth,wght.ttf rename to nym-connect/desktop/src/fonts/OpenSans-VariableFont_wdth,wght.ttf diff --git a/nym-connect-android/src/fonts/fonts.css b/nym-connect/desktop/src/fonts/fonts.css similarity index 100% rename from nym-connect-android/src/fonts/fonts.css rename to nym-connect/desktop/src/fonts/fonts.css diff --git a/nym-connect/src/growth.tsx b/nym-connect/desktop/src/growth.tsx similarity index 100% rename from nym-connect/src/growth.tsx rename to nym-connect/desktop/src/growth.tsx diff --git a/nym-connect-android/src/hooks/events.ts b/nym-connect/desktop/src/hooks/events.ts similarity index 100% rename from nym-connect-android/src/hooks/events.ts rename to nym-connect/desktop/src/hooks/events.ts diff --git a/nym-connect/src/index.tsx b/nym-connect/desktop/src/index.tsx similarity index 100% rename from nym-connect/src/index.tsx rename to nym-connect/desktop/src/index.tsx diff --git a/nym-connect/src/layouts/ConnectionLayout.tsx b/nym-connect/desktop/src/layouts/ConnectionLayout.tsx similarity index 100% rename from nym-connect/src/layouts/ConnectionLayout.tsx rename to nym-connect/desktop/src/layouts/ConnectionLayout.tsx diff --git a/nym-connect/src/log.tsx b/nym-connect/desktop/src/log.tsx similarity index 100% rename from nym-connect/src/log.tsx rename to nym-connect/desktop/src/log.tsx diff --git a/nym-connect/src/pages/connection/Connected.tsx b/nym-connect/desktop/src/pages/connection/Connected.tsx similarity index 100% rename from nym-connect/src/pages/connection/Connected.tsx rename to nym-connect/desktop/src/pages/connection/Connected.tsx diff --git a/nym-connect/src/pages/connection/Disconnected.tsx b/nym-connect/desktop/src/pages/connection/Disconnected.tsx similarity index 100% rename from nym-connect/src/pages/connection/Disconnected.tsx rename to nym-connect/desktop/src/pages/connection/Disconnected.tsx diff --git a/nym-connect/src/pages/connection/index.tsx b/nym-connect/desktop/src/pages/connection/index.tsx similarity index 100% rename from nym-connect/src/pages/connection/index.tsx rename to nym-connect/desktop/src/pages/connection/index.tsx diff --git a/nym-connect/src/pages/menu/Apps.tsx b/nym-connect/desktop/src/pages/menu/Apps.tsx similarity index 100% rename from nym-connect/src/pages/menu/Apps.tsx rename to nym-connect/desktop/src/pages/menu/Apps.tsx diff --git a/nym-connect-android/src/pages/menu/Guide.tsx b/nym-connect/desktop/src/pages/menu/Guide.tsx similarity index 100% rename from nym-connect-android/src/pages/menu/Guide.tsx rename to nym-connect/desktop/src/pages/menu/Guide.tsx diff --git a/nym-connect/src/pages/menu/index.tsx b/nym-connect/desktop/src/pages/menu/index.tsx similarity index 100% rename from nym-connect/src/pages/menu/index.tsx rename to nym-connect/desktop/src/pages/menu/index.tsx diff --git a/nym-connect/src/pages/menu/settings/GatewaySettings.tsx b/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx similarity index 100% rename from nym-connect/src/pages/menu/settings/GatewaySettings.tsx rename to nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx diff --git a/nym-connect/src/pages/menu/settings/index.tsx b/nym-connect/desktop/src/pages/menu/settings/index.tsx similarity index 100% rename from nym-connect/src/pages/menu/settings/index.tsx rename to nym-connect/desktop/src/pages/menu/settings/index.tsx diff --git a/nym-connect/src/routes/index.tsx b/nym-connect/desktop/src/routes/index.tsx similarity index 100% rename from nym-connect/src/routes/index.tsx rename to nym-connect/desktop/src/routes/index.tsx diff --git a/nym-connect-android/src/stories/AppFlow.stories.tsx b/nym-connect/desktop/src/stories/AppFlow.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/AppFlow.stories.tsx rename to nym-connect/desktop/src/stories/AppFlow.stories.tsx diff --git a/nym-connect-android/src/stories/AppWindowFrame.stories.tsx b/nym-connect/desktop/src/stories/AppWindowFrame.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/AppWindowFrame.stories.tsx rename to nym-connect/desktop/src/stories/AppWindowFrame.stories.tsx diff --git a/nym-connect-android/src/stories/ConnectedLayout.stories.tsx b/nym-connect/desktop/src/stories/ConnectedLayout.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/ConnectedLayout.stories.tsx rename to nym-connect/desktop/src/stories/ConnectedLayout.stories.tsx diff --git a/nym-connect-android/src/stories/ConnectionButton.stories.tsx b/nym-connect/desktop/src/stories/ConnectionButton.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/ConnectionButton.stories.tsx rename to nym-connect/desktop/src/stories/ConnectionButton.stories.tsx diff --git a/nym-connect-android/src/stories/ConnectionStats.stories.tsx b/nym-connect/desktop/src/stories/ConnectionStats.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/ConnectionStats.stories.tsx rename to nym-connect/desktop/src/stories/ConnectionStats.stories.tsx diff --git a/nym-connect-android/src/stories/ConnectionStatus.stories.tsx b/nym-connect/desktop/src/stories/ConnectionStatus.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/ConnectionStatus.stories.tsx rename to nym-connect/desktop/src/stories/ConnectionStatus.stories.tsx diff --git a/nym-connect-android/src/stories/DefaultLayout.stories.tsx b/nym-connect/desktop/src/stories/DefaultLayout.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/DefaultLayout.stories.tsx rename to nym-connect/desktop/src/stories/DefaultLayout.stories.tsx diff --git a/nym-connect-android/src/stories/Introduction.stories.mdx b/nym-connect/desktop/src/stories/Introduction.stories.mdx similarity index 100% rename from nym-connect-android/src/stories/Introduction.stories.mdx rename to nym-connect/desktop/src/stories/Introduction.stories.mdx diff --git a/nym-connect-android/src/stories/IpAddressAndPort.stories.tsx b/nym-connect/desktop/src/stories/IpAddressAndPort.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/IpAddressAndPort.stories.tsx rename to nym-connect/desktop/src/stories/IpAddressAndPort.stories.tsx diff --git a/nym-connect-android/src/stories/PowerButton.stories.tsx b/nym-connect/desktop/src/stories/PowerButton.stories.tsx similarity index 100% rename from nym-connect-android/src/stories/PowerButton.stories.tsx rename to nym-connect/desktop/src/stories/PowerButton.stories.tsx diff --git a/nym-connect-android/src/theme/index.tsx b/nym-connect/desktop/src/theme/index.tsx similarity index 94% rename from nym-connect-android/src/theme/index.tsx rename to nym-connect/desktop/src/theme/index.tsx index ad2350053d..d307fe46ee 100644 --- a/nym-connect-android/src/theme/index.tsx +++ b/nym-connect/desktop/src/theme/index.tsx @@ -3,7 +3,7 @@ import { createTheme, ThemeProvider } from '@mui/material/styles'; import { CssBaseline } from '@mui/material'; import { getDesignTokens } from './theme'; // eslint-disable-next-line import/no-relative-packages -import '../../../assets/fonts/non-variable/fonts.css'; +import '../../../../assets/fonts/non-variable/fonts.css'; /** * Provides the theme for Nym Connect by reacting to the light/dark mode choice stored in the app context. diff --git a/nym-connect-android/src/theme/mui-theme.d.ts b/nym-connect/desktop/src/theme/mui-theme.d.ts similarity index 100% rename from nym-connect-android/src/theme/mui-theme.d.ts rename to nym-connect/desktop/src/theme/mui-theme.d.ts diff --git a/nym-connect/src/theme/theme.tsx b/nym-connect/desktop/src/theme/theme.tsx similarity index 100% rename from nym-connect/src/theme/theme.tsx rename to nym-connect/desktop/src/theme/theme.tsx diff --git a/nym-connect-android/src/types/connection.ts b/nym-connect/desktop/src/types/connection.ts similarity index 100% rename from nym-connect-android/src/types/connection.ts rename to nym-connect/desktop/src/types/connection.ts diff --git a/nym-connect-android/src/types/directory.ts b/nym-connect/desktop/src/types/directory.ts similarity index 100% rename from nym-connect-android/src/types/directory.ts rename to nym-connect/desktop/src/types/directory.ts diff --git a/nym-connect-android/src/types/error.ts b/nym-connect/desktop/src/types/error.ts similarity index 100% rename from nym-connect-android/src/types/error.ts rename to nym-connect/desktop/src/types/error.ts diff --git a/nym-connect-android/src/types/event.ts b/nym-connect/desktop/src/types/event.ts similarity index 100% rename from nym-connect-android/src/types/event.ts rename to nym-connect/desktop/src/types/event.ts diff --git a/nym-connect-android/src/types/gateway.ts b/nym-connect/desktop/src/types/gateway.ts similarity index 100% rename from nym-connect-android/src/types/gateway.ts rename to nym-connect/desktop/src/types/gateway.ts diff --git a/nym-connect-android/src/types/index.ts b/nym-connect/desktop/src/types/index.ts similarity index 100% rename from nym-connect-android/src/types/index.ts rename to nym-connect/desktop/src/types/index.ts diff --git a/nym-connect-android/src/types/rust/index.ts b/nym-connect/desktop/src/types/rust/index.ts similarity index 100% rename from nym-connect-android/src/types/rust/index.ts rename to nym-connect/desktop/src/types/rust/index.ts diff --git a/nym-connect-android/src/types/rust/stateparams.ts b/nym-connect/desktop/src/types/rust/stateparams.ts similarity index 100% rename from nym-connect-android/src/types/rust/stateparams.ts rename to nym-connect/desktop/src/types/rust/stateparams.ts diff --git a/nym-connect-android/src/typings/FC.d.ts b/nym-connect/desktop/src/typings/FC.d.ts similarity index 100% rename from nym-connect-android/src/typings/FC.d.ts rename to nym-connect/desktop/src/typings/FC.d.ts diff --git a/nym-connect-android/src/typings/jpeg.d.ts b/nym-connect/desktop/src/typings/jpeg.d.ts similarity index 100% rename from nym-connect-android/src/typings/jpeg.d.ts rename to nym-connect/desktop/src/typings/jpeg.d.ts diff --git a/nym-connect-android/src/typings/json.d.ts b/nym-connect/desktop/src/typings/json.d.ts similarity index 100% rename from nym-connect-android/src/typings/json.d.ts rename to nym-connect/desktop/src/typings/json.d.ts diff --git a/nym-connect-android/src/typings/png.d.ts b/nym-connect/desktop/src/typings/png.d.ts similarity index 100% rename from nym-connect-android/src/typings/png.d.ts rename to nym-connect/desktop/src/typings/png.d.ts diff --git a/nym-connect-android/src/typings/svg.d.ts b/nym-connect/desktop/src/typings/svg.d.ts similarity index 100% rename from nym-connect-android/src/typings/svg.d.ts rename to nym-connect/desktop/src/typings/svg.d.ts diff --git a/nym-connect-android/src/typings/webp.d.ts b/nym-connect/desktop/src/typings/webp.d.ts similarity index 100% rename from nym-connect-android/src/typings/webp.d.ts rename to nym-connect/desktop/src/typings/webp.d.ts diff --git a/nym-connect-android/src/typings/yaml.d.ts b/nym-connect/desktop/src/typings/yaml.d.ts similarity index 100% rename from nym-connect-android/src/typings/yaml.d.ts rename to nym-connect/desktop/src/typings/yaml.d.ts diff --git a/nym-connect/src/utils/index.ts b/nym-connect/desktop/src/utils/index.ts similarity index 100% rename from nym-connect/src/utils/index.ts rename to nym-connect/desktop/src/utils/index.ts diff --git a/nym-connect-android/tsconfig.eslint.json b/nym-connect/desktop/tsconfig.eslint.json similarity index 100% rename from nym-connect-android/tsconfig.eslint.json rename to nym-connect/desktop/tsconfig.eslint.json diff --git a/nym-connect/tsconfig.json b/nym-connect/desktop/tsconfig.json similarity index 100% rename from nym-connect/tsconfig.json rename to nym-connect/desktop/tsconfig.json diff --git a/nym-connect/webpack.common.js b/nym-connect/desktop/webpack.common.js similarity index 100% rename from nym-connect/webpack.common.js rename to nym-connect/desktop/webpack.common.js diff --git a/nym-connect/webpack.dev.js b/nym-connect/desktop/webpack.dev.js similarity index 100% rename from nym-connect/webpack.dev.js rename to nym-connect/desktop/webpack.dev.js diff --git a/nym-connect/webpack.prod.js b/nym-connect/desktop/webpack.prod.js similarity index 100% rename from nym-connect/webpack.prod.js rename to nym-connect/desktop/webpack.prod.js diff --git a/nym-connect/.babelrc b/nym-connect/mobile/.babelrc similarity index 100% rename from nym-connect/.babelrc rename to nym-connect/mobile/.babelrc diff --git a/nym-connect/.env.sample b/nym-connect/mobile/.env.sample similarity index 100% rename from nym-connect/.env.sample rename to nym-connect/mobile/.env.sample diff --git a/nym-connect/.eslintrc b/nym-connect/mobile/.eslintrc similarity index 100% rename from nym-connect/.eslintrc rename to nym-connect/mobile/.eslintrc diff --git a/nym-connect/.nvmrc b/nym-connect/mobile/.nvmrc similarity index 100% rename from nym-connect/.nvmrc rename to nym-connect/mobile/.nvmrc diff --git a/nym-connect/.prettierrc b/nym-connect/mobile/.prettierrc similarity index 100% rename from nym-connect/.prettierrc rename to nym-connect/mobile/.prettierrc diff --git a/nym-connect/.storybook/main.js b/nym-connect/mobile/.storybook/main.js similarity index 100% rename from nym-connect/.storybook/main.js rename to nym-connect/mobile/.storybook/main.js diff --git a/nym-connect/.storybook/mocks/tauri/app.js b/nym-connect/mobile/.storybook/mocks/tauri/app.js similarity index 100% rename from nym-connect/.storybook/mocks/tauri/app.js rename to nym-connect/mobile/.storybook/mocks/tauri/app.js diff --git a/nym-connect/.storybook/mocks/tauri/clipboard.js b/nym-connect/mobile/.storybook/mocks/tauri/clipboard.js similarity index 100% rename from nym-connect/.storybook/mocks/tauri/clipboard.js rename to nym-connect/mobile/.storybook/mocks/tauri/clipboard.js diff --git a/nym-connect/.storybook/mocks/tauri/event.js b/nym-connect/mobile/.storybook/mocks/tauri/event.js similarity index 100% rename from nym-connect/.storybook/mocks/tauri/event.js rename to nym-connect/mobile/.storybook/mocks/tauri/event.js diff --git a/nym-connect/.storybook/mocks/tauri/index.js b/nym-connect/mobile/.storybook/mocks/tauri/index.js similarity index 100% rename from nym-connect/.storybook/mocks/tauri/index.js rename to nym-connect/mobile/.storybook/mocks/tauri/index.js diff --git a/nym-connect/.storybook/mocks/tauri/notification.js b/nym-connect/mobile/.storybook/mocks/tauri/notification.js similarity index 100% rename from nym-connect/.storybook/mocks/tauri/notification.js rename to nym-connect/mobile/.storybook/mocks/tauri/notification.js diff --git a/nym-connect/.storybook/mocks/tauri/window.js b/nym-connect/mobile/.storybook/mocks/tauri/window.js similarity index 100% rename from nym-connect/.storybook/mocks/tauri/window.js rename to nym-connect/mobile/.storybook/mocks/tauri/window.js diff --git a/nym-connect/.storybook/preview-fonts.js b/nym-connect/mobile/.storybook/preview-fonts.js similarity index 100% rename from nym-connect/.storybook/preview-fonts.js rename to nym-connect/mobile/.storybook/preview-fonts.js diff --git a/nym-connect/.storybook/preview.js b/nym-connect/mobile/.storybook/preview.js similarity index 100% rename from nym-connect/.storybook/preview.js rename to nym-connect/mobile/.storybook/preview.js diff --git a/nym-connect-android/CHANGELOG.md b/nym-connect/mobile/CHANGELOG.md similarity index 100% rename from nym-connect-android/CHANGELOG.md rename to nym-connect/mobile/CHANGELOG.md diff --git a/nym-connect-android/README.md b/nym-connect/mobile/README.md similarity index 71% rename from nym-connect-android/README.md rename to nym-connect/mobile/README.md index a97d3c8ea0..1bbc685447 100644 --- a/nym-connect-android/README.md +++ b/nym-connect/mobile/README.md @@ -3,12 +3,15 @@ Copyright 2020 - Nym Technologies SA SPDX-License-Identifier: Apache-2.0 --> -# Nym Connect - Android +# Nym Connect - Mobile -[Nym Connect](https://github.com/nymtech/nym/tree/develop/nym-connect) application for Android. +[Nym Connect](https://github.com/nymtech/nym/tree/develop/nym-connect) application for Mobile. Nym Connects sets up a SOCKS5 proxy for local applications to use. +**NOTE**: Currently we only focus on Android, +the remaining docs apply for Android development only. + ## Installation prerequisites - Linux / Mac - `Yarn` @@ -21,7 +24,7 @@ https://next--tauri.netlify.app/next/guides/getting-started/prerequisites/linux# ## Installation -Inside the `nym-connect-android` directory, run the following commands: +Inside the `mobile/nym-connect` directory, run the following commands: ``` yarn install @@ -32,10 +35,10 @@ yarn prewebpack:dev Assuming there is a running android [emulator](https://developer.android.com/studio/run/emulator) or a real [device](https://developer.android.com/studio/run/device) connected. -Inside the `nym-connect-android/src-tauri` directory, run the following command: +Inside the `mobile/nym-connect/src-tauri` directory, run the following command: ``` -yarn dev +yarn dev:android ``` #### Debugging @@ -48,7 +51,7 @@ To build the APK, run the build commands. ``` yarn webpack:prod -WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android build --debug --apk +WRY_ANDROID_PACKAGE=net.nymtech.nym_connect WRY_ANDROID_LIBRARY=nym_connect cargo tauri android build --debug --apk ``` # Storybook diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/generated/.gitkeep b/nym-connect/mobile/dist/.gitkeep similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/java/net/nymtech/nym_connect_android/generated/.gitkeep rename to nym-connect/mobile/dist/.gitkeep diff --git a/nym-connect-android/package.json b/nym-connect/mobile/package.json similarity index 82% rename from nym-connect-android/package.json rename to nym-connect/mobile/package.json index fdb5d84aa4..09df008b57 100644 --- a/nym-connect-android/package.json +++ b/nym-connect/mobile/package.json @@ -1,28 +1,32 @@ { - "name": "@nym/nym-connect-android", + "name": "@nym/nym-connect-mobile", "version": "1.1.7", "main": "index.js", "license": "MIT", "scripts": { - "prewebpack:dev": "yarn --cwd .. build", + "prewebpack:dev": "yarn --cwd ../.. build", "webpack:dev": "yarn webpack serve --config webpack.dev.js", "webpack:dev:onlyThis": "yarn webpack serve --config webpack.dev.js", "webpack:prod": "yarn webpack --progress --config webpack.prod.js", "tauri": "tauri", - "tauri:dev": "WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android dev", - "tauri:build": "WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android build", - "dev": "run-p webpack:dev:onlyThis tauri:dev", - "prebuild": "yarn --cwd .. build", - "build": "run-s webpack:prod tauri:build", + "tauri:dev:android": "WRY_ANDROID_PACKAGE=net.nymtech.nym_connect WRY_ANDROID_LIBRARY=nym_connect cargo tauri android dev", + "tauri:build:android": "WRY_ANDROID_PACKAGE=net.nymtech.nym_connect WRY_ANDROID_LIBRARY=nym_connect cargo tauri android build", + "dev:android": "run-p webpack:dev:onlyThis tauri:dev:android", + "prebuild": "yarn --cwd ../.. build", + "build:android": "run-s webpack:prod tauri:build:android", "storybook": "start-storybook -p 6006", - "prestorybook:build": "yarn --cwd .. build", + "prestorybook:build": "yarn --cwd ../.. build", "storybook:build": "build-storybook", "tsc": "tsc --noEmit true", "tsc:watch": "tsc --noEmit true --watch", "lint": "eslint src", "lint:fix": "eslint src --fix", "test": "jest", - "test:watch": "jest --watch" + "test:watch": "jest --watch", + "clean:dist": "rm -rf dist", + "clean:node": "rm -rf node_modules", + "clean:rust": "cargo clean --manifest-path src-tauri/Cargo.toml", + "clean:": "run-p clean:node clean:rust" }, "dependencies": { "@emotion/react": "^11.7.0", diff --git a/nym-connect/public/favicon.ico b/nym-connect/mobile/public/favicon.ico similarity index 100% rename from nym-connect/public/favicon.ico rename to nym-connect/mobile/public/favicon.ico diff --git a/nym-connect/public/favicon.png b/nym-connect/mobile/public/favicon.png similarity index 100% rename from nym-connect/public/favicon.png rename to nym-connect/mobile/public/favicon.png diff --git a/nym-connect/public/index.html b/nym-connect/mobile/public/index.html similarity index 100% rename from nym-connect/public/index.html rename to nym-connect/mobile/public/index.html diff --git a/nym-connect-android/src-tauri/.cargo/config.toml b/nym-connect/mobile/src-tauri/.cargo/config.toml similarity index 78% rename from nym-connect-android/src-tauri/.cargo/config.toml rename to nym-connect/mobile/src-tauri/.cargo/config.toml index d4585a1646..be3873a8cf 100644 --- a/nym-connect-android/src-tauri/.cargo/config.toml +++ b/nym-connect/mobile/src-tauri/.cargo/config.toml @@ -4,7 +4,7 @@ target = 'x86_64-unknown-linux-gnu' linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang' rustflags = [ '-L', - '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', '-Clink-arg=-landroid', '-Clink-arg=-llog', '-Clink-arg=-lOpenSLES', @@ -14,7 +14,7 @@ rustflags = [ linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang' rustflags = [ '-L', - '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', '-Clink-arg=-landroid', '-Clink-arg=-llog', '-Clink-arg=-lOpenSLES', @@ -24,7 +24,7 @@ rustflags = [ linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android24-clang' rustflags = [ '-L', - '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', '-Clink-arg=-landroid', '-Clink-arg=-llog', '-Clink-arg=-lOpenSLES', @@ -34,7 +34,7 @@ rustflags = [ linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android24-clang' rustflags = [ '-L', - '/home/pierre/Documents/nym/nym/nym-connect-android/src-tauri/.cargo', + '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', '-Clink-arg=-landroid', '-Clink-arg=-llog', '-Clink-arg=-lOpenSLES', diff --git a/nym-connect-android/src-tauri/.cargo/libgcc.a b/nym-connect/mobile/src-tauri/.cargo/libgcc.a similarity index 100% rename from nym-connect-android/src-tauri/.cargo/libgcc.a rename to nym-connect/mobile/src-tauri/.cargo/libgcc.a diff --git a/nym-connect/src-tauri/.gitignore b/nym-connect/mobile/src-tauri/.gitignore similarity index 100% rename from nym-connect/src-tauri/.gitignore rename to nym-connect/mobile/src-tauri/.gitignore diff --git a/nym-connect-android/src-tauri/Cargo.lock b/nym-connect/mobile/src-tauri/Cargo.lock similarity index 99% rename from nym-connect-android/src-tauri/Cargo.lock rename to nym-connect/mobile/src-tauri/Cargo.lock index 8c08eced60..3cbbdc7478 100644 --- a/nym-connect-android/src-tauri/Cargo.lock +++ b/nym-connect/mobile/src-tauri/Cargo.lock @@ -3509,7 +3509,7 @@ dependencies = [ ] [[package]] -name = "nym-connect-android" +name = "nym-connect" version = "1.1.9" dependencies = [ "anyhow", diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect/mobile/src-tauri/Cargo.toml similarity index 75% rename from nym-connect-android/src-tauri/Cargo.toml rename to nym-connect/mobile/src-tauri/Cargo.toml index 7db18d789b..f83ffd2fe5 100644 --- a/nym-connect-android/src-tauri/Cargo.toml +++ b/nym-connect/mobile/src-tauri/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "nym-connect-android" +name = "nym-connect" version = "1.1.9" -description = "nym-connect for Android" +description = "nym-connect for Mobile" authors = ["Nym Technologies SA"] license = "" repository = "" -default-run = "nym-connect-android" +default-run = "nym-connect" edition = "2021" build = "src/build.rs" rust-version = "1.58" @@ -46,14 +46,14 @@ tokio = { version = "1.24.1", features = ["sync", "time"] } url = "2.2" yaml-rust = "0.4" -client-core = { path = "../../clients/client-core" } -nym-api-requests = { path = "../../nym-api/nym-api-requests" } -nym-contracts-common = { path = "../../common/cosmwasm-smart-contracts/contracts-common"} -config-common = { path = "../../common/config", package = "config" } -nym-crypto = { path = "../../common/crypto" } -nym-bin-common = { path = "../../common/bin-common"} -nym-socks5-client = { path = "../../clients/socks5", features = ["mobile"], default-features = false } -nym-task = { path = "../../common/task" } +client-core = { path = "../../../clients/client-core" } +nym-api-requests = { path = "../../../nym-api/nym-api-requests" } +nym-contracts-common = { path = "../../../common/cosmwasm-smart-contracts/contracts-common"} +config-common = { path = "../../../common/config", package = "config" } +nym-crypto = { path = "../../../common/crypto" } +nym-bin-common = { path = "../../../common/bin-common"} +nym-socks5-client = { path = "../../../clients/socks5", features = ["mobile"], default-features = false } +nym-task = { path = "../../../common/task" } [dev-dependencies] ts-rs = "6.1.2" diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/.editorconfig b/nym-connect/mobile/src-tauri/gen/android/nym_connect/.editorconfig similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/.editorconfig rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/.editorconfig diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/.gitignore b/nym-connect/mobile/src-tauri/gen/android/nym_connect/.gitignore similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/.gitignore rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/.gitignore diff --git a/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/.gitignore b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/.gitignore new file mode 100644 index 0000000000..1b13319aad --- /dev/null +++ b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/.gitignore @@ -0,0 +1 @@ +/src/main/java/net/nymtech/nym_connect/generated \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build.gradle.kts b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/build.gradle.kts similarity index 96% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build.gradle.kts rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/app/build.gradle.kts index cf8fdbfa28..3b092d967a 100644 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/build.gradle.kts +++ b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/build.gradle.kts @@ -8,11 +8,11 @@ android { compileSdk = 33 defaultConfig { manifestPlaceholders["usesCleartextTraffic"] = "false" - applicationId = "net.nymtech.nym_connect_android" + applicationId = "net.nymtech.nym_connect" minSdk = 24 targetSdk = 33 versionCode = 1 - versionName = "1.0" + versionName = "1.1.9" } sourceSets.getByName("main") { // Vulkan validation layers @@ -81,7 +81,7 @@ android { } assetPacks += mutableSetOf() - namespace = "net.nymtech.nym_connect_android" + namespace = "net.nymtech.nym_connect" } rust { diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/proguard-rules.pro b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/proguard-rules.pro similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/proguard-rules.pro rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/app/proguard-rules.pro diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/AndroidManifest.xml b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/AndroidManifest.xml similarity index 86% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/AndroidManifest.xml rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/AndroidManifest.xml index 572a6d4960..1c575ab17a 100644 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/AndroidManifest.xml +++ b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/AndroidManifest.xml @@ -1,11 +1,14 @@ - + + - \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/colors.xml b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/colors.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/colors.xml rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/colors.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/ic_launcher_background.xml b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/ic_launcher_background.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/ic_launcher_background.xml rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/ic_launcher_background.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/strings.xml b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/strings.xml similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/strings.xml rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/strings.xml diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/themes.xml similarity index 88% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/themes.xml index 7416b4c5cb..894b25a6c9 100644 --- a/nym-connect-android/src-tauri/gen/android/nym_connect_android/app/src/main/res/values/themes.xml +++ b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/build.gradle.kts b/nym-connect/mobile/src-tauri/gen/android/nym_connect/build.gradle.kts similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/build.gradle.kts rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/build.gradle.kts diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/build.gradle.kts b/nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/build.gradle.kts similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/build.gradle.kts rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/build.gradle.kts diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/BuildTask.kt b/nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/BuildTask.kt similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/BuildTask.kt rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/BuildTask.kt diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/RustPlugin.kt b/nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/RustPlugin.kt similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/buildSrc/src/main/java/net/nymtech/nym_connect_android/kotlin/RustPlugin.kt rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/RustPlugin.kt diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle.properties b/nym-connect/mobile/src-tauri/gen/android/nym_connect/gradle.properties similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle.properties rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/gradle.properties diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.jar b/nym-connect/mobile/src-tauri/gen/android/nym_connect/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.jar rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/gradle/wrapper/gradle-wrapper.jar diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.properties b/nym-connect/mobile/src-tauri/gen/android/nym_connect/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/gradle/wrapper/gradle-wrapper.properties rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/gradle/wrapper/gradle-wrapper.properties diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew b/nym-connect/mobile/src-tauri/gen/android/nym_connect/gradlew similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/gradlew diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew.bat b/nym-connect/mobile/src-tauri/gen/android/nym_connect/gradlew.bat similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/gradlew.bat rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/gradlew.bat diff --git a/nym-connect-android/src-tauri/gen/android/nym_connect_android/settings.gradle b/nym-connect/mobile/src-tauri/gen/android/nym_connect/settings.gradle similarity index 100% rename from nym-connect-android/src-tauri/gen/android/nym_connect_android/settings.gradle rename to nym-connect/mobile/src-tauri/gen/android/nym_connect/settings.gradle diff --git a/nym-connect/src-tauri/icons/128x128.png b/nym-connect/mobile/src-tauri/icons/128x128.png similarity index 100% rename from nym-connect/src-tauri/icons/128x128.png rename to nym-connect/mobile/src-tauri/icons/128x128.png diff --git a/nym-connect/src-tauri/icons/128x128@2x.png b/nym-connect/mobile/src-tauri/icons/128x128@2x.png similarity index 100% rename from nym-connect/src-tauri/icons/128x128@2x.png rename to nym-connect/mobile/src-tauri/icons/128x128@2x.png diff --git a/nym-connect/src-tauri/icons/32x32.png b/nym-connect/mobile/src-tauri/icons/32x32.png similarity index 100% rename from nym-connect/src-tauri/icons/32x32.png rename to nym-connect/mobile/src-tauri/icons/32x32.png diff --git a/nym-connect/src-tauri/icons/Square107x107Logo.png b/nym-connect/mobile/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square107x107Logo.png rename to nym-connect/mobile/src-tauri/icons/Square107x107Logo.png diff --git a/nym-connect/src-tauri/icons/Square142x142Logo.png b/nym-connect/mobile/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square142x142Logo.png rename to nym-connect/mobile/src-tauri/icons/Square142x142Logo.png diff --git a/nym-connect/src-tauri/icons/Square150x150Logo.png b/nym-connect/mobile/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square150x150Logo.png rename to nym-connect/mobile/src-tauri/icons/Square150x150Logo.png diff --git a/nym-connect/src-tauri/icons/Square284x284Logo.png b/nym-connect/mobile/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square284x284Logo.png rename to nym-connect/mobile/src-tauri/icons/Square284x284Logo.png diff --git a/nym-connect/src-tauri/icons/Square30x30Logo.png b/nym-connect/mobile/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square30x30Logo.png rename to nym-connect/mobile/src-tauri/icons/Square30x30Logo.png diff --git a/nym-connect/src-tauri/icons/Square310x310Logo.png b/nym-connect/mobile/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square310x310Logo.png rename to nym-connect/mobile/src-tauri/icons/Square310x310Logo.png diff --git a/nym-connect/src-tauri/icons/Square44x44Logo.png b/nym-connect/mobile/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square44x44Logo.png rename to nym-connect/mobile/src-tauri/icons/Square44x44Logo.png diff --git a/nym-connect/src-tauri/icons/Square71x71Logo.png b/nym-connect/mobile/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square71x71Logo.png rename to nym-connect/mobile/src-tauri/icons/Square71x71Logo.png diff --git a/nym-connect/src-tauri/icons/Square89x89Logo.png b/nym-connect/mobile/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from nym-connect/src-tauri/icons/Square89x89Logo.png rename to nym-connect/mobile/src-tauri/icons/Square89x89Logo.png diff --git a/nym-connect/src-tauri/icons/StoreLogo.png b/nym-connect/mobile/src-tauri/icons/StoreLogo.png similarity index 100% rename from nym-connect/src-tauri/icons/StoreLogo.png rename to nym-connect/mobile/src-tauri/icons/StoreLogo.png diff --git a/nym-connect/src-tauri/icons/icon.icns b/nym-connect/mobile/src-tauri/icons/icon.icns similarity index 100% rename from nym-connect/src-tauri/icons/icon.icns rename to nym-connect/mobile/src-tauri/icons/icon.icns diff --git a/nym-connect/src-tauri/icons/icon.ico b/nym-connect/mobile/src-tauri/icons/icon.ico similarity index 100% rename from nym-connect/src-tauri/icons/icon.ico rename to nym-connect/mobile/src-tauri/icons/icon.ico diff --git a/nym-connect/src-tauri/icons/icon.png b/nym-connect/mobile/src-tauri/icons/icon.png similarity index 100% rename from nym-connect/src-tauri/icons/icon.png rename to nym-connect/mobile/src-tauri/icons/icon.png diff --git a/nym-connect/src-tauri/icons/tray_icon.ico b/nym-connect/mobile/src-tauri/icons/tray_icon.ico similarity index 100% rename from nym-connect/src-tauri/icons/tray_icon.ico rename to nym-connect/mobile/src-tauri/icons/tray_icon.ico diff --git a/nym-connect/src-tauri/icons/tray_icon.png b/nym-connect/mobile/src-tauri/icons/tray_icon.png similarity index 100% rename from nym-connect/src-tauri/icons/tray_icon.png rename to nym-connect/mobile/src-tauri/icons/tray_icon.png diff --git a/nym-connect/src-tauri/src/build.rs b/nym-connect/mobile/src-tauri/src/build.rs similarity index 100% rename from nym-connect/src-tauri/src/build.rs rename to nym-connect/mobile/src-tauri/src/build.rs diff --git a/nym-connect-android/src-tauri/src/config/mod.rs b/nym-connect/mobile/src-tauri/src/config/mod.rs similarity index 100% rename from nym-connect-android/src-tauri/src/config/mod.rs rename to nym-connect/mobile/src-tauri/src/config/mod.rs diff --git a/nym-connect-android/src-tauri/src/error.rs b/nym-connect/mobile/src-tauri/src/error.rs similarity index 100% rename from nym-connect-android/src-tauri/src/error.rs rename to nym-connect/mobile/src-tauri/src/error.rs diff --git a/nym-connect/src-tauri/src/events.rs b/nym-connect/mobile/src-tauri/src/events.rs similarity index 100% rename from nym-connect/src-tauri/src/events.rs rename to nym-connect/mobile/src-tauri/src/events.rs diff --git a/nym-connect-android/src-tauri/src/lib.rs b/nym-connect/mobile/src-tauri/src/lib.rs similarity index 100% rename from nym-connect-android/src-tauri/src/lib.rs rename to nym-connect/mobile/src-tauri/src/lib.rs diff --git a/nym-connect/src-tauri/src/logging.rs b/nym-connect/mobile/src-tauri/src/logging.rs similarity index 100% rename from nym-connect/src-tauri/src/logging.rs rename to nym-connect/mobile/src-tauri/src/logging.rs diff --git a/nym-connect-android/src-tauri/src/main.rs b/nym-connect/mobile/src-tauri/src/main.rs similarity index 91% rename from nym-connect-android/src-tauri/src/main.rs rename to nym-connect/mobile/src-tauri/src/main.rs index 11ece5dfd8..a36abeaca1 100644 --- a/nym-connect-android/src-tauri/src/main.rs +++ b/nym-connect/mobile/src-tauri/src/main.rs @@ -3,7 +3,7 @@ windows_subsystem = "windows" )] -use nym_connect_android::AppBuilder; +use nym_connect::AppBuilder; fn main() { // As per breaking change description here diff --git a/nym-connect-android/src-tauri/src/menu.rs b/nym-connect/mobile/src-tauri/src/menu.rs similarity index 100% rename from nym-connect-android/src-tauri/src/menu.rs rename to nym-connect/mobile/src-tauri/src/menu.rs diff --git a/nym-connect-android/src-tauri/src/mobile.rs b/nym-connect/mobile/src-tauri/src/mobile.rs similarity index 100% rename from nym-connect-android/src-tauri/src/mobile.rs rename to nym-connect/mobile/src-tauri/src/mobile.rs diff --git a/nym-connect-android/src-tauri/src/models/mod.rs b/nym-connect/mobile/src-tauri/src/models/mod.rs similarity index 100% rename from nym-connect-android/src-tauri/src/models/mod.rs rename to nym-connect/mobile/src-tauri/src/models/mod.rs diff --git a/nym-connect/src-tauri/src/operations/connection/connect.rs b/nym-connect/mobile/src-tauri/src/operations/connection/connect.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/connection/connect.rs rename to nym-connect/mobile/src-tauri/src/operations/connection/connect.rs diff --git a/nym-connect/src-tauri/src/operations/connection/disconnect.rs b/nym-connect/mobile/src-tauri/src/operations/connection/disconnect.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/connection/disconnect.rs rename to nym-connect/mobile/src-tauri/src/operations/connection/disconnect.rs diff --git a/nym-connect/src-tauri/src/operations/connection/health_check.rs b/nym-connect/mobile/src-tauri/src/operations/connection/health_check.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/connection/health_check.rs rename to nym-connect/mobile/src-tauri/src/operations/connection/health_check.rs diff --git a/nym-connect/src-tauri/src/operations/connection/mod.rs b/nym-connect/mobile/src-tauri/src/operations/connection/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/connection/mod.rs rename to nym-connect/mobile/src-tauri/src/operations/connection/mod.rs diff --git a/nym-connect/src-tauri/src/operations/connection/status.rs b/nym-connect/mobile/src-tauri/src/operations/connection/status.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/connection/status.rs rename to nym-connect/mobile/src-tauri/src/operations/connection/status.rs diff --git a/nym-connect/src-tauri/src/operations/directory/mod.rs b/nym-connect/mobile/src-tauri/src/operations/directory/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/directory/mod.rs rename to nym-connect/mobile/src-tauri/src/operations/directory/mod.rs diff --git a/nym-connect/src-tauri/src/operations/export.rs b/nym-connect/mobile/src-tauri/src/operations/export.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/export.rs rename to nym-connect/mobile/src-tauri/src/operations/export.rs diff --git a/nym-connect-android/src-tauri/src/operations/help/log.rs b/nym-connect/mobile/src-tauri/src/operations/help/log.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/help/log.rs rename to nym-connect/mobile/src-tauri/src/operations/help/log.rs diff --git a/nym-connect/src-tauri/src/operations/help/mod.rs b/nym-connect/mobile/src-tauri/src/operations/help/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/help/mod.rs rename to nym-connect/mobile/src-tauri/src/operations/help/mod.rs diff --git a/nym-connect/src-tauri/src/operations/help/storage.rs b/nym-connect/mobile/src-tauri/src/operations/help/storage.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/help/storage.rs rename to nym-connect/mobile/src-tauri/src/operations/help/storage.rs diff --git a/nym-connect/src-tauri/src/operations/http.rs b/nym-connect/mobile/src-tauri/src/operations/http.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/http.rs rename to nym-connect/mobile/src-tauri/src/operations/http.rs diff --git a/nym-connect-android/src-tauri/src/operations/mod.rs b/nym-connect/mobile/src-tauri/src/operations/mod.rs similarity index 100% rename from nym-connect-android/src-tauri/src/operations/mod.rs rename to nym-connect/mobile/src-tauri/src/operations/mod.rs diff --git a/nym-connect/src-tauri/src/operations/window/mod.rs b/nym-connect/mobile/src-tauri/src/operations/window/mod.rs similarity index 100% rename from nym-connect/src-tauri/src/operations/window/mod.rs rename to nym-connect/mobile/src-tauri/src/operations/window/mod.rs diff --git a/nym-connect-android/src-tauri/src/state.rs b/nym-connect/mobile/src-tauri/src/state.rs similarity index 100% rename from nym-connect-android/src-tauri/src/state.rs rename to nym-connect/mobile/src-tauri/src/state.rs diff --git a/nym-connect-android/src-tauri/src/tasks.rs b/nym-connect/mobile/src-tauri/src/tasks.rs similarity index 100% rename from nym-connect-android/src-tauri/src/tasks.rs rename to nym-connect/mobile/src-tauri/src/tasks.rs diff --git a/nym-connect/src-tauri/src/window.rs b/nym-connect/mobile/src-tauri/src/window.rs similarity index 100% rename from nym-connect/src-tauri/src/window.rs rename to nym-connect/mobile/src-tauri/src/window.rs diff --git a/nym-connect-android/src-tauri/tauri.conf.json b/nym-connect/mobile/src-tauri/tauri.conf.json similarity index 97% rename from nym-connect-android/src-tauri/tauri.conf.json rename to nym-connect/mobile/src-tauri/tauri.conf.json index ee8649d537..a45666f724 100644 --- a/nym-connect-android/src-tauri/tauri.conf.json +++ b/nym-connect/mobile/src-tauri/tauri.conf.json @@ -1,6 +1,6 @@ { "package": { - "productName": "nym-connect-android", + "productName": "nym-connect", "version": "1.1.9" }, "build": { diff --git a/nym-connect/src/assets/help-step-four.png b/nym-connect/mobile/src/assets/help-step-four.png similarity index 100% rename from nym-connect/src/assets/help-step-four.png rename to nym-connect/mobile/src/assets/help-step-four.png diff --git a/nym-connect/src/assets/help-step-one-legacy.png b/nym-connect/mobile/src/assets/help-step-one-legacy.png similarity index 100% rename from nym-connect/src/assets/help-step-one-legacy.png rename to nym-connect/mobile/src/assets/help-step-one-legacy.png diff --git a/nym-connect/src/assets/help-step-one.png b/nym-connect/mobile/src/assets/help-step-one.png similarity index 100% rename from nym-connect/src/assets/help-step-one.png rename to nym-connect/mobile/src/assets/help-step-one.png diff --git a/nym-connect/src/assets/help-step-three.png b/nym-connect/mobile/src/assets/help-step-three.png similarity index 100% rename from nym-connect/src/assets/help-step-three.png rename to nym-connect/mobile/src/assets/help-step-three.png diff --git a/nym-connect/src/assets/help-step-two-legacy.png b/nym-connect/mobile/src/assets/help-step-two-legacy.png similarity index 100% rename from nym-connect/src/assets/help-step-two-legacy.png rename to nym-connect/mobile/src/assets/help-step-two-legacy.png diff --git a/nym-connect/src/assets/help-step-two.png b/nym-connect/mobile/src/assets/help-step-two.png similarity index 100% rename from nym-connect/src/assets/help-step-two.png rename to nym-connect/mobile/src/assets/help-step-two.png diff --git a/nym-connect/src/components/AppVersion.tsx b/nym-connect/mobile/src/components/AppVersion.tsx similarity index 100% rename from nym-connect/src/components/AppVersion.tsx rename to nym-connect/mobile/src/components/AppVersion.tsx diff --git a/nym-connect-android/src/components/AppWindowFrame.tsx b/nym-connect/mobile/src/components/AppWindowFrame.tsx similarity index 100% rename from nym-connect-android/src/components/AppWindowFrame.tsx rename to nym-connect/mobile/src/components/AppWindowFrame.tsx diff --git a/nym-connect/src/components/ConnectionButton.tsx b/nym-connect/mobile/src/components/ConnectionButton.tsx similarity index 100% rename from nym-connect/src/components/ConnectionButton.tsx rename to nym-connect/mobile/src/components/ConnectionButton.tsx diff --git a/nym-connect/src/components/ConnectionStats.tsx b/nym-connect/mobile/src/components/ConnectionStats.tsx similarity index 100% rename from nym-connect/src/components/ConnectionStats.tsx rename to nym-connect/mobile/src/components/ConnectionStats.tsx diff --git a/nym-connect-android/src/components/ConnectionStatus.tsx b/nym-connect/mobile/src/components/ConnectionStatus.tsx similarity index 100% rename from nym-connect-android/src/components/ConnectionStatus.tsx rename to nym-connect/mobile/src/components/ConnectionStatus.tsx diff --git a/nym-connect-android/src/components/ConntectionTimer.tsx b/nym-connect/mobile/src/components/ConntectionTimer.tsx similarity index 100% rename from nym-connect-android/src/components/ConntectionTimer.tsx rename to nym-connect/mobile/src/components/ConntectionTimer.tsx diff --git a/nym-connect/src/components/CopyToClipboard.tsx b/nym-connect/mobile/src/components/CopyToClipboard.tsx similarity index 100% rename from nym-connect/src/components/CopyToClipboard.tsx rename to nym-connect/mobile/src/components/CopyToClipboard.tsx diff --git a/nym-connect-android/src/components/CustomTitleBar.tsx b/nym-connect/mobile/src/components/CustomTitleBar.tsx similarity index 86% rename from nym-connect-android/src/components/CustomTitleBar.tsx rename to nym-connect/mobile/src/components/CustomTitleBar.tsx index 43540d743b..ae6f7f8255 100644 --- a/nym-connect-android/src/components/CustomTitleBar.tsx +++ b/nym-connect/mobile/src/components/CustomTitleBar.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { ArrowBack, Menu } from '@mui/icons-material'; import { Box, IconButton, Typography } from '@mui/material'; -import { NymWordmark } from '@nymproject/react/logo/NymWordmark'; +// TODO since the structure refactor for NC this import fails +// import { NymWordmark } from '@nymproject/react/logo/NymWordmark'; import { useNavigate } from 'react-router-dom'; const customTitleBarStyles = { @@ -46,7 +47,13 @@ const getTitleIcon = (path: string) => { ); } - return ; + + // TODO return ; + return ( + + NYM + + ); }; export const CustomTitleBar = ({ path = '/', onBack }: { path?: string; onBack?: () => void }) => ( diff --git a/nym-connect/src/components/Error.tsx b/nym-connect/mobile/src/components/Error.tsx similarity index 100% rename from nym-connect/src/components/Error.tsx rename to nym-connect/mobile/src/components/Error.tsx diff --git a/nym-connect/src/components/ErrorFallback.tsx b/nym-connect/mobile/src/components/ErrorFallback.tsx similarity index 100% rename from nym-connect/src/components/ErrorFallback.tsx rename to nym-connect/mobile/src/components/ErrorFallback.tsx diff --git a/nym-connect-android/src/components/ExperimentalWarning.tsx b/nym-connect/mobile/src/components/ExperimentalWarning.tsx similarity index 100% rename from nym-connect-android/src/components/ExperimentalWarning.tsx rename to nym-connect/mobile/src/components/ExperimentalWarning.tsx diff --git a/nym-connect/src/components/Growth/content/assets/matrix.webp b/nym-connect/mobile/src/components/Growth/content/assets/matrix.webp similarity index 100% rename from nym-connect/src/components/Growth/content/assets/matrix.webp rename to nym-connect/mobile/src/components/Growth/content/assets/matrix.webp diff --git a/nym-connect-android/src/components/HelpPage.tsx b/nym-connect/mobile/src/components/HelpPage.tsx similarity index 100% rename from nym-connect-android/src/components/HelpPage.tsx rename to nym-connect/mobile/src/components/HelpPage.tsx diff --git a/nym-connect-android/src/components/HelpPageActions.tsx b/nym-connect/mobile/src/components/HelpPageActions.tsx similarity index 100% rename from nym-connect-android/src/components/HelpPageActions.tsx rename to nym-connect/mobile/src/components/HelpPageActions.tsx diff --git a/nym-connect/src/components/HelpPageImage.tsx b/nym-connect/mobile/src/components/HelpPageImage.tsx similarity index 100% rename from nym-connect/src/components/HelpPageImage.tsx rename to nym-connect/mobile/src/components/HelpPageImage.tsx diff --git a/nym-connect-android/src/components/HelpPageStepIndicator.tsx b/nym-connect/mobile/src/components/HelpPageStepIndicator.tsx similarity index 100% rename from nym-connect-android/src/components/HelpPageStepIndicator.tsx rename to nym-connect/mobile/src/components/HelpPageStepIndicator.tsx diff --git a/nym-connect-android/src/components/InfoModal.tsx b/nym-connect/mobile/src/components/InfoModal.tsx similarity index 100% rename from nym-connect-android/src/components/InfoModal.tsx rename to nym-connect/mobile/src/components/InfoModal.tsx diff --git a/nym-connect-android/src/components/IpAddressAndPort.tsx b/nym-connect/mobile/src/components/IpAddressAndPort.tsx similarity index 100% rename from nym-connect-android/src/components/IpAddressAndPort.tsx rename to nym-connect/mobile/src/components/IpAddressAndPort.tsx diff --git a/nym-connect/src/components/IpAddressAndPortModal.tsx b/nym-connect/mobile/src/components/IpAddressAndPortModal.tsx similarity index 100% rename from nym-connect/src/components/IpAddressAndPortModal.tsx rename to nym-connect/mobile/src/components/IpAddressAndPortModal.tsx diff --git a/nym-connect/src/components/NeedHelp.tsx b/nym-connect/mobile/src/components/NeedHelp.tsx similarity index 100% rename from nym-connect/src/components/NeedHelp.tsx rename to nym-connect/mobile/src/components/NeedHelp.tsx diff --git a/nym-connect-android/src/components/PowerButton/PowerButton.tsx b/nym-connect/mobile/src/components/PowerButton/PowerButton.tsx similarity index 100% rename from nym-connect-android/src/components/PowerButton/PowerButton.tsx rename to nym-connect/mobile/src/components/PowerButton/PowerButton.tsx diff --git a/nym-connect-android/src/components/PowerButton/power-button.css b/nym-connect/mobile/src/components/PowerButton/power-button.css similarity index 100% rename from nym-connect-android/src/components/PowerButton/power-button.css rename to nym-connect/mobile/src/components/PowerButton/power-button.css diff --git a/nym-connect/src/components/ServiceProviderPopup.tsx b/nym-connect/mobile/src/components/ServiceProviderPopup.tsx similarity index 100% rename from nym-connect/src/components/ServiceProviderPopup.tsx rename to nym-connect/mobile/src/components/ServiceProviderPopup.tsx diff --git a/nym-connect/src/components/ServiceProviderSelector.stories.tsx b/nym-connect/mobile/src/components/ServiceProviderSelector.stories.tsx similarity index 100% rename from nym-connect/src/components/ServiceProviderSelector.stories.tsx rename to nym-connect/mobile/src/components/ServiceProviderSelector.stories.tsx diff --git a/nym-connect/src/components/ServiceProviderSelector.tsx b/nym-connect/mobile/src/components/ServiceProviderSelector.tsx similarity index 100% rename from nym-connect/src/components/ServiceProviderSelector.tsx rename to nym-connect/mobile/src/components/ServiceProviderSelector.tsx diff --git a/nym-connect/src/components/ServiceSelector.stories.tsx b/nym-connect/mobile/src/components/ServiceSelector.stories.tsx similarity index 100% rename from nym-connect/src/components/ServiceSelector.stories.tsx rename to nym-connect/mobile/src/components/ServiceSelector.stories.tsx diff --git a/nym-connect/src/components/ServiceSelector.tsx b/nym-connect/mobile/src/components/ServiceSelector.tsx similarity index 100% rename from nym-connect/src/components/ServiceSelector.tsx rename to nym-connect/mobile/src/components/ServiceSelector.tsx diff --git a/nym-connect-android/src/components/TooltipInfo.tsx b/nym-connect/mobile/src/components/TooltipInfo.tsx similarity index 100% rename from nym-connect-android/src/components/TooltipInfo.tsx rename to nym-connect/mobile/src/components/TooltipInfo.tsx diff --git a/nym-connect/src/config.ts b/nym-connect/mobile/src/config.ts similarity index 100% rename from nym-connect/src/config.ts rename to nym-connect/mobile/src/config.ts diff --git a/nym-connect/src/context/main.tsx b/nym-connect/mobile/src/context/main.tsx similarity index 100% rename from nym-connect/src/context/main.tsx rename to nym-connect/mobile/src/context/main.tsx diff --git a/nym-connect/src/context/mocks/main.tsx b/nym-connect/mobile/src/context/mocks/main.tsx similarity index 100% rename from nym-connect/src/context/mocks/main.tsx rename to nym-connect/mobile/src/context/mocks/main.tsx diff --git a/nym-connect/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf b/nym-connect/mobile/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf similarity index 100% rename from nym-connect/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf rename to nym-connect/mobile/src/fonts/OpenSans-Italic-VariableFont_wdth,wght.ttf diff --git a/nym-connect/src/fonts/OpenSans-VariableFont_wdth,wght.ttf b/nym-connect/mobile/src/fonts/OpenSans-VariableFont_wdth,wght.ttf similarity index 100% rename from nym-connect/src/fonts/OpenSans-VariableFont_wdth,wght.ttf rename to nym-connect/mobile/src/fonts/OpenSans-VariableFont_wdth,wght.ttf diff --git a/nym-connect/src/fonts/fonts.css b/nym-connect/mobile/src/fonts/fonts.css similarity index 100% rename from nym-connect/src/fonts/fonts.css rename to nym-connect/mobile/src/fonts/fonts.css diff --git a/nym-connect/src/hooks/events.ts b/nym-connect/mobile/src/hooks/events.ts similarity index 100% rename from nym-connect/src/hooks/events.ts rename to nym-connect/mobile/src/hooks/events.ts diff --git a/nym-connect-android/src/index.tsx b/nym-connect/mobile/src/index.tsx similarity index 100% rename from nym-connect-android/src/index.tsx rename to nym-connect/mobile/src/index.tsx diff --git a/nym-connect-android/src/layouts/ConnectionLayout.tsx b/nym-connect/mobile/src/layouts/ConnectionLayout.tsx similarity index 100% rename from nym-connect-android/src/layouts/ConnectionLayout.tsx rename to nym-connect/mobile/src/layouts/ConnectionLayout.tsx diff --git a/nym-connect-android/src/pages/connection/Connected.tsx b/nym-connect/mobile/src/pages/connection/Connected.tsx similarity index 100% rename from nym-connect-android/src/pages/connection/Connected.tsx rename to nym-connect/mobile/src/pages/connection/Connected.tsx diff --git a/nym-connect-android/src/pages/connection/Disconnected.tsx b/nym-connect/mobile/src/pages/connection/Disconnected.tsx similarity index 100% rename from nym-connect-android/src/pages/connection/Disconnected.tsx rename to nym-connect/mobile/src/pages/connection/Disconnected.tsx diff --git a/nym-connect-android/src/pages/connection/index.tsx b/nym-connect/mobile/src/pages/connection/index.tsx similarity index 100% rename from nym-connect-android/src/pages/connection/index.tsx rename to nym-connect/mobile/src/pages/connection/index.tsx diff --git a/nym-connect-android/src/pages/menu/Apps.tsx b/nym-connect/mobile/src/pages/menu/Apps.tsx similarity index 100% rename from nym-connect-android/src/pages/menu/Apps.tsx rename to nym-connect/mobile/src/pages/menu/Apps.tsx diff --git a/nym-connect/src/pages/menu/Guide.tsx b/nym-connect/mobile/src/pages/menu/Guide.tsx similarity index 100% rename from nym-connect/src/pages/menu/Guide.tsx rename to nym-connect/mobile/src/pages/menu/Guide.tsx diff --git a/nym-connect-android/src/pages/menu/Settings.tsx b/nym-connect/mobile/src/pages/menu/Settings.tsx similarity index 100% rename from nym-connect-android/src/pages/menu/Settings.tsx rename to nym-connect/mobile/src/pages/menu/Settings.tsx diff --git a/nym-connect-android/src/pages/menu/index.tsx b/nym-connect/mobile/src/pages/menu/index.tsx similarity index 100% rename from nym-connect-android/src/pages/menu/index.tsx rename to nym-connect/mobile/src/pages/menu/index.tsx diff --git a/nym-connect-android/src/routes/index.tsx b/nym-connect/mobile/src/routes/index.tsx similarity index 100% rename from nym-connect-android/src/routes/index.tsx rename to nym-connect/mobile/src/routes/index.tsx diff --git a/nym-connect/src/stories/AppFlow.stories.tsx b/nym-connect/mobile/src/stories/AppFlow.stories.tsx similarity index 100% rename from nym-connect/src/stories/AppFlow.stories.tsx rename to nym-connect/mobile/src/stories/AppFlow.stories.tsx diff --git a/nym-connect/src/stories/AppWindowFrame.stories.tsx b/nym-connect/mobile/src/stories/AppWindowFrame.stories.tsx similarity index 100% rename from nym-connect/src/stories/AppWindowFrame.stories.tsx rename to nym-connect/mobile/src/stories/AppWindowFrame.stories.tsx diff --git a/nym-connect/src/stories/ConnectedLayout.stories.tsx b/nym-connect/mobile/src/stories/ConnectedLayout.stories.tsx similarity index 100% rename from nym-connect/src/stories/ConnectedLayout.stories.tsx rename to nym-connect/mobile/src/stories/ConnectedLayout.stories.tsx diff --git a/nym-connect/src/stories/ConnectionButton.stories.tsx b/nym-connect/mobile/src/stories/ConnectionButton.stories.tsx similarity index 100% rename from nym-connect/src/stories/ConnectionButton.stories.tsx rename to nym-connect/mobile/src/stories/ConnectionButton.stories.tsx diff --git a/nym-connect/src/stories/ConnectionStats.stories.tsx b/nym-connect/mobile/src/stories/ConnectionStats.stories.tsx similarity index 100% rename from nym-connect/src/stories/ConnectionStats.stories.tsx rename to nym-connect/mobile/src/stories/ConnectionStats.stories.tsx diff --git a/nym-connect/src/stories/ConnectionStatus.stories.tsx b/nym-connect/mobile/src/stories/ConnectionStatus.stories.tsx similarity index 100% rename from nym-connect/src/stories/ConnectionStatus.stories.tsx rename to nym-connect/mobile/src/stories/ConnectionStatus.stories.tsx diff --git a/nym-connect/src/stories/DefaultLayout.stories.tsx b/nym-connect/mobile/src/stories/DefaultLayout.stories.tsx similarity index 100% rename from nym-connect/src/stories/DefaultLayout.stories.tsx rename to nym-connect/mobile/src/stories/DefaultLayout.stories.tsx diff --git a/nym-connect/src/stories/Introduction.stories.mdx b/nym-connect/mobile/src/stories/Introduction.stories.mdx similarity index 100% rename from nym-connect/src/stories/Introduction.stories.mdx rename to nym-connect/mobile/src/stories/Introduction.stories.mdx diff --git a/nym-connect/src/stories/IpAddressAndPort.stories.tsx b/nym-connect/mobile/src/stories/IpAddressAndPort.stories.tsx similarity index 100% rename from nym-connect/src/stories/IpAddressAndPort.stories.tsx rename to nym-connect/mobile/src/stories/IpAddressAndPort.stories.tsx diff --git a/nym-connect/src/stories/PowerButton.stories.tsx b/nym-connect/mobile/src/stories/PowerButton.stories.tsx similarity index 100% rename from nym-connect/src/stories/PowerButton.stories.tsx rename to nym-connect/mobile/src/stories/PowerButton.stories.tsx diff --git a/nym-connect/src/theme/index.tsx b/nym-connect/mobile/src/theme/index.tsx similarity index 94% rename from nym-connect/src/theme/index.tsx rename to nym-connect/mobile/src/theme/index.tsx index ad2350053d..d307fe46ee 100644 --- a/nym-connect/src/theme/index.tsx +++ b/nym-connect/mobile/src/theme/index.tsx @@ -3,7 +3,7 @@ import { createTheme, ThemeProvider } from '@mui/material/styles'; import { CssBaseline } from '@mui/material'; import { getDesignTokens } from './theme'; // eslint-disable-next-line import/no-relative-packages -import '../../../assets/fonts/non-variable/fonts.css'; +import '../../../../assets/fonts/non-variable/fonts.css'; /** * Provides the theme for Nym Connect by reacting to the light/dark mode choice stored in the app context. diff --git a/nym-connect/src/theme/mui-theme.d.ts b/nym-connect/mobile/src/theme/mui-theme.d.ts similarity index 100% rename from nym-connect/src/theme/mui-theme.d.ts rename to nym-connect/mobile/src/theme/mui-theme.d.ts diff --git a/nym-connect-android/src/theme/theme.tsx b/nym-connect/mobile/src/theme/theme.tsx similarity index 100% rename from nym-connect-android/src/theme/theme.tsx rename to nym-connect/mobile/src/theme/theme.tsx diff --git a/nym-connect/src/types/connection.ts b/nym-connect/mobile/src/types/connection.ts similarity index 100% rename from nym-connect/src/types/connection.ts rename to nym-connect/mobile/src/types/connection.ts diff --git a/nym-connect/src/types/directory.ts b/nym-connect/mobile/src/types/directory.ts similarity index 100% rename from nym-connect/src/types/directory.ts rename to nym-connect/mobile/src/types/directory.ts diff --git a/nym-connect/src/types/error.ts b/nym-connect/mobile/src/types/error.ts similarity index 100% rename from nym-connect/src/types/error.ts rename to nym-connect/mobile/src/types/error.ts diff --git a/nym-connect/src/types/event.ts b/nym-connect/mobile/src/types/event.ts similarity index 100% rename from nym-connect/src/types/event.ts rename to nym-connect/mobile/src/types/event.ts diff --git a/nym-connect/src/types/gateway.ts b/nym-connect/mobile/src/types/gateway.ts similarity index 100% rename from nym-connect/src/types/gateway.ts rename to nym-connect/mobile/src/types/gateway.ts diff --git a/nym-connect/src/types/index.ts b/nym-connect/mobile/src/types/index.ts similarity index 100% rename from nym-connect/src/types/index.ts rename to nym-connect/mobile/src/types/index.ts diff --git a/nym-connect/src/types/rust/index.ts b/nym-connect/mobile/src/types/rust/index.ts similarity index 100% rename from nym-connect/src/types/rust/index.ts rename to nym-connect/mobile/src/types/rust/index.ts diff --git a/nym-connect/src/types/rust/stateparams.ts b/nym-connect/mobile/src/types/rust/stateparams.ts similarity index 100% rename from nym-connect/src/types/rust/stateparams.ts rename to nym-connect/mobile/src/types/rust/stateparams.ts diff --git a/nym-connect/src/typings/FC.d.ts b/nym-connect/mobile/src/typings/FC.d.ts similarity index 100% rename from nym-connect/src/typings/FC.d.ts rename to nym-connect/mobile/src/typings/FC.d.ts diff --git a/nym-connect/src/typings/jpeg.d.ts b/nym-connect/mobile/src/typings/jpeg.d.ts similarity index 100% rename from nym-connect/src/typings/jpeg.d.ts rename to nym-connect/mobile/src/typings/jpeg.d.ts diff --git a/nym-connect/src/typings/json.d.ts b/nym-connect/mobile/src/typings/json.d.ts similarity index 100% rename from nym-connect/src/typings/json.d.ts rename to nym-connect/mobile/src/typings/json.d.ts diff --git a/nym-connect/src/typings/png.d.ts b/nym-connect/mobile/src/typings/png.d.ts similarity index 100% rename from nym-connect/src/typings/png.d.ts rename to nym-connect/mobile/src/typings/png.d.ts diff --git a/nym-connect/src/typings/svg.d.ts b/nym-connect/mobile/src/typings/svg.d.ts similarity index 100% rename from nym-connect/src/typings/svg.d.ts rename to nym-connect/mobile/src/typings/svg.d.ts diff --git a/nym-connect/src/typings/webp.d.ts b/nym-connect/mobile/src/typings/webp.d.ts similarity index 100% rename from nym-connect/src/typings/webp.d.ts rename to nym-connect/mobile/src/typings/webp.d.ts diff --git a/nym-connect/src/typings/yaml.d.ts b/nym-connect/mobile/src/typings/yaml.d.ts similarity index 100% rename from nym-connect/src/typings/yaml.d.ts rename to nym-connect/mobile/src/typings/yaml.d.ts diff --git a/nym-connect-android/src/utils/index.ts b/nym-connect/mobile/src/utils/index.ts similarity index 100% rename from nym-connect-android/src/utils/index.ts rename to nym-connect/mobile/src/utils/index.ts diff --git a/nym-connect/tsconfig.eslint.json b/nym-connect/mobile/tsconfig.eslint.json similarity index 100% rename from nym-connect/tsconfig.eslint.json rename to nym-connect/mobile/tsconfig.eslint.json diff --git a/nym-connect-android/tsconfig.json b/nym-connect/mobile/tsconfig.json similarity index 100% rename from nym-connect-android/tsconfig.json rename to nym-connect/mobile/tsconfig.json diff --git a/nym-connect-android/webpack.common.js b/nym-connect/mobile/webpack.common.js similarity index 100% rename from nym-connect-android/webpack.common.js rename to nym-connect/mobile/webpack.common.js diff --git a/nym-connect-android/webpack.dev.js b/nym-connect/mobile/webpack.dev.js similarity index 100% rename from nym-connect-android/webpack.dev.js rename to nym-connect/mobile/webpack.dev.js diff --git a/nym-connect-android/webpack.prod.js b/nym-connect/mobile/webpack.prod.js similarity index 100% rename from nym-connect-android/webpack.prod.js rename to nym-connect/mobile/webpack.prod.js diff --git a/package.json b/package.json index 5074398a8b..3bd1e0c24d 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "sdk/typescript/packages/**", "ts-packages/*", "nym-wallet", - "nym-connect", - "nym-connect-android", + "nym-connect/**", "explorer", "types", "clients/validator" From 8c50492d432fd499f259b0e2960d2c64bf399db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 22 Feb 2023 18:49:56 +0100 Subject: [PATCH 469/591] Update cargo metadata for mixnet and vesting contracts (#3090) --- .../contracts-common/Cargo.toml | 9 +- .../mixnet-contract/Cargo.toml | 11 +- .../vesting-contract/Cargo.toml | 10 +- contracts/Cargo.toml | 8 + contracts/mixnet/.cargo-ok | 0 contracts/mixnet/.circleci/config.yml | 49 - contracts/mixnet/.editorconfig | 11 - contracts/mixnet/.gitignore | 1 - contracts/mixnet/Cargo.toml | 13 +- contracts/mixnet/examples/schema.rs | 4 +- contracts/mixnet/schema/execute_msg.json | 1155 +++++++++++++---- contracts/mixnet/schema/instantiate_msg.json | 100 +- contracts/mixnet/schema/migrate_msg.json | 13 + contracts/mixnet/schema/mix_node_bond.json | 137 -- contracts/mixnet/schema/query_msg.json | 1032 ++++++++++----- contracts/vesting/Cargo.toml | 15 +- 16 files changed, 1768 insertions(+), 800 deletions(-) delete mode 100644 contracts/mixnet/.cargo-ok delete mode 100644 contracts/mixnet/.circleci/config.yml delete mode 100644 contracts/mixnet/.editorconfig delete mode 100644 contracts/mixnet/.gitignore create mode 100644 contracts/mixnet/schema/migrate_msg.json delete mode 100644 contracts/mixnet/schema/mix_node_bond.json diff --git a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml index 59042f9a48..b0b93d70e8 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml +++ b/common/cosmwasm-smart-contracts/contracts-common/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "nym-contracts-common" version = "0.1.0" -authors = ["Jędrzej Stuczyński "] -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +description = "Common library for Nym cosmwasm contracts" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } [dependencies] bs58 = "0.4.0" diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml b/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml index 1349a079ab..fec9864943 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml +++ b/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml @@ -1,11 +1,12 @@ [package] name = "nym-mixnet-contract-common" version = "0.1.0" -authors = ["Jędrzej Stuczyński "] -edition = "2021" +description = "Common library for the Nym mixnet contract" rust-version = "1.62" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } [dependencies] bs58 = "0.4.0" @@ -14,7 +15,7 @@ serde = { version = "1.0", features = ["derive"] } serde_repr = "0.1" schemars = "0.8" thiserror = "1.0" -contracts-common = { path = "../contracts-common", package = "nym-contracts-common" } +contracts-common = { path = "../contracts-common", package = "nym-contracts-common", version = "0.1.0" } serde_json = "1.0.0" humantime-serde = "1.1.1" diff --git a/common/cosmwasm-smart-contracts/vesting-contract/Cargo.toml b/common/cosmwasm-smart-contracts/vesting-contract/Cargo.toml index 2bcde9979d..8e0d24b9df 100644 --- a/common/cosmwasm-smart-contracts/vesting-contract/Cargo.toml +++ b/common/cosmwasm-smart-contracts/vesting-contract/Cargo.toml @@ -1,12 +1,16 @@ [package] name = "nym-vesting-contract-common" version = "0.1.0" -edition = "2021" +description = "Common library for the Nym vesting contract" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } [dependencies] cosmwasm-std = "1.0.0" -mixnet-contract-common = { path = "../mixnet-contract", package = "nym-mixnet-contract-common" } -contracts-common = { path = "../contracts-common", package = "nym-contracts-common" } +mixnet-contract-common = { path = "../mixnet-contract", package = "nym-mixnet-contract-common", version = "0.1.0" } +contracts-common = { path = "../contracts-common", package = "nym-contracts-common", version = "0.1.0" } serde = { version = "1.0", features = ["derive"] } schemars = "0.8" ts-rs = {version = "6.1.2", optional = true} diff --git a/contracts/Cargo.toml b/contracts/Cargo.toml index 167c929eb1..38c8c24f84 100644 --- a/contracts/Cargo.toml +++ b/contracts/Cargo.toml @@ -9,6 +9,14 @@ members = [ "coconut-dkg" ] +[workspace.package] +authors = ["Nym Technologies SA"] +repository = "https://github.com/nymtech/nym" +homepage = "https://nymtech.net" +documentation = "https://nymtech.net" +edition = "2021" +license = "Apache-2.0" + [profile.release] opt-level = 3 debug = false diff --git a/contracts/mixnet/.cargo-ok b/contracts/mixnet/.cargo-ok deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/contracts/mixnet/.circleci/config.yml b/contracts/mixnet/.circleci/config.yml deleted file mode 100644 index a130fc72c9..0000000000 --- a/contracts/mixnet/.circleci/config.yml +++ /dev/null @@ -1,49 +0,0 @@ -version: 2.1 - -jobs: - build: - docker: - - image: rust:1.44.1 - steps: - - checkout - - run: - name: Version information - command: rustc --version; cargo --version; rustup --version - - restore_cache: - keys: - - v4-cargo-cache-{{ arch }}-{{ checksum "Cargo.lock" }} - - run: - name: Add wasm32 target - command: rustup target add wasm32-unknown-unknown - - run: - name: Unit tests - env: RUST_BACKTRACE=1 - command: cargo unit-test --locked - - run: - name: Build - command: cargo wasm --locked - - run: - name: Format source code - command: cargo fmt - - run: - name: Build and run schema generator - command: cargo schema --locked - - run: - name: Ensure checked-in source code and schemas are up-to-date - command: | - CHANGES_IN_REPO=$(git status --porcelain) - if [[ -n "$CHANGES_IN_REPO" ]]; then - echo "Repository is dirty. Showing 'git status' and 'git --no-pager diff' for debugging now:" - git status && git --no-pager diff - exit 1 - fi - - save_cache: - paths: - - /usr/local/cargo/registry - - target/debug/.fingerprint - - target/debug/build - - target/debug/deps - - target/wasm32-unknown-unknown/release/.fingerprint - - target/wasm32-unknown-unknown/release/build - - target/wasm32-unknown-unknown/release/deps - key: v4-cargo-cache-{{ arch }}-{{ checksum "Cargo.lock" }} diff --git a/contracts/mixnet/.editorconfig b/contracts/mixnet/.editorconfig deleted file mode 100644 index 3d36f20b19..0000000000 --- a/contracts/mixnet/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.rs] -indent_size = 4 diff --git a/contracts/mixnet/.gitignore b/contracts/mixnet/.gitignore deleted file mode 100644 index 1761c01d05..0000000000 --- a/contracts/mixnet/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.envrc \ No newline at end of file diff --git a/contracts/mixnet/Cargo.toml b/contracts/mixnet/Cargo.toml index 931ba18e9b..7e364c873f 100644 --- a/contracts/mixnet/Cargo.toml +++ b/contracts/mixnet/Cargo.toml @@ -1,13 +1,18 @@ [package] name = "nym-mixnet-contract" version = "1.1.2" -authors = ["Dave Hrycyszyn "] -edition = "2021" +description = "Nym mixnet contract" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = "README.md" exclude = [ # Those files are rust-optimizer artifacts. You might want to commit them for convenience but they should not be part of the source code publication. "contract.wasm", "hash.txt", + "artifacts", ] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -17,8 +22,8 @@ name = "mixnet_contract" crate-type = ["cdylib", "rlib"] [dependencies] -mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract", package = "nym-mixnet-contract-common" } -vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract", package = "nym-vesting-contract-common" } +mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract", package = "nym-mixnet-contract-common", version = "0.1.0" } +vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract", package = "nym-vesting-contract-common", version = "0.1.0" } #config = { path = "../../common/config"} cosmwasm-std = "1.0.0" diff --git a/contracts/mixnet/examples/schema.rs b/contracts/mixnet/examples/schema.rs index 0571f23914..46e555aff3 100644 --- a/contracts/mixnet/examples/schema.rs +++ b/contracts/mixnet/examples/schema.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; -use mixnet_contract_common::{ExecuteMsg, InstantiateMsg, MixNodeBond, QueryMsg}; +use mixnet_contract_common::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; use std::env::current_dir; use std::fs::create_dir_all; @@ -15,5 +15,5 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema(&schema_for!(ExecuteMsg), &out_dir); export_schema(&schema_for!(QueryMsg), &out_dir); - export_schema(&schema_for!(MixNodeBond), &out_dir); + export_schema(&schema_for!(MigrateMsg), &out_dir); } diff --git a/contracts/mixnet/schema/execute_msg.json b/contracts/mixnet/schema/execute_msg.json index 377975435f..b50d74a447 100644 --- a/contracts/mixnet/schema/execute_msg.json +++ b/contracts/mixnet/schema/execute_msg.json @@ -5,41 +5,23 @@ { "type": "object", "required": [ - "reconcile_delegations" + "assign_node_layer" ], "properties": { - "reconcile_delegations": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "checkpoint_mixnodes" - ], - "properties": { - "checkpoint_mixnodes": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "compound_operator_reward_on_behalf" - ], - "properties": { - "compound_operator_reward_on_behalf": { + "assign_node_layer": { "type": "object", "required": [ - "owner" + "layer", + "mix_id" ], "properties": { - "owner": { - "type": "string" + "layer": { + "$ref": "#/definitions/Layer" + }, + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 } } } @@ -47,22 +29,48 @@ "additionalProperties": false }, { + "description": "Only owner of the node can crate the family with node as head", "type": "object", "required": [ - "compound_delegator_reward_on_behalf" + "create_family" ], "properties": { - "compound_delegator_reward_on_behalf": { + "create_family": { "type": "object", "required": [ - "mix_identity", - "owner" + "label", + "owner_signature" ], "properties": { - "mix_identity": { + "label": { "type": "string" }, - "owner": { + "owner_signature": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Family head needs to sign the joining node IdentityKey", + "type": "object", + "required": [ + "join_family" + ], + "properties": { + "join_family": { + "type": "object", + "required": [ + "family_head", + "signature" + ], + "properties": { + "family_head": { + "type": "string" + }, + "signature": { "type": "string" } } @@ -73,11 +81,23 @@ { "type": "object", "required": [ - "compound_operator_reward" + "leave_family" ], "properties": { - "compound_operator_reward": { - "type": "object" + "leave_family": { + "type": "object", + "required": [ + "family_head", + "signature" + ], + "properties": { + "family_head": { + "type": "string" + }, + "signature": { + "type": "string" + } + } } }, "additionalProperties": false @@ -85,17 +105,307 @@ { "type": "object", "required": [ - "compound_delegator_reward" + "kick_family_member" ], "properties": { - "compound_delegator_reward": { + "kick_family_member": { "type": "object", "required": [ - "mix_identity" + "member", + "signature" ], "properties": { - "mix_identity": { + "member": { "type": "string" + }, + "signature": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "create_family_on_behalf" + ], + "properties": { + "create_family_on_behalf": { + "type": "object", + "required": [ + "label", + "owner_address", + "owner_signature" + ], + "properties": { + "label": { + "type": "string" + }, + "owner_address": { + "type": "string" + }, + "owner_signature": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Family head needs to sign the joining node IdentityKey", + "type": "object", + "required": [ + "join_family_on_behalf" + ], + "properties": { + "join_family_on_behalf": { + "type": "object", + "required": [ + "family_head", + "member_address", + "signature" + ], + "properties": { + "family_head": { + "type": "string" + }, + "member_address": { + "type": "string" + }, + "signature": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "leave_family_on_behalf" + ], + "properties": { + "leave_family_on_behalf": { + "type": "object", + "required": [ + "family_head", + "member_address", + "signature" + ], + "properties": { + "family_head": { + "type": "string" + }, + "member_address": { + "type": "string" + }, + "signature": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "kick_family_member_on_behalf" + ], + "properties": { + "kick_family_member_on_behalf": { + "type": "object", + "required": [ + "head_address", + "member", + "signature" + ], + "properties": { + "head_address": { + "type": "string" + }, + "member": { + "type": "string" + }, + "signature": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_rewarding_validator_address" + ], + "properties": { + "update_rewarding_validator_address": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_contract_state_params" + ], + "properties": { + "update_contract_state_params": { + "type": "object", + "required": [ + "updated_parameters" + ], + "properties": { + "updated_parameters": { + "$ref": "#/definitions/ContractStateParams" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_active_set_size" + ], + "properties": { + "update_active_set_size": { + "type": "object", + "required": [ + "active_set_size", + "force_immediately" + ], + "properties": { + "active_set_size": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "force_immediately": { + "type": "boolean" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_rewarding_params" + ], + "properties": { + "update_rewarding_params": { + "type": "object", + "required": [ + "force_immediately", + "updated_params" + ], + "properties": { + "force_immediately": { + "type": "boolean" + }, + "updated_params": { + "$ref": "#/definitions/IntervalRewardingParamsUpdate" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_interval_config" + ], + "properties": { + "update_interval_config": { + "type": "object", + "required": [ + "epoch_duration_secs", + "epochs_in_interval", + "force_immediately" + ], + "properties": { + "epoch_duration_secs": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "epochs_in_interval": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "force_immediately": { + "type": "boolean" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "advance_current_epoch" + ], + "properties": { + "advance_current_epoch": { + "type": "object", + "required": [ + "expected_active_set_size", + "new_rewarded_set" + ], + "properties": { + "expected_active_set_size": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "new_rewarded_set": { + "type": "array", + "items": { + "$ref": "#/definitions/LayerAssignment" + } + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reconcile_epoch_events" + ], + "properties": { + "reconcile_epoch_events": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 } } } @@ -111,10 +421,14 @@ "bond_mixnode": { "type": "object", "required": [ + "cost_params", "mix_node", "owner_signature" ], "properties": { + "cost_params": { + "$ref": "#/definitions/MixNodeCostParams" + }, "mix_node": { "$ref": "#/definitions/MixNode" }, @@ -126,6 +440,70 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "bond_mixnode_on_behalf" + ], + "properties": { + "bond_mixnode_on_behalf": { + "type": "object", + "required": [ + "cost_params", + "mix_node", + "owner", + "owner_signature" + ], + "properties": { + "cost_params": { + "$ref": "#/definitions/MixNodeCostParams" + }, + "mix_node": { + "$ref": "#/definitions/MixNode" + }, + "owner": { + "type": "string" + }, + "owner_signature": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "pledge_more" + ], + "properties": { + "pledge_more": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "pledge_more_on_behalf" + ], + "properties": { + "pledge_more_on_behalf": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ @@ -138,6 +516,70 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "unbond_mixnode_on_behalf" + ], + "properties": { + "unbond_mixnode_on_behalf": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_mixnode_cost_params" + ], + "properties": { + "update_mixnode_cost_params": { + "type": "object", + "required": [ + "new_costs" + ], + "properties": { + "new_costs": { + "$ref": "#/definitions/MixNodeCostParams" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_mixnode_cost_params_on_behalf" + ], + "properties": { + "update_mixnode_cost_params_on_behalf": { + "type": "object", + "required": [ + "new_costs", + "owner" + ], + "properties": { + "new_costs": { + "$ref": "#/definitions/MixNodeCostParams" + }, + "owner": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ @@ -147,13 +589,11 @@ "update_mixnode_config": { "type": "object", "required": [ - "profit_margin_percent" + "new_config" ], "properties": { - "profit_margin_percent": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 + "new_config": { + "$ref": "#/definitions/MixNodeConfigUpdate" } } } @@ -169,17 +609,15 @@ "update_mixnode_config_on_behalf": { "type": "object", "required": [ - "owner", - "profit_margin_percent" + "new_config", + "owner" ], "properties": { + "new_config": { + "$ref": "#/definitions/MixNodeConfigUpdate" + }, "owner": { "type": "string" - }, - "profit_margin_percent": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 } } } @@ -210,190 +648,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "unbond_gateway" - ], - "properties": { - "unbond_gateway": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_contract_state_params" - ], - "properties": { - "update_contract_state_params": { - "$ref": "#/definitions/ContractStateParams" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "delegate_to_mixnode" - ], - "properties": { - "delegate_to_mixnode": { - "type": "object", - "required": [ - "mix_identity" - ], - "properties": { - "mix_identity": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "undelegate_from_mixnode" - ], - "properties": { - "undelegate_from_mixnode": { - "type": "object", - "required": [ - "mix_identity" - ], - "properties": { - "mix_identity": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "reward_mixnode" - ], - "properties": { - "reward_mixnode": { - "type": "object", - "required": [ - "identity", - "params" - ], - "properties": { - "identity": { - "type": "string" - }, - "params": { - "$ref": "#/definitions/NodeRewardParams" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "delegate_to_mixnode_on_behalf" - ], - "properties": { - "delegate_to_mixnode_on_behalf": { - "type": "object", - "required": [ - "delegate", - "mix_identity" - ], - "properties": { - "delegate": { - "type": "string" - }, - "mix_identity": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "undelegate_from_mixnode_on_behalf" - ], - "properties": { - "undelegate_from_mixnode_on_behalf": { - "type": "object", - "required": [ - "delegate", - "mix_identity" - ], - "properties": { - "delegate": { - "type": "string" - }, - "mix_identity": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "bond_mixnode_on_behalf" - ], - "properties": { - "bond_mixnode_on_behalf": { - "type": "object", - "required": [ - "mix_node", - "owner", - "owner_signature" - ], - "properties": { - "mix_node": { - "$ref": "#/definitions/MixNode" - }, - "owner": { - "type": "string" - }, - "owner_signature": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "unbond_mixnode_on_behalf" - ], - "properties": { - "unbond_mixnode_on_behalf": { - "type": "object", - "required": [ - "owner" - ], - "properties": { - "owner": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ @@ -422,6 +676,18 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "unbond_gateway" + ], + "properties": { + "unbond_gateway": { + "type": "object" + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ @@ -445,26 +711,19 @@ { "type": "object", "required": [ - "write_rewarded_set" + "delegate_to_mixnode" ], "properties": { - "write_rewarded_set": { + "delegate_to_mixnode": { "type": "object", "required": [ - "expected_active_set_size", - "rewarded_set" + "mix_id" ], "properties": { - "expected_active_set_size": { + "mix_id": { "type": "integer", "format": "uint32", "minimum": 0.0 - }, - "rewarded_set": { - "type": "array", - "items": { - "type": "string" - } } } } @@ -474,44 +733,240 @@ { "type": "object", "required": [ - "advance_current_epoch" + "delegate_to_mixnode_on_behalf" ], "properties": { - "advance_current_epoch": { + "delegate_to_mixnode_on_behalf": { + "type": "object", + "required": [ + "delegate", + "mix_id" + ], + "properties": { + "delegate": { + "type": "string" + }, + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "undelegate_from_mixnode" + ], + "properties": { + "undelegate_from_mixnode": { + "type": "object", + "required": [ + "mix_id" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "undelegate_from_mixnode_on_behalf" + ], + "properties": { + "undelegate_from_mixnode_on_behalf": { + "type": "object", + "required": [ + "delegate", + "mix_id" + ], + "properties": { + "delegate": { + "type": "string" + }, + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "reward_mixnode" + ], + "properties": { + "reward_mixnode": { + "type": "object", + "required": [ + "mix_id", + "performance" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "performance": { + "$ref": "#/definitions/Percent" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "withdraw_operator_reward" + ], + "properties": { + "withdraw_operator_reward": { "type": "object" } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "withdraw_operator_reward_on_behalf" + ], + "properties": { + "withdraw_operator_reward_on_behalf": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "owner": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "withdraw_delegator_reward" + ], + "properties": { + "withdraw_delegator_reward": { + "type": "object", + "required": [ + "mix_id" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "withdraw_delegator_reward_on_behalf" + ], + "properties": { + "withdraw_delegator_reward_on_behalf": { + "type": "object", + "required": [ + "mix_id", + "owner" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "owner": { + "type": "string" + } + } + } + }, + "additionalProperties": false } ], "definitions": { + "Coin": { + "type": "object", + "required": [ + "amount", + "denom" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + } + } + }, "ContractStateParams": { "type": "object", "required": [ "minimum_gateway_pledge", - "minimum_mixnode_pledge", - "mixnode_active_set_size", - "mixnode_rewarded_set_size" + "minimum_mixnode_pledge" ], "properties": { "minimum_gateway_pledge": { - "$ref": "#/definitions/Uint128" + "description": "Minimum amount a gateway must pledge to get into the system.", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "minimum_mixnode_delegation": { + "description": "Minimum amount a delegator must stake in orders for his delegation to get accepted.", + "anyOf": [ + { + "$ref": "#/definitions/Coin" + }, + { + "type": "null" + } + ] }, "minimum_mixnode_pledge": { - "$ref": "#/definitions/Uint128" - }, - "mixnode_active_set_size": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "mixnode_rewarded_set_size": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 + "description": "Minimum amount a mixnode must pledge to get into the system.", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] } } }, + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, "Gateway": { "type": "object", "required": [ @@ -552,6 +1007,104 @@ } } }, + "IntervalRewardingParamsUpdate": { + "type": "object", + "properties": { + "active_set_work_factor": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "interval_pool_emission": { + "anyOf": [ + { + "$ref": "#/definitions/Percent" + }, + { + "type": "null" + } + ] + }, + "reward_pool": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "rewarded_set_size": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "staking_supply": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "staking_supply_scale_factor": { + "anyOf": [ + { + "$ref": "#/definitions/Percent" + }, + { + "type": "null" + } + ] + }, + "sybil_resistance_percent": { + "anyOf": [ + { + "$ref": "#/definitions/Percent" + }, + { + "type": "null" + } + ] + } + } + }, + "Layer": { + "type": "string", + "enum": [ + "One", + "Two", + "Three" + ] + }, + "LayerAssignment": { + "type": "object", + "required": [ + "layer", + "mix_id" + ], + "properties": { + "layer": { + "$ref": "#/definitions/Layer" + }, + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + }, "MixNode": { "type": "object", "required": [ @@ -559,13 +1112,13 @@ "http_api_port", "identity_key", "mix_port", - "profit_margin_percent", "sphinx_key", "verloc_port", "version" ], "properties": { "host": { + "description": "Network address of this mixnode, for example 1.1.1.1:1234 or foo.mixnode.com", "type": "string" }, "http_api_port": { @@ -574,7 +1127,7 @@ "minimum": 0.0 }, "identity_key": { - "description": "Base58 encoded ed25519 EdDSA public key.", + "description": "Base58-encoded ed25519 EdDSA public key.", "type": "string" }, "mix_port": { @@ -582,12 +1135,8 @@ "format": "uint16", "minimum": 0.0 }, - "profit_margin_percent": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, "sphinx_key": { + "description": "Base58-encoded x25519 public key used for sphinx key derivation.", "type": "string" }, "verloc_port": { @@ -600,27 +1149,67 @@ } } }, - "NodeRewardParams": { + "MixNodeConfigUpdate": { "type": "object", "required": [ - "in_active_set", - "reward_blockstamp", - "uptime" + "host", + "http_api_port", + "mix_port", + "verloc_port", + "version" ], "properties": { - "in_active_set": { - "type": "boolean" + "host": { + "type": "string" }, - "reward_blockstamp": { + "http_api_port": { "type": "integer", - "format": "uint64", + "format": "uint16", "minimum": 0.0 }, - "uptime": { - "$ref": "#/definitions/Uint128" + "mix_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "verloc_port": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "version": { + "type": "string" } } }, + "MixNodeCostParams": { + "type": "object", + "required": [ + "interval_operating_cost", + "profit_margin_percent" + ], + "properties": { + "interval_operating_cost": { + "description": "Operating cost of the associated mixnode per the entire interval.", + "allOf": [ + { + "$ref": "#/definitions/Coin" + } + ] + }, + "profit_margin_percent": { + "$ref": "#/definitions/Percent" + } + } + }, + "Percent": { + "description": "Percent represents a value between 0 and 100% (i.e. between 0.0 and 1.0)", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, "Uint128": { "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", "type": "string" diff --git a/contracts/mixnet/schema/instantiate_msg.json b/contracts/mixnet/schema/instantiate_msg.json index 3aa0e29b6d..6d7c0ea33a 100644 --- a/contracts/mixnet/schema/instantiate_msg.json +++ b/contracts/mixnet/schema/instantiate_msg.json @@ -3,11 +3,109 @@ "title": "InstantiateMsg", "type": "object", "required": [ - "rewarding_validator_address" + "epoch_duration", + "epochs_in_interval", + "initial_rewarding_params", + "rewarding_denom", + "rewarding_validator_address", + "vesting_contract_address" ], "properties": { + "epoch_duration": { + "$ref": "#/definitions/Duration" + }, + "epochs_in_interval": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "initial_rewarding_params": { + "$ref": "#/definitions/InitialRewardingParams" + }, + "rewarding_denom": { + "type": "string" + }, "rewarding_validator_address": { "type": "string" + }, + "vesting_contract_address": { + "type": "string" + } + }, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "Duration": { + "type": "object", + "required": [ + "nanos", + "secs" + ], + "properties": { + "nanos": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "secs": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + }, + "InitialRewardingParams": { + "type": "object", + "required": [ + "active_set_size", + "active_set_work_factor", + "initial_reward_pool", + "initial_staking_supply", + "interval_pool_emission", + "rewarded_set_size", + "staking_supply_scale_factor", + "sybil_resistance" + ], + "properties": { + "active_set_size": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "active_set_work_factor": { + "$ref": "#/definitions/Decimal" + }, + "initial_reward_pool": { + "$ref": "#/definitions/Decimal" + }, + "initial_staking_supply": { + "$ref": "#/definitions/Decimal" + }, + "interval_pool_emission": { + "$ref": "#/definitions/Percent" + }, + "rewarded_set_size": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "staking_supply_scale_factor": { + "$ref": "#/definitions/Percent" + }, + "sybil_resistance": { + "$ref": "#/definitions/Percent" + } + } + }, + "Percent": { + "description": "Percent represents a value between 0 and 100% (i.e. between 0.0 and 1.0)", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] } } } diff --git a/contracts/mixnet/schema/migrate_msg.json b/contracts/mixnet/schema/migrate_msg.json new file mode 100644 index 0000000000..d1975efa64 --- /dev/null +++ b/contracts/mixnet/schema/migrate_msg.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MigrateMsg", + "type": "object", + "properties": { + "vesting_contract_address": { + "type": [ + "string", + "null" + ] + } + } +} diff --git a/contracts/mixnet/schema/mix_node_bond.json b/contracts/mixnet/schema/mix_node_bond.json deleted file mode 100644 index 0f5c3fd0be..0000000000 --- a/contracts/mixnet/schema/mix_node_bond.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "MixNodeBond", - "type": "object", - "required": [ - "block_height", - "layer", - "mix_node", - "owner", - "pledge_amount", - "total_delegation" - ], - "properties": { - "accumulated_rewards": { - "anyOf": [ - { - "$ref": "#/definitions/Uint128" - }, - { - "type": "null" - } - ] - }, - "block_height": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "layer": { - "$ref": "#/definitions/Layer" - }, - "mix_node": { - "$ref": "#/definitions/MixNode" - }, - "owner": { - "$ref": "#/definitions/Addr" - }, - "pledge_amount": { - "$ref": "#/definitions/Coin" - }, - "proxy": { - "anyOf": [ - { - "$ref": "#/definitions/Addr" - }, - { - "type": "null" - } - ] - }, - "total_delegation": { - "$ref": "#/definitions/Coin" - } - }, - "definitions": { - "Addr": { - "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", - "type": "string" - }, - "Coin": { - "type": "object", - "required": [ - "amount", - "denom" - ], - "properties": { - "amount": { - "$ref": "#/definitions/Uint128" - }, - "denom": { - "type": "string" - } - } - }, - "Layer": { - "type": "string", - "enum": [ - "Gateway", - "One", - "Two", - "Three" - ] - }, - "MixNode": { - "type": "object", - "required": [ - "host", - "http_api_port", - "identity_key", - "mix_port", - "profit_margin_percent", - "sphinx_key", - "verloc_port", - "version" - ], - "properties": { - "host": { - "type": "string" - }, - "http_api_port": { - "type": "integer", - "format": "uint16", - "minimum": 0.0 - }, - "identity_key": { - "description": "Base58 encoded ed25519 EdDSA public key.", - "type": "string" - }, - "mix_port": { - "type": "integer", - "format": "uint16", - "minimum": 0.0 - }, - "profit_margin_percent": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "sphinx_key": { - "type": "string" - }, - "verloc_port": { - "type": "integer", - "format": "uint16", - "minimum": 0.0 - }, - "version": { - "type": "string" - } - } - }, - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/contracts/mixnet/schema/query_msg.json b/contracts/mixnet/schema/query_msg.json index 43ab824a4c..a8dde27e0a 100644 --- a/contracts/mixnet/schema/query_msg.json +++ b/contracts/mixnet/schema/query_msg.json @@ -5,22 +5,10 @@ { "type": "object", "required": [ - "get_contract_version" + "get_all_families_paged" ], "properties": { - "get_contract_version": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_mix_nodes" - ], - "properties": { - "get_mix_nodes": { + "get_all_families_paged": { "type": "object", "properties": { "limit": { @@ -42,6 +30,518 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "get_all_members_paged" + ], + "properties": { + "get_all_members_paged": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_family_by_head" + ], + "properties": { + "get_family_by_head": { + "type": "object", + "required": [ + "head" + ], + "properties": { + "head": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_family_by_label" + ], + "properties": { + "get_family_by_label": { + "type": "object", + "required": [ + "label" + ], + "properties": { + "label": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_family_members_by_head" + ], + "properties": { + "get_family_members_by_head": { + "type": "object", + "required": [ + "head" + ], + "properties": { + "head": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_family_members_by_label" + ], + "properties": { + "get_family_members_by_label": { + "type": "object", + "required": [ + "label" + ], + "properties": { + "label": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_contract_version" + ], + "properties": { + "get_contract_version": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_rewarding_validator_address" + ], + "properties": { + "get_rewarding_validator_address": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_state_params" + ], + "properties": { + "get_state_params": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_state" + ], + "properties": { + "get_state": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_rewarding_params" + ], + "properties": { + "get_rewarding_params": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_current_interval_details" + ], + "properties": { + "get_current_interval_details": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_rewarded_set" + ], + "properties": { + "get_rewarded_set": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_mix_node_bonds" + ], + "properties": { + "get_mix_node_bonds": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_mix_nodes_detailed" + ], + "properties": { + "get_mix_nodes_detailed": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_unbonded_mix_nodes" + ], + "properties": { + "get_unbonded_mix_nodes": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_unbonded_mix_nodes_by_owner" + ], + "properties": { + "get_unbonded_mix_nodes_by_owner": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_unbonded_mix_nodes_by_identity_key" + ], + "properties": { + "get_unbonded_mix_nodes_by_identity_key": { + "type": "object", + "required": [ + "identity_key" + ], + "properties": { + "identity_key": { + "type": "string" + }, + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_owned_mixnode" + ], + "properties": { + "get_owned_mixnode": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_mixnode_details" + ], + "properties": { + "get_mixnode_details": { + "type": "object", + "required": [ + "mix_id" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_mixnode_rewarding_details" + ], + "properties": { + "get_mixnode_rewarding_details": { + "type": "object", + "required": [ + "mix_id" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_stake_saturation" + ], + "properties": { + "get_stake_saturation": { + "type": "object", + "required": [ + "mix_id" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_unbonded_mix_node_information" + ], + "properties": { + "get_unbonded_mix_node_information": { + "type": "object", + "required": [ + "mix_id" + ], + "properties": { + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_bonded_mixnode_details_by_identity" + ], + "properties": { + "get_bonded_mixnode_details_by_identity": { + "type": "object", + "required": [ + "mix_identity" + ], + "properties": { + "mix_identity": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_layer_distribution" + ], + "properties": { + "get_layer_distribution": { + "type": "object" + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ @@ -73,16 +573,16 @@ { "type": "object", "required": [ - "owns_mixnode" + "get_gateway_bond" ], "properties": { - "owns_mixnode": { + "get_gateway_bond": { "type": "object", "required": [ - "address" + "identity" ], "properties": { - "address": { + "identity": { "type": "string" } } @@ -93,10 +593,10 @@ { "type": "object", "required": [ - "owns_gateway" + "get_owned_gateway" ], "properties": { - "owns_gateway": { + "get_owned_gateway": { "type": "object", "required": [ "address" @@ -110,66 +610,6 @@ }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "state_params" - ], - "properties": { - "state_params": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_all_network_delegations" - ], - "properties": { - "get_all_network_delegations": { - "type": "object", - "properties": { - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { - "type": [ - "array", - "null" - ], - "items": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - } - }, - { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - ], - "maxItems": 3, - "minItems": 3 - } - } - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ @@ -179,7 +619,7 @@ "get_mixnode_delegations": { "type": "object", "required": [ - "mix_identity" + "mix_id" ], "properties": { "limit": { @@ -190,26 +630,16 @@ "format": "uint32", "minimum": 0.0 }, - "mix_identity": { - "type": "string" + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 }, "start_after": { "type": [ - "array", + "string", "null" - ], - "items": [ - { - "type": "string" - }, - { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - ], - "maxItems": 2, - "minItems": 2 + ] } } } @@ -241,9 +671,21 @@ }, "start_after": { "type": [ - "string", + "array", "null" - ] + ], + "items": [ + { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + { + "type": "string" + } + ], + "maxItems": 2, + "minItems": 2 } } } @@ -260,144 +702,18 @@ "type": "object", "required": [ "delegator", - "mix_identity" + "mix_id" ], "properties": { "delegator": { "type": "string" }, - "mix_identity": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "layer_distribution" - ], - "properties": { - "layer_distribution": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_reward_pool" - ], - "properties": { - "get_reward_pool": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_circulating_supply" - ], - "properties": { - "get_circulating_supply": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_interval_reward_percent" - ], - "properties": { - "get_interval_reward_percent": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_sybil_resistance_percent" - ], - "properties": { - "get_sybil_resistance_percent": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_active_set_work_factor" - ], - "properties": { - "get_active_set_work_factor": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_rewarding_status" - ], - "properties": { - "get_rewarding_status": { - "type": "object", - "required": [ - "interval_id", - "mix_identity" - ], - "properties": { - "interval_id": { + "mix_id": { "type": "integer", "format": "uint32", "minimum": 0.0 }, - "mix_identity": { - "type": "string" - } - } - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_rewarded_set" - ], - "properties": { - "get_rewarded_set": { - "type": "object", - "properties": { - "height": { - "type": [ - "integer", - "null" - ], - "format": "uint64", - "minimum": 0.0 - }, - "limit": { - "type": [ - "integer", - "null" - ], - "format": "uint32", - "minimum": 0.0 - }, - "start_after": { + "proxy": { "type": [ "string", "null" @@ -411,11 +727,39 @@ { "type": "object", "required": [ - "get_rewarded_set_update_details" + "get_all_delegations" ], "properties": { - "get_rewarded_set_update_details": { - "type": "object" + "get_all_delegations": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "array", + "null" + ], + "items": [ + { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + { + "type": "string" + } + ], + "maxItems": 2, + "minItems": 2 + } + } } }, "additionalProperties": false @@ -423,58 +767,10 @@ { "type": "object", "required": [ - "get_current_rewarded_set_height" + "get_pending_operator_reward" ], "properties": { - "get_current_rewarded_set_height": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_rewarded_set_refresh_blocks" - ], - "properties": { - "get_rewarded_set_refresh_blocks": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_current_epoch" - ], - "properties": { - "get_current_epoch": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "get_epochs_in_interval" - ], - "properties": { - "get_epochs_in_interval": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "query_operator_reward" - ], - "properties": { - "query_operator_reward": { + "get_pending_operator_reward": { "type": "object", "required": [ "address" @@ -491,21 +787,19 @@ { "type": "object", "required": [ - "query_delegator_reward" + "get_pending_mix_node_operator_reward" ], "properties": { - "query_delegator_reward": { + "get_pending_mix_node_operator_reward": { "type": "object", "required": [ - "address", - "mix_identity" + "mix_id" ], "properties": { - "address": { - "type": "string" - }, - "mix_identity": { - "type": "string" + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 } } } @@ -515,22 +809,170 @@ { "type": "object", "required": [ - "get_pending_delegation_events" + "get_pending_delegator_reward" ], "properties": { - "get_pending_delegation_events": { + "get_pending_delegator_reward": { "type": "object", "required": [ - "owner_address" + "address", + "mix_id" ], "properties": { - "owner_address": { + "address": { "type": "string" + }, + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "proxy": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_estimated_current_epoch_operator_reward" + ], + "properties": { + "get_estimated_current_epoch_operator_reward": { + "type": "object", + "required": [ + "estimated_performance", + "mix_id" + ], + "properties": { + "estimated_performance": { + "$ref": "#/definitions/Percent" + }, + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_estimated_current_epoch_delegator_reward" + ], + "properties": { + "get_estimated_current_epoch_delegator_reward": { + "type": "object", + "required": [ + "address", + "estimated_performance", + "mix_id" + ], + "properties": { + "address": { + "type": "string" + }, + "estimated_performance": { + "$ref": "#/definitions/Percent" + }, + "mix_id": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "proxy": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_pending_epoch_events" + ], + "properties": { + "get_pending_epoch_events": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "get_pending_interval_events" + ], + "properties": { + "get_pending_interval_events": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 } } } }, "additionalProperties": false } - ] + ], + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + }, + "Percent": { + "description": "Percent represents a value between 0 and 100% (i.e. between 0.0 and 1.0)", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + } + } } diff --git a/contracts/vesting/Cargo.toml b/contracts/vesting/Cargo.toml index d9d9120a45..3ca8c3f6d9 100644 --- a/contracts/vesting/Cargo.toml +++ b/contracts/vesting/Cargo.toml @@ -1,13 +1,18 @@ [package] name = "nym-vesting-contract" version = "1.1.3" -authors = ["Drazen Urch "] -edition = "2021" +description = "Nym vesting contract" +edition = { workspace = true } +authors = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +readme = "README.md" exclude = [ # Those files are rust-optimizer artifacts. You might want to commit them for convenience but they should not be part of the source code publication. "contract.wasm", "hash.txt", + "artifacts", ] [lib] @@ -15,9 +20,9 @@ name = "vesting_contract" crate-type = ["cdylib", "rlib"] [dependencies] -mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract", package = "nym-mixnet-contract-common" } -contracts-common = { path = "../../common/cosmwasm-smart-contracts/contracts-common", package = "nym-contracts-common" } -vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract", package = "nym-vesting-contract-common" } +mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract", package = "nym-mixnet-contract-common", version = "0.1.0" } +contracts-common = { path = "../../common/cosmwasm-smart-contracts/contracts-common", package = "nym-contracts-common", version = "0.1.0" } +vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract", package = "nym-vesting-contract-common", version = "0.1.0" } cosmwasm-std = { version = "1.0.0 "} cw-storage-plus = { version = "0.13.4", features = ["iterator"] } From 20c77e69873864a7b97d9cec1c7aea56e340a93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 22 Feb 2023 23:00:06 +0100 Subject: [PATCH 470/591] Update Cargo.lock files after release bumping versions --- Cargo.lock | 22 +++++++++++----------- nym-connect/mobile/src-tauri/Cargo.lock | 13 +++++++------ nym-wallet/Cargo.lock | 4 ++-- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5ae3d2f08..bea58ef887 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -677,7 +677,7 @@ dependencies = [ [[package]] name = "client-core" -version = "1.1.9" +version = "1.1.10" dependencies = [ "async-trait", "config", @@ -1821,7 +1821,7 @@ dependencies = [ [[package]] name = "explorer-api" -version = "1.1.9" +version = "1.1.10" dependencies = [ "chrono", "clap 4.1.4", @@ -3312,7 +3312,7 @@ dependencies = [ [[package]] name = "nym-api" -version = "1.1.10" +version = "1.1.11" dependencies = [ "anyhow", "async-trait", @@ -3422,7 +3422,7 @@ dependencies = [ [[package]] name = "nym-cli" -version = "1.1.9" +version = "1.1.10" dependencies = [ "anyhow", "base64 0.13.1", @@ -3480,7 +3480,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "1.1.9" +version = "1.1.10" dependencies = [ "clap 4.1.4", "client-core", @@ -3553,7 +3553,7 @@ dependencies = [ [[package]] name = "nym-gateway" -version = "1.1.9" +version = "1.1.10" dependencies = [ "anyhow", "async-trait", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.10" +version = "1.1.11" dependencies = [ "anyhow", "atty", @@ -3685,7 +3685,7 @@ dependencies = [ [[package]] name = "nym-network-requester" -version = "1.1.9" +version = "1.1.10" dependencies = [ "async-trait", "clap 4.1.4", @@ -3723,7 +3723,7 @@ dependencies = [ [[package]] name = "nym-network-statistics" -version = "1.1.9" +version = "1.1.10" dependencies = [ "dirs", "log", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.9" +version = "1.1.10" dependencies = [ "clap 4.1.4", "client-core", @@ -4006,7 +4006,7 @@ dependencies = [ [[package]] name = "nym-vesting-contract" -version = "1.1.3" +version = "1.1.4" dependencies = [ "cosmwasm-std", "cw-storage-plus", diff --git a/nym-connect/mobile/src-tauri/Cargo.lock b/nym-connect/mobile/src-tauri/Cargo.lock index 3cbbdc7478..2260ee2a59 100644 --- a/nym-connect/mobile/src-tauri/Cargo.lock +++ b/nym-connect/mobile/src-tauri/Cargo.lock @@ -612,7 +612,7 @@ dependencies = [ [[package]] name = "client-core" -version = "1.1.9" +version = "1.1.10" dependencies = [ "async-trait", "config", @@ -3621,7 +3621,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.9" +version = "1.1.10" dependencies = [ "clap", "client-core", @@ -3780,7 +3780,7 @@ dependencies = [ name = "nym-sphinx-types" version = "0.1.0" dependencies = [ - "sphinx", + "sphinx-packet", ] [[package]] @@ -3812,7 +3812,7 @@ dependencies = [ [[package]] name = "nym-vesting-contract" -version = "1.1.3" +version = "1.1.4" dependencies = [ "cosmwasm-std", "cw-storage-plus", @@ -5516,9 +5516,10 @@ dependencies = [ ] [[package]] -name = "sphinx" +name = "sphinx-packet" version = "0.1.0" -source = "git+https://github.com/nymtech/sphinx?rev=e05a1992522ed0afd3c6fcac160313ffc9bb306a#e05a1992522ed0afd3c6fcac160313ffc9bb306a" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc43eda802856ee82a7555c7b75ceb9e07451741c7a2f5f23d036020e01189d4" dependencies = [ "aes 0.7.5", "arrayref", diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index b01ceeafaf..d9c121dcef 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -3015,7 +3015,7 @@ dependencies = [ [[package]] name = "nym-vesting-contract" -version = "1.1.3" +version = "1.1.4" dependencies = [ "cosmwasm-std", "cw-storage-plus", @@ -3077,7 +3077,7 @@ dependencies = [ [[package]] name = "nym_wallet" -version = "1.1.9" +version = "1.1.10" dependencies = [ "aes-gcm", "argon2 0.3.4", From 73f3f8cfab3d6dd95519c8c51a0c67770b8c6161 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 09:34:51 +0200 Subject: [PATCH 471/591] pushing changes --- tests/build_and_run.sh | 21 +++- tests/nym-gateway-binary-check.sh | 46 +++++++-- tests/nym-mixnode-binary-check.sh | 2 +- tests/nym-network-requester-binary-check.sh | 106 ++++++++++++++++++++ tests/nym-socks-5-binary-check.sh | 9 +- 5 files changed, 168 insertions(+), 16 deletions(-) create mode 100755 tests/nym-network-requester-binary-check.sh diff --git a/tests/build_and_run.sh b/tests/build_and_run.sh index f6ff95f3cd..765e053bf7 100755 --- a/tests/build_and_run.sh +++ b/tests/build_and_run.sh @@ -19,10 +19,27 @@ echo "working directory ${PWD}" cargo build --release --all #here there should be the applicable binaries to test inits - +echo "running mixnode binary check" ./nym-mixnode-binary-check.sh "$VERSION_NUMBER" sleep 2 echo "running gateway binary check" -#./nym-gateway-binary-check.sh "$VERSION_NUMBER" \ No newline at end of file +./nym-gateway-binary-check.sh "$VERSION_NUMBER" + +sleep 2 + +echo "running socks-5 binary check" +./nym-socks-5-binary-check.sh "$VERSION_NUMBER" + +sleep 2 + +echo "running network-requester binary check" +./nym-network-requester-binary-check.sh "$VERSION_NUMBER" + +sleep 2 + +echo "running client binary check" +./nym-client-binary-check.sh "$VERSION_NUMBER" + + diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index de1b71e5c4..a13798a96a 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -9,8 +9,8 @@ RELEASE_DIRECTORY="target/release" VERSION_NUMBER=$1 WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr MOCK_HOST="1.2.3.4" -OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) -ID="test-${OUTPUT}" +RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) +ID="test-${RANDOM_ID}" BINARY_NAME="nym-gateway" echo "the version number is ${VERSION_NUMBER} to be installed from github" @@ -56,19 +56,49 @@ else echo "exting test no binary found" fi +#---------------------------------------------------------------------------------------------------------- +# tests +#---------------------------------------------------------------------------------------------------------- + # we run the release version first check_gateway_binary_build -# lets remove the binary then navigate to the target/release directory for checking the latest version -# expect to have successful output and configuration +# whoami +# this is dependant on where it runs on ci potentially, will need to tweak this in the future +first_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =") -if [ -f $BINARY_NAME ]; then - echo "removing nym-mixnode" - rm -rf $BINARY_NAME +#lets remove the binary then navigate to the target/release directory for checking the latest version +if [ -f "$BINARY_NAME" ]; then + echo "removing nym-gateway" + rm -rf "$BINARY_NAME" + echo "successfully removed nym-gateway" else echo "no binary found exiting" exit 1 fi +#---------------------------------------------------------------------------------------------------------- # we should expect it to pass because no errors should be presented when performing the upgrade of an init -# this should be caught at testing staage +# this should be caught at testing stage - navigate to latest binary build +#---------------------------------------------------------------------------------------------------------- + +cd ${PWD}${RELEASE_DIRECTORY} + +#re run against the current binary built locally + check_gateway_binary_build + +echo "diff the config files after each init" +echo "-------------------------------------" + +second_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =") + +diff -w <(echo "$first_init") <(echo "$second_init") + +# check the status of the diff +if [ $? -eq 0 ]; then + echo "no differences in config files, exiting script" + exit 0 +else + echo "there are differences in the config files, it may require a fresh init on the binary" + exit 1 +fi diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 89a4a604b6..4acd3f997d 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -72,7 +72,7 @@ fi # this should be caught at testing stage - navigate to latest binary build #---------------------------------------------------------------------------------------------------------- -cd $PWD$RELEASE_DIRECTORY +cd ${PWD}${RELEASE_DIRECTORY} #re run against the current binary built locally diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh new file mode 100755 index 0000000000..a82fe1284e --- /dev/null +++ b/tests/nym-network-requester-binary-check.sh @@ -0,0 +1,106 @@ +#!/bin/bash + +set -e + +. assert.sh -v -x + +PWD="../" +RELEASE_DIRECTORY="target/release" +VERSION_NUMBER=$1 +RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) +ID="test-${RANDOM_ID}" +BINARY_NAME="nym-network-requester" + +echo "the version number is ${VERSION_NUMBER} to be installed from github" + +cd ${PWD}${RELEASE_DIRECTORY} + +# we have now the bundled the client into the network requester, more a less the same output as the client + +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +chmod u+x $BINARY_NAME + +#---------------------------------------------------------------------------------------------------------- +# functions +#---------------------------------------------------------------------------------------------------------- + +check_nym_network_requester_binary_build() if [ -f $BINARY_NAME ]; then + echo "running init tests" + ./${BINARY_NAME} init --id ${ID} --output-json >/dev/null 2>&1 + + # currently this outputs to a file name name + # we currently store the output in a file in the same directory + + if [ -f "client_init_results.json" ]; then + OUTPUT=$(cat client_init_results.json) + + # get jq values for things we can assert against + # until the service provider is provided in the output we can validate the id is correct on init + VALUE=$(echo ${OUTPUT} | jq .id) + VALUE=${VALUE#\"} + VALUE=${VALUE%\"} + + echo "${OUTPUT}" + sleep 2 + + # do asserts here based upon the output on init + + assert $(echo ${VALUE}) $(echo ${ID}) + assert_end nym-network-requester-tests + else + echo "exting test no binary found" + fi +else + echo "exting test no binary found" +fi + +#---------------------------------------------------------------------------------------------------------- +# tests +#---------------------------------------------------------------------------------------------------------- +# we run the release version first + +check_nym_network_requester_binary_build + +first_init=$(cat /root/.nym/service-providers/network-requester/${ID}/config/config.toml | grep -v "^version =") + +#---------------------------------------------------------------------------------------------------------- +# lets remove the binary then navigate to the target/release directory for checking the latest version +# expect to have successful output and configuration +#---------------------------------------------------------------------------------------------------------- + +if [ -f $BINARY_NAME ]; then + echo "removing nym-network-requester binary" + rm -rf $BINARY_NAME +else + echo "no binary found exiting" + exit 1 +fi + +#---------------------------------------------------------------------------------------------------------- +# we should expect it to pass because no errors should be presented when performing the upgrade of an init +# this should be caught at testing stage - navigate to latest binary build +#---------------------------------------------------------------------------------------------------------- + +cd ${PWD}${RELEASE_DIRECTORY} + +# re-run against the current binary built locally + +echo "diff the config files after each init" +echo "-------------------------------------" + +check_nym_network_requester_binary_build + +second_init=$(cat /root/.nym/service-providers/network-requester/${ID}/config/config.toml | grep -v "^version =") + +diff -w <(echo "$first_init") <(echo "$second_init") + +# check the status of the diff +if [ $? -eq 0 ]; then + echo "no differences in config files, exiting script" + exit 0 +else + echo "there are differences in the config files, it may require a fresh init on the binary" + exit 1 +fi + +# we should expect it to pass because no errors should be presented when performing the upgrade of an init diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index 9433ed932c..f8ba7807ee 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -10,7 +10,7 @@ VERSION_NUMBER=$1 MOCK_SERVICE_PROVIDER="36cUqdggtdXixZhmXfyZm3Dep3Q5QsKVPotMrVSmS4oY.ZCCAdFPwPNSTtUMYveA62ttEFe8FDiB3cdheWHtCytX@6Lnxj9vD2YMtSmfe8zp5RBtj1uZLYQAFRxY9q7ANwrZz" RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" -BINARY_NAME="nym-socks5-client" +BINARY_NAME="nym-socks5-client" echo "the version number is ${VERSION_NUMBER} to be installed from github" @@ -29,7 +29,6 @@ cd ${PWD}${RELEASE_DIRECTORY} curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME chmod u+x $BINARY_NAME - #---------------------------------------------------------------------------------------------------------- # functions #---------------------------------------------------------------------------------------------------------- @@ -40,7 +39,7 @@ check_nym_socks5_client_binary_build() if [ -f $BINARY_NAME ]; then # currently this outputs to a file name name # we currently store the output in a file in the same directory - + if [ -f "socks5_client_init_results.json" ]; then OUTPUT=$(cat socks5_client_init_results.json) @@ -56,7 +55,7 @@ check_nym_socks5_client_binary_build() if [ -f $BINARY_NAME ]; then # do asserts here based upon the output on init assert $(echo ${VALUE}) $(echo ${ID}) - assert_end nym-client-tests + assert_end nym-socks-5-client-tests else echo "exting test no binary found" fi @@ -79,7 +78,7 @@ first_init=$(cat /root/.nym/socks5-clients/${ID}/config/config.toml | grep -v "^ #---------------------------------------------------------------------------------------------------------- if [ -f $BINARY_NAME ]; then - echo "removing client binary" + echo "removing socks-5-client binary" rm -rf $BINARY_NAME else echo "no binary found exiting" From ab2a9f24c33050eaed87650d76f485620d31d513 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 09:37:09 +0200 Subject: [PATCH 472/591] remove text --- tests/nym-client-binary-check.sh | 9 +-------- tests/nym-gateway-binary-check.sh | 7 ------- tests/nym-mixnode-binary-check.sh | 7 ------- tests/nym-socks-5-binary-check.sh | 7 ------- 4 files changed, 1 insertion(+), 29 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index c54f40948c..ef22d439cd 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -15,13 +15,6 @@ echo "the version number is ${VERSION_NUMBER} to be installed from github" cd ${PWD}${RELEASE_DIRECTORY} -# steps -# we curl the existing binary from the release page of github -# we init the binary to check successful init -# then in our testing branch, we build the binary locally -# re run the init based upon the configuration injected -# we validate that no errors are return from upgrading the binary against the test - # install the current release binary # so this is dependant on running on a linux machine for the time being @@ -38,7 +31,7 @@ check_nym_client_binary_build() if [ -f $BINARY_NAME ]; then # currently this outputs to a file name name # we currently store the output in a file in the same directory - + if [ -f client_init_results.json ]; then OUTPUT=$(cat client_init_results.json) diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index a13798a96a..5c8df30fb8 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -17,13 +17,6 @@ echo "the version number is ${VERSION_NUMBER} to be installed from github" cd ${PWD}${RELEASE_DIRECTORY} -# steps -# we curl the existing binary from the release page of github -# we init the binary to check successful init -# then in our testing branch, we build the binary locally -# re run the init based upon the configuration injected -# we validate that no errors are return from upgrading the binary against the test - # install the current release binary # so this is dependant on running on a linux machine for the time being diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 4acd3f997d..b670113c0d 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -13,13 +13,6 @@ BINARY_NAME="nym-mixnode" echo "the version number is ${VERSION_NUMBER} to be installed from github" -# steps -# we curl the existing binary from the release page of github -# we init the binary to check successful init -# then in our testing branch, we build the binary locally -# re run the init based upon the configuration injected -# we validate that no errors are return from upgrading the binary against the test - # install the current release binary # so this is dependant on running on a linux machine for the time being curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o nym-mixnode diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index f8ba7807ee..b818db3b9a 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -16,13 +16,6 @@ echo "the version number is ${VERSION_NUMBER} to be installed from github" cd ${PWD}${RELEASE_DIRECTORY} -# steps -# we curl the existing binary from the release page of github -# we init the binary to check successful init -# then in our testing branch, we build the binary locally -# re run the init based upon the configuration injected -# we validate that no errors are return from upgrading the binary against the test - # install the current release binary # so this is dependant on running on a linux machine for the time being From 81028c554f224b16f85fcfa341b763ce2fde22a7 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 08:56:39 +0100 Subject: [PATCH 473/591] Update README.md --- tests/README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/README.md b/tests/README.md index 14e3487dd3..3d72d8123e 100644 --- a/tests/README.md +++ b/tests/README.md @@ -4,7 +4,12 @@ ### WIP A simple tool to ensure that all binaries init with the correct format, using the assert.sh library -Simply run `./build_and_run.sh $GIT_BRANCH` + +Simply run `./build_and_run.sh $RELEASE_BRANCH` `$CURRENT_PRODUCTION_RELEASE_VERSION` + +For example: + +`./build_and_run.sh release/v1.1.11 v1.1.10` This will run through all the binaries anc check the fields that we expect to be initialised when passing the parameters into nyms core binaries @@ -12,4 +17,4 @@ This will run through all the binaries anc check the fields that we expect to be - Introduce all binaries - Sort paths and locations - Tidy up - - Run in CI \ No newline at end of file + - Run in CI From d9cec11f63523631ec8a46c00678e85127f5fd8b Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 10:24:37 +0200 Subject: [PATCH 474/591] change output here --- tests/nym-mixnode-binary-check.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index b670113c0d..256cbc7a7e 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -7,8 +7,8 @@ RELEASE_DIRECTORY="target/release" RELEASE_VERSION_NUMBER=$1 WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr MOCK_HOST="1.2.3.4" -OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) -ID="test-${OUTPUT}" +RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) +ID="test-${RANDOM_ID}" BINARY_NAME="nym-mixnode" echo "the version number is ${VERSION_NUMBER} to be installed from github" From b02ee658708de9cdf6c872dc2778e7d8013088fb Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 10:35:58 +0200 Subject: [PATCH 475/591] fix command --- tests/nym-mixnode-binary-check.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 256cbc7a7e..76f5a39133 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -26,14 +26,14 @@ check_mixnode_binary_build() { if [ -f "$BINARY_NAME" ]; then echo "running init tests" # we wont use config env files for now - OUTPUT=$(./${BINARY_NAME} --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST} >/dev/null) + OUTPUT=$(./${BINARY_NAME} --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) >/dev/null # get jq values for things we can assert against # tidy this bit up - okay for first push VALUE="$(echo ${OUTPUT} | jq .wallet_address | tr -d '"')" # do asserts here based upon the output on init - assert "echo ${VALUE}" $(echo ${WALLET_ADDRESS_CONST}) + assert $(echo ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) assert_end nym-mixnode-tests else echo "exiting test no binary found" From 97d06d3859e51bb48fdb3d91814ce15733ff0a94 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 10:37:07 +0200 Subject: [PATCH 476/591] fix up download paths --- tests/nym-client-binary-check.sh | 2 +- tests/nym-gateway-binary-check.sh | 2 +- tests/nym-network-requester-binary-check.sh | 2 +- tests/nym-socks-5-binary-check.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index ef22d439cd..cb15f71037 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -18,7 +18,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 5c8df30fb8..96ba8e5848 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -20,7 +20,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME chmod u+x $BINARY_NAME #-------------------------------------- diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index a82fe1284e..0ee1d55d65 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -17,7 +17,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # we have now the bundled the client into the network requester, more a less the same output as the client -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index b818db3b9a..c3d5d38266 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -19,7 +19,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/$BINARY_NAME -o $BINARY_NAME +curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- From 9afc21170af5e9cc4d8d130cae448a7c99cdff6f Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 10:44:20 +0200 Subject: [PATCH 477/591] fix assertions --- tests/nym-gateway-binary-check.sh | 2 +- tests/nym-mixnode-binary-check.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 96ba8e5848..344986605a 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -43,7 +43,7 @@ check_gateway_binary_build() if [ -f nym-gateway ]; then # do asserts here based upon the output on init - assert $(echo ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) + assert "echo ${VALUE}" $(echo ${WALLET_ADDRESS_CONST}) assert_end nym-gateway-tests else echo "exting test no binary found" diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 76f5a39133..e7ed4a00d3 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -33,7 +33,7 @@ check_mixnode_binary_build() { VALUE="$(echo ${OUTPUT} | jq .wallet_address | tr -d '"')" # do asserts here based upon the output on init - assert $(echo ${VALUE}) $(echo ${WALLET_ADDRESS_CONST}) + assert "echo ${VALUE}" $(echo ${WALLET_ADDRESS_CONST}) assert_end nym-mixnode-tests else echo "exiting test no binary found" From c8f8c9cb07338bcfa4da3dbb0f2ffe9751f17650 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 10:58:36 +0200 Subject: [PATCH 478/591] fix urls --- tests/nym-client-binary-check.sh | 2 +- tests/nym-gateway-binary-check.sh | 2 +- tests/nym-network-requester-binary-check.sh | 2 +- tests/nym-socks-5-binary-check.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index cb15f71037..2454019db1 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -18,7 +18,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME +curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 344986605a..9205164261 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -20,7 +20,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME +curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #-------------------------------------- diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index 0ee1d55d65..38c3965fc3 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -17,7 +17,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # we have now the bundled the client into the network requester, more a less the same output as the client -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME +curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index c3d5d38266..6e288cf5bf 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -19,7 +19,7 @@ cd ${PWD}${RELEASE_DIRECTORY} # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME} -o $BINARY_NAME +curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- From 2f2dfff53d6ca27e21695f7c64ee808aa5f14f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 23 Feb 2023 10:01:46 +0100 Subject: [PATCH 479/591] Add nym prefix to a few more crates (#3092) * Add nym- prefix to execute crate * Add nym- prefix to nonexhaustive-delayqueue * Add nym- prefix to config crate * Update imports * Update more module paths * rustfmt * Add nym- prefix to statistics-common * Update explicit module paths * rustfmt --- Cargo.lock | 128 +++++++++--------- clients/client-core/Cargo.toml | 4 +- .../action_controller.rs | 2 +- clients/client-core/src/config/mod.rs | 4 +- .../src/config/persistence/key_pathfinder.rs | 2 +- clients/client-core/src/init/helpers.rs | 2 +- clients/client-core/src/init/mod.rs | 4 +- clients/credential/Cargo.toml | 2 +- clients/credential/src/main.rs | 2 +- clients/native/Cargo.toml | 2 +- clients/native/src/client/config/mod.rs | 4 +- clients/native/src/commands/init.rs | 2 +- clients/native/src/commands/mod.rs | 6 +- clients/native/src/commands/run.rs | 2 +- clients/native/src/commands/upgrade.rs | 2 +- clients/socks5/Cargo.toml | 2 +- clients/socks5/src/client/config/mod.rs | 4 +- clients/socks5/src/commands/init.rs | 2 +- clients/socks5/src/commands/mod.rs | 6 +- clients/socks5/src/commands/run.rs | 2 +- clients/socks5/src/commands/upgrade.rs | 2 +- .../client-libs/validator-client/Cargo.toml | 6 +- .../src/nyxd/fee/gas_price.rs | 2 +- .../validator-client/src/nyxd/mod.rs | 4 +- .../validator-client/src/nyxd/wallet/mod.rs | 2 +- common/config/Cargo.toml | 2 +- common/execute/Cargo.toml | 2 +- common/nonexhaustive-delayqueue/Cargo.toml | 4 +- common/statistics/Cargo.toml | 2 +- common/types/Cargo.toml | 2 +- common/types/src/account.rs | 2 +- common/types/src/currency.rs | 2 +- contracts/mixnet/Cargo.toml | 2 +- gateway/Cargo.toml | 4 +- gateway/src/commands/init.rs | 2 +- gateway/src/commands/mod.rs | 6 +- gateway/src/commands/upgrade.rs | 2 +- gateway/src/config/mod.rs | 4 +- gateway/src/node/mod.rs | 2 +- gateway/src/node/statistics/collector.rs | 2 +- gateway/src/support/config.rs | 2 +- mixnode/Cargo.toml | 4 +- mixnode/src/commands/describe.rs | 2 +- mixnode/src/commands/init.rs | 2 +- mixnode/src/commands/mod.rs | 6 +- mixnode/src/commands/node_details.rs | 2 +- mixnode/src/commands/run.rs | 2 +- mixnode/src/commands/sign.rs | 2 +- mixnode/src/commands/upgrade.rs | 2 +- mixnode/src/config/mod.rs | 6 +- mixnode/src/main.rs | 2 +- mixnode/src/node/mod.rs | 2 +- mixnode/src/node/packet_delayforwarder.rs | 2 +- nym-api/Cargo.toml | 2 +- nym-api/src/coconut/deposit.rs | 2 +- nym-api/src/coconut/mod.rs | 2 +- nym-api/src/coconut/tests.rs | 2 +- nym-api/src/main.rs | 4 +- nym-api/src/network_monitor/monitor/sender.rs | 2 +- nym-api/src/support/cli/mod.rs | 4 +- nym-api/src/support/config/mod.rs | 6 +- nym-api/src/support/nyxd/mod.rs | 2 +- nym-connect/desktop/src-tauri/Cargo.toml | 2 +- .../desktop/src-tauri/src/config/mod.rs | 6 +- nym-connect/desktop/src-tauri/src/main.rs | 2 +- nym-connect/desktop/src-tauri/src/state.rs | 2 +- nym-connect/desktop/src-tauri/src/tasks.rs | 2 +- nym-connect/mobile/src-tauri/Cargo.lock | 78 +++++------ nym-connect/mobile/src-tauri/Cargo.toml | 2 +- .../mobile/src-tauri/src/config/mod.rs | 6 +- nym-connect/mobile/src-tauri/src/lib.rs | 2 +- nym-connect/mobile/src-tauri/src/state.rs | 2 +- nym-connect/mobile/src-tauri/src/tasks.rs | 2 +- nym-wallet/Cargo.lock | 52 +++---- nym-wallet/nym-wallet-types/Cargo.toml | 2 +- nym-wallet/nym-wallet-types/src/network.rs | 2 +- nym-wallet/src-tauri/Cargo.toml | 2 +- nym-wallet/src-tauri/src/config/mod.rs | 2 +- .../src/operations/mixnet/account.rs | 2 +- nym-wallet/src-tauri/src/state.rs | 2 +- .../src-tauri/src/wallet_storage/mod.rs | 2 +- .../network-requester/Cargo.toml | 4 +- .../network-requester/src/cli/init.rs | 2 +- .../network-requester/src/cli/mod.rs | 4 +- .../network-requester/src/cli/run.rs | 2 +- .../network-requester/src/config/mod.rs | 2 +- .../network-requester/src/core.rs | 2 +- .../src/statistics/collector.rs | 18 +-- .../network-requester/src/statistics/error.rs | 2 +- .../network-statistics/Cargo.toml | 2 +- .../network-statistics/src/api/mod.rs | 2 +- .../network-statistics/src/api/routes.rs | 2 +- .../network-statistics/src/storage/mod.rs | 6 +- 93 files changed, 261 insertions(+), 261 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bea58ef887..4f8d33aacf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -680,7 +680,6 @@ name = "client-core" version = "1.1.10" dependencies = [ "async-trait", - "config", "dashmap 5.4.0", "dirs", "futures", @@ -689,8 +688,9 @@ dependencies = [ "gloo-timers", "humantime-serde", "log", - "nonexhaustive-delayqueue", + "nym-config", "nym-crypto", + "nym-nonexhaustive-delayqueue", "nym-pemstore", "nym-sphinx", "nym-task", @@ -788,19 +788,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "config" -version = "0.1.0" -dependencies = [ - "cfg-if", - "handlebars", - "log", - "nym-network-defaults", - "serde", - "toml", - "url", -] - [[package]] name = "console-api" version = "0.4.0" @@ -1009,11 +996,11 @@ dependencies = [ "bip39", "clap 4.1.4", "coconut-interface", - "config", "credential-storage", "credentials", "log", "nym-bin-common", + "nym-config", "nym-crypto", "nym-network-defaults", "nym-pemstore", @@ -1811,14 +1798,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "execute" -version = "0.1.0" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "explorer-api" version = "1.1.10" @@ -3238,18 +3217,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "nonexhaustive-delayqueue" -version = "0.1.0" -dependencies = [ - "futures-core", - "slab", - "tokio", - "tokio-stream", - "tokio-util", - "wasm-timer", -] - [[package]] name = "ntapi" version = "0.4.0" @@ -3323,7 +3290,6 @@ dependencies = [ "coconut-bandwidth-contract-common", "coconut-dkg-common", "coconut-interface", - "config", "console-subscriber", "cosmwasm-std", "credential-storage", @@ -3343,6 +3309,7 @@ dependencies = [ "multisig-contract-common", "nym-api-requests", "nym-bin-common", + "nym-config", "nym-contracts-common", "nym-crypto", "nym-inclusion-probability", @@ -3485,7 +3452,6 @@ dependencies = [ "clap 4.1.4", "client-core", "coconut-interface", - "config", "credential-storage", "credentials", "dirs", @@ -3495,6 +3461,7 @@ dependencies = [ "lazy_static", "log", "nym-bin-common", + "nym-config", "nym-crypto", "nym-network-defaults", "nym-pemstore", @@ -3514,6 +3481,19 @@ dependencies = [ "websocket-requests", ] +[[package]] +name = "nym-config" +version = "0.1.0" +dependencies = [ + "cfg-if", + "handlebars", + "log", + "nym-network-defaults", + "serde", + "toml", + "url", +] + [[package]] name = "nym-contracts-common" version = "0.1.0" @@ -3551,6 +3531,14 @@ dependencies = [ "x25519-dalek", ] +[[package]] +name = "nym-execute" +version = "0.1.0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "nym-gateway" version = "1.1.10" @@ -3563,7 +3551,6 @@ dependencies = [ "clap 4.1.4", "coconut-interface", "colored", - "config", "credentials", "dashmap 4.0.2", "dirs", @@ -3577,10 +3564,12 @@ dependencies = [ "mixnode-common", "nym-api-requests", "nym-bin-common", + "nym-config", "nym-crypto", "nym-network-defaults", "nym-pemstore", "nym-sphinx", + "nym-statistics-common", "nym-task", "nym-types", "once_cell", @@ -3589,7 +3578,6 @@ dependencies = [ "serde", "serde_json", "sqlx 0.5.13", - "statistics-common", "subtle-encoding", "thiserror", "tokio", @@ -3637,7 +3625,6 @@ dependencies = [ "bs58", "clap 4.1.4", "colored", - "config", "cupid", "dirs", "dotenv", @@ -3647,9 +3634,10 @@ dependencies = [ "log", "mixnet-client", "mixnode-common", - "nonexhaustive-delayqueue", "nym-bin-common", + "nym-config", "nym-crypto", + "nym-nonexhaustive-delayqueue", "nym-pemstore", "nym-sphinx", "nym-sphinx-params", @@ -3690,17 +3678,18 @@ dependencies = [ "async-trait", "clap 4.1.4", "client-core", - "config", "dirs", "futures", "ipnetwork 0.20.0", "lazy_static", "log", "nym-bin-common", + "nym-config", "nym-crypto", "nym-network-defaults", "nym-sdk", "nym-sphinx", + "nym-statistics-common", "nym-task", "ordered-buffer", "pretty_env_logger", @@ -3712,7 +3701,6 @@ dependencies = [ "service-providers-common", "socks5-requests", "sqlx 0.6.2", - "statistics-common", "tap", "thiserror", "tokio", @@ -3728,15 +3716,27 @@ dependencies = [ "dirs", "log", "nym-bin-common", + "nym-statistics-common", "pretty_env_logger", "rocket", "serde", "sqlx 0.5.13", - "statistics-common", "thiserror", "tokio", ] +[[package]] +name = "nym-nonexhaustive-delayqueue" +version = "0.1.0" +dependencies = [ + "futures-core", + "slab", + "tokio", + "tokio-stream", + "tokio-util", + "wasm-timer", +] + [[package]] name = "nym-outfox" version = "0.1.0" @@ -3791,7 +3791,6 @@ dependencies = [ "clap 4.1.4", "client-core", "coconut-interface", - "config", "credential-storage", "credentials", "dirs", @@ -3802,6 +3801,7 @@ dependencies = [ "log", "mobile-storage", "nym-bin-common", + "nym-config", "nym-crypto", "nym-network-defaults", "nym-pemstore", @@ -3951,6 +3951,20 @@ dependencies = [ "sphinx-packet", ] +[[package]] +name = "nym-statistics-common" +version = "1.0.1" +dependencies = [ + "async-trait", + "log", + "reqwest", + "serde", + "serde_json", + "sqlx 0.5.13", + "thiserror", + "tokio", +] + [[package]] name = "nym-task" version = "0.1.0" @@ -3983,12 +3997,12 @@ name = "nym-types" version = "1.0.0" dependencies = [ "coconut-interface", - "config", "cosmrs", "cosmwasm-std", "eyre", "itertools", "log", + "nym-config", "nym-mixnet-contract-common", "nym-vesting-contract", "nym-vesting-contract-common", @@ -4035,10 +4049,10 @@ dependencies = [ name = "nym-wallet-types" version = "1.0.0" dependencies = [ - "config", "cosmrs", "cosmwasm-std", "hex-literal", + "nym-config", "nym-mixnet-contract-common", "nym-network-defaults", "nym-types", @@ -5972,20 +5986,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "statistics-common" -version = "1.0.1" -dependencies = [ - "async-trait", - "log", - "reqwest", - "serde", - "serde_json", - "sqlx 0.5.13", - "thiserror", - "tokio", -] - [[package]] name = "stringprep" version = "0.1.2" @@ -6871,12 +6871,10 @@ dependencies = [ "coconut-dkg-common", "coconut-interface", "colored", - "config", "cosmrs", "cosmwasm-std", "cw3", "cw4", - "execute", "flate2", "futures", "group-contract-common", @@ -6884,7 +6882,9 @@ dependencies = [ "log", "multisig-contract-common", "nym-api-requests", + "nym-config", "nym-contracts-common", + "nym-execute", "nym-mixnet-contract-common", "nym-network-defaults", "nym-vesting-contract", diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index dd2a30d1b7..df20c45d98 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -24,12 +24,12 @@ tokio = { version = "1.24.1", features = ["macros"]} time = "0.3.17" # internal -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } nym-crypto = { path = "../../common/crypto" } gateway-client = { path = "../../common/client-libs/gateway-client" } #gateway-client = { path = "../../common/client-libs/gateway-client", default-features = false, features = ["wasm", "coconut"] } gateway-requests = { path = "../../gateway/gateway-requests" } -nonexhaustive-delayqueue = { path = "../../common/nonexhaustive-delayqueue" } +nym-nonexhaustive-delayqueue = { path = "../../common/nonexhaustive-delayqueue" } nym-sphinx = { path = "../../common/nymsphinx" } nym-pemstore = { path = "../../common/pemstore" } nym-topology = { path = "../../common/topology" } diff --git a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs index a812c90b92..95fd31ec01 100644 --- a/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs +++ b/clients/client-core/src/client/real_messages_control/acknowledgement_control/action_controller.rs @@ -6,7 +6,7 @@ use crate::client::real_messages_control::acknowledgement_control::Retransmissio use futures::channel::mpsc; use futures::StreamExt; use log::*; -use nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue, QueueKey}; +use nym_nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue, QueueKey}; use nym_sphinx::chunking::fragment::FragmentIdentifier; use nym_sphinx::Delay as SphinxDelay; use std::collections::HashMap; diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index ad573c463b..a48b2b59b9 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -1,8 +1,8 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use config::defaults::NymNetworkDetails; -use config::{NymConfig, OptionalSet, DB_FILE_NAME}; +use nym_config::defaults::NymNetworkDetails; +use nym_config::{NymConfig, OptionalSet, DB_FILE_NAME}; use nym_sphinx::params::PacketSize; use serde::{Deserialize, Serialize}; use std::marker::PhantomData; diff --git a/clients/client-core/src/config/persistence/key_pathfinder.rs b/clients/client-core/src/config/persistence/key_pathfinder.rs index 70bfe3610f..97d5fd3727 100644 --- a/clients/client-core/src/config/persistence/key_pathfinder.rs +++ b/clients/client-core/src/config/persistence/key_pathfinder.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::config::Config; -use config::NymConfig; +use nym_config::NymConfig; use std::path::{Path, PathBuf}; #[derive(Debug)] diff --git a/clients/client-core/src/init/helpers.rs b/clients/client-core/src/init/helpers.rs index f1062c6b35..e7d03d585a 100644 --- a/clients/client-core/src/init/helpers.rs +++ b/clients/client-core/src/init/helpers.rs @@ -6,11 +6,11 @@ use crate::{ config::{persistence::key_pathfinder::ClientKeyPathfinder, Config}, error::ClientCoreError, }; -use config::NymConfig; #[cfg(target_arch = "wasm32")] use gateway_client::wasm_mockups::SigningNyxdClient; use gateway_client::GatewayClient; use gateway_requests::registration::handshake::SharedKeys; +use nym_config::NymConfig; use nym_crypto::asymmetric::identity; use nym_topology::{filter::VersionFilterable, gateway}; use rand::{seq::SliceRandom, thread_rng}; diff --git a/clients/client-core/src/init/mod.rs b/clients/client-core/src/init/mod.rs index 667c5e0fa5..f99fa318c2 100644 --- a/clients/client-core/src/init/mod.rs +++ b/clients/client-core/src/init/mod.rs @@ -10,7 +10,7 @@ use rand::rngs::OsRng; use serde::Serialize; use tap::TapFallible; -use config::NymConfig; +use nym_config::NymConfig; use nym_crypto::asymmetric::{encryption, identity}; use url::Url; @@ -182,7 +182,7 @@ pub fn get_client_address_from_stored_keys( config: &Config, ) -> Result where - T: config::NymConfig, + T: nym_config::NymConfig, { fn load_identity_keys( pathfinder: &ClientKeyPathfinder, diff --git a/clients/credential/Cargo.toml b/clients/credential/Cargo.toml index 93f80477a9..84e5bf68c6 100644 --- a/clients/credential/Cargo.toml +++ b/clients/credential/Cargo.toml @@ -16,7 +16,7 @@ url = "2.2" tokio = { version = "1.24.1", features = ["rt-multi-thread", "net", "signal", "macros"] } # async runtime coconut-interface = { path = "../../common/coconut-interface" } -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } credentials = { path = "../../common/credentials" } credential-storage = { path = "../../common/credential-storage" } nym-crypto = { path = "../../common/crypto", features = ["rand", "asymmetric", "symmetric", "aes", "hashing"] } diff --git a/clients/credential/src/main.rs b/clients/credential/src/main.rs index f98409578a..50d256bf59 100644 --- a/clients/credential/src/main.rs +++ b/clients/credential/src/main.rs @@ -8,10 +8,10 @@ mod recovery_storage; mod state; use commands::*; -use config::{DATA_DIR, DB_FILE_NAME}; use error::Result; use log::*; use nym_bin_common::completions::fig_generate; +use nym_config::{DATA_DIR, DB_FILE_NAME}; use nym_network_defaults::{setup_env, NymNetworkDetails}; use std::process::exit; use std::time::{Duration, SystemTime}; diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index c007de69c1..8c98ab9487 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -37,7 +37,7 @@ tokio-tungstenite = "0.14" # websocket nym-bin-common = { path = "../../common/bin-common" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } coconut-interface = { path = "../../common/coconut-interface" } -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } credential-storage = { path = "../../common/credential-storage" } credentials = { path = "../../common/credentials" } nym-crypto = { path = "../../common/crypto" } diff --git a/clients/native/src/client/config/mod.rs b/clients/native/src/client/config/mod.rs index d87019e735..80795ca450 100644 --- a/clients/native/src/client/config/mod.rs +++ b/clients/native/src/client/config/mod.rs @@ -3,8 +3,8 @@ use crate::client::config::template::config_template; use client_core::config::ClientCoreConfigTrait; -use config::defaults::DEFAULT_WEBSOCKET_LISTENING_PORT; -use config::{NymConfig, OptionalSet}; +use nym_config::defaults::DEFAULT_WEBSOCKET_LISTENING_PORT; +use nym_config::{NymConfig, OptionalSet}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::net::{IpAddr, Ipv4Addr}; diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index 68b9312576..756adfa493 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -7,7 +7,7 @@ use crate::{ error::ClientError, }; use clap::Args; -use config::NymConfig; +use nym_config::NymConfig; use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index fee9a18339..b8c05c4cc7 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -4,10 +4,10 @@ use crate::client::config::{BaseConfig, Config}; use clap::CommandFactory; use clap::{Parser, Subcommand}; -use config::OptionalSet; use lazy_static::lazy_static; use nym_bin_common::build_information::BinaryBuildInformation; use nym_bin_common::completions::{fig_generate, ArgShell}; +use nym_config::OptionalSet; use std::error::Error; use std::net::IpAddr; @@ -88,13 +88,13 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { BaseConfig::with_custom_nym_apis, args.nym_apis, nym_network_defaults::var_names::NYM_API, - config::parse_urls, + nym_config::parse_urls, ) .with_optional_custom_env_ext( BaseConfig::with_custom_nyxd, args.nyxd_urls, nym_network_defaults::var_names::NYXD, - config::parse_urls, + nym_config::parse_urls, ) .with_optional_ext( BaseConfig::with_disabled_credentials, diff --git a/clients/native/src/commands/run.rs b/clients/native/src/commands/run.rs index 0c001fc892..62ca82e4dd 100644 --- a/clients/native/src/commands/run.rs +++ b/clients/native/src/commands/run.rs @@ -11,9 +11,9 @@ use crate::{ }; use clap::Args; -use config::NymConfig; use log::*; use nym_bin_common::version_checker::is_minor_version_compatible; +use nym_config::NymConfig; use nym_crypto::asymmetric::identity; #[derive(Args, Clone)] diff --git a/clients/native/src/commands/upgrade.rs b/clients/native/src/commands/upgrade.rs index a959c2d701..97e7dddba6 100644 --- a/clients/native/src/commands/upgrade.rs +++ b/clients/native/src/commands/upgrade.rs @@ -3,8 +3,8 @@ use crate::client::config::{Config, MISSING_VALUE}; -use config::NymConfig; use nym_bin_common::version_checker::Version; +use nym_config::NymConfig; use clap::Args; use std::fmt::Display; diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 4a1d8681bd..12f84f0d06 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -30,7 +30,7 @@ url = "2.2" nym-bin-common = { path = "../../common/bin-common" } client-core = { path = "../client-core", features = ["fs-surb-storage"] } coconut-interface = { path = "../../common/coconut-interface" } -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } credential-storage = { path = "../../common/credential-storage", optional = true } mobile-storage = { path = "../../common/mobile-storage", optional = true } credentials = { path = "../../common/credentials" } diff --git a/clients/socks5/src/client/config/mod.rs b/clients/socks5/src/client/config/mod.rs index 79ad8e1f54..15791ba9fa 100644 --- a/clients/socks5/src/client/config/mod.rs +++ b/clients/socks5/src/client/config/mod.rs @@ -5,8 +5,8 @@ use crate::client::config::template::config_template; pub use client_core::config::Config as BaseConfig; pub use client_core::config::MISSING_VALUE; use client_core::config::{ClientCoreConfigTrait, DebugConfig}; -use config::defaults::DEFAULT_SOCKS5_LISTENING_PORT; -use config::{NymConfig, OptionalSet}; +use nym_config::defaults::DEFAULT_SOCKS5_LISTENING_PORT; +use nym_config::{NymConfig, OptionalSet}; use nym_sphinx::addressing::clients::Recipient; use serde::{Deserialize, Serialize}; use service_providers_common::interface::ProviderInterfaceVersion; diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index 8cb67c278e..2c6ae23730 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -7,7 +7,7 @@ use crate::{ error::Socks5ClientError, }; use clap::Args; -use config::NymConfig; +use nym_config::NymConfig; use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index 2fc8f508c4..9e5b903de6 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -4,10 +4,10 @@ use crate::client::config::{BaseConfig, Config}; use clap::CommandFactory; use clap::{Parser, Subcommand}; -use config::OptionalSet; use lazy_static::lazy_static; use nym_bin_common::build_information::BinaryBuildInformation; use nym_bin_common::completions::{fig_generate, ArgShell}; +use nym_config::OptionalSet; use std::error::Error; pub mod init; @@ -87,13 +87,13 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { BaseConfig::with_custom_nym_apis, args.nym_apis, nym_network_defaults::var_names::NYM_API, - config::parse_urls, + nym_config::parse_urls, ) .with_optional_custom_env_ext( BaseConfig::with_custom_nyxd, args.nyxd_urls, nym_network_defaults::var_names::NYXD, - config::parse_urls, + nym_config::parse_urls, ) .with_optional_ext( BaseConfig::with_disabled_credentials, diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index d31388547c..6bd381b678 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -8,9 +8,9 @@ use crate::{ }; use clap::Args; -use config::NymConfig; use log::*; use nym_bin_common::version_checker::is_minor_version_compatible; +use nym_config::NymConfig; use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; diff --git a/clients/socks5/src/commands/upgrade.rs b/clients/socks5/src/commands/upgrade.rs index 25f5802102..982bae4634 100644 --- a/clients/socks5/src/commands/upgrade.rs +++ b/clients/socks5/src/commands/upgrade.rs @@ -3,8 +3,8 @@ use crate::client::config::{Config, MISSING_VALUE}; -use config::NymConfig; use nym_bin_common::version_checker::Version; +use nym_config::NymConfig; use clap::Args; use std::{fmt::Display, process}; diff --git a/common/client-libs/validator-client/Cargo.toml b/common/client-libs/validator-client/Cargo.toml index 3774ba7eb7..379cf546b0 100644 --- a/common/client-libs/validator-client/Cargo.toml +++ b/common/client-libs/validator-client/Cargo.toml @@ -37,7 +37,7 @@ nym-api-requests = { path = "../../../nym-api/nym-api-requests" } # perhaps after https://github.com/cosmos/cosmos-rust/pull/97 is resolved (and tendermint-rs is updated) async-trait = { version = "0.1.51", optional = true } bip39 = { version = "1", features = ["rand"], optional = true } -config = { path = "../../config", optional = true } +nym-config = { path = "../../config", optional = true } cosmrs = { git = "https://github.com/neacsu/cosmos-rust", branch = "neacsu/feegrant_support", features = ["rpc", "bip32", "cosmwasm"], optional = true} cw3 = { version = "0.13.4", optional = true } cw4 = { version = "0.13.4", optional = true } @@ -46,7 +46,7 @@ flate2 = { version = "1.0.20", optional = true } sha2 = { version = "0.9.5", optional = true } itertools = { version = "0.10", optional = true } cosmwasm-std = { version = "1.0.0", optional = true } -execute = { path = "../../execute" } +nym-execute = { path = "../../execute" } [dev-dependencies] ts-rs = "6.1.2" @@ -55,7 +55,7 @@ ts-rs = "6.1.2" nyxd-client = [ "async-trait", "bip39", - "config", + "nym-config", "cosmrs", "cw3", "cw4", diff --git a/common/client-libs/validator-client/src/nyxd/fee/gas_price.rs b/common/client-libs/validator-client/src/nyxd/fee/gas_price.rs index 13cffc92fc..10ae3a7bb7 100644 --- a/common/client-libs/validator-client/src/nyxd/fee/gas_price.rs +++ b/common/client-libs/validator-client/src/nyxd/fee/gas_price.rs @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 use crate::nyxd::error::NyxdError; -use config::defaults; use cosmrs::tx::Gas; use cosmrs::Coin; use cosmwasm_std::{Decimal, Fraction, Uint128}; +use nym_config::defaults; use std::ops::Mul; use std::str::FromStr; diff --git a/common/client-libs/validator-client/src/nyxd/mod.rs b/common/client-libs/validator-client/src/nyxd/mod.rs index 3c20b2acf4..e02672682b 100644 --- a/common/client-libs/validator-client/src/nyxd/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/mod.rs @@ -15,8 +15,8 @@ use cosmrs::rpc::query::Query; use cosmrs::rpc::Error as TendermintRpcError; use cosmrs::rpc::HttpClientUrl; use cosmrs::tx::Msg; -use execute::execute; use log::debug; +use nym_execute::execute; use nym_mixnet_contract_common::MixId; use nym_network_defaults::{ChainDetails, NymNetworkDetails}; use nym_vesting_contract_common::ExecuteMsg as VestingExecuteMsg; @@ -162,7 +162,7 @@ impl NyxdClient { // maybe the wallet could be made into a generic, but for now, let's just have this one implementation pub fn connect_with_signer( config: Config, - network: config::defaults::NymNetworkDetails, + network: nym_config::defaults::NymNetworkDetails, endpoint: U, signer: DirectSecp256k1HdWallet, gas_price: Option, diff --git a/common/client-libs/validator-client/src/nyxd/wallet/mod.rs b/common/client-libs/validator-client/src/nyxd/wallet/mod.rs index 30242b433f..f58d059c6d 100644 --- a/common/client-libs/validator-client/src/nyxd/wallet/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/wallet/mod.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use crate::nyxd::error::NyxdError; -use config::defaults; use cosmrs::bip32::{DerivationPath, XPrv}; use cosmrs::crypto::secp256k1::{Signature, SigningKey}; use cosmrs::crypto::PublicKey; use cosmrs::tx::SignDoc; use cosmrs::{tx, AccountId}; +use nym_config::defaults; /// Derivation information required to derive a keypair and an address from a mnemonic. #[derive(Debug, Clone)] diff --git a/common/config/Cargo.toml b/common/config/Cargo.toml index 035d555765..496d483d75 100644 --- a/common/config/Cargo.toml +++ b/common/config/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "config" +name = "nym-config" version = "0.1.0" authors = ["Jedrzej Stuczynski "] edition = "2021" diff --git a/common/execute/Cargo.toml b/common/execute/Cargo.toml index 551f1728fb..634737397f 100644 --- a/common/execute/Cargo.toml +++ b/common/execute/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "execute" +name = "nym-execute" version = "0.1.0" edition = "2021" diff --git a/common/nonexhaustive-delayqueue/Cargo.toml b/common/nonexhaustive-delayqueue/Cargo.toml index 9cc7a8d2a7..975eb631fe 100644 --- a/common/nonexhaustive-delayqueue/Cargo.toml +++ b/common/nonexhaustive-delayqueue/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "nonexhaustive-delayqueue" +name = "nym-nonexhaustive-delayqueue" version = "0.1.0" authors = ["Jędrzej Stuczyński "] edition = "2021" @@ -19,4 +19,4 @@ rev = "b9d1a54ad514c2f230a026afe0dde341e98cd7b6" version = "0.4.4" [target."cfg(target_arch = \"wasm32\")".dependencies.futures-core] -version = "0.3.0" \ No newline at end of file +version = "0.3.0" diff --git a/common/statistics/Cargo.toml b/common/statistics/Cargo.toml index 65004dbc40..5649e22414 100644 --- a/common/statistics/Cargo.toml +++ b/common/statistics/Cargo.toml @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 [package] -name = "statistics-common" +name = "nym-statistics-common" version = "1.0.1" edition = "2021" diff --git a/common/types/Cargo.toml b/common/types/Cargo.toml index 7b8ddaac39..1bdf334f42 100644 --- a/common/types/Cargo.toml +++ b/common/types/Cargo.toml @@ -27,7 +27,7 @@ validator-client = { path = "../../common/client-libs/validator-client", feature ] } nym-mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract" } nym-vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract" } -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } coconut-interface = { path = "../../common/coconut-interface" } # Used for Type conversion, can be extracted but its a lot of work nym-vesting-contract = { path = "../../contracts/vesting" } diff --git a/common/types/src/account.rs b/common/types/src/account.rs index 47c6fc0c6d..12bc12efd4 100644 --- a/common/types/src/account.rs +++ b/common/types/src/account.rs @@ -1,5 +1,5 @@ use crate::currency::{CurrencyDenom, DecCoin}; -use config::defaults::DenomDetails; +use nym_config::defaults::DenomDetails; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/common/types/src/currency.rs b/common/types/src/currency.rs index c9ba2e908b..df0a735a69 100644 --- a/common/types/src/currency.rs +++ b/common/types/src/currency.rs @@ -1,7 +1,7 @@ use crate::error::TypesError; -use config::defaults::{DenomDetails, DenomDetailsOwned, NymNetworkDetails}; use cosmwasm_std::Fraction; use cosmwasm_std::{Decimal, Uint128}; +use nym_config::defaults::{DenomDetails, DenomDetailsOwned, NymNetworkDetails}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; diff --git a/contracts/mixnet/Cargo.toml b/contracts/mixnet/Cargo.toml index 7e364c873f..6533083b92 100644 --- a/contracts/mixnet/Cargo.toml +++ b/contracts/mixnet/Cargo.toml @@ -24,7 +24,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract", package = "nym-mixnet-contract-common", version = "0.1.0" } vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract", package = "nym-vesting-contract-common", version = "0.1.0" } -#config = { path = "../../common/config"} +#nym-config = { path = "../../common/config"} cosmwasm-std = "1.0.0" cosmwasm-storage = "1.0.0" diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 60f8c4a913..6e3bb78e08 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -54,7 +54,7 @@ url = { version = "2.2", features = ["serde"] } # internal coconut-interface = { path = "../common/coconut-interface" } credentials = { path = "../common/credentials" } -config = { path = "../common/config" } +nym-config = { path = "../common/config" } nym-crypto = { path = "../common/crypto" } nym-bin-common = { path = "../common/bin-common" } gateway-requests = { path = "gateway-requests" } @@ -63,7 +63,7 @@ mixnode-common = { path = "../common/mixnode-common" } nym-network-defaults = { path = "../common/network-defaults" } nym-sphinx = { path = "../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore" } -statistics-common = { path = "../common/statistics" } +nym-statistics-common = { path = "../common/statistics" } nym-api-requests = { path = "../nym-api/nym-api-requests" } nym-task = { path = "../common/task" } validator-client = { path = "../common/client-libs/validator-client", features = [ diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index 15aff4ca9b..02eefb6f69 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -7,7 +7,7 @@ use crate::{ OutputFormat, }; use clap::Args; -use config::NymConfig; +use nym_config::NymConfig; use nym_crypto::asymmetric::{encryption, identity}; use std::error::Error; use std::net::IpAddr; diff --git a/gateway/src/commands/mod.rs b/gateway/src/commands/mod.rs index f413314662..786b15d9c7 100644 --- a/gateway/src/commands/mod.rs +++ b/gateway/src/commands/mod.rs @@ -5,9 +5,9 @@ use crate::error::GatewayError; use crate::{config::Config, Cli}; use clap::CommandFactory; use clap::Subcommand; -use config::OptionalSet; use nym_bin_common::completions::{fig_generate, ArgShell}; use nym_bin_common::version_checker; +use nym_config::OptionalSet; use nym_network_defaults::var_names::NYXD; use nym_network_defaults::var_names::{BECH32_PREFIX, NYM_API, STATISTICS_SERVICE_DOMAIN_ADDRESS}; use std::error::Error; @@ -104,7 +104,7 @@ pub(crate) fn override_config( Config::with_custom_nym_apis, args.nym_apis, NYM_API, - config::parse_urls, + nym_config::parse_urls, ) .with_optional(Config::with_enabled_statistics, args.enabled_statistics) .with_optional_env( @@ -123,7 +123,7 @@ pub(crate) fn override_config( Config::with_custom_validator_nyxd, args.nyxd_urls, NYXD, - config::parse_urls, + nym_config::parse_urls, ) .with_optional( Config::with_only_coconut_credentials, diff --git a/gateway/src/commands/upgrade.rs b/gateway/src/commands/upgrade.rs index a77fe9ee07..e3f7e10bdf 100644 --- a/gateway/src/commands/upgrade.rs +++ b/gateway/src/commands/upgrade.rs @@ -3,8 +3,8 @@ use crate::config::{Config, MISSING_VALUE}; use clap::Args; -use config::NymConfig; use nym_bin_common::version_checker::Version; +use nym_config::NymConfig; use std::fmt::Display; use std::process; diff --git a/gateway/src/config/mod.rs b/gateway/src/config/mod.rs index f295cd1df8..2442632d59 100644 --- a/gateway/src/config/mod.rs +++ b/gateway/src/config/mod.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use crate::config::template::config_template; -use config::defaults::{DEFAULT_CLIENT_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT}; -use config::NymConfig; +use nym_config::defaults::{DEFAULT_CLIENT_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT}; +use nym_config::NymConfig; use nym_network_defaults::mainnet::{NYM_API, NYXD_URL, STATISTICS_SERVICE_DOMAIN_ADDRESS}; use serde::{Deserialize, Serialize}; use std::net::IpAddr; diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index 3d7930bc8f..cf716d1e10 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -18,10 +18,10 @@ use log::*; use mixnet_client::forwarder::{MixForwardingSender, PacketForwarder}; use nym_crypto::asymmetric::{encryption, identity}; use nym_network_defaults::NymNetworkDetails; +use nym_statistics_common::collector::StatisticsSender; use nym_task::{TaskClient, TaskManager}; use rand::seq::SliceRandom; use rand::thread_rng; -use statistics_common::collector::StatisticsSender; use std::error::Error; use std::net::SocketAddr; use std::process; diff --git a/gateway/src/node/statistics/collector.rs b/gateway/src/node/statistics/collector.rs index 62014d0d16..4f1035d979 100644 --- a/gateway/src/node/statistics/collector.rs +++ b/gateway/src/node/statistics/collector.rs @@ -6,7 +6,7 @@ use sqlx::types::chrono::{DateTime, Utc}; use std::time::Duration; use url::Url; -use statistics_common::{ +use nym_statistics_common::{ api::build_and_send_statistics_request, collector::StatisticsCollector, error::StatsError, StatsData, StatsGatewayData, StatsMessage, }; diff --git a/gateway/src/support/config.rs b/gateway/src/support/config.rs index 90576a4d89..4a6bda91a4 100644 --- a/gateway/src/support/config.rs +++ b/gateway/src/support/config.rs @@ -4,8 +4,8 @@ use crate::commands::{override_config, OverrideConfig}; use crate::config::Config; use crate::error::GatewayError; -use config::NymConfig; use log::error; +use nym_config::NymConfig; pub(crate) fn build_config>( id: String, diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index f3056e19cd..cbe1bd77e0 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -40,11 +40,11 @@ url = { version = "2.2", features = ["serde"] } atty = "0.2" ## internal -config = { path="../common/config" } +nym-config = { path="../common/config" } nym-crypto = { path="../common/crypto" } mixnet-client = { path="../common/client-libs/mixnet-client" } mixnode-common = { path="../common/mixnode-common" } -nonexhaustive-delayqueue = { path="../common/nonexhaustive-delayqueue" } +nym-nonexhaustive-delayqueue = { path="../common/nonexhaustive-delayqueue" } nym-sphinx = { path="../common/nymsphinx" } nym-pemstore = { path = "../common/pemstore", version = "0.1.0" } nym-task = { path = "../common/task" } diff --git a/mixnode/src/commands/describe.rs b/mixnode/src/commands/describe.rs index d9cecbe410..160e5de633 100644 --- a/mixnode/src/commands/describe.rs +++ b/mixnode/src/commands/describe.rs @@ -5,7 +5,7 @@ use crate::config::Config; use crate::node::node_description::NodeDescription; use clap::Args; use colored::Colorize; -use config::NymConfig; +use nym_config::NymConfig; use std::io; use std::io::Write; diff --git a/mixnode/src/commands/init.rs b/mixnode/src/commands/init.rs index 4aa3f987df..9dc60f2369 100644 --- a/mixnode/src/commands/init.rs +++ b/mixnode/src/commands/init.rs @@ -7,7 +7,7 @@ use crate::node::MixNode; use crate::OutputFormat; use crate::{commands::override_config, config::persistence::pathfinder::MixNodePathfinder}; use clap::Args; -use config::NymConfig; +use nym_config::NymConfig; use nym_crypto::asymmetric::{encryption, identity}; use std::net::IpAddr; use validator_client::nyxd; diff --git a/mixnode/src/commands/mod.rs b/mixnode/src/commands/mod.rs index a3796080d6..6854595a46 100644 --- a/mixnode/src/commands/mod.rs +++ b/mixnode/src/commands/mod.rs @@ -5,10 +5,10 @@ use crate::{config::Config, Cli}; use clap::CommandFactory; use clap::Subcommand; use colored::Colorize; -use config::defaults::var_names::{BECH32_PREFIX, NYM_API}; -use config::OptionalSet; use nym_bin_common::completions::{fig_generate, ArgShell}; use nym_bin_common::version_checker; +use nym_config::defaults::var_names::{BECH32_PREFIX, NYM_API}; +use nym_config::OptionalSet; use nym_crypto::bech32_address_validation; use std::net::IpAddr; use std::process; @@ -100,7 +100,7 @@ fn override_config(mut config: Config, args: OverrideConfig) -> Config { Config::with_custom_nym_apis, args.nym_apis, NYM_API, - config::parse_urls, + nym_config::parse_urls, ) .with_optional( |cfg, wallet_address| { diff --git a/mixnode/src/commands/node_details.rs b/mixnode/src/commands/node_details.rs index 98298cea74..9f1d0745a7 100644 --- a/mixnode/src/commands/node_details.rs +++ b/mixnode/src/commands/node_details.rs @@ -5,7 +5,7 @@ use crate::config::Config; use crate::node::MixNode; use crate::OutputFormat; use clap::Args; -use config::NymConfig; +use nym_config::NymConfig; #[derive(Args)] pub(crate) struct NodeDetails { diff --git a/mixnode/src/commands/run.rs b/mixnode/src/commands/run.rs index e578c422c1..6c2509d6a7 100644 --- a/mixnode/src/commands/run.rs +++ b/mixnode/src/commands/run.rs @@ -7,7 +7,7 @@ use crate::config::Config; use crate::node::MixNode; use crate::OutputFormat; use clap::Args; -use config::NymConfig; +use nym_config::NymConfig; use std::net::IpAddr; use validator_client::nyxd; diff --git a/mixnode/src/commands/sign.rs b/mixnode/src/commands/sign.rs index 8c2882872e..6c5aa74e3b 100644 --- a/mixnode/src/commands/sign.rs +++ b/mixnode/src/commands/sign.rs @@ -8,8 +8,8 @@ use crate::config::{persistence::pathfinder::MixNodePathfinder, Config}; use crate::node::MixNode; use anyhow::{anyhow, Result}; use clap::{ArgGroup, Args}; -use config::NymConfig; use log::error; +use nym_config::NymConfig; use nym_crypto::asymmetric::identity; use validator_client::nyxd; diff --git a/mixnode/src/commands/upgrade.rs b/mixnode/src/commands/upgrade.rs index b69b418181..ea636cdf14 100644 --- a/mixnode/src/commands/upgrade.rs +++ b/mixnode/src/commands/upgrade.rs @@ -3,8 +3,8 @@ use crate::config::{missing_string_value, Config}; use clap::Args; -use config::NymConfig; use nym_bin_common::version_checker::Version; +use nym_config::NymConfig; use std::fmt::Display; use std::process; diff --git a/mixnode/src/config/mod.rs b/mixnode/src/config/mod.rs index 6183ba073e..85e928c902 100644 --- a/mixnode/src/config/mod.rs +++ b/mixnode/src/config/mod.rs @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 use crate::config::template::config_template; -use config::defaults::mainnet::NYM_API; -use config::defaults::{ +use nym_config::defaults::mainnet::NYM_API; +use nym_config::defaults::{ DEFAULT_HTTP_API_LISTENING_PORT, DEFAULT_MIX_LISTENING_PORT, DEFAULT_VERLOC_LISTENING_PORT, }; -use config::NymConfig; +use nym_config::NymConfig; use serde::{Deserialize, Deserializer, Serialize}; use std::net::{IpAddr, SocketAddr}; use std::path::PathBuf; diff --git a/mixnode/src/main.rs b/mixnode/src/main.rs index d5bf1ed947..92b28cb6b8 100644 --- a/mixnode/src/main.rs +++ b/mixnode/src/main.rs @@ -4,7 +4,7 @@ #[macro_use] extern crate rocket; -use ::config::defaults::setup_env; +use ::nym_config::defaults::setup_env; use clap::{crate_name, crate_version, Parser, ValueEnum}; use lazy_static::lazy_static; use nym_bin_common::logging::setup_logging; diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index b2443aff71..b1113481e1 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -19,10 +19,10 @@ use crate::node::node_statistics::SharedNodeStats; use crate::node::packet_delayforwarder::{DelayForwarder, PacketDelayForwardSender}; use crate::OutputFormat; use colored::Colorize; -use config::NymConfig; use log::{error, info, warn}; use mixnode_common::verloc::{self, AtomicVerlocResult, VerlocMeasurer}; use nym_bin_common::version_checker::parse_version; +use nym_config::NymConfig; use nym_crypto::asymmetric::{encryption, identity}; use nym_task::{TaskClient, TaskManager}; use rand::seq::SliceRandom; diff --git a/mixnode/src/node/packet_delayforwarder.rs b/mixnode/src/node/packet_delayforwarder.rs index 557440301f..332d959ed6 100644 --- a/mixnode/src/node/packet_delayforwarder.rs +++ b/mixnode/src/node/packet_delayforwarder.rs @@ -4,7 +4,7 @@ use crate::node::node_statistics::UpdateSender; use futures::channel::mpsc; use futures::StreamExt; -use nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue}; +use nym_nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue}; use nym_sphinx::forwarding::packet::MixPacket; use std::io; use tokio::time::Instant; diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index 5db16a4b62..bae10eece0 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -68,7 +68,7 @@ schemars = { version = "0.8", features = ["preserve_order"] } coconut-bandwidth-contract-common = { path = "../common/cosmwasm-smart-contracts/coconut-bandwidth-contract" } coconut-dkg-common = { path = "../common/cosmwasm-smart-contracts/coconut-dkg" } coconut-interface = { path = "../common/coconut-interface" } -config = { path = "../common/config" } +nym-config = { path = "../common/config" } cosmwasm-std = "1.0.0" credential-storage = { path = "../common/credential-storage" } credentials = { path = "../common/credentials" } diff --git a/nym-api/src/coconut/deposit.rs b/nym-api/src/coconut/deposit.rs index b6b472288f..356850aebf 100644 --- a/nym-api/src/coconut/deposit.rs +++ b/nym-api/src/coconut/deposit.rs @@ -95,7 +95,7 @@ pub async fn extract_encryption_key( mod test { use super::*; use crate::coconut::tests::tx_entry_fixture; - use config::defaults::VOUCHER_INFO; + use nym_config::defaults::VOUCHER_INFO; use nymcoconut::{prepare_blind_sign, BlindSignRequest, Parameters}; use rand_07::rngs::OsRng; use std::str::FromStr; diff --git a/nym-api/src/coconut/mod.rs b/nym-api/src/coconut/mod.rs index 0751d1c3b3..265da682b7 100644 --- a/nym-api/src/coconut/mod.rs +++ b/nym-api/src/coconut/mod.rs @@ -15,7 +15,6 @@ use coconut_interface::KeyPair as CoconutKeyPair; use coconut_interface::{ Attribute, BlindSignRequest, BlindedSignature, Parameters, VerificationKey, }; -use config::defaults::NYM_API_VERSION; use credentials::coconut::params::{ NymApiCredentialEncryptionAlgorithm, NymApiCredentialHkdfAlgorithm, }; @@ -24,6 +23,7 @@ use keypair::KeyPair; use nym_api_requests::coconut::{ BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, }; +use nym_config::defaults::NYM_API_VERSION; use nym_crypto::asymmetric::encryption; use nym_crypto::shared_key::new_ephemeral_shared_key; use nym_crypto::symmetric::stream_cipher; diff --git a/nym-api/src/coconut/tests.rs b/nym-api/src/coconut/tests.rs index a8168ab63d..dd83eefc9e 100644 --- a/nym-api/src/coconut/tests.rs +++ b/nym-api/src/coconut/tests.rs @@ -11,7 +11,6 @@ use coconut_bandwidth_contract_common::spend_credential::{ SpendCredential, SpendCredentialResponse, }; use coconut_interface::{hash_to_scalar, Credential, VerificationKey}; -use config::defaults::VOUCHER_INFO; use cosmwasm_std::{to_binary, Addr, CosmosMsg, Decimal, WasmMsg}; use credentials::coconut::bandwidth::BandwidthVoucher; use credentials::coconut::params::{ @@ -20,6 +19,7 @@ use credentials::coconut::params::{ use nym_api_requests::coconut::{ BlindSignRequestBody, BlindedSignatureResponse, VerifyCredentialBody, VerifyCredentialResponse, }; +use nym_config::defaults::VOUCHER_INFO; use nym_crypto::shared_key::recompute_shared_key; use nym_crypto::symmetric::stream_cipher; use nymcoconut::tests::helpers::theta_from_keys_and_attributes; diff --git a/nym-api/src/main.rs b/nym-api/src/main.rs index c950e25032..e0e862cf2d 100644 --- a/nym-api/src/main.rs +++ b/nym-api/src/main.rs @@ -11,15 +11,15 @@ use crate::support::cli::CliArgs; use crate::support::config::Config; use crate::support::storage; use crate::support::storage::NymApiStorage; -use ::config::defaults::setup_env; +use ::nym_config::defaults::setup_env; use anyhow::Result; use circulating_supply_api::cache::CirculatingSupplyCache; use clap::Parser; use coconut::dkg::controller::DkgController; -use config::NymConfig; use log::info; use node_status_api::NodeStatusCache; use nym_bin_common::logging::setup_logging; +use nym_config::NymConfig; use nym_contract_cache::cache::NymContractCache; use nym_task::TaskManager; use rand::rngs::OsRng; diff --git a/nym-api/src/network_monitor/monitor/sender.rs b/nym-api/src/network_monitor/monitor/sender.rs index 6911cd0dbb..1a58db1cae 100644 --- a/nym-api/src/network_monitor/monitor/sender.rs +++ b/nym-api/src/network_monitor/monitor/sender.rs @@ -6,7 +6,6 @@ use crate::network_monitor::monitor::gateway_clients_cache::{ }; use crate::network_monitor::monitor::gateways_pinger::GatewayPinger; use crate::network_monitor::monitor::receiver::{GatewayClientUpdate, GatewayClientUpdateSender}; -use config::defaults::REMAINING_BANDWIDTH_THRESHOLD; use credential_storage::PersistentStorage; use futures::channel::mpsc; use futures::stream::{self, FuturesUnordered, StreamExt}; @@ -15,6 +14,7 @@ use futures::{Future, Stream}; use gateway_client::error::GatewayClientError; use gateway_client::{AcknowledgementReceiver, GatewayClient, MixnetMessageReceiver}; use log::{debug, info, trace, warn}; +use nym_config::defaults::REMAINING_BANDWIDTH_THRESHOLD; use nym_crypto::asymmetric::identity::{self, PUBLIC_KEY_LENGTH}; use nym_sphinx::forwarding::packet::MixPacket; use nym_task::TaskClient; diff --git a/nym-api/src/support/cli/mod.rs b/nym-api/src/support/cli/mod.rs index 3bc86cdb50..66cde03562 100644 --- a/nym-api/src/support/cli/mod.rs +++ b/nym-api/src/support/cli/mod.rs @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 use super::config::Config; -use ::config::defaults::var_names::{MIXNET_CONTRACT_ADDRESS, VESTING_CONTRACT_ADDRESS}; +use ::nym_config::defaults::var_names::{MIXNET_CONTRACT_ADDRESS, VESTING_CONTRACT_ADDRESS}; use anyhow::Result; use clap::Parser; -use config::{NymConfig, OptionalSet}; use lazy_static::lazy_static; use nym_bin_common::build_information::BinaryBuildInformation; +use nym_config::{NymConfig, OptionalSet}; use std::fs; use validator_client::nyxd; diff --git a/nym-api/src/support/config/mod.rs b/nym-api/src/support/config/mod.rs index 1b2645c393..25d949cd11 100644 --- a/nym-api/src/support/config/mod.rs +++ b/nym-api/src/support/config/mod.rs @@ -2,9 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 use self::template::config_template; -use config::defaults::mainnet::{MIXNET_CONTRACT_ADDRESS, VESTING_CONTRACT_ADDRESS}; -use config::defaults::DEFAULT_NYM_API_PORT; -use config::NymConfig; +use nym_config::defaults::mainnet::{MIXNET_CONTRACT_ADDRESS, VESTING_CONTRACT_ADDRESS}; +use nym_config::defaults::DEFAULT_NYM_API_PORT; +use nym_config::NymConfig; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::time::Duration; diff --git a/nym-api/src/support/nyxd/mod.rs b/nym-api/src/support/nyxd/mod.rs index c69b361c52..7d624cc03e 100644 --- a/nym-api/src/support/nyxd/mod.rs +++ b/nym-api/src/support/nyxd/mod.rs @@ -13,9 +13,9 @@ use coconut_dkg_common::{ types::{EncodedBTEPublicKeyWithProof, Epoch, EpochId}, verification_key::{ContractVKShare, VerificationKeyShare}, }; -use config::defaults::{ChainDetails, NymNetworkDetails, DEFAULT_NYM_API_PORT}; use cw3::ProposalResponse; use cw4::MemberResponse; +use nym_config::defaults::{ChainDetails, NymNetworkDetails, DEFAULT_NYM_API_PORT}; use nym_contracts_common::dealings::ContractSafeBytes; use nym_mixnet_contract_common::families::{Family, FamilyHead}; use nym_mixnet_contract_common::mixnode::MixNodeDetails; diff --git a/nym-connect/desktop/src-tauri/Cargo.toml b/nym-connect/desktop/src-tauri/Cargo.toml index 29e22ed422..92efb8b1dc 100644 --- a/nym-connect/desktop/src-tauri/Cargo.toml +++ b/nym-connect/desktop/src-tauri/Cargo.toml @@ -47,7 +47,7 @@ yaml-rust = "0.4" client-core = { path = "../../../clients/client-core" } nym-api-requests = { path = "../../../nym-api/nym-api-requests" } nym-contracts-common = { path = "../../../common/cosmwasm-smart-contracts/contracts-common"} -config-common = { path = "../../../common/config", package = "config" } +nym-config-common = { path = "../../../common/config", package = "nym-config" } nym-crypto = { path = "../../../common/crypto" } nym-bin-common = { path = "../../../common/bin-common"} nym-socks5-client = { path = "../../../clients/socks5" } diff --git a/nym-connect/desktop/src-tauri/src/config/mod.rs b/nym-connect/desktop/src-tauri/src/config/mod.rs index 4305427505..43691fb49c 100644 --- a/nym-connect/desktop/src-tauri/src/config/mod.rs +++ b/nym-connect/desktop/src-tauri/src/config/mod.rs @@ -3,7 +3,7 @@ use crate::{ state::State, }; use client_core::config::Config as BaseConfig; -use config_common::NymConfig; +use nym_config_common::NymConfig; use nym_crypto::asymmetric::identity; use nym_socks5::client::config::Config as Socks5Config; use std::path::PathBuf; @@ -124,10 +124,10 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str log::trace!("Creating config for id: {}", id); let mut config = Config::new(id.as_str(), &provider_address); - if let Ok(raw_validators) = std::env::var(config_common::defaults::var_names::NYM_API) { + if let Ok(raw_validators) = std::env::var(nym_config_common::defaults::var_names::NYM_API) { config .get_base_mut() - .set_custom_nym_apis(config_common::parse_urls(&raw_validators)); + .set_custom_nym_apis(nym_config_common::parse_urls(&raw_validators)); } let chosen_gateway_id = identity::PublicKey::from_base58_string(chosen_gateway_id) diff --git a/nym-connect/desktop/src-tauri/src/main.rs b/nym-connect/desktop/src-tauri/src/main.rs index 3110f0c17d..76a7666406 100644 --- a/nym-connect/desktop/src-tauri/src/main.rs +++ b/nym-connect/desktop/src-tauri/src/main.rs @@ -5,7 +5,7 @@ use std::sync::Arc; -use config_common::defaults::setup_env; +use nym_config_common::defaults::setup_env; use tauri::Manager; use tokio::sync::RwLock; diff --git a/nym-connect/desktop/src-tauri/src/state.rs b/nym-connect/desktop/src-tauri/src/state.rs index 2262ca316b..6afaac0dee 100644 --- a/nym-connect/desktop/src-tauri/src/state.rs +++ b/nym-connect/desktop/src-tauri/src/state.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use ::config_common::NymConfig; +use ::nym_config_common::NymConfig; use client_core::error::ClientCoreStatusMessage; use futures::SinkExt; use tap::TapFallible; diff --git a/nym-connect/desktop/src-tauri/src/tasks.rs b/nym-connect/desktop/src-tauri/src/tasks.rs index 389ce7a733..9d9ae00c92 100644 --- a/nym-connect/desktop/src-tauri/src/tasks.rs +++ b/nym-connect/desktop/src-tauri/src/tasks.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use tap::TapFallible; use tokio::sync::RwLock; -use config_common::NymConfig; +use nym_config_common::NymConfig; use nym_socks5::client::NymClient as Socks5NymClient; use nym_socks5::client::{config::Config as Socks5Config, Socks5ControlMessageSender}; diff --git a/nym-connect/mobile/src-tauri/Cargo.lock b/nym-connect/mobile/src-tauri/Cargo.lock index 2260ee2a59..1b1d0b29e7 100644 --- a/nym-connect/mobile/src-tauri/Cargo.lock +++ b/nym-connect/mobile/src-tauri/Cargo.lock @@ -615,7 +615,6 @@ name = "client-core" version = "1.1.10" dependencies = [ "async-trait", - "config", "dashmap", "dirs", "futures", @@ -624,8 +623,9 @@ dependencies = [ "gloo-timers", "humantime-serde", "log", - "nonexhaustive-delayqueue", + "nym-config", "nym-crypto", + "nym-nonexhaustive-delayqueue", "nym-pemstore", "nym-sphinx", "nym-task", @@ -768,19 +768,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "config" -version = "0.1.0" -dependencies = [ - "cfg-if", - "handlebars", - "log", - "nym-network-defaults", - "serde", - "toml", - "url", -] - [[package]] name = "const-oid" version = "0.7.1" @@ -1648,14 +1635,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "execute" -version = "0.1.0" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "eyre" version = "0.6.8" @@ -3374,18 +3353,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "nonexhaustive-delayqueue" -version = "0.1.0" -dependencies = [ - "futures-core", - "slab", - "tokio", - "tokio-stream", - "tokio-util", - "wasm-timer", -] - [[package]] name = "notify-rust" version = "4.7.1" @@ -3508,6 +3475,19 @@ dependencies = [ "vergen 7.5.1", ] +[[package]] +name = "nym-config" +version = "0.1.0" +dependencies = [ + "cfg-if", + "handlebars", + "log", + "nym-network-defaults", + "serde", + "toml", + "url", +] + [[package]] name = "nym-connect" version = "1.1.9" @@ -3516,7 +3496,6 @@ dependencies = [ "bip39", "chrono", "client-core", - "config", "dirs", "eyre", "fern", @@ -3526,6 +3505,7 @@ dependencies = [ "log", "nym-api-requests", "nym-bin-common", + "nym-config", "nym-contracts-common", "nym-crypto", "nym-socks5-client", @@ -3582,6 +3562,14 @@ dependencies = [ "x25519-dalek", ] +[[package]] +name = "nym-execute" +version = "0.1.0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "nym-mixnet-contract-common" version = "0.1.0" @@ -3612,6 +3600,18 @@ dependencies = [ "url", ] +[[package]] +name = "nym-nonexhaustive-delayqueue" +version = "0.1.0" +dependencies = [ + "futures-core", + "slab", + "tokio", + "tokio-stream", + "tokio-util", + "wasm-timer", +] + [[package]] name = "nym-pemstore" version = "0.1.0" @@ -3626,7 +3626,6 @@ dependencies = [ "clap", "client-core", "coconut-interface", - "config", "credentials", "dirs", "futures", @@ -3636,6 +3635,7 @@ dependencies = [ "log", "mobile-storage", "nym-bin-common", + "nym-config", "nym-crypto", "nym-network-defaults", "nym-pemstore", @@ -6768,12 +6768,10 @@ dependencies = [ "coconut-dkg-common", "coconut-interface", "colored 2.0.0", - "config", "cosmrs", "cosmwasm-std", "cw3", "cw4", - "execute", "flate2", "futures", "group-contract-common", @@ -6781,7 +6779,9 @@ dependencies = [ "log", "multisig-contract-common", "nym-api-requests", + "nym-config", "nym-contracts-common", + "nym-execute", "nym-mixnet-contract-common", "nym-network-defaults", "nym-vesting-contract", diff --git a/nym-connect/mobile/src-tauri/Cargo.toml b/nym-connect/mobile/src-tauri/Cargo.toml index f83ffd2fe5..8614dd7f0c 100644 --- a/nym-connect/mobile/src-tauri/Cargo.toml +++ b/nym-connect/mobile/src-tauri/Cargo.toml @@ -49,7 +49,7 @@ yaml-rust = "0.4" client-core = { path = "../../../clients/client-core" } nym-api-requests = { path = "../../../nym-api/nym-api-requests" } nym-contracts-common = { path = "../../../common/cosmwasm-smart-contracts/contracts-common"} -config-common = { path = "../../../common/config", package = "config" } +nym-config-common = { path = "../../../common/config", package = "nym-config" } nym-crypto = { path = "../../../common/crypto" } nym-bin-common = { path = "../../../common/bin-common"} nym-socks5-client = { path = "../../../clients/socks5", features = ["mobile"], default-features = false } diff --git a/nym-connect/mobile/src-tauri/src/config/mod.rs b/nym-connect/mobile/src-tauri/src/config/mod.rs index 9e22ea806d..c6c649ab63 100644 --- a/nym-connect/mobile/src-tauri/src/config/mod.rs +++ b/nym-connect/mobile/src-tauri/src/config/mod.rs @@ -3,7 +3,7 @@ use crate::{ state::State, }; use client_core::{client::key_manager::KeyManager, config::Config as BaseConfig}; -use config_common::NymConfig; +use nym_config_common::NymConfig; use nym_crypto::asymmetric::identity; use nym_socks5::client::config::Config as Socks5Config; use std::path::PathBuf; @@ -100,10 +100,10 @@ pub async fn init_socks5_config( log::trace!("Initialising client..."); let mut config = Config::new(SOCKS5_CONFIG_ID, &provider_address); - if let Ok(raw_validators) = std::env::var(config_common::defaults::var_names::NYM_API) { + if let Ok(raw_validators) = std::env::var(nym_config_common::defaults::var_names::NYM_API) { config .get_base_mut() - .set_custom_nym_apis(config_common::parse_urls(&raw_validators)); + .set_custom_nym_apis(nym_config_common::parse_urls(&raw_validators)); } let nym_api_endpoints = config.get_base().get_nym_api_endpoints(); diff --git a/nym-connect/mobile/src-tauri/src/lib.rs b/nym-connect/mobile/src-tauri/src/lib.rs index 95f89ebf63..5fe3ef2552 100644 --- a/nym-connect/mobile/src-tauri/src/lib.rs +++ b/nym-connect/mobile/src-tauri/src/lib.rs @@ -2,7 +2,7 @@ #![allow(dead_code)] #![allow(unused_imports)] -use config_common::defaults::setup_env; +use nym_config_common::defaults::setup_env; use std::sync::Arc; use tauri::{App, Manager}; use tokio::sync::RwLock; diff --git a/nym-connect/mobile/src-tauri/src/state.rs b/nym-connect/mobile/src-tauri/src/state.rs index e3cff0a105..730665f0dd 100644 --- a/nym-connect/mobile/src-tauri/src/state.rs +++ b/nym-connect/mobile/src-tauri/src/state.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use ::config_common::NymConfig; +use ::nym_config_common::NymConfig; use client_core::client::key_manager::KeyManager; use client_core::error::ClientCoreStatusMessage; use futures::SinkExt; diff --git a/nym-connect/mobile/src-tauri/src/tasks.rs b/nym-connect/mobile/src-tauri/src/tasks.rs index 58f7d8469f..801139e683 100644 --- a/nym-connect/mobile/src-tauri/src/tasks.rs +++ b/nym-connect/mobile/src-tauri/src/tasks.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use tap::TapFallible; use tokio::sync::RwLock; -use config_common::NymConfig; +use nym_config_common::NymConfig; use nym_socks5::client::NymClient as Socks5NymClient; use nym_socks5::client::{config::Config as Socks5Config, Socks5ControlMessageSender}; diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index d9c121dcef..081bf1c5c3 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -679,19 +679,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "config" -version = "0.1.0" -dependencies = [ - "cfg-if", - "handlebars", - "log", - "nym-network-defaults", - "serde", - "toml", - "url", -] - [[package]] name = "const-oid" version = "0.7.1" @@ -1423,14 +1410,6 @@ dependencies = [ "libc", ] -[[package]] -name = "execute" -version = "0.1.0" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "eyre" version = "0.6.8" @@ -2939,6 +2918,19 @@ dependencies = [ "vergen 7.5.1", ] +[[package]] +name = "nym-config" +version = "0.1.0" +dependencies = [ + "cfg-if", + "handlebars", + "log", + "nym-network-defaults", + "serde", + "toml", + "url", +] + [[package]] name = "nym-contracts-common" version = "0.1.0" @@ -2950,6 +2942,14 @@ dependencies = [ "thiserror", ] +[[package]] +name = "nym-execute" +version = "0.1.0" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "nym-mixnet-contract-common" version = "0.1.0" @@ -2993,12 +2993,12 @@ name = "nym-types" version = "1.0.0" dependencies = [ "coconut-interface", - "config", "cosmrs", "cosmwasm-std", "eyre", "itertools", "log", + "nym-config", "nym-mixnet-contract-common", "nym-vesting-contract", "nym-vesting-contract-common", @@ -3059,10 +3059,10 @@ dependencies = [ name = "nym-wallet-types" version = "1.0.0" dependencies = [ - "config", "cosmrs", "cosmwasm-std", "hex-literal", + "nym-config", "nym-mixnet-contract-common", "nym-network-defaults", "nym-types", @@ -3087,7 +3087,6 @@ dependencies = [ "chrono", "coconut-interface", "colored 2.0.0", - "config", "cosmrs", "cosmwasm-std", "dirs", @@ -3098,6 +3097,7 @@ dependencies = [ "itertools", "k256", "log", + "nym-config", "nym-mixnet-contract-common", "nym-types", "nym-vesting-contract", @@ -5564,12 +5564,10 @@ dependencies = [ "coconut-dkg-common", "coconut-interface", "colored 2.0.0", - "config", "cosmrs", "cosmwasm-std", "cw3", "cw4", - "execute", "flate2", "futures", "group-contract-common", @@ -5577,7 +5575,9 @@ dependencies = [ "log", "multisig-contract-common", "nym-api-requests", + "nym-config", "nym-contracts-common", + "nym-execute", "nym-mixnet-contract-common", "nym-network-defaults", "nym-vesting-contract", diff --git a/nym-wallet/nym-wallet-types/Cargo.toml b/nym-wallet/nym-wallet-types/Cargo.toml index beb4deebee..f8ebba8263 100644 --- a/nym-wallet/nym-wallet-types/Cargo.toml +++ b/nym-wallet/nym-wallet-types/Cargo.toml @@ -14,7 +14,7 @@ ts-rs = "6.1.2" cosmwasm-std = "1.0.0-beta8" cosmrs = { git = "https://github.com/neacsu/cosmos-rust", branch = "neacsu/feegrant_support" } -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } nym-network-defaults = { path = "../../common/network-defaults" } nym-mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract" } validator-client = { path = "../../common/client-libs/validator-client", features = [ diff --git a/nym-wallet/nym-wallet-types/src/network.rs b/nym-wallet/nym-wallet-types/src/network.rs index 24daf1b02c..8a443243e7 100644 --- a/nym-wallet/nym-wallet-types/src/network.rs +++ b/nym-wallet/nym-wallet-types/src/network.rs @@ -1,7 +1,7 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use config::defaults::{mainnet, DenomDetails, NymNetworkDetails}; +use nym_config::defaults::{mainnet, DenomDetails, NymNetworkDetails}; use nym_types::{currency::DecCoin, error::TypesError}; use serde::{Deserialize, Serialize}; use std::{fmt, ops::Not, str::FromStr}; diff --git a/nym-wallet/src-tauri/Cargo.toml b/nym-wallet/src-tauri/Cargo.toml index 00aed29983..cc72e8812b 100644 --- a/nym-wallet/src-tauri/Cargo.toml +++ b/nym-wallet/src-tauri/Cargo.toml @@ -59,7 +59,7 @@ validator-client = { path = "../../common/client-libs/validator-client", feature ] } nym-mixnet-contract-common = { path = "../../common/cosmwasm-smart-contracts/mixnet-contract" } nym-vesting-contract-common = { path = "../../common/cosmwasm-smart-contracts/vesting-contract" } -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } coconut-interface = { path = "../../common/coconut-interface" } # Used for Type conversion, can be extracted but its a lot of work nym-vesting-contract = { path = "../../contracts/vesting" } diff --git a/nym-wallet/src-tauri/src/config/mod.rs b/nym-wallet/src-tauri/src/config/mod.rs index 545d383d0c..b1c621543a 100644 --- a/nym-wallet/src-tauri/src/config/mod.rs +++ b/nym-wallet/src-tauri/src/config/mod.rs @@ -13,7 +13,7 @@ use strum::IntoEnumIterator; use url::Url; use validator_client::nyxd::AccountId as CosmosAccountId; -use config::defaults::{DenomDetailsOwned, NymNetworkDetails, ValidatorDetails}; +use nym_config::defaults::{DenomDetailsOwned, NymNetworkDetails, ValidatorDetails}; use nym_wallet_types::network::Network as WalletNetwork; use nym_wallet_types::network_config; diff --git a/nym-wallet/src-tauri/src/operations/mixnet/account.rs b/nym-wallet/src-tauri/src/operations/mixnet/account.rs index d9f3f122d7..51c53b8f95 100644 --- a/nym-wallet/src-tauri/src/operations/mixnet/account.rs +++ b/nym-wallet/src-tauri/src/operations/mixnet/account.rs @@ -4,9 +4,9 @@ use crate::network_config; use crate::state::{WalletAccountIds, WalletState}; use crate::wallet_storage::{self, DEFAULT_LOGIN_ID}; use bip39::{Language, Mnemonic}; -use config::defaults::{NymNetworkDetails, COSMOS_DERIVATION_PATH}; use cosmrs::bip32::DerivationPath; use itertools::Itertools; +use nym_config::defaults::{NymNetworkDetails, COSMOS_DERIVATION_PATH}; use nym_types::account::{Account, AccountEntry, Balance}; use nym_wallet_types::network::Network as WalletNetwork; use rand::seq::SliceRandom; diff --git a/nym-wallet/src-tauri/src/state.rs b/nym-wallet/src-tauri/src/state.rs index 9916cf520d..ef7eaa1cb4 100644 --- a/nym-wallet/src-tauri/src/state.rs +++ b/nym-wallet/src-tauri/src/state.rs @@ -1,7 +1,7 @@ use crate::config; use crate::error::BackendError; use crate::simulate::SimulateResult; -use ::config::defaults::NymNetworkDetails; +use ::nym_config::defaults::NymNetworkDetails; use cosmwasm_std::Decimal; use itertools::Itertools; use log::warn; diff --git a/nym-wallet/src-tauri/src/wallet_storage/mod.rs b/nym-wallet/src-tauri/src/wallet_storage/mod.rs index 7bca66d01b..0db4e87e92 100644 --- a/nym-wallet/src-tauri/src/wallet_storage/mod.rs +++ b/nym-wallet/src-tauri/src/wallet_storage/mod.rs @@ -392,7 +392,7 @@ mod tests { use crate::wallet_storage::account_data::{MnemonicAccount, WalletAccount}; use super::*; - use config::defaults::COSMOS_DERIVATION_PATH; + use nym_config::defaults::COSMOS_DERIVATION_PATH; use std::str::FromStr; use tempfile::tempdir; diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index d1b0ced0d0..3fc72dca27 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -32,7 +32,7 @@ url = { workspace = true } # internal client-core = { path = "../../clients/client-core" } -config = { path = "../../common/config" } +nym-config = { path = "../../common/config" } nym-crypto = { path = "../../common/crypto" } nym-bin-common = { path = "../../common/bin-common"} nym-network-defaults = { path = "../../common/network-defaults" } @@ -42,6 +42,6 @@ ordered-buffer = {path = "../../common/socks5/ordered-buffer"} proxy-helpers = { path = "../../common/socks5/proxy-helpers" } service-providers-common = { path = "../common" } socks5-requests = { path = "../../common/socks5/requests" } -statistics-common = { path = "../../common/statistics" } +nym-statistics-common = { path = "../../common/statistics" } nym-task = { path = "../../common/task" } websocket-requests = { path = "../../clients/native/websocket-requests" } diff --git a/service-providers/network-requester/src/cli/init.rs b/service-providers/network-requester/src/cli/init.rs index fba12a7d1f..0c9907db3a 100644 --- a/service-providers/network-requester/src/cli/init.rs +++ b/service-providers/network-requester/src/cli/init.rs @@ -7,7 +7,7 @@ use crate::{ error::NetworkRequesterError, }; use clap::Args; -use config::NymConfig; +use nym_config::NymConfig; use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; diff --git a/service-providers/network-requester/src/cli/mod.rs b/service-providers/network-requester/src/cli/mod.rs index b4e576b190..e65a3d642f 100644 --- a/service-providers/network-requester/src/cli/mod.rs +++ b/service-providers/network-requester/src/cli/mod.rs @@ -68,13 +68,13 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { BaseConfig::with_custom_nym_apis, args.nym_apis, nym_network_defaults::var_names::NYM_API, - config::parse_urls, + nym_config::parse_urls, ) .with_optional_custom_env_ext( BaseConfig::with_custom_nyxd, args.nyxd_urls, nym_network_defaults::var_names::NYXD, - config::parse_urls, + nym_config::parse_urls, ) .with_optional_ext( BaseConfig::with_disabled_credentials, diff --git a/service-providers/network-requester/src/cli/run.rs b/service-providers/network-requester/src/cli/run.rs index d4d2a9952b..b52d804895 100644 --- a/service-providers/network-requester/src/cli/run.rs +++ b/service-providers/network-requester/src/cli/run.rs @@ -7,8 +7,8 @@ use crate::{ error::NetworkRequesterError, }; use clap::Args; -use config::NymConfig; use nym_bin_common::version_checker; +use nym_config::NymConfig; use nym_sphinx::addressing::clients::Recipient; const ENABLE_STATISTICS: &str = "enable-statistics"; diff --git a/service-providers/network-requester/src/config/mod.rs b/service-providers/network-requester/src/config/mod.rs index 1dfa767ba9..24d34455e3 100644 --- a/service-providers/network-requester/src/config/mod.rs +++ b/service-providers/network-requester/src/config/mod.rs @@ -3,7 +3,7 @@ use crate::config::template::config_template; use client_core::config::ClientCoreConfigTrait; -use config::{NymConfig, OptionalSet}; +use nym_config::{NymConfig, OptionalSet}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::path::PathBuf; diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index a0f4ae5878..7ebf5c186a 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -14,6 +14,7 @@ use log::warn; use nym_bin_common::build_information::BinaryBuildInformation; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::anonymous_replies::requests::AnonymousSenderTag; +use nym_statistics_common::collector::StatisticsSender; use nym_task::connections::LaneQueueLengths; use nym_task::{TaskClient, TaskManager}; use proxy_helpers::connection_controller::{Controller, ControllerCommand, ControllerSender}; @@ -26,7 +27,6 @@ use socks5_requests::{ ConnectRequest, ConnectionId, NetworkData, SendRequest, Socks5ProtocolVersion, Socks5ProviderRequest, Socks5Request, Socks5RequestContent, Socks5Response, }; -use statistics_common::collector::StatisticsSender; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; diff --git a/service-providers/network-requester/src/statistics/collector.rs b/service-providers/network-requester/src/statistics/collector.rs index 989ddc5e46..9ccb18f01a 100644 --- a/service-providers/network-requester/src/statistics/collector.rs +++ b/service-providers/network-requester/src/statistics/collector.rs @@ -7,6 +7,14 @@ use crate::reply::MixnetMessage; use async_trait::async_trait; use log::*; use nym_sphinx::addressing::clients::Recipient; +use nym_statistics_common::api::{ + build_statistics_request_bytes, DEFAULT_STATISTICS_SERVICE_ADDRESS, + DEFAULT_STATISTICS_SERVICE_PORT, +}; +use nym_statistics_common::{ + collector::StatisticsCollector, error::StatsError as CommonStatsError, StatsMessage, + StatsServiceData, +}; use ordered_buffer::OrderedMessageSender; use proxy_helpers::proxy_runner::MixProxySender; use rand::RngCore; @@ -14,14 +22,6 @@ use serde::Deserialize; use service_providers_common::interface::RequestVersion; use socks5_requests::{ConnectionId, RemoteAddress, Socks5Request, Socks5RequestContent}; use sqlx::types::chrono::{DateTime, Utc}; -use statistics_common::api::{ - build_statistics_request_bytes, DEFAULT_STATISTICS_SERVICE_ADDRESS, - DEFAULT_STATISTICS_SERVICE_PORT, -}; -use statistics_common::{ - collector::StatisticsCollector, error::StatsError as CommonStatsError, StatsMessage, - StatsServiceData, -}; use std::collections::{HashMap, HashSet}; use std::sync::Arc; use std::time::Duration; @@ -147,7 +147,7 @@ impl StatisticsCollector for ServiceStatisticsCollector { .get(&requested_service) .copied() .unwrap_or(0); - statistics_common::StatsData::Service(StatsServiceData::new( + nym_statistics_common::StatsData::Service(StatsServiceData::new( requested_service, request_bytes, response_bytes, diff --git a/service-providers/network-requester/src/statistics/error.rs b/service-providers/network-requester/src/statistics/error.rs index 5ee8da773d..0795d526df 100644 --- a/service-providers/network-requester/src/statistics/error.rs +++ b/service-providers/network-requester/src/statistics/error.rs @@ -12,5 +12,5 @@ pub enum StatsError { InvalidClientAddress, #[error("Common statistics error {0}")] - CommonError(#[from] statistics_common::error::StatsError), + CommonError(#[from] nym_statistics_common::error::StatsError), } diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index 34d3bb3d2b..6a150d97f6 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -15,7 +15,7 @@ sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "sqlite", "macros" thiserror = "1" tokio = { version = "1.4", features = [ "net", "rt-multi-thread", "macros", "time" ] } nym-bin-common = { path = "../../common/bin-common"} -statistics-common = { path = "../../common/statistics" } +nym-statistics-common = { path = "../../common/statistics" } [build-dependencies] sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate"] } diff --git a/service-providers/network-statistics/src/api/mod.rs b/service-providers/network-statistics/src/api/mod.rs index f309976faa..151a2c744d 100644 --- a/service-providers/network-statistics/src/api/mod.rs +++ b/service-providers/network-statistics/src/api/mod.rs @@ -8,7 +8,7 @@ use crate::storage::NetworkStatisticsStorage; use error::Result; use routes::{post_all_statistics, post_statistic}; -use statistics_common::api::STATISTICS_SERVICE_VERSION; +use nym_statistics_common::api::STATISTICS_SERVICE_VERSION; mod error; mod routes; diff --git a/service-providers/network-statistics/src/api/routes.rs b/service-providers/network-statistics/src/api/routes.rs index 0a1c558128..6d36a9f909 100644 --- a/service-providers/network-statistics/src/api/routes.rs +++ b/service-providers/network-statistics/src/api/routes.rs @@ -5,7 +5,7 @@ use rocket::serde::json::Json; use rocket::State; use serde::{Deserialize, Serialize}; -use statistics_common::StatsMessage; +use nym_statistics_common::StatsMessage; use crate::api::error::Result; use crate::storage::NetworkStatisticsStorage; diff --git a/service-providers/network-statistics/src/storage/mod.rs b/service-providers/network-statistics/src/storage/mod.rs index ea468c8606..f485b08145 100644 --- a/service-providers/network-statistics/src/storage/mod.rs +++ b/service-providers/network-statistics/src/storage/mod.rs @@ -6,7 +6,7 @@ use sqlx::types::chrono::{DateTime, Utc}; use sqlx::ConnectOptions; use std::path::PathBuf; -use statistics_common::StatsMessage; +use nym_statistics_common::StatsMessage; use crate::storage::error::NetworkStatisticsStorageError; use crate::storage::manager::StorageManager; @@ -58,7 +58,7 @@ impl NetworkStatisticsStorage { .into(); for stats_data in msg.stats_data { match stats_data { - statistics_common::StatsData::Service(service_data) => { + nym_statistics_common::StatsData::Service(service_data) => { self.manager .insert_service_statistics( service_data.requested_service.clone(), @@ -69,7 +69,7 @@ impl NetworkStatisticsStorage { ) .await?; } - statistics_common::StatsData::Gateway(gateway_data) => { + nym_statistics_common::StatsData::Gateway(gateway_data) => { self.manager .insert_gateway_statistics( gateway_data.gateway_id, From 72f9f58fcee8a43bc926edab4923c57031a0e887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 23 Feb 2023 10:08:09 +0100 Subject: [PATCH 480/591] ci: more bandaids for nightly build running out of storage --- .github/workflows/nightly_build.yml | 12 ++++++------ .github/workflows/nightly_build_release.yml | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index 78ae755570..64b95f6368 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -51,9 +51,9 @@ jobs: command: build args: --workspace - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: command: clean @@ -63,7 +63,7 @@ jobs: command: build args: --workspace --examples - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: @@ -75,7 +75,7 @@ jobs: command: test args: --workspace - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: @@ -88,9 +88,9 @@ jobs: command: test args: --workspace -- --ignored - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: command: clean diff --git a/.github/workflows/nightly_build_release.yml b/.github/workflows/nightly_build_release.yml index ea72a07e4e..71b7df2bd7 100644 --- a/.github/workflows/nightly_build_release.yml +++ b/.github/workflows/nightly_build_release.yml @@ -66,9 +66,9 @@ jobs: command: build args: --workspace - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: command: clean @@ -78,9 +78,9 @@ jobs: command: build args: --workspace --examples - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: command: clean @@ -90,7 +90,7 @@ jobs: command: test args: --workspace - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: @@ -103,9 +103,9 @@ jobs: command: test args: --workspace -- --ignored - - name: Reclaim some disk space (because Windows is being annoying) + - name: Reclaim some disk space uses: actions-rs/cargo@v1 - if: ${{ matrix.os == 'windows-latest' }} + if: ${{ matrix.os == 'windows-latest' || matrix.os == 'ubuntu-20.04' }} with: command: clean From f59dc2a36132441bf3d09e2bddcf62f7b5b5c7ef Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:11:34 +0200 Subject: [PATCH 481/591] push change --- tests/nym-gateway-binary-check.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 9205164261..390fe9343f 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -27,11 +27,11 @@ chmod u+x $BINARY_NAME # functions #-------------------------------------- -check_gateway_binary_build() if [ -f nym-gateway ]; then +check_gateway_binary_build() if [ -f "$BINARY_NAME" ]; then echo "running init tests" # we wont use config env files for now # unless we want to use a specific environment - OUTPUT=$(./nym-gateway --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) >/dev/null 2>&1 + OUTPUT=$(./${BINARY_NAME} --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) >/dev/null 2>&1 # get jq values for things we can assert against VALUE=$(echo ${OUTPUT} | jq .wallet_address) From cfea2c3aa3e8b1eb5d13506f795f21e79f089de6 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:18:08 +0200 Subject: [PATCH 482/591] correct variable names --- tests/nym-client-binary-check.sh | 2 +- tests/nym-gateway-binary-check.sh | 2 +- tests/nym-mixnode-binary-check.sh | 2 +- tests/nym-network-requester-binary-check.sh | 2 +- tests/nym-socks-5-binary-check.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index 2454019db1..111160768b 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -6,7 +6,7 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -VERSION_NUMBER=$1 +RELEASE_VERSION_NUMBER=$1 OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${OUTPUT}" BINARY_NAME="nym-client" diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 390fe9343f..19a0ce87b0 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -6,7 +6,7 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -VERSION_NUMBER=$1 +RELEASE_VERSION_NUMBER=$1 WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr MOCK_HOST="1.2.3.4" RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index e7ed4a00d3..6b32f76be8 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -11,7 +11,7 @@ RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-mixnode" -echo "the version number is ${VERSION_NUMBER} to be installed from github" +echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" # install the current release binary # so this is dependant on running on a linux machine for the time being diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index 38c3965fc3..4ef0afdec7 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -6,7 +6,7 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -VERSION_NUMBER=$1 +RELEASE_VERSION_NUMBER=$1 RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-network-requester" diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index 6e288cf5bf..59ef083f03 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -6,7 +6,7 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -VERSION_NUMBER=$1 +RELEASE_VERSION_NUMBER=$1 MOCK_SERVICE_PROVIDER="36cUqdggtdXixZhmXfyZm3Dep3Q5QsKVPotMrVSmS4oY.ZCCAdFPwPNSTtUMYveA62ttEFe8FDiB3cdheWHtCytX@6Lnxj9vD2YMtSmfe8zp5RBtj1uZLYQAFRxY9q7ANwrZz" RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" From c8e2d25e7a692a6ea403869943c3f9b903160741 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:26:21 +0200 Subject: [PATCH 483/591] add correct assertion --- tests/nym-gateway-binary-check.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 19a0ce87b0..26e1585f41 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -34,16 +34,20 @@ check_gateway_binary_build() if [ -f "$BINARY_NAME" ]; then OUTPUT=$(./${BINARY_NAME} --output json init --id ${ID} --host ${MOCK_HOST} --wallet-address ${WALLET_ADDRESS_CONST}) >/dev/null 2>&1 # get jq values for things we can assert against - VALUE=$(echo ${OUTPUT} | jq .wallet_address) + VALUE=$(echo ${OUTPUT} | jq .data_store) VALUE=${VALUE#\"} VALUE=${VALUE%\"} echo $OUTPUT - sleep 2 + #------------------------------------------------------ + USER=$(whoami) + DATA_STORE="/${USER}/.nym/gateways/${ID}/data/db.sqlite" + #------------------------------------------------------ - # do asserts here based upon the output on init + # do asserts here based upon the output + # check the data store path - assert "echo ${VALUE}" $(echo ${WALLET_ADDRESS_CONST}) + assert "echo ${VALUE}" $(echo ${DATA_STORE}) assert_end nym-gateway-tests else echo "exting test no binary found" From 2ad5893a78b98ace1a72334c871bc1868af3c1be Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:33:22 +0200 Subject: [PATCH 484/591] fix asserts --- tests/nym-client-binary-check.sh | 2 +- tests/nym-network-requester-binary-check.sh | 2 +- tests/nym-socks-5-binary-check.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index 111160768b..13974fe48e 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -46,7 +46,7 @@ check_nym_client_binary_build() if [ -f $BINARY_NAME ]; then # do asserts here based upon the output on init - assert $(echo ${VALUE}) $(echo ${ID}) + assert "echo ${VALUE}" $(echo ${ID}) assert_end nym-client-tests else echo "exting test no binary found" diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index 4ef0afdec7..a96bfcfc9d 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -45,7 +45,7 @@ check_nym_network_requester_binary_build() if [ -f $BINARY_NAME ]; then # do asserts here based upon the output on init - assert $(echo ${VALUE}) $(echo ${ID}) + assert "echo ${VALUE}" $(echo ${ID}) assert_end nym-network-requester-tests else echo "exting test no binary found" diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index 59ef083f03..a6903f3134 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -47,7 +47,7 @@ check_nym_socks5_client_binary_build() if [ -f $BINARY_NAME ]; then # do asserts here based upon the output on init - assert $(echo ${VALUE}) $(echo ${ID}) + assert "echo ${VALUE}" $(echo ${ID}) assert_end nym-socks-5-client-tests else echo "exting test no binary found" From 2419beccafde03285d4e61a978c7e610b576e007 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:38:16 +0200 Subject: [PATCH 485/591] spurious directory change --- tests/nym-client-binary-check.sh | 2 -- tests/nym-gateway-binary-check.sh | 2 -- tests/nym-network-requester-binary-check.sh | 2 -- tests/nym-socks-5-binary-check.sh | 2 -- 4 files changed, 8 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index 13974fe48e..af06f331b3 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -13,8 +13,6 @@ BINARY_NAME="nym-client" echo "the version number is ${VERSION_NUMBER} to be installed from github" -cd ${PWD}${RELEASE_DIRECTORY} - # install the current release binary # so this is dependant on running on a linux machine for the time being diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 26e1585f41..dfb28084c3 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -15,8 +15,6 @@ BINARY_NAME="nym-gateway" echo "the version number is ${VERSION_NUMBER} to be installed from github" -cd ${PWD}${RELEASE_DIRECTORY} - # install the current release binary # so this is dependant on running on a linux machine for the time being diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index a96bfcfc9d..ade502d562 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -13,8 +13,6 @@ BINARY_NAME="nym-network-requester" echo "the version number is ${VERSION_NUMBER} to be installed from github" -cd ${PWD}${RELEASE_DIRECTORY} - # we have now the bundled the client into the network requester, more a less the same output as the client curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index a6903f3134..683bdd235a 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -14,8 +14,6 @@ BINARY_NAME="nym-socks5-client" echo "the version number is ${VERSION_NUMBER} to be installed from github" -cd ${PWD}${RELEASE_DIRECTORY} - # install the current release binary # so this is dependant on running on a linux machine for the time being From 905ffc257a3be4d308da924c4dfdb2c9dd049542 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:47:15 +0200 Subject: [PATCH 486/591] remove outputs echos and add remove cosmos from the config check --- tests/nym-client-binary-check.sh | 3 --- tests/nym-gateway-binary-check.sh | 5 ++--- tests/nym-network-requester-binary-check.sh | 3 --- tests/nym-socks-5-binary-check.sh | 3 --- 4 files changed, 2 insertions(+), 12 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index af06f331b3..0ef7d19559 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -39,9 +39,6 @@ check_nym_client_binary_build() if [ -f $BINARY_NAME ]; then VALUE=${VALUE#\"} VALUE=${VALUE%\"} - echo "${OUTPUT}" - sleep 2 - # do asserts here based upon the output on init assert "echo ${VALUE}" $(echo ${ID}) diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index dfb28084c3..7a8f89464c 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -36,7 +36,6 @@ check_gateway_binary_build() if [ -f "$BINARY_NAME" ]; then VALUE=${VALUE#\"} VALUE=${VALUE%\"} - echo $OUTPUT #------------------------------------------------------ USER=$(whoami) DATA_STORE="/${USER}/.nym/gateways/${ID}/data/db.sqlite" @@ -59,7 +58,7 @@ fi check_gateway_binary_build # whoami # this is dependant on where it runs on ci potentially, will need to tweak this in the future -first_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =") +first_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =" | grep -v "^cosmos_mnemonic =") #lets remove the binary then navigate to the target/release directory for checking the latest version if [ -f "$BINARY_NAME" ]; then @@ -85,7 +84,7 @@ check_gateway_binary_build echo "diff the config files after each init" echo "-------------------------------------" -second_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =") +second_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =" | grep -v "^cosmos_mnemonic =") diff -w <(echo "$first_init") <(echo "$second_init") diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index ade502d562..8e31d73b27 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -38,9 +38,6 @@ check_nym_network_requester_binary_build() if [ -f $BINARY_NAME ]; then VALUE=${VALUE#\"} VALUE=${VALUE%\"} - echo "${OUTPUT}" - sleep 2 - # do asserts here based upon the output on init assert "echo ${VALUE}" $(echo ${ID}) diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index 683bdd235a..3888487a71 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -40,9 +40,6 @@ check_nym_socks5_client_binary_build() if [ -f $BINARY_NAME ]; then VALUE=${VALUE#\"} VALUE=${VALUE%\"} - echo "${OUTPUT}" - sleep 2 - # do asserts here based upon the output on init assert "echo ${VALUE}" $(echo ${ID}) From f4bee0eed0d59a6b5ce4a86485dbec48b8251501 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:53:51 +0200 Subject: [PATCH 487/591] update readme --- tests/README.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/README.md b/tests/README.md index 3d72d8123e..fa6f675a54 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,9 +1,6 @@ ## Binary init checker - -### WIP -A simple tool to ensure that all binaries init with the correct format, using the assert.sh library - +A simple tool to ensure that all binaries init with the correct format, using the `assert.sh` library Simply run `./build_and_run.sh $RELEASE_BRANCH` `$CURRENT_PRODUCTION_RELEASE_VERSION` @@ -11,10 +8,10 @@ For example: `./build_and_run.sh release/v1.1.11 v1.1.10` -This will run through all the binaries anc check the fields that we expect to be initialised when passing the parameters into nyms core binaries +Currently, this is run on linux based machines as the nym-core binaries are published via a linux build agent + + +This will run through all the binaries and check the fields that we expect to be initialised when passing the parameters into nyms core binaries ## TODO - - Introduce all binaries - - Sort paths and locations - - Tidy up - - Run in CI + - Create GH workflow and Run in CI From 4b77312bee98b3823c4aca9c4cdb6ae0a82921dc Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 11:57:38 +0200 Subject: [PATCH 488/591] fix var naming --- tests/nym-client-binary-check.sh | 2 +- tests/nym-gateway-binary-check.sh | 2 +- tests/nym-network-requester-binary-check.sh | 2 +- tests/nym-socks-5-binary-check.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index 0ef7d19559..d9954f7f52 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -11,7 +11,7 @@ OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${OUTPUT}" BINARY_NAME="nym-client" -echo "the version number is ${VERSION_NUMBER} to be installed from github" +echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" # install the current release binary # so this is dependant on running on a linux machine for the time being diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 7a8f89464c..4e350d5a99 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -13,7 +13,7 @@ RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-gateway" -echo "the version number is ${VERSION_NUMBER} to be installed from github" +echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" # install the current release binary # so this is dependant on running on a linux machine for the time being diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index 8e31d73b27..f22f0c9351 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -11,7 +11,7 @@ RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-network-requester" -echo "the version number is ${VERSION_NUMBER} to be installed from github" +echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" # we have now the bundled the client into the network requester, more a less the same output as the client diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index 3888487a71..5a9a8e7ef9 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -12,7 +12,7 @@ RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-socks5-client" -echo "the version number is ${VERSION_NUMBER} to be installed from github" +echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" # install the current release binary # so this is dependant on running on a linux machine for the time being From 665f093bcf1e3506ed7db66cd2d5f5fa6a5c3288 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 12:22:31 +0200 Subject: [PATCH 489/591] push path changes --- tests/nym-client-binary-check.sh | 4 ++-- tests/nym-gateway-binary-check.sh | 7 +++---- tests/nym-mixnode-binary-check.sh | 4 ++-- tests/nym-network-requester-binary-check.sh | 4 ++-- tests/nym-socks-5-binary-check.sh | 4 ++-- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index d9954f7f52..7d78b55dbb 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -57,7 +57,7 @@ fi check_nym_client_binary_build -first_init=$(cat /root/.nym/clients/${ID}/config/config.toml | grep -v "^version =") +first_init=$(cat ${HOME}/.nym/clients/${ID}/config/config.toml | grep -v "^version =") #---------------------------------------------------------------------------------------------------------- # lets remove the binary then navigate to the target/release directory for checking the latest version @@ -86,7 +86,7 @@ echo "-------------------------------------" check_nym_client_binary_build -second_init=$(cat /root/.nym/clients/${ID}/config/config.toml | grep -v "^version =") +second_init=$(cat ${HOME}/.nym/clients/${ID}/config/config.toml | grep -v "^version =") diff -w <(echo "$first_init") <(echo "$second_init") diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index 4e350d5a99..a2fcd814d5 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -37,8 +37,7 @@ check_gateway_binary_build() if [ -f "$BINARY_NAME" ]; then VALUE=${VALUE%\"} #------------------------------------------------------ - USER=$(whoami) - DATA_STORE="/${USER}/.nym/gateways/${ID}/data/db.sqlite" + DATA_STORE="${HOME}/.nym/gateways/${ID}/data/db.sqlite" #------------------------------------------------------ # do asserts here based upon the output @@ -58,7 +57,7 @@ fi check_gateway_binary_build # whoami # this is dependant on where it runs on ci potentially, will need to tweak this in the future -first_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =" | grep -v "^cosmos_mnemonic =") +first_init=$(cat ${HOME}/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =" | grep -v "^cosmos_mnemonic =") #lets remove the binary then navigate to the target/release directory for checking the latest version if [ -f "$BINARY_NAME" ]; then @@ -84,7 +83,7 @@ check_gateway_binary_build echo "diff the config files after each init" echo "-------------------------------------" -second_init=$(cat /root/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =" | grep -v "^cosmos_mnemonic =") +second_init=$(cat ${HOME}/.nym/gateways/${ID}/config/config.toml | grep -v "^\[gateway\]$" | grep -v "^version =" | grep -v "^cosmos_mnemonic =") diff -w <(echo "$first_init") <(echo "$second_init") diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 6b32f76be8..41c46a9211 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -48,7 +48,7 @@ check_mixnode_binary_build() { check_mixnode_binary_build # whoami # this is dependant on where it runs on ci potentially, will need to tweak this in the future -first_init=$(cat /root/.nym/mixnodes/${ID}/config/config.toml | grep -v "^\[mixnode\]$" | grep -v "^version =") +first_init=$(cat ${HOME}/.nym/mixnodes/${ID}/config/config.toml | grep -v "^\[mixnode\]$" | grep -v "^version =") #lets remove the binary then navigate to the target/release directory for checking the latest version if [ -f "$BINARY_NAME" ]; then @@ -74,7 +74,7 @@ check_mixnode_binary_build echo "diff the config files after each init" echo "-------------------------------------" -second_init=$(cat /root/.nym/mixnodes/${ID}/config/config.toml | grep -v "^\[mixnode\]$" | grep -v "^version =") +second_init=$(cat ${HOME}/.nym/mixnodes/${ID}/config/config.toml | grep -v "^\[mixnode\]$" | grep -v "^version =") diff -w <(echo "$first_init") <(echo "$second_init") diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index f22f0c9351..5486e45cea 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -56,7 +56,7 @@ fi check_nym_network_requester_binary_build -first_init=$(cat /root/.nym/service-providers/network-requester/${ID}/config/config.toml | grep -v "^version =") +first_init=$(cat ${HOME}/.nym/service-providers/network-requester/${ID}/config/config.toml | grep -v "^version =") #---------------------------------------------------------------------------------------------------------- # lets remove the binary then navigate to the target/release directory for checking the latest version @@ -85,7 +85,7 @@ echo "-------------------------------------" check_nym_network_requester_binary_build -second_init=$(cat /root/.nym/service-providers/network-requester/${ID}/config/config.toml | grep -v "^version =") +second_init=$(cat ${HOME}/.nym/service-providers/network-requester/${ID}/config/config.toml | grep -v "^version =") diff -w <(echo "$first_init") <(echo "$second_init") diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index 5a9a8e7ef9..af99902603 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -58,7 +58,7 @@ fi check_nym_socks5_client_binary_build -first_init=$(cat /root/.nym/socks5-clients/${ID}/config/config.toml | grep -v "^version =") +first_init=$(cat ${HOME}/.nym/socks5-clients/${ID}/config/config.toml | grep -v "^version =") #---------------------------------------------------------------------------------------------------------- # lets remove the binary then navigate to the target/release directory for checking the latest version @@ -87,7 +87,7 @@ echo "-------------------------------------" check_nym_socks5_client_binary_build -second_init=$(cat /root/.nym/socks5-clients/${ID}/config/config.toml | grep -v "^version =") +second_init=$(cat ${HOME}/.nym/socks5-clients/${ID}/config/config.toml | grep -v "^version =") diff -w <(echo "$first_init") <(echo "$second_init") From 8927824d59f7b736afb2a1deb66cf9334cee50de Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 12:29:42 +0200 Subject: [PATCH 490/591] make sure the script is executed in the right place --- tests/build_and_run.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/build_and_run.sh b/tests/build_and_run.sh index 765e053bf7..d36e0745e6 100755 --- a/tests/build_and_run.sh +++ b/tests/build_and_run.sh @@ -4,6 +4,13 @@ PWD="../" GIT_BRANCH=$1 VERSION_NUMBER=$2 +# run the script from the correct location + +if [[ $(pwd) != */tests ]]; then + echo "Please run the script from the 'tests' directory." + exit 1 +fi + # lets make sure the branch is up to date # --------------------------------------- git checkout develop From 323d5fbb3c996bb94b3da3ceaad1abcf4da386a0 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:10:39 +0100 Subject: [PATCH 491/591] Create ci-binary-checker.yml --- .github/workflows/ci-binary-checker.yml | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/ci-binary-checker.yml diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml new file mode 100644 index 0000000000..6fcf976192 --- /dev/null +++ b/.github/workflows/ci-binary-checker.yml @@ -0,0 +1,54 @@ +name: Run config checks on all binaries + +on: + workflow_dispatch: + push: + paths: + - 'clients/**' + - 'common/**' + - 'contracts/**' + - 'integrations/**' + - 'mixnode/**' + - 'sdk/rust/nym-sdk/**' + - 'service-providers/**' + pull_request: + paths: + - 'clients/**' + - 'common/**' + - 'gateway/**' + - 'integrations/**' + - 'mixnode/**' + - 'sdk/rust/nym-sdk/**' + - 'service-providers/**' + +env: + NETWORK: mainnet + +jobs: + publish-nym: + strategy: + fail-fast: false + matrix: + platform: [ubuntu-20.04] + + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@v3 + + - name: Install Dependencies (Linux) + run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + continue-on-error: true + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Branch name + run: echo running on branch ${GITHUB_REF##*/} + + - name: Run tests against binaries + run: ./build_and_run.sh ${GITHUB_REF##*/} "v1.1.11" + working-directory: tests/ + + From 02a621ed8bfa2a90aadaf06c4ef012cae46d46cf Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:16:50 +0100 Subject: [PATCH 492/591] Update ci-binary-checker.yml --- .github/workflows/ci-binary-checker.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml index 6fcf976192..82bce3a881 100644 --- a/.github/workflows/ci-binary-checker.yml +++ b/.github/workflows/ci-binary-checker.yml @@ -2,6 +2,8 @@ name: Run config checks on all binaries on: workflow_dispatch: + release: + types: [created] push: paths: - 'clients/**' From ea161329dcda423035779d4cf011ea4c684cc558 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:34:26 +0100 Subject: [PATCH 493/591] Update ci-binary-checker.yml testing manually the changes for the timebeing --- .github/workflows/ci-binary-checker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml index 82bce3a881..fdf8adabb2 100644 --- a/.github/workflows/ci-binary-checker.yml +++ b/.github/workflows/ci-binary-checker.yml @@ -50,7 +50,7 @@ jobs: run: echo running on branch ${GITHUB_REF##*/} - name: Run tests against binaries - run: ./build_and_run.sh ${GITHUB_REF##*/} "v1.1.11" + run: ./build_and_run.sh ${GITHUB_REF##*/} "v1.1.10" working-directory: tests/ From 18a3366cf353f9b7e2a618f0e404c7b664066365 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:37:41 +0100 Subject: [PATCH 494/591] Update ci-binary-checker.yml --- .github/workflows/ci-binary-checker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml index fdf8adabb2..2080697a64 100644 --- a/.github/workflows/ci-binary-checker.yml +++ b/.github/workflows/ci-binary-checker.yml @@ -50,7 +50,7 @@ jobs: run: echo running on branch ${GITHUB_REF##*/} - name: Run tests against binaries - run: ./build_and_run.sh ${GITHUB_REF##*/} "v1.1.10" + run: ./build_and_run.sh release/v1.1.11 "v1.1.10" working-directory: tests/ From 6d15b444a0dc069596ffe4921b12a6a2433ae1cb Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 14:22:20 +0200 Subject: [PATCH 495/591] use master on the build agent to fetch the latest release binaries --- tests/build_and_run.sh | 10 +++++----- tests/nym-client-binary-check.sh | 5 +---- tests/nym-gateway-binary-check.sh | 5 +---- tests/nym-mixnode-binary-check.sh | 7 ++----- tests/nym-network-requester-binary-check.sh | 3 +-- tests/nym-socks-5-binary-check.sh | 3 +-- 6 files changed, 11 insertions(+), 22 deletions(-) diff --git a/tests/build_and_run.sh b/tests/build_and_run.sh index d36e0745e6..b86c74cced 100755 --- a/tests/build_and_run.sh +++ b/tests/build_and_run.sh @@ -27,26 +27,26 @@ cargo build --release --all #here there should be the applicable binaries to test inits echo "running mixnode binary check" -./nym-mixnode-binary-check.sh "$VERSION_NUMBER" +./nym-mixnode-binary-check.sh sleep 2 echo "running gateway binary check" -./nym-gateway-binary-check.sh "$VERSION_NUMBER" +./nym-gateway-binary-check.sh sleep 2 echo "running socks-5 binary check" -./nym-socks-5-binary-check.sh "$VERSION_NUMBER" +./nym-socks-5-binary-check.sh sleep 2 echo "running network-requester binary check" -./nym-network-requester-binary-check.sh "$VERSION_NUMBER" +./nym-network-requester-binary-check.sh sleep 2 echo "running client binary check" -./nym-client-binary-check.sh "$VERSION_NUMBER" +./nym-client-binary-check.sh diff --git a/tests/nym-client-binary-check.sh b/tests/nym-client-binary-check.sh index 7d78b55dbb..ee23bccb64 100755 --- a/tests/nym-client-binary-check.sh +++ b/tests/nym-client-binary-check.sh @@ -6,17 +6,14 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -RELEASE_VERSION_NUMBER=$1 OUTPUT=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${OUTPUT}" BINARY_NAME="nym-client" -echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" - # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME +curl -L "https://builds.ci.nymte.ch/master/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- diff --git a/tests/nym-gateway-binary-check.sh b/tests/nym-gateway-binary-check.sh index a2fcd814d5..9df6fd80f6 100755 --- a/tests/nym-gateway-binary-check.sh +++ b/tests/nym-gateway-binary-check.sh @@ -6,19 +6,16 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -RELEASE_VERSION_NUMBER=$1 WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr MOCK_HOST="1.2.3.4" RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-gateway" -echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" - # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME +curl -L "https://builds.ci.nymte.ch/master/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #-------------------------------------- diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 41c46a9211..52ad190067 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -4,19 +4,16 @@ PWD="../" RELEASE_DIRECTORY="target/release" -RELEASE_VERSION_NUMBER=$1 WALLET_ADDRESS_CONST=n1435n84se65tn7yv536am0sfvng4yyrwj7thhxr MOCK_HOST="1.2.3.4" RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-mixnode" -echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" - # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o nym-mixnode -chmod u+x "$BINARY_NAME" +curl -L "https://builds.ci.nymte.ch/master/${BINARY_NAME}" -o $BINARY_NAME +chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- # functions diff --git a/tests/nym-network-requester-binary-check.sh b/tests/nym-network-requester-binary-check.sh index 5486e45cea..8f299cc042 100755 --- a/tests/nym-network-requester-binary-check.sh +++ b/tests/nym-network-requester-binary-check.sh @@ -6,7 +6,6 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -RELEASE_VERSION_NUMBER=$1 RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-network-requester" @@ -15,7 +14,7 @@ echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from githu # we have now the bundled the client into the network requester, more a less the same output as the client -curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME +curl -L "https://builds.ci.nymte.ch/master/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index af99902603..f04ec8794a 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -6,7 +6,6 @@ set -e PWD="../" RELEASE_DIRECTORY="target/release" -RELEASE_VERSION_NUMBER=$1 MOCK_SERVICE_PROVIDER="36cUqdggtdXixZhmXfyZm3Dep3Q5QsKVPotMrVSmS4oY.ZCCAdFPwPNSTtUMYveA62ttEFe8FDiB3cdheWHtCytX@6Lnxj9vD2YMtSmfe8zp5RBtj1uZLYQAFRxY9q7ANwrZz" RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" @@ -17,7 +16,7 @@ echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from githu # install the current release binary # so this is dependant on running on a linux machine for the time being -curl -L "https://github.com/nymtech/nym/releases/download/nym-binaries-${RELEASE_VERSION_NUMBER}/${BINARY_NAME}" -o $BINARY_NAME +curl -L "https://builds.ci.nymte.ch/master/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME #---------------------------------------------------------------------------------------------------------- From 01f4773a5d775ed7434747462880205dc45338ee Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Thu, 23 Feb 2023 14:23:06 +0200 Subject: [PATCH 496/591] update --- tests/nym-mixnode-binary-check.sh | 1 + tests/nym-socks-5-binary-check.sh | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/nym-mixnode-binary-check.sh b/tests/nym-mixnode-binary-check.sh index 52ad190067..cb47ed9b4b 100755 --- a/tests/nym-mixnode-binary-check.sh +++ b/tests/nym-mixnode-binary-check.sh @@ -12,6 +12,7 @@ BINARY_NAME="nym-mixnode" # install the current release binary # so this is dependant on running on a linux machine for the time being + curl -L "https://builds.ci.nymte.ch/master/${BINARY_NAME}" -o $BINARY_NAME chmod u+x $BINARY_NAME diff --git a/tests/nym-socks-5-binary-check.sh b/tests/nym-socks-5-binary-check.sh index f04ec8794a..ebcfe85e14 100755 --- a/tests/nym-socks-5-binary-check.sh +++ b/tests/nym-socks-5-binary-check.sh @@ -11,8 +11,6 @@ RANDOM_ID=$(for i in {1..8}; do echo -n $(($RANDOM % 10)); done) ID="test-${RANDOM_ID}" BINARY_NAME="nym-socks5-client" -echo "the version number is ${RELEASE_VERSION_NUMBER} to be installed from github" - # install the current release binary # so this is dependant on running on a linux machine for the time being From dc556706c19e9119a149c7ea6243eb6dda701c21 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 13:25:46 +0100 Subject: [PATCH 497/591] Update ci-binary-checker.yml update the to run from the branch --- .github/workflows/ci-binary-checker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml index 2080697a64..c7e2f8ec6f 100644 --- a/.github/workflows/ci-binary-checker.yml +++ b/.github/workflows/ci-binary-checker.yml @@ -50,7 +50,7 @@ jobs: run: echo running on branch ${GITHUB_REF##*/} - name: Run tests against binaries - run: ./build_and_run.sh release/v1.1.11 "v1.1.10" + run: ./build_and_run.sh ${{ github.head_ref || github.ref_name }} working-directory: tests/ From 0b0ec075bb8290e73be59a7841c9cd05c2749a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Thu, 23 Feb 2023 14:44:54 +0200 Subject: [PATCH 498/591] Use saturating_sub with an additional 1 second buffer (#3095) --- clients/credential/src/main.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/clients/credential/src/main.rs b/clients/credential/src/main.rs index 50d256bf59..2a47930510 100644 --- a/clients/credential/src/main.rs +++ b/clients/credential/src/main.rs @@ -51,8 +51,11 @@ async fn block_until_coconut_is_available Date: Thu, 23 Feb 2023 15:38:20 +0100 Subject: [PATCH 499/591] Update README.md --- tests/README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/README.md b/tests/README.md index fa6f675a54..b0477e60d6 100644 --- a/tests/README.md +++ b/tests/README.md @@ -2,16 +2,12 @@ A simple tool to ensure that all binaries init with the correct format, using the `assert.sh` library -Simply run `./build_and_run.sh $RELEASE_BRANCH` `$CURRENT_PRODUCTION_RELEASE_VERSION` - +Simply run `./build_and_run.sh $WORKING_BRANCH` For example: -`./build_and_run.sh release/v1.1.11 v1.1.10` +`./build_and_run.sh release/v1.1.11` Currently, this is run on linux based machines as the nym-core binaries are published via a linux build agent This will run through all the binaries and check the fields that we expect to be initialised when passing the parameters into nyms core binaries - -## TODO - - Create GH workflow and Run in CI From f36cb3a00bd4104d88debaf3d1fa95acfdfb2d5a Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 16:50:02 +0100 Subject: [PATCH 500/591] Update ci-binary-checker.yml use custom runner --- .github/workflows/ci-binary-checker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml index c7e2f8ec6f..02e6dc6a8a 100644 --- a/.github/workflows/ci-binary-checker.yml +++ b/.github/workflows/ci-binary-checker.yml @@ -31,7 +31,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ubuntu-20.04] + platform: [custom-runner-linux] runs-on: ${{ matrix.platform }} steps: From d759462e4e853c6769ac534a23f09a6e77fbdd4e Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 16:53:23 +0100 Subject: [PATCH 501/591] Update ci-binary-checker.yml install jq --- .github/workflows/ci-binary-checker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml index 02e6dc6a8a..74e2905fa4 100644 --- a/.github/workflows/ci-binary-checker.yml +++ b/.github/workflows/ci-binary-checker.yml @@ -38,7 +38,7 @@ jobs: - uses: actions/checkout@v3 - name: Install Dependencies (Linux) - run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + run: sudo apt-get update && sudo apt-get -y jq vim install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools continue-on-error: true - name: Install Rust stable From 0deef37778adbc85a0fbab412fc5f0ff29163be8 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 16:56:25 +0100 Subject: [PATCH 502/591] Update ci-binary-checker.yml correct positioning on install --- .github/workflows/ci-binary-checker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-binary-checker.yml b/.github/workflows/ci-binary-checker.yml index 74e2905fa4..167f6dcad9 100644 --- a/.github/workflows/ci-binary-checker.yml +++ b/.github/workflows/ci-binary-checker.yml @@ -38,7 +38,7 @@ jobs: - uses: actions/checkout@v3 - name: Install Dependencies (Linux) - run: sudo apt-get update && sudo apt-get -y jq vim install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools + run: sudo apt-get update && sudo apt-get -y install jq vim libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools continue-on-error: true - name: Install Rust stable From 8ed808124e19d23c507424182d6bec26cd39b1c6 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Thu, 23 Feb 2023 17:15:32 +0100 Subject: [PATCH 503/591] Update build-and-upload-binaries-ci.yml publish credential binary --- .github/workflows/build-and-upload-binaries-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 448b947179..812c24f16e 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -69,7 +69,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: build - args: --workspace --release + args: --workspace --release --all - name: Install Rust stable uses: actions-rs/toolchain@v1 @@ -95,7 +95,8 @@ jobs: cp target/release/nym-network-requester $OUTPUT_DIR cp target/release/nym-network-statistics $OUTPUT_DIR cp target/release/nym-cli $OUTPUT_DIR - + cp target/release/credential $OUTPUT_DIR + cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm $OUTPUT_DIR cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm $OUTPUT_DIR From 128dfa6d8184b27edeb617ccab2f56d097df3742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Thu, 23 Feb 2023 17:09:22 +0000 Subject: [PATCH 504/591] Feature/latency based gateway selection (#3081) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip * new option to select gateways based on latency * further changes for wasm-compatibility * post rebase fixes + clippy I know, I should have probably included them properly during rebasing ¯\_(ツ)_/¯ * android change * wasm: the gift that keeps on giving --- Cargo.lock | 2 + clients/client-core/Cargo.toml | 5 + .../client-core/src/client/base_client/mod.rs | 2 +- clients/client-core/src/error.rs | 28 ++- clients/client-core/src/init/helpers.rs | 219 ++++++++++++++++-- clients/client-core/src/init/mod.rs | 14 +- clients/native/src/commands/init.rs | 6 + clients/socks5/src/commands/init.rs | 6 + .../validator-client/src/client.rs | 4 +- .../desktop/src-tauri/src/config/mod.rs | 2 + .../mobile/src-tauri/src/config/mod.rs | 1 + sdk/rust/nym-sdk/src/mixnet/client.rs | 2 + .../network-requester/src/cli/init.rs | 6 + 13 files changed, 264 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f8d33aacf..4f0fab00f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -705,6 +705,8 @@ dependencies = [ "time 0.3.17", "tokio", "tokio-stream", + "tokio-tungstenite 0.14.0", + "tungstenite 0.13.0", "url", "validator-client", "wasm-bindgen", diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index df20c45d98..a467192fe8 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -20,6 +20,7 @@ serde_json = "1.0.89" tap = "1.0.1" thiserror = "1.0.34" url = { version ="2.2", features = ["serde"] } +tungstenite = { version = "0.13.0", default-features = false } tokio = { version = "1.24.1", features = ["macros"]} time = "0.3.17" @@ -44,6 +45,9 @@ features = ["time"] version = "1.24.1" features = ["time"] +[target."cfg(not(target_arch = \"wasm32\"))".dependencies.tokio-tungstenite] +version = "0.14" + [target."cfg(not(target_arch = \"wasm32\"))".dependencies.sqlx] version = "0.6.2" features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate"] @@ -65,6 +69,7 @@ features = ["futures"] [target."cfg(target_arch = \"wasm32\")".dependencies.wasm-utils] path = "../../common/wasm-utils" +features = ["websocket"] [target."cfg(target_arch = \"wasm32\")".dependencies.time] version = "0.3.17" diff --git a/clients/client-core/src/client/base_client/mod.rs b/clients/client-core/src/client/base_client/mod.rs index f517698bf2..64a292d2b8 100644 --- a/clients/client-core/src/client/base_client/mod.rs +++ b/clients/client-core/src/client/base_client/mod.rs @@ -304,7 +304,7 @@ where } let gateway_address = self.gateway_config.gateway_listener.clone(); if gateway_address.is_empty() { - return Err(ClientCoreError::GatwayAddressUnknown); + return Err(ClientCoreError::GatewayAddressUnknown); } let gateway_identity = identity::PublicKey::from_base58_string(gateway_id) diff --git a/clients/client-core/src/error.rs b/clients/client-core/src/error.rs index 0436187ed8..4c9e9e5b34 100644 --- a/clients/client-core/src/error.rs +++ b/clients/client-core/src/error.rs @@ -3,6 +3,7 @@ use gateway_client::error::GatewayClientError; use nym_crypto::asymmetric::identity::Ed25519RecoveryError; +use nym_topology::gateway::GatewayConversionError; use nym_topology::NymTopologyError; use validator_client::ValidatorClientError; @@ -53,7 +54,32 @@ pub enum ClientCoreError { GatewayOwnerUnknown, #[error("The address of the gateway is unknown - did you run init?")] - GatwayAddressUnknown, + GatewayAddressUnknown, + + #[error("The gateway is malformed: {source}")] + MalformedGateway { + #[from] + source: GatewayConversionError, + }, + + #[error("failed to establish connection to gateway: {source}")] + GatewayConnectionFailure { + #[from] + source: tungstenite::Error, + }, + + #[cfg(target_arch = "wasm32")] + #[error("failed to establish gateway connection (wasm)")] + GatewayJsConnectionFailure, + + #[error("Gateway connection was abruptly closed")] + GatewayConnectionAbruptlyClosed, + + #[error("Timed out while trying to establish gateway connection")] + GatewayConnectionTimeout, + + #[error("No ping measurements for the gateway ({identity}) performed")] + NoGatewayMeasurements { identity: String }, #[error("failed to register receiver for reconstructed mixnet messages")] FailedToRegisterReceiver, diff --git a/clients/client-core/src/init/helpers.rs b/clients/client-core/src/init/helpers.rs index e7d03d585a..b3f5e1c46d 100644 --- a/clients/client-core/src/init/helpers.rs +++ b/clients/client-core/src/init/helpers.rs @@ -6,52 +6,223 @@ use crate::{ config::{persistence::key_pathfinder::ClientKeyPathfinder, Config}, error::ClientCoreError, }; -#[cfg(target_arch = "wasm32")] -use gateway_client::wasm_mockups::SigningNyxdClient; +use futures::{SinkExt, StreamExt}; use gateway_client::GatewayClient; use gateway_requests::registration::handshake::SharedKeys; +use log::{debug, info, trace, warn}; use nym_config::NymConfig; use nym_crypto::asymmetric::identity; use nym_topology::{filter::VersionFilterable, gateway}; -use rand::{seq::SliceRandom, thread_rng}; +use rand::{seq::SliceRandom, thread_rng, Rng}; use std::{sync::Arc, time::Duration}; use tap::TapFallible; +use tungstenite::Message; use url::Url; + +#[cfg(not(target_arch = "wasm32"))] +use tokio::net::TcpStream; +#[cfg(not(target_arch = "wasm32"))] +use tokio::time::Instant; +#[cfg(not(target_arch = "wasm32"))] +use tokio_tungstenite::connect_async; +#[cfg(not(target_arch = "wasm32"))] +use tokio_tungstenite::{MaybeTlsStream, WebSocketStream}; #[cfg(not(target_arch = "wasm32"))] use validator_client::nyxd::SigningNyxdClient; -pub(super) async fn query_gateway_details( - validator_servers: Vec, - chosen_gateway_id: Option, -) -> Result { - let nym_api = validator_servers - .choose(&mut thread_rng()) +#[cfg(not(target_arch = "wasm32"))] +type WsConn = WebSocketStream>; + +#[cfg(target_arch = "wasm32")] +use gateway_client::wasm_mockups::SigningNyxdClient; +#[cfg(target_arch = "wasm32")] +use wasm_timer::Instant; +#[cfg(target_arch = "wasm32")] +use wasm_utils::websocket::JSWebsocket; + +#[cfg(target_arch = "wasm32")] +type WsConn = JSWebsocket; + +const MEASUREMENTS: usize = 3; + +#[cfg(not(target_arch = "wasm32"))] +const CONN_TIMEOUT: Duration = Duration::from_millis(1500); +const PING_TIMEOUT: Duration = Duration::from_millis(1000); + +struct GatewayWithLatency { + gateway: gateway::Node, + latency: Duration, +} + +impl GatewayWithLatency { + fn new(gateway: gateway::Node, latency: Duration) -> Self { + GatewayWithLatency { gateway, latency } + } +} + +async fn current_gateways( + rng: &mut R, + nym_apis: Vec, +) -> Result, ClientCoreError> { + let nym_api = nym_apis + .choose(rng) .ok_or(ClientCoreError::ListOfNymApisIsEmpty)?; - let validator_client = validator_client::client::NymApiClient::new(nym_api.clone()); + let client = validator_client::client::NymApiClient::new(nym_api.clone()); log::trace!("Fetching list of gateways from: {}", nym_api); - let gateways = validator_client.get_cached_gateways().await?; + + let gateways = client.get_cached_gateways().await?; let valid_gateways = gateways .into_iter() .filter_map(|gateway| gateway.try_into().ok()) .collect::>(); + // we were always filtering by version so I'm not removing that 'feature' let filtered_gateways = valid_gateways.filter_by_version(env!("CARGO_PKG_VERSION")); + Ok(filtered_gateways) +} - // if we have chosen particular gateway - use it, otherwise choose a random one. - // (remember that in active topology all gateways have at least 100 reputation so should - // be working correctly) - if let Some(gateway_id) = chosen_gateway_id { - filtered_gateways - .iter() - .find(|gateway| gateway.identity_key == gateway_id) - .ok_or_else(|| ClientCoreError::NoGatewayWithId(gateway_id.to_string())) - .cloned() +#[cfg(not(target_arch = "wasm32"))] +async fn connect(endpoint: &str) -> Result { + match tokio::time::timeout(CONN_TIMEOUT, connect_async(endpoint)).await { + Err(_elapsed) => Err(ClientCoreError::GatewayConnectionTimeout), + Ok(Err(conn_failure)) => Err(conn_failure.into()), + Ok(Ok((stream, _))) => Ok(stream), + } +} + +#[cfg(target_arch = "wasm32")] +async fn connect(endpoint: &str) -> Result { + JSWebsocket::new(endpoint).map_err(|_| ClientCoreError::GatewayJsConnectionFailure) +} + +async fn measure_latency(gateway: gateway::Node) -> Result { + let addr = gateway.clients_address(); + trace!( + "establishing connection to {} ({addr})...", + gateway.identity_key, + ); + let mut stream = connect(&addr).await?; + + let mut results = Vec::new(); + for _ in 0..MEASUREMENTS { + let measurement_future = async { + let ping_content = vec![1, 2, 3]; + let start = Instant::now(); + stream.send(Message::Ping(ping_content.clone())).await?; + + match stream.next().await { + Some(Ok(Message::Pong(content))) => { + if content == ping_content { + let elapsed = Instant::now().duration_since(start); + trace!("current ping time: {elapsed:?}"); + results.push(elapsed); + } else { + warn!("received a pong message with different content? wtf.") + } + } + Some(Ok(_)) => warn!("received a message that's not a pong!"), + Some(Err(err)) => return Err(err.into()), + None => return Err(ClientCoreError::GatewayConnectionAbruptlyClosed), + } + + Ok::<(), ClientCoreError>(()) + }; + + // thanks to wasm we can't use tokio::time::timeout : ( + #[cfg(not(target_arch = "wasm32"))] + let timeout = tokio::time::sleep(PING_TIMEOUT); + #[cfg(not(target_arch = "wasm32"))] + tokio::pin!(timeout); + + #[cfg(target_arch = "wasm32")] + let mut timeout = wasm_timer::Delay::new(PING_TIMEOUT); + + tokio::select! { + _ = &mut timeout => { + warn!("timed out while trying to perform measurement...") + } + res = measurement_future => res?, + } + } + + let count = results.len() as u64; + if count == 0 { + return Err(ClientCoreError::NoGatewayMeasurements { + identity: gateway.identity_key.to_base58_string(), + }); + } + + let sum: Duration = results.into_iter().sum(); + let avg = Duration::from_nanos(sum.as_nanos() as u64 / count); + + Ok(GatewayWithLatency::new(gateway, avg)) +} + +async fn choose_gateway_by_latency( + rng: &mut R, + gateways: Vec, +) -> Result { + info!("choosing gateway by latency..."); + + let mut gateways_with_latency = Vec::new(); + for gateway in gateways { + let id = *gateway.identity(); + trace!("measuring latency to {id}..."); + let with_latency = match measure_latency(gateway).await { + Ok(res) => res, + Err(err) => { + warn!("failed to measure {id}: {err}"); + continue; + } + }; + debug!( + "{id} ({}): {:?}", + with_latency.gateway.location, with_latency.latency + ); + gateways_with_latency.push(with_latency) + } + + let chosen = gateways_with_latency + .choose_weighted(rng, |item| 1. / item.latency.as_secs_f32()) + .expect("invalid selection weight!"); + + info!( + "chose gateway {} (located at {}) with average latency of {:?}", + chosen.gateway.identity_key, chosen.gateway.location, chosen.latency + ); + + Ok(chosen.gateway.clone()) +} + +fn uniformly_random_gateway( + rng: &mut R, + gateways: Vec, +) -> Result { + gateways + .choose(rng) + .ok_or(ClientCoreError::NoGatewaysOnNetwork) + .cloned() +} + +pub(super) async fn query_gateway_details( + validator_servers: Vec, + chosen_gateway_id: Option, + by_latency: bool, +) -> Result { + let mut rng = thread_rng(); + let gateways = current_gateways(&mut rng, validator_servers).await?; + + // if we set an explicit gateway, use that one and nothing else + if let Some(explicitly_chosen) = chosen_gateway_id { + gateways + .into_iter() + .find(|gateway| gateway.identity_key == explicitly_chosen) + .ok_or_else(|| ClientCoreError::NoGatewayWithId(explicitly_chosen.to_string())) + } else if by_latency { + choose_gateway_by_latency(&mut rng, gateways).await } else { - filtered_gateways - .choose(&mut rand::thread_rng()) - .ok_or(ClientCoreError::NoGatewaysOnNetwork) - .cloned() + uniformly_random_gateway(&mut rng, gateways) } } diff --git a/clients/client-core/src/init/mod.rs b/clients/client-core/src/init/mod.rs index f99fa318c2..6e1700d7ae 100644 --- a/clients/client-core/src/init/mod.rs +++ b/clients/client-core/src/init/mod.rs @@ -77,9 +77,11 @@ pub async fn register_with_gateway( key_manager: &mut KeyManager, nym_api_endpoints: Vec, chosen_gateway_id: Option, + by_latency: bool, ) -> Result { // Get the gateway details of the gateway we will use - let gateway = helpers::query_gateway_details(nym_api_endpoints, chosen_gateway_id).await?; + let gateway = + helpers::query_gateway_details(nym_api_endpoints, chosen_gateway_id, by_latency).await?; log::debug!("Querying gateway gives: {}", gateway); let our_identity = key_manager.identity_keypair(); @@ -102,6 +104,7 @@ pub async fn setup_gateway_from_config( register_gateway: bool, user_chosen_gateway_id: Option, config: &Config, + by_latency: bool, ) -> Result where C: NymConfig + ClientCoreConfigTrait, @@ -117,9 +120,12 @@ where } // Else, we preceed by querying the nym-api - let gateway = - helpers::query_gateway_details(config.get_nym_api_endpoints(), user_chosen_gateway_id) - .await?; + let gateway = helpers::query_gateway_details( + config.get_nym_api_endpoints(), + user_chosen_gateway_id, + by_latency, + ) + .await?; log::debug!("Querying gateway gives: {}", gateway); // If we are not registering, just return this and assume the caller has the keys already and diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index 756adfa493..c41c4796a0 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -25,6 +25,11 @@ pub(crate) struct Init { #[clap(long)] gateway: Option, + /// Specifies whether the new gateway should be determined based by latency as opposed to being chosen + /// uniformly. + #[clap(long, conflicts_with = "gateway")] + latency_based_selection: bool, + /// Force register gateway. WARNING: this will overwrite any existing keys for the given id, /// potentially causing loss of access. #[clap(long)] @@ -143,6 +148,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> { register_gateway, user_chosen_gateway_id, config.get_base(), + args.latency_based_selection, ) .await .tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?; diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index 2c6ae23730..c921834ec3 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -37,6 +37,11 @@ pub(crate) struct Init { #[clap(long)] gateway: Option, + /// Specifies whether the new gateway should be determined based by latency as opposed to being chosen + /// uniformly. + #[clap(long, conflicts_with = "gateway")] + latency_based_selection: bool, + /// Force register gateway. WARNING: this will overwrite any existing keys for the given id, /// potentially causing loss of access. #[clap(long)] @@ -149,6 +154,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { register_gateway, user_chosen_gateway_id, config.get_base(), + args.latency_based_selection, ) .await .tap_err(|err| eprintln!("Failed to setup gateway\nError: {err}"))?; diff --git a/common/client-libs/validator-client/src/client.rs b/common/client-libs/validator-client/src/client.rs index d75542e83f..68e3358576 100644 --- a/common/client-libs/validator-client/src/client.rs +++ b/common/client-libs/validator-client/src/client.rs @@ -11,9 +11,7 @@ use nym_api_requests::models::{ GatewayCoreStatusResponse, MixnodeCoreStatusResponse, MixnodeStatusResponse, RewardEstimationResponse, StakeSaturationResponse, }; -use nym_mixnet_contract_common::mixnode::MixNodeDetails; -use nym_mixnet_contract_common::MixId; -use nym_mixnet_contract_common::{GatewayBond, IdentityKeyRef}; +pub use nym_mixnet_contract_common::{mixnode::MixNodeDetails, GatewayBond, IdentityKeyRef, MixId}; #[cfg(feature = "nyxd-client")] use crate::nyxd::traits::{DkgQueryClient, MixnetQueryClient, MultisigQueryClient}; diff --git a/nym-connect/desktop/src-tauri/src/config/mod.rs b/nym-connect/desktop/src-tauri/src/config/mod.rs index 43691fb49c..e1d3379f6b 100644 --- a/nym-connect/desktop/src-tauri/src/config/mod.rs +++ b/nym-connect/desktop/src-tauri/src/config/mod.rs @@ -138,6 +138,8 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str register_gateway, Some(chosen_gateway_id), config.get_base(), + // TODO: another instance where this setting should probably get used + false, ) .await?; diff --git a/nym-connect/mobile/src-tauri/src/config/mod.rs b/nym-connect/mobile/src-tauri/src/config/mod.rs index c6c649ab63..7d1c3f0a99 100644 --- a/nym-connect/mobile/src-tauri/src/config/mod.rs +++ b/nym-connect/mobile/src-tauri/src/config/mod.rs @@ -118,6 +118,7 @@ pub async fn init_socks5_config( &mut key_manager, nym_api_endpoints, Some(chosen_gateway_id), + false, ) .await?; diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index d8b1e06b65..36b51a0428 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -259,6 +259,8 @@ where &mut self.key_manager, self.config.nym_api_endpoints.clone(), user_chosen_gateway, + // TODO: this should probably be configurable with the config + false, ) .await?; diff --git a/service-providers/network-requester/src/cli/init.rs b/service-providers/network-requester/src/cli/init.rs index 0c9907db3a..0c8057b7cd 100644 --- a/service-providers/network-requester/src/cli/init.rs +++ b/service-providers/network-requester/src/cli/init.rs @@ -24,6 +24,11 @@ pub(crate) struct Init { #[clap(long)] gateway: Option, + /// Specifies whether the new gateway should be determined based by latency as opposed to being chosen + /// uniformly. + #[clap(long, conflicts_with = "gateway")] + latency_based_selection: bool, + /// Force register gateway. WARNING: this will overwrite any existing keys for the given id, /// potentially causing loss of access. #[clap(long)] @@ -115,6 +120,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), NetworkRequesterError> { register_gateway, user_chosen_gateway_id, config.get_base(), + args.latency_based_selection, ) .await .map_err(|source| { From 7033f92d82ce913dd20ec264a88797b139d860f1 Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Thu, 23 Feb 2023 17:33:03 +0000 Subject: [PATCH 505/591] add UI for picking service provider --- .../desktop/src/components/CustomTitleBar.tsx | 5 +- nym-connect/desktop/src/context/main.tsx | 5 +- .../pages/menu/settings/GatewaySettings.tsx | 4 +- .../menu/settings/ServiceProviderSettings.tsx | 84 +++++++++++++++++++ .../desktop/src/pages/menu/settings/index.tsx | 5 +- nym-connect/desktop/src/routes/index.tsx | 2 + 6 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx diff --git a/nym-connect/desktop/src/components/CustomTitleBar.tsx b/nym-connect/desktop/src/components/CustomTitleBar.tsx index 88235e6074..5baa05c5b0 100644 --- a/nym-connect/desktop/src/components/CustomTitleBar.tsx +++ b/nym-connect/desktop/src/components/CustomTitleBar.tsx @@ -39,7 +39,8 @@ const ArrowBackIcon = ({ onBack }: { onBack?: () => void }) => { return ; }; -const getTitleIcon = (path: string) => { +const getTitle = (path: string) => { + if (path.includes('settings')) return 'Settings'; if (path !== '/') { const title = path.split('/').slice(-1); return ( @@ -61,7 +62,7 @@ export const CustomTitleBar = ({ path = '/', onBack }: { path?: string; onBack?: {/* set width to keep logo centered */} {path === '/' ? : } - {getTitleIcon(path)} + {getTitle(path)} appWindow.minimize()} /> appWindow.close()} /> diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index a933a8c36f..0cbba54383 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -8,7 +8,7 @@ import { UserDefinedGateway } from 'src/types/gateway'; import { forage } from '@tauri-apps/tauri-forage'; import { ConnectionStatusKind, GatewayPerformance } from '../types'; import { ConnectionStatsItem } from '../components/ConnectionStats'; -import { ServiceProvider } from '../types/directory'; +import { ServiceProvider, Services } from '../types/directory'; const FORAGE_KEY = 'nym-connect-user-gateway'; @@ -25,6 +25,7 @@ export type TClientContext = { selectedProvider?: ServiceProvider; showInfoModal: boolean; userDefinedGateway?: UserDefinedGateway; + serviceProviders?: ServiceProvider[]; setMode: (mode: ModeType) => void; clearError: () => void; setConnectionStatus: (connectionStatus: ConnectionStatusKind) => void; @@ -165,6 +166,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { showInfoModal, setConnectionStats, selectedProvider, + serviceProviders, connectedSince, setConnectedSince, setRandomSerivceProvider, @@ -180,6 +182,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { appVersion, error, showInfoModal, + serviceProviders, connectedSince, connectionStatus, connectionStats, diff --git a/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx b/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx index c273a8a007..43f4e84a2b 100644 --- a/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx @@ -6,7 +6,7 @@ import { ConnectionStatusKind } from 'src/types'; import { AppVersion } from 'src/components/AppVersion'; export const GatewaySettings = () => { - const { userDefinedGateway, setUserDefinedGateway } = useClientContext(); + const { userDefinedGateway, setUserDefinedGateway, connectionStatus } = useClientContext(); const [gatewayKey, setGatewayKey] = useState(userDefinedGateway?.gateway); const handleIsValidGatewayKey = (isValid: boolean) => { @@ -23,8 +23,6 @@ export const GatewaySettings = () => { setUserDefinedGateway((current) => ({ ...current, isActive: e.target.checked })); }; - const { connectionStatus } = useClientContext(); - return ( diff --git a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx new file mode 100644 index 0000000000..bb8a159319 --- /dev/null +++ b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx @@ -0,0 +1,84 @@ +import React, { ChangeEvent, useState } from 'react'; +import { + Autocomplete, + Box, + FormControl, + FormControlLabel, + FormHelperText, + Stack, + Switch, + TextField, + Typography, +} from '@mui/material'; +import { AppVersion } from 'src/components/AppVersion'; +import { ConnectionStatusKind } from 'src/types'; +import { useClientContext } from 'src/context/main'; + +export const ServiceProviderSettings = () => { + const [spAddress, setSPAddress] = useState(); + const [isOn, setIsOn] = useState(false); + + const { connectionStatus, serviceProviders } = useClientContext(); + + const toggleOnOff = (e: ChangeEvent) => { + if (!isOn) setSPAddress(undefined); + setIsOn(e.target.checked); + }; + + const handleSelectFromList = (value: string | null) => { + setSPAddress(value ?? undefined); + }; + + return ( + + + + + Select your Service Provider + + + Pick a service provider form the list or enter your own + + + + } + label={isOn ? 'On' : 'Off'} + /> + {connectionStatus === ConnectionStatusKind.connected && ( + This setting is disabled during an active connection + )} + {isOn && serviceProviders && ( + sp.address)} + freeSolo + onChange={(e, value) => handleSelectFromList(value)} + value={spAddress} + size="small" + renderInput={(params) => ( + console.log(e.target.value)} + placeholder="Service provider" + /> + )} + /> + )} + + + + + + ); +}; diff --git a/nym-connect/desktop/src/pages/menu/settings/index.tsx b/nym-connect/desktop/src/pages/menu/settings/index.tsx index edd1050272..bc58b69f1b 100644 --- a/nym-connect/desktop/src/pages/menu/settings/index.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/index.tsx @@ -4,7 +4,10 @@ import { Link, List, ListItem, ListItemButton, ListItemText, Stack } from '@mui/ import { AppVersion } from 'src/components/AppVersion'; import { toggleLogViewer } from 'src/utils'; -const menuSchema = [{ title: 'Select your gateway', path: 'gateway' }]; +const menuSchema = [ + { title: 'Select your gateway', path: 'gateway' }, + { title: 'Select a service provider', path: 'service-provider' }, +]; export const SettingsMenu = () => ( diff --git a/nym-connect/desktop/src/routes/index.tsx b/nym-connect/desktop/src/routes/index.tsx index aaf09fac16..dd3eec678e 100644 --- a/nym-connect/desktop/src/routes/index.tsx +++ b/nym-connect/desktop/src/routes/index.tsx @@ -6,6 +6,7 @@ import { CompatibleApps } from 'src/pages/menu/Apps'; import { HelpGuide } from 'src/pages/menu/Guide'; import { SettingsMenu } from 'src/pages/menu/settings'; import { GatewaySettings } from 'src/pages/menu/settings/GatewaySettings'; +import { ServiceProviderSettings } from 'src/pages/menu/settings/ServiceProviderSettings'; export const AppRoutes = () => ( @@ -17,6 +18,7 @@ export const AppRoutes = () => ( } /> } /> + } /> From af6bab7703314d0c00257d9e86141411e2e0fdcb Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Thu, 23 Feb 2023 17:40:39 +0000 Subject: [PATCH 506/591] fix lint error --- nym-connect/desktop/src/context/main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index 0cbba54383..2efdc49289 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -8,7 +8,7 @@ import { UserDefinedGateway } from 'src/types/gateway'; import { forage } from '@tauri-apps/tauri-forage'; import { ConnectionStatusKind, GatewayPerformance } from '../types'; import { ConnectionStatsItem } from '../components/ConnectionStats'; -import { ServiceProvider, Services } from '../types/directory'; +import { ServiceProvider } from '../types/directory'; const FORAGE_KEY = 'nym-connect-user-gateway'; From 6d29774744398bf09d83c716bf2944840692d27e Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Thu, 23 Feb 2023 22:57:21 +0000 Subject: [PATCH 507/591] style tweaks --- .../desktop/src/pages/menu/settings/GatewaySettings.tsx | 1 + .../src/pages/menu/settings/ServiceProviderSettings.tsx | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx b/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx index 43f4e84a2b..80efa7988a 100644 --- a/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/GatewaySettings.tsx @@ -58,6 +58,7 @@ export const GatewaySettings = () => { onValidate={handleIsValidGatewayKey} sx={{ mt: 1 }} disabled={connectionStatus === 'connected' || !userDefinedGateway?.isActive} + autoFocus /> )} diff --git a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx index bb8a159319..8906c67129 100644 --- a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx @@ -37,7 +37,7 @@ export const ServiceProviderSettings = () => { Select your Service Provider - Pick a service provider form the list or enter your own + Pick a service provider from the list or enter your own { sp.address)} + options={serviceProviders.map((sp) => `${sp.address.substring(0, 20)}...`)} freeSolo onChange={(e, value) => handleSelectFromList(value)} value={spAddress} @@ -73,6 +73,7 @@ export const ServiceProviderSettings = () => { placeholder="Service provider" /> )} + ListboxProps={{ style: { background: 'unset', fontSize: '14px' } }} /> )} From c08efef8ed095b06240d7415a4b2a4bb747c049f Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Thu, 23 Feb 2023 22:58:59 +0000 Subject: [PATCH 508/591] add autofocus to IdentityKeyComponent --- .../src/components/mixnodes/IdentityKeyFormField.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx b/ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx index 4417bbffe5..692e666fe7 100644 --- a/ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx +++ b/ts-packages/react-components/src/components/mixnodes/IdentityKeyFormField.tsx @@ -22,6 +22,7 @@ export const IdentityKeyFormField: FCWithChildren<{ size?: 'small' | 'medium'; sx?: SxProps; disabled?: boolean; + autoFocus?: boolean; }> = ({ required, fullWidth, @@ -37,6 +38,7 @@ export const IdentityKeyFormField: FCWithChildren<{ showTickOnValid = true, size, disabled, + autoFocus, }) => { const [value, setValue] = React.useState(initialValue); const [validationError, setValidationError] = React.useState(); @@ -106,6 +108,7 @@ export const IdentityKeyFormField: FCWithChildren<{ InputLabelProps={{ shrink: true }} size={size} disabled={disabled} + autoFocus={autoFocus} /> ); }; From 2178f2b509d6ccfc7643746a4ee0715b1e3ecba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Walther?= Date: Fri, 24 Feb 2023 11:12:53 +0100 Subject: [PATCH 509/591] Github Actions: fix notification display issue --- .../support-files/network-explorer/templates/failure | 5 +++++ .../support-files/network-explorer/templates/success | 6 ++++++ .github/workflows/support-files/nightly/index.js | 2 +- .../workflows/support-files/nightly/templates/failure | 6 ++++++ .../workflows/support-files/nightly/templates/success | 8 +++++++- .../notifications/send_message_to_matrix.js | 5 ++++- .../support-files/nym-connect/templates/failure | 5 +++++ .../support-files/nym-connect/templates/success | 5 +++++ .../support-files/nym-wallet/templates/failure | 5 +++++ .../support-files/nym-wallet/templates/success | 9 +++++++-- .github/workflows/support-files/package.json | 1 + .../support-files/ts-packages/templates/failure | 5 +++++ .../support-files/ts-packages/templates/success | 10 ++++++++-- 13 files changed, 65 insertions(+), 7 deletions(-) diff --git a/.github/workflows/support-files/network-explorer/templates/failure b/.github/workflows/support-files/network-explorer/templates/failure index adc2896ace..0db23cefaa 100644 --- a/.github/workflows/support-files/network-explorer/templates/failure +++ b/.github/workflows/support-files/network-explorer/templates/failure @@ -1,9 +1,14 @@ 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > 🔴 **FAILURE** :cry: +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message: ``` diff --git a/.github/workflows/support-files/network-explorer/templates/success b/.github/workflows/support-files/network-explorer/templates/success index 1f380b79b9..69dd64e140 100644 --- a/.github/workflows/support-files/network-explorer/templates/success +++ b/.github/workflows/support-files/network-explorer/templates/success @@ -1,10 +1,16 @@ 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 > :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View output:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/ +> > `storybook`: https://{{ env.NYM_CI_WWW_LOCATION_STORYBOOK }}.{{ env.NYM_CI_WWW_BASE }} +> > ✅ **SUCCESS** +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}: ``` diff --git a/.github/workflows/support-files/nightly/index.js b/.github/workflows/support-files/nightly/index.js index 3bf2516092..913aa0e7c5 100644 --- a/.github/workflows/support-files/nightly/index.js +++ b/.github/workflows/support-files/nightly/index.js @@ -151,7 +151,7 @@ async function getMessageBody(context) { return `${icon} ${job.conclusion}: ${job.name} - ${job.html_url}`; }) // and join with newlines for display in the template - .join('\n'); + .join('\n\n'); return template({ ...context, jobResults }); } diff --git a/.github/workflows/support-files/nightly/templates/failure b/.github/workflows/support-files/nightly/templates/failure index 01ad9e7a00..1a8272b6c3 100644 --- a/.github/workflows/support-files/nightly/templates/failure +++ b/.github/workflows/support-files/nightly/templates/failure @@ -1,9 +1,15 @@ 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > 🔴 **FAILURE** :cry: +> > `when` {{ timestamp }} +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> {{ jobResults }} diff --git a/.github/workflows/support-files/nightly/templates/success b/.github/workflows/support-files/nightly/templates/success index 064d1ccd36..8901076548 100644 --- a/.github/workflows/support-files/nightly/templates/success +++ b/.github/workflows/support-files/nightly/templates/success @@ -1,9 +1,15 @@ 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > ✅ **SUCCESS** +> > `when` {{ timestamp }} +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> -{{ jobResults }} \ No newline at end of file +{{ jobResults }} diff --git a/.github/workflows/support-files/notifications/send_message_to_matrix.js b/.github/workflows/support-files/notifications/send_message_to_matrix.js index aabd1d57aa..002af92350 100644 --- a/.github/workflows/support-files/notifications/send_message_to_matrix.js +++ b/.github/workflows/support-files/notifications/send_message_to_matrix.js @@ -5,6 +5,7 @@ const localStorage = new LocalStorage('./scratch'); const { LocalStorageCryptoStore, } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'); +var showdown = require('showdown'); // hide all matrix client output console.error = (error) => console.log('❌ error: ', error); @@ -54,7 +55,9 @@ function createClient(context, room, message) { } async function sendMatrixMessage(contextArg, messageAsMarkdown, roomId) { - const client = createClient(contextArg, roomId, messageAsMarkdown); + const converter = new showdown.Converter(); + const messageAsHtml = converter.makeHtml(messageAsMarkdown); + const client = createClient(contextArg, roomId, messageAsHtml); await client.initCrypto(); await client.startClient({ initialSyncLimit: 1 }); } diff --git a/.github/workflows/support-files/nym-connect/templates/failure b/.github/workflows/support-files/nym-connect/templates/failure index adc2896ace..0db23cefaa 100644 --- a/.github/workflows/support-files/nym-connect/templates/failure +++ b/.github/workflows/support-files/nym-connect/templates/failure @@ -1,9 +1,14 @@ 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > 🔴 **FAILURE** :cry: +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message: ``` diff --git a/.github/workflows/support-files/nym-connect/templates/success b/.github/workflows/support-files/nym-connect/templates/success index dbd26d69b8..4b547cb375 100644 --- a/.github/workflows/support-files/nym-connect/templates/success +++ b/.github/workflows/support-files/nym-connect/templates/success @@ -1,9 +1,14 @@ 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 > :rocket: {{ env.NYM_PROJECT_NAME }} ➡️➡️➡️➡️➡️ **View storybook:** https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}/ +> > ✅ **SUCCESS** +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}: ``` diff --git a/.github/workflows/support-files/nym-wallet/templates/failure b/.github/workflows/support-files/nym-wallet/templates/failure index adc2896ace..0db23cefaa 100644 --- a/.github/workflows/support-files/nym-wallet/templates/failure +++ b/.github/workflows/support-files/nym-wallet/templates/failure @@ -1,9 +1,14 @@ 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > 🔴 **FAILURE** :cry: +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message: ``` diff --git a/.github/workflows/support-files/nym-wallet/templates/success b/.github/workflows/support-files/nym-wallet/templates/success index 826f75e977..49f7787042 100644 --- a/.github/workflows/support-files/nym-wallet/templates/success +++ b/.github/workflows/support-files/nym-wallet/templates/success @@ -1,13 +1,18 @@ 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > ✅ **SUCCESS** - +> > ➡️➡️➡️➡️➡️ **View output:** +> > `storybook`: https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }} - +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}: ``` diff --git a/.github/workflows/support-files/package.json b/.github/workflows/support-files/package.json index 801d8e9bdd..01470a49b9 100644 --- a/.github/workflows/support-files/package.json +++ b/.github/workflows/support-files/package.json @@ -17,6 +17,7 @@ "remark-emoji": "^2.2.0", "remark-html": "^13.0.2", "remark-parse": "^9.0.0", + "showdown": "^2.1.0", "to-vfile": "^6.1.0", "unified": "^9.2.2" }, diff --git a/.github/workflows/support-files/ts-packages/templates/failure b/.github/workflows/support-files/ts-packages/templates/failure index adc2896ace..0db23cefaa 100644 --- a/.github/workflows/support-files/ts-packages/templates/failure +++ b/.github/workflows/support-files/ts-packages/templates/failure @@ -1,9 +1,14 @@ 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > 🔴 **FAILURE** :cry: +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message: ``` diff --git a/.github/workflows/support-files/ts-packages/templates/success b/.github/workflows/support-files/ts-packages/templates/success index bab42a29f8..48da9fee60 100644 --- a/.github/workflows/support-files/ts-packages/templates/success +++ b/.github/workflows/support-files/ts-packages/templates/success @@ -1,14 +1,20 @@ 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 > :rocket: {{ env.NYM_PROJECT_NAME }} +> > ✅ **SUCCESS** - +> > ➡️➡️➡️➡️➡️ **View output:** +> > `storybook`: https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }} +> > `example`: https://{{ env.NYM_CI_WWW_LOCATION }}-example.{{ env.NYM_CI_WWW_BASE }} - +> > `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }} +> > `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }} +> > `build ` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} +> Commit message by `{{ env.GITHUB_ACTOR }}` at {{ timestamp }}: ``` From 7e1e86bc77bb8d6438ba27f0e7a1f49288e4e28c Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Fri, 24 Feb 2023 14:06:41 +0100 Subject: [PATCH 510/591] build(nc-mobile): prepare for fdroid inclusion (#3102) * ci(nc-android): remove uneeded deps * chore(nc-mobile): improve android build * ci(nc-mobile): remove useless system deps * ci(nc-mobile): remove useless system deps * Revert "ci(nc-mobile): remove useless system deps" This reverts commit 011db2c58ed1361538376b2c9a2560cdde194ef7. * ci(nc-mobile): restore uneeded sys deps (<3 debian based distro) --- .github/workflows/connect-android-build.yml | 10 +- .github/workflows/connect-mobile.yml | 1 - nym-connect/mobile/package.json | 3 +- .../mobile/src-tauri/.cargo/config.toml | 41 --------- nym-connect/mobile/src-tauri/.cargo/libgcc.a | 1 - nym-connect/mobile/src-tauri/.gitignore | 1 + nym-connect/mobile/src-tauri/Cargo.lock | 91 ++++++++++--------- .../gen/android/nym_connect/.gitignore | 1 + .../src/main/jniLibs/x86_64/libnym_connect.so | 1 - .../nymtech/nym_connect/kotlin/BuildTask.kt | 11 ++- 10 files changed, 64 insertions(+), 97 deletions(-) delete mode 100644 nym-connect/mobile/src-tauri/.cargo/config.toml delete mode 100644 nym-connect/mobile/src-tauri/.cargo/libgcc.a delete mode 120000 nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/jniLibs/x86_64/libnym_connect.so diff --git a/.github/workflows/connect-android-build.yml b/.github/workflows/connect-android-build.yml index b2e2e8178e..fb8f837268 100644 --- a/.github/workflows/connect-android-build.yml +++ b/.github/workflows/connect-android-build.yml @@ -23,15 +23,12 @@ jobs: run: | sudo apt-get update sudo apt-get -y install \ - libwebkit2gtk-4.0-dev \ build-essential \ unzip \ curl \ wget \ libssl-dev \ - libgtk-3-dev \ squashfs-tools \ - libayatana-appindicator3-dev \ librsvg2-dev - name: Checkout @@ -64,6 +61,11 @@ jobs: - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable + # TODO this step takes a considerable amount of time + # We could avoid to compile from source tauri-cli and use instead + # pre-compiled binary provided by the node package `@tauri-apps/cli` + # But when using the later the build fails for some reason + # so keep installing and using tauri-cli - name: Install tauri cli run: cargo install tauri-cli --version "^2.0.0-alpha.2" @@ -93,11 +95,13 @@ jobs: - name: Build APK working-directory: nym-connect/mobile env: + # NODE_TAURI_CLI=${{ github.workspace }}/nym-connect/mobile/node_modules/.bin/tauri ANDROID_SDK_ROOT: ${{ env.ANDROID_HOME }} WRY_ANDROID_PACKAGE: net.nymtech.nym_connect WRY_ANDROID_LIBRARY: nym_connect # TODO build with release profile (--release), it will requires # to sign the APK. For now build with debug profile to avoid that + # TODO build using `yarn tauri`, provide NODE_TAURI_CLI, see TODO notes above run: cargo tauri android build --debug --apk --split-per-abi -t aarch64 # TODO add the version number to APK name diff --git a/.github/workflows/connect-mobile.yml b/.github/workflows/connect-mobile.yml index ccbd7203c4..05f0add6e2 100644 --- a/.github/workflows/connect-mobile.yml +++ b/.github/workflows/connect-mobile.yml @@ -49,7 +49,6 @@ jobs: librsvg2-dev \ libsoup-3.0-dev \ libjavascriptcoregtk-4.1-dev - #continue-on-error: true - name: Checkout uses: actions/checkout@v3 diff --git a/nym-connect/mobile/package.json b/nym-connect/mobile/package.json index 09df008b57..704f710c55 100644 --- a/nym-connect/mobile/package.json +++ b/nym-connect/mobile/package.json @@ -26,7 +26,8 @@ "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules", "clean:rust": "cargo clean --manifest-path src-tauri/Cargo.toml", - "clean:": "run-p clean:node clean:rust" + "clean:android": "cd src-tauri/gen/android/nym_connect/ && gradlew clean", + "clean:": "run-p clean:node clean:rust clean:android" }, "dependencies": { "@emotion/react": "^11.7.0", diff --git a/nym-connect/mobile/src-tauri/.cargo/config.toml b/nym-connect/mobile/src-tauri/.cargo/config.toml deleted file mode 100644 index be3873a8cf..0000000000 --- a/nym-connect/mobile/src-tauri/.cargo/config.toml +++ /dev/null @@ -1,41 +0,0 @@ -[build] -target = 'x86_64-unknown-linux-gnu' -[target.aarch64-linux-android] -linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang' -rustflags = [ - '-L', - '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', - '-Clink-arg=-landroid', - '-Clink-arg=-llog', - '-Clink-arg=-lOpenSLES', -] - -[target.armv7-linux-androideabi] -linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi24-clang' -rustflags = [ - '-L', - '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', - '-Clink-arg=-landroid', - '-Clink-arg=-llog', - '-Clink-arg=-lOpenSLES', -] - -[target.i686-linux-android] -linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android24-clang' -rustflags = [ - '-L', - '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', - '-Clink-arg=-landroid', - '-Clink-arg=-llog', - '-Clink-arg=-lOpenSLES', -] - -[target.x86_64-linux-android] -linker = '/home/pierre/.local/share/android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android24-clang' -rustflags = [ - '-L', - '/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/.cargo', - '-Clink-arg=-landroid', - '-Clink-arg=-llog', - '-Clink-arg=-lOpenSLES', -] diff --git a/nym-connect/mobile/src-tauri/.cargo/libgcc.a b/nym-connect/mobile/src-tauri/.cargo/libgcc.a deleted file mode 100644 index a5f3b046c1..0000000000 --- a/nym-connect/mobile/src-tauri/.cargo/libgcc.a +++ /dev/null @@ -1 +0,0 @@ -INPUT(-lunwind) \ No newline at end of file diff --git a/nym-connect/mobile/src-tauri/.gitignore b/nym-connect/mobile/src-tauri/.gitignore index c123704591..296ceb2535 100644 --- a/nym-connect/mobile/src-tauri/.gitignore +++ b/nym-connect/mobile/src-tauri/.gitignore @@ -2,3 +2,4 @@ # will have compiled files and executables /target/ WixTools +/.cargo/ diff --git a/nym-connect/mobile/src-tauri/Cargo.lock b/nym-connect/mobile/src-tauri/Cargo.lock index 1b1d0b29e7..f4efc94970 100644 --- a/nym-connect/mobile/src-tauri/Cargo.lock +++ b/nym-connect/mobile/src-tauri/Cargo.lock @@ -245,9 +245,9 @@ dependencies = [ [[package]] name = "bip39" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e89470017230c38e52b82b3ee3f530db1856ba1d434e3a67a3456a8a8dec5f" +checksum = "f5b9d9748b5770d1539657653dc5ac3cd9353549e74238dc0d96c22919128b94" dependencies = [ "bitcoin_hashes", "rand 0.6.5", @@ -258,9 +258,9 @@ dependencies = [ [[package]] name = "bitcoin_hashes" -version = "0.9.7" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce18265ec2324ad075345d5814fbeed4f41f0a660055dc78840b74d19b874b1" +checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" [[package]] name = "bitflags" @@ -397,9 +397,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f0778972c64420fdedc63f09919c8a88bda7b25135357fd25a5d9f3257e832" +checksum = "5ffdb39cb703212f3c11973452c2861b972f757b021158f3516ba10f2fa8b2c1" dependencies = [ "memchr", "serde", @@ -571,9 +571,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.1.2" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd125be87bf4c255ebc50de0b7f4d2a6201e8ac3dc86e39c0ad081dc5e7236fe" +checksum = "0012995dc3a54314f4710f5631d74767e73c534b8757221708303e48eef7a19b" dependencies = [ "clap", ] @@ -603,9 +603,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" +checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09" dependencies = [ "os_str_bytes", ] @@ -636,7 +636,7 @@ dependencies = [ "sqlx 0.6.2", "tap", "thiserror", - "time 0.3.18", + "time 0.3.19", "tokio", "tokio-stream", "url", @@ -2040,15 +2040,15 @@ dependencies = [ [[package]] name = "generator" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266041a359dfa931b370ef684cceb84b166beb14f7f0421f4a6a3d0c446d12e" +checksum = "33a20a288a94683f5f4da0adecdbe095c94a77c295e514cc6484e9394dd8376e" dependencies = [ "cc", "libc", "log", "rustversion", - "windows 0.39.0", + "windows 0.44.0", ] [[package]] @@ -2533,9 +2533,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -2826,9 +2826,9 @@ checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" [[package]] name = "is-terminal" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" +checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", @@ -3159,7 +3159,7 @@ dependencies = [ "dirs-next", "objc-foundation", "objc_id", - "time 0.3.18", + "time 0.3.19", ] [[package]] @@ -3355,11 +3355,12 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.7.1" +version = "4.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260208751689b605138bb55ab6af43ad75f628619a7e0b818d63bf6629e59467" +checksum = "2bfa211d18e360f08e36c364308f394b5eb23a6629150690e109a916dc6f610e" dependencies = [ "dbus", + "log", "mac-notification-sys", "tauri-winrt-notification", ] @@ -3428,18 +3429,18 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d829733185c1ca374f17e52b762f24f535ec625d2cc1f070e34c8a9068f341b" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3584,7 +3585,7 @@ dependencies = [ "serde_json", "serde_repr", "thiserror", - "time 0.3.18", + "time 0.3.19", ] [[package]] @@ -4348,16 +4349,16 @@ checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "plist" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5329b8f106a176ab0dce4aae5da86bfcb139bb74fb00882859e03745011f3635" +checksum = "9469799ca90293a376f68f6fcb8f11990d9cff55602cfba0ba83893c973a7f46" dependencies = [ - "base64 0.13.1", + "base64 0.21.0", "indexmap", "line-wrap", "quick-xml 0.26.0", "serde", - "time 0.3.18", + "time 0.3.19", ] [[package]] @@ -5444,9 +5445,9 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg 1.1.0", ] @@ -5873,9 +5874,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -6073,7 +6074,7 @@ dependencies = [ "sha2 0.10.6", "tauri-utils", "thiserror", - "time 0.3.18", + "time 0.3.19", "url", "uuid 1.3.0", "walkdir", @@ -6213,7 +6214,7 @@ dependencies = [ "subtle 2.4.1", "subtle-encoding", "tendermint-proto", - "time 0.3.18", + "time 0.3.19", "zeroize", ] @@ -6246,7 +6247,7 @@ dependencies = [ "serde", "serde_bytes", "subtle-encoding", - "time 0.3.18", + "time 0.3.19", ] [[package]] @@ -6274,7 +6275,7 @@ dependencies = [ "tendermint-config", "tendermint-proto", "thiserror", - "time 0.3.18", + "time 0.3.19", "tokio", "tracing", "url", @@ -6351,9 +6352,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af0097eaf301d576d0b2aead7a59facab6d53cc636340f0291fab8446a2e8613" +checksum = "53250a3b3fed8ff8fd988587d8925d26a83ac3845d9e03b220b37f34c2b8d6c2" dependencies = [ "itoa 1.0.5", "js-sys", @@ -6370,9 +6371,9 @@ checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "a460aeb8de6dcb0f381e1ee05f1cd56fcf5a5f6eb8187ff3d8f0b11078d38b7c" dependencies = [ "time-core", ] @@ -6453,9 +6454,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" dependencies = [ "futures-core", "pin-project-lite", @@ -6839,7 +6840,7 @@ dependencies = [ "rustc_version 0.4.0", "rustversion", "thiserror", - "time 0.3.18", + "time 0.3.19", ] [[package]] diff --git a/nym-connect/mobile/src-tauri/gen/android/nym_connect/.gitignore b/nym-connect/mobile/src-tauri/gen/android/nym_connect/.gitignore index b2ed2681b2..edf9888947 100644 --- a/nym-connect/mobile/src-tauri/gen/android/nym_connect/.gitignore +++ b/nym-connect/mobile/src-tauri/gen/android/nym_connect/.gitignore @@ -13,3 +13,4 @@ build .externalNativeBuild .cxx local.properties +app/src/main/jniLibs/** diff --git a/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/jniLibs/x86_64/libnym_connect.so b/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/jniLibs/x86_64/libnym_connect.so deleted file mode 120000 index faa3a3d96f..0000000000 --- a/nym-connect/mobile/src-tauri/gen/android/nym_connect/app/src/main/jniLibs/x86_64/libnym_connect.so +++ /dev/null @@ -1 +0,0 @@ -/home/pierre/Documents/nym/nym/nym-connect-new/mobile/src-tauri/target/x86_64-linux-android/debug/libnym_connect.so \ No newline at end of file diff --git a/nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/BuildTask.kt b/nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/BuildTask.kt index 1fe737b980..5f63ba21c5 100644 --- a/nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/BuildTask.kt +++ b/nym-connect/mobile/src-tauri/gen/android/nym_connect/buildSrc/src/main/java/net/nymtech/nym_connect/kotlin/BuildTask.kt @@ -26,17 +26,20 @@ open class BuildTask : DefaultTask() { val rootDirRel = rootDirRel ?: throw GradleException("rootDirRel cannot be null") val target = target ?: throw GradleException("target cannot be null") val release = release ?: throw GradleException("release cannot be null") + val nodeExecutable = System.getenv("NODE_TAURI_CLI") val home = (System.getenv("HOME") ?: "") val cargoHome = (System.getenv("CARGO_HOME") ?: "$home/.cargo") - val tauriCli = "$cargoHome/bin/cargo-tauri" - if (!File(tauriCli).isFile()) { - throw GradleException("$tauriCli no shuch file") + val rustExecutable = "$cargoHome/bin/cargo-tauri" + val tauriCli = when { + !nodeExecutable.isNullOrEmpty() && File(nodeExecutable).isFile() -> nodeExecutable + File(rustExecutable).isFile() -> rustExecutable + else -> throw GradleException("couldn't find tauri-cli executable") } println("gradle Rust plugin, using tauri cli executable: $tauriCli") project.exec { workingDir(File(project.projectDir, rootDirRel.path)) executable(tauriCli) - args(listOf("tauri", "android", "android-studio-script")) + args(listOf("android", "android-studio-script")) if (project.logger.isEnabled(LogLevel.DEBUG)) { args("-vv") } else if (project.logger.isEnabled(LogLevel.INFO)) { From cd9cdfa5bb00aafef94cd6780b64f987f8a82f42 Mon Sep 17 00:00:00 2001 From: benedettadavico Date: Fri, 24 Feb 2023 14:06:56 +0100 Subject: [PATCH 511/591] some small api test fixes --- .../mixnode/contract-cache-mixnode.test.ts | 4 +-- .../status/status-gateway.test.ts | 17 ++++++++----- .../status/status-mixnode.test.ts | 19 ++++++++------ nym-api/tests/src/config/config.yaml | 2 +- nym-api/tests/src/endpoints/Status.ts | 5 ++-- nym-api/tests/src/types/StatusInterfaces.ts | 25 +++++++++++++------ 6 files changed, 46 insertions(+), 26 deletions(-) diff --git a/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts index 1605cd0bf4..31fb8d959d 100644 --- a/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts +++ b/nym-api/tests/functional_test/contract_cache/mixnode/contract-cache-mixnode.test.ts @@ -34,7 +34,7 @@ describe("Get mixnode data", (): void => { expect(typeof mixnode.bond_information.mix_node.verloc_port).toBe("number"); expect(typeof mixnode.bond_information.mix_node.mix_port).toBe("number"); expect(mixnode.bond_information.mix_node.mix_port).toStrictEqual(1789); - expect(mixnode.bond_information.mix_node.verloc_port).toStrictEqual(1790); + expect(typeof mixnode.bond_information.mix_node.verloc_port).toBe("number"); const identitykey = mixnode.bond_information.mix_node.identity_key; if (typeof identitykey === "string") { @@ -96,7 +96,7 @@ describe("Get mixnode data", (): void => { expect(typeof mixnode.mixnode_details.bond_information.mix_node.verloc_port).toBe("number"); expect(typeof mixnode.mixnode_details.bond_information.mix_node.mix_port).toBe("number"); expect(mixnode.mixnode_details.bond_information.mix_node.mix_port).toStrictEqual(1789); - expect(mixnode.mixnode_details.bond_information.mix_node.verloc_port).toStrictEqual(1790); + expect(typeof mixnode.mixnode_details.bond_information.mix_node.verloc_port).toBe("number"); const identitykey2 = mixnode.mixnode_details.bond_information.mix_node.identity_key if (typeof identitykey2 === "string") { diff --git a/nym-api/tests/functional_test/status/status-gateway.test.ts b/nym-api/tests/functional_test/status/status-gateway.test.ts index b14b71ddb8..ead1da8278 100644 --- a/nym-api/tests/functional_test/status/status-gateway.test.ts +++ b/nym-api/tests/functional_test/status/status-gateway.test.ts @@ -15,19 +15,24 @@ describe("Get gateway data", (): void => { response.forEach((x) => { expect(typeof x.gateway_bond.owner).toBe("string"); expect(typeof x.performance).toBe("string"); + expect(typeof x.node_performance.last_24h).toBe("string"); }); }); it("Get a gateway history", async (): Promise => { const identity_key = config.environmnetConfig.gateway_identity; const response = await status.getGatewayHistory(identity_key); - response.history.forEach((x) => { - expect(typeof x.date).toBe("string"); - expect(typeof x.uptime).toBe("number"); - }); - expect(identity_key).toStrictEqual(response.identity); - expect(typeof response.owner).toBe("string"); + if ("identity" in response) { + response.history.forEach((x) => { + expect(typeof x.date).toBe("string"); + expect(typeof x.uptime).toBe("number"); + }); + expect(identity_key).toStrictEqual(response.identity); + expect(typeof response.owner).toBe("string"); + } else if ("message" in response) { + expect(response.message).toContain("could not find uptime history associated with gateway"); + } }); it("Get gateway core status count", async (): Promise => { diff --git a/nym-api/tests/functional_test/status/status-mixnode.test.ts b/nym-api/tests/functional_test/status/status-mixnode.test.ts index 1a6b02f655..8f8306e740 100644 --- a/nym-api/tests/functional_test/status/status-mixnode.test.ts +++ b/nym-api/tests/functional_test/status/status-mixnode.test.ts @@ -39,13 +39,16 @@ describe("Get mixnode data", (): void => { const identity_key = config.environmnetConfig.mix_id; const response = await status.getMixnodeHistory(identity_key); - response.history.forEach((x) => { - expect(typeof x.date).toBe("string"); - expect(typeof x.uptime).toBe("number"); - }); - - expect(identity_key).toStrictEqual(response.mix_id); - expect(typeof response.owner).toBe("string"); + if ("mix_id" in response) { + response.history.forEach((x) => { + expect(typeof x.date).toBe("string"); + expect(typeof x.uptime).toBe("number"); + }); + expect(identity_key).toStrictEqual(response.mix_id); + expect(typeof response.owner).toBe("string"); + } else if ("message" in response) { + expect(response.message).toContain("could not find uptime history associated with mixnode"); + } }); it("Get a mixnode core count", async (): Promise => { @@ -109,7 +112,7 @@ describe("Compute mixnode reward estimation", (): void => { config = ConfigHandler.getInstance(); }); it("with correct data", async (): Promise => { - const response = await status.sendMixnodeRewardEstimatedComputation(7); + const response = await status.sendMixnodeRewardEstimatedComputation(63); expect(typeof response.estimation.delegates).toBe("string"); }); diff --git a/nym-api/tests/src/config/config.yaml b/nym-api/tests/src/config/config.yaml index 8a0007600e..83a9d3fa92 100644 --- a/nym-api/tests/src/config/config.yaml +++ b/nym-api/tests/src/config/config.yaml @@ -4,7 +4,7 @@ common: Content-Type: application/json qa: api_base_url: https://qwerty-validator-api.qa.nymte.ch/api/v1 - mix_id: 7 + mix_id: 63 identity_key: 4Yr4qmEHd9sgsuQ83191FR2hD88RfsbMmB4tzhhZWriz gateway_identity: 336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9 log_level: error diff --git a/nym-api/tests/src/endpoints/Status.ts b/nym-api/tests/src/endpoints/Status.ts index de6aa7da9c..096e90cd88 100644 --- a/nym-api/tests/src/endpoints/Status.ts +++ b/nym-api/tests/src/endpoints/Status.ts @@ -7,6 +7,7 @@ import { InclusionProbabilities, InclusionProbability, NodeHistory, + NoUptime, Report, RewardEstimation, StakeSaturation, @@ -36,7 +37,7 @@ export default class Status extends APIClient { return response.data; } - public async getGatewayHistory(identity_key: string): Promise { + public async getGatewayHistory(identity_key: string): Promise { const response = await this.restClient.sendGet({ route: `/gateway/${identity_key}/history`, }); @@ -111,7 +112,7 @@ export default class Status extends APIClient { return response.data; } - public async getMixnodeHistory(mix_id: number): Promise { + public async getMixnodeHistory(mix_id: number): Promise { const response = await this.restClient.sendGet({ route: `/mixnode/${mix_id}/history`, }); diff --git a/nym-api/tests/src/types/StatusInterfaces.ts b/nym-api/tests/src/types/StatusInterfaces.ts index 3c14f0c485..069c509ace 100644 --- a/nym-api/tests/src/types/StatusInterfaces.ts +++ b/nym-api/tests/src/types/StatusInterfaces.ts @@ -27,13 +27,6 @@ export interface Node { in_active_set: boolean; } -export interface RewardEstimation { - estimation: Estimation; - reward_params: RewardParams; - epoch: Epoch; - as_at: number; -} - export interface Estimation { total_node_reward: string; operator: string; @@ -41,6 +34,13 @@ export interface Estimation { operating_cost: string; } +export interface RewardEstimation { + estimation: Estimation; + reward_params: RewardParams; + epoch: Epoch; + as_at: number; +} + export interface RewardParams { interval: Interval; rewarded_set_size: number; @@ -129,6 +129,10 @@ export interface NodeHistory { history: History[]; } +export interface NoUptime { + message: string; +} + export interface CoreCount { mix_id: number; identity: string; @@ -162,9 +166,16 @@ export interface GatewayBond { proxy?: any; } +export interface nodePerformance { + most_recent: string; + last_hour: string; + last_24h: string; +} + export interface DetailedGateway { gateway_bond: GatewayBond; performance: string; + node_performance: nodePerformance; } export interface OriginalPledge { From f0d970358744cdf06eae9497a08e045492660af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Fri, 24 Feb 2023 16:52:56 +0200 Subject: [PATCH 512/591] Feature/fix db name collision (#3103) * Fix db naming collision * Increase gateway timeout to accommodate bandwidth spending time --- clients/client-core/src/config/mod.rs | 4 ++-- clients/credential/src/main.rs | 7 +++++-- common/config/src/lib.rs | 2 +- nym-api/src/support/config/mod.rs | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index a48b2b59b9..5d9a243bbb 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use nym_config::defaults::NymNetworkDetails; -use nym_config::{NymConfig, OptionalSet, DB_FILE_NAME}; +use nym_config::{NymConfig, OptionalSet, CRED_DB_FILE_NAME}; use nym_sphinx::params::PacketSize; use serde::{Deserialize, Serialize}; use std::marker::PhantomData; @@ -579,7 +579,7 @@ impl Client { } fn default_database_path(id: &str) -> PathBuf { - T::default_data_directory(id).join(DB_FILE_NAME) + T::default_data_directory(id).join(CRED_DB_FILE_NAME) } } diff --git a/clients/credential/src/main.rs b/clients/credential/src/main.rs index 2a47930510..90e7a27f32 100644 --- a/clients/credential/src/main.rs +++ b/clients/credential/src/main.rs @@ -11,7 +11,7 @@ use commands::*; use error::Result; use log::*; use nym_bin_common::completions::fig_generate; -use nym_config::{DATA_DIR, DB_FILE_NAME}; +use nym_config::{CRED_DB_FILE_NAME, DATA_DIR}; use nym_network_defaults::{setup_env, NymNetworkDetails}; use std::process::exit; use std::time::{Duration, SystemTime}; @@ -73,7 +73,10 @@ async fn main() -> Result<()> { match args.command { Command::Run(r) => { - let db_path = r.client_home_directory.join(DATA_DIR).join(DB_FILE_NAME); + let db_path = r + .client_home_directory + .join(DATA_DIR) + .join(CRED_DB_FILE_NAME); let shared_storage = credential_storage::initialise_storage(db_path).await; let recovery_storage = recovery_storage::RecoveryStorage::new(r.recovery_dir)?; diff --git a/common/config/src/lib.rs b/common/config/src/lib.rs index 746e1c6443..4d38e55467 100644 --- a/common/config/src/lib.rs +++ b/common/config/src/lib.rs @@ -18,7 +18,7 @@ pub mod defaults; pub const CONFIG_DIR: &str = "config"; pub const DATA_DIR: &str = "data"; -pub const DB_FILE_NAME: &str = "db.sqlite"; +pub const CRED_DB_FILE_NAME: &str = "credentials_database.db"; pub trait NymConfig: Default + Serialize + DeserializeOwned { fn template() -> &'static str; diff --git a/nym-api/src/support/config/mod.rs b/nym-api/src/support/config/mod.rs index 25d949cd11..e9d8f02914 100644 --- a/nym-api/src/support/config/mod.rs +++ b/nym-api/src/support/config/mod.rs @@ -26,7 +26,8 @@ const DEFAULT_GATEWAY_PING_INTERVAL: Duration = Duration::from_secs(60); // bought bandwidth tokens to not have time to be spent; Once we remove the gateway from the // bandwidth bridging protocol, we can come back to a smaller timeout value const DEFAULT_GATEWAY_RESPONSE_TIMEOUT: Duration = Duration::from_secs(5 * 60); -const DEFAULT_GATEWAY_CONNECTION_TIMEOUT: Duration = Duration::from_millis(2_500); +// This timeout value should be big enough to accommodate an initial bandwidth acquirement +const DEFAULT_GATEWAY_CONNECTION_TIMEOUT: Duration = Duration::from_secs(2 * 60); const DEFAULT_TEST_ROUTES: usize = 3; const DEFAULT_MINIMUM_TEST_ROUTES: usize = 1; From dc08b1170a789c1358cea47c86ef1ab8a7f3eb59 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 27 Feb 2023 10:03:28 +0100 Subject: [PATCH 513/591] add gitlab agent --- .gitlab/agents/websites-agent/config.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitlab/agents/websites-agent/config.yaml diff --git a/.gitlab/agents/websites-agent/config.yaml b/.gitlab/agents/websites-agent/config.yaml new file mode 100644 index 0000000000..e69de29bb2 From 1ba6444e722e7757f1175a296bed6e31e25b8db8 Mon Sep 17 00:00:00 2001 From: farbanas Date: Mon, 27 Feb 2023 10:10:42 +0100 Subject: [PATCH 514/591] delete gitlab agent --- .gitlab/agents/websites-agent/config.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitlab/agents/websites-agent/config.yaml diff --git a/.gitlab/agents/websites-agent/config.yaml b/.gitlab/agents/websites-agent/config.yaml deleted file mode 100644 index e69de29bb2..0000000000 From d5ad504104a98e55b77dccf470d840c6436c8540 Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Mon, 27 Feb 2023 10:58:19 +0000 Subject: [PATCH 515/591] reuseable storage functions --- nym-connect/desktop/src/utils/index.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/nym-connect/desktop/src/utils/index.ts b/nym-connect/desktop/src/utils/index.ts index fefef166d7..04b415c026 100644 --- a/nym-connect/desktop/src/utils/index.ts +++ b/nym-connect/desktop/src/utils/index.ts @@ -1,6 +1,8 @@ import { useEffect, useRef } from 'react'; import { EventName, listen, UnlistenFn, EventCallback } from '@tauri-apps/api/event'; import { invoke } from '@tauri-apps/api'; +import { forage } from '@tauri-apps/tauri-forage'; +import { StorageKeyValue } from 'src/types/storage'; export const useTauriEvents = (event: EventName, handler: EventCallback) => { const unlisten = useRef(); @@ -22,3 +24,25 @@ export const useTauriEvents = (event: EventName, handler: EventCallback) = export const toggleLogViewer = async () => { await invoke('help_log_toggle_window'); }; + +export async function setItemInStorage({ key, value }: StorageKeyValue) { + try { + await forage.setItem({ + key, + value, + } as any)(); + } catch (e) { + console.warn(e); + } + return undefined; +} + +export const getItemFromStorage = async ({ key }: Pick, 'key'>) => { + try { + const gatewayFromStorage = await forage.getItem({ key })(); + return gatewayFromStorage; + } catch (e) { + console.warn(e); + } + return undefined; +}; From 7a4c6e4ed46e592430410a9b0591c17ee162d96f Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Mon, 27 Feb 2023 10:58:31 +0000 Subject: [PATCH 516/591] storage type update types --- .../menu/settings/ServiceProviderSettings.tsx | 37 +++++++++++-------- .../desktop/src/types/service-provider.ts | 9 +++++ nym-connect/desktop/src/types/storage.ts | 4 ++ 3 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 nym-connect/desktop/src/types/service-provider.ts create mode 100644 nym-connect/desktop/src/types/storage.ts diff --git a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx index 8906c67129..1d7fe62f13 100644 --- a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx @@ -1,4 +1,4 @@ -import React, { ChangeEvent, useState } from 'react'; +import React, { ChangeEvent, useEffect, useState } from 'react'; import { Autocomplete, Box, @@ -15,18 +15,22 @@ import { ConnectionStatusKind } from 'src/types'; import { useClientContext } from 'src/context/main'; export const ServiceProviderSettings = () => { - const [spAddress, setSPAddress] = useState(); - const [isOn, setIsOn] = useState(false); - - const { connectionStatus, serviceProviders } = useClientContext(); + const { connectionStatus, serviceProviders, userDefinedSPAddress, setUserDefinedSPAddress } = useClientContext(); const toggleOnOff = (e: ChangeEvent) => { - if (!isOn) setSPAddress(undefined); - setIsOn(e.target.checked); + setUserDefinedSPAddress((current) => ({ ...current, isActive: e.target.checked })); }; const handleSelectFromList = (value: string | null) => { - setSPAddress(value ?? undefined); + setUserDefinedSPAddress((current) => ({ ...current, address: value ?? undefined })); + }; + + const getSPDescription = (spAddress: string) => { + const match = serviceProviders?.find((sp) => sp.address === spAddress); + + if (match) return match.description; + + return 'The service provider specified is not in our known list.'; }; return ( @@ -43,40 +47,43 @@ export const ServiceProviderSettings = () => { } - label={isOn ? 'On' : 'Off'} + label={userDefinedSPAddress.isActive ? 'On' : 'Off'} /> {connectionStatus === ConnectionStatusKind.connected && ( This setting is disabled during an active connection )} - {isOn && serviceProviders && ( + {userDefinedSPAddress.isActive && serviceProviders && ( `${sp.address.substring(0, 20)}...`)} + options={serviceProviders.map((sp) => sp.address)} + getOptionLabel={(address) => `${address.substring(0, 18)}...`} freeSolo onChange={(e, value) => handleSelectFromList(value)} - value={spAddress} size="small" renderInput={(params) => ( console.log(e.target.value)} placeholder="Service provider" + onChange={(e) => setUserDefinedSPAddress((current) => ({ ...current, address: e.target.value }))} /> )} ListboxProps={{ style: { background: 'unset', fontSize: '14px' } }} /> )} + {userDefinedSPAddress.address && userDefinedSPAddress.isActive && ( + {getSPDescription(userDefinedSPAddress.address)} + )} diff --git a/nym-connect/desktop/src/types/service-provider.ts b/nym-connect/desktop/src/types/service-provider.ts new file mode 100644 index 0000000000..ed370e2755 --- /dev/null +++ b/nym-connect/desktop/src/types/service-provider.ts @@ -0,0 +1,9 @@ +export interface UserDefinedGateway { + isActive: boolean; + gateway?: string; +} + +export interface UserDefinedSPAddress { + isActive: boolean; + address?: string; +} diff --git a/nym-connect/desktop/src/types/storage.ts b/nym-connect/desktop/src/types/storage.ts new file mode 100644 index 0000000000..ca792b65d9 --- /dev/null +++ b/nym-connect/desktop/src/types/storage.ts @@ -0,0 +1,4 @@ +export interface StorageKeyValue { + key: string; + value: T; +} From 9644eb43298dd655af73b312685c3d933d763d55 Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Mon, 27 Feb 2023 10:59:28 +0000 Subject: [PATCH 517/591] pick service provider --- .../desktop/src/components/AppWindowFrame.tsx | 2 +- nym-connect/desktop/src/context/main.tsx | 82 +++++++++++-------- .../desktop/src/context/mocks/main.tsx | 4 +- .../desktop/src/pages/connection/index.tsx | 2 +- nym-connect/desktop/src/types/gateway.ts | 4 - 5 files changed, 52 insertions(+), 42 deletions(-) delete mode 100644 nym-connect/desktop/src/types/gateway.ts diff --git a/nym-connect/desktop/src/components/AppWindowFrame.tsx b/nym-connect/desktop/src/components/AppWindowFrame.tsx index 929b0f269f..01aa390286 100644 --- a/nym-connect/desktop/src/components/AppWindowFrame.tsx +++ b/nym-connect/desktop/src/components/AppWindowFrame.tsx @@ -11,7 +11,7 @@ export const AppWindowFrame: FCWithChildren = ({ children }) => { // defined functions to be used when moving away from pages const onBack = () => { switch (location.pathname) { - case '/menu/settings': + case '/menu/settings/gateway': return () => { // when the user moves away from the settings page and the gateway is not valid // set isActive to false diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index 2efdc49289..5de2ae1bc5 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -4,13 +4,14 @@ import { invoke } from '@tauri-apps/api'; import { Error } from 'src/types/error'; import { getVersion } from '@tauri-apps/api/app'; import { useEvents } from 'src/hooks/events'; -import { UserDefinedGateway } from 'src/types/gateway'; -import { forage } from '@tauri-apps/tauri-forage'; +import { UserDefinedGateway, UserDefinedSPAddress } from 'src/types/service-provider'; import { ConnectionStatusKind, GatewayPerformance } from '../types'; import { ConnectionStatsItem } from '../components/ConnectionStats'; import { ServiceProvider } from '../types/directory'; +import { getItemFromStorage, setItemInStorage } from 'src/utils'; -const FORAGE_KEY = 'nym-connect-user-gateway'; +const FORAGE_GATEWAY_KEY = 'nym-connect-user-gateway'; +const FORAGE_SP_KEY = 'nym-connect-user-sp'; type ModeType = 'light' | 'dark'; @@ -25,6 +26,7 @@ export type TClientContext = { selectedProvider?: ServiceProvider; showInfoModal: boolean; userDefinedGateway?: UserDefinedGateway; + userDefinedSPAddress: UserDefinedSPAddress; serviceProviders?: ServiceProvider[]; setMode: (mode: ModeType) => void; clearError: () => void; @@ -32,10 +34,11 @@ export type TClientContext = { setConnectionStats: (connectionStats: ConnectionStatsItem[] | undefined) => void; setConnectedSince: (connectedSince: DateTime | undefined) => void; setShowInfoModal: (show: boolean) => void; - setRandomSerivceProvider: () => void; + setSerivceProvider: () => void; startConnecting: () => Promise; startDisconnecting: () => Promise; setUserDefinedGateway: React.Dispatch>; + setUserDefinedSPAddress: React.Dispatch>; }; export const ClientContext = createContext({} as TClientContext); @@ -51,43 +54,39 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { const [appVersion, setAppVersion] = useState(); const [gatewayPerformance, setGatewayPerformance] = useState('Good'); const [showInfoModal, setShowInfoModal] = useState(false); - const [userDefinedGateway, setUserDefinedGateway] = useState({ isActive: false, gateway: '' }); + const [userDefinedGateway, setUserDefinedGateway] = useState({ + isActive: false, + gateway: undefined, + }); + const [userDefinedSPAddress, setUserDefinedSPAddress] = useState({ + isActive: false, + address: undefined, + }); const getAppVersion = async () => { const version = await getVersion(); return version; }; - const setUserGatewayInStorage = async (gateway: UserDefinedGateway) => { - try { - await forage.setItem({ - key: FORAGE_KEY, - value: gateway, - } as any)(); - } catch (e) { - console.warn(e); - } - return undefined; - }; + useEffect(() => { + setItemInStorage({ key: FORAGE_GATEWAY_KEY, value: userDefinedGateway }); + }, [userDefinedGateway]); - const getUserGatewayFromStorage = async (): Promise => { - try { - const gatewayFromStorage = await forage.getItem({ key: FORAGE_KEY })(); - return gatewayFromStorage; - } catch (e) { - console.warn(e); - } - return undefined; - }; + useEffect(() => { + setItemInStorage({ key: FORAGE_SP_KEY, value: userDefinedSPAddress }); + }, [userDefinedGateway]); const initialiseApp = async () => { const services = await invoke('get_services'); const AppVersion = await getAppVersion(); - const storedUserDefinedGateway = await getUserGatewayFromStorage(); + const storedUserDefinedGateway = await getItemFromStorage({ key: FORAGE_GATEWAY_KEY }); + const storedUserDefinedSP = await getItemFromStorage({ key: FORAGE_SP_KEY }); setAppVersion(AppVersion); setServiceProviders(services as ServiceProvider[]); + if (storedUserDefinedGateway) setUserDefinedGateway(storedUserDefinedGateway); + if (storedUserDefinedSP) setUserDefinedSPAddress(storedUserDefinedSP); }; useEvents({ @@ -126,27 +125,37 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { }, []); const shouldUseUserGateway = !!userDefinedGateway.gateway && userDefinedGateway.isActive; + const shouldUseUserSP = !!userDefinedSPAddress.address && userDefinedSPAddress.isActive; const setServiceProvider = async (newServiceProvider: ServiceProvider) => { await invoke('set_gateway', { - gateway: newServiceProvider.gateway, + gateway: shouldUseUserGateway ? userDefinedGateway.gateway : newServiceProvider.gateway, + }); + await invoke('set_service_provider', { + serviceProvider: shouldUseUserSP ? userDefinedSPAddress.address : newServiceProvider.address, }); - await invoke('set_service_provider', { serviceProvider: newServiceProvider.address }); }; const getRandomSPFromList = (services: ServiceProvider[]) => { const randomSelection = services[Math.floor(Math.random() * services.length)]; - - if (shouldUseUserGateway) return { ...randomSelection, gateway: userDefinedGateway.gateway } as ServiceProvider; return randomSelection; }; - const setRandomSerivceProvider = async () => { + const buildServiceProvider = async (serviceProvider: ServiceProvider) => { + let sp = { ...serviceProvider }; + + if (shouldUseUserGateway) sp.gateway = userDefinedGateway.gateway as string; + if (shouldUseUserSP) sp.address = userDefinedSPAddress.address as string; + + return sp; + }; + + const setSerivceProvider = async () => { if (serviceProviders) { const randomServiceProvider = getRandomSPFromList(serviceProviders); - await setServiceProvider(randomServiceProvider); - await setUserGatewayInStorage(userDefinedGateway); - setSelectedProvider(randomServiceProvider); + const withUserDefinitions = await buildServiceProvider(randomServiceProvider); + await setServiceProvider(withUserDefinitions); + setSelectedProvider(withUserDefinitions); } return undefined; }; @@ -169,13 +178,15 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { serviceProviders, connectedSince, setConnectedSince, - setRandomSerivceProvider, + setSerivceProvider, startConnecting, startDisconnecting, gatewayPerformance, setShowInfoModal, + userDefinedSPAddress, userDefinedGateway, setUserDefinedGateway, + setUserDefinedSPAddress, }), [ mode, @@ -190,6 +201,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { gatewayPerformance, selectedProvider, userDefinedGateway, + userDefinedSPAddress, ], ); diff --git a/nym-connect/desktop/src/context/mocks/main.tsx b/nym-connect/desktop/src/context/mocks/main.tsx index 6d0f7d9a82..78028b03f8 100644 --- a/nym-connect/desktop/src/context/mocks/main.tsx +++ b/nym-connect/desktop/src/context/mocks/main.tsx @@ -10,6 +10,7 @@ const mockValues: TClientContext = { gatewayPerformance: 'Good', showInfoModal: false, userDefinedGateway: { isActive: false, gateway: '' }, + userDefinedSPAddress: { isActive: false, address: '' }, setShowInfoModal: () => {}, setMode: () => {}, clearError: () => {}, @@ -18,8 +19,9 @@ const mockValues: TClientContext = { setConnectionStatus: () => {}, startConnecting: async () => {}, startDisconnecting: async () => {}, - setRandomSerivceProvider: () => {}, + setSerivceProvider: () => {}, setUserDefinedGateway: () => {}, + setUserDefinedSPAddress: () => {}, }; export const MockProvider: FCWithChildren<{ diff --git a/nym-connect/desktop/src/pages/connection/index.tsx b/nym-connect/desktop/src/pages/connection/index.tsx index 028ddcf21d..2ba081331f 100644 --- a/nym-connect/desktop/src/pages/connection/index.tsx +++ b/nym-connect/desktop/src/pages/connection/index.tsx @@ -28,7 +28,7 @@ export const ConnectionPage = () => { // eslint-disable-next-line default-case switch (currentStatus) { case 'disconnected': - await context.setRandomSerivceProvider(); + await context.setSerivceProvider(); await context.startConnecting(); context.setConnectedSince(DateTime.now()); context.setShowInfoModal(true); diff --git a/nym-connect/desktop/src/types/gateway.ts b/nym-connect/desktop/src/types/gateway.ts deleted file mode 100644 index 735a3cdb03..0000000000 --- a/nym-connect/desktop/src/types/gateway.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface UserDefinedGateway { - isActive: boolean; - gateway?: string; -} From ec23f3dcb7e1b665e7a00e0858fbe505160af625 Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Mon, 27 Feb 2023 11:13:25 +0000 Subject: [PATCH 518/591] disable input when connected fix lint errors --- nym-connect/desktop/src/context/main.tsx | 4 ++-- .../src/pages/menu/settings/ServiceProviderSettings.tsx | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index 5de2ae1bc5..c861eb9bf0 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -5,10 +5,10 @@ import { Error } from 'src/types/error'; import { getVersion } from '@tauri-apps/api/app'; import { useEvents } from 'src/hooks/events'; import { UserDefinedGateway, UserDefinedSPAddress } from 'src/types/service-provider'; +import { getItemFromStorage, setItemInStorage } from 'src/utils'; import { ConnectionStatusKind, GatewayPerformance } from '../types'; import { ConnectionStatsItem } from '../components/ConnectionStats'; import { ServiceProvider } from '../types/directory'; -import { getItemFromStorage, setItemInStorage } from 'src/utils'; const FORAGE_GATEWAY_KEY = 'nym-connect-user-gateway'; const FORAGE_SP_KEY = 'nym-connect-user-sp'; @@ -142,7 +142,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { }; const buildServiceProvider = async (serviceProvider: ServiceProvider) => { - let sp = { ...serviceProvider }; + const sp = { ...serviceProvider }; if (shouldUseUserGateway) sp.gateway = userDefinedGateway.gateway as string; if (shouldUseUserSP) sp.address = userDefinedSPAddress.address as string; diff --git a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx index 1d7fe62f13..580d36e9d6 100644 --- a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx @@ -1,4 +1,4 @@ -import React, { ChangeEvent, useEffect, useState } from 'react'; +import React, { ChangeEvent } from 'react'; import { Autocomplete, Box, @@ -62,6 +62,7 @@ export const ServiceProviderSettings = () => { {userDefinedSPAddress.isActive && serviceProviders && ( sp.address)} From f590aad42c8e92ab5cb06aac9efc10bbe83ef517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 27 Feb 2023 12:40:00 +0100 Subject: [PATCH 519/591] nym-api: uptime rework (#3053) * nym-api: cache updates as node performance * nym-api: update get mixnode avg_uptime endpoint * nym-api: mixnode report to use cached data * nym-api: annotate gateway bond with node performance * nym-api: gateway report to use cached data * wip * Add get_gateway_avg_uptime * Add comment * update NR gateways to include node_performance on frontend * use node_performance values on frontend * fixup select gateway from list * fix up lint errors --------- Co-authored-by: fmtabbara --- explorer/src/api/index.ts | 5 +- explorer/src/components/Gateways.ts | 7 +- .../src/components/Universal-DataGrid.tsx | 2 +- explorer/src/pages/GatewayDetail/index.tsx | 6 +- explorer/src/pages/Gateways/index.tsx | 19 +-- explorer/src/typeDefs/explorer-api.ts | 10 +- nym-api/nym-api-requests/src/models.rs | 41 ++++- .../src/node_status_api/cache/node_sets.rs | 31 +++- nym-api/src/node_status_api/helpers.rs | 152 +++++++++++++----- nym-api/src/node_status_api/mod.rs | 1 + nym-api/src/node_status_api/models.rs | 22 ++- nym-api/src/node_status_api/routes.rs | 68 ++++---- 12 files changed, 261 insertions(+), 103 deletions(-) diff --git a/explorer/src/api/index.ts b/explorer/src/api/index.ts index 49dcb04e85..894dd3e179 100644 --- a/explorer/src/api/index.ts +++ b/explorer/src/api/index.ts @@ -29,7 +29,6 @@ import { GatewayBondAnnotated, GatewayBond, } from '../typeDefs/explorer-api'; -import { toPercentIntegerString } from '../utils'; function getFromCache(key: string) { const ts = Number(localStorage.getItem('ts')); @@ -94,9 +93,9 @@ export class Api { static fetchGateways = async (): Promise => { const res = await fetch(GATEWAYS_API); const gatewaysAnnotated: GatewayBondAnnotated[] = await res.json(); - return gatewaysAnnotated.map(({ gateway_bond, performance }) => ({ + return gatewaysAnnotated.map(({ gateway_bond, node_performance }) => ({ ...gateway_bond, - performance: toPercentIntegerString(performance), + node_performance, })); }; diff --git a/explorer/src/components/Gateways.ts b/explorer/src/components/Gateways.ts index 6d8ff8ad6a..b78b1320da 100644 --- a/explorer/src/components/Gateways.ts +++ b/explorer/src/components/Gateways.ts @@ -1,4 +1,5 @@ import { GatewayResponse, GatewayBond, GatewayReportResponse } from '../typeDefs/explorer-api'; +import { toPercentIntegerString } from '../utils'; export type GatewayRowType = { id: string; @@ -8,7 +9,7 @@ export type GatewayRowType = { host: string; location: string; version: string; - performance: string; + node_performance: string; }; export type GatewayEnrichedRowType = GatewayRowType & { @@ -29,7 +30,7 @@ export function gatewayToGridRow(arrayOfGateways: GatewayResponse): GatewayRowTy bond: gw.pledge_amount.amount || 0, host: gw.gateway.host || '', version: gw.gateway.version || '', - performance: gw.performance, + node_performance: toPercentIntegerString(gw.node_performance.last_24h), })); } @@ -46,6 +47,6 @@ export function gatewayEnrichedToGridRow(gateway: GatewayBond, report: GatewayRe mixPort: gateway.gateway.mix_port || 0, routingScore: `${report.most_recent}%`, avgUptime: `${report.last_day || report.last_hour}%`, - performance: gateway.performance, + node_performance: toPercentIntegerString(gateway.node_performance.most_recent), }; } diff --git a/explorer/src/components/Universal-DataGrid.tsx b/explorer/src/components/Universal-DataGrid.tsx index 9dd1718112..928eb62e94 100644 --- a/explorer/src/components/Universal-DataGrid.tsx +++ b/explorer/src/components/Universal-DataGrid.tsx @@ -38,7 +38,7 @@ const CustomPagination = () => { color="primary" count={state.pagination.pageCount} page={state.pagination.page + 1} - onChange={(event, value) => apiRef.current.setPage(value - 1)} + onChange={(_, value) => apiRef.current.setPage(value - 1)} /> ); }; diff --git a/explorer/src/pages/GatewayDetail/index.tsx b/explorer/src/pages/GatewayDetail/index.tsx index 14aac28589..8995b1733f 100644 --- a/explorer/src/pages/GatewayDetail/index.tsx +++ b/explorer/src/pages/GatewayDetail/index.tsx @@ -26,7 +26,7 @@ const columns: ColumnsType[] = [ headerAlign: 'left', }, { - field: 'routingScore', + field: 'node_performance', title: 'Routing Score', flex: 1, headerAlign: 'left', @@ -130,13 +130,13 @@ const PageGatewayDetailsWithState = ({ selectedGateway }: { selectedGateway: Gat * Guard component to handle loading and not found states */ const PageGatewayDetailGuard: FCWithChildren = () => { - const [selectedGateway, setSelectedGateway] = React.useState(); + const [selectedGateway, setSelectedGateway] = React.useState(); const { gateways } = useMainContext(); const { id } = useParams<{ id: string | undefined }>(); React.useEffect(() => { if (gateways?.data) { - setSelectedGateway(gateways.data.find((gateway) => gateway.gateway.identity_key === id)); + setSelectedGateway(gateways.data.find((g) => g.gateway.identity_key === id)); } }, [gateways, id]); diff --git a/explorer/src/pages/Gateways/index.tsx b/explorer/src/pages/Gateways/index.tsx index c2a0ba1405..98e14be808 100644 --- a/explorer/src/pages/Gateways/index.tsx +++ b/explorer/src/pages/Gateways/index.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { Link as RRDLink } from 'react-router-dom'; -import { Box, Button, Card, Grid, Link as MuiLink } from '@mui/material'; +import { Box, Card, Grid, Link as MuiLink } from '@mui/material'; import { CopyToClipboard } from '@nymproject/react/clipboard/CopyToClipboard'; import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid'; import { SelectChangeEvent } from '@mui/material/Select'; @@ -86,7 +86,6 @@ export const PageGateways: FCWithChildren = () => { const columns: GridColDef[] = [ { field: 'identity_key', - headerName: 'Identity Key', renderHeader: () => , headerClassName: 'MuiDataGrid-header-override', width: 380, @@ -119,7 +118,7 @@ export const PageGateways: FCWithChildren = () => { {unymToNym(params.value, 6)} @@ -127,8 +126,7 @@ export const PageGateways: FCWithChildren = () => { ), }, { - field: 'performance', - headerName: 'Routing Score', + field: 'node_performance', renderHeader: () => , width: 150, headerAlign: 'left', @@ -137,7 +135,7 @@ export const PageGateways: FCWithChildren = () => { {`${params.value}%`} @@ -154,7 +152,7 @@ export const PageGateways: FCWithChildren = () => { {params.value} @@ -168,9 +166,9 @@ export const PageGateways: FCWithChildren = () => { headerAlign: 'left', headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( - + ), }, { @@ -207,7 +205,6 @@ export const PageGateways: FCWithChildren = () => { }, { field: 'version', - headerName: 'Version', renderHeader: () => , width: 150, headerAlign: 'left', diff --git a/explorer/src/typeDefs/explorer-api.ts b/explorer/src/typeDefs/explorer-api.ts index 48cf2091d9..e430427aff 100644 --- a/explorer/src/typeDefs/explorer-api.ts +++ b/explorer/src/typeDefs/explorer-api.ts @@ -114,6 +114,12 @@ export interface StatsResponse { packets_explicitly_dropped_since_last_update: number; } +export interface NodePerformance { + most_recent: string; + last_hour: string; + last_24h: string; +} + export type MixNodeHistoryResponse = StatsResponse; export interface GatewayBond { @@ -122,12 +128,12 @@ export interface GatewayBond { total_delegation: Amount; owner: string; gateway: Gateway; - performance: string; + node_performance: NodePerformance; } export interface GatewayBondAnnotated { gateway_bond: GatewayBond; - performance: string; + node_performance: NodePerformance; } export type GatewayResponse = GatewayBond[]; diff --git a/nym-api/nym-api-requests/src/models.rs b/nym-api/nym-api-requests/src/models.rs index 0954d4b9d6..daebc0b0ac 100644 --- a/nym-api/nym-api-requests/src/models.rs +++ b/nym-api/nym-api-requests/src/models.rs @@ -1,7 +1,7 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use cosmwasm_std::{Coin, Decimal}; +use cosmwasm_std::{Addr, Coin, Decimal}; use nym_mixnet_contract_common::families::FamilyHead; use nym_mixnet_contract_common::mixnode::MixNodeDetails; use nym_mixnet_contract_common::reward_params::{Performance, RewardingParams}; @@ -93,12 +93,21 @@ pub struct MixnodeStatusResponse { pub status: MixnodeStatus, } +#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] +pub struct NodePerformance { + pub most_recent: Performance, + pub last_hour: Performance, + pub last_24h: Performance, +} + #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] pub struct MixNodeBondAnnotated { pub mixnode_details: MixNodeDetails, pub stake_saturation: StakeSaturation, pub uncapped_stake_saturation: StakeSaturation, + // NOTE: the performance field is deprecated in favour of node_performance pub performance: Performance, + pub node_performance: NodePerformance, pub estimated_operator_apy: Decimal, pub estimated_delegators_apy: Decimal, pub family: Option, @@ -112,12 +121,32 @@ impl MixNodeBondAnnotated { pub fn mix_id(&self) -> MixId { self.mixnode_details.mix_id() } + + pub fn identity_key(&self) -> &str { + self.mixnode_details.bond_information.identity() + } + + pub fn owner(&self) -> &Addr { + self.mixnode_details.bond_information.owner() + } } #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] pub struct GatewayBondAnnotated { pub gateway_bond: GatewayBond, + // NOTE: the performance field is deprecated in favour of node_performance pub performance: Performance, + pub node_performance: NodePerformance, +} + +impl GatewayBondAnnotated { + pub fn identity(&self) -> &String { + self.gateway_bond.identity() + } + + pub fn owner(&self) -> &Addr { + self.gateway_bond.owner() + } } #[derive(Debug, Serialize, Deserialize, JsonSchema)] @@ -147,7 +176,17 @@ pub struct RewardEstimationResponse { #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] pub struct UptimeResponse { pub mix_id: MixId, + // The same as node_performance.last_24h. Legacy pub avg_uptime: u8, + pub node_performance: NodePerformance, +} + +#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] +pub struct GatewayUptimeResponse { + pub identity: String, + // The same as node_performance.last_24h. Legacy + pub avg_uptime: u8, + pub node_performance: NodePerformance, } #[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema)] diff --git a/nym-api/src/node_status_api/cache/node_sets.rs b/nym-api/src/node_status_api/cache/node_sets.rs index 11e622052e..2d856bf9e7 100644 --- a/nym-api/src/node_status_api/cache/node_sets.rs +++ b/nym-api/src/node_status_api/cache/node_sets.rs @@ -1,6 +1,6 @@ use crate::node_status_api::reward_estimate::{compute_apy_from_reward, compute_reward_estimate}; use crate::support::storage::NymApiStorage; -use nym_api_requests::models::{GatewayBondAnnotated, MixNodeBondAnnotated}; +use nym_api_requests::models::{GatewayBondAnnotated, MixNodeBondAnnotated, NodePerformance}; use nym_mixnet_contract_common::families::FamilyHead; use nym_mixnet_contract_common::{reward_params::Performance, Interval, MixId}; use nym_mixnet_contract_common::{ @@ -99,16 +99,15 @@ pub(super) async fn annotate_nodes_with_details( .rewarding_details .uncapped_bond_saturation(&interval_reward_params); + let rewarded_set_status = rewarded_set.get(&mixnode.mix_id()).copied(); + // If the performance can't be obtained, because the nym-api was not started with // the monitoring (and hence, storage), then reward estimates will be all zero - let performance = get_mixnode_performance_from_storage(storage, mixnode.mix_id(), current_interval) .await .unwrap_or_default(); - let rewarded_set_status = rewarded_set.get(&mixnode.mix_id()).copied(); - let reward_estimate = compute_reward_estimate( &mixnode, performance, @@ -117,6 +116,17 @@ pub(super) async fn annotate_nodes_with_details( current_interval, ); + let node_performance = if let Some(storage) = storage { + storage + .construct_mixnode_report(mixnode.mix_id()) + .await + .map(NodePerformance::from) + .ok() + } else { + None + } + .unwrap_or_default(); + let (estimated_operator_apy, estimated_delegators_apy) = compute_apy_from_reward(&mixnode, reward_estimate, current_interval); @@ -129,6 +139,7 @@ pub(super) async fn annotate_nodes_with_details( stake_saturation, uncapped_stake_saturation, performance, + node_performance, estimated_operator_apy, estimated_delegators_apy, family, @@ -152,9 +163,21 @@ pub(crate) async fn annotate_gateways_with_details( .await .unwrap_or_default(); + let node_performance = if let Some(storage) = storage { + storage + .construct_gateway_report(gateway_bond.identity()) + .await + .map(NodePerformance::from) + .ok() + } else { + None + } + .unwrap_or_default(); + annotated.push(GatewayBondAnnotated { gateway_bond, performance, + node_performance, }); } annotated diff --git a/nym-api/src/node_status_api/helpers.rs b/nym-api/src/node_status_api/helpers.rs index 2c6a03b678..d131c6088e 100644 --- a/nym-api/src/node_status_api/helpers.rs +++ b/nym-api/src/node_status_api/helpers.rs @@ -8,26 +8,112 @@ use crate::{NodeStatusCache, NymContractCache}; use cosmwasm_std::Decimal; use nym_api_requests::models::{ AllInclusionProbabilitiesResponse, ComputeRewardEstParam, GatewayBondAnnotated, - InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, - MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, - RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, + GatewayCoreStatusResponse, GatewayStatusReportResponse, GatewayUptimeHistoryResponse, + GatewayUptimeResponse, InclusionProbabilityResponse, MixNodeBondAnnotated, + MixnodeCoreStatusResponse, MixnodeStatusReportResponse, MixnodeStatusResponse, + MixnodeUptimeHistoryResponse, RewardEstimationResponse, StakeSaturationResponse, + UptimeResponse, }; -use nym_mixnet_contract_common::reward_params::Performance; -use nym_mixnet_contract_common::{Interval, MixId, RewardedSetNodeStatus}; +use nym_mixnet_contract_common::{MixId, RewardedSetNodeStatus}; use rocket::http::Status; use rocket::State; use super::reward_estimate::compute_reward_estimate; -pub(crate) async fn _mixnode_report( +async fn get_gateway_bond_annotated( + cache: &NodeStatusCache, + identity: &str, +) -> Result { + let gateways = cache.gateways_annotated().await.ok_or(ErrorResponse::new( + "no data available", + Status::ServiceUnavailable, + ))?; + + gateways + .into_inner() + .into_iter() + .find(|gateway| gateway.identity() == identity) + .ok_or(ErrorResponse::new( + "mixnode bond not found", + Status::NotFound, + )) +} + +async fn get_mixnode_bond_annotated( + cache: &NodeStatusCache, + mix_id: MixId, +) -> Result { + let mixnodes = cache.mixnodes_annotated().await.ok_or(ErrorResponse::new( + "no data available", + Status::ServiceUnavailable, + ))?; + + mixnodes + .into_inner() + .into_iter() + .find(|mixnode| mixnode.mix_id() == mix_id) + .ok_or(ErrorResponse::new( + "mixnode bond not found", + Status::NotFound, + )) +} + +pub(crate) async fn _gateway_report( + cache: &NodeStatusCache, + identity: &str, +) -> Result { + let gateway = get_gateway_bond_annotated(cache, identity).await?; + + Ok(GatewayStatusReportResponse { + identity: gateway.identity().to_owned(), + owner: gateway.owner().to_string(), + most_recent: gateway.node_performance.most_recent.round_to_integer(), + last_hour: gateway.node_performance.last_hour.round_to_integer(), + last_day: gateway.node_performance.last_24h.round_to_integer(), + }) +} + +pub(crate) async fn _gateway_uptime_history( storage: &NymApiStorage, + identity: &str, +) -> Result { + storage + .get_gateway_uptime_history(identity) + .await + .map(GatewayUptimeHistoryResponse::from) + .map_err(|err| ErrorResponse::new(err.to_string(), Status::NotFound)) +} + +pub(crate) async fn _gateway_core_status_count( + storage: &State, + identity: &str, + since: Option, +) -> Result { + let count = storage + .get_core_gateway_status_count(identity, since) + .await + .map_err(|err| ErrorResponse::new(err.to_string(), Status::NotFound))?; + + Ok(GatewayCoreStatusResponse { + identity: identity.to_string(), + count, + }) +} + +pub(crate) async fn _mixnode_report( + cache: &NodeStatusCache, mix_id: MixId, ) -> Result { - storage - .construct_mixnode_report(mix_id) - .await - .map(MixnodeStatusReportResponse::from) - .map_err(|err| ErrorResponse::new(err.to_string(), Status::NotFound)) + let mixnode = get_mixnode_bond_annotated(cache, mix_id).await?; + + Ok(MixnodeStatusReportResponse { + mix_id, + identity: mixnode.identity_key().to_owned(), + owner: mixnode.owner().to_string(), + most_recent: mixnode.node_performance.most_recent.round_to_integer(), + last_hour: mixnode.node_performance.last_hour.round_to_integer(), + last_day: mixnode.node_performance.last_24h.round_to_integer(), + }) } pub(crate) async fn _mixnode_uptime_history( @@ -103,21 +189,6 @@ pub(crate) async fn _get_mixnode_reward_estimation( } } -async fn average_mixnode_performance( - mix_id: MixId, - current_interval: Interval, - storage: &NymApiStorage, -) -> Result { - storage - .get_average_mixnode_uptime_in_the_last_24hrs( - mix_id, - current_interval.current_epoch_end_unix_timestamp(), - ) - .await - .map_err(|err| ErrorResponse::new(err.to_string(), Status::NotFound)) - .map(Into::into) -} - pub(crate) async fn _compute_mixnode_reward_estimation( user_reward_param: ComputeRewardEstParam, cache: &NodeStatusCache, @@ -254,21 +325,28 @@ pub(crate) async fn _get_mixnode_inclusion_probability( } pub(crate) async fn _get_mixnode_avg_uptime( - cache: &NymContractCache, - storage: &NymApiStorage, + cache: &NodeStatusCache, mix_id: MixId, ) -> Result { - let current_interval = cache - .current_interval() - .await - .into_inner() - .ok_or_else(|| ErrorResponse::new("server error", Status::InternalServerError))?; - - let performance = average_mixnode_performance(mix_id, current_interval, storage).await?; + let mixnode = get_mixnode_bond_annotated(cache, mix_id).await?; Ok(UptimeResponse { mix_id, - avg_uptime: performance.round_to_integer(), + avg_uptime: mixnode.node_performance.last_24h.round_to_integer(), + node_performance: mixnode.node_performance, + }) +} + +pub(crate) async fn _get_gateway_avg_uptime( + cache: &NodeStatusCache, + identity: &str, +) -> Result { + let gateway = get_gateway_bond_annotated(cache, identity).await?; + + Ok(GatewayUptimeResponse { + identity: identity.to_string(), + avg_uptime: gateway.node_performance.last_24h.round_to_integer(), + node_performance: gateway.node_performance, }) } @@ -288,7 +366,7 @@ pub(crate) async fn _get_mixnode_inclusion_probabilities( }) } else { Err(ErrorResponse::new( - "No data available".to_string(), + "No data available", Status::ServiceUnavailable, )) } diff --git a/nym-api/src/node_status_api/mod.rs b/nym-api/src/node_status_api/mod.rs index c8b3718fa6..1b05827e97 100644 --- a/nym-api/src/node_status_api/mod.rs +++ b/nym-api/src/node_status_api/mod.rs @@ -45,6 +45,7 @@ pub(crate) fn node_status_routes( routes::get_mixnode_stake_saturation, routes::get_mixnode_inclusion_probability, routes::get_mixnode_avg_uptime, + routes::get_gateway_avg_uptime, routes::get_mixnode_inclusion_probabilities, routes::get_mixnodes_detailed, routes::get_rewarded_set_detailed, diff --git a/nym-api/src/node_status_api/models.rs b/nym-api/src/node_status_api/models.rs index c65397a1f2..b1cb8cd79b 100644 --- a/nym-api/src/node_status_api/models.rs +++ b/nym-api/src/node_status_api/models.rs @@ -5,7 +5,7 @@ use crate::node_status_api::utils::NodeUptimes; use crate::storage::models::NodeStatus; use nym_api_requests::models::{ GatewayStatusReportResponse, GatewayUptimeHistoryResponse, HistoricalUptimeResponse, - MixnodeStatusReportResponse, MixnodeUptimeHistoryResponse, RequestError, + MixnodeStatusReportResponse, MixnodeUptimeHistoryResponse, NodePerformance, RequestError, }; use nym_mixnet_contract_common::reward_params::Performance; use nym_mixnet_contract_common::{IdentityKey, MixId}; @@ -179,6 +179,16 @@ impl From for MixnodeStatusReportResponse { } } +impl From for NodePerformance { + fn from(report: MixnodeStatusReport) -> Self { + NodePerformance { + most_recent: report.most_recent.into(), + last_hour: report.last_hour.into(), + last_24h: report.last_day.into(), + } + } +} + #[derive(Clone, Serialize, Deserialize, Debug, JsonSchema)] pub struct GatewayStatusReport { pub(crate) identity: String, @@ -228,6 +238,16 @@ impl From for GatewayStatusReportResponse { } } +impl From for NodePerformance { + fn from(report: GatewayStatusReport) -> Self { + NodePerformance { + most_recent: report.most_recent.into(), + last_hour: report.last_hour.into(), + last_24h: report.last_day.into(), + } + } +} + #[derive(Clone, Serialize, Deserialize, Debug, JsonSchema)] pub struct MixnodeUptimeHistory { pub(crate) mix_id: MixId, diff --git a/nym-api/src/node_status_api/routes.rs b/nym-api/src/node_status_api/routes.rs index a5bd3b7b6e..9d1f9d7dc0 100644 --- a/nym-api/src/node_status_api/routes.rs +++ b/nym-api/src/node_status_api/routes.rs @@ -4,11 +4,13 @@ use super::helpers::_get_gateways_detailed; use super::NodeStatusCache; use crate::node_status_api::helpers::{ - _compute_mixnode_reward_estimation, _get_active_set_detailed, _get_mixnode_avg_uptime, - _get_mixnode_inclusion_probabilities, _get_mixnode_inclusion_probability, - _get_mixnode_reward_estimation, _get_mixnode_stake_saturation, _get_mixnode_status, - _get_mixnodes_detailed, _get_rewarded_set_detailed, _mixnode_core_status_count, - _mixnode_report, _mixnode_uptime_history, + _compute_mixnode_reward_estimation, _gateway_core_status_count, _gateway_report, + _gateway_uptime_history, _get_active_set_detailed, _get_gateway_avg_uptime, + _get_mixnode_avg_uptime, _get_mixnode_inclusion_probabilities, + _get_mixnode_inclusion_probability, _get_mixnode_reward_estimation, + _get_mixnode_stake_saturation, _get_mixnode_status, _get_mixnodes_detailed, + _get_rewarded_set_detailed, _mixnode_core_status_count, _mixnode_report, + _mixnode_uptime_history, }; use crate::node_status_api::models::ErrorResponse; use crate::storage::NymApiStorage; @@ -16,12 +18,12 @@ use crate::NymContractCache; use nym_api_requests::models::{ AllInclusionProbabilitiesResponse, ComputeRewardEstParam, GatewayBondAnnotated, GatewayCoreStatusResponse, GatewayStatusReportResponse, GatewayUptimeHistoryResponse, - InclusionProbabilityResponse, MixNodeBondAnnotated, MixnodeCoreStatusResponse, - MixnodeStatusReportResponse, MixnodeStatusResponse, MixnodeUptimeHistoryResponse, - RewardEstimationResponse, StakeSaturationResponse, UptimeResponse, + GatewayUptimeResponse, InclusionProbabilityResponse, MixNodeBondAnnotated, + MixnodeCoreStatusResponse, MixnodeStatusReportResponse, MixnodeStatusResponse, + MixnodeUptimeHistoryResponse, RewardEstimationResponse, StakeSaturationResponse, + UptimeResponse, }; use nym_mixnet_contract_common::MixId; -use rocket::http::Status; use rocket::serde::json::Json; use rocket::State; use rocket_okapi::openapi; @@ -29,15 +31,10 @@ use rocket_okapi::openapi; #[openapi(tag = "status")] #[get("/gateway//report")] pub(crate) async fn gateway_report( - storage: &State, + cache: &State, identity: &str, ) -> Result, ErrorResponse> { - storage - .construct_gateway_report(identity) - .await - .map(GatewayStatusReportResponse::from) - .map(Json) - .map_err(|err| ErrorResponse::new(err.to_string(), Status::NotFound)) + Ok(Json(_gateway_report(cache, identity).await?)) } #[openapi(tag = "status")] @@ -46,12 +43,7 @@ pub(crate) async fn gateway_uptime_history( storage: &State, identity: &str, ) -> Result, ErrorResponse> { - storage - .get_gateway_uptime_history(identity) - .await - .map(GatewayUptimeHistoryResponse::from) - .map(Json) - .map_err(|err| ErrorResponse::new(err.to_string(), Status::NotFound)) + Ok(Json(_gateway_uptime_history(storage, identity).await?)) } #[openapi(tag = "status")] @@ -60,25 +52,19 @@ pub(crate) async fn gateway_core_status_count( storage: &State, identity: &str, since: Option, -) -> Json { - let count = storage - .get_core_gateway_status_count(identity, since) - .await - .unwrap_or_default(); - - Json(GatewayCoreStatusResponse { - identity: identity.to_string(), - count, - }) +) -> Result, ErrorResponse> { + Ok(Json( + _gateway_core_status_count(storage, identity, since).await?, + )) } #[openapi(tag = "status")] #[get("/mixnode//report")] pub(crate) async fn mixnode_report( - storage: &State, + cache: &State, mix_id: MixId, ) -> Result, ErrorResponse> { - Ok(Json(_mixnode_report(storage, mix_id).await?)) + Ok(Json(_mixnode_report(cache, mix_id).await?)) } #[openapi(tag = "status")] @@ -171,11 +157,19 @@ pub(crate) async fn get_mixnode_inclusion_probability( #[openapi(tag = "status")] #[get("/mixnode//avg_uptime")] pub(crate) async fn get_mixnode_avg_uptime( - cache: &State, - storage: &State, + cache: &State, mix_id: MixId, ) -> Result, ErrorResponse> { - Ok(Json(_get_mixnode_avg_uptime(cache, storage, mix_id).await?)) + Ok(Json(_get_mixnode_avg_uptime(cache, mix_id).await?)) +} + +#[openapi(tag = "status")] +#[get("/gateway//avg_uptime")] +pub(crate) async fn get_gateway_avg_uptime( + cache: &State, + identity: &str, +) -> Result, ErrorResponse> { + Ok(Json(_get_gateway_avg_uptime(cache, identity).await?)) } #[openapi(tag = "status")] From 7929bac6855cdf2a1abd22c3618bb36e253eba9f Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Mon, 27 Feb 2023 14:20:16 +0000 Subject: [PATCH 520/591] turn off user defined SP address is input it empty --- nym-connect/desktop/src/components/AppWindowFrame.tsx | 11 ++++++++++- nym-connect/desktop/src/context/main.tsx | 2 +- .../pages/menu/settings/ServiceProviderSettings.tsx | 9 ++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/nym-connect/desktop/src/components/AppWindowFrame.tsx b/nym-connect/desktop/src/components/AppWindowFrame.tsx index 01aa390286..f8304ce00b 100644 --- a/nym-connect/desktop/src/components/AppWindowFrame.tsx +++ b/nym-connect/desktop/src/components/AppWindowFrame.tsx @@ -6,7 +6,8 @@ import { CustomTitleBar } from './CustomTitleBar'; export const AppWindowFrame: FCWithChildren = ({ children }) => { const location = useLocation(); - const { userDefinedGateway, setUserDefinedGateway } = useClientContext(); + const { userDefinedGateway, setUserDefinedGateway, userDefinedSPAddress, setUserDefinedSPAddress } = + useClientContext(); // defined functions to be used when moving away from pages const onBack = () => { @@ -19,6 +20,14 @@ export const AppWindowFrame: FCWithChildren = ({ children }) => { setUserDefinedGateway((current) => ({ ...current, isActive: false })); } }; + case '/menu/settings/service-provider': + return () => { + // when the user moves away from the settings page and the gateway is not valid + // set isActive to false + if (!userDefinedSPAddress?.address) { + setUserDefinedSPAddress((current) => ({ ...current, isActive: false })); + } + }; default: return undefined; } diff --git a/nym-connect/desktop/src/context/main.tsx b/nym-connect/desktop/src/context/main.tsx index c861eb9bf0..b999b957a2 100644 --- a/nym-connect/desktop/src/context/main.tsx +++ b/nym-connect/desktop/src/context/main.tsx @@ -74,7 +74,7 @@ export const ClientContextProvider: FCWithChildren = ({ children }) => { useEffect(() => { setItemInStorage({ key: FORAGE_SP_KEY, value: userDefinedSPAddress }); - }, [userDefinedGateway]); + }, [userDefinedSPAddress]); const initialiseApp = async () => { const services = await invoke('get_services'); diff --git a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx index 580d36e9d6..8f18caaacd 100644 --- a/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/ServiceProviderSettings.tsx @@ -33,6 +33,10 @@ export const ServiceProviderSettings = () => { return 'The service provider specified is not in our known list.'; }; + const validateInput = (value: string) => { + setUserDefinedSPAddress((current) => ({ ...current, address: !value.length ? undefined : value })); + }; + return ( @@ -63,11 +67,10 @@ export const ServiceProviderSettings = () => { sp.address)} - getOptionLabel={(address) => `${address.substring(0, 18)}...`} freeSolo + value={userDefinedSPAddress.address || ''} onChange={(e, value) => handleSelectFromList(value)} size="small" renderInput={(params) => ( @@ -75,7 +78,7 @@ export const ServiceProviderSettings = () => { autoFocus {...params} placeholder="Service provider" - onChange={(e) => setUserDefinedSPAddress((current) => ({ ...current, address: e.target.value }))} + onChange={(e) => validateInput(e.target.value)} /> )} ListboxProps={{ style: { background: 'unset', fontSize: '14px' } }} From bdcc19e86a2329bde33ee7a20f07b1a642cf0828 Mon Sep 17 00:00:00 2001 From: fmtabbara Date: Mon, 27 Feb 2023 15:33:54 +0000 Subject: [PATCH 521/591] PR update --- nym-connect/desktop/src/components/AppWindowFrame.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nym-connect/desktop/src/components/AppWindowFrame.tsx b/nym-connect/desktop/src/components/AppWindowFrame.tsx index f8304ce00b..90e01fffa7 100644 --- a/nym-connect/desktop/src/components/AppWindowFrame.tsx +++ b/nym-connect/desktop/src/components/AppWindowFrame.tsx @@ -22,7 +22,7 @@ export const AppWindowFrame: FCWithChildren = ({ children }) => { }; case '/menu/settings/service-provider': return () => { - // when the user moves away from the settings page and the gateway is not valid + // when the user moves away from the settings page and the sp is not valid // set isActive to false if (!userDefinedSPAddress?.address) { setUserDefinedSPAddress((current) => ({ ...current, isActive: false })); From 14a7b5bdc892688ef93585443ce1d48ced17d843 Mon Sep 17 00:00:00 2001 From: Mark Sinclair Date: Mon, 27 Feb 2023 17:55:41 +0000 Subject: [PATCH 522/591] Typescript SDK 1.1.7 --- .../examples/plain-html/src/index.ts | 5 ++++ sdk/typescript/packages/sdk/package.json | 2 +- .../packages/sdk/src/mixnet/wasm/index.ts | 7 +++++ .../packages/sdk/src/mixnet/wasm/types.ts | 26 +++++++++++++++---- .../packages/sdk/src/mixnet/wasm/worker.ts | 19 +++++++++++++- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/sdk/typescript/examples/plain-html/src/index.ts b/sdk/typescript/examples/plain-html/src/index.ts index 3871d1c0a7..a0e429beb1 100644 --- a/sdk/typescript/examples/plain-html/src/index.ts +++ b/sdk/typescript/examples/plain-html/src/index.ts @@ -9,6 +9,9 @@ let nym: NymMixnetClient | null = null; async function main() { nym = await createNymMixnetClient(); + // add nym client to the Window globally, so that it can be used from the dev tools console + (window as any).nym = nym; + if (!nym) { console.error('Oh no! Could not create client'); return; @@ -38,6 +41,8 @@ async function main() { }; } + nym.events.subscribeToRawMessageReceivedEvent((e) => console.log('Received: ', e.args.payload)); + // start up the client await nym.client.start({ clientId: 'My awesome client', diff --git a/sdk/typescript/packages/sdk/package.json b/sdk/typescript/packages/sdk/package.json index 2fa4497f03..90622cc3e0 100644 --- a/sdk/typescript/packages/sdk/package.json +++ b/sdk/typescript/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@nymproject/sdk", - "version": "1.1.6", + "version": "1.1.7", "license": "Apache-2.0", "author": "Nym Technologies SA", "type": "module", diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts index 042c273791..b60550aee0 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/index.ts @@ -11,6 +11,7 @@ import { LoadedEvent, MimeTypes, StringMessageReceivedEvent, + RawMessageReceivedEvent, } from './types'; /** @@ -89,6 +90,12 @@ export const createNymMixnetClient = async (options?: { getSubscriptions(EventKinds.BinaryMessageReceived).unshift(handler); }; }, + subscribeToRawMessageReceivedEvent: (handler) => { + getSubscriptions(EventKinds.RawMessageReceived).push(handler); + return () => { + getSubscriptions(EventKinds.RawMessageReceived).unshift(handler); + }; + }, }; // let comlink handle interop with the web worker diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts index ce4a4cd20d..2360414075 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts @@ -60,19 +60,24 @@ export interface Debug { * This is going to be superseded by key rotation once implemented. */ maximum_reply_surb_age_ms: bigint; + /** + * Defines maximum amount of time the client is going to wait for reply surbs before + * deciding it's never going to get them and would drop all pending messages + */ + maximum_reply_surb_drop_waiting_period_ms: bigint; /** * Defines the maximum number of reply surbs the client would request. */ maximum_reply_surb_request_size: number; - /** - * Defines the maximum number of reply surbs the client wants to keep in its storage at any times. - */ - maximum_reply_surb_storage_threshold: number; /** * Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking * for more even though in theory they wouldn't need to. */ - maximum_reply_surb_waiting_period_ms: bigint; + maximum_reply_surb_rerequest_waiting_period_ms: bigint; + /** + * Defines the maximum number of reply surbs the client wants to keep in its storage at any times. + */ + maximum_reply_surb_storage_threshold: number; /** * The parameter of Poisson distribution determining how long, on average, * it is going to take another 'real traffic stream' message to be sent. @@ -167,6 +172,7 @@ export interface IWebWorker { setTextMimeTypes: (mimeTypes: string[]) => void; getTextMimeTypes: () => string[]; send: (args: { payload: Payload; recipient: string; replySurbs?: number }) => void; + rawSend: (args: { payload: Uint8Array; recipient: string; replySurbs?: number }) => void; } export interface IWebWorkerAsync { @@ -176,6 +182,7 @@ export interface IWebWorkerAsync { setTextMimeTypes: (mimeTypes: string[]) => void; getTextMimeTypes: () => Promise; send: (args: { payload: Payload; recipient: string; replySurbs?: number }) => Promise; + rawSend: (args: { payload: Uint8Array; recipient: string; replySurbs?: number }) => Promise; } export enum EventKinds { @@ -183,6 +190,7 @@ export enum EventKinds { Connected = 'Connected', StringMessageReceived = 'StringMessageReceived', BinaryMessageReceived = 'BinaryMessageReceived', + RawMessageReceived = 'RawMessageReceived', } export interface LoadedEvent { @@ -218,9 +226,17 @@ export interface BinaryMessageReceivedEvent { }; } +export interface RawMessageReceivedEvent { + kind: EventKinds.RawMessageReceived; + args: { + payload: Uint8Array; + }; +} + export interface IWebWorkerEvents { subscribeToLoaded: EventHandlerSubscribeFn; subscribeToConnected: EventHandlerSubscribeFn; subscribeToTextMessageReceivedEvent: EventHandlerSubscribeFn; subscribeToBinaryMessageReceivedEvent: EventHandlerSubscribeFn; + subscribeToRawMessageReceivedEvent: EventHandlerSubscribeFn; } diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts index dbc9ae36d7..4b663b9500 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts @@ -34,6 +34,7 @@ import type { LoadedEvent, NymClientConfig, OnRawPayloadFn, + RawMessageReceivedEvent, StringMessageReceivedEvent, } from './types'; import { EventKinds, MimeTypes } from './types'; @@ -136,8 +137,8 @@ class ClientWrapper { recipient, replySurbs = 0, }: { - recipient: string; payload: Uint8Array; + recipient: string; replySurbs?: number; }) => { if (!this.client) { @@ -170,7 +171,14 @@ init(wasmBytes()) wrapper.init( new Config(config.clientId, config.nymApiUrl, gatewayEndpoint, config.debug || default_debug()), async (message) => { + // fire an event with the raw message + postMessageWithType({ + kind: EventKinds.RawMessageReceived, + args: { payload: message }, + }); + try { + // try to decode the payload to extract the mime-type, headers and payload body const decodedPayload = decode_payload(message); const { payload, headers } = decodedPayload; const mimeType = decodedPayload.mimeType as MimeTypes; @@ -178,6 +186,8 @@ init(wasmBytes()) if (wrapper.getTextMimeTypes().includes(mimeType)) { const stringMessage = parse_utf8_string(payload); + // the payload is a string type (in the options at creation time, string mime-types are set, or fall back + // to defaults, such as `text/plain`, `application/json`, etc) postMessageWithType({ kind: EventKinds.StringMessageReceived, args: { mimeType, payload: stringMessage, payloadRaw: payload, headers }, @@ -185,6 +195,7 @@ init(wasmBytes()) return; } + // the payload is a binary type postMessageWithType({ kind: EventKinds.BinaryMessageReceived, args: { mimeType, payload, headers }, @@ -247,6 +258,12 @@ init(wasmBytes()) .send({ payload, recipient, replySurbs }) .catch((e) => console.error('[Nym WASM client] Failed to send message', e)); }, + rawSend(args) { + const { recipient, payload, replySurbs } = args; + wrapper + .send({ payload, replySurbs, recipient }) + .catch((e) => console.error('[Nym WASM client] Failed to send message', e)); + }, }; // start comlink listening for messages and handle them above From b8ee3465f86cb3b85e891b547ade4e8bbe9268d6 Mon Sep 17 00:00:00 2001 From: Tommy Verrall <60836166+tommyv1987@users.noreply.github.com> Date: Tue, 28 Feb 2023 10:33:45 +0100 Subject: [PATCH 523/591] Update build_and_run.sh remove unnecessary environment variable --- tests/build_and_run.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/build_and_run.sh b/tests/build_and_run.sh index b86c74cced..6c492b4ea9 100755 --- a/tests/build_and_run.sh +++ b/tests/build_and_run.sh @@ -2,7 +2,6 @@ PWD="../" GIT_BRANCH=$1 -VERSION_NUMBER=$2 # run the script from the correct location From 6a93497c8fa9ee288624517c400d954b29468fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Tue, 28 Feb 2023 13:58:01 +0200 Subject: [PATCH 524/591] Extend public key submission in case no dealer registered (#3106) --- .../coconut-dkg/src/dealers/transactions.rs | 4 +- .../coconut-dkg/src/dealings/transactions.rs | 2 + .../src/epoch_state/transactions.rs | 38 +++++++++++++------ .../coconut-dkg/src/support/tests/helpers.rs | 22 ++++++++++- .../verification_key_shares/transactions.rs | 6 ++- 5 files changed, 56 insertions(+), 16 deletions(-) diff --git a/contracts/coconut-dkg/src/dealers/transactions.rs b/contracts/coconut-dkg/src/dealers/transactions.rs index 0c2d0b4241..9a4197dd8d 100644 --- a/contracts/coconut-dkg/src/dealers/transactions.rs +++ b/contracts/coconut-dkg/src/dealers/transactions.rs @@ -80,7 +80,7 @@ pub(crate) mod tests { use crate::epoch_state::transactions::advance_epoch_state; use crate::support::tests::fixtures::dealer_details_fixture; use crate::support::tests::helpers; - use crate::support::tests::helpers::GROUP_MEMBERS; + use crate::support::tests::helpers::{add_fixture_dealer, GROUP_MEMBERS}; use coconut_dkg_common::types::{InitialReplacementData, TimeConfiguration}; use cosmwasm_std::testing::{mock_env, mock_info}; use cw4::Member; @@ -147,6 +147,8 @@ pub(crate) mod tests { .block .time .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); + + add_fixture_dealer(deps.as_mut()); advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = try_add_dealer( diff --git a/contracts/coconut-dkg/src/dealings/transactions.rs b/contracts/coconut-dkg/src/dealings/transactions.rs index 3f6a797775..b9220cff9e 100644 --- a/contracts/coconut-dkg/src/dealings/transactions.rs +++ b/contracts/coconut-dkg/src/dealings/transactions.rs @@ -53,6 +53,7 @@ pub(crate) mod tests { use crate::epoch_state::transactions::advance_epoch_state; use crate::support::tests::fixtures::{dealer_details_fixture, dealing_bytes_fixture}; use crate::support::tests::helpers; + use crate::support::tests::helpers::add_fixture_dealer; use coconut_dkg_common::dealer::DealerDetails; use coconut_dkg_common::types::{InitialReplacementData, TimeConfiguration}; use cosmwasm_std::testing::{mock_env, mock_info}; @@ -80,6 +81,7 @@ pub(crate) mod tests { .block .time .plus_seconds(TimeConfiguration::default().public_key_submission_time_secs); + add_fixture_dealer(deps.as_mut()); advance_epoch_state(deps.as_mut(), env).unwrap(); let ret = try_commit_dealings(deps.as_mut(), info.clone(), dealing_bytes.clone(), false) diff --git a/contracts/coconut-dkg/src/epoch_state/transactions.rs b/contracts/coconut-dkg/src/epoch_state/transactions.rs index 414ba2344c..3a812f6437 100644 --- a/contracts/coconut-dkg/src/epoch_state/transactions.rs +++ b/contracts/coconut-dkg/src/epoch_state/transactions.rs @@ -89,23 +89,29 @@ pub(crate) fn advance_epoch_state(deps: DepsMut<'_>, env: Env) -> Result, _>>()?; - // note: ceiling in integer division can be achieved via q = (x + y - 1) / y; - let threshold = (2 * current_dealers.len() as u64 + 3 - 1) / 3; - THRESHOLD.save(deps.storage, &threshold)?; - if !resharing { - let replacement_data = InitialReplacementData { - initial_dealers: current_dealers, - initial_height: None, - }; - INITIAL_REPLACEMENT_DATA.save(deps.storage, &replacement_data)?; + if current_dealers.is_empty() { + // If no dealer registered yet, we just stay in the same state until there's at least one + new_state = current_epoch.state; + } else { + // note: ceiling in integer division can be achieved via q = (x + y - 1) / y; + let threshold = (2 * current_dealers.len() as u64 + 3 - 1) / 3; + THRESHOLD.save(deps.storage, &threshold)?; + if !resharing { + let replacement_data = InitialReplacementData { + initial_dealers: current_dealers, + initial_height: None, + }; + INITIAL_REPLACEMENT_DATA.save(deps.storage, &replacement_data)?; + } } - } + }; Epoch::new( - state, + new_state, current_epoch.epoch_id, current_epoch.time_configuration, env.block.time, @@ -392,6 +398,14 @@ pub(crate) mod tests { EarlyEpochStateAdvancement(1) ); + env.block.time = env.block.time.plus_seconds(1); + advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); + let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); + assert_eq!( + epoch.state, + EpochState::PublicKeySubmission { resharing: false } + ); + // setup dealer details let all_details: [_; 4] = std::array::from_fn(|i| dealer_details_fixture(i as u64 + 1)); for details in all_details.iter() { @@ -404,7 +418,7 @@ pub(crate) mod tests { .may_load(&deps.storage) .unwrap() .is_none()); - env.block.time = env.block.time.plus_seconds(1); + env.block.time = env.block.time.plus_seconds(epoch.time_configuration.public_key_submission_time_secs); advance_epoch_state(deps.as_mut(), env.clone()).unwrap(); let epoch = CURRENT_EPOCH.load(deps.as_mut().storage).unwrap(); assert_eq!( diff --git a/contracts/coconut-dkg/src/support/tests/helpers.rs b/contracts/coconut-dkg/src/support/tests/helpers.rs index 2b8dd56115..b806dd4989 100644 --- a/contracts/coconut-dkg/src/support/tests/helpers.rs +++ b/contracts/coconut-dkg/src/support/tests/helpers.rs @@ -2,11 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 use crate::contract::instantiate; +use crate::dealers::storage::current_dealers; use coconut_dkg_common::msg::InstantiateMsg; +use coconut_dkg_common::types::DealerDetails; use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier}; use cosmwasm_std::{ - from_binary, to_binary, ContractResult, Empty, MemoryStorage, OwnedDeps, QuerierResult, - SystemResult, WasmQuery, + from_binary, to_binary, Addr, ContractResult, DepsMut, Empty, MemoryStorage, OwnedDeps, + QuerierResult, SystemResult, WasmQuery, }; use cw4::{Cw4QueryMsg, Member, MemberListResponse, MemberResponse}; use lazy_static::lazy_static; @@ -22,6 +24,22 @@ lazy_static! { pub static ref GROUP_MEMBERS: Mutex> = Mutex::new(vec![]); } +pub fn add_fixture_dealer(deps: DepsMut<'_>) { + let owner = Addr::unchecked("owner"); + current_dealers() + .save( + deps.storage, + &owner, + &DealerDetails { + address: owner.clone(), + bte_public_key_with_proof: String::new(), + announce_address: String::new(), + assigned_index: 100, + }, + ) + .unwrap(); +} + fn querier_handler(query: &WasmQuery) -> QuerierResult { let bin = match query { WasmQuery::Smart { contract_addr, msg } => { diff --git a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs index f7b2e80844..2d6002a003 100644 --- a/contracts/coconut-dkg/src/verification_key_shares/transactions.rs +++ b/contracts/coconut-dkg/src/verification_key_shares/transactions.rs @@ -91,7 +91,7 @@ mod tests { use super::*; use crate::epoch_state::transactions::advance_epoch_state; use crate::support::tests::helpers; - use crate::support::tests::helpers::MULTISIG_CONTRACT; + use crate::support::tests::helpers::{add_fixture_dealer, MULTISIG_CONTRACT}; use coconut_dkg_common::dealer::DealerDetails; use coconut_dkg_common::types::{EpochState, TimeConfiguration}; use cosmwasm_std::testing::{mock_env, mock_info}; @@ -104,6 +104,7 @@ mod tests { let info = mock_info("requester", &[]); let share = "share".to_string(); + add_fixture_dealer(deps.as_mut()); env.block.time = env .block .time @@ -171,6 +172,7 @@ mod tests { .to_string() } ); + add_fixture_dealer(deps.as_mut()); env.block.time = env .block .time @@ -247,6 +249,7 @@ mod tests { } ); + add_fixture_dealer(deps.as_mut()); env.block.time = env .block .time @@ -292,6 +295,7 @@ mod tests { let share = "share".to_string(); let multisig_info = mock_info(MULTISIG_CONTRACT, &[]); + add_fixture_dealer(deps.as_mut()); env.block.time = env .block .time From 1b37e85418156423f4889e22263fed76cb106259 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 28 Feb 2023 13:43:32 +0100 Subject: [PATCH 525/591] Update changelogs as part of release/v1.1.11 --- CHANGELOG.md | 20 ++++++++++++++++++++ nym-connect/desktop/CHANGELOG.md | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae9f5f1e29..7db3d58a71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +## [v1.0.11] (2023-02-28) + +- Fix empty dealer set loop ([#3105]) +- The nym-api db.sqlite is broken when trying to run against it it in `enabled-credentials-mode true` there is an ordering issue with migrations when using the credential binary to purchase bandwidth ([#3100]) +- Feature/latency based gateway selection ([#3081]) +- Fix the credential binary to handle transactions to sleep when in non-inProgress epochs ([#3057]) +- Publish mixnet contract to crates.io ([#1919]) +- Publish vesting contract to crates.io ([#1920]) +- Feature/update checker to use master ([#3097]) +- Feature/improve binary checks ([#3094]) + +[#3105]: https://github.com/nymtech/nym/issues/3105 +[#3100]: https://github.com/nymtech/nym/issues/3100 +[#3081]: https://github.com/nymtech/nym/pull/3081 +[#3057]: https://github.com/nymtech/nym/issues/3057 +[#1919]: https://github.com/nymtech/nym/issues/1919 +[#1920]: https://github.com/nymtech/nym/issues/1920 +[#3097]: https://github.com/nymtech/nym/pull/3097 +[#3094]: https://github.com/nymtech/nym/pull/3094 + ## [v1.1.10] (2023-02-21) - Verloc listener causing mixnode unexpected shutdown ([#3038]) diff --git a/nym-connect/desktop/CHANGELOG.md b/nym-connect/desktop/CHANGELOG.md index 52edcc5f66..9e6f08fe2d 100644 --- a/nym-connect/desktop/CHANGELOG.md +++ b/nym-connect/desktop/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased] +## [v1.0.11] (2023-02-28) + +- NC - add the option to manually select and use a specific Service Provider ([#2953]) + +[#2953]: https://github.com/nymtech/nym/issues/2953 + ## [v1.1.10] (2023-02-21) - NC - add logs window for troubleshooting ([#2951]) From 36fb0eba29ae352936b7655109e34049ea542192 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 28 Feb 2023 13:53:14 +0100 Subject: [PATCH 526/591] Update versions as part of release/v1.1.11 --- clients/client-core/Cargo.toml | 2 +- clients/native/Cargo.toml | 2 +- clients/socks5/Cargo.toml | 2 +- explorer-api/Cargo.toml | 2 +- explorer/package.json | 4 ++-- gateway/Cargo.toml | 2 +- mixnode/Cargo.toml | 2 +- nym-api/Cargo.toml | 2 +- nym-connect/desktop/package.json | 4 ++-- nym-connect/desktop/src-tauri/Cargo.toml | 2 +- nym-connect/desktop/src-tauri/tauri.conf.json | 2 +- service-providers/network-requester/Cargo.toml | 2 +- service-providers/network-statistics/Cargo.toml | 2 +- tools/nym-cli/Cargo.toml | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/clients/client-core/Cargo.toml b/clients/client-core/Cargo.toml index a467192fe8..4334cc66e4 100644 --- a/clients/client-core/Cargo.toml +++ b/clients/client-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "client-core" -version = "1.1.10" +version = "1.1.11" authors = ["Dave Hrycyszyn "] edition = "2021" rust-version = "1.66" diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 8c98ab9487..ffebf29114 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.10" +version = "1.1.11" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index 12f84f0d06..c1724aa8bb 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.10" +version = "1.1.11" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/explorer-api/Cargo.toml b/explorer-api/Cargo.toml index dd1b18a807..0a84299d5a 100644 --- a/explorer-api/Cargo.toml +++ b/explorer-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "explorer-api" -version = "1.1.10" +version = "1.1.11" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/explorer/package.json b/explorer/package.json index 56901cdec1..5e5f347052 100644 --- a/explorer/package.json +++ b/explorer/package.json @@ -1,6 +1,6 @@ { "name": "@nym/network-explorer", - "version": "1.0.5", + "version": "1.0.6", "private": true, "license": "Apache-2.0", "dependencies": { @@ -121,4 +121,4 @@ "last 1 safari version" ] } -} +} \ No newline at end of file diff --git a/gateway/Cargo.toml b/gateway/Cargo.toml index 6e3bb78e08..b3d975adbc 100644 --- a/gateway/Cargo.toml +++ b/gateway/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-gateway" -version = "1.1.10" +version = "1.1.11" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index cbe1bd77e0..408bda5fdf 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-mixnode" -version = "1.1.11" +version = "1.1.12" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-api/Cargo.toml b/nym-api/Cargo.toml index bae10eece0..5378923d39 100644 --- a/nym-api/Cargo.toml +++ b/nym-api/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-api" -version = "1.1.11" +version = "1.1.12" authors = [ "Dave Hrycyszyn ", "Jędrzej Stuczyński ", diff --git a/nym-connect/desktop/package.json b/nym-connect/desktop/package.json index 87e2640c71..f1e5bef205 100644 --- a/nym-connect/desktop/package.json +++ b/nym-connect/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@nym/nym-connect", - "version": "1.1.10", + "version": "1.1.11", "main": "index.js", "license": "MIT", "scripts": { @@ -113,4 +113,4 @@ "webpack-merge": "^5.8.0", "yaml-loader": "^0.8.0" } -} +} \ No newline at end of file diff --git a/nym-connect/desktop/src-tauri/Cargo.toml b/nym-connect/desktop/src-tauri/Cargo.toml index 92efb8b1dc..9fe106ecdd 100644 --- a/nym-connect/desktop/src-tauri/Cargo.toml +++ b/nym-connect/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-connect" -version = "1.1.10" +version = "1.1.11" description = "nym-connect" authors = ["Nym Technologies SA"] license = "" diff --git a/nym-connect/desktop/src-tauri/tauri.conf.json b/nym-connect/desktop/src-tauri/tauri.conf.json index 915e0421fc..8a52a95e2d 100644 --- a/nym-connect/desktop/src-tauri/tauri.conf.json +++ b/nym-connect/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-connect", - "version": "1.1.10" + "version": "1.1.11" }, "build": { "distDir": "../dist", diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 3fc72dca27..615d17b9c4 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-network-requester" -version = "1.1.10" +version = "1.1.11" authors.workspace = true edition.workspace = true rust-version = "1.65" diff --git a/service-providers/network-statistics/Cargo.toml b/service-providers/network-statistics/Cargo.toml index 6a150d97f6..60bdaff297 100644 --- a/service-providers/network-statistics/Cargo.toml +++ b/service-providers/network-statistics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-network-statistics" -version = "1.1.10" +version = "1.1.11" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index 936767c456..ef9e2d1575 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.10" +version = "1.1.11" authors.workspace = true edition = "2021" From bc5bb271d874a6cf4270e87ad03b4fcb86ed7240 Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 28 Feb 2023 17:26:39 +0100 Subject: [PATCH 527/591] feat: remove unused workflows, update a couple of if conditions in github workflows and add the command for optimizing contract sizes to Makefile --- .github/workflows/contracts-build.yml | 5 +- .github/workflows/network-explorer-api.yml | 57 ------------------- .github/workflows/nym-cli-publish.yml | 50 ---------------- .../workflows/nym-connect-publish-macos.yml | 2 +- .../workflows/nym-connect-publish-ubuntu.yml | 2 +- .github/workflows/nym-release-publish.yml | 2 +- .../workflows/nym-wallet-publish-macos.yml | 2 +- .../workflows/nym-wallet-publish-ubuntu.yml | 2 +- Makefile | 2 + 9 files changed, 11 insertions(+), 113 deletions(-) delete mode 100644 .github/workflows/network-explorer-api.yml delete mode 100644 .github/workflows/nym-cli-publish.yml diff --git a/.github/workflows/contracts-build.yml b/.github/workflows/contracts-build.yml index efe1230175..839a8804e6 100644 --- a/.github/workflows/contracts-build.yml +++ b/.github/workflows/contracts-build.yml @@ -6,7 +6,7 @@ on: jobs: build: - if: ${{ startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release' }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} runs-on: [self-hosted, custom-runner-linux] steps: - uses: actions/checkout@v2 @@ -19,6 +19,9 @@ jobs: override: true components: rustfmt, clippy + - name: Install wasm-opt + run: cargo install wasm-opt + - name: Build release contracts run: make wasm diff --git a/.github/workflows/network-explorer-api.yml b/.github/workflows/network-explorer-api.yml deleted file mode 100644 index 6a23d5baf9..0000000000 --- a/.github/workflows/network-explorer-api.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: CI for Network Explorer API - -on: - workflow_dispatch: - release: - types: [created] - -env: - NETWORK: mainnet - -jobs: - publish-nym: - if: ${{ startsWith(github.ref, 'refs/tags/nym-explorer-api-') && (github.event_name == 'release' || github.event_name == 'workflow_dispatch') }} - strategy: - fail-fast: false - matrix: - platform: [ubuntu-20.04] - - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v3 - - - name: Install Dependencies (Linux) - run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools - continue-on-error: true - - - name: Check the release tag starts with `nym-explorer-api-` - uses: actions/github-script@v3 - with: - script: | - core.setFailed('Release tag did not start with nym-explorer-api-...') - - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - - name: Build all explorer-api - uses: actions-rs/cargo@v1 - with: - command: build - args: --manifest-path explorer-api/Cargo.toml --workspace --release - - - name: Upload Artifact - uses: actions/upload-artifact@v3 - with: - name: my-artifact - path: | - target/release/explorer-api - retention-days: 30 - - - name: Upload to release based on tag name - uses: softprops/action-gh-release@v1 - if: github.event_name == 'release' - with: - files: | - target/release/explorer-api diff --git a/.github/workflows/nym-cli-publish.yml b/.github/workflows/nym-cli-publish.yml deleted file mode 100644 index dab51eea24..0000000000 --- a/.github/workflows/nym-cli-publish.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Publish Nym CLI binaries - -on: - workflow_dispatch: - release: - types: [created] - -env: - NETWORK: mainnet - -jobs: - publish-nym-cli: - if: ${{ startsWith(github.ref, 'refs/tags/nym-cli-') && (github.event_name == 'release' || github.event_name == 'workflow_dispatch') }} - strategy: - fail-fast: false - matrix: - platform: [ubuntu-20.04, windows-latest, macos-latest] - - runs-on: ${{ matrix.platform }} - steps: - - uses: actions/checkout@v3 - - - name: Check the release tag starts with `nym-cli-` - uses: actions/github-script@v3 - with: - script: | - core.setFailed('Release tag did not start with nym-cli-...') - - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - - name: Build binary - run: make build-nym-cli - - - name: Upload Artifact - uses: actions/upload-artifact@v3 - with: - name: nym-cli-${{ matrix.platform }} - path: | - target/release/nym-cli* - retention-days: 30 - - - name: Upload to release based on tag name - uses: softprops/action-gh-release@v1 - if: github.event_name == 'release' - with: - files: | - target/release/nym-cli diff --git a/.github/workflows/nym-connect-publish-macos.yml b/.github/workflows/nym-connect-publish-macos.yml index faff21a30c..0c9b33e416 100644 --- a/.github/workflows/nym-connect-publish-macos.yml +++ b/.github/workflows/nym-connect-publish-macos.yml @@ -10,7 +10,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release' }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: diff --git a/.github/workflows/nym-connect-publish-ubuntu.yml b/.github/workflows/nym-connect-publish-ubuntu.yml index fd36ca4909..473371c9e0 100644 --- a/.github/workflows/nym-connect-publish-ubuntu.yml +++ b/.github/workflows/nym-connect-publish-ubuntu.yml @@ -10,7 +10,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release' }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-connect-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: diff --git a/.github/workflows/nym-release-publish.yml b/.github/workflows/nym-release-publish.yml index 09b4caa9b8..a73eabfcb3 100644 --- a/.github/workflows/nym-release-publish.yml +++ b/.github/workflows/nym-release-publish.yml @@ -16,7 +16,7 @@ env: jobs: publish-nym: - if: ${{ startsWith(github.ref, 'refs/tags/nym-binaries-') && github.event_name == 'release' }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-binaries-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: diff --git a/.github/workflows/nym-wallet-publish-macos.yml b/.github/workflows/nym-wallet-publish-macos.yml index db55bc9754..d3ef82759e 100644 --- a/.github/workflows/nym-wallet-publish-macos.yml +++ b/.github/workflows/nym-wallet-publish-macos.yml @@ -10,7 +10,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release' }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: diff --git a/.github/workflows/nym-wallet-publish-ubuntu.yml b/.github/workflows/nym-wallet-publish-ubuntu.yml index c27a9f0233..2b5a55c37a 100644 --- a/.github/workflows/nym-wallet-publish-ubuntu.yml +++ b/.github/workflows/nym-wallet-publish-ubuntu.yml @@ -9,7 +9,7 @@ defaults: jobs: publish-tauri: - if: ${{ startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release' }} + if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: diff --git a/Makefile b/Makefile index a13100f7ba..a3a51f4e6b 100644 --- a/Makefile +++ b/Makefile @@ -126,6 +126,8 @@ fmt-wasm-client: wasm: RUSTFLAGS='-C link-arg=-s' cargo build --manifest-path contracts/Cargo.toml --release --target wasm32-unknown-unknown + wasm-opt -Os contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm -o contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm + wasm-opt -Os contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm -o contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm mixnet-opt: wasm cd contracts/mixnet && make opt From 3bef973326cf4c285fd312af6a77be45d7104ecc Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 28 Feb 2023 17:27:58 +0100 Subject: [PATCH 528/591] fix: update versions of the latest release in changelogs from 1.0.11 to 1.1.11 --- CHANGELOG.md | 2 +- nym-connect/desktop/CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7db3d58a71..4d045624c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] -## [v1.0.11] (2023-02-28) +## [v1.1.11] (2023-02-28) - Fix empty dealer set loop ([#3105]) - The nym-api db.sqlite is broken when trying to run against it it in `enabled-credentials-mode true` there is an ordering issue with migrations when using the credential binary to purchase bandwidth ([#3100]) diff --git a/nym-connect/desktop/CHANGELOG.md b/nym-connect/desktop/CHANGELOG.md index 9e6f08fe2d..4bfd4a39e8 100644 --- a/nym-connect/desktop/CHANGELOG.md +++ b/nym-connect/desktop/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] -## [v1.0.11] (2023-02-28) +## [v1.1.11] (2023-02-28) - NC - add the option to manually select and use a specific Service Provider ([#2953]) From 5b81510325d530768706ef1365a05bfee510dff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 1 Mar 2023 09:12:47 +0000 Subject: [PATCH 529/591] added additional makefile targets that skip mobile-related steps (#3127) --- Makefile | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index a3a51f4e6b..7a012f7ba2 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,22 @@ test: clippy-all cargo-test wasm fmt +test-no-mobile: clippy-all-no-mobile cargo-test-no-mobile wasm fmt-no-mobile test-all: test cargo-test-expensive +test-all-no-mobile: test-no-mobile cargo-test-expensive no-clippy: build cargo-test wasm fmt +no-clippy-no-mobile: build-no-mobile cargo-test-no-mobile wasm fmt-no-mobile happy: fmt clippy-happy test -clippy-all: clippy-main clippy-main-examples clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-connect-mobile clippy-all-wasm-client -clippy-happy: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect clippy-happy-connect-mobile -cargo-test: test-main test-contracts test-wallet test-connect test-connect-mobile +happy-no-mobile: fmt-no-mobile clippy-happy-no-mobile test-no-mobile +clippy-all: clippy-all-no-mobile clippy-all-connect-mobile +clippy-all-no-mobile: clippy-main clippy-main-examples clippy-all-contracts clippy-all-wallet clippy-all-connect clippy-all-wasm-client +clippy-happy: clippy-happy-no-mobile clippy-happy-connect-mobile +clippy-happy-no-mobile: clippy-happy-main clippy-happy-contracts clippy-happy-wallet clippy-happy-connect +cargo-test: cargo-test-no-mobile test-connect-mobile +cargo-test-no-mobile: test-main test-contracts test-wallet test-connect cargo-test-expensive: test-main-expensive test-contracts-expensive test-wallet-expensive test-connect-expensive -build: build-contracts build-wallet build-main build-main-examples build-connect build-connect-mobile build-wasm-client -fmt: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-connect-mobile fmt-wasm-client +build: build-no-mobile build-connect-mobile +build-no-mobile: build-contracts build-wallet build-main build-main-examples build-connect build-wasm-client +fmt: fmt-no-mobile fmt-connect-mobile +fmt-no-mobile: fmt-main fmt-contracts fmt-wallet fmt-connect fmt-wasm-client clippy-happy-main: cargo clippy From a477b007e1cc9f5d975080e732acaba089f410c2 Mon Sep 17 00:00:00 2001 From: Fouad Date: Wed, 1 Mar 2023 09:22:35 +0000 Subject: [PATCH 530/591] TS Validator Client updates (#3085) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Squashed clients/validator content from old branch * fix up tests fix up linting * add bundle script * add build prod script to package json update tests * update readme + copy to dist output update global types update types and tests! * update package build * move types and tests into src * Squashed clients/validator content from old branch fix up tests fix up linting * add bundle script * add build prod script to package json update tests * update readme + copy to dist output update global types update types and tests! update package build * move types and tests into src * build to sub-dir * Fixing the few broken tests --------- Co-authored-by: Jon Häggblad Co-authored-by: benedettadavico --- clients/validator/.eslintrc.json | 148 ++++---- clients/validator/.gitignore | 3 +- clients/validator/.npmignore | 4 +- clients/validator/README.md | 49 ++- clients/validator/package.json | 52 ++- clients/validator/rollup.config.mjs | 15 + clients/validator/scripts/build-prod.sh | 31 ++ .../validator/scripts/buildPackageJson.mjs | 20 ++ clients/validator/src/currency.ts | 10 +- clients/validator/src/index.ts | 208 +++++++---- clients/validator/src/nym-api-querier.ts | 7 +- clients/validator/src/nyxd-querier.ts | 128 ++++--- clients/validator/src/query-client.ts | 177 +++++---- clients/validator/src/signing-client.ts | 120 ++++--- .../validator/src/tests/expectedResponses.ts | 178 ++++++++++ clients/validator/src/tests/mock/client.ts | 19 + .../src/tests/mock/delegation.mock.test.ts | 40 +++ .../src/tests/mock/gateway.mock.test.ts | 24 ++ .../src/tests/mock/mixnet.mock.test.ts | 65 ++++ .../src/tests/mock/mixnode.mock.test.ts | 71 ++++ clients/validator/src/tests/mock/testData.ts | 8 + .../src/tests/query/mixnetQueries.test.ts | 180 ++++++++++ .../src/tests/query/vestingQueries.test.ts | 28 ++ .../src/tests/sign/mixnetActions.test.ts | 107 ++++++ clients/validator/src/tsconfig.json | 15 - clients/validator/src/types.ts | 157 -------- clients/validator/src/types/global.d.ts | 11 + clients/validator/src/types/shared.ts | 259 ++++++++++++++ clients/validator/tests/query/balance.test.ts | 11 - clients/validator/tests/sign/send.test.ts | 14 - clients/validator/tsconfig.json | 43 ++- clients/validator/tsconfig.test.json | 6 + ts-packages/types/src/types/global.ts | 123 ++++++- yarn.lock | 335 +++++++++++------- 34 files changed, 1917 insertions(+), 749 deletions(-) create mode 100644 clients/validator/rollup.config.mjs create mode 100644 clients/validator/scripts/build-prod.sh create mode 100644 clients/validator/scripts/buildPackageJson.mjs create mode 100644 clients/validator/src/tests/expectedResponses.ts create mode 100644 clients/validator/src/tests/mock/client.ts create mode 100644 clients/validator/src/tests/mock/delegation.mock.test.ts create mode 100644 clients/validator/src/tests/mock/gateway.mock.test.ts create mode 100644 clients/validator/src/tests/mock/mixnet.mock.test.ts create mode 100644 clients/validator/src/tests/mock/mixnode.mock.test.ts create mode 100644 clients/validator/src/tests/mock/testData.ts create mode 100644 clients/validator/src/tests/query/mixnetQueries.test.ts create mode 100644 clients/validator/src/tests/query/vestingQueries.test.ts create mode 100644 clients/validator/src/tests/sign/mixnetActions.test.ts delete mode 100644 clients/validator/src/tsconfig.json delete mode 100644 clients/validator/src/types.ts create mode 100644 clients/validator/src/types/global.d.ts create mode 100644 clients/validator/src/types/shared.ts delete mode 100644 clients/validator/tests/query/balance.test.ts delete mode 100644 clients/validator/tests/sign/send.test.ts create mode 100644 clients/validator/tsconfig.test.json diff --git a/clients/validator/.eslintrc.json b/clients/validator/.eslintrc.json index 985f191ff5..1069570078 100644 --- a/clients/validator/.eslintrc.json +++ b/clients/validator/.eslintrc.json @@ -1,83 +1,71 @@ { - "root": true, - "env": { - "browser": true, - "es6": true, - "node": true - }, - "parserOptions": { - "ecmaVersion": 2019, - "sourceType": "module" - }, - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "plugins": ["prettier", "mocha"], - "extends": [ - "airbnb-base", - "airbnb-typescript/base", - "prettier"], - "rules": { - "prettier/prettier": "error", - "import/prefer-default-export": "off", - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": [ - "**/*.test.[jt]s", - "**/*.spec.[jt]s" - ] - } - ], - "import/extensions": [ - "error", - "ignorePackages", - { - "ts": "never", - "js": "never" - } - ] - }, - "overrides": [ - { - "files": "**/*.ts", - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint/eslint-plugin"], - "extends": [ - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-var-requires": "off", - "no-use-before-define": [0], - "@typescript-eslint/no-use-before-define": [1], - "import/no-unresolved": 0, - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": [ - "**/*.test.ts", - "**/*.spec.ts" - ] - } - ], - "quotes": "off", - "@typescript-eslint/quotes": [ - 2, - "single", - { - "avoidEscape": true - } - ], - "@typescript-eslint/no-unused-vars": [2, { "argsIgnorePattern": "^_" }] - } - } + "root": true, + "env": { + "browser": true, + "es6": true, + "node": true + }, + "parserOptions": { + "ecmaVersion": 2019, + "sourceType": "module" + }, + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "plugins": ["prettier", "mocha"], + "extends": ["airbnb-base", "airbnb-typescript/base", "prettier"], + "rules": { + "prettier/prettier": "error", + "import/prefer-default-export": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": ["**/*.test.[jt]s", "**/*.spec.[jt]s"] + } + ], + "import/extensions": [ + "error", + "ignorePackages", + { + "ts": "never", + "js": "never" + } ] + }, + "overrides": [ + { + "files": "**/*.ts", + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json" + }, + "plugins": ["@typescript-eslint/eslint-plugin"], + "extends": ["plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "rules": { + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-var-requires": "off", + "no-use-before-define": [0], + "@typescript-eslint/no-use-before-define": [1], + "import/no-unresolved": 0, + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": ["**/*.test.ts", "**/*.spec.ts"] + } + ], + "quotes": "off", + "@typescript-eslint/quotes": [ + 2, + "single", + { + "avoidEscape": true + } + ], + "@typescript-eslint/no-unused-vars": [2, { "argsIgnorePattern": "^_" }] + } + } + ], + "ignorePatterns": ["tsconfig.json", "*.d.ts", "dist/**/*", "dist", "node_modules"] } diff --git a/clients/validator/.gitignore b/clients/validator/.gitignore index 5a4946114d..ee82866c85 100644 --- a/clients/validator/.gitignore +++ b/clients/validator/.gitignore @@ -4,4 +4,5 @@ coverage dist docs examples/accounts -node_modules \ No newline at end of file +node_modules +.env \ No newline at end of file diff --git a/clients/validator/.npmignore b/clients/validator/.npmignore index 62ab11e57c..298aabc724 100644 --- a/clients/validator/.npmignore +++ b/clients/validator/.npmignore @@ -1,3 +1,5 @@ coverage node_modules -tests \ No newline at end of file +tests +src +type diff --git a/clients/validator/README.md b/clients/validator/README.md index d54ebe7c77..41c1ae73af 100644 --- a/clients/validator/README.md +++ b/clients/validator/README.md @@ -1,40 +1,39 @@ -Nym Validator Client -==================== +# Nym Validator Client (Typescript) -A TypeScript client for interacting with CosmWasm smart contracts in Nym validators. +A TypeScript client for interacting with CosmWasm smart contracts in Nym validators. -Running examples ------------------ - -With the code checked out, `cd examples`. This folder contains runnable example code that will set up a blockchain and allow you to interact with it through the client. - -Running tests -------------- +Include the Nym Validator in your project: ``` -npm test +yarn add @nymproject/nym-validator-client ``` -You can also trigger test execution with a test watcher. I don't have the centuries of life left to me that are needed to fight through the arcana of wiring up a working TypeScript mocha triggered execution setup, so for now my Cargo-based hack is: - +Connect to validator and make queries ``` -cargo watch -s "cd clients/validator && npm test" +import Validator from '@nymproject/nym-validator-client' + +const main = async () => { + + const client = await Validator.connectForQuery(rpcAddress, validatorAddress, prefix, mixnetContractAddress, vestingContractAddress, denom) + + client.getBalance(address) + +} + ``` -It's ugly but works fine if you have Cargo installed. TypeScript setup help happily accepted here. +Connect to validator for performing actions -Generating Documentation ------------------------- +``` +import Validator from '@nymproject/nym-validator-client' -You can generate docs by running `npm run docs`. Generated output will appear in the `docs` directory. +const main = async () => { -Packaging ------------------------- + const client = await Validator.connect(mnemonic, rpcAddress, validatorAddress, prefix, mixnetContractAddress, vestingContractAddress, denom) -If you're a Nym platform developer who's made changes to the client and wants to re-publish the package to NPM, here's how you do it: + const res = await client.send(address, [{ amount: '10000000', denom: 'unym' }]); -1. Bump the version number (use SemVer) -1. `npm run build` -1. `npm login` (if you haven't already) -1. `npm publish` \ No newline at end of file +} + +``` diff --git a/clients/validator/package.json b/clients/validator/package.json index 6179e11b19..47766a842b 100644 --- a/clients/validator/package.json +++ b/clients/validator/package.json @@ -4,15 +4,23 @@ "description": "A TypeScript client for interacting with smart contracts in Nym validators", "repository": "https://github.com/nymtech/nym", "main": "./dist/index.js", - "types": "dist/index.d.ts", + "types": "./dist/index.d.ts", "scripts": { - "build": "tsc", - "test": "ts-mocha tests/**/*.test.ts", + "build": "rollup -c ./rollup.config.mjs", + "build:types": "rollup-type-bundler --dist ./dist/nym-validator-client", + "build:prod": "sh ./scripts/build-prod.sh", + "test": "ts-mocha -p ./tsconfig.test.json ./src/tests/**/*.test.ts", + "testmock": "ts-mocha -p ./tsconfig.test.json ./src/tests/mock/*.test.ts", "coverage": "nyc npm test", - "lint": "eslint src", - "lint:fix": "eslint src --fix", + "clean": "rm -rf ./dist", + "lint": "eslint", + "lint:fix": "eslint --fix", + "lint:tsc": "tsc --noEmit", "docs": "typedoc --out docs src/index.ts" }, + "files": [ + "./dist/*" + ], "keywords": [], "author": "Nym Technologies SA (https://nymtech.net)", "contributors": [ @@ -21,6 +29,14 @@ ], "license": "Apache-2.0", "devDependencies": { + "@favware/rollup-type-bundler": "^2.0.0", + "@nymproject/types": "^1.0.0", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-typescript": "^11.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "rollup": "^3.17.2", + "rollup-plugin-dts": "^5.2.0", "@typescript-eslint/eslint-plugin": "^5.7.0", "@typescript-eslint/parser": "^5.7.0", "eslint": "^7.18.0", @@ -31,21 +47,21 @@ "eslint-plugin-import": "^2.25.4", "eslint-plugin-mocha": "^10.0.3", "eslint-plugin-prettier": "^4.0.0", - "expect": "^28.1.3", "mocha": "^10.0.0", "prettier": "^2.5.1", - "typedoc": "^0.22.13", "ts-mocha": "^10.0.0", - "typescript": "^4.6.2" - }, - "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.28.0", - "@cosmjs/crypto": "^0.28.0", - "@cosmjs/math": "^0.28.0", - "@cosmjs/proto-signing": "^0.28.0", - "@cosmjs/stargate": "^0.28.0", - "@cosmjs/tendermint-rpc": "^0.28.0", - "axios": "^0.26.1", - "cosmjs-types": "^0.4.1" + "typedoc": "^0.22.13", + "typescript": "^4.6.2", + "cosmjs-types": "^0.4.1", + "dotenv": "^16.0.3", + "expect": "^28.1.3", + "moq.ts": "^7.3.4", + "@cosmjs/cosmwasm-stargate": "^0.29.5", + "@cosmjs/crypto": "^0.29.5", + "@cosmjs/math": "^0.29.5", + "@cosmjs/proto-signing": "^0.29.5", + "@cosmjs/stargate": "^0.29.5", + "@cosmjs/tendermint-rpc": "^0.29.5", + "axios": "^1.3.3" } } diff --git a/clients/validator/rollup.config.mjs b/clients/validator/rollup.config.mjs new file mode 100644 index 0000000000..f78cf449cf --- /dev/null +++ b/clients/validator/rollup.config.mjs @@ -0,0 +1,15 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import json from '@rollup/plugin-json'; +import commonjs from '@rollup/plugin-commonjs'; + +export default [ + { + input: './src/index.ts', + output: { + dir: 'dist/nym-validator-client', + format: 'cjs', + }, + plugins: [resolve(), typescript(), commonjs(), json()], + }, +]; diff --git a/clients/validator/scripts/build-prod.sh b/clients/validator/scripts/build-prod.sh new file mode 100644 index 0000000000..06188652b0 --- /dev/null +++ b/clients/validator/scripts/build-prod.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset + +rm -rf ./dist || true +rm -rf ../../dist || true + + +# Bundle application + +yarn build + +# Bundle types + +yarn build:types + +# Build package.json for bundle + +node ./scripts/buildPackageJson.mjs + +# Copy README + +cp README.md dist/nym-validator-client + +# move the output outside of the yarn/npm workspaces + +mv ./dist ../../ + +echo "Output can be found in:" +realpath ../../dist \ No newline at end of file diff --git a/clients/validator/scripts/buildPackageJson.mjs b/clients/validator/scripts/buildPackageJson.mjs new file mode 100644 index 0000000000..da95f10e9d --- /dev/null +++ b/clients/validator/scripts/buildPackageJson.mjs @@ -0,0 +1,20 @@ +import * as fs from 'fs'; + +// parse the package.json from the SDK, so we can keep fields like the name and version +const json = JSON.parse(fs.readFileSync('./package.json').toString()); + +// defaults (NB: these are in the output file locations) +const main = 'index.js'; +const types = 'index.d.ts'; + +// make a package.json for the bundle +const packageJson = { + name: json.name, + version: json.version, + license: json.license, + author: json.author, + main, + types, +}; + +fs.writeFileSync('./dist/nym-validator-client/package.json', JSON.stringify(packageJson, null, 2)); diff --git a/clients/validator/src/currency.ts b/clients/validator/src/currency.ts index 483d13b408..216905f8b1 100644 --- a/clients/validator/src/currency.ts +++ b/clients/validator/src/currency.ts @@ -1,5 +1,6 @@ import { Decimal } from '@cosmjs/math'; import { Coin } from '@cosmjs/stargate'; +import { CoinMap } from './types/shared'; // NARROW NO-BREAK SPACE (U+202F) const thinSpace = '\u202F'; @@ -34,15 +35,6 @@ export function nativeToPrintable(nativeValue: string): string { return Decimal.fromAtomics(nativeValue, 6).toString(); } -export interface MappedCoin { - readonly denom: string; - readonly fractionalDigits: number; -} - -export interface CoinMap { - readonly [key: string]: MappedCoin; -} - export function nativeCoinToDisplay(coin: Coin, coinMap: CoinMap): Coin { if (!coinMap) return coin; diff --git a/clients/validator/src/index.ts b/clients/validator/src/index.ts index dac29371c3..e11d24525f 100644 --- a/clients/validator/src/index.ts +++ b/clients/validator/src/index.ts @@ -1,6 +1,3 @@ -import { Bip39, Random } from '@cosmjs/crypto'; -import { DirectSecp256k1HdWallet, EncodeObject } from '@cosmjs/proto-signing'; -import { coin as cosmosCoin, Coin, DeliverTxResponse, isDeliverTxFailure, StdFee } from '@cosmjs/stargate'; import { ExecuteResult, InstantiateOptions, @@ -8,45 +5,37 @@ import { MigrateResult, UploadResult, } from '@cosmjs/cosmwasm-stargate'; -import SigningClient, { ISigningClient } from './signing-client'; +import { Bip39, Random } from '@cosmjs/crypto'; +import { DirectSecp256k1HdWallet, EncodeObject } from '@cosmjs/proto-signing'; +import { Coin, coin as cosmosCoin, DeliverTxResponse, isDeliverTxFailure, StdFee } from '@cosmjs/stargate'; import { ContractStateParams, Delegation, Gateway, GatewayBond, + GatewayOwnershipResponse, + LayerDistribution, MixnetContractVersion, MixNode, MixNodeBond, + MixNodeCostParams, + MixNodeDetails, + MixNodeRewarding, + MixOwnershipResponse, PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse, PagedGatewayResponse, PagedMixDelegationsResponse, - PagedMixnodeResponse, -} from './types'; -import { - CoinMap, - displayAmountToNative, - MappedCoin, - nativeCoinToDisplay, - nativeToPrintable, - printableBalance, - printableCoin, -} from './currency'; + PagedMixNodeBondResponse, + PagedMixNodeDetailsResponse, + PagedUnbondedMixnodesResponse, + RewardingParams, + StakeSaturationResponse, + UnbondedMixnodeResponse, +} from '@nymproject/types'; import QueryClient from './query-client'; -import { nymGasPrice } from './stargate-helper'; - -export { coins, coin } from '@cosmjs/stargate'; -export { Coin }; -export { - displayAmountToNative, - nativeCoinToDisplay, - printableCoin, - printableBalance, - nativeToPrintable, - MappedCoin, - CoinMap, -}; -export { nymGasPrice }; +import SigningClient, { ISigningClient } from './signing-client'; +import { ContractState } from './types/shared'; export interface INymClient { readonly mixnetContract: string; @@ -147,7 +136,7 @@ export default class ValidatorClient implements INymClient { return DirectSecp256k1HdWallet.fromMnemonic(mnemonic, signerOptions); } - getBalance(address: string): Promise { + async getBalance(address: string): Promise { return this.client.getBalance(address, this.denom); } @@ -159,15 +148,39 @@ export default class ValidatorClient implements INymClient { return this.client.getCachedMixnodes(); } - async getActiveMixnodes(): Promise { + async getStakeSaturation(mixId: number): Promise { + return this.client.getStakeSaturation(this.mixnetContract, mixId); + } + + async getActiveMixnodes(): Promise { return this.client.getActiveMixnodes(); } + async getUnbondedMixNodeInformation(mixId: number): Promise { + return this.client.getUnbondedMixNodeInformation(this.mixnetContract, mixId); + } + async getRewardedMixnodes(): Promise { return this.client.getRewardedMixnodes(); } - public async getMixnetContractSettings(): Promise { + async getMixnodeRewardingDetails(mixId: number): Promise { + return this.client.getMixnodeRewardingDetails(this.mixnetContract, mixId); + } + + async getOwnedMixnode(address: string): Promise { + return this.client.getOwnedMixnode(this.mixnetContract, address); + } + + async ownsGateway(address: string): Promise { + return this.client.ownsGateway(this.mixnetContract, address); + } + + async getLayerDistribution(): Promise { + return this.client.getLayerDistribution(this.mixnetContract); + } + + public async getMixnetContractSettings(): Promise { return this.client.getStateParams(this.mixnetContract); } @@ -175,29 +188,74 @@ export default class ValidatorClient implements INymClient { return this.client.getContractVersion(this.mixnetContract); } - public async getRewardPool(): Promise { - return this.client.getRewardPool(this.mixnetContract); + public async getVestingContractVersion(): Promise { + return this.client.getContractVersion(this.vestingContract); } - public async getCirculatingSupply(): Promise { - return this.client.getCirculatingSupply(this.mixnetContract); + public async getSpendableCoins(vestingAccountAddress: string): Promise { + return this.client.getSpendableCoins(this.vestingContract, vestingAccountAddress); } - public async getSybilResistancePercent(): Promise { - return this.client.getSybilResistancePercent(this.mixnetContract); + public async getRewardParams(): Promise { + return this.client.getRewardParams(this.mixnetContract); } - public async getIntervalRewardPercent(): Promise { - return this.client.getIntervalRewardPercent(this.mixnetContract); + async getUnbondedMixNodes(): Promise { + let mixNodes: UnbondedMixnodeResponse[] = []; + const limit = 50; + let startAfter; + for (;;) { + // eslint-disable-next-line no-await-in-loop + const pagedResponse: PagedUnbondedMixnodesResponse = await this.client.getUnbondedMixNodes( + this.mixnetContract, + limit, + startAfter, + ); + + mixNodes = mixNodes.concat(pagedResponse.nodes); + startAfter = pagedResponse.start_next_after; + // if `start_next_after` is not set, we're done + if (!startAfter) { + break; + } + } + + return mixNodes; } - public async getAllNyxdMixnodes(): Promise { + public async getMixNodeBonds(): Promise { let mixNodes: MixNodeBond[] = []; const limit = 50; let startAfter; - for (; ;) { + for (;;) { // eslint-disable-next-line no-await-in-loop - const pagedResponse: PagedMixnodeResponse = await this.client.getMixNodesPaged(this.mixnetContract, limit); + const pagedResponse: PagedMixNodeBondResponse = await this.client.getMixNodeBonds( + this.mixnetContract, + limit, + startAfter, + ); + mixNodes = mixNodes.concat(pagedResponse.nodes); + startAfter = pagedResponse.start_next_after; + // if `start_next_after` is not set, we're done + if (!startAfter) { + break; + } + } + + return mixNodes; + } + + public async getMixNodesDetailed(): Promise { + let mixNodes: MixNodeDetails[] = []; + const limit = 50; + let startAfter; + for (;;) { + // eslint-disable-next-line no-await-in-loop + const pagedResponse: PagedMixNodeDetailsResponse = await this.client.getMixNodesDetailed( + this.mixnetContract, + limit, + startAfter, + ); mixNodes = mixNodes.concat(pagedResponse.nodes); startAfter = pagedResponse.start_next_after; // if `start_next_after` is not set, we're done @@ -210,37 +268,24 @@ export default class ValidatorClient implements INymClient { } public async getAllNyxdGateways(): Promise { - let gateways: GatewayBond[] = []; - const limit = 50; - let startAfter; - for (; ;) { - // eslint-disable-next-line no-await-in-loop - const pagedResponse: PagedGatewayResponse = await this.client.getGatewaysPaged(this.mixnetContract, limit); - gateways = gateways.concat(pagedResponse.nodes); - startAfter = pagedResponse.start_next_after; - // if `start_next_after` is not set, we're done - if (!startAfter) { - break; - } - } - - return gateways; + const pagedResponse: PagedGatewayResponse = await this.client.getGatewaysPaged(this.mixnetContract); + return pagedResponse.nodes; } /** * Gets list of all delegations towards particular mixnode. * - * @param mixIdentity identity of the node to which the delegation was sent + * @param mix_id identity of the node to which the delegation was sent */ - public async getAllNyxdSingleMixnodeDelegations(mixIdentity: string): Promise { + public async getAllNyxdSingleMixnodeDelegations(mix_id: number): Promise { let delegations: Delegation[] = []; const limit = 250; let startAfter; - for (; ;) { + for (;;) { // eslint-disable-next-line no-await-in-loop const pagedResponse: PagedMixDelegationsResponse = await this.client.getMixNodeDelegationsPaged( this.mixnetContract, - mixIdentity, + mix_id, limit, startAfter, ); @@ -259,7 +304,7 @@ export default class ValidatorClient implements INymClient { let delegations: Delegation[] = []; const limit = 250; let startAfter; - for (; ;) { + for (;;) { // eslint-disable-next-line no-await-in-loop const pagedResponse: PagedDelegatorDelegationsResponse = await this.client.getDelegatorDelegationsPaged( this.mixnetContract, @@ -278,13 +323,13 @@ export default class ValidatorClient implements INymClient { return delegations; } - public async getAllNyxdNetworkDelegations(): Promise { + public async getAllNyxdDelegations(): Promise { let delegations: Delegation[] = []; const limit = 250; let startAfter; - for (; ;) { + for (;;) { // eslint-disable-next-line no-await-in-loop - const pagedResponse: PagedAllDelegationsResponse = await this.client.getAllNetworkDelegationsPaged( + const pagedResponse: PagedAllDelegationsResponse = await this.client.getAllDelegationsPaged( this.mixnetContract, limit, startAfter, @@ -300,6 +345,10 @@ export default class ValidatorClient implements INymClient { return delegations; } + public async getDelegationDetails(mix_id: number, delegator: string): Promise { + return this.client.getDelegationDetails(this.mixnetContract, mix_id, delegator); + } + /** * Generate a minimum gateway bond required to create a fresh mixnode. * @@ -308,7 +357,7 @@ export default class ValidatorClient implements INymClient { public async minimumMixnodePledge(): Promise { const stateParams = await this.getMixnetContractSettings(); // we trust the contract to return a valid number - return cosmosCoin(stateParams.minimum_mixnode_pledge, this.prefix); + return cosmosCoin(stateParams.params.minimum_mixnode_pledge, this.prefix); } /** @@ -319,7 +368,7 @@ export default class ValidatorClient implements INymClient { public async minimumGatewayPledge(): Promise { const stateParams = await this.getMixnetContractSettings(); // we trust the contract to return a valid number - return cosmosCoin(stateParams.minimum_gateway_pledge, this.prefix); + return cosmosCoin(stateParams.params.minimum_gateway_pledge, this.prefix); } public async send( @@ -393,12 +442,21 @@ export default class ValidatorClient implements INymClient { public async bondMixNode( mixNode: MixNode, ownerSignature: string, + costParams: MixNodeCostParams, pledge: Coin, fee?: StdFee | 'auto' | number, memo?: string, ): Promise { this.assertSigning(); - return (this.client as ISigningClient).bondMixNode(this.mixnetContract, mixNode, ownerSignature, pledge, fee, memo); + return (this.client as ISigningClient).bondMixNode( + this.mixnetContract, + mixNode, + costParams, + ownerSignature, + pledge, + fee, + memo, + ); } public async unbondMixNode(fee?: StdFee | 'auto' | number, memo?: string): Promise { @@ -423,29 +481,29 @@ export default class ValidatorClient implements INymClient { } public async delegateToMixNode( - mixIdentity: string, + mixId: number, amount: Coin, fee?: StdFee | 'auto' | number, memo?: string, ): Promise { this.assertSigning(); - return (this.client as ISigningClient).delegateToMixNode(this.mixnetContract, mixIdentity, amount, fee, memo); + return (this.client as ISigningClient).delegateToMixNode(this.mixnetContract, mixId, amount, fee, memo); } public async undelegateFromMixNode( - mixIdentity: string, + mixId: number, fee?: StdFee | 'auto' | number, memo?: string, ): Promise { - return (this.client as ISigningClient).undelegateFromMixNode(this.mixnetContract, mixIdentity, fee, memo); + return (this.client as ISigningClient).undelegateFromMixNode(this.mixnetContract, mixId, fee, memo); } public async updateMixnodeConfig( - mixIdentity: string, + mixId: number, fee: StdFee | 'auto' | number, profitPercentage: number, ): Promise { - return (this.client as ISigningClient).updateMixnodeConfig(this.mixnetContract, mixIdentity, profitPercentage, fee); + return (this.client as ISigningClient).updateMixnodeConfig(this.mixnetContract, mixId, profitPercentage, fee); } public async updateContractStateParams( diff --git a/clients/validator/src/nym-api-querier.ts b/clients/validator/src/nym-api-querier.ts index 3fa0471804..e66c93c41f 100644 --- a/clients/validator/src/nym-api-querier.ts +++ b/clients/validator/src/nym-api-querier.ts @@ -2,9 +2,8 @@ * Copyright 2021 - Nym Technologies SA * SPDX-License-Identifier: Apache-2.0 */ - import axios from 'axios'; -import { GatewayBond, MixNodeBond } from './types'; +import { GatewayBond, MixNodeBond, MixNodeDetails } from '@nymproject/types'; export const NYM_API_VERSION = '/v1'; export const NYM_API_GATEWAYS_PATH = `${NYM_API_VERSION}/gateways`; @@ -17,7 +16,7 @@ export interface INymApiQuery { getCachedGateways(): Promise; - getActiveMixnodes(): Promise; + getActiveMixnodes(): Promise; getRewardedMixnodes(): Promise; } @@ -51,7 +50,7 @@ export default class NymApiQuerier implements INymApiQuery { throw new Error('None of the provided validator APIs seem to be alive'); } - async getActiveMixnodes(): Promise { + async getActiveMixnodes(): Promise { const url = new URL(this.nymApiUrl); url.pathname += NYM_API_ACTIVE_MIXNODES_PATH; diff --git a/clients/validator/src/nyxd-querier.ts b/clients/validator/src/nyxd-querier.ts index edd791a8fe..0e34493c2e 100644 --- a/clients/validator/src/nyxd-querier.ts +++ b/clients/validator/src/nyxd-querier.ts @@ -2,28 +2,24 @@ * Copyright 2021 - Nym Technologies SA * SPDX-License-Identifier: Apache-2.0 */ - -import { JsonObject } from '@cosmjs/cosmwasm-stargate'; // eslint-disable-next-line import/no-cycle import { INyxdQuery } from './query-client'; +import { Delegation, RewardingParams, StakeSaturationResponse } from '@nymproject/types'; import { - ContractStateParams, - Delegation, + UnbondedMixnodeResponse, GatewayOwnershipResponse, - LayerDistribution, MixnetContractVersion, MixOwnershipResponse, PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse, PagedGatewayResponse, PagedMixDelegationsResponse, - PagedMixnodeResponse, - RewardingStatus, -} from './types'; - -interface SmartContractQuery { - queryContractSmart(address: string, queryMsg: Record): Promise; -} + PagedMixNodeBondResponse, + PagedMixNodeDetailsResponse, + PagedUnbondedMixnodesResponse, + LayerDistribution, +} from '@nymproject/types'; +import { ContractState, SmartContractQuery } from './types/shared'; export default class NyxdQuerier implements INyxdQuery { client: SmartContractQuery; @@ -38,15 +34,44 @@ export default class NyxdQuerier implements INyxdQuery { }); } - getMixNodesPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise { + getMixNodeBonds( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { return this.client.queryContractSmart(mixnetContractAddress, { - get_mix_nodes: { + get_mix_node_bonds: { limit, start_after: startAfter, }, }); } + getMixNodesDetailed( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.client.queryContractSmart(mixnetContractAddress, { + get_mix_nodes_detailed: { + limit, + start_after: startAfter, + }, + }); + } + + getStakeSaturation(mixnetContractAddress: string, mixId: number): Promise { + return this.client.queryContractSmart(mixnetContractAddress, { + get_stake_saturation: { mix_id: mixId }, + }); + } + + getMixnodeRewardingDetails(mixnetContractAddress: string, mixId: number): Promise { + return this.client.queryContractSmart(mixnetContractAddress, { + get_mixnode_rewarding_details: { mix_id: mixId }, + }); + } + getGatewaysPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise { return this.client.queryContractSmart(mixnetContractAddress, { get_gateways: { @@ -56,35 +81,51 @@ export default class NyxdQuerier implements INyxdQuery { }); } - ownsMixNode(mixnetContractAddress: string, address: string): Promise { + getOwnedMixnode(mixnetContractAddress: string, address: string): Promise { return this.client.queryContractSmart(mixnetContractAddress, { - owns_mixnode: { + get_owned_mixnode: { address, }, }); } + getUnbondedMixNodes( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.client.queryContractSmart(mixnetContractAddress, { + get_unbonded_mix_nodes: { limit, start_after: startAfter }, + }); + } + + getUnbondedMixNodeInformation(mixnetContractAddress: string, mixId: number): Promise { + return this.client.queryContractSmart(mixnetContractAddress, { + get_unbonded_mix_node_information: { mix_id: mixId }, + }); + } + ownsGateway(mixnetContractAddress: string, address: string): Promise { return this.client.queryContractSmart(mixnetContractAddress, { - owns_gateway: { + get_owned_gateway: { address, }, }); } - getStateParams(mixnetContractAddress: string): Promise { + getStateParams(mixnetContractAddress: string): Promise { return this.client.queryContractSmart(mixnetContractAddress, { - state_params: {}, + get_state: {}, }); } - getAllNetworkDelegationsPaged( + getAllDelegationsPaged( mixnetContractAddress: string, limit?: number, startAfter?: [string, string], ): Promise { return this.client.queryContractSmart(mixnetContractAddress, { - get_all_network_delegations: { + get_all_delegations: { start_after: startAfter, limit, }, @@ -93,13 +134,13 @@ export default class NyxdQuerier implements INyxdQuery { getMixNodeDelegationsPaged( mixnetContractAddress: string, - mixIdentity: string, + mix_id: number, limit?: number, startAfter?: string, ): Promise { return this.client.queryContractSmart(mixnetContractAddress, { get_mixnode_delegations: { - mix_identity: mixIdentity, + mix_id: mix_id, start_after: startAfter, limit, }, @@ -121,10 +162,10 @@ export default class NyxdQuerier implements INyxdQuery { }); } - getDelegationDetails(mixnetContractAddress: string, mixIdentity: string, delegator: string): Promise { + getDelegationDetails(mixnetContractAddress: string, mix_id: number, delegator: string): Promise { return this.client.queryContractSmart(mixnetContractAddress, { get_delegation_details: { - mix_identity: mixIdentity, + mix_id: mix_id, delegator, }, }); @@ -132,44 +173,19 @@ export default class NyxdQuerier implements INyxdQuery { getLayerDistribution(mixnetContractAddress: string): Promise { return this.client.queryContractSmart(mixnetContractAddress, { - layer_distribution: {}, + get_layer_distribution: {}, }); } - getRewardPool(mixnetContractAddress: string): Promise { + getRewardParams(mixnetContractAddress: string): Promise { return this.client.queryContractSmart(mixnetContractAddress, { - get_reward_pool: {}, + get_rewarding_params: {}, }); } - getCirculatingSupply(mixnetContractAddress: string): Promise { - return this.client.queryContractSmart(mixnetContractAddress, { - get_circulating_supply: {}, - }); - } - - getIntervalRewardPercent(mixnetContractAddress: string): Promise { - return this.client.queryContractSmart(mixnetContractAddress, { - get_interval_reward_percent: {}, - }); - } - - getSybilResistancePercent(mixnetContractAddress: string): Promise { - return this.client.queryContractSmart(mixnetContractAddress, { - get_sybil_resistance_percent: {}, - }); - } - - getRewardingStatus( - mixnetContractAddress: string, - mixIdentity: string, - rewardingIntervalNonce: number, - ): Promise { - return this.client.queryContractSmart(mixnetContractAddress, { - get_rewarding_status: { - mix_identity: mixIdentity, - rewarding_interval_nonce: rewardingIntervalNonce, - }, + getSpendableCoins(vestingContractAddress: string, vestingAccountAddress: string): Promise { + return this.client.queryContractSmart(vestingContractAddress, { + vesting_account_address: vestingAccountAddress, }); } } diff --git a/clients/validator/src/query-client.ts b/clients/validator/src/query-client.ts index c78237cdb4..319c46f80e 100644 --- a/clients/validator/src/query-client.ts +++ b/clients/validator/src/query-client.ts @@ -1,75 +1,56 @@ -import { CosmWasmClient, JsonObject } from '@cosmjs/cosmwasm-stargate'; -import { Tendermint34Client } from '@cosmjs/tendermint-rpc'; -import { - Account, - Block, - Coin, - DeliverTxResponse, - IndexedTx, - SearchTxFilter, - SearchTxQuery, - SequenceResponse, -} from '@cosmjs/stargate'; -import { Code, CodeDetails, Contract, ContractCodeHistoryEntry } from '@cosmjs/cosmwasm-stargate/build/cosmwasmclient'; +import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'; // eslint-disable-next-line import/no-cycle import NyxdQuerier from './nyxd-querier'; import { - ContractStateParams, Delegation, GatewayBond, GatewayOwnershipResponse, LayerDistribution, MixnetContractVersion, - MixNodeBond, + MixNodeDetails, MixOwnershipResponse, PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse, PagedGatewayResponse, PagedMixDelegationsResponse, - PagedMixnodeResponse, - RewardingStatus, -} from './types'; -import NymApiQuerier, { INymApiQuery as INymApiQuery } from './nym-api-querier'; - -export interface ICosmWasmQuery { - // methods exposed by `CosmWasmClient` - getChainId(): Promise; - getHeight(): Promise; - getAccount(searchAddress: string): Promise; - getSequence(address: string): Promise; - getBlock(height?: number): Promise; - getBalance(address: string, searchDenom: string): Promise; - getTx(id: string): Promise; - searchTx(query: SearchTxQuery, filter?: SearchTxFilter): Promise; - disconnect(): void; - broadcastTx(tx: Uint8Array, timeoutMs?: number, pollIntervalMs?: number): Promise; - getCodes(): Promise; - getCodeDetails(codeId: number): Promise; - getContracts(codeId: number): Promise; - getContract(address: string): Promise; - getContractCodeHistory(address: string): Promise; - queryContractRaw(address: string, key: Uint8Array): Promise; - queryContractSmart(address: string, queryMsg: Record): Promise; -} + PagedMixNodeBondResponse, + PagedMixNodeDetailsResponse, + PagedUnbondedMixnodesResponse, + StakeSaturationResponse, + UnbondedMixnodeResponse, + MixNodeBond, + MixNodeRewarding, +} from '@nymproject/types'; +import NymApiQuerier, { INymApiQuery } from './nym-api-querier'; +import { ContractState, ICosmWasmQuery } from './types/shared'; +import { RewardingParams } from '@nymproject/types'; +import { Tendermint34Client } from '@cosmjs/tendermint-rpc'; export interface INyxdQuery { // nym-specific implemented inside NymQuerier getContractVersion(mixnetContractAddress: string): Promise; - - getMixNodesPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise; + getMixNodeBonds( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise; + getMixNodesDetailed( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise; getGatewaysPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise; - ownsMixNode(mixnetContractAddress: string, address: string): Promise; + getOwnedMixnode(mixnetContractAddress: string, address: string): Promise; ownsGateway(mixnetContractAddress: string, address: string): Promise; - getStateParams(mixnetContractAddress: string): Promise; - - getAllNetworkDelegationsPaged( + getStateParams(mixnetContractAddress: string): Promise; + getAllDelegationsPaged( mixnetContractAddress: string, limit?: number, startAfter?: [string, string], ): Promise; getMixNodeDelegationsPaged( mixnetContractAddress: string, - mixIdentity: string, + mix_id: number, limit?: number, startAfter?: string, ): Promise; @@ -79,21 +60,15 @@ export interface INyxdQuery { limit?: number, startAfter?: string, ): Promise; - getDelegationDetails(mixnetContractAddress: string, mixIdentity: string, delegator: string): Promise; - + getDelegationDetails(mixnetContractAddress: string, mix_id: number, delegator: string): Promise; getLayerDistribution(mixnetContractAddress: string): Promise; - getRewardPool(mixnetContractAddress: string): Promise; - getCirculatingSupply(mixnetContractAddress: string): Promise; - getIntervalRewardPercent(mixnetContractAddress: string): Promise; - getSybilResistancePercent(mixnetContractAddress: string): Promise; - getRewardingStatus( - mixnetContractAddress: string, - mixIdentity: string, - rewardingIntervalNonce: number, - ): Promise; + getRewardParams(mixnetContractAddress: string): Promise; + getStakeSaturation(mixnetContractAddress: string, mixId: number): Promise; + getUnbondedMixNodeInformation(mixnetContractAddress: string, mixId: number): Promise; + getMixnodeRewardingDetails(mixnetContractAddress: string, mixId: number): Promise; } -export interface IQueryClient extends ICosmWasmQuery, INyxdQuery, INymApiQuery { } +export interface IQueryClient extends ICosmWasmQuery, INyxdQuery, INymApiQuery {} export default class QueryClient extends CosmWasmClient implements IQueryClient { private nyxdQuerier: NyxdQuerier; @@ -115,41 +90,73 @@ export default class QueryClient extends CosmWasmClient implements IQueryClient return this.nyxdQuerier.getContractVersion(mixnetContractAddress); } - getMixNodesPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise { - return this.nyxdQuerier.getMixNodesPaged(mixnetContractAddress, limit, startAfter); + getMixNodeBonds( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.nyxdQuerier.getMixNodeBonds(mixnetContractAddress, limit, startAfter); + } + + getMixNodesDetailed( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.nyxdQuerier.getMixNodesDetailed(mixnetContractAddress, limit, startAfter); + } + + getStakeSaturation(mixnetContractAddress: string, mixId: number): Promise { + return this.nyxdQuerier.getStakeSaturation(mixnetContractAddress, mixId); + } + + getMixnodeRewardingDetails(mixnetContractAddress: string, mixId: number): Promise { + return this.nyxdQuerier.getMixnodeRewardingDetails(mixnetContractAddress, mixId); } getGatewaysPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise { return this.nyxdQuerier.getGatewaysPaged(mixnetContractAddress, limit, startAfter); } - ownsMixNode(mixnetContractAddress: string, address: string): Promise { - return this.nyxdQuerier.ownsMixNode(mixnetContractAddress, address); + getOwnedMixnode(mixnetContractAddress: string, address: string): Promise { + return this.nyxdQuerier.getOwnedMixnode(mixnetContractAddress, address); } ownsGateway(mixnetContractAddress: string, address: string): Promise { return this.nyxdQuerier.ownsGateway(mixnetContractAddress, address); } - getStateParams(mixnetContractAddress: string): Promise { + getUnbondedMixNodes( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.nyxdQuerier.getUnbondedMixNodes(mixnetContractAddress, limit, startAfter); + } + + getUnbondedMixNodeInformation(mixnetContractAddress: string, mixId: number): Promise { + return this.nyxdQuerier.getUnbondedMixNodeInformation(mixnetContractAddress, mixId); + } + + getStateParams(mixnetContractAddress: string): Promise { return this.nyxdQuerier.getStateParams(mixnetContractAddress); } - getAllNetworkDelegationsPaged( + getAllDelegationsPaged( mixnetContractAddress: string, limit?: number, startAfter?: [string, string], ): Promise { - return this.nyxdQuerier.getAllNetworkDelegationsPaged(mixnetContractAddress, limit, startAfter); + return this.nyxdQuerier.getAllDelegationsPaged(mixnetContractAddress, limit, startAfter); } getMixNodeDelegationsPaged( mixnetContractAddress: string, - mixIdentity: string, + mix_id: number, limit?: number, startAfter?: string, ): Promise { - return this.nyxdQuerier.getMixNodeDelegationsPaged(mixnetContractAddress, mixIdentity, limit, startAfter); + return this.nyxdQuerier.getMixNodeDelegationsPaged(mixnetContractAddress, mix_id, limit, startAfter); } getDelegatorDelegationsPaged( @@ -161,36 +168,16 @@ export default class QueryClient extends CosmWasmClient implements IQueryClient return this.nyxdQuerier.getDelegatorDelegationsPaged(mixnetContractAddress, delegator, limit, startAfter); } - getDelegationDetails(mixnetContractAddress: string, mixIdentity: string, delegator: string): Promise { - return this.nyxdQuerier.getDelegationDetails(mixnetContractAddress, mixIdentity, delegator); + getDelegationDetails(mixnetContractAddress: string, mix_id: number, delegator: string): Promise { + return this.nyxdQuerier.getDelegationDetails(mixnetContractAddress, mix_id, delegator); } getLayerDistribution(mixnetContractAddress: string): Promise { return this.nyxdQuerier.getLayerDistribution(mixnetContractAddress); } - getRewardPool(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getRewardPool(mixnetContractAddress); - } - - getCirculatingSupply(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getCirculatingSupply(mixnetContractAddress); - } - - getIntervalRewardPercent(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getIntervalRewardPercent(mixnetContractAddress); - } - - getSybilResistancePercent(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getSybilResistancePercent(mixnetContractAddress); - } - - getRewardingStatus( - mixnetContractAddress: string, - mixIdentity: string, - rewardingIntervalNonce: number, - ): Promise { - return this.nyxdQuerier.getRewardingStatus(mixnetContractAddress, mixIdentity, rewardingIntervalNonce); + getRewardParams(mixnetContractAddress: string): Promise { + return this.nyxdQuerier.getRewardParams(mixnetContractAddress); } getCachedGateways(): Promise { @@ -201,11 +188,15 @@ export default class QueryClient extends CosmWasmClient implements IQueryClient return this.nymApiQuerier.getCachedMixnodes(); } - getActiveMixnodes(): Promise { + getActiveMixnodes(): Promise { return this.nymApiQuerier.getActiveMixnodes(); } getRewardedMixnodes(): Promise { return this.nymApiQuerier.getRewardedMixnodes(); } + + getSpendableCoins(vestingContractAddress: string, vestingAccountAddress: string): Promise { + return this.nyxdQuerier.getSpendableCoins(vestingContractAddress, vestingAccountAddress); + } } diff --git a/clients/validator/src/signing-client.ts b/clients/validator/src/signing-client.ts index 8cb589cd0e..d750eefcd2 100644 --- a/clients/validator/src/signing-client.ts +++ b/clients/validator/src/signing-client.ts @@ -25,15 +25,22 @@ import { MixnetContractVersion, MixNode, MixNodeBond, + MixNodeCostParams, + MixNodeDetails, + MixNodeRewarding, MixOwnershipResponse, PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse, PagedGatewayResponse, PagedMixDelegationsResponse, - PagedMixnodeResponse, - RewardingStatus, -} from './types'; + PagedMixNodeBondResponse, + PagedMixNodeDetailsResponse, + PagedUnbondedMixnodesResponse, + RewardingParams, + UnbondedMixnodeResponse, +} from '@nymproject/types'; import NymApiQuerier from './nym-api-querier'; +import { ContractState } from './types/shared'; // methods exposed by `SigningCosmWasmClient` export interface ICosmWasmSigning { @@ -143,6 +150,7 @@ export interface ISigningClient extends IQueryClient, ICosmWasmSigning, INymSign bondMixNode( mixnetContractAddress: string, mixNode: MixNode, + costParams: MixNodeCostParams, ownerSignature: string, pledge: Coin, fee?: StdFee | 'auto' | number, @@ -164,7 +172,7 @@ export interface ISigningClient extends IQueryClient, ICosmWasmSigning, INymSign delegateToMixNode( mixnetContractAddress: string, - mixIdentity: string, + mixId: number, amount: Coin, fee?: StdFee | 'auto' | number, memo?: string, @@ -172,14 +180,14 @@ export interface ISigningClient extends IQueryClient, ICosmWasmSigning, INymSign undelegateFromMixNode( mixnetContractAddress: string, - mixIdentity: string, + mixId: number, fee?: StdFee | 'auto' | number, memo?: string, ): Promise; updateMixnodeConfig( mixnetContractAddress: string, - mixIdentity: string, + mixId: number, profitMarginPercent: number, fee: StdFee | 'auto' | number, ): Promise; @@ -235,44 +243,76 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig // query related: getContractVersion(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getContractVersion(mixnetContractAddress); + return this.getContractVersion(mixnetContractAddress); } - getMixNodesPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise { - return this.nyxdQuerier.getMixNodesPaged(mixnetContractAddress, limit, startAfter); + getMixNodeBonds( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.nyxdQuerier.getMixNodeBonds(mixnetContractAddress, limit, startAfter); + } + + getMixNodesDetailed( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.nyxdQuerier.getMixNodesDetailed(mixnetContractAddress, limit, startAfter); + } + + getStakeSaturation(mixnetContractAddress: string, mixId: number) { + return this.nyxdQuerier.getStakeSaturation(mixnetContractAddress, mixId); + } + + getUnbondedMixNodeInformation(mixnetContractAddress: string, mixId: number): Promise { + return this.nyxdQuerier.getUnbondedMixNodeInformation(mixnetContractAddress, mixId); + } + + getMixnodeRewardingDetails(mixnetContractAddress: string, mixId: number): Promise { + return this.nyxdQuerier.getMixnodeRewardingDetails(mixnetContractAddress, mixId); } getGatewaysPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise { return this.nyxdQuerier.getGatewaysPaged(mixnetContractAddress, limit, startAfter); } - ownsMixNode(mixnetContractAddress: string, address: string): Promise { - return this.nyxdQuerier.ownsMixNode(mixnetContractAddress, address); + getOwnedMixnode(mixnetContractAddress: string, address: string): Promise { + return this.nyxdQuerier.getOwnedMixnode(mixnetContractAddress, address); } ownsGateway(mixnetContractAddress: string, address: string): Promise { return this.nyxdQuerier.ownsGateway(mixnetContractAddress, address); } - getStateParams(mixnetContractAddress: string): Promise { + getStateParams(mixnetContractAddress: string): Promise { return this.nyxdQuerier.getStateParams(mixnetContractAddress); } - getAllNetworkDelegationsPaged( + getAllDelegationsPaged( mixnetContractAddress: string, limit?: number, startAfter?: [string, string], ): Promise { - return this.nyxdQuerier.getAllNetworkDelegationsPaged(mixnetContractAddress, limit, startAfter); + return this.getAllDelegationsPaged(mixnetContractAddress, limit, startAfter); + } + + getUnbondedMixNodes( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise { + return this.nyxdQuerier.getUnbondedMixNodes(mixnetContractAddress, limit, startAfter); } getMixNodeDelegationsPaged( mixnetContractAddress: string, - mixIdentity: string, + mix_id: number, limit?: number, startAfter?: string, ): Promise { - return this.nyxdQuerier.getMixNodeDelegationsPaged(mixnetContractAddress, mixIdentity, limit, startAfter); + return this.nyxdQuerier.getMixNodeDelegationsPaged(mixnetContractAddress, mix_id, limit, startAfter); } getDelegatorDelegationsPaged( @@ -284,36 +324,16 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig return this.nyxdQuerier.getDelegatorDelegationsPaged(mixnetContractAddress, delegator, limit, startAfter); } - getDelegationDetails(mixnetContractAddress: string, mixIdentity: string, delegator: string): Promise { - return this.nyxdQuerier.getDelegationDetails(mixnetContractAddress, mixIdentity, delegator); + getDelegationDetails(mixnetContractAddress: string, mix_id: number, delegator: string): Promise { + return this.nyxdQuerier.getDelegationDetails(mixnetContractAddress, mix_id, delegator); } getLayerDistribution(mixnetContractAddress: string): Promise { return this.nyxdQuerier.getLayerDistribution(mixnetContractAddress); } - getRewardPool(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getRewardPool(mixnetContractAddress); - } - - getCirculatingSupply(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getCirculatingSupply(mixnetContractAddress); - } - - getIntervalRewardPercent(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getIntervalRewardPercent(mixnetContractAddress); - } - - getSybilResistancePercent(mixnetContractAddress: string): Promise { - return this.nyxdQuerier.getSybilResistancePercent(mixnetContractAddress); - } - - getRewardingStatus( - mixnetContractAddress: string, - mixIdentity: string, - rewardingIntervalNonce: number, - ): Promise { - return this.nyxdQuerier.getRewardingStatus(mixnetContractAddress, mixIdentity, rewardingIntervalNonce); + getRewardParams(mixnetContractAddress: string): Promise { + return this.nyxdQuerier.getRewardParams(mixnetContractAddress); } getCachedGateways(): Promise { @@ -324,7 +344,7 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig return this.nymApiQuerier.getCachedMixnodes(); } - getActiveMixnodes(): Promise { + getActiveMixnodes(): Promise { return this.nymApiQuerier.getActiveMixnodes(); } @@ -332,11 +352,16 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig return this.nymApiQuerier.getRewardedMixnodes(); } + getSpendableCoins(vestingContractAddress: string, vestingAccountAddress: string): Promise { + return this.nyxdQuerier.getSpendableCoins(vestingContractAddress, vestingAccountAddress); + } + // signing related: bondMixNode( mixnetContractAddress: string, mixNode: MixNode, + costParams: MixNodeCostParams, ownerSignature: string, pledge: Coin, fee: StdFee | 'auto' | number = 'auto', @@ -348,6 +373,7 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig { bond_mixnode: { mix_node: mixNode, + cost_params: costParams, owner_signature: ownerSignature, }, }, @@ -414,7 +440,7 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig delegateToMixNode( mixnetContractAddress: string, - mixIdentity: string, + mixId: number, amount: Coin, fee: StdFee | 'auto' | number = 'auto', memo = 'Default MixNode Delegation from Typescript', @@ -424,7 +450,7 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig mixnetContractAddress, { delegate_to_mixnode: { - mix_identity: mixIdentity, + mix_id: mixId, }, }, fee, @@ -435,7 +461,7 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig undelegateFromMixNode( mixnetContractAddress: string, - mixIdentity: string, + mixId: number, fee: StdFee | 'auto' | number = 'auto', memo = 'Default MixNode Undelegation from Typescript', ): Promise { @@ -444,7 +470,7 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig mixnetContractAddress, { undelegate_from_mixnode: { - mix_identity: mixIdentity, + mix_id: mixId, }, }, fee, @@ -454,14 +480,14 @@ export default class SigningClient extends SigningCosmWasmClient implements ISig updateMixnodeConfig( mixnetContractAddress: string, - mixIdentity: string, + mixId: number, profitMarginPercent: number, fee: StdFee | 'auto' | number, ): Promise { return this.execute( this.clientAddress, mixnetContractAddress, - { update_mixnode_config: { profit_margin_percent: profitMarginPercent, mix_identity: mixIdentity } }, + { update_mixnode_config: { profit_margin_percent: profitMarginPercent, mix_id: mixId } }, fee, ); } diff --git a/clients/validator/src/tests/expectedResponses.ts b/clients/validator/src/tests/expectedResponses.ts new file mode 100644 index 0000000000..876f61e866 --- /dev/null +++ b/clients/validator/src/tests/expectedResponses.ts @@ -0,0 +1,178 @@ +import expect from 'expect'; + +export const amountDemon = { + amount: expect.any(String), + denom: expect.any(String) +} + +export const delegation = { + owner: expect.any(String), + mix_id: expect.any(Number), + cumulative_reward_ratio: expect.any(String), + amount: amountDemon, + height: expect.any(Number || BigInt), + proxy: expect.any(String || null) +} + +export const detailedDelegation = { + delegation: delegation, + mixnode_still_bonded: expect.any(Boolean) +} + +export const gateway = { + pledge_amount: amountDemon, + owner: expect.any(String), + block_height: expect.any(Number || BigInt), + gateway: { + host: expect.any(String), + mix_port: expect.any(Number), + clients_port: expect.any(Number), + location: expect.any(String), + sphinx_key: expect.any(String), + identity_key: expect.any(String), + version: expect.any(String), + }, + proxy: expect.any(String || null) +} + +export const pagedGateway = { + nodes: gateway, + per_page: expect.any(Number), + start_next_after: expect.any(Number) +} + +export const ownGateway = { + address: expect.any(String), + gateway: gateway +} + +export const rewardingdetails = { + cost_params: { + profit_margin_percent: expect.any(String), + interval_operating_cost: { + denom: expect.any(String), + amount: expect.any(String) + } + }, + operator: expect.any(String), + delegates: expect.any(String), + total_unit_reward: expect.any(String), + unit_delegation: expect.any(String), + last_rewarded_epoch: expect.any(Number), + unique_delegations: expect.any(Number) +} + +export const mix_node = { + host: expect.any(String), + mix_port: expect.any(Number), + verloc_port: expect.any(Number), + http_api_port: expect.any(Number), + sphinx_key: expect.any(String), + identity_key: expect.any(String), + version: expect.any(String) +} + +export const mixnodebond = { + mix_id: expect.any(Number), + owner: expect.any(String), + original_pledge: { + denom: expect.any(String), + amount: expect.any(String) + }, + layer: expect.any(String), + mix_node: mix_node, + proxy: expect.any(String) || null, + bonding_height: expect.any(Number || BigInt), + is_unbonding: expect.any(Boolean) +} + +export const mixnode = { + bond_information: mixnodebond, + rewarding_details: rewardingdetails +} + +export const ownedNode = { + address: expect.any(String), + mixnode_details: { + bond_information: mixnodebond, + rewarding_details: rewardingdetails + } +} + +export const saturation = { + mix_id: expect.any(Number), + current_saturation: expect.any(String), + uncapped_saturation: expect.any(String) +} + +export const contractVersion = { + build_timestamp: expect.any(String), + build_version: expect.any(String), + commit_sha: expect.any(String), + commit_timestamp: expect.any(String), + commit_branch: expect.any(String), + rustc_version: expect.any(String) +}; + +export const stateParams = { + minimum_gateway_pledge: amountDemon, + minimum_mixnode_pledge: expect.any(String), + mixnode_rewarded_set_size: expect.any(Number), + mixnode_active_set_size: expect.any(Number) +} + +export const contract = { + owner: expect.any(Number), + rewarding_validator_address: expect.any(Number), + vesting_contract_address: expect.any(Number), + rewarding_denom: expect.any(String), + params: stateParams +} + +export const rewardingnode = { + mix_id: expect.any(Number), + rewarding_details: rewardingdetails +} + +export const unbondednode = { + mix_id: expect.any(Number), + unbonded_info: { + identity_key: expect.any(String), + owner: expect.any(String), + proxy: expect.any(String) || null, + unbonding_height: expect.any(Number) + } +} + +export const allunbondednodes = [ + expect.any(Number), { + identity_key: expect.any(String), + owner: expect.any(String), + proxy: expect.any(String) || null, + unbonding_height: expect.any(Number) + } +] + +export const layerDistribution = { + layer1: expect.any(Number), + layer2: expect.any(Number), + layer3: expect.any(Number) +} + + +export const intervalRewardParams = { + reward_pool: expect.any(Number), + staking_supply: expect.any(Number), + staking_supply_scale_factor: expect.any(Number), + epoch_reward_budget: expect.any(Number), + stake_saturation_point: expect.any(Number), + sybil_resistance: expect.any(Number), + active_set_work_factor: expect.any(Number), + interval_pool_emission: expect.any(Number) +} + +export const rewardingParams = { + interval: intervalRewardParams, + rewarded_set_size: expect.any(Number), + active_set_size: expect.any(Number) +} diff --git a/clients/validator/src/tests/mock/client.ts b/clients/validator/src/tests/mock/client.ts new file mode 100644 index 0000000000..c5633d2ed0 --- /dev/null +++ b/clients/validator/src/tests/mock/client.ts @@ -0,0 +1,19 @@ +import { Mock, Times } from 'moq.ts'; +import expect from 'expect'; +import { INyxdQuery } from '../../query-client'; + +export class TestHelper { + buildMethod = async (methodName: string, args: any[], expectedResult: any): Promise => { + const client = new Mock() + .setup((nym) => nym[methodName](...args)) + .returns(Promise.resolve(expectedResult)); + const obj = client.object(); + const actualDetails = await obj[methodName](...args); + + client.verify((nym) => nym[methodName](...args), Times.Exactly(1)); + expect(Object.keys([actualDetails])).toEqual(Object.keys(expectedResult)); + expect(actualDetails).toBeDefined(); + + return actualDetails; + }; +} diff --git a/clients/validator/src/tests/mock/delegation.mock.test.ts b/clients/validator/src/tests/mock/delegation.mock.test.ts new file mode 100644 index 0000000000..69fffcc53b --- /dev/null +++ b/clients/validator/src/tests/mock/delegation.mock.test.ts @@ -0,0 +1,40 @@ +import expect from 'expect'; +import { Delegation } from '@nymproject/types'; +import { PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse } from '../../types/shared-types'; +import { TestHelper } from './client'; +import { mixnet, mixnodeowneraddress, mix_id } from './testData'; + +describe('Delegation mock tests', () => { + const testHelper = new TestHelper(); + + it('get Delegation Details', () => { + const execute = testHelper.buildMethod('getDelegationDetails', [mixnet, mix_id, mixnodeowneraddress], { + owner: mixnodeowneraddress, + mix_id: 0, + cumulative_reward_ratio: '', + amount: { + denom: 'nym', + amount: '10', + }, + height: 1314134144132n, + proxy: 'null', + }); + expect(execute).toBeTruthy(); + }); + + it('get All Delegations Paged', () => { + const execute = testHelper.buildMethod('getAllDelegationsPaged', [mixnet], { + delegations: [], + }); + expect(execute).toBeTruthy(); + }); + + it('get Delegator Delegations Paged', () => { + const execute = testHelper.buildMethod('getDelegatorDelegationsPaged', [mixnet, mixnodeowneraddress], < + PagedDelegatorDelegationsResponse + >{ + delegations: [], + }); + expect(execute).toBeTruthy(); + }); +}); diff --git a/clients/validator/src/tests/mock/gateway.mock.test.ts b/clients/validator/src/tests/mock/gateway.mock.test.ts new file mode 100644 index 0000000000..5c7f277a41 --- /dev/null +++ b/clients/validator/src/tests/mock/gateway.mock.test.ts @@ -0,0 +1,24 @@ +import expect from 'expect'; +import { GatewayOwnershipResponse, PagedGatewayResponse } from '../../types/shared-types'; +import { TestHelper } from './client'; +import { gatewayowneraddress, mixnet } from './testData'; + +describe('Gateway mock tests', () => { + const testHelper = new TestHelper(); + + it('get Gateways Paged', () => { + const execute = testHelper.buildMethod('getGatewaysPaged', [mixnet], { + nodes: [], + per_page: 25, + }); + expect(execute).toBeTruthy(); + }); + + it('owns Gateway', () => { + const execute = testHelper.buildMethod('ownsGateway', [mixnet, gatewayowneraddress], { + address: gatewayowneraddress, + gateway: {}, + }); + expect(execute).toBeTruthy(); + }); +}); diff --git a/clients/validator/src/tests/mock/mixnet.mock.test.ts b/clients/validator/src/tests/mock/mixnet.mock.test.ts new file mode 100644 index 0000000000..8d84d4eecc --- /dev/null +++ b/clients/validator/src/tests/mock/mixnet.mock.test.ts @@ -0,0 +1,65 @@ +import expect from 'expect'; +import { LayerDistribution, MixnetContractVersion, StakeSaturationResponse } from '@nymproject/types'; +import { TestHelper } from './client'; +import { mixnet, mix_id } from './testData'; +import { RewardingParams } from '@nymproject/types'; +import { ContractState } from '../../types/shared'; + +describe('Mixnet mock tests', () => { + const testHelper = new TestHelper(); + + it('get Layer Distribution', () => { + const execute = testHelper.buildMethod('getLayerDistribution', [mixnet], { + layer1: 2, + layer2: 2, + layer3: 5, + }); + expect(execute).toBeTruthy(); + }); + + it('get Reward Params', () => { + const execute = testHelper.buildMethod('getRewardParams', [mixnet], { + interval: {}, + rewarded_set_size: 0, + active_set_size: 0, + }); + expect(execute).toBeTruthy(); + }); + + it('get Stake Saturation', () => { + const execute = testHelper.buildMethod('getStakeSaturation', [mixnet, mix_id], { + mix_id: 0, + current_saturation: '', + uncapped_saturation: '', + }); + expect(execute).toBeTruthy(); + }); + + it('get State Params', () => { + const execute = testHelper.buildMethod('getStateParams', [mixnet], { + owner: '', + rewarding_validator_address: '', + vesting_contract_address: '', + rewarding_denom: 'unym', + params: { + minimum_mixnode_pledge: '', + minimum_gateway_pledge: '', + mixnode_rewarded_set_size: 240, + mixnode_active_set_size: 240, + }, + }); + expect(execute).toBeTruthy(); + }); + + it('get Contract Version', () => { + const execute = testHelper.buildMethod('getContractVersion', [mixnet], { + build_timestamp: 'test', + commit_branch: 'test', + build_version: 'test', + rustc_version: 'test', + commit_sha: 'test', + commit_timestamp: 'test', + }); + expect(execute).toBeTruthy(); + }); +}); diff --git a/clients/validator/src/tests/mock/mixnode.mock.test.ts b/clients/validator/src/tests/mock/mixnode.mock.test.ts new file mode 100644 index 0000000000..c4d9e4519b --- /dev/null +++ b/clients/validator/src/tests/mock/mixnode.mock.test.ts @@ -0,0 +1,71 @@ +import expect from 'expect'; +import { + MixNodeRewarding, + MixOwnershipResponse, + PagedMixDelegationsResponse, + PagedMixNodeBondResponse, + PagedMixNodeDetailsResponse, + UnbondedMixnodeResponse, +} from '@nymproject/types'; +import { TestHelper } from './client'; +import { mixnet, mixnodeowneraddress, mix_id } from './testData'; + +describe('Mixnode mock tests', () => { + const testHelper = new TestHelper(); + + it('get Mixnode Bonds', () => { + const execute = testHelper.buildMethod('getMixNodeBonds', [mixnet], { + nodes: [], + per_page: 25, + }); + expect(execute).toBeTruthy(); + }); + + it('get Mixnode Delegations Paged', () => { + const execute = testHelper.buildMethod('getMixNodeDelegationsPaged', [mixnet, mix_id], < + PagedMixDelegationsResponse + >{ + delegations: [], + per_page: 25, + }); + expect(execute).toBeTruthy(); + }); + + it('get Mixnodes Detailed', () => { + const execute = testHelper.buildMethod('getMixNodesDetailed', [mixnet], { + nodes: [], + per_page: 25, + }); + expect(execute).toBeTruthy(); + }); + + it('get Mixnode Rewarding Details', () => { + const execute = testHelper.buildMethod('getMixnodeRewardingDetails', [mixnet, mix_id], { + cost_params: {}, + operator: '', + delegates: '', + total_unit_reward: '', + unit_delegation: '', + last_rewarded_epoch: 1, + unique_delegations: 1, + }); + expect(execute).toBeTruthy(); + }); + + it('get Owned Mixnode', () => { + const execute = testHelper.buildMethod('getOwnedMixnode', [mixnet, mixnodeowneraddress], { + address: '', + mixnode: {}, + }); + expect(execute).toBeTruthy(); + }); + + it('get Unbonded Mixnode Information', () => { + const execute = testHelper.buildMethod( + 'getUnbondedMixNodeInformation', + [mixnet, mix_id], + {}, + ); + expect(execute).toBeTruthy(); + }); +}); diff --git a/clients/validator/src/tests/mock/testData.ts b/clients/validator/src/tests/mock/testData.ts new file mode 100644 index 0000000000..28df1557f7 --- /dev/null +++ b/clients/validator/src/tests/mock/testData.ts @@ -0,0 +1,8 @@ +export const mixnet = 'n14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sjyvg3g'; +export const gatewayowneraddress = 'n16evnn8glr0sham3matj8rg2s24m6x56ayk87ts'; +// export const mixId = 436207616; +export const mix_id = 26; +export const nodeIdentityKey = 'ATmVJknZarDF6Yj53M7h8NS9LLCUvWuToXpk3pDvYUH1'; +export const mixnodeowneraddress = 'n1fzv4jc7fanl9s0qj02ge2ezk3kts545kjtek47'; +export const delegatorAddress = 'n1lemst75va9700tsrxq58adzujrh6h9s5x60h9h'; +export const rewardingIntervalNonce = 1; diff --git a/clients/validator/src/tests/query/mixnetQueries.test.ts b/clients/validator/src/tests/query/mixnetQueries.test.ts new file mode 100644 index 0000000000..391f8aaf0d --- /dev/null +++ b/clients/validator/src/tests/query/mixnetQueries.test.ts @@ -0,0 +1,180 @@ +import expect from 'expect'; +import ValidatorClient from '../../index'; + +import { + allunbondednodes, + contract, + delegation, + gateway, + layerDistribution, + mixnode, + mixnodebond, + ownedNode, + ownGateway, + rewardingnode, + saturation, + unbondednode, +} from '../expectedResponses'; +import { delegatorAddress, gatewayowneraddress } from '../mock/testData'; + +const dotenv = require('dotenv'); + +dotenv.config(); + +describe('Mixnet queries', () => { + let client: ValidatorClient; + + beforeEach(async () => { + client = await ValidatorClient.connectForQuery( + process.env.rpcAddress || '', + process.env.validatorAddress || '', + process.env.prefix || '', + process.env.mixnetContractAddress || '', + process.env.vestingContractAddress || '', + process.env.denom || '', + ); + }); + + // + // CONTRACT + // + + it('can query for an account balance', async () => { + const balance = await client.getBalance('n1ptg680vnmef2cd8l0s9uyc4f0hgf3x8sed6w77'); + expect(Number.parseFloat(balance.amount)).toBeGreaterThan(0); + }); + + it('can query for stake saturation', async () => { + const stakeSaturation = await client.getStakeSaturation(7); + expect(Object.keys(stakeSaturation)).toEqual(Object.keys(saturation)); + expect(stakeSaturation).toBeTruthy(); + expect(stakeSaturation?.current_saturation).toBeTruthy(); + }); + + it('can query for contract version', async () => { + const contractV = await client.getMixnetContractVersion(); + expect(contractV).toBeTruthy(); + }); + + it('can query for mixnet contract settings', async () => { + const settings = await client.getMixnetContractSettings(); + expect(Object.keys(settings)).toEqual(Object.keys(contract)); + expect(settings).toBeTruthy(); + }); + + it('can query for reward pool', async () => { + const rewardPool = await client.getRewardParams(); + // TODO add velidation here + expect(rewardPool).toBeTruthy(); + }); + + it('can query for layer distribution', async () => { + const layer = await client.getLayerDistribution(); + expect(Object.keys(layer)).toEqual(Object.keys(layerDistribution)); + expect(layer).toBeTruthy(); + }); + + // + // MIXNODES + // + + it('can query for unbonded mixnodes', async () => { + const unbondedNodes = await client.getUnbondedMixNodes(); + for (let i = 0; i < unbondedNodes.length; i++) { + expect(Object.keys(unbondedNodes[0])).toEqual(Object.keys(allunbondednodes)); + expect(unbondedNodes).toBeTruthy(); + } + }); + + it('can query for unbonded mixnode information', async () => { + const unbondedMixnodeInfo = await client.getUnbondedMixNodeInformation(1); + expect(Object.keys(unbondedMixnodeInfo)).toEqual(Object.keys(unbondednode)); + expect(unbondedMixnodeInfo).toBeTruthy(); + }); + + it('can query for mixnode rewarding details', async () => { + const rewardingDetails = await client.getMixnodeRewardingDetails(1); + expect(Object.keys(rewardingDetails)).toEqual(Object.keys(rewardingnode)); + expect(rewardingDetails).toBeTruthy(); + }); + + it('can query for owned mixnode', async () => { + const ownedMixnode = await client.getOwnedMixnode('n1ptg680vnmef2cd8l0s9uyc4f0hgf3x8sed6w77'); + expect(Object.keys(ownedMixnode)).toEqual(Object.keys(ownedNode)); + expect(ownedMixnode).toBeTruthy(); + }); + + it('can query for all mixnode bonds', async () => { + const mixnodeBonds = await client.getMixNodeBonds(); + expect(Object.keys(mixnodeBonds[0])).toEqual(Object.keys(mixnodebond)); + expect(mixnodeBonds).toBeTruthy(); + expect(Array.isArray(mixnodeBonds)).toBeTruthy(); + }); + + it('can query for all mixnode details', async () => { + const mixnodeDetails = await client.getMixNodesDetailed(); + expect(Object.keys(mixnodeDetails[0])).toEqual(Object.keys(mixnode)); + expect(mixnodeDetails).toBeTruthy(); + expect(Array.isArray(mixnodeDetails)).toBeTruthy(); + }); + + it('can query for all active mixnodes', async () => { + const activeNodes = await client.getActiveMixnodes(); + expect(Object.keys(activeNodes[0])).toEqual(Object.keys(mixnode)); + expect(activeNodes).toBeTruthy(); + expect(Array.isArray(activeNodes)).toBeTruthy(); + }); + + it('can query for rewarded mixnodes', async () => { + const rewardNodes = await client.getRewardedMixnodes(); + expect(Object.keys(rewardNodes[0])).toEqual(Object.keys(mixnode)); + expect(rewardNodes).toBeTruthy(); + }); + + // + // DELEGATIONS + // + + it('can query for account delegations', async () => { + const delegations = await client.getAllNyxdDelegatorDelegations('n1fzv4jc7fanl9s0qj02ge2ezk3kts545kjtek47'); + expect(Object.keys(delegations[0])).toEqual(Object.keys(delegation)); + expect(delegations).toBeTruthy(); + expect(Array.isArray(delegations)).toBeTruthy(); + }); + + it('can query for all delegations', async () => { + const allDelegations = await client.getAllNyxdDelegations(); + expect(Object.keys(allDelegations[0])).toEqual(Object.keys(delegation)); + expect(allDelegations).toBeTruthy(); + expect(Array.isArray(allDelegations)).toBeTruthy(); + }); + + it('can query for all delegations on a node', async () => { + const mixnodeDelegations = await client.getAllNyxdSingleMixnodeDelegations(1); + expect(Object.keys(mixnodeDelegations[0])).toEqual(Object.keys(delegation)); + expect(mixnodeDelegations).toBeTruthy(); + }); + + it('can query for detailed delegations', async () => { + const detailedDelegation = await client.getDelegationDetails(7, delegatorAddress); + expect(Object.keys(detailedDelegation)).toEqual(Object.keys(detailedDelegation)); + expect(detailedDelegation).toBeTruthy(); + }); + + // + // GATEWAYS + // + + it('can query for all gateways', async () => { + const gateways = await client.getAllNyxdGateways(); + expect(Object.keys(gateways[0])).toEqual(Object.keys(gateway)); + expect(gateways).toBeTruthy(); + expect(Array.isArray(gateways)).toBeTruthy(); + }).timeout(10000); + + it('can query for owned gateway', async () => { + const gateway = await client.ownsGateway(gatewayowneraddress); + expect(Object.keys(gateway)).toEqual(Object.keys(ownGateway)); + expect(gateway).toBeTruthy(); + }).timeout(10000); +}); diff --git a/clients/validator/src/tests/query/vestingQueries.test.ts b/clients/validator/src/tests/query/vestingQueries.test.ts new file mode 100644 index 0000000000..2cbe4f5088 --- /dev/null +++ b/clients/validator/src/tests/query/vestingQueries.test.ts @@ -0,0 +1,28 @@ +import expect from 'expect'; +import ValidatorClient from '../../index'; + +const dotenv = require('dotenv'); + +dotenv.config(); + +describe('Vesting queries', () => { + let client: ValidatorClient; + + beforeEach(async () => { + client = await ValidatorClient.connectForQuery( + process.env.rpcAddress || '', + process.env.validatorAddress || '', + process.env.prefix || '', + process.env.mixnetContractAddress || '', + process.env.vestingContractAddress || '', + process.env.denom || '', + ); + }); + + it('can query for contract version', async () => { + const contract = await client.getVestingContractVersion(); + expect(contract).toBeTruthy(); + }); + + it('can get the balance on the account', () => {}); +}); diff --git a/clients/validator/src/tests/sign/mixnetActions.test.ts b/clients/validator/src/tests/sign/mixnetActions.test.ts new file mode 100644 index 0000000000..1b535f6f2d --- /dev/null +++ b/clients/validator/src/tests/sign/mixnetActions.test.ts @@ -0,0 +1,107 @@ +import expect from 'expect'; +import ValidatorClient from '../../'; + +const dotenv = require('dotenv'); + +dotenv.config(); + +// TODO: implement for QA with .env for mnemonics +describe('Mixnet actions', () => { + let client: ValidatorClient; + + beforeEach(async () => { + client = await ValidatorClient.connect( + process.env.mnemonic || '', + process.env.rpcAddress || '', + process.env.validatorAddress || '', + process.env.prefix || '', + process.env.mixnetContractAddress || '', + process.env.vestingContractAddress || '', + process.env.denom || '', + ); + }); + + it('can send tokens', async () => { + const res = await client.send(client.address, [{ amount: '10000000', denom: 'unym' }]); + expect(res.transactionHash).toBeDefined(); + }).timeout(10000); + + it.skip('can delegate tokens', async () => { + const [_, secondMixnode] = await client.getActiveMixnodes(); + + if (secondMixnode) { + const res = await client.delegateToMixNode( + secondMixnode.bond_information.mix_id, + { + amount: '15000000', + denom: 'unym', + }, + { gas: '1000000', amount: [{ amount: '100000', denom: 'unym' }] }, + ); + expect(res.transactionHash).toBeDefined(); + } + }).timeout(10000); + + // Need to provide a mix id that can be undelegated from + it.skip('can undelegate from a mixnode', async () => { + const mixId = 8; + const res = await client.undelegateFromMixNode(mixId); + expect(res.transactionHash).toBeDefined(); + }); + + it.skip('Can unbond a mixnode', async () => { + const res = await client.unbondMixNode(); + expect(res.transactionHash).toBeDefined(); + }).timeout(10000); + + it.skip('Can bond a mixnode', async () => { + const res = await client.bondMixNode( + { + identity_key: '3P6pAcF2p3pYMqWdpHqhbavu3ifyaBs5Qw5UmmCGwimx', + sphinx_key: 'GQMQKwUThaggatA6oZteSWTsCQoUfmLtamJ7o9YkP9aE', + host: '109.74.195.67', + mix_port: 1789, + verloc_port: 1790, + http_api_port: 8000, + version: '1.1.4', + }, + '3rXWCQBUj5JQB3UBUkZcXhCk9Zh3cjduMF8aFHPTG7KTkkhZzDJTNmE2p2Ph1g6iQW5vRGTpQzjXF33WDwvhzHk6', + { profit_margin_percent: '0.1', interval_operating_cost: { amount: '40', denom: 'nym' } }, + { amount: '100_000_000', denom: 'unym' }, + { gas: '1000000', amount: [{ amount: '100000', denom: 'unym' }] }, + ); + expect(res.transactionHash).toBeDefined(); + }).timeout(10000); + + it.skip('can unbond a gateway', async () => { + const res = await client.unbondGateway(); + expect(res.transactionHash).toBeDefined(); + }); + + it.skip('can bond a gateway', async () => { + const res = await client.bondGateway( + { + identity_key: '36vfvEyBzo5cWEFbnP7fqgY39kFw9PQhvwzbispeNaxL', + sphinx_key: 'G65Fwc2JNAotuHQFqmDKhQNQL5rn3r9pupUdmxMygNUZ', + host: '151.236.220.82', + version: '1.1.4', + mix_port: 1789, + clients_port: 9000, + location: 'Cuba', + }, + '3ipSJksWHehZm1YfuH5Ahtg7b22NnrP9hEs6iEDXfUS5uiUhpWmCjGR3b3NDHuxeGjpZYJNYJ52D8WCPK5ZR7Szj', + { amount: '100_000_000', denom: 'unym' }, + ); + expect(res.transactionHash).toBeDefined(); + }); + + it.skip('can update contract state params', async () => { + const res = await client.updateContractStateParams({ + minimum_mixnode_pledge: '', + minimum_gateway_pledge: '', + mixnode_rewarded_set_size: 2, + mixnode_active_set_size: 2, + }); + expect(res.transactionHash).toBeDefined(); + }); +}); diff --git a/clients/validator/src/tsconfig.json b/clients/validator/src/tsconfig.json deleted file mode 100644 index 7990d8ef90..0000000000 --- a/clients/validator/src/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "module": "commonjs", - "esModuleInterop": true, - "strict": true, - "declaration": true, - "outDir": "./dist" - }, - "exclude": [ - "tests", - "dist", - "node_modules" - ] -} \ No newline at end of file diff --git a/clients/validator/src/types.ts b/clients/validator/src/types.ts deleted file mode 100644 index 575702ec45..0000000000 --- a/clients/validator/src/types.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { Coin } from '@cosmjs/stargate'; - -// TODO: ideally we'd have re-exported those using that fancy crate that builds ts types from rust - -export type MixnetContractVersion = { - build_timestamp: string; - build_version: string; - commit_sha: string; - commit_timestamp: string; - commit_branch: string; - rustc_version: string; -}; - -export type PagedMixnodeResponse = { - nodes: MixNodeBond[]; - per_page: number; - start_next_after?: string; -}; - -export type PagedGatewayResponse = { - nodes: GatewayBond[]; - per_page: number; - start_next_after?: string; -}; - -export type MixOwnershipResponse = { - address: string; - mixnode?: MixNodeBond; -}; - -export type GatewayOwnershipResponse = { - address: string; - gateway?: GatewayBond; -}; - -export type ContractStateParams = { - // ideally I'd want to define those as `number` rather than `string`, but - // rust-side they are defined as Uint128 and that don't have - // native javascript representations and therefore are interpreted as strings after deserialization - minimum_mixnode_pledge: string; - minimum_gateway_pledge: string; - mixnode_rewarded_set_size: number; - mixnode_active_set_size: number; -}; - -export type LayerDistribution = { - gateways: number; - layer1: number; - layer2: number; - layer3: number; -}; - -export type Delegation = { - owner: string; - node_identity: string; - amount: Coin; - block_height: number; - proxy?: string; -}; - -export type PagedMixDelegationsResponse = { - delegations: Delegation[]; - start_next_after?: string; -}; - -export type PagedDelegatorDelegationsResponse = { - delegations: Delegation[]; - start_next_after?: string; -}; - -export type PagedAllDelegationsResponse = { - delegations: Delegation[]; - start_next_after?: [string, string]; -}; - -export type RewardingResult = { - operator_reward: string; - total_delegator_reward: string; -}; - -export type NodeRewardParams = { - period_reward_pool: string; - k: string; - reward_blockstamp: number; - circulating_supply: string; - uptime: string; - sybil_resistance_percent: number; -}; - -export type DelegatorRewardParams = { - node_reward_params: NodeRewardParams; - sigma: number; - profit_margin: number; - node_profit: number; -}; - -export type PendingDelegatorRewarding = { - running_results: RewardingResult; - next_start: string; - rewarding_params: DelegatorRewardParams; -}; - -export type RewardingStatus = { Complete: RewardingResult } | { PendingNextDelegatorPage: PendingDelegatorRewarding }; - -export type MixnodeRewardingStatusResponse = { - status?: RewardingStatus; -}; - -export enum Layer { - Gateway, - One, - Two, - Three, -} - -export type MixNodeBond = { - owner: string; - mix_node: MixNode; - layer: Layer; - bond_amount: Coin; - total_delegation: Coin; -}; - -export type MixNode = { - host: string; - mix_port: number; - verloc_port: number; - http_api_port: number; - sphinx_key: string; - identity_key: string; - version: string; - profit_margin_percent: number; -}; - -export type GatewayBond = { - owner: string; - gateway: Gateway; - - bond_amount: Coin; - total_delegation: Coin; -}; - -export type Gateway = { - host: string; - mix_port: number; - clients_port: number; - location: string; - sphinx_key: string; - identity_key: string; - version: string; -}; - -export type SendRequest = { - senderAddress: string; - recipientAddress: string; - transferAmount: readonly Coin[]; -}; diff --git a/clients/validator/src/types/global.d.ts b/clients/validator/src/types/global.d.ts new file mode 100644 index 0000000000..a6eb7c3521 --- /dev/null +++ b/clients/validator/src/types/global.d.ts @@ -0,0 +1,11 @@ +declare namespace NodeJS { + interface ProcessEnv { + rpcAddress: string; + validatorAddress: string; + prefix: string; + mixnetContractAddress: string; + vestingContractAddress: string; + denom: string; + mnemonic: string; + } +} diff --git a/clients/validator/src/types/shared.ts b/clients/validator/src/types/shared.ts new file mode 100644 index 0000000000..d8db5ad0e5 --- /dev/null +++ b/clients/validator/src/types/shared.ts @@ -0,0 +1,259 @@ +import { JsonObject } from '@cosmjs/cosmwasm-stargate'; +import { Code, CodeDetails, Contract, ContractCodeHistoryEntry } from '@cosmjs/cosmwasm-stargate/build/cosmwasmclient'; +import { + Account, + Block, + Coin, + DeliverTxResponse, + IndexedTx, + SearchTxFilter, + SearchTxQuery, + SequenceResponse, +} from '@cosmjs/stargate'; +import { + MixNodeRewarding, + PagedMixNodeBondResponse, + PagedMixNodeDetailsResponse, + StakeSaturationResponse, + UnbondedMixnodeResponse, +} from '@nymproject/types'; + +export type MixnetContractVersion = { + build_timestamp: string; + build_version: string; + commit_sha: string; + commit_timestamp: string; + commit_branch: string; + rustc_version: string; +}; + +export type PagedMixnodeResponse = { + nodes: MixNodeBond[]; + per_page: number; + start_next_after?: string; +}; + +export type PagedGatewayResponse = { + nodes: GatewayBond[]; + per_page: number; + start_next_after?: string; +}; + +export type MixOwnershipResponse = { + address: string; + mixnode?: MixNodeBond; +}; + +export type GatewayOwnershipResponse = { + address: string; + gateway?: GatewayBond; +}; + +export type ContractStateParams = { + // ideally I'd want to define those as `number` rather than `string`, but + // rust-side they are defined as Uint128 and that don't have + // native javascript representations and therefore are interpreted as strings after deserialization + minimum_mixnode_pledge: string; + minimum_gateway_pledge: string; + mixnode_rewarded_set_size: number; + mixnode_active_set_size: number; +}; + +export type LayerDistribution = { + gateways: number; + layer1: number; + layer2: number; + layer3: number; +}; + +export type Delegation = { + owner: string; + node_identity: string; + amount: Coin; + block_height: number; + proxy?: string; +}; + +export type PagedMixDelegationsResponse = { + delegations: Delegation[]; + start_next_after?: string; +}; + +export type PagedDelegatorDelegationsResponse = { + delegations: Delegation[]; + start_next_after?: string; +}; + +export type PagedAllDelegationsResponse = { + delegations: Delegation[]; + start_next_after?: [string, string]; +}; + +export type RewardingResult = { + operator_reward: string; + total_delegator_reward: string; +}; + +export type NodeRewardParams = { + period_reward_pool: string; + k: string; + reward_blockstamp: number; + circulating_supply: string; + uptime: string; + sybil_resistance_percent: number; +}; + +export type DelegatorRewardParams = { + node_reward_params: NodeRewardParams; + sigma: number; + profit_margin: number; + node_profit: number; +}; + +export type PendingDelegatorRewarding = { + running_results: RewardingResult; + next_start: string; + rewarding_params: DelegatorRewardParams; +}; + +export type RewardingStatus = { Complete: RewardingResult } | { PendingNextDelegatorPage: PendingDelegatorRewarding }; + +export type MixnodeRewardingStatusResponse = { + status?: RewardingStatus; +}; + +export enum Layer { + Gateway, + One, + Two, + Three, +} + +export type MixNodeBond = { + owner: string; + mix_node: MixNode; + layer: Layer; + bond_amount: Coin; + total_delegation: Coin; +}; + +export type MixNode = { + host: string; + mix_port: number; + verloc_port: number; + http_api_port: number; + sphinx_key: string; + identity_key: string; + version: string; + profit_margin_percent: number; +}; + +export type GatewayBond = { + owner: string; + gateway: Gateway; + + bond_amount: Coin; + total_delegation: Coin; +}; + +export type Gateway = { + host: string; + mix_port: number; + clients_port: number; + location: string; + sphinx_key: string; + identity_key: string; + version: string; +}; + +export type SendRequest = { + senderAddress: string; + recipientAddress: string; + transferAmount: readonly Coin[]; +}; + +export interface SmartContractQuery { + queryContractSmart(address: string, queryMsg: Record): Promise; +} +export interface ICosmWasmQuery { + // methods exposed by `CosmWasmClient` + getChainId(): Promise; + getHeight(): Promise; + getAccount(searchAddress: string): Promise; + getSequence(address: string): Promise; + getBlock(height?: number): Promise; + getBalance(address: string, searchDenom: string): Promise; + getTx(id: string): Promise; + searchTx(query: SearchTxQuery, filter?: SearchTxFilter): Promise; + disconnect(): void; + broadcastTx(tx: Uint8Array, timeoutMs?: number, pollIntervalMs?: number): Promise; + getCodes(): Promise; + getCodeDetails(codeId: number): Promise; + getContracts(codeId: number): Promise; + getContract(address: string): Promise; + getContractCodeHistory(address: string): Promise; + queryContractRaw(address: string, key: Uint8Array): Promise; + queryContractSmart(address: string, queryMsg: Record): Promise; +} + +export interface INymdQuery { + // nym-specific implemented inside NymQuerier + getContractVersion(mixnetContractAddress: string): Promise; + getMixNodeBonds( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise; + getMixNodesDetailed( + mixnetContractAddress: string, + limit?: number, + startAfter?: string, + ): Promise; + getGatewaysPaged(mixnetContractAddress: string, limit?: number, startAfter?: string): Promise; + getOwnedMixnode(mixnetContractAddress: string, address: string): Promise; + ownsGateway(mixnetContractAddress: string, address: string): Promise; + getStateParams(mixnetContractAddress: string): Promise; + getAllNetworkDelegationsPaged( + mixnetContractAddress: string, + limit?: number, + startAfter?: [string, string], + ): Promise; + getMixNodeDelegationsPaged( + mixnetContractAddress: string, + mix_id: number, + limit?: number, + startAfter?: string, + ): Promise; + getDelegatorDelegationsPaged( + mixnetContractAddress: string, + delegator: string, + limit?: number, + startAfter?: string, + ): Promise; + getDelegationDetails(mixnetContractAddress: string, mix_id: number, delegator: string): Promise; + getLayerDistribution(mixnetContractAddress: string): Promise; + getStakeSaturation(mixnetContractAddress: string, mixId: number): Promise; + getUnbondedMixNodeInformation(mixnetContractAddress: string, mixId: number): Promise; + getMixnodeRewardingDetails(mixnetContractAddress: string, mixId: number): Promise; +} + +export interface IVestingQuerier { + getVestingContractVersion(mixnetContractAddress: string): Promise; +} + +export interface MappedCoin { + readonly denom: string; + readonly fractionalDigits: number; +} + +export interface CoinMap { + readonly [key: string]: MappedCoin; +} + +export interface ContractState { + owner: string; + rewarding_validator_address: string; + vesting_contract_address: string; + rewarding_denom: string; + params: ContractStateParams; +} diff --git a/clients/validator/tests/query/balance.test.ts b/clients/validator/tests/query/balance.test.ts deleted file mode 100644 index 97be47c2ce..0000000000 --- a/clients/validator/tests/query/balance.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import ValidatorClient from '../../validator/index'; -import expect from 'expect'; - -describe('Query: balances', () => { - it('can query for an account balance', async () => { - const client = await ValidatorClient.connectForQuery( - 'https://rpc.nymtech.net/', 'https://validator.nymtech.net/api/', 'n', 'n14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sjyvg3g', 'n1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrq73f2nw', 'nym'); - const balance = await client.getBalance('n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy'); - expect(Number.parseFloat(balance.amount)).toBeGreaterThan(0); - }).timeout(5000); -}) diff --git a/clients/validator/tests/sign/send.test.ts b/clients/validator/tests/sign/send.test.ts deleted file mode 100644 index 197d5bd4ef..0000000000 --- a/clients/validator/tests/sign/send.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import ValidatorClient from '../../dist'; -import expect from 'expect'; - -// TODO: implement for QA with .env for mnemonics -// describe('Sign: send', () => { -// it('can send tokens', async () => { -// const client = await ValidatorClient.connect( -// '', -// 'https://rpc.nyx.nodes.guru/', 'https://validator.nymtech.net/api/', 'n', 'n14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sjyvg3g', 'n1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrq73f2nw', 'nym'); -// await client.send('') -// const balance = await client.getBalance('n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy'); -// expect(Number.parseFloat(balance.amount)).toBeGreaterThan(0); -// }).timeout(5000); -// }) \ No newline at end of file diff --git a/clients/validator/tsconfig.json b/clients/validator/tsconfig.json index ec8e7c1fb0..0a2ce0f074 100644 --- a/clients/validator/tsconfig.json +++ b/clients/validator/tsconfig.json @@ -1,23 +1,22 @@ { - "compilerOptions": { - "target": "es6", - "module": "commonjs", - "esModuleInterop": true, - "strict": true, - "declaration": true, - "outDir": "./dist", - "skipLibCheck": true - }, - "typedocOptions": { - "entryPoints": [ - "src/index.ts" - ], - "out": "docs" - }, - "exclude": [ - "dist", - "examples", - "tests", - "node_modules" - ] -} \ No newline at end of file + "compilerOptions": { + "outDir": "./dist/nym-validator-client", + "module": "ES2020", + "target": "es2021", + "allowJs": false, + "strict": true, + "lib": ["es2021", "dom", "dom.iterable", "esnext"], + "moduleResolution": "node", + "skipDefaultLibCheck": true, + "esModuleInterop": true, + "declaration": true, + "skipLibCheck": true, + "noImplicitAny": true, + "typeRoots": ["./src/types/global.d.ts"] + }, + "typedocOptions": { + "entryPoints": ["./src/index.ts"], + "out": "docs" + }, + "exclude": ["dist", "./src/tests/**/*", "node_module"] +} diff --git a/clients/validator/tsconfig.test.json b/clients/validator/tsconfig.test.json new file mode 100644 index 0000000000..7048c297c8 --- /dev/null +++ b/clients/validator/tsconfig.test.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS" + } +} diff --git a/ts-packages/types/src/types/global.ts b/ts-packages/types/src/types/global.ts index 1ec545138c..c949456494 100644 --- a/ts-packages/types/src/types/global.ts +++ b/ts-packages/types/src/types/global.ts @@ -1,4 +1,4 @@ -import { MixNode, DecCoin } from './rust'; +import { MixNode, DecCoin, GatewayBond, MixNodeBond, MixNodeDetails, Delegation, Coin, UnbondedMixnode } from './rust'; export type TNodeType = 'mixnode' | 'gateway'; @@ -29,3 +29,124 @@ export type TMixnodeBondDetails = { mix_node: MixNode; proxy: any; }; + +export type MixnetContractVersion = { + build_timestamp: string; + build_version: string; + commit_sha: string; + commit_timestamp: string; + commit_branch: string; + rustc_version: string; +}; + +export type PagedMixNodeBondResponse = { + nodes: MixNodeBond[]; + per_page: number; + start_next_after?: string; +}; + +export type PagedMixNodeDetailsResponse = { + nodes: MixNodeDetails[]; + per_page: number; + start_next_after?: string; +}; + +export type PagedGatewayResponse = { + nodes: GatewayBond[]; + per_page: number; + start_next_after?: string; +}; + +export type MixOwnershipResponse = { + address: string; + mixnode?: MixNodeBond; +}; + +export type GatewayOwnershipResponse = { + address: string; + gateway?: GatewayBond; +}; + +export type ContractStateParams = { + // ideally I'd want to define those as `number` rather than `string`, but + // rust-side they are defined as Uint128 and that don't have + // native javascript representations and therefore are interpreted as strings after deserialization + minimum_mixnode_pledge: string; + minimum_gateway_pledge: string; + mixnode_rewarded_set_size: number; + mixnode_active_set_size: number; +}; + +export type PagedMixDelegationsResponse = { + delegations: Delegation[]; + start_next_after?: string; +}; + +export type PagedDelegatorDelegationsResponse = { + delegations: Delegation[]; + start_next_after?: string; +}; + +export type PagedAllDelegationsResponse = { + delegations: Delegation[]; + start_next_after?: [string, string]; +}; + +export type RewardingResult = { + operator_reward: string; + total_delegator_reward: string; +}; + +export type NodeRewardParams = { + period_reward_pool: string; + k: string; + reward_blockstamp: number; + circulating_supply: string; + uptime: string; + sybil_resistance_percent: number; +}; + +export type DelegatorRewardParams = { + node_reward_params: NodeRewardParams; + sigma: number; + profit_margin: number; + node_profit: number; +}; + +export type PendingDelegatorRewarding = { + running_results: RewardingResult; + next_start: string; + rewarding_params: DelegatorRewardParams; +}; + +export type RewardingStatus = { Complete: RewardingResult } | { PendingNextDelegatorPage: PendingDelegatorRewarding }; + +export type MixnodeRewardingStatusResponse = { + status?: RewardingStatus; +}; + +export type SendRequest = { + senderAddress: string; + recipientAddress: string; + transferAmount: readonly Coin[]; +}; + +export type UnbondedMixnodeResponse = [mix_id: number, unbonded_info?: UnbondedMixnode]; + +export type PagedUnbondedMixnodesResponse = { + nodes: UnbondedMixnodeResponse[]; + per_page: number; + start_next_after: string; +}; + +export type MappedCoin = { + readonly denom: string; + readonly fractionalDigits: number; +}; + +export type LayerDistribution = { + gateways: number; + layer1: number; + layer2: number; + layer3: number; +}; diff --git a/yarn.lock b/yarn.lock index 72e807cd97..27522a4f8d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1205,16 +1205,6 @@ "@noble/hashes" "^1.0.0" protobufjs "^6.8.8" -"@cosmjs/amino@0.28.13": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.28.13.tgz#b51417a23c1ff8ef8b85a6862eba8492c6c44f38" - integrity sha512-IHnH2zGwaY69qT4mVAavr/pfzx6YE+ud1NHJbvVePlbGiz68CXTi5LHR+K0lrKB5mQ7E+ZErWz2mw5U/x+V1wQ== - dependencies: - "@cosmjs/crypto" "0.28.13" - "@cosmjs/encoding" "0.28.13" - "@cosmjs/math" "0.28.13" - "@cosmjs/utils" "0.28.13" - "@cosmjs/amino@^0.25.6": version "0.25.6" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.25.6.tgz#cdf9632253bfab7b1d2ef967124953d7bf16351f" @@ -1225,6 +1215,16 @@ "@cosmjs/math" "^0.25.6" "@cosmjs/utils" "^0.25.6" +"@cosmjs/amino@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.29.5.tgz#053b4739a90b15b9e2b781ccd484faf64bd49aec" + integrity sha512-Qo8jpC0BiziTSUqpkNatBcwtKNhCovUnFul9SlT/74JUCdLYaeG5hxr3q1cssQt++l4LvlcpF+OUXL48XjNjLw== + dependencies: + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + "@cosmjs/cosmwasm-launchpad@^0.25.6": version "0.25.6" resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-launchpad/-/cosmwasm-launchpad-0.25.6.tgz#b03a96c8d5b5b4742ec4c56b4a01b1f4f33f7f57" @@ -1255,36 +1255,23 @@ pako "^2.0.2" protobufjs "~6.10.2" -"@cosmjs/cosmwasm-stargate@^0.28.0": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.28.13.tgz#bea77bc999aaafdb677f446465f648cd000c5b4a" - integrity sha512-dVZNOiRd8btQreRUabncGhVXGCS2wToXqxi9l3KEHwCJQ2RWTshuqV+EZAdCaYHE5W6823s2Ol2W/ukA9AXJPw== +"@cosmjs/cosmwasm-stargate@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.29.5.tgz#3f257da682658833e0f4eb9e8ff758e4d927663a" + integrity sha512-TNdSvm2tEE3XMCuxHxquzls56t40hC8qnLeYJWHsY2ECZmRK3KrnpRReEr7N7bLtODToK7X/riYrV0JaYxjrYA== dependencies: - "@cosmjs/amino" "0.28.13" - "@cosmjs/crypto" "0.28.13" - "@cosmjs/encoding" "0.28.13" - "@cosmjs/math" "0.28.13" - "@cosmjs/proto-signing" "0.28.13" - "@cosmjs/stargate" "0.28.13" - "@cosmjs/tendermint-rpc" "0.28.13" - "@cosmjs/utils" "0.28.13" - cosmjs-types "^0.4.0" + "@cosmjs/amino" "^0.29.5" + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/proto-signing" "^0.29.5" + "@cosmjs/stargate" "^0.29.5" + "@cosmjs/tendermint-rpc" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + cosmjs-types "^0.5.2" long "^4.0.0" pako "^2.0.2" -"@cosmjs/crypto@0.28.13", "@cosmjs/crypto@^0.28.0": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.28.13.tgz#541b6a36f616b2da5a568ead46d4e83841ceb412" - integrity sha512-ynKfM0q/tMBQMHJby6ad8lR3gkgBKaelQhIsCZTjClsnuC7oYT9y3ThSZCUWr7Pa9h0J8ahU2YV2oFWFVWJQzQ== - dependencies: - "@cosmjs/encoding" "0.28.13" - "@cosmjs/math" "0.28.13" - "@cosmjs/utils" "0.28.13" - "@noble/hashes" "^1" - bn.js "^5.2.0" - elliptic "^6.5.3" - libsodium-wrappers "^0.7.6" - "@cosmjs/crypto@^0.25.6": version "0.25.6" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.25.6.tgz#695d2d0d2195bdbdd5825d415385646244900bbb" @@ -1301,14 +1288,18 @@ ripemd160 "^2.0.2" sha.js "^2.4.11" -"@cosmjs/encoding@0.28.13": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.13.tgz#7994e8e2c435beaf0690296ffb0f7f3eaec8150b" - integrity sha512-jtXbAYtV77rLHxoIrjGFsvgGjeTKttuHRv6cvuy3toCZzY7JzTclKH5O2g36IIE4lXwD9xwuhGJ2aa6A3dhNkA== +"@cosmjs/crypto@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.29.5.tgz#ab99fc382b93d8a8db075780cf07487a0f9519fd" + integrity sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ== dependencies: - base64-js "^1.3.0" - bech32 "^1.1.4" - readonly-date "^1.0.0" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers "^0.7.6" "@cosmjs/encoding@^0.25.6": version "0.25.6" @@ -1319,13 +1310,14 @@ bech32 "^1.1.4" readonly-date "^1.0.0" -"@cosmjs/json-rpc@0.28.13": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.28.13.tgz#ff3f0c4a2f363b1a2c6779f8624a897e217fe297" - integrity sha512-fInSvg7x9P6p+GWqet+TMhrMTM3OWWdLJOGS5w2ryubMjgpR1rLiAx77MdTNkArW+/6sUwku0sN4veM4ENQu6A== +"@cosmjs/encoding@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.29.5.tgz#009a4b1c596cdfd326f30ccfa79f5e56daa264f2" + integrity sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ== dependencies: - "@cosmjs/stream" "0.28.13" - xstream "^11.14.0" + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" "@cosmjs/json-rpc@^0.25.6": version "0.25.6" @@ -1335,6 +1327,14 @@ "@cosmjs/stream" "^0.25.6" xstream "^11.14.0" +"@cosmjs/json-rpc@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.29.5.tgz#5e483a9bd98a6270f935adf0dfd8a1e7eb777fe4" + integrity sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w== + dependencies: + "@cosmjs/stream" "^0.29.5" + xstream "^11.14.0" + "@cosmjs/launchpad@^0.25.6": version "0.25.6" resolved "https://registry.yarnpkg.com/@cosmjs/launchpad/-/launchpad-0.25.6.tgz#c75f5d21be57af55fcb892f929520fa97f2d5bcc" @@ -1348,13 +1348,6 @@ axios "^0.21.1" fast-deep-equal "^3.1.3" -"@cosmjs/math@0.28.13", "@cosmjs/math@^0.28.0": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.28.13.tgz#50c05bc67007a04216f7f5e0c93f57270f8cc077" - integrity sha512-PDpL8W/kbyeWi0mQ2OruyqE8ZUAdxPs1xCbDX3WXJwy2oU+X2UTbkuweJHVpS9CIqmZulBoWQAmlf6t6zr1N/g== - dependencies: - bn.js "^5.2.0" - "@cosmjs/math@^0.25.5", "@cosmjs/math@^0.25.6": version "0.25.6" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.25.6.tgz#25c7b106aaded889a5b80784693caa9e654b0c28" @@ -1369,18 +1362,12 @@ dependencies: bn.js "^5.2.0" -"@cosmjs/proto-signing@0.28.13", "@cosmjs/proto-signing@^0.28.0": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.13.tgz#95ac12f0da0f0814f348f5ae996c3e96d015df61" - integrity sha512-nSl/2ZLsUJYz3Ad0RY3ihZUgRHIow2OnYqKsESMu+3RA/jTi9bDYhiBu8mNMHI0xrEJry918B2CyI56pOUHdPQ== +"@cosmjs/math@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.29.5.tgz#722c96e080d6c2b62215ce9f4c70da7625b241b6" + integrity sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q== dependencies: - "@cosmjs/amino" "0.28.13" - "@cosmjs/crypto" "0.28.13" - "@cosmjs/encoding" "0.28.13" - "@cosmjs/math" "0.28.13" - "@cosmjs/utils" "0.28.13" - cosmjs-types "^0.4.0" - long "^4.0.0" + bn.js "^5.2.0" "@cosmjs/proto-signing@^0.25.5", "@cosmjs/proto-signing@^0.25.6": version "0.25.6" @@ -1391,15 +1378,18 @@ long "^4.0.0" protobufjs "~6.10.2" -"@cosmjs/socket@0.28.13": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.28.13.tgz#d8443ad6e91d080fc6b80a7e9cf297a56b1f6833" - integrity sha512-lavwGxQ5VdeltyhpFtwCRVfxeWjH5D5mmN7jgx9nuCf3XSFbTcOYxrk2pQ4usenu1Q1KZdL4Yl5RCNrJuHD9Ug== +"@cosmjs/proto-signing@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.29.5.tgz#af3b62a46c2c2f1d2327d678b13b7262db1fe87c" + integrity sha512-QRrS7CiKaoETdgIqvi/7JC2qCwCR7lnWaUsTzh/XfRy3McLkEd+cXbKAW3cygykv7IN0VAEIhZd2lyIfT8KwNA== dependencies: - "@cosmjs/stream" "0.28.13" - isomorphic-ws "^4.0.1" - ws "^7" - xstream "^11.14.0" + "@cosmjs/amino" "^0.29.5" + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + cosmjs-types "^0.5.2" + long "^4.0.0" "@cosmjs/socket@^0.25.6": version "0.25.6" @@ -1411,22 +1401,14 @@ ws "^7" xstream "^11.14.0" -"@cosmjs/stargate@0.28.13", "@cosmjs/stargate@^0.28.0": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.28.13.tgz#a73d837a46ee8944e6eafe162f2ff6943c14350e" - integrity sha512-dVBMazDz8/eActHsRcZjDHHptOBMqvibj5CFgEtZBp22gP6ASzoAUXTlkSVk5FBf4sfuUHoff6st134/+PGMAg== +"@cosmjs/socket@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.29.5.tgz#a48df6b4c45dc6a6ef8e47232725dd4aa556ac2d" + integrity sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ== dependencies: - "@confio/ics23" "^0.6.8" - "@cosmjs/amino" "0.28.13" - "@cosmjs/encoding" "0.28.13" - "@cosmjs/math" "0.28.13" - "@cosmjs/proto-signing" "0.28.13" - "@cosmjs/stream" "0.28.13" - "@cosmjs/tendermint-rpc" "0.28.13" - "@cosmjs/utils" "0.28.13" - cosmjs-types "^0.4.0" - long "^4.0.0" - protobufjs "~6.11.3" + "@cosmjs/stream" "^0.29.5" + isomorphic-ws "^4.0.1" + ws "^7" xstream "^11.14.0" "@cosmjs/stargate@^0.25.5", "@cosmjs/stargate@^0.25.6": @@ -1445,11 +1427,22 @@ long "^4.0.0" protobufjs "~6.10.2" -"@cosmjs/stream@0.28.13": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.28.13.tgz#1e79d1116fda1e63e5ecddbd9d803d403942b1fa" - integrity sha512-AnjtfwT8NwPPkd3lhZhjOlOzT0Kn9bgEu2IPOZjQ1nmG2bplsr6TJmnwn0dJxHT7UGtex17h6whKB5N4wU37Wg== +"@cosmjs/stargate@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.29.5.tgz#d597af1c85a3c2af7b5bdbec34d5d40692cc09e4" + integrity sha512-hjEv8UUlJruLrYGJcUZXM/CziaINOKwfVm2BoSdUnNTMxGvY/jC1ABHKeZUYt9oXHxEJ1n9+pDqzbKc8pT0nBw== dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/proto-signing" "^0.29.5" + "@cosmjs/stream" "^0.29.5" + "@cosmjs/tendermint-rpc" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + cosmjs-types "^0.5.2" + long "^4.0.0" + protobufjs "~6.11.3" xstream "^11.14.0" "@cosmjs/stream@^0.25.6": @@ -1459,20 +1452,11 @@ dependencies: xstream "^11.14.0" -"@cosmjs/tendermint-rpc@0.28.13", "@cosmjs/tendermint-rpc@^0.28.0": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.28.13.tgz#0bf587ae66fa3f88319edbd258492d28e73f9f29" - integrity sha512-GB+ZmfuJIGQm0hsRtLYjeR3lOxF7Z6XyCBR0cX5AAYOZzSEBJjevPgUHD6tLn8zIhvzxaW3/VKnMB+WmlxdH4w== +"@cosmjs/stream@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.29.5.tgz#350981cac496d04939b92ee793b9b19f44bc1d4e" + integrity sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA== dependencies: - "@cosmjs/crypto" "0.28.13" - "@cosmjs/encoding" "0.28.13" - "@cosmjs/json-rpc" "0.28.13" - "@cosmjs/math" "0.28.13" - "@cosmjs/socket" "0.28.13" - "@cosmjs/stream" "0.28.13" - "@cosmjs/utils" "0.28.13" - axios "^0.21.2" - readonly-date "^1.0.0" xstream "^11.14.0" "@cosmjs/tendermint-rpc@^0.25.6": @@ -1490,16 +1474,32 @@ readonly-date "^1.0.0" xstream "^11.14.0" -"@cosmjs/utils@0.28.13": - version "0.28.13" - resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.28.13.tgz#2fd2844ec832d7833811e2ae1691305d09791a08" - integrity sha512-dVeMBiyg+46x7XBZEfJK8yTihphbCFpjVYmLJVqmTsHfJwymQ65cpyW/C+V/LgWARGK8hWQ/aX9HM5Ao8QmMSg== +"@cosmjs/tendermint-rpc@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.29.5.tgz#f205c10464212bdf843f91bb2e4a093b618cb5c2" + integrity sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w== + dependencies: + "@cosmjs/crypto" "^0.29.5" + "@cosmjs/encoding" "^0.29.5" + "@cosmjs/json-rpc" "^0.29.5" + "@cosmjs/math" "^0.29.5" + "@cosmjs/socket" "^0.29.5" + "@cosmjs/stream" "^0.29.5" + "@cosmjs/utils" "^0.29.5" + axios "^0.21.2" + readonly-date "^1.0.0" + xstream "^11.14.0" "@cosmjs/utils@^0.25.6": version "0.25.6" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.25.6.tgz#934d9a967180baa66163847616a74358732227ca" integrity sha512-ofOYiuxVKNo238vCPPlaDzqPXy2AQ/5/nashBo5rvPZJkxt9LciGfUEQWPCOb1BIJDNx2Dzu0z4XCf/dwzl0Dg== +"@cosmjs/utils@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.29.5.tgz#3fed1b3528ae8c5f1eb5d29b68755bebfd3294ee" + integrity sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ== + "@design-systems/utils@2.12.0": version "2.12.0" resolved "https://registry.yarnpkg.com/@design-systems/utils/-/utils-2.12.0.tgz#955c108be07cb8f01532207cbfea8f848fa760c9" @@ -1689,6 +1689,19 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@favware/rollup-type-bundler@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@favware/rollup-type-bundler/-/rollup-type-bundler-2.0.0.tgz#5594ee64b40dc64eb02eb68a30943ff4255d25dd" + integrity sha512-RTMvx6v3b4D9V9iXHTogYjHa5fCmcUR3Bu0pFreo+80v2tD+7MSJm24nR1P/SkeTCy+zHKC1JOFQa04fcWZozg== + dependencies: + "@sapphire/utilities" "^3.11.0" + colorette "^2.0.19" + commander "^9.4.1" + js-yaml "^4.1.0" + rollup "^3.2.1" + rollup-plugin-dts "^5.0.0" + typescript "^4.8.4" + "@floating-ui/core@^1.0.5": version "1.1.0" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.1.0.tgz#0a1dee4bbce87ff71602625d33f711cafd8afc08" @@ -3333,6 +3346,14 @@ "@rollup/pluginutils" "^5.0.1" resolve "^1.22.1" +"@rollup/plugin-typescript@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.0.0.tgz#f136272d1df5209daca0cb6f171c574b1d505545" + integrity sha512-goPyCWBiimk1iJgSTgsehFD5OOFHiAknrRJjqFCudcW8JtWiBlK284Xnn4flqMqg6YAjVG/EE+3aVzrL5qNSzQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + resolve "^1.22.1" + "@rollup/plugin-wasm@^6.1.1": version "6.1.2" resolved "https://registry.yarnpkg.com/@rollup/plugin-wasm/-/plugin-wasm-6.1.2.tgz#faf57f8e2ed12b9e0e898ba67963c52e1cd5f4c3" @@ -3356,6 +3377,11 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@sapphire/utilities@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@sapphire/utilities/-/utilities-3.11.0.tgz#2dccfb332dc5c119e1425cce6b2c64160b770bad" + integrity sha512-ich7J+329UTEgWxgk8b871rMhbFW/hvXdabdiKaUKd6g10eIMkIakWf+EGkDQsiDSiebIXll9TIPPmWtN3cVSw== + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -6290,12 +6316,14 @@ axios@^0.21.1, axios@^0.21.2: dependencies: follow-redirects "^1.14.0" -axios@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== +axios@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== dependencies: - follow-redirects "^1.14.8" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" axobject-query@^3.1.1: version "3.1.1" @@ -7409,7 +7437,7 @@ colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -colorette@^2.0.10, colorette@^2.0.14: +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.19: version "2.0.19" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== @@ -7479,6 +7507,11 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" @@ -7755,7 +7788,7 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmjs-types@^0.4.0, cosmjs-types@^0.4.1: +cosmjs-types@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.4.1.tgz#3b2a53ba60d33159dd075596ce8267cfa7027063" integrity sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog== @@ -7763,6 +7796,14 @@ cosmjs-types@^0.4.0, cosmjs-types@^0.4.1: long "^4.0.0" protobufjs "~6.11.2" +cosmjs-types@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.5.2.tgz#2d42b354946f330dfb5c90a87fdc2a36f97b965d" + integrity sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg== + dependencies: + long "^4.0.0" + protobufjs "~6.11.2" + cp-file@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" @@ -8731,6 +8772,11 @@ dotenv-webpack@^7.0.3: dependencies: dotenv-defaults "^2.0.2" +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + dotenv@^8.0.0, dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" @@ -8769,7 +8815,7 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== -elliptic@^6.5.3: +elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -9937,7 +9983,7 @@ focus-lock@^0.8.0: dependencies: tslib "^1.9.3" -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.8: +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -10026,6 +10072,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" @@ -13015,6 +13070,13 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +magic-string@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.29.0.tgz#f034f79f8c43dba4ae1730ffb5e8c4e084b16cf3" + integrity sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -13995,6 +14057,13 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +moq.ts@^7.3.4: + version "7.4.1" + resolved "https://registry.yarnpkg.com/moq.ts/-/moq.ts-7.4.1.tgz#1bb7e808324dc5b0143fa8b1a94f539203d475cb" + integrity sha512-P97MjGUkkMKQrAHbNScyJvSv3S7pMxnuxd3HgaOrPuoC6okwPqru3ZX8W/mTdU7Ms74622MeeWHqoDaGyYKonw== + dependencies: + tslib "2.1.0" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -15774,6 +15843,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -16785,11 +16859,27 @@ rollup-plugin-base64@^1.0.1: dependencies: "@rollup/pluginutils" "^3.1.0" +rollup-plugin-dts@^5.0.0, rollup-plugin-dts@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-5.2.0.tgz#1970edb69cfa3ead285ff4289d8fe273b87a5af3" + integrity sha512-B68T/haEu2MKcz4kNUhXB8/h5sq4gpplHAJIYNHbh8cp4ZkvzDvNca/11KQdFrB9ZeKucegQIotzo5T0JUtM8w== + dependencies: + magic-string "^0.29.0" + optionalDependencies: + "@babel/code-frame" "^7.18.6" + rollup-plugin-web-worker-loader@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/rollup-plugin-web-worker-loader/-/rollup-plugin-web-worker-loader-1.6.1.tgz#9d7a27575b64b0780fe4e8b3bc87470d217e485f" integrity sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A== +rollup@^3.17.2, rollup@^3.2.1: + version "3.17.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.17.2.tgz#a4ecd29c488672a0606e41ef57474fad715750a9" + integrity sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA== + optionalDependencies: + fsevents "~2.3.2" + rollup@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.10.1.tgz#56278901ed11fc2898421e8e3e2c8155bc7b40b4" @@ -18345,6 +18435,11 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" From 63524eceffb9b3914f9c7c2dd144120ceb85ec3e Mon Sep 17 00:00:00 2001 From: farbanas Date: Tue, 28 Feb 2023 17:27:58 +0100 Subject: [PATCH 531/591] fix: update versions of the latest release in changelogs from 1.0.11 to 1.1.11 --- CHANGELOG.md | 2 +- nym-connect/desktop/CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7db3d58a71..4d045624c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] -## [v1.0.11] (2023-02-28) +## [v1.1.11] (2023-02-28) - Fix empty dealer set loop ([#3105]) - The nym-api db.sqlite is broken when trying to run against it it in `enabled-credentials-mode true` there is an ordering issue with migrations when using the credential binary to purchase bandwidth ([#3100]) diff --git a/nym-connect/desktop/CHANGELOG.md b/nym-connect/desktop/CHANGELOG.md index 9e6f08fe2d..4bfd4a39e8 100644 --- a/nym-connect/desktop/CHANGELOG.md +++ b/nym-connect/desktop/CHANGELOG.md @@ -2,7 +2,7 @@ ## [Unreleased] -## [v1.0.11] (2023-02-28) +## [v1.1.11] (2023-02-28) - NC - add the option to manually select and use a specific Service Provider ([#2953]) From 4a80cd301bb57a8c0029b22184f9a20ff2908fae Mon Sep 17 00:00:00 2001 From: farbanas Date: Wed, 1 Mar 2023 11:06:21 +0100 Subject: [PATCH 532/591] fix: add step to install wasm-opt to our CI for building and uploading binaries --- .github/workflows/build-and-upload-binaries-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-and-upload-binaries-ci.yml b/.github/workflows/build-and-upload-binaries-ci.yml index 812c24f16e..a78eadfff4 100644 --- a/.github/workflows/build-and-upload-binaries-ci.yml +++ b/.github/workflows/build-and-upload-binaries-ci.yml @@ -79,6 +79,9 @@ jobs: override: true components: rustfmt, clippy + - name: Install wasm-opt + run: cargo install wasm-opt + - name: Build release contracts run: make wasm From 8f8cec07853c6319419243f67c367014ba45a838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 1 Mar 2023 10:37:44 +0000 Subject: [PATCH 533/591] Fixed the build badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 96409f6e0e..3a7f37ca33 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The platform is composed of multiple Rust crates. Top-level executable binary cr * nym-wallet - a desktop wallet implemented using the [Tauri](https://tauri.studio/en/docs/about/intro) framework. [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg?style=for-the-badge)](https://opensource.org/licenses/Apache-2.0) -[![Build Status](https://img.shields.io/github/workflow/status/nymtech/nym/Continuous%20integration/develop?style=for-the-badge&logo=github-actions)](https://github.com/nymtech/nym/actions?query=branch%3Adevelop) +[![Build Status](https://img.shields.io/github/actions/workflow/status/nymtech/nym/build.yml?branch=develop&style=for-the-badge&logo=github-actions)](https://github.com/nymtech/nym/actions?query=branch%3Adevelop) ### Building From 2ec790e8518dccd955cf362ff7d8fe09d017b11f Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Wed, 1 Mar 2023 15:16:40 +0100 Subject: [PATCH 534/591] fix(explorer): fix layout responsiveness in mixnode details view (#3130) --- .../src/components/MixNodes/DetailSection.tsx | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/explorer/src/components/MixNodes/DetailSection.tsx b/explorer/src/components/MixNodes/DetailSection.tsx index dcf0f830b5..a07a6fb7d8 100644 --- a/explorer/src/components/MixNodes/DetailSection.tsx +++ b/explorer/src/components/MixNodes/DetailSection.tsx @@ -18,8 +18,8 @@ export const MixNodeDetailSection: FCWithChildren = ({ mixNo const statusText = React.useMemo(() => getMixNodeStatusText(mixNodeRow.status), [mixNodeRow.status]); return ( - - + + = ({ mixNo > - + {mixnodeDescription.name} {(mixnodeDescription.description || '').slice(0, 1000)}

    b${M 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%0AAgLhgxg0o)9&jB-AvXNfoO1NKUAUt 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ͅ_(pnTUcWV05C*)8SUOlEMe#8y4ZN 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 -# Nym Connect +# Nym Connect - Android -Nym is an open-source, decentralized and permissionless privacy system. It provides full-stack privacy, allowing other applications, services or blockchains to provide their users with strong metadata protection, at both the network level (mixnet), and the application level (anonymous credentials) without the need to build privacy from scratch. +[Nym Connect](https://github.com/nymtech/nym/tree/develop/nym-connect) application for Android. Nym Connects sets up a SOCKS5 proxy for local applications to use. @@ -14,70 +14,40 @@ Nym Connects sets up a SOCKS5 proxy for local applications to use. - `Yarn` - `NodeJS >= v16` - `Rust & cargo` +- Android development environment (JDK, SDK/NDK, AVD etc...) -## Installation prerequisites - Windows - -- When running on Windows you will need to install c++ build tools -- An easy guide to get rust up and running [Installation]("http://kennykerr.ca/2019/11/18/rust-getting-started/") -- When installing NodeJS please use the `current features` version -- Using a package manager like [Chocolatey]("chocolatey.org") is recommended -- Nym connect requires you to have `Webview2` installed, please head to the [Installer](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section), this will ensure a smooth app launch +For setting up an Android development environment see +https://next--tauri.netlify.app/next/guides/getting-started/prerequisites/linux#android ## Installation -Inside the `nym-connect` directory, run the following command: +Inside the `nym-connect-android` directory, run the following command: + ``` yarn install ``` -## Development mode +## Development -You can compile nym-connect in development mode by running the following command inside the `nym-connect` directory: +Assuming there is a running android [emulator](https://developer.android.com/studio/run/emulator) +or a real [device](https://developer.android.com/studio/run/device) connected. +Inside the `nym-connect-android/src-tauri` directory, run the following command: ``` -yarn dev -``` -This will produce a binary in - `nym-connect/target/debug/` named `nym-connect` - -To launch, navigate to the directory and run the following command: `./nym-connect` - -## Production mode - -Run the following command from the `nym-connect` folder -``` -yarn build -``` -The output will compile different types of binaries dependent on your hardware / OS system. Once the binaries are built, they can be located as follows: - -### Binary output directory structure -``` -**macos** -| -└─── target/release -| |─ nym-connect -└───target/release/bundle/dmg -│ │─ bundle_dmg.sh -│ │─ nym-connect.*.dmg -└───target/release/bundle/macos/MacOs -│ │─ nym-connect -| -**Linux** -└─── target/release -| │─ nym-connect -└───target/release/bundle/appimage -│ │─ nym-connect_*_.AppImage -│ │─ build_appimage.sh -└───target/release/bundle/deb -│ │─ nym-connect_*_.deb -| -**Windows** -└─── target/release -| │─ nym-connect.exe -└───target/release/bundle/msi -│ │─ nym-connect_*_.msi +WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android dev ``` -For instructions on how to release nym-connect, please see [RELEASE.md](./docs/release/RELEASE.md). +#### Debugging + +https://next--tauri.netlify.app/next/guides/debugging/application#mobile + +## Production + +To build the application bundles (APK and AAB files), run the build command. + +``` +WRY_ANDROID_PACKAGE=net.nymtech.nym_connect_android WRY_ANDROID_LIBRARY=nym_connect_android cargo tauri android build +``` # Storybook @@ -92,4 +62,3 @@ And build storybook static site with: ``` yarn storybook:build ``` - diff --git a/nym-connect-android/src-tauri/Cargo.toml b/nym-connect-android/src-tauri/Cargo.toml index ffac476d29..93e8c31750 100644 --- a/nym-connect-android/src-tauri/Cargo.toml +++ b/nym-connect-android/src-tauri/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "nym-connect-android" version = "1.1.7" -description = "nym-connect" +description = "nym-connect for Android" authors = ["Nym Technologies SA"] license = "" repository = "" diff --git a/nym-connect-android/src-tauri/src/lib.rs b/nym-connect-android/src-tauri/src/lib.rs index f4f42e2f12..c637c04666 100644 --- a/nym-connect-android/src-tauri/src/lib.rs +++ b/nym-connect-android/src-tauri/src/lib.rs @@ -75,15 +75,6 @@ impl AppBuilder { crate::operations::connection::disconnect::start_disconnecting, crate::operations::directory::get_services, crate::operations::export::export_keys, - // crate::operations::window::hide_window, - // crate::operations::growth::test_and_earn::growth_tne_get_client_id, - // crate::operations::growth::test_and_earn::growth_tne_take_part, - // crate::operations::growth::test_and_earn::growth_tne_get_draws, - // crate::operations::growth::test_and_earn::growth_tne_ping, - // crate::operations::growth::test_and_earn::growth_tne_submit_wallet_address, - // crate::operations::growth::test_and_earn::growth_tne_enter_draw, - // crate::operations::growth::test_and_earn::growth_tne_toggle_window, - // crate::operations::help::log::help_log_toggle_window, ]) .setup(move |app| { if let Some(setup) = setup { From 6f94ab493742daa504e487b2263e80b53790588c Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Sat, 28 Jan 2023 00:12:53 +0100 Subject: [PATCH 258/591] ci(nc-android): try fix (#2928) --- .github/workflows/connect-android.yml | 62 +++++++++++++-------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/.github/workflows/connect-android.yml b/.github/workflows/connect-android.yml index 792f0b7cbb..8c04105a09 100644 --- a/.github/workflows/connect-android.yml +++ b/.github/workflows/connect-android.yml @@ -3,7 +3,7 @@ name: Nym Connect for Android (rust) on: push: paths: - - "nym-connect-android/**" + - "nym-connect-android/src-tauri/**" - "clients/client-core/**" - "clients/socks5/**" - "common/**" @@ -12,7 +12,7 @@ on: - "nym-api/nym-api-requests/**" pull_request: paths: - - "nym-connect-android/**" + - "nym-connect-android/src-tauri/**" - "clients/client-core/**" - "clients/socks5/**" - "common/**" @@ -25,49 +25,47 @@ jobs: runs-on: [self-hosted, custom-linux] env: RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache + defaults: + run: + working-directory: nym-connect-android/src-tauri/ steps: - name: Install Dependencies (Linux) - run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools libayatana-appindicator3-dev + if: ${{ !env.ACT }} + run: | + sudo apt-get update + sudo apt-get -y install \ + libwebkit2gtk-4.0-dev \ + build-essential \ + curl \ + wget \ + libssl-dev \ + libgtk-3-dev \ + squashfs-tools \ + libayatana-appindicator3-dev \ + librsvg2-dev continue-on-error: true - - name: Check out repository code - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v3 - - name: Install rust toolchain - uses: actions-rs/toolchain@v1 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@master with: - profile: minimal toolchain: stable - override: true - components: rustfmt, clippy + components: clippy, rustfmt - name: Build all binaries - uses: actions-rs/cargo@v1 - with: - command: build - args: --manifest-path nym-connect-android/src-tauri/Cargo.toml --workspace + run: cargo build - name: Run all tests - uses: actions-rs/cargo@v1 - with: - command: test - args: --manifest-path nym-connect-android/src-tauri/Cargo.toml --workspace + run: cargo test - name: Check formatting - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --manifest-path nym-connect-android/src-tauri/Cargo.toml --all -- --check + run: cargo fmt - - uses: actions-rs/clippy-check@v1 - name: Clippy checks + - name: Check continue-on-error: true - with: - token: ${{ secrets.GITHUB_TOKEN }} - args: --manifest-path nym-connect-android/src-tauri/Cargo.toml --workspace --all-features + run: cargo check - - name: Run clippy - uses: actions-rs/cargo@v1 - with: - command: clippy - args: --manifest-path nym-connect-android/src-tauri/Cargo.toml --workspace --all-features -- -D warnings + - name: Clippy + run: cargo clippy From 0669369c77d5014aef28c173726f36a344d877d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Sat, 28 Jan 2023 20:48:50 +0100 Subject: [PATCH 259/591] fix commit 044fa93eec367 --- .github/workflows/nightly_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index 050ef7fc8e..70a10c2fcb 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -86,7 +86,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: --workspace --all-features -- --ignored + args: --workspace -- --ignored - name: Reclaim some disk space (because Windows is being annoying) uses: actions-rs/cargo@v1 @@ -106,7 +106,7 @@ jobs: if: ${{ matrix.rust != 'nightly' }} with: command: clippy - args: --workspace -- -D warnings + args: --workspace --all-targets -- -D warnings - name: Reclaim some disk space uses: actions-rs/cargo@v1 From c9af4721f3be6faf233aef1ae7301a9da1409109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 30 Jan 2023 10:46:11 +0100 Subject: [PATCH 260/591] wasm-utils: fix clippy --- Cargo.lock | 2 +- common/wasm-utils/src/websocket/state.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb5f65ea20..8c399edf5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3683,7 +3683,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "1.1.7" +version = "1.1.8" dependencies = [ "anyhow", "atty", diff --git a/common/wasm-utils/src/websocket/state.rs b/common/wasm-utils/src/websocket/state.rs index d9f0f15f76..aee1525141 100644 --- a/common/wasm-utils/src/websocket/state.rs +++ b/common/wasm-utils/src/websocket/state.rs @@ -21,7 +21,7 @@ impl From for State { WebSocket::OPEN => State::Open, WebSocket::CLOSING => State::Closing, WebSocket::CLOSED => State::Closed, - n => panic!("{} is not a valid WebSocket state!", n), // should we panic here or change it into `TryFrom` instead? + n => panic!("{n} is not a valid WebSocket state!"), // should we panic here or change it into `TryFrom` instead? } } } From 7e43ce1aed2bdb8b8d0b835f2ed1b05819a76783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 30 Jan 2023 11:38:14 +0100 Subject: [PATCH 261/591] nym-connect-android: fix CI (#2930) --- .github/workflows/connect-android.yml | 37 +++++++++++------------ nym-connect-android/dist/.gitkeep | 0 nym-connect-android/src-tauri/src/main.rs | 6 ++-- 3 files changed, 21 insertions(+), 22 deletions(-) create mode 100644 nym-connect-android/dist/.gitkeep diff --git a/.github/workflows/connect-android.yml b/.github/workflows/connect-android.yml index 8c04105a09..1331ce2cab 100644 --- a/.github/workflows/connect-android.yml +++ b/.github/workflows/connect-android.yml @@ -22,19 +22,20 @@ on: jobs: build: - runs-on: [self-hosted, custom-linux] - env: - RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache - defaults: - run: - working-directory: nym-connect-android/src-tauri/ + #runs-on: [self-hosted, custom-linux] + runs-on: ubuntu-22.04 + #env: + #RUSTC_WRAPPER: /home/ubuntu/.cargo/bin/sccache + #defaults: + #run: + #working-directory: nym-connect-android/src-tauri/ steps: - name: Install Dependencies (Linux) if: ${{ !env.ACT }} run: | sudo apt-get update sudo apt-get -y install \ - libwebkit2gtk-4.0-dev \ + libwebkit2gtk-4.1-dev \ build-essential \ curl \ wget \ @@ -42,8 +43,10 @@ jobs: libgtk-3-dev \ squashfs-tools \ libayatana-appindicator3-dev \ - librsvg2-dev - continue-on-error: true + librsvg2-dev \ + libsoup-3.0-dev \ + libjavascriptcoregtk-4.1-dev + #continue-on-error: true - name: Checkout uses: actions/checkout@v3 @@ -54,18 +57,14 @@ jobs: toolchain: stable components: clippy, rustfmt + - name: Check formatting + run: cargo fmt --manifest-path nym-connect-android/src-tauri/Cargo.toml -- --check + - name: Build all binaries - run: cargo build + run: cargo build --manifest-path nym-connect-android/src-tauri/Cargo.toml - name: Run all tests - run: cargo test - - - name: Check formatting - run: cargo fmt - - - name: Check - continue-on-error: true - run: cargo check + run: cargo test --manifest-path nym-connect-android/src-tauri/Cargo.toml - name: Clippy - run: cargo clippy + run: cargo clippy --manifest-path nym-connect-android/src-tauri/Cargo.toml --all-targets -- -D warnings diff --git a/nym-connect-android/dist/.gitkeep b/nym-connect-android/dist/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nym-connect-android/src-tauri/src/main.rs b/nym-connect-android/src-tauri/src/main.rs index e7b0e7c071..11ece5dfd8 100644 --- a/nym-connect-android/src-tauri/src/main.rs +++ b/nym-connect-android/src-tauri/src/main.rs @@ -8,9 +8,9 @@ use nym_connect_android::AppBuilder; fn main() { // As per breaking change description here // https://github.com/tauri-apps/tauri/blob/feac1d193c6d618e49916ad0707201f43d5cdd36/tooling/bundler/CHANGELOG.md - if let Err(error) = fix_path_env::fix() { - log::warn!("Failed to fix PATH: {error}"); - } + //if let Err(error) = fix_path_env::fix() { + // log::warn!("Failed to fix PATH: {error}"); + //} AppBuilder::new().run(); } From cd3c951572fbf31f1a8e7d9ba9d69d7e1f621f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Mon, 30 Jan 2023 15:39:26 +0000 Subject: [PATCH 262/591] drop pending messages if we dont have enough surbs and we havent gotten any in long time (#2937) * drop pending messages if we dont have enough surbs and we havent gotten any in long time * missing changes to wasm client --- .../src/client/real_messages_control/mod.rs | 15 +++++++++---- .../client/replies/reply_controller/mod.rs | 19 +++++++++++----- clients/client-core/src/config/mod.rs | 22 ++++++++++++++----- clients/webassembly/src/client/config.rs | 20 ++++++++++++----- 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/clients/client-core/src/client/real_messages_control/mod.rs b/clients/client-core/src/client/real_messages_control/mod.rs index df04365c9b..9a1372f6ba 100644 --- a/clients/client-core/src/client/real_messages_control/mod.rs +++ b/clients/client-core/src/client/real_messages_control/mod.rs @@ -81,7 +81,11 @@ pub struct Config { /// Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking /// for more even though in theory they wouldn't need to. - maximum_reply_surb_waiting_period: Duration, + maximum_reply_surb_rerequest_waiting_period: Duration, + + /// Defines maximum amount of time the client is going to wait for reply surbs before + /// deciding it's never going to get them and would drop all pending messages + maximum_reply_surb_drop_waiting_period: Duration, /// Defines maximum amount of time given reply surb is going to be valid for. /// This is going to be superseded by key rotation once implemented. @@ -119,7 +123,8 @@ impl<'a> From<&'a Config> for reply_controller::Config { cfg.minimum_reply_surb_request_size, cfg.maximum_reply_surb_request_size, cfg.maximum_allowed_reply_surb_request_size, - cfg.maximum_reply_surb_waiting_period, + cfg.maximum_reply_surb_rerequest_waiting_period, + cfg.maximum_reply_surb_drop_waiting_period, cfg.maximum_reply_surb_age, cfg.maximum_reply_key_age, ) @@ -161,8 +166,10 @@ impl Config { .maximum_reply_surb_request_size, maximum_allowed_reply_surb_request_size: base_client_debug_config .maximum_allowed_reply_surb_request_size, - maximum_reply_surb_waiting_period: base_client_debug_config - .maximum_reply_surb_waiting_period, + maximum_reply_surb_rerequest_waiting_period: base_client_debug_config + .maximum_reply_surb_rerequest_waiting_period, + maximum_reply_surb_drop_waiting_period: base_client_debug_config + .maximum_reply_surb_drop_waiting_period, maximum_reply_surb_age: base_client_debug_config.maximum_reply_surb_age, maximum_reply_key_age: base_client_debug_config.maximum_reply_key_age, } diff --git a/clients/client-core/src/client/replies/reply_controller/mod.rs b/clients/client-core/src/client/replies/reply_controller/mod.rs index e8b8d980a9..e04ade2412 100644 --- a/clients/client-core/src/client/replies/reply_controller/mod.rs +++ b/clients/client-core/src/client/replies/reply_controller/mod.rs @@ -30,7 +30,8 @@ pub struct Config { min_surb_request_size: u32, max_surb_request_size: u32, maximum_allowed_reply_surb_request_size: u32, - max_surb_waiting_period: Duration, + max_surb_rerequest_waiting_period: Duration, + max_surb_drop_waiting_period: Duration, max_reply_surb_age: Duration, max_reply_key_age: Duration, } @@ -40,7 +41,8 @@ impl Config { min_surb_request_size: u32, max_surb_request_size: u32, maximum_allowed_reply_surb_request_size: u32, - max_surb_waiting_period: Duration, + max_surb_rerequest_waiting_period: Duration, + max_surb_drop_waiting_period: Duration, max_reply_surb_age: Duration, max_reply_key_age: Duration, ) -> Self { @@ -48,7 +50,8 @@ impl Config { min_surb_request_size, max_surb_request_size, maximum_allowed_reply_surb_request_size, - max_surb_waiting_period, + max_surb_rerequest_waiting_period, + max_surb_drop_waiting_period, max_reply_surb_age, max_reply_key_age, } @@ -742,9 +745,13 @@ where let diff = now - last_received_time; - if diff > self.config.max_surb_waiting_period { - warn!("We haven't received any surbs in {:?} from {pending_reply_target}. Going to explicitly ask for more", diff); - to_request.push(*pending_reply_target); + if diff > self.config.max_surb_rerequest_waiting_period { + if diff > self.config.max_surb_drop_waiting_period { + to_remove.push(*pending_reply_target) + } else { + debug!("We haven't received any surbs in {:?} from {pending_reply_target}. Going to explicitly ask for more", diff); + to_request.push(*pending_reply_target); + } } } diff --git a/clients/client-core/src/config/mod.rs b/clients/client-core/src/config/mod.rs index df1e0aa250..d7eada542c 100644 --- a/clients/client-core/src/config/mod.rs +++ b/clients/client-core/src/config/mod.rs @@ -45,7 +45,8 @@ const DEFAULT_MAXIMUM_REPLY_SURB_REQUEST_SIZE: u32 = 100; const DEFAULT_MAXIMUM_ALLOWED_SURB_REQUEST_SIZE: u32 = 500; -const DEFAULT_MAXIMUM_REPLY_SURB_WAITING_PERIOD: Duration = Duration::from_secs(10); +const DEFAULT_MAXIMUM_REPLY_SURB_REREQUEST_WAITING_PERIOD: Duration = Duration::from_secs(10); +const DEFAULT_MAXIMUM_REPLY_SURB_DROP_WAITING_PERIOD: Duration = Duration::from_secs(5 * 60); // 12 hours const DEFAULT_MAXIMUM_REPLY_SURB_AGE: Duration = Duration::from_secs(12 * 60 * 60); @@ -372,8 +373,12 @@ impl Config { self.debug.maximum_allowed_reply_surb_request_size } - pub fn get_maximum_reply_surb_waiting_period(&self) -> Duration { - self.debug.maximum_reply_surb_waiting_period + pub fn get_maximum_reply_surb_rerequest_waiting_period(&self) -> Duration { + self.debug.maximum_reply_surb_rerequest_waiting_period + } + + pub fn get_maximum_reply_surb_drop_waiting_period(&self) -> Duration { + self.debug.maximum_reply_surb_drop_waiting_period } pub fn get_maximum_reply_surb_age(&self) -> Duration { @@ -663,7 +668,12 @@ pub struct DebugConfig { /// Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking /// for more even though in theory they wouldn't need to. #[serde(with = "humantime_serde")] - pub maximum_reply_surb_waiting_period: Duration, + pub maximum_reply_surb_rerequest_waiting_period: Duration, + + /// Defines maximum amount of time the client is going to wait for reply surbs before + /// deciding it's never going to get them and would drop all pending messages + #[serde(with = "humantime_serde")] + pub maximum_reply_surb_drop_waiting_period: Duration, /// Defines maximum amount of time given reply surb is going to be valid for. /// This is going to be superseded by key rotation once implemented. @@ -704,7 +714,9 @@ impl Default for DebugConfig { minimum_reply_surb_request_size: DEFAULT_MINIMUM_REPLY_SURB_REQUEST_SIZE, maximum_reply_surb_request_size: DEFAULT_MAXIMUM_REPLY_SURB_REQUEST_SIZE, maximum_allowed_reply_surb_request_size: DEFAULT_MAXIMUM_ALLOWED_SURB_REQUEST_SIZE, - maximum_reply_surb_waiting_period: DEFAULT_MAXIMUM_REPLY_SURB_WAITING_PERIOD, + maximum_reply_surb_rerequest_waiting_period: + DEFAULT_MAXIMUM_REPLY_SURB_REREQUEST_WAITING_PERIOD, + maximum_reply_surb_drop_waiting_period: DEFAULT_MAXIMUM_REPLY_SURB_DROP_WAITING_PERIOD, maximum_reply_surb_age: DEFAULT_MAXIMUM_REPLY_SURB_AGE, maximum_reply_key_age: DEFAULT_MAXIMUM_REPLY_KEY_AGE, } diff --git a/clients/webassembly/src/client/config.rs b/clients/webassembly/src/client/config.rs index 4efefeba21..b69769936c 100644 --- a/clients/webassembly/src/client/config.rs +++ b/clients/webassembly/src/client/config.rs @@ -125,7 +125,11 @@ pub struct Debug { /// Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking /// for more even though in theory they wouldn't need to. - pub maximum_reply_surb_waiting_period_ms: u64, + pub maximum_reply_surb_rerequest_waiting_period_ms: u64, + + /// Defines maximum amount of time the client is going to wait for reply surbs before + /// deciding it's never going to get them and would drop all pending messages + pub maximum_reply_surb_drop_waiting_period_ms: u64, /// Defines maximum amount of time given reply surb is going to be valid for. /// This is going to be superseded by key rotation once implemented. @@ -168,8 +172,11 @@ impl From for ConfigDebug { minimum_reply_surb_request_size: debug.minimum_reply_surb_request_size, maximum_reply_surb_request_size: debug.maximum_reply_surb_request_size, maximum_allowed_reply_surb_request_size: debug.maximum_allowed_reply_surb_request_size, - maximum_reply_surb_waiting_period: Duration::from_millis( - debug.maximum_reply_surb_waiting_period_ms, + maximum_reply_surb_rerequest_waiting_period: Duration::from_millis( + debug.maximum_reply_surb_rerequest_waiting_period_ms, + ), + maximum_reply_surb_drop_waiting_period: Duration::from_millis( + debug.maximum_reply_surb_drop_waiting_period_ms, ), maximum_reply_surb_age: Duration::from_millis(debug.maximum_reply_surb_age_ms), maximum_reply_key_age: Duration::from_millis(debug.maximum_reply_key_age_ms), @@ -200,8 +207,11 @@ impl From for Debug { minimum_reply_surb_request_size: debug.minimum_reply_surb_request_size, maximum_reply_surb_request_size: debug.maximum_reply_surb_request_size, maximum_allowed_reply_surb_request_size: debug.maximum_allowed_reply_surb_request_size, - maximum_reply_surb_waiting_period_ms: debug - .maximum_reply_surb_waiting_period + maximum_reply_surb_rerequest_waiting_period_ms: debug + .maximum_reply_surb_rerequest_waiting_period + .as_millis() as u64, + maximum_reply_surb_drop_waiting_period_ms: debug + .maximum_reply_surb_drop_waiting_period .as_millis() as u64, maximum_reply_surb_age_ms: debug.maximum_reply_surb_age.as_millis() as u64, maximum_reply_key_age_ms: debug.maximum_reply_key_age.as_millis() as u64, From 265713b9d20674546b138f43a6b3b9fd4728eadc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Mon, 30 Jan 2023 15:39:55 +0000 Subject: [PATCH 263/591] Renamed 'initial_supply' to 'total_supply' in the 'circulating-supply' endpoint (#2932) * Renamed 'initial_supply' to 'total_supply' in the 'circulating-supply' endpoint * clippy issue messing with CI --- nym-api/nym-api-requests/src/models.rs | 2 +- nym-api/src/circulating_supply_api/cache/data.rs | 6 +++--- nym-api/src/circulating_supply_api/cache/mod.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nym-api/nym-api-requests/src/models.rs b/nym-api/nym-api-requests/src/models.rs index 237f4ce90d..e241fad0e1 100644 --- a/nym-api/nym-api-requests/src/models.rs +++ b/nym-api/nym-api-requests/src/models.rs @@ -291,7 +291,7 @@ pub struct GatewayUptimeHistoryResponse { #[derive(Clone, Serialize, Deserialize, schemars::JsonSchema)] pub struct CirculatingSupplyResponse { - pub initial_supply: Coin, + pub total_supply: Coin, pub mixmining_reserve: Coin, pub vesting_tokens: Coin, pub circulating_supply: Coin, diff --git a/nym-api/src/circulating_supply_api/cache/data.rs b/nym-api/src/circulating_supply_api/cache/data.rs index 9fb68a8cac..17e906dff3 100644 --- a/nym-api/src/circulating_supply_api/cache/data.rs +++ b/nym-api/src/circulating_supply_api/cache/data.rs @@ -7,7 +7,7 @@ use validator_client::nyxd::Coin; pub(crate) struct CirculatingSupplyCacheData { // no need to cache that one as it's constant, but let's put it here for consistency sake - pub(crate) initial_supply: Coin, + pub(crate) total_supply: Coin, pub(crate) mixmining_reserve: Cache, pub(crate) vesting_tokens: Cache, pub(crate) circulating_supply: Cache, @@ -18,7 +18,7 @@ impl CirculatingSupplyCacheData { let zero_coin = Coin::new(0, &mix_denom); CirculatingSupplyCacheData { - initial_supply: Coin::new(1_000_000_000_000_000, mix_denom), + total_supply: Coin::new(1_000_000_000_000_000, mix_denom), mixmining_reserve: Cache::new(zero_coin.clone()), vesting_tokens: Cache::new(zero_coin.clone()), circulating_supply: Cache::new(zero_coin), @@ -29,7 +29,7 @@ impl CirculatingSupplyCacheData { impl<'a> From<&'a CirculatingSupplyCacheData> for CirculatingSupplyResponse { fn from(value: &'a CirculatingSupplyCacheData) -> Self { CirculatingSupplyResponse { - initial_supply: value.initial_supply.clone().into(), + total_supply: value.total_supply.clone().into(), mixmining_reserve: value.mixmining_reserve.clone().into_inner().into(), vesting_tokens: value.vesting_tokens.clone().into_inner().into(), circulating_supply: value.circulating_supply.clone().into_inner().into(), diff --git a/nym-api/src/circulating_supply_api/cache/mod.rs b/nym-api/src/circulating_supply_api/cache/mod.rs index 5e12477476..2f432c8d4d 100644 --- a/nym-api/src/circulating_supply_api/cache/mod.rs +++ b/nym-api/src/circulating_supply_api/cache/mod.rs @@ -76,7 +76,7 @@ impl CirculatingSupplyCache { pub(crate) async fn update(&self, mixmining_reserve: Coin, vesting_tokens: Coin) { let mut cache = self.data.write().await; - let mut circulating_supply = cache.initial_supply.clone(); + let mut circulating_supply = cache.total_supply.clone(); circulating_supply.amount -= mixmining_reserve.amount; circulating_supply.amount -= vesting_tokens.amount; From 5370bb9c47d4c8adb57eb57618dab743a47e180b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C8=99u?= Date: Mon, 30 Jan 2023 17:56:27 +0200 Subject: [PATCH 264/591] Fix clippy --- common/wasm-utils/src/websocket/state.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/wasm-utils/src/websocket/state.rs b/common/wasm-utils/src/websocket/state.rs index d9f0f15f76..aee1525141 100644 --- a/common/wasm-utils/src/websocket/state.rs +++ b/common/wasm-utils/src/websocket/state.rs @@ -21,7 +21,7 @@ impl From for State { WebSocket::OPEN => State::Open, WebSocket::CLOSING => State::Closing, WebSocket::CLOSED => State::Closed, - n => panic!("{} is not a valid WebSocket state!", n), // should we panic here or change it into `TryFrom` instead? + n => panic!("{n} is not a valid WebSocket state!"), // should we panic here or change it into `TryFrom` instead? } } } From c6ce8caaf7a49125741e97450ac88da30785a3a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Mon, 30 Jan 2023 18:44:45 +0200 Subject: [PATCH 265/591] Feature/fix soft multisig error (#2938) --- Cargo.lock | 1 + .../multisig-contract/Cargo.toml | 1 + .../multisig-contract}/src/error.rs | 3 +++ .../multisig-contract/src/lib.rs | 1 + contracts/coconut-test/src/helpers.rs | 3 ++- contracts/multisig/cw3-flex-multisig/Cargo.toml | 1 - .../multisig/cw3-flex-multisig/src/contract.rs | 2 +- contracts/multisig/cw3-flex-multisig/src/lib.rs | 3 --- nym-api/src/coconut/mod.rs | 16 +++++++++++++--- nym-wallet/Cargo.lock | 5 +++-- 10 files changed, 25 insertions(+), 11 deletions(-) rename {contracts/multisig/cw3-flex-multisig => common/cosmwasm-smart-contracts/multisig-contract}/src/error.rs (90%) diff --git a/Cargo.lock b/Cargo.lock index 8c399edf5f..355f3ad008 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3312,6 +3312,7 @@ dependencies = [ "cw4", "schemars", "serde", + "thiserror", ] [[package]] diff --git a/common/cosmwasm-smart-contracts/multisig-contract/Cargo.toml b/common/cosmwasm-smart-contracts/multisig-contract/Cargo.toml index f493cb6635..096e4affe0 100644 --- a/common/cosmwasm-smart-contracts/multisig-contract/Cargo.toml +++ b/common/cosmwasm-smart-contracts/multisig-contract/Cargo.toml @@ -13,3 +13,4 @@ cw4 = { version = "0.13.4" } cosmwasm-std = "1.0.0" schemars = "0.8" serde = { version = "1.0.103", default-features = false, features = ["derive"] } +thiserror = { version = "1.0.23" } diff --git a/contracts/multisig/cw3-flex-multisig/src/error.rs b/common/cosmwasm-smart-contracts/multisig-contract/src/error.rs similarity index 90% rename from contracts/multisig/cw3-flex-multisig/src/error.rs rename to common/cosmwasm-smart-contracts/multisig-contract/src/error.rs index 75a546ca0e..b10fa6b506 100644 --- a/contracts/multisig/cw3-flex-multisig/src/error.rs +++ b/common/cosmwasm-smart-contracts/multisig-contract/src/error.rs @@ -1,3 +1,6 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + use cosmwasm_std::StdError; use cw_utils::ThresholdError; diff --git a/common/cosmwasm-smart-contracts/multisig-contract/src/lib.rs b/common/cosmwasm-smart-contracts/multisig-contract/src/lib.rs index d0e87a0d30..a968ed14e5 100644 --- a/common/cosmwasm-smart-contracts/multisig-contract/src/lib.rs +++ b/common/cosmwasm-smart-contracts/multisig-contract/src/lib.rs @@ -1 +1,2 @@ +pub mod error; pub mod msg; diff --git a/contracts/coconut-test/src/helpers.rs b/contracts/coconut-test/src/helpers.rs index 319e523c91..f5bd455d62 100644 --- a/contracts/coconut-test/src/helpers.rs +++ b/contracts/coconut-test/src/helpers.rs @@ -2,8 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 use cosmwasm_std::{entry_point, Addr, Coin, DepsMut, Empty, Env, Response}; -use cw3_flex_multisig::{state::CONFIG, ContractError}; +use cw3_flex_multisig::state::CONFIG; use cw_multi_test::{App, AppBuilder, Contract, ContractWrapper}; +use multisig_contract_common::error::ContractError; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/contracts/multisig/cw3-flex-multisig/Cargo.toml b/contracts/multisig/cw3-flex-multisig/Cargo.toml index e014c728b7..dd127b54ba 100644 --- a/contracts/multisig/cw3-flex-multisig/Cargo.toml +++ b/contracts/multisig/cw3-flex-multisig/Cargo.toml @@ -26,7 +26,6 @@ cw-storage-plus = { version = "0.13.4" } cosmwasm-std = { version = "1.0.0" } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -thiserror = { version = "1.0.23" } group-contract-common = { path = "../../../common/cosmwasm-smart-contracts/group-contract" } multisig-contract-common = { path= "../../../common/cosmwasm-smart-contracts/multisig-contract" } diff --git a/contracts/multisig/cw3-flex-multisig/src/contract.rs b/contracts/multisig/cw3-flex-multisig/src/contract.rs index 677006daf4..edd1a648b2 100644 --- a/contracts/multisig/cw3-flex-multisig/src/contract.rs +++ b/contracts/multisig/cw3-flex-multisig/src/contract.rs @@ -17,8 +17,8 @@ use cw4::{Cw4Contract, MemberChangedHookMsg, MemberDiff}; use cw_storage_plus::Bound; use cw_utils::{maybe_addr, Expiration, ThresholdResponse}; -use crate::error::ContractError; use crate::state::{Config, CONFIG}; +use multisig_contract_common::error::ContractError; use multisig_contract_common::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; // version info for migration info diff --git a/contracts/multisig/cw3-flex-multisig/src/lib.rs b/contracts/multisig/cw3-flex-multisig/src/lib.rs index e544aa55c8..3407c199dd 100644 --- a/contracts/multisig/cw3-flex-multisig/src/lib.rs +++ b/contracts/multisig/cw3-flex-multisig/src/lib.rs @@ -1,5 +1,2 @@ pub mod contract; -pub mod error; pub mod state; - -pub use crate::error::ContractError; diff --git a/nym-api/src/coconut/mod.rs b/nym-api/src/coconut/mod.rs index a0aa042440..8d4999f32a 100644 --- a/nym-api/src/coconut/mod.rs +++ b/nym-api/src/coconut/mod.rs @@ -33,6 +33,7 @@ use rocket::State as RocketState; use std::sync::Arc; use tokio::sync::Mutex; use validator_client::nym_api::routes::{BANDWIDTH, COCONUT_ROUTES}; +use validator_client::nyxd::error::NyxdError::AbciError; use validator_client::nyxd::{Coin, Fee}; pub(crate) mod client; @@ -300,8 +301,7 @@ pub async fn verify_bandwidth_credential( state.mix_denom.clone(), ); - // Vote yes or no on the proposal based on the verification result - state + let ret = state .client .vote_proposal( proposal_id, @@ -312,7 +312,17 @@ pub async fn verify_bandwidth_credential( Some(verify_credential_body.gateway_cosmos_addr().to_owned()), )), ) - .await?; + .await; + // Vote yes or no on the proposal based on the verification result + // If the result is already established, the vote might be redundant and + // thus the transaction might fail + if let Err(CoconutError::NyxdError(AbciError { ref log, .. })) = ret { + let accepted_err = multisig_contract_common::error::ContractError::NotOpen {}.to_string(); + // If redundant voting is not the case, error out on all other error variants + if !log.value().contains(&accepted_err) { + ret?; + } + } Ok(Json(VerifyCredentialResponse::new(vote_yes))) } diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index acce120ca4..9a67556428 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -2710,6 +2710,7 @@ dependencies = [ "cw4", "schemars", "serde", + "thiserror", ] [[package]] @@ -2941,7 +2942,7 @@ dependencies = [ [[package]] name = "nym_wallet" -version = "1.1.7" +version = "1.1.8" dependencies = [ "aes-gcm", "argon2 0.3.4", @@ -5484,7 +5485,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vesting-contract" -version = "1.1.2" +version = "1.1.3" dependencies = [ "contracts-common", "cosmwasm-std", From 01b86bcc0db795b208b2ef5e4d7a56b8fc911eee Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Tue, 31 Jan 2023 07:39:18 -0100 Subject: [PATCH 266/591] updating qwerty contract addresses --- envs/qa-qwerty.env | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/envs/qa-qwerty.env b/envs/qa-qwerty.env index 30130fd6e9..29ea84bea0 100644 --- a/envs/qa-qwerty.env +++ b/envs/qa-qwerty.env @@ -12,10 +12,10 @@ DENOMS_EXPONENT=6 MIXNET_CONTRACT_ADDRESS=n14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sjyvg3g VESTING_CONTRACT_ADDRESS=n1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrq73f2nw BANDWIDTH_CLAIM_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 -COCONUT_BANDWIDTH_CONTRACT_ADDRESS=n12ckdkm3q7eytefs7rwu4ue3t9hxgvl9v08jddmtwgct2ve0pv50q0t8dlt -GROUP_CONTRACT_ADDRESS=n1rw8fw2mpcpzzq3jpa4e52ufawnmj5a4u68p35umvgskewuw0nlzsaa5w4m -MULTISIG_CONTRACT_ADDRESS=n14krxe8ukzagwhvec0rmteexu62w8k9kp9sra9ww6em2hnmzcukqsa0utc8 -COCONUT_DKG_CONTRACT_ADDRESS=n1rl5n6cxuz2hdy3f7d9hsnw8zn0zwwwr0r4dxfz7tktgpgkcnz9zshmvksc +COCONUT_BANDWIDTH_CONTRACT_ADDRESS=n19d2nwj7fdhxqmyvgy8lf3ad49a6vmww4shryhrkj2mqk36att66s6xzszw +GROUP_CONTRACT_ADDRESS=n1fqquzw4mk0pkamgr2ywt2v7h2j9nuyjjn4gvpy8zlpp6xn0uyuzqfm28l5 +MULTISIG_CONTRACT_ADDRESS=n1gaq3666chd5348apj8cka8t2mckv7azp9espyr7wgpxyuzur5d0sazpysy +COCONUT_DKG_CONTRACT_ADDRESS= n18yadscxw8v35dds7ksv3j0svmjh3h6e7tmxpadk96mvgz27zygkshuf4vs REWARDING_VALIDATOR_ADDRESS=n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy STATISTICS_SERVICE_DOMAIN_ADDRESS="https://mainnet-stats.nymte.ch:8090" NYXD="https://qwerty-validator.qa.nymte.ch/" From 12751665bb64b987eb44614d2ea02373c261efbe Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Tue, 31 Jan 2023 09:14:56 -0100 Subject: [PATCH 267/591] white space --- envs/qa-qwerty.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envs/qa-qwerty.env b/envs/qa-qwerty.env index 29ea84bea0..474bf8d073 100644 --- a/envs/qa-qwerty.env +++ b/envs/qa-qwerty.env @@ -15,7 +15,7 @@ BANDWIDTH_CLAIM_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 COCONUT_BANDWIDTH_CONTRACT_ADDRESS=n19d2nwj7fdhxqmyvgy8lf3ad49a6vmww4shryhrkj2mqk36att66s6xzszw GROUP_CONTRACT_ADDRESS=n1fqquzw4mk0pkamgr2ywt2v7h2j9nuyjjn4gvpy8zlpp6xn0uyuzqfm28l5 MULTISIG_CONTRACT_ADDRESS=n1gaq3666chd5348apj8cka8t2mckv7azp9espyr7wgpxyuzur5d0sazpysy -COCONUT_DKG_CONTRACT_ADDRESS= n18yadscxw8v35dds7ksv3j0svmjh3h6e7tmxpadk96mvgz27zygkshuf4vs +COCONUT_DKG_CONTRACT_ADDRESS=n18yadscxw8v35dds7ksv3j0svmjh3h6e7tmxpadk96mvgz27zygkshuf4vs REWARDING_VALIDATOR_ADDRESS=n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy STATISTICS_SERVICE_DOMAIN_ADDRESS="https://mainnet-stats.nymte.ch:8090" NYXD="https://qwerty-validator.qa.nymte.ch/" From dc2b25f1523cfda15854bc5b56abaec20eacf02d Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Tue, 31 Jan 2023 12:08:57 +0100 Subject: [PATCH 268/591] fix(nc-android): panic on socks5 client connect (#2929) --- clients/socks5/src/client/mod.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/clients/socks5/src/client/mod.rs b/clients/socks5/src/client/mod.rs index ca6348cc45..a6c88ed31a 100644 --- a/clients/socks5/src/client/mod.rs +++ b/clients/socks5/src/client/mod.rs @@ -209,21 +209,23 @@ impl NymClient { pub async fn start(self) -> Result { #[cfg(not(feature = "mobile"))] - let fs_reply_surb_backend = non_wasm_helpers::setup_fs_reply_surb_backend( - Some(self.config.get_base().get_reply_surb_database_path()), - self.config.get_debug_settings(), - ) - .await?; - - #[cfg(feature = "mobile")] - let fs_reply_surb_backend = - setup_empty_reply_surb_backend(self.config.get_debug_settings()); - let base_builder = BaseClientBuilder::new_from_base_config( self.config.get_base(), self.key_manager, Some(Self::create_bandwidth_controller(&self.config).await), - fs_reply_surb_backend, + non_wasm_helpers::setup_fs_reply_surb_backend( + Some(self.config.get_base().get_reply_surb_database_path()), + self.config.get_debug_settings(), + ) + .await?, + ); + + #[cfg(feature = "mobile")] + let base_builder = BaseClientBuilder::<_, QueryNyxdClient>::new_from_base_config( + self.config.get_base(), + self.key_manager, + None, + setup_empty_reply_surb_backend(self.config.get_debug_settings()), ); let self_address = base_builder.as_mix_recipient(); From 95340b58178f56206c7f1cc308b431fe954d30b9 Mon Sep 17 00:00:00 2001 From: Fouad Date: Tue, 31 Jan 2023 11:39:38 +0000 Subject: [PATCH 269/591] Feature/nym connect new UI (#2916) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * reduce window size * use new highlight color * use react router * render new routes * remove old help page * render app routes * update connection status UI * remove service provider info * remove unneeded additional step * render title from route * experimental warning as component * render connection page * nym-connect: connectivity status improvements (#2915) * connect: keep track of connectivity state * nym-connect: query connection state * nym-connect: function for kicking of the health check task * rustfmt * nym-connect: extract out into function * nym-connect: extract out events.rs * add app version to menu page * help page content and style updates * update guide content * use layout component on disconnect page * handle gateway issues * only show info modal once after connecting * power button colors * update stories and button colors --------- Co-authored-by: Jon Häggblad --- nym-connect/CHANGELOG.md | 5 + nym-connect/package.json | 2 +- nym-connect/src-tauri/src/error.rs | 4 +- nym-connect/src-tauri/src/events.rs | 71 ++++++++++ nym-connect/src-tauri/src/main.rs | 7 +- nym-connect/src-tauri/src/models/mod.rs | 31 ++++ .../src/operations/connection/health_check.rs | 26 ++++ .../src/operations/connection/mod.rs | 1 + .../src/operations/connection/status.rs | 48 ++++--- nym-connect/src-tauri/src/state.rs | 71 +++++++++- nym-connect/src-tauri/src/tasks.rs | 85 ++++------- nym-connect/src-tauri/tauri.conf.json | 2 +- nym-connect/src/App.tsx | 44 ++---- .../src/assets/help-step-one-legacy.png | Bin 0 -> 14403 bytes nym-connect/src/assets/help-step-one.png | Bin 14403 -> 36448 bytes .../src/assets/help-step-two-legacy.png | Bin 0 -> 35631 bytes nym-connect/src/assets/help-step-two.png | Bin 35631 -> 18353 bytes nym-connect/src/components/AppVersion.tsx | 4 +- nym-connect/src/components/AppWindowFrame.tsx | 33 ++--- .../src/components/ConnectionButton.tsx | 14 +- .../src/components/ConnectionStatus.tsx | 93 ++++++------ nym-connect/src/components/CustomTitleBar.tsx | 44 +++--- .../src/components/ExperimentalWarning.tsx | 13 ++ .../Growth/TestAndEarnButtonArea.tsx | 2 +- .../components/Growth/TestAndEarnPopup.tsx | 8 +- .../Growth/context/TestAndEarnContext.tsx | 2 +- nym-connect/src/components/HelpPage.tsx | 8 +- nym-connect/src/components/HelpPageImage.tsx | 5 +- .../src/components/HelpPageStepIndicator.tsx | 7 +- nym-connect/src/components/InfoModal.tsx | 4 +- .../src/components/IpAddressAndPortModal.tsx | 16 ++- nym-connect/src/components/PowerButton.tsx | 132 ++++++++++++++++++ ...erviceProviderInfo.tsx => TooltipInfo.tsx} | 13 +- nym-connect/src/context/main.tsx | 116 ++++++++------- nym-connect/src/context/mocks/main.tsx | 9 +- nym-connect/src/index.tsx | 24 ++-- nym-connect/src/layouts/ConnectedLayout.tsx | 57 -------- nym-connect/src/layouts/ConnectionLayout.tsx | 30 ++++ nym-connect/src/layouts/DefaultLayout.tsx | 49 ------- nym-connect/src/layouts/HelpGuideLayout.tsx | 70 ---------- .../src/pages/connection/Connected.tsx | 75 ++++++++++ .../src/pages/connection/Disconnected.tsx | 55 ++++++++ nym-connect/src/pages/connection/index.tsx | 85 +++++++++++ nym-connect/src/pages/menu/Apps.tsx | 42 ++++++ nym-connect/src/pages/menu/Guide.tsx | 47 +++++++ nym-connect/src/pages/menu/index.tsx | 30 ++++ nym-connect/src/routes/index.tsx | 18 +++ nym-connect/src/stories/AppFlow.stories.tsx | 22 +-- .../src/stories/ConnectedLayout.stories.tsx | 22 +-- .../src/stories/ConnectionButton.stories.tsx | 2 +- .../src/stories/DefaultLayout.stories.tsx | 22 ++- .../src/stories/PowerButton.stories.tsx | 29 ++++ nym-connect/src/theme/theme.tsx | 2 +- yarn.lock | 79 +---------- 54 files changed, 1103 insertions(+), 577 deletions(-) create mode 100644 nym-connect/src-tauri/src/events.rs create mode 100644 nym-connect/src-tauri/src/operations/connection/health_check.rs create mode 100644 nym-connect/src/assets/help-step-one-legacy.png create mode 100644 nym-connect/src/assets/help-step-two-legacy.png create mode 100644 nym-connect/src/components/ExperimentalWarning.tsx create mode 100644 nym-connect/src/components/PowerButton.tsx rename nym-connect/src/components/{ServiceProviderInfo.tsx => TooltipInfo.tsx} (60%) delete mode 100644 nym-connect/src/layouts/ConnectedLayout.tsx create mode 100644 nym-connect/src/layouts/ConnectionLayout.tsx delete mode 100644 nym-connect/src/layouts/DefaultLayout.tsx delete mode 100644 nym-connect/src/layouts/HelpGuideLayout.tsx create mode 100644 nym-connect/src/pages/connection/Connected.tsx create mode 100644 nym-connect/src/pages/connection/Disconnected.tsx create mode 100644 nym-connect/src/pages/connection/index.tsx create mode 100644 nym-connect/src/pages/menu/Apps.tsx create mode 100644 nym-connect/src/pages/menu/Guide.tsx create mode 100644 nym-connect/src/pages/menu/index.tsx create mode 100644 nym-connect/src/routes/index.tsx create mode 100644 nym-connect/src/stories/PowerButton.stories.tsx diff --git a/nym-connect/CHANGELOG.md b/nym-connect/CHANGELOG.md index cddba036e0..cbf60772f4 100644 --- a/nym-connect/CHANGELOG.md +++ b/nym-connect/CHANGELOG.md @@ -2,6 +2,11 @@ ## UNRELEASED +## [nym-connect-v1.1.8](https://github.com/nymtech/nym/tree/nym-connect-v1.1.8) (2023-01-31) + +- New user interface +- One click connect + ## [nym-connect-v1.1.7](https://github.com/nymtech/nym/tree/nym-connect-v1.1.7) (2023-01-24) - Remove test and earn ([#2865]) diff --git a/nym-connect/package.json b/nym-connect/package.json index 4fb0869862..abc3664d4f 100644 --- a/nym-connect/package.json +++ b/nym-connect/package.json @@ -43,7 +43,7 @@ "react-error-boundary": "^3.1.3", "react-hook-form": "^7.14.2", "react-markdown": "^8.0.4", - "react-router-dom": "^5.2.0", + "react-router-dom": "^6.7.0", "semver": "^6.3.0", "yup": "^0.32.9" }, diff --git a/nym-connect/src-tauri/src/error.rs b/nym-connect/src-tauri/src/error.rs index 50a672f8ac..11ae239f77 100644 --- a/nym-connect/src-tauri/src/error.rs +++ b/nym-connect/src-tauri/src/error.rs @@ -56,9 +56,9 @@ pub enum BackendError { InitializationPanic, #[error("could not get config id before gateway is set")] CouldNotGetIdWithoutGateway, - #[error("could initialize without gateway set")] + #[error("could not initialize without gateway set")] CouldNotInitWithoutGateway, - #[error("could initialize without service provider set")] + #[error("could not initialize without service provider set")] CouldNotInitWithoutServiceProvider, #[error("could not get file name")] CouldNotGetFilename, diff --git a/nym-connect/src-tauri/src/events.rs b/nym-connect/src-tauri/src/events.rs new file mode 100644 index 0000000000..13e1ca800d --- /dev/null +++ b/nym-connect/src-tauri/src/events.rs @@ -0,0 +1,71 @@ +use std::sync::Arc; + +use client_core::error::ClientCoreStatusMessage; +use task::manager::TaskStatus; +use tauri::async_runtime::RwLock; + +use crate::{ + state::{GatewayConnectivity, State}, + tasks, +}; + +#[derive(Clone, serde::Serialize)] +struct Payload { + title: String, + message: String, +} + +impl Payload { + fn new(title: String, message: String) -> Self { + Self { title, message } + } +} + +pub fn emit_event(event: &str, title: &str, msg: &str, window: &tauri::Window) { + if let Err(err) = window.emit(event, Payload::new(title.into(), msg.into())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +pub fn emit_status_event(event: &str, msg: &T, window: &tauri::Window) { + if let Err(err) = window.emit(event, Payload::new("SOCKS5 update".into(), msg.to_string())) { + log::error!("Failed to emit tauri event: {err}"); + } +} + +pub async fn handle_task_status( + task_status: &TaskStatus, + state: &Arc>, + window: &tauri::Window, +) { + match task_status { + TaskStatus::Ready => { + { + let mut state_w = state.write().await; + state_w.mark_connected(window); + } + + emit_status_event("socks5-connected-event", task_status, window); + tasks::start_connection_check(state.clone(), window.clone()); + } + } +} + +pub async fn handle_client_status_message( + client_status_message: &ClientCoreStatusMessage, + state: &Arc>, + window: &tauri::Window, +) { + // TODO: use this instead once we change on the frontend too + let _event_name = match client_status_message { + ClientCoreStatusMessage::GatewayIsSlow | ClientCoreStatusMessage::GatewayIsVerySlow => { + "socks5-gateway-status" + } + }; + + if let Ok(connectivity) = GatewayConnectivity::try_from(client_status_message) { + state.write().await.set_gateway_connectivity(connectivity); + } + + emit_status_event("socks5-status-event", client_status_message, window); +} diff --git a/nym-connect/src-tauri/src/main.rs b/nym-connect/src-tauri/src/main.rs index 9eccb6151b..6540fa94f4 100644 --- a/nym-connect/src-tauri/src/main.rs +++ b/nym-connect/src-tauri/src/main.rs @@ -16,6 +16,7 @@ use crate::window::window_toggle; mod config; mod error; +mod events; mod logging; mod menu; mod models; @@ -40,14 +41,16 @@ fn main() { .invoke_handler(tauri::generate_handler![ crate::config::get_config_file_location, crate::config::get_config_id, - crate::operations::connection::status::get_connection_status, - crate::operations::connection::status::run_health_check, crate::operations::connection::connect::get_gateway, crate::operations::connection::connect::get_service_provider, crate::operations::connection::connect::set_gateway, crate::operations::connection::connect::set_service_provider, crate::operations::connection::connect::start_connecting, crate::operations::connection::disconnect::start_disconnecting, + crate::operations::connection::status::get_connection_health_check_status, + crate::operations::connection::status::get_connection_status, + crate::operations::connection::status::get_gateway_connection_status, + crate::operations::connection::status::start_connection_health_check_task, crate::operations::directory::get_services, crate::operations::export::export_keys, crate::operations::window::hide_window, diff --git a/nym-connect/src-tauri/src/models/mod.rs b/nym-connect/src-tauri/src/models/mod.rs index cde0deed96..fb43877675 100644 --- a/nym-connect/src-tauri/src/models/mod.rs +++ b/nym-connect/src-tauri/src/models/mod.rs @@ -2,6 +2,8 @@ use core::fmt; use serde::{Deserialize, Serialize}; +use crate::state::GatewayConnectivity; + #[cfg_attr(test, derive(ts_rs::TS))] #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] pub struct ConnectResult { @@ -25,6 +27,35 @@ pub enum ConnectionStatusKind { Connecting, } +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(rename_all = "lowercase"))] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "camelCase")] +pub enum GatewayConnectionStatusKind { + Good, + Bad, + VeryBad, +} + +impl From for GatewayConnectionStatusKind { + fn from(conn: GatewayConnectivity) -> Self { + match conn { + GatewayConnectivity::Good => GatewayConnectionStatusKind::Good, + GatewayConnectivity::Bad { .. } => GatewayConnectionStatusKind::Bad, + GatewayConnectivity::VeryBad { .. } => GatewayConnectionStatusKind::VeryBad, + } + } +} + +#[cfg_attr(test, derive(ts_rs::TS))] +#[cfg_attr(test, ts(rename_all = "lowercase"))] +#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)] +pub enum ConnectivityTestResult { + NotAvailable, + Success, + Fail, +} + impl fmt::Display for ConnectionStatusKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { diff --git a/nym-connect/src-tauri/src/operations/connection/health_check.rs b/nym-connect/src-tauri/src/operations/connection/health_check.rs new file mode 100644 index 0000000000..3f401933a1 --- /dev/null +++ b/nym-connect/src-tauri/src/operations/connection/health_check.rs @@ -0,0 +1,26 @@ +use serde::{Deserialize, Serialize}; + +static HEALTH_CHECK_URL: &str = "https://nymtech.net/.wellknown/connect/healthcheck.json"; + +#[derive(Serialize, Deserialize, Debug)] +struct ConnectionSuccess { + status: String, +} + +pub async fn run_health_check() -> bool { + log::info!("Running network health check"); + match crate::operations::http::socks5_get::<_, ConnectionSuccess>(HEALTH_CHECK_URL).await { + Ok(res) if res.status == "ok" => { + log::info!("Healthcheck success!"); + true + } + Ok(res) => { + log::error!("Healthcheck failed with status: {}", res.status); + false + } + Err(err) => { + log::error!("Healthcheck failed: {err}"); + false + } + } +} diff --git a/nym-connect/src-tauri/src/operations/connection/mod.rs b/nym-connect/src-tauri/src/operations/connection/mod.rs index 8c3449909e..171d07cd83 100644 --- a/nym-connect/src-tauri/src/operations/connection/mod.rs +++ b/nym-connect/src-tauri/src/operations/connection/mod.rs @@ -1,3 +1,4 @@ pub mod connect; pub mod disconnect; +pub mod health_check; pub mod status; diff --git a/nym-connect/src-tauri/src/operations/connection/status.rs b/nym-connect/src-tauri/src/operations/connection/status.rs index a5f613a386..7710524fb5 100644 --- a/nym-connect/src-tauri/src/operations/connection/status.rs +++ b/nym-connect/src-tauri/src/operations/connection/status.rs @@ -1,14 +1,12 @@ use crate::error::Result; +use crate::tasks; use std::sync::Arc; -use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; -use crate::models::ConnectionStatusKind; +use crate::models::{ConnectionStatusKind, ConnectivityTestResult, GatewayConnectionStatusKind}; use crate::state::State; -static HEALTH_CHECK_URL: &str = "https://nymtech.net/.wellknown/connect/healthcheck.json"; - #[tauri::command] pub async fn get_connection_status( state: tauri::State<'_, Arc>>, @@ -17,26 +15,30 @@ pub async fn get_connection_status( Ok(state.get_status()) } -#[derive(Serialize, Deserialize, Debug)] -struct ConnectionSuccess { - status: String, +#[tauri::command] +pub async fn get_gateway_connection_status( + state: tauri::State<'_, Arc>>, +) -> Result { + let mut state_w = state.write().await; + let gateway_connectivity = state_w.get_gateway_connectivity(); + Ok(gateway_connectivity.into()) } #[tauri::command] -pub async fn run_health_check() -> bool { - log::info!("Running network health check"); - match crate::operations::http::socks5_get::<_, ConnectionSuccess>(HEALTH_CHECK_URL).await { - Ok(res) if res.status == "ok" => { - log::info!("Healthcheck success!"); - true - } - Ok(res) => { - log::error!("Healthcheck failed with status: {}", res.status); - false - } - Err(err) => { - log::error!("Healthcheck failed: {err}"); - false - } - } +pub async fn get_connection_health_check_status( + state: tauri::State<'_, Arc>>, +) -> Result { + let state = state.read().await; + Ok(state.get_connectivity_test_result()) +} + +// Start a connection check task. This should return with an event within one minute, and update +// the state. +// Trying to run multiple concurrent connection checks probably works but is not supported. +#[tauri::command] +pub fn start_connection_health_check_task( + state: tauri::State<'_, Arc>>, + window: tauri::Window, +) { + tasks::start_connection_check(state.inner().clone(), window); } diff --git a/nym-connect/src-tauri/src/state.rs b/nym-connect/src-tauri/src/state.rs index 774e787cdc..949adfe8dc 100644 --- a/nym-connect/src-tauri/src/state.rs +++ b/nym-connect/src-tauri/src/state.rs @@ -1,6 +1,7 @@ use std::time::Duration; use ::config_common::NymConfig; +use client_core::error::ClientCoreStatusMessage; use futures::SinkExt; use tap::TapFallible; use tauri::Manager; @@ -8,17 +9,46 @@ use tauri::Manager; use nym_socks5::client::{ config::Config as Socks5Config, Socks5ControlMessage, Socks5ControlMessageSender, }; +use tokio::time::Instant; use crate::{ config::{self, socks5_config_id_appended_with}, error::{BackendError, Result}, models::{ - AppEventConnectionStatusChangedPayload, ConnectionStatusKind, + AppEventConnectionStatusChangedPayload, ConnectionStatusKind, ConnectivityTestResult, APP_EVENT_CONNECTION_STATUS_CHANGED, }, tasks::{self, ExitStatusReceiver}, }; +// The client will emit messages if the connection to the gateway is poor (or the gateway can't +// keep up with the messages we are sendind). If no messages about this has been received for a +// certain duration then we assume it's all good. +const GATEWAY_CONNECTIVITY_TIMEOUT_SECS: u64 = 20; + +#[derive(Clone, Copy)] +pub enum GatewayConnectivity { + Good, + Bad { when: Instant }, + VeryBad { when: Instant }, +} + +impl TryFrom<&ClientCoreStatusMessage> for GatewayConnectivity { + type Error = BackendError; + + fn try_from(value: &ClientCoreStatusMessage) -> Result { + let conn = match value { + ClientCoreStatusMessage::GatewayIsSlow => GatewayConnectivity::Bad { + when: Instant::now(), + }, + ClientCoreStatusMessage::GatewayIsVerySlow => GatewayConnectivity::VeryBad { + when: Instant::now(), + }, + }; + Ok(conn) + } +} + pub struct State { /// The current connection status status: ConnectionStatusKind, @@ -31,6 +61,14 @@ pub struct State { /// Channel that is used to send command messages to the SOCKS5 client, such as to disconnect socks5_client_sender: Option, + + /// The client will periodically report connectivity to the gateway it's connected to. Unless + /// we get a status message from the client we assume it's good. + gateway_connectivity: GatewayConnectivity, + + /// The latest end-to-end connectivity test result. The first test is initiated on connection + /// established. Additional tests can be triggered. + connectivity_test_result: ConnectivityTestResult, } impl State { @@ -40,9 +78,40 @@ impl State { service_provider: None, gateway: None, socks5_client_sender: None, + gateway_connectivity: GatewayConnectivity::Good, + connectivity_test_result: ConnectivityTestResult::NotAvailable, } } + pub fn get_gateway_connectivity(&mut self) -> GatewayConnectivity { + self.gateway_connectivity = match self.gateway_connectivity { + c @ (GatewayConnectivity::Bad { when } | GatewayConnectivity::VeryBad { when }) => { + if Instant::now() > when + Duration::from_secs(GATEWAY_CONNECTIVITY_TIMEOUT_SECS) { + GatewayConnectivity::Good + } else { + c + } + } + current => current, + }; + self.gateway_connectivity + } + + pub fn set_gateway_connectivity(&mut self, gateway_connectivity: GatewayConnectivity) { + self.gateway_connectivity = gateway_connectivity + } + + pub fn get_connectivity_test_result(&self) -> ConnectivityTestResult { + self.connectivity_test_result + } + + pub fn set_connectivity_test_result( + &mut self, + connectivity_test_result: ConnectivityTestResult, + ) { + self.connectivity_test_result = connectivity_test_result; + } + pub fn get_status(&self) -> ConnectionStatusKind { self.status.clone() } diff --git a/nym-connect/src-tauri/src/tasks.rs b/nym-connect/src-tauri/src/tasks.rs index bc632c7ef3..10ab862f8e 100644 --- a/nym-connect/src-tauri/src/tasks.rs +++ b/nym-connect/src-tauri/src/tasks.rs @@ -13,7 +13,13 @@ use config_common::NymConfig; use nym_socks5::client::NymClient as Socks5NymClient; use nym_socks5::client::{config::Config as Socks5Config, Socks5ControlMessageSender}; -use crate::{error::Result, models::ConnectionStatusKind, operations::connection, state::State}; +use crate::{ + error::Result, + events::{self, emit_event, emit_status_event}, + models::{ConnectionStatusKind, ConnectivityTestResult}, + operations, + state::State, +}; pub type ExitStatusReceiver = futures::channel::oneshot::Receiver; @@ -87,34 +93,6 @@ pub fn start_nym_socks5_client( )) } -#[derive(Clone, serde::Serialize)] -struct Payload { - title: String, - message: String, -} - -impl Payload { - fn new(title: String, message: String) -> Self { - Self { title, message } - } -} - -fn emit_event(event: &str, title: &str, msg: &str, window: &tauri::Window) { - if let Err(err) = window.emit(event, Payload::new(title.into(), msg.into())) { - log::error!("Failed to emit tauri event: {err}"); - } -} - -fn emit_status_event( - event: &str, - msg: Box, - window: &tauri::Window, -) { - if let Err(err) = window.emit(event, Payload::new("SOCKS5 update".into(), msg.to_string())) { - log::error!("Failed to emit tauri event: {err}"); - } -} - pub fn start_connection_check(state: Arc>, window: tauri::Window) { log::debug!("Starting connection check handler"); tokio::spawn(async move { @@ -124,17 +102,22 @@ pub fn start_connection_check(state: Arc>, window: tauri::Window>, window: tauri::Window>, - window: &tauri::Window, - msg: Box, -) { - { - let mut state_w = state.write().await; - state_w.mark_connected(window); - } - - emit_status_event("socks5-connected-event", msg, window); - start_connection_check(state.clone(), window.clone()); -} - /// The status listener listens for non-exit status messages from the background socks5 proxy task. pub fn start_status_listener( state: Arc>, @@ -169,21 +140,19 @@ pub fn start_status_listener( mut msg_receiver: task::StatusReceiver, ) { log::info!("Starting status listener"); + tokio::spawn(async move { while let Some(msg) = msg_receiver.next().await { log::info!("SOCKS5 proxy sent status message: {}", msg); - if let Some(TaskStatus::Ready) = msg.downcast_ref::() { - handle_connection_ready(&state, &window, msg).await; - } else if let Some(_gateway_status) = msg.downcast_ref::() { - // TODO: use this instead once we change on the frontend too - //let event_name = match gateway_status { - // ClientCoreStatusMessage::GatewayIsSlow => "socks5-gateway-status", - // ClientCoreStatusMessage::GatewayIsVerySlow => "socks5-gateway-status", - //}; - emit_status_event("socks5-status-event", msg, &window); + if let Some(task_status) = msg.downcast_ref::() { + events::handle_task_status(task_status, &state, &window).await; + } else if let Some(client_status_message) = + msg.downcast_ref::() + { + events::handle_client_status_message(client_status_message, &state, &window).await; } else { - emit_status_event("socks5-status-event", msg, &window); + emit_status_event("socks5-status-event", &msg, &window); } } log::info!("Status listener exiting"); diff --git a/nym-connect/src-tauri/tauri.conf.json b/nym-connect/src-tauri/tauri.conf.json index 96cc9f0fa6..0335f391d3 100644 --- a/nym-connect/src-tauri/tauri.conf.json +++ b/nym-connect/src-tauri/tauri.conf.json @@ -68,7 +68,7 @@ { "title": "NymConnect", "width": 240, - "height": 635, + "height": 480, "resizable": false, "decorations": false, "transparent": true diff --git a/nym-connect/src/App.tsx b/nym-connect/src/App.tsx index 3b3295ccd8..9d57dcf4d8 100644 --- a/nym-connect/src/App.tsx +++ b/nym-connect/src/App.tsx @@ -1,17 +1,15 @@ import React, { useEffect } from 'react'; import { DateTime } from 'luxon'; import { forage } from '@tauri-apps/tauri-forage'; -import { ConnectionStatusKind } from './types'; import { useClientContext } from './context/main'; -import { DefaultLayout } from './layouts/DefaultLayout'; -import { ConnectedLayout } from './layouts/ConnectedLayout'; -import { HelpGuideLayout } from './layouts/HelpGuideLayout'; import { useTauriEvents } from './utils'; +import { AppRoutes } from './routes'; +import { Connected } from './pages/connection/Connected'; export const App: FCWithChildren = () => { const context = useClientContext(); const [busy, setBusy] = React.useState(); - const [showInfoModal, setShowInfoModal] = React.useState(false); + useTauriEvents('help://clear-storage', (_event) => { console.log('About to clear local storage...'); // clear local storage @@ -25,16 +23,16 @@ export const App: FCWithChildren = () => { const handleConnectClick = React.useCallback(async () => { const currentStatus = context.connectionStatus; - if (currentStatus === ConnectionStatusKind.connected || currentStatus === ConnectionStatusKind.disconnected) { + if (currentStatus === 'connected' || currentStatus === 'disconnected') { setBusy(true); // eslint-disable-next-line default-case switch (currentStatus) { - case ConnectionStatusKind.disconnected: + case 'disconnected': await context.startConnecting(); context.setConnectedSince(DateTime.now()); break; - case ConnectionStatusKind.connected: + case 'connected': await context.startDisconnecting(); context.setConnectedSince(undefined); break; @@ -43,40 +41,22 @@ export const App: FCWithChildren = () => { } }, [context.connectionStatus]); - useEffect(() => { - if (context.connectionStatus === ConnectionStatusKind.connected) setShowInfoModal(true); - }, [context.connectionStatus]); - - if (context.showHelp) return ; - - if ( - context.connectionStatus === ConnectionStatusKind.disconnected || - context.connectionStatus === ConnectionStatusKind.connecting - ) { - return ( - - ); + if (context.connectionStatus === 'disconnected' || context.connectionStatus === 'connecting') { + return ; } return ( - setShowInfoModal(false)} + context.setShowInfoModal(false)} busy={busy} onConnectClick={handleConnectClick} ipAddress="127.0.0.1" port={1080} gatewayPerformance={context.gatewayPerformance} connectedSince={context.connectedSince} - serviceProvider={context.serviceProvider} + serviceProvider={context.selectedProvider} stats={[ { label: 'in:', diff --git a/nym-connect/src/assets/help-step-one-legacy.png b/nym-connect/src/assets/help-step-one-legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..5e91a29cffe020f951bfe5a752a4e4d0aa76b008 GIT binary patch literal 14403 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 QH2?qr07*qoM6N<$g8v&Kn*aa+ literal 14403 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ð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

    i7oJlPE&Nq*U_W;o}Y=vp5lP^QjkUnEpPy zvA7pU?jdklnqFJ_+J#k!iux`sXeXaEDJj;30FmzjQ03lz4Y>e!I8lHrnB|oq;0+fl z3=#q2QRl|Sz#0V4ns(6pg~(I5#P{^B7MRAvaQ?a45o~_xzU#YDx<|5N8Ypci1JnNz zI`g8*Z6jNvdRjZGwC-SQGIMNhqY8s>WZ)i5zbLS85Ias;Tg#kjlWB)d`Pig-(Ru9a z29$v4z5#Mq6`!umFtc!5Sk zg*IAn?<_*W4qEm!gkmp&()icS~eZlh!;5lTEi^%(LEUA1hg22rJ0t~`X3 zKZOq&(-8kECDO|6q>>%O!NM!+FtYUNjBg9F*r>(f2wcG$mxgQShJs#{te~y4Y4?rU zn&rjtP`*dDL4Yd?%uUoUSlDiJH~iMv%F_eh&)%?i{D9~MPg5Ybl+G1;qD}4cbI9W` zuQ4xZs<^sz;{$s*zXyqsM1-fS4M(~qtCTk6$HId*|3r$sZ4N=xK;d zPesTOm25eqA0raVP|;igVSAnQC+mQ0D)9DAYzsZ>GTdh0ESV~A(=o@s8gusG!?3WK zYLG7{9VZJvUuNkkhS*|HeH?-;kPz(2t|_ktoT;v5Dx7!@vgA4n>>gAhDJ+_nbu9mc(IMXirt z+T-jdy_zGPd1f7sgJdbod>xcT9m!5fnPOZ&pH4mK%@Js*mqTn0hAUKO#RA-TEVTZ! zOKp4|E+Q|lDz5*mCAf^KW6}60)5}m#p+R{XB?RKqVLNMJ?MUj2eV_^HznA@VW<8;e zDUE62e==Uq#x{98t&xp}Z%tB5`Sex;tG zmT3koAiw)binbE`k(OCyXpp~?45J08G<^>Zm^8?>xjT9}aVZ6)2DQDn`z0ZaFPmwh z$q7F`FJ;6_4v)d!i8KvEsBc4`xZKY;{}v@89lN|f^M1wM6@6+}dzUnoD1>|MWZ_A` z1UaQ+bYU6psWV!7GPzm>0IG8c@Kc(Ta5Yn z7V0PPcOzEzT{|NW9JtT+|~xi`wHawpz;6vC!b)0ED)-k2KJ#*Ag4xhYl) zT&a8Xh%DiUq*P6$a+!}0qyB;MQZ)8xPBLjJiFK*{3m?f;8>QI(40*R}aV2qu&bND1 zf<6}CWVbgn_qH-JnQ)h^)t4g-Co1NjZH`|itFwQ2hmE}fscv9WDSN0Pc~$vPmR*|t z*R9Jk3i8R1!zZIIU0w;U^mgAWxp$K!1ZeOi?yaRc5IE@{0X9PEa$~S#tr&;Mg8cSJ zcoVoN9hx)z+0Gbcnt7d3jc0e5=4PB;=^I-96axb2rqF0Pnd}AZ2uTnWu}Euxv`G*# zB{L`_inLtCadB&BF5EBdHU82X&KQO+b%7t6n=#X+tQ}hn?hLOAbC?8c2i0&T8HIE? zN^Sl@{>P|mS+`}t0PWu`1Hr#dr<88&W*Js^VUH=>F2$lbp|lwKcWInX05UKX27XnU zD*_!6IM7JPN)IEP?>v%k5ZX-8lfv$#v^-MUm!lG~n(4rLn3dV?HRi(MV{6p9TxwOz z&+zK>M60|qXW#%~c2Ewu<3xrjX0E?Ed7c~aknAcg_jw1119TPB$;G5~?4|kLh5TDJ zp^##=FG#-s$qPKZ%i&eY!0JYPTNORv1!$mI(W(4DY1EtWTC8@ot@nylL@mbCEf9NR zrJ3;$oW(#jf2=ur&XlYK5&?+ac&P@KkTallpV5;TmtZWZ`UY?#0g=%R7+%Eb*#L1s zj=!ttOV_x;1WASL)LaAZ`fiJi2(X@3IO|jCuJ_;(!&V#0b`vl*C(nve*KD4-q3UWU z>N@LDYaFxagE3c0R5n%$FCs3P`x3<7BIFbctF_N#$d22}y z-58NgcTT=_hopiY;{wBbWQ};f=c$SulWKa<8A>5UJv*pC0HMjV43|uU_n385(`if6 zQP(IG6X`_(HW@?@g};mY!F!<3#rZU&EH1DJ}KHNSpw*!AX zW?rG0<$T_4B+C89Nsl(L1J=+!xg&cod&Q3e3z88@fFe~b z7|B#E^4J0UibU_L*~${xJ_hn1FoiogX|563S(zZ+=EXnMoM zHiAt81$D$N7qG0u2o$Go(?!dk*)TIul$F-?K z1kpfB*Sax{tWuMh9vW->L&UTJ{tz)?5VUU+8&F_kzU;esUkZV7#M596Wb* z{v+pT%aPeB^pjF@O=br5>LAcF{>TbzgXG4LsDgJN37NuN7wQ=Idz#W}O6tlglc1wQ zRugiTpiD!!on9x{&9)fVUtiF2;8K)I2sm>Y$D7a?QgU)Q1s^Skfq&tVU$$&rh&=b| ziS=tj(PhhMlWqt@Pq>j#5ODpO_7uFH$L4II+0GZf2j)=VU;mUxSrOY>vb+(HSNz#F zK14DD!~3jd>~mwlq>7$%szbP z7y~{;NNJJMU6@KrOy0RX2t0y;aGWyYbYGpSXS>5nC#30&2|R_lijekG^N&{{+z{Bg zCaHF_a4Zt)O5Qca5rLWH+W8Sh&TDilRj~FBP7cZt>zlw8__b=e1}?%Ob*fKpmj@0S z6VAIy=6Hl%9E~$3t5j4y`^YOwG zPa|*Dzb=?-5L}B*EyNP+%us$3i7|whP;`jz6qyc*g8?WG9dF0h)+2R6%ph@G(#Q7q z$xevUAoJA$vAq~rwAz@cg3SRvpDdy>1y70vS2ki?$9_G<9g%4XWqQ6#!A)9YzSJI8 zzTdH-*~0=?oqv`c>3tiSdxv=)-k?9Wv3b;j=@5jRnzKY0_m5)KxawhY8($y`r*#%* zC6ur~m?x?2neWBrw*x8JzJOa?>ww)TM>Zw!SNS8&6sHCB@+l*FZbchOH1I_5Xn-B| zlP^*YFQV90$V``x@@wU*_oufFVv2|1|M&KDx7s8O890omyS zN&slATtqcVs~C`>pbZqmPnC&sl{fc z8SqW)N^^ad``oO7*qJ3+6*%i_wO5IBzJm13&$$igkC z{)hJ&Z;n@!+bD(H(rMat(A=(#e{ttD`x(y;ESl8RCKbxH-d=mAZZXX5I^RDs@cs>v zWY^Wc-72KHy`rcCqbQNckMZ$exK=PB&2o@u}u*+RY%#Rh0lf~8nKZcNSjq!V`JP;^*s-fXlL7s z0Rc|D^02i(Nlq_)`QkI%9;QT;Zj$Lw6Q|e@sV}Rtd4SbQiKE8g(*i+~6^Z#BaZ+)d zim`B9EaZ^t9pMc3QiYQBCK6|bZHjqaNv77vYkJ%+qpugK$jQdwwCPr~{MSKgE&dp| z03kw{gS?B8O~&nAdhy_mLBpIc((pZ82iQ!0molP9#_~{stq%Gl3Tz0k5QE~}`$rvK zsfRxFM=WwO3O6>C7OZidGYV12_qv!GJm-B`Y*4|#zz&1`3R`G7q8@{oT;`l?eU6f< z?1>T5eh77^h~O`4rj)p3Ya$Sk>OE%=kXm*ehF1jhwA#gC0alh7RG0dIN$CGJnzioQn`othv*83dW?RAbuDpCI7~y#As!4x5vUw zB-fnnsE>g>(~XPKN*@2M4N>l?Qoc&ccP)FTPFZ@e^gnV<8bdZG%V#|%*sR4>kZ{-q z>A9N%HJ@>k@FfDwE6n!IOH=2NY{5qEdQs&ft)#*D}1p4pL;L2n(~q; zz|9@y#-7BUJwgDojm|+5V*ou_yhJagmVlw6wKcUz3f)R-Hq&!hs~4v;sAeC3yeq^knNOBxZ)30nuTA5NOzj@efd@KU8%su|fO1*LMMr4*AISXAHrA^K zh5*Y$cJl_+v=T7bXS7LmJdDC#V-bBnMZpm{w5|jw0-Rg9KN=560Zr*FW&n*1MkWE1 z=>ZjA+pK0&9x6c=3oXa5v!Fv30wQbVO_OB>qGes(S*%yveZtl`6=HS&K^nO=X=bz2 zw0w8@z|F-#jA^d$)`j)00p2NZ19Fj%f=Rh{A7&~bpjh1(>?ftCCJPjZGKc#(yw)Kb zrcOY96WZ6g4A_oT|A8!EClz~fNdvwTX@_A zJU7CTqhfYrbK2R-Gxx|+ouBO|-uV|NW1=(&n`vd2_T8&0-X}?<_@7%U&I3;OwmL$h ze%lGZhjw8cqF&6D0(q1)0N*XVKQG!e(h zb%^#>Yzhhh1fE#gj@}Jd--*y8CnT`ep^ZGYHf2JNW9+$9vBi%NcQgMc^>lo(Gk2gC znBIhKOFXIAXmO$&Kgnbd{rb#BIO-K?ieJ0O)^-AOG}u$3E?RiMbZ)DsJj3bW_TI)s8$+ z*)%wJn;+ber9foHFO(J`du~Lgf5rJM_OsLh{>^AxZceg*rzm9rRfR<{@^+|uGU7SU&l1%$pSELoZ zh?QWVE{I#;`p^Crog%v0LVvakiqOC3B+8Twqsxqg`nCc8dVPFon-BR4H!yF_u4gBy zICN|i!3~p0+{)G3E8epCHbJFC^83z;Ptbf|v!jr^YfPRyl|P{8gg>-UYTNt}!OowS zGGuhd;Jc_uE;s*$1Y|J_5IU;BHP@MN(!fU)QcOwTOb*quspB@3HF*5W?|_aV3(d`R zO6fTSC|=xvHKN~?@Z@~-vi7V_*vBwEPq7j6(cR1gc-TVh`1~`0i42Bb6{tiigs#1z zX)x32;_>GCk(89OIz>MgvGb}d6qbju0s1FTFRpJvgI7bd{^TqNXU&UolO~!sj>Sp} zF}8Pupx)c6Qv``4$1rHJoKz?Yt~bfMMiIT~uCRvP{~YpGypJHy4DgTCa$)8aBuT;h z%3|l%Puo*&f(A_p;)Y|>AvlJ}Y?(C*OC)u)-o-~C$%s2wkF-YmO z^LB;1v$uqx2i{t05=g($AKMqBl?f#J*G%0P})| z+JncjO^`WP`A@nVh~H1T=H)8$D!b|8V?~*B0>kW7B}FHoDW$&rcHD7XeZik9*xy#r z6Jjb5TV7z$>0g&UU>H|8oH<}Rk04^_M;W2($UKhA<*VQA1d)C?@E5hqu+IEzV>3 zgoUAu{-<^y9MMtB9=xHEz(-#gEPRQtJO8>iR=$?>^Qy(h32rV-X;)$b{=}RuH7$c7e z`O@}>-A{$dO+7(MVYf`15Zsc(+X_+xWUA}`Q?ov1sBpO;6U`kj;10=Q7C@R9;t{{1{&spS`UOMmJ*fs?a*yvr*y10+l#zxRYO3Iz;ZgybxkjZQ3% z626vys9?9pCB6vOnq=@5V`GySFNSvJT4wUMXRN_h00W?Ijm3Rrw@xic|H{N{mlGMn z^dL+!n`rokZOH7e>%2{X2Bk_gfg2EC&;zkHT*CuwiaU6#h_*U37t95#p_tNwk^{D? z^aI-!)~D-1ow}NzBnfJ3p)Hq>+Q@IdRYKV*WI=JgyXnO?!an3?NLIq&& z;)~gltJg3GbdmL^G*1XsC*)eGvOw3yyPFA7^>+zkF${v_j2m4W@UTC0t3k0E%ok>; zR8X)D*4v2XhZx@{y#Vo&bKte{uPt(QvSEY3W1p$iS^vLf(LiOn9%8h;YlrNcoRwst zTIK|Dpv-KBcf3gZMgW9Zyc==TQD;VFY(xeD5?iYm6Fl*sXcj)M&ZUA zZRaT^JaDN>oiD?x->Ve8{EFl+h@P9mDml}cbw|=8YPalTC=mZ~c)`#VWfwd0dR0mN z1(N0UjYl0tlL5z54tC+>XPkoAh9lRD_MU^8yg2)@Aonmyd-ATwO*WOU#bNNzy$E$= zl*hLY5lInAANOC`q^Mfr?e_Bp&91*W+et#)fqjOgdKT`0C;I!ZXJW%if0d~mV~6nD}sjjB43V{|@e0Gi|64&O3`Nj>wk3`|);Z8ePCO^XN8sKzsePMdSMZ_`>} z7F}g`?9nuS6G=R2if?7m-YQ)VeYL6Xi6RN~Sk3(2lYIo&;+;VQFT#BpU4YLx7*D3L=>C7w(g78MhpzWR*xNNg8^*tdaqUPSuJLCKNOYG{MD zMKv##t*Qkm<%P*iv_kolrRd-ms14`L%7PUtXRY8f6$$iB7B*sk*&KGP?{lqphb>Fy zDu8%e*m%PrByw#`dYSgnVc%oOdzR5#sl6O+OjyboFto?&xiAybD4D8|JG@xaNd3|b zF@;!+>ls7g+xv1V+mR;E9+X3t#jR*vJ6I#G6(nz=v$wLQy67c0L%g}vW6j_&YNu!g z)?_0}fLORAa*?<|qeeM1wa9g6I#iOwMsp|*$6V7U_+4kM`&mrlKsWRa*$(+0?L@5Uvg(4o;qB`Wzysz!O0C`K}ah_L?97 zY4(D{5Ouuk`*!#cF~$imW8#Qn&_)XK z6aCX;z4{FKj9s5dOoZ0zz98r#Bvg$=VE?3)LlL^2e`TP2J0y!yHmq1vY_U(3=u%<^ zQ>;f8O3sCsG+g|P9GL9LZBb^Q(AL3a$`_%xsK>s24*2oYnuIB~oBQ0*>w)S$ksi{c|G|J(6p!pb(lQPx4nR zpfM-4_OjTo*TpU&;Qwtc`2bbt`olIuw!L0cRODSsb0^6NcZvz_s-SIORXj4NfyAlI zezud9E?lH3QD^1tX5^bx=`eP!V^Zw|SEiU{MG2`Sm3rL>-Lqky$)4{-#Qdg~nm2uE z5#UM~@YvFGCU$E>Lk3(g=d2>iHkoUFH{MB+AAX+E<$i@!PN%#hYTvWWFGno(cVL{U zmKFK3`SjU*je)=aP{*V*9c?9-#ElTGEz=CbmSxlP<)XD1gI^tp@LS;~c=iRFIVGG9 zS?@XD<$1wigrEnG?!WLD!fb3s5yMqCm$V&!uGYBH0bk5*p z-Tl?-Hnf}LZSkGZgp|Ynzw^f8^tyT$pGle3VX&xIhsE4Y(QL#ROCMf@d&>JF9?F6B zVH!4FC@wZJW^J*?*d4X=34v*u}l8&~yN5WR7a z;qGHoM#h!skHm0qFCsh8WI1CWJqzaRw~pLqq}|}Y?7FtUO6WqKteWnI5^>*;H|bZj z+NJ0#Dv+a5+{1~nu32rydvn`NsuDWEZoi7=+Y+58<+^tBIS8+LMj%jW&&{vKTe*Gx zo5gX3^6YI1xezz>`Qt^^&66#G)y=#wPN1P+@C`%|Hc>oluK8%0B&;0Au)2zBjKV&; zF?p3=>28KodZ0h0yBPhv35pCgbl)B^@`Ba+JidPafrxZJ@`Fxp6`BV+H`||Qm}@%` z$a<#8N*ad8G8RyF=O4w#@9iCluvtsA&Jf_Z+g#pDVk6VKhZPe2s*ob<)`y=w`+w65 zL#?VdABs97W?qu|V5&GozA|`cBDflT=$KkPdVrAYAAq4D?%`X3>?GjfNCPfzE!MC{ zPV3hW`N5S{12U)lW0I{`aED+%>|>&gzE0w$HZ=RS8UbX?Yq1-h+Z--pg7n1)uNQ4n zc)w}yXlj|eY&wZNp6R8>H7(C|eZ5ce(s3`&E1!`2(8GsxDAS_4>z)LcQ7YH|J6!VU zV<$dBnU8{$u-cNo>b2DeFr`Szl&A%y+!W3-TT1Zq%Jt30nI+ix zA6*{#TQ6`Jb)gh=zgw2v1G6vOV@?zEo?r?f;7Cz{a^t8{_sr2M^)d~{(V2E4nr>n zBnoK%Q}s%iA{|^;_B%RT)uyTrBVCW{<>&(YT}>f>sQbn^Yqmd_DXhCVdgUpyZ^Rxv zX~nIRI;z^&y`}n~pS|Xgp}~sPEC6|6+XfC`Uh}J);Wnj?)rPkEKdJtA*(LpXXOX~_ z(9T1>-o?Pl2ou#s8cc2*q{$ivph-)eSdXL2j)Ldg+z{~19)Gvzaq7&y5;ZYSyQJ6U z8>IeE?DIOqe3;xbr`ds0P_|$Ag+5#kZ>Qj5=V$}(zPFm`8gN9z4KhORvI5#G^)tD8 zIdwd^P`$aw>SH%fa{lb}Y8=<}pm6UL>*9>dRc>90j+se3@2flP(aW${+83R1%sePJ~oZP0fQ7-SOiDNs@Z?!Ur~Bx&Ad^-Xr%LjrgOMNI@j6 zzYGFtyzY@)=c`+bB@>TJkvh%MxfkY#-!Pe@^7pV+UW(H&?qQuJa`1+IiP6Kf2xW+| z(aasy!@G^!{`-pKuS1N5^m%!>-V~*sidT@XYlY6PjtDg{xyLysxX?E-Zha0f0+UXM zN#~54%$#-vrY*HhQNfNT@@qVqyDhxv7xCeUqp&oHGbo)xha?xS`II#IYQl^|y zX~uFvHw!^nsKl*YHm0*4>p+#NaL3Uq6kpJm;RSGS<_ci6CGQyv^6hGZR^!0z zaMKwz4S`dQK#N-0zZr`z*ASQMbCti**7c!)Bx+%qf@c~Qpp3QO_I+GFmL-RTX}2B( zQJ=*pZ&nRKKZep^ph$fgTZLD5+D~Le2A>1_4HKYQQ9W5C~-H$7h@dTJcvau4`2vYOUQx zK7Pu@*OA}m9p$V$fl@!0pAl!1SN|Fw{Rgf8+m#3FlOUKRvRxinbf@>f(@~PryfrT< zlS(bTSSGg(uYLCzU7Dp+Te(9B)_m@{MU}Z|x6$wfG?dusw z#sl%h0Q+;tBldljtfO@TNtJ%na3ocUFb8G?%3lfOtxHam4okUds*`9RUe<)`)Z#zv z+n+Z>a9{mDk$*)Ht-;Gr=0OBCDk!oKu~JaccqRl#Zs)hU8V2iNAg!H+jS_tbdF7sN zX3$mX_&e(R$F$m=%M>StibCIua0`cMlNHvv`5d);Dy9tncVVObE-Zfx>mDLi3Lz!B z_%<+o-Lz)F0!D7>OJDlIG5KGw((Vsx`Q8g-{uDsBOtF(sJJVdxia93vxzR+X;z^y2 zDOn3K4z}GDiBR~Y1Cq|{`G{r0q^Il@##-C)&)54@O(MY}_g#s#lTdn=VjfR)`TslP>Z zbj4wHgX_8$8YKQuKbs_k9hP&=#u5pSq{W5tWF`ymeyzQOS%s$(-OUSQrFTesEUvHp|7TheW1+T)VRKm+( zt~%$UrHS<6S5PIeZXK7_(!4bV%*_)I5YrkiwsuiI>q|y)pqM&+Ws>sY9K=vRsUO9Q z#`-)+ojPzthry|hZKM{GVl;VaGx+nVxYk_K+EZR&iToIB*sZb|#p87YUYiH~Z|*m- z(r40?MmPY6VT%*lX7T;p6U15Bs`3SS`W5xPLjgneG0sCb=p}AW4y)=()YQL=J=~#v#wJQ$~rETzr1-g%0fk5wws*zWzePA0pEg zdJshu_JYh_ZjC%R+<}nyyMpX2$ZXVsk{*3)1>crG+Fc)?`xz(?Y!6-%ui^(|Zc4^4=%C zD(((k-hZM#%dY~Ik?yf*5AmS$S){1}3&$y}SKqQ>*8G;8+xVE`1J42~#iUsyT%a29 zlsLR&r6+LTXF_ZlyV5txArtpF4E z-&b@W9sr#PFjU=pkFux<9=7Yfl_e$H!H+;%QTkCAjpXBO(poH#fDSP!Tc1UPYj?@4 zc@igJyW!>pWgn0alYwtmC7^%9FNbY04B=`SSMAV~HEx5}0CnYY9tV_%m7*)wLQ^Kj z=QMu=11!QG>{O#)$*Dc(k>Gf}1Jb!=-x&4sv_q(-u^{(2c?;xQbC%TvDGM1#93Sa6NBgm?9p#JsMsoOJyn0%^{QQnpmDkm zf>1V113w zy?(w9n5g{~qMn8w`CZm~d4*4qbsmbFttwQl+@P*mv_Z5{O zx;p+d^pyX*`WAP63d>P~a~d1%tn!R%I^iI?3s@dkt0>9*(s&(PN-M!39$g-k$X-+K zKIO;8P)`#affqBWy5Zfz+*{DVvH3|530-0sd=$D8S1XAqHr52!Vn2Xfm!w}!c&6+S zbKK+@=iIr4+Ht0H#w78ifqgNvaz3o)EQ8WGu&K!ZJ)oZLe>kGtfamr7ozV z;WbZ@GO-U;efJNF5C*l2A+xc*x>&yBK8?LDxrEVzSI1)1%tCIkslVZi2xepGVBq7R z!`E*|3>=sI;jt;Rdh`W!E>D0EXb2c)O#EKZjh6HKkZ$$)00)E{;d`=kshOv$F0LB1 z@ptn27pG_u(h4Va9iZUh+(SUACy1hbV~EtD!{U90k5_h!x3BjiW>`Vcz>-ABG~U`K zu!(9w*wuEI9zUb0*Hycptf87Wrt{p#^_INleQPl*?7F0B;}?A@u0nz(?h=f=lN6%3 z`2D&~yy?eEB=`m9!@(He5g7WhWOes{C5^phRZOD z^+EJ)a#S%>P)`sS_7qZ%0NFjm&^*uqT*u`%Ci z#*oL1*;~<_p56=`CZXhsK2wP~f(3Vv31Gy#;X?tv#TNpfp9t$peiNE`rVmx?ll9Gb z0Aqelja{29X0VdMffSnx+T!Mo?TWLvmQ`qFIY|{yz4sv3N09k7Vn2fMfJL)q`o&r{ z5MU{56-W@n!bR$V?5|wxgx7hxV6}6avc8&NTMp)RhiDCZB+~;)cou3NE#W^VXhfm> zBnz^2Vu)rXci6n5>hv;JLn2i^CU-Jm|J57l-L!GjIyZz$ho%(GS>^sp_Y*pj)z|z*S15?imvrw@89-DLjtGN`gafnt;W|!D zKy4_4A(9l%$)px{oDoXGH2a;c;8!6i&@a|E!6i%T#?|T?AtfMV@;DWo@`zt|PFF~8 zm0_b_OtnP^Ygi4_A$ySlF~5(yx(axsLpm1*Sq4KvVIVr2qJT3UifbA}s>ba!UCg(H zixMjtR^7Mxk_nV?a0|K9>yIfp(HEu8nPJ&8qe)KWU$z@CMwkhx^HZg!CFt;2kXx7a zklhG~oqaI>tcN4xFq@5at@9KBOzlo6FV_qX#`fH*YEJr`N=)XVZyIY6_`P8Oh70et zQ3*4CxxZ#EBn9vY)`P^8xJ6V|QJscl!vUy0=HGbP{y8m1FvL|=Dr6#eG=4>AQiGcg zF=0AZK9{P6u3Q}>A;3SJwZpa#+=yO|gsvBC&&bHLJX~{W;&Az}XAoWu&|9vGyA?*g z<%rXaa$*ZozwSbTwHs>%zpd7dScX$*dOTu1jwH`HcWn-N;9b zQ)5C($*FQ=ovR4_YXj5j*!pNkg!o`GQ38Jpy$o9+GuVoe zM-FsbLpa`V9=ydWkh}aVnymd(*42^6(yLZAVJ_XTEVXbW`1BPZ^bpj_ZGe7|YWYn2)Feb*q{c%;7H=C1o_f@hdm;fI`=OTCtyW5QcO(Zlq zjnxYUJaZwqW~6)0`5pNX$+i9chXyNd!9tY4b<)!X7r@@g0VeeB{kN+>Mk|HPG#s|UY+hM{sCur`&9^Cgv>Ikk$2sIW(gK_JSlVTxXtzp;$A zbTR2XP9${u`BwoI{8@oQ0BT`t7t9XgqVmy0yv7<0B~;tv?mCcZ~>tL){2Q@Q|4=nxaO#0XNR z8J{tTc*izvA#^n;CJ;9>MIi!FO5pn*1K_xDzvbihWHe{S^KAVz998s^bZ=w?)C%Y&(%EI10*BXI;e64Se%TxM$m%eadV|Qn>{fJczLFd> zRv%@3oz2b;AYu^|rQQpE6n~5^8IF%d7Zd(sPzpQoa6F2~A;mgMqk8%Ku`{uI{1U54zm$?tb5CyBeYw@zE=*aGeab%E(Tg!rG`! z`jNG<{Q`2p(-|OxyXpWTl@wD9Q!^hpYn#Yemfr3jXbNccmbWG7_Yi%9)?&Z}|0rzM zvn`RO;X+{3ht{cil?2pJIOy(13@>48x9+i@zHwR_+1M~@C`sd`5zJRMBl;(z5*G#<86o561e1GZwG@Nf=} zikg{9oHgA{@qZj3#(Xwi?*ys@mKG{}0mxooUHga@)7Dw^ZOrdW>Oq>YK`v;b0lwzf zDE(H_03DX=jEE8^Iu~rhB%bq#bKFPUsiz`kl>xSD3fTm-Ledl`(Y)#Y?GJ!$!kaq( zmxbHBXY)<8#hVDpkpQ1lZ+eyO=lEMtW^DD~m2Auy}1pbm_(p@eKxjs~?vC>$kdpUUr7nTy5OJ3;tn$JoFo*oSE??zi5?U ziDW$6>a<=K08GKeNjFTXH#~GSKU08_R-I6&Ll&VgIC3_9MK@Nl97uq+zAvc{Y&E5w zk>bx^uh(KAa0{AfN&uv-l{oLMCS59k$YC~zP{cpSP6>t%qzX675cTFO9aPHIZGbuu zncyhNrdVbJAEceJvuPo~Qs+m!_6=|j=w$;}Jz`n|qb{v|T{4a2Zy87zoC@L!?&=O@ z2XzPX1$cbkXd9kC8btF$!*}))+cz5Z8LDD-SSaouFzs-QU=fO&hb}lL|y{r|s!O%f)KjFHF)D^+R_`2oBzd&-ITUjm+`bzkVG=kj6STDBvCcDNEryDs6^HX+KxdP)dnA%#DI+i zhWt>clOhE&i(QCb+92P}z?Zua_%*tzu2p*P*>OZ2J)pP?(I+PQ7bcTiCUQj`#c_!f zmI_!;ZBx%tQPS4OiDAuJ&kDE&{k-4Kh*z_>Nr6MaA7)!!$Mf&?z>*{Oxxs66eYjgK z1SEv5Eq6Fz*2S3WelmMIbZzM1J|*5B9%!-*Y_3K5@Ie=0Xpl@Bg7FdE5^<1!^%Uk} zEc{~=1o+w?RH4|%|r2>rWi^icws0Gn{P;}O!p>$>bbc^+7>v?_<6!Z{k~_{ zJrF->l5nRhY`a-<{r`DsN&v=&coRzs6Zo;(nndc^7#XbSJdLTxb+CofwobB6_cD0L z*}hQn73RhcM1&xcTY_9pGaH^2^ajYmuHCw`il&imr6Oizj3173G|)(+2% zW8p#HXA?LaR3_GXy2*pW89cNsU!bo#NBOR^Xk4c+Rr-nCD6}dv_d`vgd{V8@)Tz#k zhgLjJd<|{t_3su@iQajMn`Ycey4eWihCqMzsW|J-*ep+8-zoLvnjlTTn=w^<>EaQt$p8IWqaK%s<$u#w55oNZ zYJG^7YEXuc-z#??P#n5BTf9|B3*swRaNrM^Wi)CMZQ>Log1%aLZ`B>$WV~a#$ODb! zsKs3B&EwedQQ4_I=;r&Qli>SOE3PNU9AeA*;>e<*!6z{fe{(P$KxQ#Ib}Gk7!9nLI z3hqR$Em)E`a|@$+%K#ef9;$f0P+eZ6g+h*?CXnT*4;77ur?{kz_DO>eP>z#V_M0~= zIy&TaWLj0xp~HU-PI>$93y0br0g1>^KVi_<%DPOK4Ee^> z4h+*g_lCUf&r`hKbL#CWs@?(y$?`|YO{iIQ&7Zrt2 z(yxx|jn``fzMyP(F#UP%V6&seoj>!+0rHKJ%>B%6lA%sH4OoxIxxo#lrT`)8Dbg@& zuS>f4ilt^dAp^* zGSrF?4d8*NvGx(oKd<~f=%hJMEMePzSSKN>H5HDD>3}wn#Sa*VaRL!qPP!%=5j><7 zf0TWO=h?^CUYwmtxO|bRw&VD}QxZ)}=Dqv{_PK(1kZV;~{fHW#0T+sQkd_ zkMF))+wY+7VtO7)*qsfWK~6*)8fRMUiUt*VXRnykf1dXk{zOaKz1M<%Kv({OJO%-X z*^!-@=J1K!UU;XhVfdzr=AlkQ>aPF>KIO!wX|l#fQMAAev7pPFm({jJ3w925()HBC zCrpzgX{X~ejMt;r{K>Oyww$1jIgnt-}2RnMCUdps3v4Xn}6&QuBY2N6CKcj*3Iio}6d&A?qt;`f+NMh)oX`p?Tbq$I^gc6g|*!a?Q)TM?SH5!~&g# zb&QMLeUl`*EpE=rOuS+=%2^Opn@A6ZIlLG%a)3t)f3fBK@ESVJ;L4JmBOfdwKm?F< z);vv+63^}AARmH{O)au0V}xV1AR{$|S*hQGc^_yI%<@6U&yg}ZVG~Dn_~2@v$-;%*`#rHByBAQ5;_3+ENOb#zP*ZQccH_q&L7V5pbt+#^5vI{vuX3&;;| zH(cAz$0EP9r2YO#U$~mHo6W_Xp3#RzNIISa&?onuJ%2up6>QrYdP8netPR+z{-gVq zh=XjPYOHgu50W)Af*YJK_1E}Tv*{!oIXLDfMxnT=_Us*^5gkl{+l!||)rwgV^JD*|x$bY~@!{B8u(rp`I{0@~!-jh{@U^J1E}vNM(fNH&McdRl z%nKAeu-FGbtIIC;4*VgFi*f?U4IFl4$HqKfLrd2XBEnLMLR;yisKnu)VmWfx8aN=Gl;-$$1vKG1klZ75)Xr%{<(d4CDBdvz2Niz)gN;A?I z(0R>fA*ERegp1DL@Y)xTCT24;&*&csy&CENVKSf{Ci_B|gWqa^ILgj3uW#H{?4Pwq zU*`MEvpQ@!v0u!%#p1eylMA)J)2%Ff=DMCT`{(4cSL~B71zde(Dg^T5N?ALCdX}~O zK}!iNxu5bzGHb%wV#e(?iIAUEfd08}CT=Q3s)y>)M9B*9YtA9b;FNq%PeRGp#A8=z?hb5u$DY+N)e1*li11cH z?!aR_K}h?bLfrQYqa42JdMDpob*pRD*7l{2M&Op$2Cpo6BxL-LV;m@(_{VSnMWaF& zW@C>XXE@(u(FH#K$(A<&T0o`0>LB^TPbQhzMN5U_t>05(QNmQQCDRSA)sX>o}W>468P&-g#!S zexjYi;$HAw?>$k~GEU?%eXZoa@bvHskm0s#H_1O-`79t7xmo9<5oi!uW7{C+rESzS@6 zny{=G?dI}_qXNSwM%vbNy08AmrSSrAlW9*gYfH*a5oGT!RYWfTu9$(iNrjtExI*k3 z&j%F-YX6~xPq39RS+pX^?(o&@FI2$;>aVCpc7H-Nrd*78y0CXXt;}p;*gR1O{@)F? zdnGu_9-gEP4%`+h%As5d1c#mY=PA-VS(Q(tDDy@bB z`rF0{6}7qv$Wrnn((GcI5C4=rbm-kERw4Jcw=&9a%zmP;cr%ViJoj}x5OWpdbb0vs z)yB3(bZ=4DyDXSnks_>p_QM`oe$bz8Th)LlfBdi%sbMSQVn;&3DkMbX`cr*S3VjNd z3y+J+1z)({`6oX}pk-fW)rs=@f4IVysXB=`8cL-(6GuVs_&FfH$6?xW%!e-G<05>% zXqK>}7|ipYaVtj8+*=RAY;rY4==Ta^V8Y(Db?Uxks?r*%g_9`70Phy8om>niU%F}V zHg+AFRILp2NnluBmq~7>D~Ugg2?0-_lnyT&;0LN73Kg2WC7fv`yB?IGTTX#v2~6T2xpwqhLXHB|tgQLi4}ew3Wc;D*C)*qrpB zTD{Nrnf8MeBkn>GC~RKM-LJzrspEWOPJ?grGlPZdf|Bf!oxb7z`wflf1V!Zl5RHeW z_z}=^)Ww&lBf$?UoJ&!1y;n4Q)3Vm*X^gq95DaFg)BVcxxc5O`OV9>xtsM^_DG;^X z*bq!ao%y&zv9q)l<=NQ1Z**6sBgJpY4Fbe(3l^;xMZF(hABT!_Lmlno@ozH3ub_PL zv3WR?FvD+*h&ppWpDF15-JxNQ1upg0J+}`b`v^l$1(Vx&&l*ONK3%0#y@X?r2b5v& zVb^HZoD7+RG6bxBrz!ut&=alNkq5bVy+Sv(`~QCW&ca4i>n7=W1+7U2 zN?talg9h5$`cs^&5s zTg5lEwbnD}QH29!N0bv!w6Y^nv^wEgniSCFMfM{`$=?99luSX-42SmRMqR*q3O?Eu z3Go$~by*m&3T;wA89f?KheLdVd?mi)GYe`xoUur=@ZpZWr7v;sfeHAz{UVb57^~Ex zRT)Zplr_6R{U|lqjna>X)CU=k3et6q<4%}7Rv z%@Kf!C~9N3J00KSS`JZETMkTOl@Naqm^ic1PWCn-oYmlAsFe}aC-{-q3YOen4nCHC zcvZVV2rYUmhIVx+GXYj>3`$5p;gcVWe`^4a=e#f(vJxIoBXuF$2jWQ29svBxsFP>P z%;m#6!6M3orc2u;yZ6?=3lF@L@ zQIVfGu*if7+>Ux3K)=G|XN|U0DzSsmI%mh94di|lGMp*Tr}p^k7ZFy=p3%Qvu3s<* zJ-fQ*%@IKNT|m7yQNiGrvL-{X&r6K@L*k6~z?ln=^q9qI_8{X02K`0`C{ah6 zY~zvu2}W(W$Nz^;6qcgC17Tbd8Mfc#B!`g*cbP^h=ZLeNLJX^ypU7JQmDSD5&P$6M zvZc=nVL@`kTpWO8`AvtwdxOwLDA8fLQVLt8vVYLoL|41gt^5^&haKap>nnO5!Y+#c zI~H$A|F>AFYs4k*uXbo(U4?wtypWahu`;d~r&X#3o^m}EU<4CTd`*s0XA zVFg)=uTFzx*`?sm*(aN{NIjH`GB}bd`o%KQ={kQ2Okv9@f9LcnQ>cI!i@IN(DYqDg zwhXu6D4iYoj;%}u1jM&?9di)b_q5D!_ay+Y4&yl75@pV8_^Bu9(`*Yi-Q54T z08T9T*G*^j(?-5yF+Ja?DA44Nv@P>%-pV(53Jzlrkhs*zvjbNbGeZ^3E$}JH9&P4~^U3)t zykI4@Cn`%d136I%7pZo1%v;K$YxowW#?1j=w-z!R!vX?Md6b0$L-G+ny^bmZr#w}t zXI4IVI4rYL;TLeoxW%PPKgu71CEC%g$0i$IL=%PP*CS`$=)6Tt)U(ld9HH$pL+0n- z)z=5_?HqJV+@&V}5WCOp92n0ihe_9i1qU@NdaIv)XlcwrW+nhd(=H{1J3K22f=+{; zb1B}*zu9o^IyTr+*2Uxi_k&-()~4HwXB$Pc(@w17nTnxf{*W{cHi)U@;*RszDx_^R zl+y$LJv$zhl{~OMmI%FB4Tooft_~akd*p$yZ1PM9yr%9z=OjmF7taf2+ETNXG$z